├── .gitattributes ├── .github ├── src │ ├── .eslintignore │ ├── .prettierignore │ ├── .prettierrc │ ├── .eslintrc.json │ ├── package.json │ ├── Roles │ │ ├── JavaScript.md │ │ ├── Async.md │ │ └── NodeJS.md │ ├── check.js │ └── package-lock.json ├── FUNDING.yml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── test.yml ├── .gitignore ├── Profile └── REPORT.md ├── LICENSE ├── Skills ├── Async.md ├── Databases.md ├── Paradigms.md ├── JavaScript.md ├── Architecture.md ├── NodeJS.md ├── Programming.md └── DotNET.md └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | * -text 2 | -------------------------------------------------------------------------------- /.github/src/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /log/ 3 | *.log 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /Profile/REPORT.md: -------------------------------------------------------------------------------- 1 | ## Software engineering self assessment 2 | -------------------------------------------------------------------------------- /.github/src/.prettierignore: -------------------------------------------------------------------------------- 1 | package-lock.json 2 | package.json 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: tshemsedinov 2 | patreon: tshemsedinov 3 | -------------------------------------------------------------------------------- /.github/src/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "overrides": [ 5 | { 6 | "files": ["**/.*rc", "**/*.json"], 7 | "options": { "parser": "json" } 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.github/src/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["metarhia", "plugin:prettier/recommended"], 3 | "env": { 4 | "browser": true, 5 | "es6": true, 6 | "node": true 7 | }, 8 | "parserOptions": { 9 | "ecmaVersion": "latest" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ⚠️ Most likely you want to create a request from your branch to the main branch of your fork, but not to the original repository. 2 | 👉 A request to the original repository is only needed when you want to contribute to the assessment: add new skills or change the automatic analysis. 3 | -------------------------------------------------------------------------------- /.github/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "self-assessment", 3 | "version": "1.0.0", 4 | "author": "Timur Shemsedinov ", 5 | "license": "MIT", 6 | "description": "Software engineering self assessment", 7 | "readmeFilename": "README.md", 8 | "engines": { 9 | "node": ">=18.0.0" 10 | }, 11 | "scripts": { 12 | "lint": "eslint . && prettier -c \"**/*.js\" \"**/*.json\"", 13 | "fmt": "prettier --write \"**/*.js\" \"**/*.json\"" 14 | }, 15 | "dependencies": { 16 | "concolor": "^1.1.0", 17 | "metautil": "^5.2.0" 18 | }, 19 | "devDependencies": { 20 | "eslint": "^8.56.0", 21 | "eslint-config-metarhia": "^8.2.2", 22 | "eslint-config-prettier": "^9.1.0", 23 | "eslint-plugin-import": "^2.29.1", 24 | "eslint-plugin-prettier": "^5.1.3", 25 | "prettier": "^3.1.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023-2024 How.Programming.Works contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Check skills 2 | on: pull_request 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v4 8 | with: 9 | ref: ${{ github.event.pull_request.head.ref }} 10 | - name: Node.js 11 | uses: actions/setup-node@v4 12 | with: 13 | node-version: 20 14 | - uses: actions/cache@v3 15 | with: 16 | path: ~/.npm 17 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 18 | restore-keys: | 19 | ${{ runner.os }}-node- 20 | - id: prepare 21 | run: npm ci 22 | working-directory: .github/src 23 | - id: check 24 | name: Run auto skill checks 25 | working-directory: .github/src 26 | continue-on-error: true 27 | run: node check.js 28 | - id: results 29 | name: Generate results 30 | run: | 31 | git config --global user.name "Metarhia skill bot" 32 | git config --global user.email "timur@metarhia.com" 33 | git add ./Profile ./README.md ./Skills 34 | git commit -m "Automated skill analysis and report" 35 | git push 36 | - id: finalize 37 | name: Finalization 38 | if: steps.check.outcome != 'success' 39 | run: exit 1 40 | -------------------------------------------------------------------------------- /Skills/Async.md: -------------------------------------------------------------------------------- 1 | ## Asynchronous programming 2 | 3 | - Theory 4 | - Event loop 5 | - `try..catch` 6 | - Non-blocking 7 | - Async I/O 8 | - Thread pool 9 | - Pattern Reactor 10 | - CAS operations 11 | - epoll 12 | - kqueue 13 | - Completion ports 14 | - Event ports 15 | - libuv 16 | - Race conditions 17 | - Dead locks 18 | - Live locks 19 | - Concurrent programming 20 | - Parallel programming 21 | - Actor Model 22 | - Thread 23 | - Process 24 | - Async contracts 25 | - Callbacks 26 | - Callback-last-error-first 27 | - Thenable 28 | - Promise 29 | - Async/await 30 | - Future 31 | - Deferred 32 | - Sync generator 33 | - Async Generator 34 | - Async Iterator 35 | - Event 36 | - Coroutine 37 | - Goroutine 38 | - Signal 39 | - Stream 40 | - Chain of responsibility 41 | - Middleware 42 | - Locks 43 | - Async adapters and utils 44 | - callbackify 45 | - promisify 46 | - asyncify 47 | - Callbacks compose 48 | - Async compose 49 | - Async abstractions interfaces 50 | - EventEmitter 51 | - Observable/Observer 52 | - Readable 53 | - Writable 54 | - Transform 55 | - Async Pool 56 | - Async Queue 57 | - Async Collector 58 | - Semaphore 59 | - Mutex 60 | - Spin Lock 61 | - JavaScript & Node.js specific 62 | - Timers 63 | - `setImmediate` 64 | - `nextTick` 65 | - AbortController 66 | - AbortSignal 67 | - Promise unhandled rejection 68 | - Promise double resolve 69 | - Atomics 70 | - High resolution clock 71 | - Callback hell 72 | - Promise hell 73 | - ref() and unref() 74 | - Error handling in async code 75 | - Better stack traces with return await 76 | - JSON streaming serialization 77 | - AsyncLocalStorage 78 | - AsyncResource 79 | - Techniques 80 | - Async.js library 81 | - RxJS library 82 | - Promise.all 83 | - Promise.allSettled 84 | - Promise.race 85 | - Promise.any 86 | - Web Locks API 87 | - IPC 88 | - Channel API 89 | - Revealing constructor 90 | -------------------------------------------------------------------------------- /Skills/Databases.md: -------------------------------------------------------------------------------- 1 | ## Databases 2 | 3 | - Theory and concepts 4 | - Data types 5 | - Performance tuning 6 | - Migrations 7 | - Schema versioning 8 | - Backup and recovery 9 | - Database scalability 10 | - Relational databases 11 | - Key-value store 12 | - Tuple store 13 | - Graph databases 14 | - Object databases 15 | - Column databases 16 | - Navigational databases 17 | - Hierarchical databases 18 | - In-memory databases 19 | - Inverted index 20 | - Data control language (DCL) 21 | - Data definition language (DDL) 22 | - Data manipulation language (DML) 23 | - Data query language (DQL) 24 | - Relational 25 | - Entity-Relationship Diagram 26 | - Normal forms 27 | - Indexing 28 | - Primary keys 29 | - Foreign keys 30 | - Transactions 31 | - Views 32 | - Subqueries 33 | - Stored procedures 34 | - SQL functions 35 | - Materialized views 36 | - Replications 37 | - Virtualization 38 | - SQL 39 | - `SELECT` 40 | - `INSERT` 41 | - `UPDATE` 42 | - `DELETE` 43 | - `LIMIT` 44 | - `OFFSET` 45 | - `ORDER BY` 46 | - `GROUP BY` 47 | - `HAVING` 48 | - `EXISTS` 49 | - `JOIN` 50 | - `INNER JOIN` 51 | - `LEFT JOIN` 52 | - `RIGHT JOIN` 53 | - `UNION` 54 | - `DISTINCT` 55 | - `WHERE` 56 | - `LIKE` 57 | - `IN` 58 | - `BETWEEN` 59 | - `CREATE TABLE` 60 | - `ALTER TABLE` 61 | - `DROP TABLE` 62 | - `PRIMARY KEY` 63 | - `FOREIGN KEY` 64 | - `CHECK` 65 | - `DEFAULT` 66 | - `INDEX` 67 | - `UNIQUE` 68 | - `GRANT` 69 | - `REVOKE` 70 | - `DENY` 71 | - `EXPLAIN` 72 | - Engines 73 | - PostgreSQL 74 | - Oracle 75 | - MySQL 76 | - MariaDB 77 | - MS SQL Server 78 | - Redis 79 | - Rabbit 80 | - MongoDB 81 | - Memcached 82 | - Riak 83 | - DB2 84 | - SQLite 85 | - DynamoDB 86 | - Firebase 87 | - Data engineering 88 | - Data warehousing 89 | - Business intelligence 90 | - Big data 91 | - Data analysis 92 | - AI tools 93 | - Cloud databases 94 | - Data Visualization 95 | -------------------------------------------------------------------------------- /Skills/Paradigms.md: -------------------------------------------------------------------------------- 1 | ## Multi-paradigm programming 2 | 3 | - Theory 4 | - Procedural programming 5 | - Imperative programming 6 | - Structured programming 7 | - Non-structured programming 8 | - Functional programming 9 | - Prototype-based programming 10 | - Object-oriented programming 11 | - Object-based programming 12 | - Generic programming 13 | - Concurrent computing 14 | - Asynchronous programming 15 | - Parallel programming 16 | - Reactive programming 17 | - Functional-reactive (FRP) 18 | - Automata-based programming 19 | - Domain-specific languages 20 | - Multi-paradigm programming 21 | - Metaprogramming 22 | - Actor model 23 | - Lambda calculus 24 | - Black box 25 | - Information hiding 26 | - Aspect-oriented programming 27 | - Anemic domain model 28 | - Class composition 29 | - OOP basics 30 | - Constructor 31 | - Operator `new` 32 | - Static method 33 | - Method 34 | - Async method 35 | - Getters, Setters 36 | - Public fields 37 | - Private fields 38 | - Field declarations 39 | - Inheritance 40 | - Parent class 41 | - Polymorphism 42 | - Abstract class 43 | - Interface 44 | - Encapsulation 45 | - Hidden class 46 | - Object form 47 | - Instance 48 | - Introspection 49 | - Reflection 50 | - The diamond problem 51 | - GRASP 52 | - Information expert 53 | - Creator 54 | - Controller 55 | - Indirection 56 | - Low coupling 57 | - High cohesion 58 | - Protected variations 59 | - Pure fabrication 60 | - SOLID 61 | - Single-responsibility principle (SRP) 62 | - Open–closed principle (OCP) 63 | - Liskov substitution principle (LSP) 64 | - Interface segregation principle (ISP) 65 | - Dependency inversion principle (DIP) 66 | - Patterns 67 | - Singleton 68 | - Factory Method 69 | - Abstract Factory 70 | - Adapter 71 | - Observer 72 | - Strategy 73 | - Facade 74 | - Proxy 75 | - Chain of Responsibility 76 | - Command 77 | - Iterator 78 | - State 79 | - Bridge 80 | - Builder 81 | - Prototype 82 | - Composite 83 | - Decorator 84 | - Flyweight 85 | - Mediator 86 | - Memento 87 | - Template Method 88 | - Visitor 89 | - Reactor 90 | - Active object 91 | - Delegation 92 | -------------------------------------------------------------------------------- /Skills/JavaScript.md: -------------------------------------------------------------------------------- 1 | ## JavaScript 2 | 3 | - Language 4 | - `Object` 5 | - `Function` 6 | - `Boolean` 7 | - `Number` 8 | - `BigInt` 9 | - `String` 10 | - `Symbol` 11 | - `Infinity` 12 | - `NaN` 13 | - `undefined` 14 | - `null` 15 | - `this` 16 | - `instanceof` 17 | - `...spread` 18 | - `...rest` 19 | - `typeof` 20 | - Destructuring 21 | - Generators 22 | - Iterators 23 | - Async generator 24 | - Async iterator 25 | - Chaining 26 | - Optional chaining 27 | - IIFE 28 | - Async IIFE 29 | - `global` 30 | - `globalThis` 31 | - `window` 32 | - Getters and setters 33 | - `__proto__` 34 | - `prototype` 35 | - Equality operators 36 | - Logical operators 37 | - Logical Assignment 38 | - Bitwise operators 39 | - Ternary operator 40 | - `void` 41 | - `yield` 42 | - `await` 43 | - Template literal 44 | - Strict mode 45 | - Hoisting 46 | - `delete` 47 | - `in` 48 | - `super` 49 | - `eval` 50 | - `static` 51 | - `Number.parseInt` 52 | - `Number.parseFloat` 53 | - Property descriptors 54 | - Sealing properties 55 | - Freezing properties 56 | - Computed properties 57 | - Instance class fields 58 | - Static class fields 59 | - Private class fields 60 | - Private class methods 61 | - Statements 62 | - `if` 63 | - `while` 64 | - `do..while` 65 | - `for` 66 | - `for..in` 67 | - `for..of` 68 | - `for await` 69 | - `throw` 70 | - `break` 71 | - `continue` 72 | - `import` 73 | - `export` 74 | - `label` 75 | - `try..catch` 76 | - `switch` 77 | - `class` 78 | - `extends` 79 | - `with` 80 | - `new` 81 | - Functions 82 | - Arrow function 83 | - Async function 84 | - Function declaration 85 | - Function expression 86 | - Default parameters 87 | - Functional object 88 | - `Function.prototype.call` 89 | - `Function.prototype.bind` 90 | - `Function.prototype.apply` 91 | - `return` 92 | - Data structures 93 | - `Array` 94 | - `Map` 95 | - `Set` 96 | - `WeakMap` 97 | - `WeakSet` 98 | - Typed arrays 99 | - Mixins 100 | - `Object.assign` 101 | - Standard classes and namespaces 102 | - `Proxy` 103 | - `RegExp` 104 | - `Date` 105 | - `Math` 106 | - `Reflect` 107 | - `Error` 108 | - `Atomics` 109 | - `JSON` 110 | - `WeakRef` 111 | - `FinalizationRegistry` 112 | - `Intl` 113 | - `Promise` 114 | - `console` 115 | - Timers 116 | - Infrastructure 117 | - V8 118 | - Node.js 119 | - npm 120 | - prettier 121 | - MDN 122 | - TC39 123 | -------------------------------------------------------------------------------- /Skills/Architecture.md: -------------------------------------------------------------------------------- 1 | ## Architecture 2 | 3 | - Application structure 4 | - Separation of concerns 5 | - Inversion of Control 6 | - Dependency Injection 7 | - GoF Creational 8 | - GoF Structural 9 | - GoF Behavioral 10 | - GRASP 11 | - SOLID 12 | - CQS 13 | - Modularity 14 | - Subsystems 15 | - Directories 16 | - Leaking abstractions 17 | - Multiparadigm code 18 | - Contract programming 19 | - Platform-agnostic 20 | - Transport-agnostic 21 | - Framework-agnostic 22 | - Code coverage 23 | - Cohesion 24 | - Coupling 25 | - Cyclomatic complexity 26 | - Reliability 27 | - Quality 28 | - Availability 29 | - Flexibility 30 | - Law of Demeter (LoD) 31 | - Application architecture 32 | - Isolation between layer 33 | - Domain-specific language (DSL) 34 | - System vs applied code 35 | - Multilayer approach 36 | - Hexagonal architecture 37 | - Separation of concerns (SoC) 38 | - Metaprogramming 39 | - Inversion of control (IoC) 40 | - Dependency injection (DI) 41 | - Clean architecture 42 | - Domain-driven design (DDD) 43 | - Pub/sub 44 | - Message brocker 45 | - Agent 46 | - Service locator 47 | - Message Queue (MQ) 48 | - CQRS 49 | - Event sourcing 50 | - E-R data modeling 51 | - Entity-relationship diagram 52 | - IDEF1X 53 | - UML 54 | - Work breakdown structure 55 | - Budget estimation 56 | - Distributed systems 57 | - High-intensive computing 58 | - Load balancing 59 | - Gateways 60 | - On-premises 61 | - IaaS 62 | - PaaS 63 | - SaaS 64 | - FaaS clouds 65 | - Serverless 66 | - Vendor lock-in 67 | - Bus factor 68 | - Solution architecture 69 | - A software requirements specification (SRS) 70 | - Solution visions 71 | - Solution capabilities 72 | - System design 73 | - Process modelling 74 | - Data modelling 75 | - Solution components 76 | - Risk assessment 77 | - Non Functional Requirements (NFR) 78 | - Clouds 79 | - BPMN 80 | - Low-code 81 | - No-code 82 | - Metric 83 | - Metric abuse 84 | - ACID 85 | - CAP theorem 86 | - Single source of truth (SSOT) 87 | - Enterprise architecture 88 | - Understanding business needs 89 | - Enterprise strategy 90 | - Integration with subsystems 91 | - Enterprise vision 92 | - Enterprise capabilities 93 | - Project scope 94 | - Enterprise service bus 95 | - Service-oriented architecture 96 | - Microservices 97 | - Process choreography 98 | - Service orchestration 99 | - Data warehouse 100 | - Business Intelligence 101 | - OLAP 102 | - OLTP 103 | - Conways Law 104 | - Quality assurance 105 | - Engineering Hygiene 106 | -------------------------------------------------------------------------------- /Skills/NodeJS.md: -------------------------------------------------------------------------------- 1 | ## Node.js and backend 2 | 3 | - Internals and concepts 4 | - Strong and weak sides of node.js 5 | - Stateful and stateless servers 6 | - Nonblocking I/O and blocking code 7 | - Event loop phases 8 | - Event loop microtasks and macrotasks 9 | - Garbage collection 10 | - Node.js LTS schedule 11 | - I/O-bound, CPU-bound, memory-bound tasks 12 | - Interactive applications (close to real-time) 13 | - Modularity, layers and dependencies 14 | - CommonJS modules 15 | - ECMAScript modules 16 | - Module `node:module` 17 | - Caching in CJS and ESM 18 | - Modules as singletons 19 | - Contexts and scripts module `node:vm` 20 | - Dependencies: `npm`, `node_modules` 21 | - Files `package.json`, `package-lock.json` 22 | - Module-based permissions model 23 | - Isolation with modularity 24 | - Dependency injection 25 | - DI containers 26 | - Coupling and cohesion 27 | - Framework agnostic approach 28 | - Environment 29 | - Command line arguments 30 | - Node.js CLI 31 | - Process-based permissions 32 | - Graceful shutdown 33 | - Clustering 34 | - Watch filesystem changes with --watch 35 | - Internal API 36 | - Streams API 37 | - Web Streams API 38 | - Crypto API 39 | - Password hashing with crypto.scrypt 40 | - Web Crypto API 41 | - File system API (sync and async) 42 | - Copy folder recursively 43 | - Worker threads 44 | - Performance hooks 45 | - Native fetch and nodejs/undici 46 | - async_hooks 47 | - AsyncLocalStorage 48 | - AsyncResource 49 | - Deprecated domain API 50 | - Node.js single executable 51 | - SharedArrayBuffer 52 | - Module `node:worker_threads` 53 | - Module `node:child_process` 54 | - MessageChannel, MessagePort 55 | - BroadcastChannel 56 | - Generating crypto random UUID 57 | - Module `node:url` vs `new URL` 58 | - Module `node:assert` 59 | - Internationalization 60 | - Blob, File, Buffer, module `node:buffer` 61 | - Module `node:zlib` 62 | - Network 63 | - Endpoint throttling 64 | - ALPN 65 | - SNI callback 66 | - SSL certificates 67 | - Protocol agnostic approach 68 | - Fetch API 69 | - IncomingMessage 70 | - HTTP(S) 71 | - TCP/SSL 72 | - UDP 73 | - TLS 74 | - Websocket 75 | - SSE 76 | - HTTP/3 (QUIC) 77 | - Long polling 78 | - REST 79 | - RPC 80 | - Routing 81 | - DoS 82 | - DDoS 83 | - XSS 84 | - Path traversal 85 | - CSRF 86 | - DNS 87 | - SQL injection 88 | - noDelay 89 | - keep-alive 90 | - IP sticky sessions 91 | - Technique and tools 92 | - Native test runner 93 | - Logging 94 | - Application configuring 95 | - Testing 96 | - CI/CD 97 | - Readable 98 | - Writable 99 | - Transform 100 | - Back pressure 101 | - Buffer 102 | - Console 103 | - Inspector 104 | - Data access 105 | - Data access layer 106 | - Repository 107 | - Active record 108 | - Query builder 109 | - Object-Relational Mapping 110 | - CRUD 111 | - DTO 112 | - Error handling and debugging 113 | - `Error` 114 | - `error.cause` 115 | - `error.code` 116 | - `error.message` 117 | - `error.stack` 118 | - `Error.captureStackTrace` 119 | - How to avoid mixins 120 | - Uncaught exceptions 121 | - Heap dump 122 | - Debugging tools 123 | - Flame graph 124 | - Memory leaks 125 | - Resource leaks 126 | - Data race 127 | - Integrations and bindings 128 | - Native addons 129 | - `C` and `C++` addons 130 | - `Rust` addons 131 | - `Zig` addons 132 | - NAN (Native Abstractions for Node.js) 133 | - Node-API (formerly N-API) 134 | - NAPI `C` and `C++` 135 | - NAPI `Rust` 136 | - NAPI `Zig` 137 | - Webassembly `WAT` 138 | - Webassembly `C` and `C++` 139 | - Webassembly `Rust` 140 | - Webassembly `Zig` 141 | - Webassembly `AssemblyScript` 142 | - Shared memory 143 | - V8 binary serialization 144 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Software engineering self assessment 2 | 3 | 4 | 5 | This _knowledge assessment_ can be used as an automated tool for **tracking** and **analyzing** an engineer’s **microskills**, for personal use, for reference in your **CV** or profile (github, linkedin, etc.). After filling skills, the system generates a button in `html` and `md` with a link to your fork of the repo. The tool speeds up **interviews** and **certification** for both the applicant and the interviewer: you can check only part of the key knowledge and then sign a commit with a personal GPG key. If you periodically take an assessment, or do it before and after the start of _training_, and store branches or tags with the results of an inventory of microskills at a certain point in time, then it is very convenient to compare the _progress_ you have made during the period of _training_, reading a book, working on a project etc. Currently, assessment has more than **700 microskills** and will be constantly expanded in all areas, languages and technologies (for example `Proxy`, `Promise`, `Future`, `SRP`, `DI`, `Boxing`, `Cohesion`, `Tail call recursion`...) with automatic comparison of them with _roles_ (for example `Node.js API developer`, `Node.js gamedev`, `Frontend`...) the robot generates a report via `Github Actions CI` with recommendations on what needs to be improved. New roles and knowledge areas will be available soon, after which you can rebase your repo on the original one to receive the new report. 6 | 7 | ## Skills 8 | 9 | - [Programming fundamentals](Skills/Programming.md) 10 | - [JavaScript](Skills/JavaScript.md) 11 | - [Asynchronous programming](Skills/Async.md) 12 | - [Node.js and Backend](Skills/NodeJS.md) 13 | - [.NET](Skills/DotNET.md) 14 | - [Multi-paradigm programming](Skills/Paradigms.md) 15 | - [Databases](Skills/Databases.md) 16 | - [Architecture](Skills/Architecture.md) 17 | 18 | ## How to use 19 | 20 | - Fork repository 21 | - Enable Github Actions workflows at tab `Actions` of your fork 22 | - Create branch, for example: `2024-winter` 23 | - In new branch add following levels or leave line untouched in each file: 24 | 25 | | | Level | Shorthand | Description | 26 | | ---- | ------------- | ----------:| ------------------------------------------------------ | 27 | | `👂` | `heard` | `~` or `h` | Heard or have some idea | 28 | | `🎓` | `known` | `+` or `k` | Learned, read, but didn’t use | 29 | | `🖐️` | `used` | `*` or `u` | Used in work or real project | 30 | | `🙋` | `explained` | `!` or `e` | Explained to colleagues or can freely explain | 31 | | `📢` | `talked` | `"` or `t` | Gave a public speech or lecture on a topic | 32 | | `🔬` | `researched` | `&` or `r` | Deep research, measurements, comparisons, read sources | 33 | | `🚀` | `constructed` | `^` or `c` | Developed an implementation or equivalent | 34 | 35 | - Now you can create pull request and merge this to main branch of your fork (not to original repo) 36 | - Pull request will fire Github Actions CI processing which will generate new commit with `Profile/REPORT.md` file with skill analysis and role matching report 37 | - CI processing will fix all simple mistakes in filling and replace shorthands 38 | - If CI processing will detect unrecoverable error it will generate debug output and you will receive email with link 39 | - Auto-generated commit will also contain badge in `md` and `html` formats 40 | - Repeat self assessment after course or training 41 | - Now You can compare branches with URL: 42 | - `https://github.com//SelfAssessment/compare/2023-autumn...2024-winter` 43 | 44 | ## Example 45 | 46 | It should look like following example after filling it out. And will be automatically formatted as sown in right column: 47 | 48 | ``` 49 | - Syntax - Syntax 50 | - Value ! ⤑ - Value: 🙋 explained 51 | - Identifier: * ⤑ - Identifier: 🖐️ used 52 | - Variable: ! ⤑ - Variable: 🙋 explained 53 | - Constant * ⤑ - Constant: 🖐️ used 54 | - Scalar * ⤑ - Scalar: 🖐️ used 55 | - Literal ~ ⤑ - Literal: 👂 heard 56 | - Expression: * ⤑ - Expression: 🖐️ used 57 | - Heap: + - Heap: 🎓 known 58 | ``` 59 | -------------------------------------------------------------------------------- /Skills/Programming.md: -------------------------------------------------------------------------------- 1 | ## Programming fundamental concepts 2 | 3 | - Concepts 4 | - Model 5 | - Modeling 6 | - Subject domain 7 | - Algorithm 8 | - Syntax 9 | - Semantics 10 | - Abstraction 11 | - Paradigm 12 | - Programm 13 | - Programming paradigm 14 | - Programming language 15 | - Contract 16 | - Module 17 | - Library 18 | - Package 19 | - Component 20 | - Framework 21 | - Platform 22 | - Source code 23 | - Object code 24 | - Machine code 25 | - Microcode 26 | - Software engineering 27 | - Decomposition 28 | - Control flow 29 | - Data flow 30 | - Code reuse 31 | - Defensive programming 32 | - Don't repeat yourself (DRY) 33 | - KISS principle 34 | - Syntax and concepts 35 | - Value 36 | - Identifier 37 | - Variable 38 | - Constant 39 | - Scalar 40 | - Literal 41 | - Expression 42 | - Heap 43 | - Function 44 | - Procedure 45 | - Method 46 | - Class 47 | - Prototype 48 | - Event 49 | - Type 50 | - Flag 51 | - Lexical scope 52 | - Code block 53 | - Conditions 54 | - Loops 55 | - Assignment 56 | - Regular expression 57 | - Interface 58 | - Namespaces 59 | - Call stack 60 | - Naming conventions 61 | - Coding conventions 62 | - Camel case 63 | - Snake case 64 | - Kebab case 65 | - Trailing commas 66 | - Return early 67 | - Fail-fast 68 | - Types 69 | - Primitive types 70 | - Reference types 71 | - Type systems 72 | - Strong typing 73 | - Weak typing 74 | - Duck typing 75 | - Static typing 76 | - Dynamic typing 77 | - Nominal typing 78 | - Structural typing 79 | - Explicit typing 80 | - Type inference 81 | - Covariance 82 | - Contravariance 83 | - Functions 84 | - Signature 85 | - Argument 86 | - Parameter 87 | - Pure function 88 | - Lambda expression 89 | - Side effects 90 | - Closure 91 | - Partial application 92 | - Currying 93 | - Higher order 94 | - Recursion 95 | - Tail call optimisation 96 | - Callback 97 | - Listener 98 | - Composition 99 | - Pipe 100 | - Memoize 101 | - Wrapper 102 | - Functor 103 | - Monad 104 | - Monoid 105 | - Generator 106 | - Coroutine 107 | - Data structures 108 | - Array 109 | - Structure 110 | - Record 111 | - Enum 112 | - Instance 113 | - Object 114 | - Collection 115 | - Set 116 | - Hash table 117 | - Linked list 118 | - Doubly list 119 | - Unrolled list 120 | - Circular list 121 | - Queue 122 | - Stack 123 | - Deque 124 | - Tree 125 | - Graph 126 | - Iterator 127 | - Mutable state 128 | - Immutable state 129 | - Serialization 130 | - String parsing 131 | - JSON 132 | - JSON5 133 | - YAML 134 | - Networking 135 | - DNS 136 | - CDN 137 | - CORS 138 | - IPv4 139 | - IPv6 140 | - NAT 141 | - URL 142 | - URN 143 | - URI 144 | - Process and tools 145 | - Compiler 146 | - Just-in-time compilation 147 | - Ahead-of-time compilation 148 | - Transpiler 149 | - Linter 150 | - Polyfill 151 | - Interpreter 152 | - Linker 153 | - Dynamic linking 154 | - Static linking 155 | - Runtime 156 | - Virtual machine 157 | - Register-based VM 158 | - Stack-based VM 159 | - Containerization 160 | - Debugger 161 | - Tracing 162 | - Garbage collection 163 | - Refactoring 164 | - Code review 165 | - Exception 166 | - Unittesting 167 | - git 168 | - Github 169 | - Docker 170 | - Kubernetes 171 | - GCC 172 | - LLVM 173 | - Antipatterns 174 | - Magic numbers 175 | - Hard code 176 | - Soft code 177 | - Cryptic code 178 | - Improbability factor 179 | - Accidental complexity 180 | - Action at a distance 181 | - Spaghetti 182 | - Silver bullet 183 | - Not invented here 184 | - Dead code 185 | - Unreachable code 186 | - Duplicate code 187 | - Premature optimization 188 | - Micro-optimization 189 | - Nested loops 190 | - Long method/function/procedure 191 | - Long inheritance 192 | - Large class/file 193 | - Too many parameters 194 | - Pass-through parameters 195 | - Accumulate and fire 196 | - Use switch/case 197 | - Temporary field 198 | - Handle object as instances and hashes at the same time 199 | - Use fields instead of arguments 200 | - Data clump 201 | - Feature envy 202 | - Monkey patch 203 | - Yo-yo problem 204 | - Runtimes and virtual machines 205 | - Bytecode 206 | - V8 207 | - VJM 208 | - CLR 209 | - Mono 210 | - Operating systems 211 | - Interrupts 212 | - Drivers 213 | - Kernel 214 | - Ring 215 | - Virtual memory 216 | - File system 217 | - Linux 218 | - Unix 219 | - BSD 220 | - MacOS 221 | - Windows 222 | - Real-time OS 223 | - Embedded OS 224 | - Standards 225 | - ASCII 226 | - Escape sequence 227 | - RFC 228 | - IETF 229 | - IANA 230 | - IEEE 231 | - Base64 232 | - ECMA 233 | - ICANN 234 | - ISO 235 | - MIME 236 | - OWASP 237 | - UTF-8 238 | - W3C 239 | - ODMG 240 | -------------------------------------------------------------------------------- /Skills/DotNET.md: -------------------------------------------------------------------------------- 1 | ## .NET 2 | 3 | - Core Concepts and Internals 4 | - Strengths and weaknesses of .NET 5 | - Stateful and stateless services 6 | - Asynchronous and synchronous programming 7 | - Task-based asynchronous pattern 8 | - Garbage collection in .NET 9 | - .NET runtime versions and support 10 | - I/O-bound, CPU-bound tasks 11 | - Real-time applications with SignalR 12 | - Modularity and Dependencies 13 | - .NET assemblies 14 | - NuGet package management 15 | - Dependency management in .NET 16 | - Dependency Injection in .NET 17 | - Inversion of Control (IoC) 18 | - IoC containers in .NET 19 | - Middleware and pipeline configuration 20 | - Modular applications 21 | - Environment and Tools 22 | - Command line interface (CLI) tools 23 | - .NET CLI 24 | - Windows Services and Linux Daemons 25 | - Hosting and Deployment models 26 | - IIS and Kestrel web server 27 | - Environment variables and configuration 28 | - File system I/O operations 29 | - Multithreading with Task Parallel Library (TPL) 30 | - Performance monitoring and diagnostics 31 | - APIs and Framework Features 32 | - LINQ 33 | - SignalR for real-time web functionality 34 | - High-performance RPC with `gRPC` 35 | - Security features (authentication, authorization) 36 | - Cryptography and secure data handling 37 | - Memory and resource management 38 | - Globalization and localization 39 | - Network and Protocols 40 | - HTTP/HTTPS support 41 | - WebSockets for real-time communication 42 | - TCP/UDP networking 43 | - SSL/TLS for secure connections 44 | - Efficient network communication with `gRPC` 45 | - HTTP/2 and HTTP/3 support 46 | - Network security (DDoS, XSS, CSRF prevention) 47 | - Serialization and deserialization (JSON, XML) 48 | - Testing and Debugging 49 | - Unit testing with frameworks like xUnit, NUnit 50 | - Integration testing 51 | - Logging and tracing 52 | - Application monitoring and telemetry 53 | - Debugging tools and strategies 54 | - Performance profiling and analysis 55 | - Data Access and ORM 56 | - Entity Framework Core 57 | - Dapper 58 | - ADO.NET for database access 59 | - Data modeling and migration 60 | - Repository and Unit of Work patterns 61 | - CRUD operations 62 | - Error Handling and Debugging 63 | - Exception handling in .NET 64 | - Custom error classes 65 | - Debugging and diagnostic tools 66 | - Profiling and performance analysis 67 | - Memory leak detection 68 | - Integration and Extensibility 69 | - Interoperability with native libraries 70 | - P/Invoke for calling `C/C++` libraries 71 | - COM interop 72 | - .NET for `WebAssembly` 73 | - Custom middleware development 74 | - Cloud and Microservices 75 | - Integration with cloud platforms (Azure, AWS) 76 | - Microservices architecture 77 | - Containerization with Docker 78 | - Kubernetes for orchestration 79 | - Serverless computing 80 | - C# Development 81 | - C# syntax and language fundamentals 82 | - Advanced C# features (LINQ, async/await, delegates, events) 83 | - Reflection and dynamic programming 84 | - Data types and collections 85 | - Generics and extension methods 86 | - Attributes and annotations 87 | - Interoperability with other .NET languages 88 | - `F#` Development 89 | - `F#` syntax and language fundamentals 90 | - Immutable data structures 91 | - Pattern matching and discriminated unions 92 | - Functional-first design and development 93 | - Type providers and metaprogramming 94 | - Asynchronous and parallel programming 95 | - Using .NET libraries in `F#` 96 | - Building web applications with F# and Giraffe or Saturn 97 | - Testing with `FsUnit` 98 | - VB.NET Development 99 | - VB.NET syntax and language fundamentals 100 | - Event-driven programming 101 | - COM interop and P/Invoke 102 | - XML and file handling 103 | - Office automation and VSTO 104 | - Migration strategies for legacy VB6 applications 105 | - C++/CLI Development Development 106 | - C++ syntax and language fundamentals 107 | - Interoperability between managed (.NET) and unmanaged (native) code 108 | - Memory management in mixed environments 109 | - `C++/CLI` syntax and usage 110 | - Accessing .NET Framework classes in `C++` 111 | - Writing performance-critical modules 112 | - Interfacing with native libraries and APIs 113 | - Developing custom .NET libraries in `C++` 114 | - Managing resource disposal and finalization 115 | - Creating and consuming DLLs (Dynamic Link Libraries) 116 | - Working with Windows API 117 | - Migration of legacy `C++` code to .NET 118 | - Enhancing existing .NET applications with `C++/CLI` 119 | - Mobile development 120 | - .NET MAUI / Xamarin 121 | - Interoperability between managed code and iOS/Android API 122 | - Game development 123 | - Unity 124 | - Web development 125 | - ASP.NET Core 126 | - Blazor 127 | - Razor Syntax 128 | - RESTful API development 129 | -------------------------------------------------------------------------------- /.github/src/Roles/JavaScript.md: -------------------------------------------------------------------------------- 1 | ## JavaScript 2 | 3 | - To start asynchronous programming 4 | - `Object`: 🖐️ used 5 | - `Function`: 🖐️ used 6 | - `Boolean`: 🖐️ used 7 | - `Number`: 🖐️ used 8 | - `Symbol`: 🎓 known 9 | - `undefined`: 🖐️ used 10 | - `null`: 🖐️ used 11 | - `this`: 🖐️ used 12 | - `instanceof`: 🖐️ used 13 | - `...spread`: 🖐️ used 14 | - `...rest`: 🖐️ used 15 | - `typeof`: 🖐️ used 16 | - Destructuring: 🖐️ used 17 | - Generators: 👂 heard 18 | - Iterators: 👂 heard 19 | - Async generator: 👂 heard 20 | - Async iterator: 👂 heard 21 | - Chaining: 👂 heard 22 | - Optional chaining: 👂 heard 23 | - IIFE: 👂 heard 24 | - Async IIFE: 👂 heard 25 | - `global`: 🎓 known 26 | - `globalThis`: 👂 heard 27 | - Getters and setters: 👂 heard 28 | - `prototype`: 👂 heard 29 | - Equality operators: 🖐️ used 30 | - Logical operators: 🖐️ used 31 | - Ternary operator: 🖐️ used 32 | - `yield`: 👂 heard 33 | - `await`: 👂 heard 34 | - Template literal: 🖐️ used 35 | - Strict mode: 🖐️ used 36 | - `super`: 🖐️ used 37 | - `static`: 👂 heard 38 | - Private class fields: 🎓 known 39 | - Private class methods: 🎓 known 40 | - `if`: 🖐️ used 41 | - `while`: 🖐️ used 42 | - `do..while`: 🎓 known 43 | - `for`: 🖐️ used 44 | - `for..of`: 🖐️ used 45 | - `for await`: 👂 heard 46 | - `throw`: 🖐️ used 47 | - `break`: 🎓 known 48 | - `continue`: 🎓 known 49 | - `import`: 🎓 known 50 | - `export`: 🎓 known 51 | - `try..catch`: 🎓 known 52 | - `class`: 🖐️ used 53 | - `extends`: 🖐️ used 54 | - `new`: 🖐️ used 55 | - Arrow function: 🖐️ used 56 | - Async function: 🎓 known 57 | - Function declaration: 🖐️ used 58 | - Function expression: 🖐️ used 59 | - Default parameters: 🖐️ used 60 | - Functional object: 👂 heard 61 | - `return`: 🖐️ used 62 | - `Array`: 🖐️ used 63 | - `Map`: 🖐️ used 64 | - `Set`: 🖐️ used 65 | - Mixins: 🎓 known 66 | - `Object.assign`: 🎓 known 67 | - `Proxy`: 🎓 known 68 | - `Error`: 🖐️ used 69 | - `WeakRef`: 👂 heard 70 | - `FinalizationRegistry`: 👂 heard 71 | - `Promise`: 👂 heard 72 | - `console`: 🖐️ used 73 | - Timers: 🖐️ used 74 | - V8: 👂 heard 75 | - prettier: 🎓 known 76 | - To start Node.js 77 | - `Object`: 🖐️ used 78 | - `Function`: 🖐️ used 79 | - `Boolean`: 🖐️ used 80 | - `Number`: 🖐️ used 81 | - `BigInt`: 🖐️ used 82 | - `String`: 🖐️ used 83 | - `Symbol`: 🖐️ used 84 | - `Infinity`: 🖐️ used 85 | - `NaN`: 🖐️ used 86 | - `undefined`: 🖐️ used 87 | - `null`: 🖐️ used 88 | - `this`: 🖐️ used 89 | - `instanceof`: 🖐️ used 90 | - `...spread`: 🖐️ used 91 | - `...rest`: 🖐️ used 92 | - `typeof`: 🖐️ used 93 | - Destructuring: 🖐️ used 94 | - Generators: 🖐️ used 95 | - Iterators: 🖐️ used 96 | - Async generator: 🖐️ used 97 | - Async iterator: 🖐️ used 98 | - Chaining: 🖐️ used 99 | - IIFE: 🖐️ used 100 | - Async IIFE: 🖐️ used 101 | - `global`: 🖐️ used 102 | - `globalThis`: 🖐️ used 103 | - Getters and setters: 🖐️ used 104 | - Equality operators: 🖐️ used 105 | - Logical operators: 🖐️ used 106 | - Ternary operator: 🖐️ used 107 | - `void`: 🖐️ used 108 | - `yield`: 🖐️ used 109 | - `await`: 🖐️ used 110 | - Template literal: 🖐️ used 111 | - Strict mode: 🖐️ used 112 | - `delete`: 🖐️ used 113 | - `in`: 👂 heard 114 | - `super`: 🖐️ used 115 | - `eval`: 🎓 known 116 | - `static`: 🖐️ used 117 | - `Number.parseInt`: 🖐️ used 118 | - `Number.parseFloat`: 🖐️ used 119 | - Property descriptors: 🎓 known 120 | - Sealing properties: 🎓 known 121 | - Freezing properties: 🎓 known 122 | - Computed properties: 🎓 known 123 | - Instance class fields: 🎓 known 124 | - Static class fields: 🎓 known 125 | - Private class fields: 🎓 known 126 | - Private class methods: 🎓 known 127 | - `if`: 🖐️ used 128 | - `while`: 🖐️ used 129 | - `do..while`: 🖐️ used 130 | - `for`: 🖐️ used 131 | - `for..in`: 🎓 known 132 | - `for..of`: 🖐️ used 133 | - `for await`: 🖐️ used 134 | - `throw`: 🖐️ used 135 | - `break`: 🖐️ used 136 | - `continue`: 🖐️ used 137 | - `import`: 🖐️ used 138 | - `export`: 🖐️ used 139 | - `try..catch`: 🖐️ used 140 | - `class`: 🖐️ used 141 | - `extends`: 🖐️ used 142 | - `new`: 🖐️ used 143 | - Arrow function: 🖐️ used 144 | - Async function: 🖐️ used 145 | - Function declaration: 🖐️ used 146 | - Function expression: 🖐️ used 147 | - Default parameters: 🖐️ used 148 | - Functional object: 👂 heard 149 | - `return`: 🖐️ used 150 | - `Array`: 🖐️ used 151 | - `Map`: 🖐️ used 152 | - `Set`: 🖐️ used 153 | - `WeakMap`: 🎓 known 154 | - `WeakSet`: 🎓 known 155 | - Typed arrays: 🎓 known 156 | - Mixins: 👂 heard 157 | - `Object.assign`: 🎓 known 158 | - `Proxy`: 🎓 known 159 | - `RegExp`: 🎓 known 160 | - `Date`: 🎓 known 161 | - `Math`: 🎓 known 162 | - `Reflect`: 🎓 known 163 | - `Error`: 🖐️ used 164 | - `Atomics`: 👂 heard 165 | - `JSON`: 🖐️ used 166 | - `WeakRef`: 👂 heard 167 | - `FinalizationRegistry`: 👂 heard 168 | - `Promise`: 🖐️ used 169 | - `console`: 🖐️ used 170 | - Timers: 🖐️ used 171 | - V8: 🖐️ used 172 | - Node.js: 👂 heard 173 | - npm: 🎓 known 174 | - prettier: 🎓 known 175 | -------------------------------------------------------------------------------- /.github/src/Roles/Async.md: -------------------------------------------------------------------------------- 1 | ## Asynchronous programming 2 | 3 | - For Node.js applied programming 4 | - Event loop: 👂 heard 5 | - `try..catch`: 🖐️ used 6 | - Non-blocking: 👂 heard 7 | - Async I/O: 👂 heard 8 | - Race conditions: 🎓 known 9 | - Thread: 👂 heard 10 | - Process: 👂 heard 11 | - Callbacks: 🖐️ used 12 | - Callback-last-error-first: 🖐️ used 13 | - Promise: 🖐️ used 14 | - Async/await: 🖐️ used 15 | - Sync generator: 🎓 known 16 | - Async Generator: 🎓 known 17 | - Async Iterator: 🎓 known 18 | - Event: 🖐️ used 19 | - Signal: 🖐️ used 20 | - Stream: 🖐️ used 21 | - Locks: 🎓 known 22 | - callbackify: 🎓 known 23 | - promisify: 🎓 known 24 | - asyncify: 🎓 known 25 | - EventEmitter: 🖐️ used 26 | - Observable/Observer: 👂 heard 27 | - Readable: 🖐️ used 28 | - Writable: 🖐️ used 29 | - Transform: 🖐️ used 30 | - Async Pool: 🎓 known 31 | - Async Queue: 🎓 known 32 | - Async Collector: 🎓 known 33 | - Semaphore: 👂 heard 34 | - Timers: 🖐️ used 35 | - `setImmediate`: 🖐️ used 36 | - `nextTick`: 🖐️ used 37 | - AbortController: 🖐️ used 38 | - AbortSignal: 🎓 known 39 | - Callback hell: 🎓 known 40 | - Promise hell: 🎓 known 41 | - ref() and unref(): 👂 heard 42 | - Error handling in async code: 🖐️ used 43 | - Better stack traces with return await: 🖐️ used 44 | - JSON streaming serialization: 👂 heard 45 | - AsyncLocalStorage: 👂 heard 46 | - AsyncResource: 👂 heard 47 | - RxJS library: 👂 heard 48 | - Promise.all: 🖐️ used 49 | - Promise.allSettled: 🖐️ used 50 | - Promise.race: 🖐️ used 51 | - Promise.any: 🖐️ used 52 | - Web Locks API: 👂 heard 53 | - Revealing constructor: 🎓 known 54 | - To start Node.js 55 | - `try..catch`: 🖐️ used 56 | - Callbacks: 🖐️ used 57 | - Callback-last-error-first: 👂 heard 58 | - Promise: 🖐️ used 59 | - Async/await: 🖐️ used 60 | - Async Iterator: 🎓 known 61 | - Event: 🖐️ used 62 | - Signal: 🎓 known 63 | - Stream: 🎓 known 64 | - Chain of responsibility: 👂 heard 65 | - Middleware: 👂 heard 66 | - Locks: 👂 heard 67 | - callbackify: 🎓 known 68 | - promisify: 🎓 known 69 | - asyncify: 🎓 known 70 | - EventEmitter: 🖐️ used 71 | - Readable: 🎓 known 72 | - Writable: 🎓 known 73 | - Transform: 🎓 known 74 | - Async Pool: 🎓 known 75 | - Async Queue: 🎓 known 76 | - Async Collector: 🎓 known 77 | - Timers: 🖐️ used 78 | - `setImmediate`: 🖐️ used 79 | - `nextTick`: 👂 heard 80 | - AbortController: 🖐️ used 81 | - AbortSignal: 🎓 known 82 | - Callback hell: 🎓 known 83 | - Promise hell: 🎓 known 84 | - Error handling in async code: 🖐️ used 85 | - Better stack traces with return await: 🖐️ used 86 | - JSON streaming serialization: 👂 heard 87 | - Promise.all: 🖐️ used 88 | - Promise.allSettled: 🖐️ used 89 | - Promise.race: 🖐️ used 90 | - Promise.any: 🖐️ used 91 | - Revealing constructor: 👂 heard 92 | - For Node.js platform/system programming 93 | - Event loop: 🎓 known 94 | - `try..catch`: 🖐️ used 95 | - Non-blocking: 🎓 known 96 | - Async I/O: 🎓 known 97 | - Thread pool: 🎓 known 98 | - Pattern Reactor: 🎓 known 99 | - CAS operations: 👂 heard 100 | - libuv: 🎓 known 101 | - Race conditions: 🖐️ used 102 | - Dead locks: 🖐️ used 103 | - Live locks: 🖐️ used 104 | - Concurrent programming: 🎓 known 105 | - Parallel programming: 🎓 known 106 | - Actor Model: 🎓 known 107 | - Thread: 🖐️ used 108 | - Process: 🖐️ used 109 | - Callbacks: 🖐️ used 110 | - Callback-last-error-first: 🖐️ used 111 | - Thenable: 🖐️ used 112 | - Promise: 🖐️ used 113 | - Async/await: 🖐️ used 114 | - Future: 👂 heard 115 | - Deferred: 👂 heard 116 | - Sync generator: 🖐️ used 117 | - Async Generator: 🖐️ used 118 | - Async Iterator: 🖐️ used 119 | - Event: 🖐️ used 120 | - Coroutine: 👂 heard 121 | - Goroutine: 👂 heard 122 | - Signal: 🖐️ used 123 | - Stream: 🖐️ used 124 | - Chain of responsibility: 🖐️ used 125 | - Middleware: 🖐️ used 126 | - Locks: 🖐️ used 127 | - callbackify: 🖐️ used 128 | - promisify: 🖐️ used 129 | - asyncify: 🖐️ used 130 | - EventEmitter: 🖐️ used 131 | - Observable/Observer: 🖐️ used 132 | - Readable: 🖐️ used 133 | - Writable: 🖐️ used 134 | - Transform: 🖐️ used 135 | - Async Pool: 🖐️ used 136 | - Async Queue: 🖐️ used 137 | - Async Collector: 🖐️ used 138 | - Semaphore: 🖐️ used 139 | - Mutex: 🎓 known 140 | - Spin Lock: 🎓 known 141 | - Timers: 🖐️ used 142 | - `setImmediate`: 🖐️ used 143 | - `nextTick`: 🖐️ used 144 | - AbortController: 🖐️ used 145 | - AbortSignal: 🖐️ used 146 | - Promise unhandled rejection: 🖐️ used 147 | - Promise double resolve: 🖐️ used 148 | - Atomics: 🎓 known 149 | - High resolution clock: 🎓 known 150 | - Callback hell: 🖐️ used 151 | - Promise hell: 🖐️ used 152 | - ref() and unref(): 🖐️ used 153 | - Error handling in async code: 🖐️ used 154 | - Better stack traces with return await: 🖐️ used 155 | - JSON streaming serialization: 🖐️ used 156 | - AsyncLocalStorage: 🖐️ used 157 | - AsyncResource: 🖐️ used 158 | - Async.js library: 👂 heard 159 | - RxJS library: 👂 heard 160 | - Promise.all: 🖐️ used 161 | - Promise.allSettled: 🖐️ used 162 | - Promise.race: 🖐️ used 163 | - Promise.any: 🖐️ used 164 | - Web Locks API: 🎓 known 165 | - IPC: 🎓 known 166 | - Channel API: 🎓 known 167 | - Revealing constructor: 🖐️ used 168 | -------------------------------------------------------------------------------- /.github/src/check.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('node:fs').promises; 4 | const path = require('node:path'); 5 | const cp = require('node:child_process'); 6 | const metautil = require('metautil'); 7 | const concolor = require('concolor'); 8 | 9 | const caption = concolor('b,white'); 10 | const chapter = concolor('b,yellow'); 11 | const fatal = concolor('b,white/red'); 12 | const fixup = concolor('b,black/yellow'); 13 | 14 | let exitCode = 0; 15 | 16 | const TITLE = 'Software engineering self assessment'; 17 | const PARSING_TIMEOUT = 1000; 18 | const EXECUTION_TIMEOUT = 5000; 19 | const PATH = path.join(process.cwd(), '../..'); 20 | const SEPARATOR = ' / '; 21 | 22 | let REPO = process.env.GITHUB_REPOSITORY; 23 | if (!REPO) { 24 | const OUT = cp.execSync('git config --get remote.origin.url').toString(); 25 | REPO = metautil.between(OUT, ':', '.'); 26 | } 27 | const LINK = 'https://github.com/' + REPO + '/blob/main/Profile/REPORT.md'; 28 | 29 | const BASE = 'https://img.shields.io/badge/Self_Assessment'; 30 | const STYLE = `style=flat-square`; 31 | 32 | const codeBlock = (code) => '```\n' + code + '\n```'; 33 | 34 | const overall = { count: 0, total: 0, all: 0 }; 35 | 36 | const generateBadge = () => { 37 | const color = exitCode === 0 ? '009933' : 'FF3300'; 38 | const stat = overall.count + SEPARATOR + overall.total + SEPARATOR + overall.all; 39 | const img = `${BASE}-${stat}-${color}?${STYLE}`; 40 | return { 41 | md: `[![Skills](${img})](${LINK})`, 42 | html: `Skills`, 43 | }; 44 | }; 45 | 46 | const UNITS = [ 47 | 'Programming', 48 | 'JavaScript', 49 | 'Async', 50 | 'NodeJS', 51 | 'Paradigms', 52 | 'Architecture', 53 | ]; 54 | 55 | const wrongFormat = (msg, file) => { 56 | exitCode = 1; 57 | console.log(fatal` Wrong file format: ${msg} `); 58 | console.log(fatal` File: ${file} `); 59 | }; 60 | 61 | const warnFixup = (msg, file) => { 62 | console.log(fixup` Fixup file format: ${msg} `); 63 | console.log(fixup` File: ${file} `); 64 | }; 65 | 66 | const loadFile = async (filePath) => { 67 | const fileName = path.basename(filePath); 68 | const data = await fs.readFile(filePath, 'utf8'); 69 | if (data.includes('\r')) { 70 | warnFixup('expected LF linebreaks, not CRLF or CR', fileName); 71 | } 72 | if (!data.startsWith('## ')) { 73 | wrongFormat('no markdown «## Heading»', fileName); 74 | } 75 | if (!data.endsWith('\n')) { 76 | warnFixup('no newline at the end of file', fileName); 77 | } 78 | return data; 79 | }; 80 | 81 | const SYMBOLS = ['~', '+', '*', '!', '"', '&', '^']; 82 | const LETTERS = ['h', 'k', 'u', 'e', 't', 'r', 'c']; 83 | const LEVEL_COMMON = ['heard', 'known', 'used', 'explained']; 84 | const LEVEL_EXT = ['talked', 'researched', 'constructed']; 85 | const LEVEL = [...LEVEL_COMMON, ...LEVEL_EXT]; 86 | const EMOJI = ['👂', '🎓', '🖐️', '🙋', '📢', '🔬', '🚀']; 87 | const LEVEL_EMOJI = Object.fromEntries(LEVEL.map((n, i) => [n, EMOJI[i]])); 88 | const EMOJI_LEVEL = Object.fromEntries(EMOJI.map((n, i) => [n, LEVEL[i]])); 89 | const LABELS = LEVEL.map((n, i) => `${EMOJI[i]} ${n}`); 90 | const LEVEL_LABELS = ['🤷 unknown', ...LABELS]; 91 | 92 | const removeColon = (line) => { 93 | const s = line.trim(); 94 | if (!s.endsWith(':')) return s; 95 | return s.substring(0, s.length - 1).trim(); 96 | }; 97 | 98 | const useShorthand = (s) => { 99 | let index = -1; 100 | for (const symbol of SYMBOLS) { 101 | if (s.endsWith(symbol)) { 102 | index = SYMBOLS.indexOf(symbol); 103 | break; 104 | } 105 | } 106 | if (index === -1 && s.at(-2) === ' ') { 107 | const last = s.at(-1).toLowerCase(); 108 | index = LETTERS.indexOf(last); 109 | } 110 | if (index >= 0) { 111 | const emoji = EMOJI[index]; 112 | return s.substring(0, s.length - 1) + emoji; 113 | } 114 | return s; 115 | }; 116 | 117 | const formatSkill = (line) => { 118 | let skill = removeColon(line.substring(1).trim()); 119 | skill = useShorthand(skill); 120 | let icon = ''; 121 | let name = ''; 122 | for (const emoji of EMOJI) { 123 | const pos = skill.indexOf(emoji); 124 | if (pos === -1) continue; 125 | icon = emoji; 126 | name = skill.substring(pos + emoji.length, skill.length).trim(); 127 | skill = skill.substring(0, pos); 128 | break; 129 | } 130 | if (!icon) { 131 | for (const level of LEVEL) { 132 | if (!skill.endsWith(' ' + level)) continue; 133 | name = level; 134 | skill = skill.substring(0, skill.length - level.length); 135 | break; 136 | } 137 | } 138 | skill = removeColon(skill); 139 | if (icon && !name) name = EMOJI_LEVEL[icon]; 140 | if (name && !icon) icon = LEVEL_EMOJI[name]; 141 | let level = (icon + ' ' + name).trim(); 142 | if (icon && name && LEVEL_EMOJI[name] !== icon) level = undefined; 143 | return { skill, level }; 144 | }; 145 | 146 | const getSkills = (data, file, options) => { 147 | const lines = data.split('\n'); 148 | if (lines.at(-1).trim() === '') lines.pop(); 149 | let section = ''; 150 | let empty = 0; 151 | const sections = {}; 152 | const skills = new Map(); 153 | const out = []; 154 | for (const [i, s] of lines.entries()) { 155 | const line = s.trim(); 156 | if (line === '') { 157 | if ((!section && empty > 0) || (section)) { 158 | warnFixup(`removed empty line at line ${i + 1}`, file); 159 | } else { 160 | out.push(line); 161 | } 162 | empty++; 163 | continue; 164 | } 165 | empty = 0; 166 | if (s.startsWith('##')) { 167 | out.push(line); 168 | continue; 169 | } 170 | if (s.startsWith('-')) { 171 | out.push(line); 172 | section = line.slice(1).trim(); 173 | sections[section] = {}; 174 | continue; 175 | } 176 | if (s.startsWith(' -')) { 177 | const { skill, level } = formatSkill(line); 178 | if (level === undefined) { 179 | const msg = 'not matching level and emoji'; 180 | wrongFormat(`${msg} «${line}» at line ${i + 1}`, file); 181 | out.push(`${s} 👉 Warning: ${msg}`); 182 | skills.set(skill, ''); 183 | continue; 184 | } 185 | if (skills.has(skill) && options.unique) { 186 | warnFixup(`removed duplicate skill «${skill}» at line ${i + 1}`, file); 187 | } else { 188 | let row = ` - ${skill}`; 189 | if (level) row += `: ${level}`; 190 | out.push(row); 191 | const value = level || ''; 192 | sections[section][skill] = value; 193 | skills.set(skill, value); 194 | } 195 | continue; 196 | } 197 | wrongFormat(`unkonw structure at line ${i + 1}`, file); 198 | } 199 | const output = out.join('\n') + '\n'; 200 | if (data !== output) { 201 | fs.writeFile(file, output).catch(() => {}); 202 | const fileName = file.slice(PATH.length); 203 | console.log(`Fixup: ${data.length} -> ${output.length} saved: ${fileName}`); 204 | } 205 | return { sections, skills }; 206 | }; 207 | 208 | const analise = async (dir, unit, options) => { 209 | console.log(chapter` Unit: ${unit}`); 210 | const file = `${dir}/${unit}.md`; 211 | const md = await loadFile(file); 212 | const data = getSkills(md, file, options); 213 | const { sections, skills } = data; 214 | const count = Object.keys(sections).length; 215 | console.log(` Sections: ${count}, Skills: ${skills.size}\n`); 216 | return data; 217 | }; 218 | 219 | const loadDir = async (place, options = {}) => { 220 | const dir = path.join(PATH, place); 221 | const files = await fs.readdir(dir); 222 | const units = files 223 | .filter((file) => file.endsWith('.md')) 224 | .map((file) => file.substring(0, file.length - '.md'.length)); 225 | const collection = {}; 226 | for (const unit of units) { 227 | collection[unit] = await analise(dir, unit, options); 228 | } 229 | return collection; 230 | }; 231 | 232 | const match = (expected, answered) => { 233 | const todo = []; 234 | for (const section in expected.sections) { 235 | todo.push(`\n| ${section} | actual | ⟶ | required |`); 236 | todo.push(`| --- | --- | --- | --- |`); 237 | const needed = expected.sections[section]; 238 | let count = 0; 239 | let have = 0; 240 | let above = 0; 241 | let upgrade = 0; 242 | const entries = Object.entries(needed); 243 | const propose = []; 244 | for (const [skill, level] of entries) { 245 | if (level) count++; 246 | const actual = answered.skills.get(skill) || '🤷 unknown'; 247 | const actualIndex = LEVEL_LABELS.indexOf(actual); 248 | const levelIndex = LEVEL_LABELS.indexOf(level || '🤷 unknown'); 249 | if (actualIndex < levelIndex) { 250 | upgrade++; 251 | propose.push(`| ${skill} | ${actual} | ⟶ | ${level} |`); 252 | } 253 | if (actualIndex > levelIndex) above++; 254 | if (actualIndex >= levelIndex && levelIndex !== 0) have++; 255 | } 256 | if (have) todo.push(...propose); 257 | const total = `you have \`${have}\` of \`${count}\` skills`; 258 | const ext = `\`${upgrade}\` to be upgraded, and \`${above}\` above needed`; 259 | todo.push(`\nTotal: ${total}, ${ext}`); 260 | } 261 | return todo; 262 | }; 263 | 264 | const NBSP = '    '; 265 | 266 | const getTotal = (answered) => { 267 | const total = []; 268 | for (const section in answered.sections) { 269 | const skills = answered.sections[section]; 270 | let count = 0; 271 | const entries = Object.values(skills); 272 | for (const level of entries) { 273 | if (level) count++; 274 | } 275 | total.push(`| ${NBSP} ${section} | \`${count}\` | \`${entries.length}\` |`); 276 | if (count > 0) { 277 | overall.count += count; 278 | overall.total += entries.length; 279 | } 280 | overall.all += entries.length; 281 | } 282 | return total; 283 | }; 284 | 285 | (async () => { 286 | console.log(caption`${TITLE}`); 287 | console.log('Auto Checker\n'); 288 | 289 | console.log(caption`Load skills`); 290 | const skills = await loadDir('Skills', { unique: true }); 291 | 292 | console.log(caption`Load roles`); 293 | const roles = await loadDir('.github/src/Roles'); 294 | 295 | console.log(caption`Match profiles`); 296 | const todos = []; 297 | const totals = ['## Assessment totals\n']; 298 | totals.push(`| Unit | Marked | Of |`); 299 | totals.push(`| ---- | ------ | -- |`); 300 | for (const unit of UNITS) { 301 | console.log(chapter` Unit: ${unit}`); 302 | const expected = roles[unit]; 303 | const answered = skills[unit]; 304 | if (expected) { 305 | const todo = match(expected, answered); 306 | todos.push(`\n## [${unit}](/Skills/${unit}.md)\n`); 307 | todos.push(...todo); 308 | } 309 | totals.push(`| [${unit}](/Skills/${unit}.md) | | |`); 310 | const total = getTotal(answered); 311 | totals.push(...total); 312 | } 313 | 314 | const badge = generateBadge(); 315 | const badgeCode = `${codeBlock(badge.md)}\n\n${codeBlock(badge.html)}`; 316 | const report = [ 317 | `## ${TITLE}\n\n${badge.md}\n\n${badgeCode}\n`, 318 | ...totals, 319 | ...todos, 320 | ]; 321 | const profileReport = report.join('\n') + '\n'; 322 | await fs.writeFile(`${PATH}/Profile/REPORT.md`, profileReport); 323 | 324 | const readmeFile = `${PATH}/README.md`; 325 | const template = await loadFile(readmeFile); 326 | const readme = template.replace('', badge.md); 327 | await fs.writeFile(readmeFile, readme); 328 | 329 | console.log(''); 330 | process.exit(exitCode); 331 | })(); 332 | -------------------------------------------------------------------------------- /.github/src/Roles/NodeJS.md: -------------------------------------------------------------------------------- 1 | ## Node.js and backend 2 | 3 | - API and domain logic developer 4 | - Strong and weak sides of node.js 5 | - Stateful and stateless servers 6 | - Nonblocking I/O and blocking code 7 | - CommonJS modules 8 | - ECMAScript modules 9 | - Modules as singletons 10 | - Dependencies 11 | - npm, node_modules 12 | - package.json and package lock 13 | - Dependency injection 14 | - DI containers 15 | - Coupling and cohesion 16 | - Framework agnostic approach 17 | - Streams API 18 | - Crypto API 19 | - Password hashing with crypto.scrypt 20 | - File system API (sync and async) 21 | - Native fetch and nodejs/undici 22 | - Generating crypto random UUID 23 | - Module `node:url` vs new URL 24 | - Module `node:assert` 25 | - Blob, File, Buffer, module `node:buffer` 26 | - Endpoint throttling 27 | - HTTP(S) 28 | - TCP/SSL 29 | - TLS 30 | - Websocket 31 | - REST 32 | - RPC 33 | - Routing 34 | - DoS 35 | - DDoS 36 | - Path traversal 37 | - DNS 38 | - Fetch API 39 | - IncomingMessage 40 | - SQL injection 41 | - SSL certificates 42 | - Protocol agnostic approach 43 | - Native test runner 44 | - Logging 45 | - Application configuring 46 | - Testing 47 | - CI/CD 48 | - Readable 49 | - Writable 50 | - Transform 51 | - Back pressure 52 | - Buffer 53 | - Console 54 | - Data access layer 55 | - Repository 56 | - Active record 57 | - Query builder 58 | - Object-Relational Mapping 59 | - Error 60 | - error.cause 61 | - error.code 62 | - error.message 63 | - error.stack 64 | - How to avoid mixins 65 | - Uncaught exceptions 66 | - Memory leaks 67 | - Resource leaks 68 | - Data race 69 | - Enterprise applications 70 | - Strong and weak sides of node.js 71 | - Stateful and stateless servers 72 | - Nonblocking I/O and blocking code 73 | - Node.js LTS schedule 74 | - CommonJS modules 75 | - ECMAScript modules 76 | - Modules as singletons 77 | - Dependencies 78 | - npm, node_modules 79 | - package.json and package lock 80 | - Dependency injection 81 | - DI containers 82 | - Coupling and cohesion 83 | - Framework agnostic approach 84 | - Command line arguments 85 | - Node.js CLI 86 | - Graceful shutdown 87 | - Clustering 88 | - Watch filesystem changes with --watch 89 | - Streams API 90 | - Crypto API 91 | - Password hashing with crypto.scrypt 92 | - File system API (sync and async) 93 | - Copy folder recursively 94 | - Worker threads 95 | - Native fetch and nodejs/undici 96 | - worker_threads 97 | - child_process 98 | - Generating crypto random UUID 99 | - Module `node:url` vs new URL 100 | - Module `node:assert` 101 | - Module `node:assert` 102 | - Internationalization 103 | - Blob, File, Buffer, module `node:buffer` 104 | - Module `node:zlib` 105 | - Endpoint throttling 106 | - HTTP(S) 107 | - TCP/SSL 108 | - TLS 109 | - Websocket 110 | - SSE 111 | - Long polling 112 | - REST 113 | - RPC 114 | - Routing 115 | - DoS 116 | - DDoS 117 | - XSS 118 | - Path traversal 119 | - CSRF 120 | - DNS 121 | - Fetch API 122 | - IncomingMessage 123 | - SQL injection 124 | - noDelay 125 | - keep-alive 126 | - ALPN 127 | - SNI callback 128 | - SSL certificates 129 | - Protocol agnostic approach 130 | - Native test runner 131 | - Logging 132 | - Application configuring 133 | - Testing 134 | - CI/CD 135 | - Readable 136 | - Writable 137 | - Transform 138 | - Back pressure 139 | - Buffer 140 | - Console 141 | - Inspector 142 | - Reliability 143 | - Quality 144 | - Availability 145 | - Flexibility 146 | - Data access layer 147 | - Repository 148 | - Active record 149 | - Query builder 150 | - Object-Relational Mapping 151 | - Error 152 | - error.cause 153 | - error.code 154 | - error.message 155 | - error.stack 156 | - How to avoid mixins 157 | - Error.captureStackTrace 158 | - Uncaught exceptions 159 | - Heap dump 160 | - Debugging tools 161 | - Flame graph 162 | - Memory leaks 163 | - Resource leaks 164 | - Data race 165 | - Real-Time, gamedev, messaging 166 | - Strong and weak sides of node.js 167 | - Stateful and stateless servers 168 | - Nonblocking I/O and blocking code 169 | - Event loop phases 170 | - Event loop microtasks and macrotasks 171 | - I/O-bound, CPU-bound, memory-bound tasks 172 | - Interactive applications (close to real-time) 173 | - CommonJS modules 174 | - ECMAScript modules 175 | - Dependencies 176 | - npm, node_modules 177 | - package.json and package lock 178 | - Dependency injection 179 | - DI containers 180 | - Coupling and cohesion 181 | - Framework agnostic approach 182 | - Graceful shutdown 183 | - Clustering 184 | - Streams API 185 | - File system API (sync and async) 186 | - Worker threads 187 | - Native fetch and nodejs/undici 188 | - Module `node:worker_threads` 189 | - Module `node:child_process` 190 | - Generating crypto random UUID 191 | - Endpoint throttling 192 | - HTTP(S) 193 | - TCP/SSL 194 | - UDP 195 | - TLS 196 | - Websocket 197 | - SSE 198 | - HTTP/3 (QUIC) 199 | - Long polling 200 | - REST 201 | - RPC 202 | - Routing 203 | - DoS 204 | - DDoS 205 | - XSS 206 | - Path traversal 207 | - DNS 208 | - Fetch API 209 | - IncomingMessage 210 | - noDelay 211 | - keep-alive 212 | - Protocol agnostic approach 213 | - Logging 214 | - Application configuring 215 | - Testing 216 | - CI/CD 217 | - Readable 218 | - Writable 219 | - Transform 220 | - Back pressure 221 | - Buffer 222 | - Inspector 223 | - Reliability 224 | - Availability 225 | - Data access layer 226 | - Error 227 | - error.cause 228 | - error.code 229 | - error.message 230 | - error.stack 231 | - How to avoid mixins 232 | - Heap dump 233 | - Memory leaks 234 | - Resource leaks 235 | - Data race 236 | - Web and Frontend 237 | - Strong and weak sides of node.js 238 | - Stateful and stateless servers 239 | - CommonJS modules 240 | - ECMAScript modules 241 | - Dependencies 242 | - npm, node_modules 243 | - package.json and package lock 244 | - Dependency injection 245 | - DI containers 246 | - Coupling and cohesion 247 | - Framework agnostic approach 248 | - Web Streams API 249 | - Web Crypto API 250 | - Native fetch and nodejs/undici 251 | - Module `node:url` vs new URL 252 | - Internationalization 253 | - HTTP(S) 254 | - TCP/SSL 255 | - Websocket 256 | - REST 257 | - RPC 258 | - DNS 259 | - Fetch API 260 | - IncomingMessage 261 | - SSL certificates 262 | - Protocol agnostic approach 263 | - Native test runner 264 | - Testing 265 | - CI/CD 266 | - Console 267 | - Inspector 268 | - Data access layer 269 | - Error 270 | - error.cause 271 | - error.code 272 | - error.message 273 | - error.stack 274 | - How to avoid mixins 275 | - Heap dump 276 | - Debugging tools 277 | - Memory leaks 278 | - Resource leaks 279 | - Data race 280 | - Fullstack development 281 | - Strong and weak sides of node.js 282 | - Stateful and stateless servers 283 | - Nonblocking I/O and blocking code 284 | - CommonJS modules 285 | - ECMAScript modules 286 | - Dependencies 287 | - npm, node_modules 288 | - package.json and package lock 289 | - Dependency injection 290 | - DI containers 291 | - Coupling and cohesion 292 | - Framework agnostic approach 293 | - Streams API 294 | - Web Streams API 295 | - Crypto API 296 | - Password hashing with crypto.scrypt 297 | - Web Crypto API 298 | - File system API (sync and async) 299 | - Native fetch and nodejs/undici 300 | - Module `node:url` vs new URL 301 | - Module `node:assert` 302 | - Internationalization 303 | - Blob, File, Buffer, module `node:buffer` 304 | - Module `node:zlib` 305 | - Endpoint throttling 306 | - HTTP(S) 307 | - TCP/SSL 308 | - TLS 309 | - Websocket 310 | - SSE 311 | - Long polling 312 | - REST 313 | - RPC 314 | - Routing 315 | - DoS 316 | - DDoS 317 | - XSS 318 | - Path traversal 319 | - CSRF 320 | - DNS 321 | - Fetch API 322 | - IncomingMessage 323 | - SQL injection 324 | - noDelay 325 | - keep-alive 326 | - SSL certificates 327 | - Protocol agnostic approach 328 | - Native test runner 329 | - Logging 330 | - Application configuring 331 | - Testing 332 | - CI/CD 333 | - Readable 334 | - Writable 335 | - Transform 336 | - Back pressure 337 | - Buffer 338 | - Console 339 | - Inspector 340 | - Reliability 341 | - Data access layer 342 | - Repository 343 | - Active record 344 | - Query builder 345 | - Object-Relational Mapping 346 | - Error 347 | - error.cause 348 | - error.code 349 | - error.message 350 | - error.stack 351 | - How to avoid mixins 352 | - Uncaught exceptions 353 | - Heap dump 354 | - Debugging tools 355 | - Memory leaks 356 | - Resource leaks 357 | - Data race 358 | - Platform/system development 359 | - Strong and weak sides of node.js 360 | - Stateful and stateless servers 361 | - Nonblocking I/O and blocking code 362 | - Event loop phases 363 | - Event loop microtasks and macrotasks 364 | - Garbage collection 365 | - Node.js LTS schedule 366 | - I/O-bound, CPU-bound, memory-bound tasks 367 | - CommonJS modules 368 | - ECMAScript modules 369 | - Module `node:module` 370 | - Caching in CJS and ESM 371 | - Modules as singletons 372 | - Contexts and scripts module `node:vm` 373 | - Dependencies 374 | - npm, node_modules 375 | - package.json and package lock 376 | - Module-based permissions model 377 | - Isolation with modularity 378 | - Dependency injection 379 | - DI containers 380 | - Coupling and cohesion 381 | - Framework agnostic approach 382 | - Command line arguments 383 | - Node.js CLI 384 | - Process-based permissions 385 | - Graceful shutdown 386 | - Clustering 387 | - Watch filesystem changes with --watch 388 | - Streams API 389 | - Web Streams API 390 | - Crypto API 391 | - Password hashing with crypto.scrypt 392 | - Web Crypto API 393 | - File system API (sync and async) 394 | - Copy folder recursively 395 | - Worker threads 396 | - Performance hooks 397 | - Native fetch and nodejs/undici 398 | - async_hooks 399 | - AsyncLocalStorage 400 | - AsyncResource 401 | - Deprecated domain API 402 | - Node.js single executable 403 | - SharedArrayBuffer 404 | - worker_threads 405 | - child_process 406 | - MessageChannel, MessagePort 407 | - BroadcastChannel 408 | - Generating crypto random UUID 409 | - Module `node:url` vs new URL 410 | - Module `node:assert` 411 | - Internationalization 412 | - Blob, File, Buffer, module `node:buffer` 413 | - Module `node:zlib` 414 | - IP sticky sessions 415 | - Endpoint throttling 416 | - HTTP(S) 417 | - TCP/SSL 418 | - UDP 419 | - TLS 420 | - Websocket 421 | - SSE 422 | - HTTP/3 (QUIC) 423 | - Long polling 424 | - REST 425 | - RPC 426 | - Routing 427 | - DoS 428 | - DDoS 429 | - XSS 430 | - Path traversal 431 | - CSRF 432 | - DNS 433 | - Fetch API 434 | - IncomingMessage 435 | - SQL injection 436 | - noDelay 437 | - keep-alive 438 | - ALPN 439 | - SNI callback 440 | - SSL certificates 441 | - Protocol agnostic approach 442 | - Native test runner 443 | - Logging 444 | - Application configuring 445 | - Testing 446 | - CI/CD 447 | - Readable 448 | - Writable 449 | - Transform 450 | - Back pressure 451 | - Buffer 452 | - Console 453 | - Inspector 454 | - Reliability 455 | - Quality 456 | - Availability 457 | - Flexibility 458 | - Data access layer 459 | - Repository 460 | - Active record 461 | - Query builder 462 | - Object-Relational Mapping 463 | - Error 464 | - error.cause 465 | - error.code 466 | - error.message 467 | - error.stack 468 | - How to avoid mixins 469 | - Error.captureStackTrace 470 | - Uncaught exceptions 471 | - Heap dump 472 | - Debugging tools 473 | - Flame graph 474 | - Memory leaks 475 | - Resource leaks 476 | - Data race 477 | - Native addons 478 | - `C` and `C++` addons 479 | - `Rust` addons 480 | - `Zig` addons 481 | - NAN (Native Abstractions for Node.js) 482 | - Node-API (formerly N-API) 483 | - NAPI `C` and `C++` 484 | - NAPI `Rust` 485 | - NAPI `Zig` 486 | - Webassembly `WAT` 487 | - Webassembly `C` and `C++` 488 | - Webassembly `Rust` 489 | - Webassembly `Zig` 490 | - Webassembly `AssemblyScript` 491 | - Shared memory 492 | - V8 binary serialization 493 | -------------------------------------------------------------------------------- /.github/src/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "self-assessment", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "self-assessment", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "concolor": "^1.1.0", 13 | "metautil": "^5.2.0" 14 | }, 15 | "devDependencies": { 16 | "eslint": "^8.56.0", 17 | "eslint-config-metarhia": "^8.2.2", 18 | "eslint-config-prettier": "^9.1.0", 19 | "eslint-plugin-import": "^2.29.1", 20 | "eslint-plugin-prettier": "^5.1.3", 21 | "prettier": "^3.1.1" 22 | }, 23 | "engines": { 24 | "node": ">=18.0.0" 25 | } 26 | }, 27 | "node_modules/@aashutoshrathi/word-wrap": { 28 | "version": "1.2.6", 29 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 30 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 31 | "dev": true, 32 | "engines": { 33 | "node": ">=0.10.0" 34 | } 35 | }, 36 | "node_modules/@eslint-community/eslint-utils": { 37 | "version": "4.4.0", 38 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 39 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 40 | "dev": true, 41 | "dependencies": { 42 | "eslint-visitor-keys": "^3.3.0" 43 | }, 44 | "engines": { 45 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 46 | }, 47 | "peerDependencies": { 48 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 49 | } 50 | }, 51 | "node_modules/@eslint-community/regexpp": { 52 | "version": "4.10.0", 53 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", 54 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", 55 | "dev": true, 56 | "engines": { 57 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 58 | } 59 | }, 60 | "node_modules/@eslint/eslintrc": { 61 | "version": "2.1.4", 62 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 63 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 64 | "dev": true, 65 | "dependencies": { 66 | "ajv": "^6.12.4", 67 | "debug": "^4.3.2", 68 | "espree": "^9.6.0", 69 | "globals": "^13.19.0", 70 | "ignore": "^5.2.0", 71 | "import-fresh": "^3.2.1", 72 | "js-yaml": "^4.1.0", 73 | "minimatch": "^3.1.2", 74 | "strip-json-comments": "^3.1.1" 75 | }, 76 | "engines": { 77 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 78 | }, 79 | "funding": { 80 | "url": "https://opencollective.com/eslint" 81 | } 82 | }, 83 | "node_modules/@eslint/js": { 84 | "version": "8.56.0", 85 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", 86 | "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", 87 | "dev": true, 88 | "engines": { 89 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 90 | } 91 | }, 92 | "node_modules/@humanwhocodes/config-array": { 93 | "version": "0.11.13", 94 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", 95 | "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", 96 | "dev": true, 97 | "dependencies": { 98 | "@humanwhocodes/object-schema": "^2.0.1", 99 | "debug": "^4.1.1", 100 | "minimatch": "^3.0.5" 101 | }, 102 | "engines": { 103 | "node": ">=10.10.0" 104 | } 105 | }, 106 | "node_modules/@humanwhocodes/module-importer": { 107 | "version": "1.0.1", 108 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 109 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 110 | "dev": true, 111 | "engines": { 112 | "node": ">=12.22" 113 | }, 114 | "funding": { 115 | "type": "github", 116 | "url": "https://github.com/sponsors/nzakas" 117 | } 118 | }, 119 | "node_modules/@humanwhocodes/object-schema": { 120 | "version": "2.0.1", 121 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", 122 | "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", 123 | "dev": true 124 | }, 125 | "node_modules/@nodelib/fs.scandir": { 126 | "version": "2.1.5", 127 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 128 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 129 | "dev": true, 130 | "dependencies": { 131 | "@nodelib/fs.stat": "2.0.5", 132 | "run-parallel": "^1.1.9" 133 | }, 134 | "engines": { 135 | "node": ">= 8" 136 | } 137 | }, 138 | "node_modules/@nodelib/fs.stat": { 139 | "version": "2.0.5", 140 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 141 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 142 | "dev": true, 143 | "engines": { 144 | "node": ">= 8" 145 | } 146 | }, 147 | "node_modules/@nodelib/fs.walk": { 148 | "version": "1.2.8", 149 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 150 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 151 | "dev": true, 152 | "dependencies": { 153 | "@nodelib/fs.scandir": "2.1.5", 154 | "fastq": "^1.6.0" 155 | }, 156 | "engines": { 157 | "node": ">= 8" 158 | } 159 | }, 160 | "node_modules/@pkgr/core": { 161 | "version": "0.1.0", 162 | "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", 163 | "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", 164 | "dev": true, 165 | "engines": { 166 | "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 167 | }, 168 | "funding": { 169 | "url": "https://opencollective.com/unts" 170 | } 171 | }, 172 | "node_modules/@types/json5": { 173 | "version": "0.0.29", 174 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 175 | "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", 176 | "dev": true 177 | }, 178 | "node_modules/@ungap/structured-clone": { 179 | "version": "1.2.0", 180 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 181 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 182 | "dev": true 183 | }, 184 | "node_modules/acorn": { 185 | "version": "8.11.3", 186 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 187 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 188 | "dev": true, 189 | "bin": { 190 | "acorn": "bin/acorn" 191 | }, 192 | "engines": { 193 | "node": ">=0.4.0" 194 | } 195 | }, 196 | "node_modules/acorn-jsx": { 197 | "version": "5.3.2", 198 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 199 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 200 | "dev": true, 201 | "peerDependencies": { 202 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 203 | } 204 | }, 205 | "node_modules/ajv": { 206 | "version": "6.12.6", 207 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 208 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 209 | "dev": true, 210 | "dependencies": { 211 | "fast-deep-equal": "^3.1.1", 212 | "fast-json-stable-stringify": "^2.0.0", 213 | "json-schema-traverse": "^0.4.1", 214 | "uri-js": "^4.2.2" 215 | }, 216 | "funding": { 217 | "type": "github", 218 | "url": "https://github.com/sponsors/epoberezkin" 219 | } 220 | }, 221 | "node_modules/ansi-regex": { 222 | "version": "5.0.1", 223 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 224 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 225 | "dev": true, 226 | "engines": { 227 | "node": ">=8" 228 | } 229 | }, 230 | "node_modules/ansi-styles": { 231 | "version": "4.3.0", 232 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 233 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 234 | "dev": true, 235 | "dependencies": { 236 | "color-convert": "^2.0.1" 237 | }, 238 | "engines": { 239 | "node": ">=8" 240 | }, 241 | "funding": { 242 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 243 | } 244 | }, 245 | "node_modules/argparse": { 246 | "version": "2.0.1", 247 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 248 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 249 | "dev": true 250 | }, 251 | "node_modules/array-buffer-byte-length": { 252 | "version": "1.0.0", 253 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", 254 | "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", 255 | "dev": true, 256 | "dependencies": { 257 | "call-bind": "^1.0.2", 258 | "is-array-buffer": "^3.0.1" 259 | }, 260 | "funding": { 261 | "url": "https://github.com/sponsors/ljharb" 262 | } 263 | }, 264 | "node_modules/array-includes": { 265 | "version": "3.1.7", 266 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", 267 | "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", 268 | "dev": true, 269 | "dependencies": { 270 | "call-bind": "^1.0.2", 271 | "define-properties": "^1.2.0", 272 | "es-abstract": "^1.22.1", 273 | "get-intrinsic": "^1.2.1", 274 | "is-string": "^1.0.7" 275 | }, 276 | "engines": { 277 | "node": ">= 0.4" 278 | }, 279 | "funding": { 280 | "url": "https://github.com/sponsors/ljharb" 281 | } 282 | }, 283 | "node_modules/array.prototype.findlastindex": { 284 | "version": "1.2.3", 285 | "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", 286 | "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", 287 | "dev": true, 288 | "dependencies": { 289 | "call-bind": "^1.0.2", 290 | "define-properties": "^1.2.0", 291 | "es-abstract": "^1.22.1", 292 | "es-shim-unscopables": "^1.0.0", 293 | "get-intrinsic": "^1.2.1" 294 | }, 295 | "engines": { 296 | "node": ">= 0.4" 297 | }, 298 | "funding": { 299 | "url": "https://github.com/sponsors/ljharb" 300 | } 301 | }, 302 | "node_modules/array.prototype.flat": { 303 | "version": "1.3.2", 304 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", 305 | "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", 306 | "dev": true, 307 | "dependencies": { 308 | "call-bind": "^1.0.2", 309 | "define-properties": "^1.2.0", 310 | "es-abstract": "^1.22.1", 311 | "es-shim-unscopables": "^1.0.0" 312 | }, 313 | "engines": { 314 | "node": ">= 0.4" 315 | }, 316 | "funding": { 317 | "url": "https://github.com/sponsors/ljharb" 318 | } 319 | }, 320 | "node_modules/array.prototype.flatmap": { 321 | "version": "1.3.2", 322 | "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", 323 | "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", 324 | "dev": true, 325 | "dependencies": { 326 | "call-bind": "^1.0.2", 327 | "define-properties": "^1.2.0", 328 | "es-abstract": "^1.22.1", 329 | "es-shim-unscopables": "^1.0.0" 330 | }, 331 | "engines": { 332 | "node": ">= 0.4" 333 | }, 334 | "funding": { 335 | "url": "https://github.com/sponsors/ljharb" 336 | } 337 | }, 338 | "node_modules/arraybuffer.prototype.slice": { 339 | "version": "1.0.2", 340 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", 341 | "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", 342 | "dev": true, 343 | "dependencies": { 344 | "array-buffer-byte-length": "^1.0.0", 345 | "call-bind": "^1.0.2", 346 | "define-properties": "^1.2.0", 347 | "es-abstract": "^1.22.1", 348 | "get-intrinsic": "^1.2.1", 349 | "is-array-buffer": "^3.0.2", 350 | "is-shared-array-buffer": "^1.0.2" 351 | }, 352 | "engines": { 353 | "node": ">= 0.4" 354 | }, 355 | "funding": { 356 | "url": "https://github.com/sponsors/ljharb" 357 | } 358 | }, 359 | "node_modules/available-typed-arrays": { 360 | "version": "1.0.5", 361 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 362 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 363 | "dev": true, 364 | "engines": { 365 | "node": ">= 0.4" 366 | }, 367 | "funding": { 368 | "url": "https://github.com/sponsors/ljharb" 369 | } 370 | }, 371 | "node_modules/balanced-match": { 372 | "version": "1.0.2", 373 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 374 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 375 | "dev": true 376 | }, 377 | "node_modules/brace-expansion": { 378 | "version": "1.1.11", 379 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 380 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 381 | "dev": true, 382 | "dependencies": { 383 | "balanced-match": "^1.0.0", 384 | "concat-map": "0.0.1" 385 | } 386 | }, 387 | "node_modules/call-bind": { 388 | "version": "1.0.5", 389 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 390 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 391 | "dev": true, 392 | "dependencies": { 393 | "function-bind": "^1.1.2", 394 | "get-intrinsic": "^1.2.1", 395 | "set-function-length": "^1.1.1" 396 | }, 397 | "funding": { 398 | "url": "https://github.com/sponsors/ljharb" 399 | } 400 | }, 401 | "node_modules/callsites": { 402 | "version": "3.1.0", 403 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 404 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 405 | "dev": true, 406 | "engines": { 407 | "node": ">=6" 408 | } 409 | }, 410 | "node_modules/chalk": { 411 | "version": "4.1.2", 412 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 413 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 414 | "dev": true, 415 | "dependencies": { 416 | "ansi-styles": "^4.1.0", 417 | "supports-color": "^7.1.0" 418 | }, 419 | "engines": { 420 | "node": ">=10" 421 | }, 422 | "funding": { 423 | "url": "https://github.com/chalk/chalk?sponsor=1" 424 | } 425 | }, 426 | "node_modules/color-convert": { 427 | "version": "2.0.1", 428 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 429 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 430 | "dev": true, 431 | "dependencies": { 432 | "color-name": "~1.1.4" 433 | }, 434 | "engines": { 435 | "node": ">=7.0.0" 436 | } 437 | }, 438 | "node_modules/color-name": { 439 | "version": "1.1.4", 440 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 441 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 442 | "dev": true 443 | }, 444 | "node_modules/concat-map": { 445 | "version": "0.0.1", 446 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 447 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 448 | "dev": true 449 | }, 450 | "node_modules/concolor": { 451 | "version": "1.1.0", 452 | "resolved": "https://registry.npmjs.org/concolor/-/concolor-1.1.0.tgz", 453 | "integrity": "sha512-+3Fv9sVckhuzfksFU3e0lONmWKiL+Z88/R01KpAIqW2gVsmL8Ojw/KhkVcyAEeQeVBZcbb9zoDFbVcfVj4Pg9A==", 454 | "engines": { 455 | "node": "18 || 20" 456 | }, 457 | "funding": { 458 | "type": "patreon", 459 | "url": "https://www.patreon.com/tshemsedinov" 460 | } 461 | }, 462 | "node_modules/cross-spawn": { 463 | "version": "7.0.3", 464 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 465 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 466 | "dev": true, 467 | "dependencies": { 468 | "path-key": "^3.1.0", 469 | "shebang-command": "^2.0.0", 470 | "which": "^2.0.1" 471 | }, 472 | "engines": { 473 | "node": ">= 8" 474 | } 475 | }, 476 | "node_modules/debug": { 477 | "version": "4.3.4", 478 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 479 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 480 | "dev": true, 481 | "dependencies": { 482 | "ms": "2.1.2" 483 | }, 484 | "engines": { 485 | "node": ">=6.0" 486 | }, 487 | "peerDependenciesMeta": { 488 | "supports-color": { 489 | "optional": true 490 | } 491 | } 492 | }, 493 | "node_modules/deep-is": { 494 | "version": "0.1.4", 495 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 496 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 497 | "dev": true 498 | }, 499 | "node_modules/define-data-property": { 500 | "version": "1.1.1", 501 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 502 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 503 | "dev": true, 504 | "dependencies": { 505 | "get-intrinsic": "^1.2.1", 506 | "gopd": "^1.0.1", 507 | "has-property-descriptors": "^1.0.0" 508 | }, 509 | "engines": { 510 | "node": ">= 0.4" 511 | } 512 | }, 513 | "node_modules/define-properties": { 514 | "version": "1.2.1", 515 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 516 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 517 | "dev": true, 518 | "dependencies": { 519 | "define-data-property": "^1.0.1", 520 | "has-property-descriptors": "^1.0.0", 521 | "object-keys": "^1.1.1" 522 | }, 523 | "engines": { 524 | "node": ">= 0.4" 525 | }, 526 | "funding": { 527 | "url": "https://github.com/sponsors/ljharb" 528 | } 529 | }, 530 | "node_modules/doctrine": { 531 | "version": "3.0.0", 532 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 533 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 534 | "dev": true, 535 | "dependencies": { 536 | "esutils": "^2.0.2" 537 | }, 538 | "engines": { 539 | "node": ">=6.0.0" 540 | } 541 | }, 542 | "node_modules/es-abstract": { 543 | "version": "1.22.3", 544 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", 545 | "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", 546 | "dev": true, 547 | "dependencies": { 548 | "array-buffer-byte-length": "^1.0.0", 549 | "arraybuffer.prototype.slice": "^1.0.2", 550 | "available-typed-arrays": "^1.0.5", 551 | "call-bind": "^1.0.5", 552 | "es-set-tostringtag": "^2.0.1", 553 | "es-to-primitive": "^1.2.1", 554 | "function.prototype.name": "^1.1.6", 555 | "get-intrinsic": "^1.2.2", 556 | "get-symbol-description": "^1.0.0", 557 | "globalthis": "^1.0.3", 558 | "gopd": "^1.0.1", 559 | "has-property-descriptors": "^1.0.0", 560 | "has-proto": "^1.0.1", 561 | "has-symbols": "^1.0.3", 562 | "hasown": "^2.0.0", 563 | "internal-slot": "^1.0.5", 564 | "is-array-buffer": "^3.0.2", 565 | "is-callable": "^1.2.7", 566 | "is-negative-zero": "^2.0.2", 567 | "is-regex": "^1.1.4", 568 | "is-shared-array-buffer": "^1.0.2", 569 | "is-string": "^1.0.7", 570 | "is-typed-array": "^1.1.12", 571 | "is-weakref": "^1.0.2", 572 | "object-inspect": "^1.13.1", 573 | "object-keys": "^1.1.1", 574 | "object.assign": "^4.1.4", 575 | "regexp.prototype.flags": "^1.5.1", 576 | "safe-array-concat": "^1.0.1", 577 | "safe-regex-test": "^1.0.0", 578 | "string.prototype.trim": "^1.2.8", 579 | "string.prototype.trimend": "^1.0.7", 580 | "string.prototype.trimstart": "^1.0.7", 581 | "typed-array-buffer": "^1.0.0", 582 | "typed-array-byte-length": "^1.0.0", 583 | "typed-array-byte-offset": "^1.0.0", 584 | "typed-array-length": "^1.0.4", 585 | "unbox-primitive": "^1.0.2", 586 | "which-typed-array": "^1.1.13" 587 | }, 588 | "engines": { 589 | "node": ">= 0.4" 590 | }, 591 | "funding": { 592 | "url": "https://github.com/sponsors/ljharb" 593 | } 594 | }, 595 | "node_modules/es-set-tostringtag": { 596 | "version": "2.0.2", 597 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", 598 | "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", 599 | "dev": true, 600 | "dependencies": { 601 | "get-intrinsic": "^1.2.2", 602 | "has-tostringtag": "^1.0.0", 603 | "hasown": "^2.0.0" 604 | }, 605 | "engines": { 606 | "node": ">= 0.4" 607 | } 608 | }, 609 | "node_modules/es-shim-unscopables": { 610 | "version": "1.0.2", 611 | "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", 612 | "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", 613 | "dev": true, 614 | "dependencies": { 615 | "hasown": "^2.0.0" 616 | } 617 | }, 618 | "node_modules/es-to-primitive": { 619 | "version": "1.2.1", 620 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 621 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 622 | "dev": true, 623 | "dependencies": { 624 | "is-callable": "^1.1.4", 625 | "is-date-object": "^1.0.1", 626 | "is-symbol": "^1.0.2" 627 | }, 628 | "engines": { 629 | "node": ">= 0.4" 630 | }, 631 | "funding": { 632 | "url": "https://github.com/sponsors/ljharb" 633 | } 634 | }, 635 | "node_modules/escape-string-regexp": { 636 | "version": "4.0.0", 637 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 638 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 639 | "dev": true, 640 | "engines": { 641 | "node": ">=10" 642 | }, 643 | "funding": { 644 | "url": "https://github.com/sponsors/sindresorhus" 645 | } 646 | }, 647 | "node_modules/eslint": { 648 | "version": "8.56.0", 649 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", 650 | "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", 651 | "dev": true, 652 | "dependencies": { 653 | "@eslint-community/eslint-utils": "^4.2.0", 654 | "@eslint-community/regexpp": "^4.6.1", 655 | "@eslint/eslintrc": "^2.1.4", 656 | "@eslint/js": "8.56.0", 657 | "@humanwhocodes/config-array": "^0.11.13", 658 | "@humanwhocodes/module-importer": "^1.0.1", 659 | "@nodelib/fs.walk": "^1.2.8", 660 | "@ungap/structured-clone": "^1.2.0", 661 | "ajv": "^6.12.4", 662 | "chalk": "^4.0.0", 663 | "cross-spawn": "^7.0.2", 664 | "debug": "^4.3.2", 665 | "doctrine": "^3.0.0", 666 | "escape-string-regexp": "^4.0.0", 667 | "eslint-scope": "^7.2.2", 668 | "eslint-visitor-keys": "^3.4.3", 669 | "espree": "^9.6.1", 670 | "esquery": "^1.4.2", 671 | "esutils": "^2.0.2", 672 | "fast-deep-equal": "^3.1.3", 673 | "file-entry-cache": "^6.0.1", 674 | "find-up": "^5.0.0", 675 | "glob-parent": "^6.0.2", 676 | "globals": "^13.19.0", 677 | "graphemer": "^1.4.0", 678 | "ignore": "^5.2.0", 679 | "imurmurhash": "^0.1.4", 680 | "is-glob": "^4.0.0", 681 | "is-path-inside": "^3.0.3", 682 | "js-yaml": "^4.1.0", 683 | "json-stable-stringify-without-jsonify": "^1.0.1", 684 | "levn": "^0.4.1", 685 | "lodash.merge": "^4.6.2", 686 | "minimatch": "^3.1.2", 687 | "natural-compare": "^1.4.0", 688 | "optionator": "^0.9.3", 689 | "strip-ansi": "^6.0.1", 690 | "text-table": "^0.2.0" 691 | }, 692 | "bin": { 693 | "eslint": "bin/eslint.js" 694 | }, 695 | "engines": { 696 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 697 | }, 698 | "funding": { 699 | "url": "https://opencollective.com/eslint" 700 | } 701 | }, 702 | "node_modules/eslint-config-metarhia": { 703 | "version": "8.2.2", 704 | "resolved": "https://registry.npmjs.org/eslint-config-metarhia/-/eslint-config-metarhia-8.2.2.tgz", 705 | "integrity": "sha512-3jaPFa2XyzPBIG2BilGgc/iL3JwN54BaiKdlCDq6Odm9EagsStEx07lGETmH/b1sb7h2OYQRGUHewWmK2+XvPg==", 706 | "dev": true, 707 | "engines": { 708 | "node": "16 || 18 || 20 || 21" 709 | }, 710 | "funding": { 711 | "type": "patreon", 712 | "url": "https://www.patreon.com/tshemsedinov" 713 | }, 714 | "peerDependencies": { 715 | "eslint": "^8.45.0", 716 | "eslint-plugin-import": "^2.27.5" 717 | } 718 | }, 719 | "node_modules/eslint-config-prettier": { 720 | "version": "9.1.0", 721 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", 722 | "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", 723 | "dev": true, 724 | "bin": { 725 | "eslint-config-prettier": "bin/cli.js" 726 | }, 727 | "peerDependencies": { 728 | "eslint": ">=7.0.0" 729 | } 730 | }, 731 | "node_modules/eslint-import-resolver-node": { 732 | "version": "0.3.9", 733 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", 734 | "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", 735 | "dev": true, 736 | "dependencies": { 737 | "debug": "^3.2.7", 738 | "is-core-module": "^2.13.0", 739 | "resolve": "^1.22.4" 740 | } 741 | }, 742 | "node_modules/eslint-import-resolver-node/node_modules/debug": { 743 | "version": "3.2.7", 744 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 745 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 746 | "dev": true, 747 | "dependencies": { 748 | "ms": "^2.1.1" 749 | } 750 | }, 751 | "node_modules/eslint-module-utils": { 752 | "version": "2.8.0", 753 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", 754 | "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", 755 | "dev": true, 756 | "dependencies": { 757 | "debug": "^3.2.7" 758 | }, 759 | "engines": { 760 | "node": ">=4" 761 | }, 762 | "peerDependenciesMeta": { 763 | "eslint": { 764 | "optional": true 765 | } 766 | } 767 | }, 768 | "node_modules/eslint-module-utils/node_modules/debug": { 769 | "version": "3.2.7", 770 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 771 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 772 | "dev": true, 773 | "dependencies": { 774 | "ms": "^2.1.1" 775 | } 776 | }, 777 | "node_modules/eslint-plugin-import": { 778 | "version": "2.29.1", 779 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", 780 | "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", 781 | "dev": true, 782 | "dependencies": { 783 | "array-includes": "^3.1.7", 784 | "array.prototype.findlastindex": "^1.2.3", 785 | "array.prototype.flat": "^1.3.2", 786 | "array.prototype.flatmap": "^1.3.2", 787 | "debug": "^3.2.7", 788 | "doctrine": "^2.1.0", 789 | "eslint-import-resolver-node": "^0.3.9", 790 | "eslint-module-utils": "^2.8.0", 791 | "hasown": "^2.0.0", 792 | "is-core-module": "^2.13.1", 793 | "is-glob": "^4.0.3", 794 | "minimatch": "^3.1.2", 795 | "object.fromentries": "^2.0.7", 796 | "object.groupby": "^1.0.1", 797 | "object.values": "^1.1.7", 798 | "semver": "^6.3.1", 799 | "tsconfig-paths": "^3.15.0" 800 | }, 801 | "engines": { 802 | "node": ">=4" 803 | }, 804 | "peerDependencies": { 805 | "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" 806 | } 807 | }, 808 | "node_modules/eslint-plugin-import/node_modules/debug": { 809 | "version": "3.2.7", 810 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 811 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 812 | "dev": true, 813 | "dependencies": { 814 | "ms": "^2.1.1" 815 | } 816 | }, 817 | "node_modules/eslint-plugin-import/node_modules/doctrine": { 818 | "version": "2.1.0", 819 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 820 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 821 | "dev": true, 822 | "dependencies": { 823 | "esutils": "^2.0.2" 824 | }, 825 | "engines": { 826 | "node": ">=0.10.0" 827 | } 828 | }, 829 | "node_modules/eslint-plugin-prettier": { 830 | "version": "5.1.3", 831 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", 832 | "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", 833 | "dev": true, 834 | "dependencies": { 835 | "prettier-linter-helpers": "^1.0.0", 836 | "synckit": "^0.8.6" 837 | }, 838 | "engines": { 839 | "node": "^14.18.0 || >=16.0.0" 840 | }, 841 | "funding": { 842 | "url": "https://opencollective.com/eslint-plugin-prettier" 843 | }, 844 | "peerDependencies": { 845 | "@types/eslint": ">=8.0.0", 846 | "eslint": ">=8.0.0", 847 | "eslint-config-prettier": "*", 848 | "prettier": ">=3.0.0" 849 | }, 850 | "peerDependenciesMeta": { 851 | "@types/eslint": { 852 | "optional": true 853 | }, 854 | "eslint-config-prettier": { 855 | "optional": true 856 | } 857 | } 858 | }, 859 | "node_modules/eslint-scope": { 860 | "version": "7.2.2", 861 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 862 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 863 | "dev": true, 864 | "dependencies": { 865 | "esrecurse": "^4.3.0", 866 | "estraverse": "^5.2.0" 867 | }, 868 | "engines": { 869 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 870 | }, 871 | "funding": { 872 | "url": "https://opencollective.com/eslint" 873 | } 874 | }, 875 | "node_modules/eslint-visitor-keys": { 876 | "version": "3.4.3", 877 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 878 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 879 | "dev": true, 880 | "engines": { 881 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 882 | }, 883 | "funding": { 884 | "url": "https://opencollective.com/eslint" 885 | } 886 | }, 887 | "node_modules/espree": { 888 | "version": "9.6.1", 889 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 890 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 891 | "dev": true, 892 | "dependencies": { 893 | "acorn": "^8.9.0", 894 | "acorn-jsx": "^5.3.2", 895 | "eslint-visitor-keys": "^3.4.1" 896 | }, 897 | "engines": { 898 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 899 | }, 900 | "funding": { 901 | "url": "https://opencollective.com/eslint" 902 | } 903 | }, 904 | "node_modules/esquery": { 905 | "version": "1.5.0", 906 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 907 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 908 | "dev": true, 909 | "dependencies": { 910 | "estraverse": "^5.1.0" 911 | }, 912 | "engines": { 913 | "node": ">=0.10" 914 | } 915 | }, 916 | "node_modules/esrecurse": { 917 | "version": "4.3.0", 918 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 919 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 920 | "dev": true, 921 | "dependencies": { 922 | "estraverse": "^5.2.0" 923 | }, 924 | "engines": { 925 | "node": ">=4.0" 926 | } 927 | }, 928 | "node_modules/estraverse": { 929 | "version": "5.3.0", 930 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 931 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 932 | "dev": true, 933 | "engines": { 934 | "node": ">=4.0" 935 | } 936 | }, 937 | "node_modules/esutils": { 938 | "version": "2.0.3", 939 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 940 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 941 | "dev": true, 942 | "engines": { 943 | "node": ">=0.10.0" 944 | } 945 | }, 946 | "node_modules/fast-deep-equal": { 947 | "version": "3.1.3", 948 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 949 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 950 | "dev": true 951 | }, 952 | "node_modules/fast-diff": { 953 | "version": "1.3.0", 954 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", 955 | "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", 956 | "dev": true 957 | }, 958 | "node_modules/fast-json-stable-stringify": { 959 | "version": "2.1.0", 960 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 961 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 962 | "dev": true 963 | }, 964 | "node_modules/fast-levenshtein": { 965 | "version": "2.0.6", 966 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 967 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 968 | "dev": true 969 | }, 970 | "node_modules/fastq": { 971 | "version": "1.16.0", 972 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", 973 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 974 | "dev": true, 975 | "dependencies": { 976 | "reusify": "^1.0.4" 977 | } 978 | }, 979 | "node_modules/file-entry-cache": { 980 | "version": "6.0.1", 981 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 982 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 983 | "dev": true, 984 | "dependencies": { 985 | "flat-cache": "^3.0.4" 986 | }, 987 | "engines": { 988 | "node": "^10.12.0 || >=12.0.0" 989 | } 990 | }, 991 | "node_modules/find-up": { 992 | "version": "5.0.0", 993 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 994 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 995 | "dev": true, 996 | "dependencies": { 997 | "locate-path": "^6.0.0", 998 | "path-exists": "^4.0.0" 999 | }, 1000 | "engines": { 1001 | "node": ">=10" 1002 | }, 1003 | "funding": { 1004 | "url": "https://github.com/sponsors/sindresorhus" 1005 | } 1006 | }, 1007 | "node_modules/flat-cache": { 1008 | "version": "3.2.0", 1009 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 1010 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 1011 | "dev": true, 1012 | "dependencies": { 1013 | "flatted": "^3.2.9", 1014 | "keyv": "^4.5.3", 1015 | "rimraf": "^3.0.2" 1016 | }, 1017 | "engines": { 1018 | "node": "^10.12.0 || >=12.0.0" 1019 | } 1020 | }, 1021 | "node_modules/flatted": { 1022 | "version": "3.2.9", 1023 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", 1024 | "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", 1025 | "dev": true 1026 | }, 1027 | "node_modules/for-each": { 1028 | "version": "0.3.3", 1029 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1030 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1031 | "dev": true, 1032 | "dependencies": { 1033 | "is-callable": "^1.1.3" 1034 | } 1035 | }, 1036 | "node_modules/fs.realpath": { 1037 | "version": "1.0.0", 1038 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1039 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1040 | "dev": true 1041 | }, 1042 | "node_modules/function-bind": { 1043 | "version": "1.1.2", 1044 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1045 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1046 | "dev": true, 1047 | "funding": { 1048 | "url": "https://github.com/sponsors/ljharb" 1049 | } 1050 | }, 1051 | "node_modules/function.prototype.name": { 1052 | "version": "1.1.6", 1053 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", 1054 | "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", 1055 | "dev": true, 1056 | "dependencies": { 1057 | "call-bind": "^1.0.2", 1058 | "define-properties": "^1.2.0", 1059 | "es-abstract": "^1.22.1", 1060 | "functions-have-names": "^1.2.3" 1061 | }, 1062 | "engines": { 1063 | "node": ">= 0.4" 1064 | }, 1065 | "funding": { 1066 | "url": "https://github.com/sponsors/ljharb" 1067 | } 1068 | }, 1069 | "node_modules/functions-have-names": { 1070 | "version": "1.2.3", 1071 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 1072 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 1073 | "dev": true, 1074 | "funding": { 1075 | "url": "https://github.com/sponsors/ljharb" 1076 | } 1077 | }, 1078 | "node_modules/get-intrinsic": { 1079 | "version": "1.2.2", 1080 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 1081 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 1082 | "dev": true, 1083 | "dependencies": { 1084 | "function-bind": "^1.1.2", 1085 | "has-proto": "^1.0.1", 1086 | "has-symbols": "^1.0.3", 1087 | "hasown": "^2.0.0" 1088 | }, 1089 | "funding": { 1090 | "url": "https://github.com/sponsors/ljharb" 1091 | } 1092 | }, 1093 | "node_modules/get-symbol-description": { 1094 | "version": "1.0.0", 1095 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 1096 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 1097 | "dev": true, 1098 | "dependencies": { 1099 | "call-bind": "^1.0.2", 1100 | "get-intrinsic": "^1.1.1" 1101 | }, 1102 | "engines": { 1103 | "node": ">= 0.4" 1104 | }, 1105 | "funding": { 1106 | "url": "https://github.com/sponsors/ljharb" 1107 | } 1108 | }, 1109 | "node_modules/glob": { 1110 | "version": "7.2.3", 1111 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1112 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1113 | "dev": true, 1114 | "dependencies": { 1115 | "fs.realpath": "^1.0.0", 1116 | "inflight": "^1.0.4", 1117 | "inherits": "2", 1118 | "minimatch": "^3.1.1", 1119 | "once": "^1.3.0", 1120 | "path-is-absolute": "^1.0.0" 1121 | }, 1122 | "engines": { 1123 | "node": "*" 1124 | }, 1125 | "funding": { 1126 | "url": "https://github.com/sponsors/isaacs" 1127 | } 1128 | }, 1129 | "node_modules/glob-parent": { 1130 | "version": "6.0.2", 1131 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1132 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1133 | "dev": true, 1134 | "dependencies": { 1135 | "is-glob": "^4.0.3" 1136 | }, 1137 | "engines": { 1138 | "node": ">=10.13.0" 1139 | } 1140 | }, 1141 | "node_modules/globals": { 1142 | "version": "13.24.0", 1143 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 1144 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 1145 | "dev": true, 1146 | "dependencies": { 1147 | "type-fest": "^0.20.2" 1148 | }, 1149 | "engines": { 1150 | "node": ">=8" 1151 | }, 1152 | "funding": { 1153 | "url": "https://github.com/sponsors/sindresorhus" 1154 | } 1155 | }, 1156 | "node_modules/globalthis": { 1157 | "version": "1.0.3", 1158 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 1159 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 1160 | "dev": true, 1161 | "dependencies": { 1162 | "define-properties": "^1.1.3" 1163 | }, 1164 | "engines": { 1165 | "node": ">= 0.4" 1166 | }, 1167 | "funding": { 1168 | "url": "https://github.com/sponsors/ljharb" 1169 | } 1170 | }, 1171 | "node_modules/gopd": { 1172 | "version": "1.0.1", 1173 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1174 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1175 | "dev": true, 1176 | "dependencies": { 1177 | "get-intrinsic": "^1.1.3" 1178 | }, 1179 | "funding": { 1180 | "url": "https://github.com/sponsors/ljharb" 1181 | } 1182 | }, 1183 | "node_modules/graphemer": { 1184 | "version": "1.4.0", 1185 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1186 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1187 | "dev": true 1188 | }, 1189 | "node_modules/has-bigints": { 1190 | "version": "1.0.2", 1191 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 1192 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 1193 | "dev": true, 1194 | "funding": { 1195 | "url": "https://github.com/sponsors/ljharb" 1196 | } 1197 | }, 1198 | "node_modules/has-flag": { 1199 | "version": "4.0.0", 1200 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1201 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1202 | "dev": true, 1203 | "engines": { 1204 | "node": ">=8" 1205 | } 1206 | }, 1207 | "node_modules/has-property-descriptors": { 1208 | "version": "1.0.1", 1209 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 1210 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 1211 | "dev": true, 1212 | "dependencies": { 1213 | "get-intrinsic": "^1.2.2" 1214 | }, 1215 | "funding": { 1216 | "url": "https://github.com/sponsors/ljharb" 1217 | } 1218 | }, 1219 | "node_modules/has-proto": { 1220 | "version": "1.0.1", 1221 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1222 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 1223 | "dev": true, 1224 | "engines": { 1225 | "node": ">= 0.4" 1226 | }, 1227 | "funding": { 1228 | "url": "https://github.com/sponsors/ljharb" 1229 | } 1230 | }, 1231 | "node_modules/has-symbols": { 1232 | "version": "1.0.3", 1233 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1234 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1235 | "dev": true, 1236 | "engines": { 1237 | "node": ">= 0.4" 1238 | }, 1239 | "funding": { 1240 | "url": "https://github.com/sponsors/ljharb" 1241 | } 1242 | }, 1243 | "node_modules/has-tostringtag": { 1244 | "version": "1.0.0", 1245 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1246 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1247 | "dev": true, 1248 | "dependencies": { 1249 | "has-symbols": "^1.0.2" 1250 | }, 1251 | "engines": { 1252 | "node": ">= 0.4" 1253 | }, 1254 | "funding": { 1255 | "url": "https://github.com/sponsors/ljharb" 1256 | } 1257 | }, 1258 | "node_modules/hasown": { 1259 | "version": "2.0.0", 1260 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 1261 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 1262 | "dev": true, 1263 | "dependencies": { 1264 | "function-bind": "^1.1.2" 1265 | }, 1266 | "engines": { 1267 | "node": ">= 0.4" 1268 | } 1269 | }, 1270 | "node_modules/ignore": { 1271 | "version": "5.3.0", 1272 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", 1273 | "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", 1274 | "dev": true, 1275 | "engines": { 1276 | "node": ">= 4" 1277 | } 1278 | }, 1279 | "node_modules/import-fresh": { 1280 | "version": "3.3.0", 1281 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1282 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1283 | "dev": true, 1284 | "dependencies": { 1285 | "parent-module": "^1.0.0", 1286 | "resolve-from": "^4.0.0" 1287 | }, 1288 | "engines": { 1289 | "node": ">=6" 1290 | }, 1291 | "funding": { 1292 | "url": "https://github.com/sponsors/sindresorhus" 1293 | } 1294 | }, 1295 | "node_modules/imurmurhash": { 1296 | "version": "0.1.4", 1297 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1298 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1299 | "dev": true, 1300 | "engines": { 1301 | "node": ">=0.8.19" 1302 | } 1303 | }, 1304 | "node_modules/inflight": { 1305 | "version": "1.0.6", 1306 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1307 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1308 | "dev": true, 1309 | "dependencies": { 1310 | "once": "^1.3.0", 1311 | "wrappy": "1" 1312 | } 1313 | }, 1314 | "node_modules/inherits": { 1315 | "version": "2.0.4", 1316 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1317 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1318 | "dev": true 1319 | }, 1320 | "node_modules/internal-slot": { 1321 | "version": "1.0.6", 1322 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", 1323 | "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", 1324 | "dev": true, 1325 | "dependencies": { 1326 | "get-intrinsic": "^1.2.2", 1327 | "hasown": "^2.0.0", 1328 | "side-channel": "^1.0.4" 1329 | }, 1330 | "engines": { 1331 | "node": ">= 0.4" 1332 | } 1333 | }, 1334 | "node_modules/is-array-buffer": { 1335 | "version": "3.0.2", 1336 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", 1337 | "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", 1338 | "dev": true, 1339 | "dependencies": { 1340 | "call-bind": "^1.0.2", 1341 | "get-intrinsic": "^1.2.0", 1342 | "is-typed-array": "^1.1.10" 1343 | }, 1344 | "funding": { 1345 | "url": "https://github.com/sponsors/ljharb" 1346 | } 1347 | }, 1348 | "node_modules/is-bigint": { 1349 | "version": "1.0.4", 1350 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1351 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1352 | "dev": true, 1353 | "dependencies": { 1354 | "has-bigints": "^1.0.1" 1355 | }, 1356 | "funding": { 1357 | "url": "https://github.com/sponsors/ljharb" 1358 | } 1359 | }, 1360 | "node_modules/is-boolean-object": { 1361 | "version": "1.1.2", 1362 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1363 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1364 | "dev": true, 1365 | "dependencies": { 1366 | "call-bind": "^1.0.2", 1367 | "has-tostringtag": "^1.0.0" 1368 | }, 1369 | "engines": { 1370 | "node": ">= 0.4" 1371 | }, 1372 | "funding": { 1373 | "url": "https://github.com/sponsors/ljharb" 1374 | } 1375 | }, 1376 | "node_modules/is-callable": { 1377 | "version": "1.2.7", 1378 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 1379 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 1380 | "dev": true, 1381 | "engines": { 1382 | "node": ">= 0.4" 1383 | }, 1384 | "funding": { 1385 | "url": "https://github.com/sponsors/ljharb" 1386 | } 1387 | }, 1388 | "node_modules/is-core-module": { 1389 | "version": "2.13.1", 1390 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1391 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1392 | "dev": true, 1393 | "dependencies": { 1394 | "hasown": "^2.0.0" 1395 | }, 1396 | "funding": { 1397 | "url": "https://github.com/sponsors/ljharb" 1398 | } 1399 | }, 1400 | "node_modules/is-date-object": { 1401 | "version": "1.0.5", 1402 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1403 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1404 | "dev": true, 1405 | "dependencies": { 1406 | "has-tostringtag": "^1.0.0" 1407 | }, 1408 | "engines": { 1409 | "node": ">= 0.4" 1410 | }, 1411 | "funding": { 1412 | "url": "https://github.com/sponsors/ljharb" 1413 | } 1414 | }, 1415 | "node_modules/is-extglob": { 1416 | "version": "2.1.1", 1417 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1418 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1419 | "dev": true, 1420 | "engines": { 1421 | "node": ">=0.10.0" 1422 | } 1423 | }, 1424 | "node_modules/is-glob": { 1425 | "version": "4.0.3", 1426 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1427 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1428 | "dev": true, 1429 | "dependencies": { 1430 | "is-extglob": "^2.1.1" 1431 | }, 1432 | "engines": { 1433 | "node": ">=0.10.0" 1434 | } 1435 | }, 1436 | "node_modules/is-negative-zero": { 1437 | "version": "2.0.2", 1438 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1439 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1440 | "dev": true, 1441 | "engines": { 1442 | "node": ">= 0.4" 1443 | }, 1444 | "funding": { 1445 | "url": "https://github.com/sponsors/ljharb" 1446 | } 1447 | }, 1448 | "node_modules/is-number-object": { 1449 | "version": "1.0.7", 1450 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1451 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1452 | "dev": true, 1453 | "dependencies": { 1454 | "has-tostringtag": "^1.0.0" 1455 | }, 1456 | "engines": { 1457 | "node": ">= 0.4" 1458 | }, 1459 | "funding": { 1460 | "url": "https://github.com/sponsors/ljharb" 1461 | } 1462 | }, 1463 | "node_modules/is-path-inside": { 1464 | "version": "3.0.3", 1465 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1466 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1467 | "dev": true, 1468 | "engines": { 1469 | "node": ">=8" 1470 | } 1471 | }, 1472 | "node_modules/is-regex": { 1473 | "version": "1.1.4", 1474 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1475 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1476 | "dev": true, 1477 | "dependencies": { 1478 | "call-bind": "^1.0.2", 1479 | "has-tostringtag": "^1.0.0" 1480 | }, 1481 | "engines": { 1482 | "node": ">= 0.4" 1483 | }, 1484 | "funding": { 1485 | "url": "https://github.com/sponsors/ljharb" 1486 | } 1487 | }, 1488 | "node_modules/is-shared-array-buffer": { 1489 | "version": "1.0.2", 1490 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1491 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1492 | "dev": true, 1493 | "dependencies": { 1494 | "call-bind": "^1.0.2" 1495 | }, 1496 | "funding": { 1497 | "url": "https://github.com/sponsors/ljharb" 1498 | } 1499 | }, 1500 | "node_modules/is-string": { 1501 | "version": "1.0.7", 1502 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1503 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1504 | "dev": true, 1505 | "dependencies": { 1506 | "has-tostringtag": "^1.0.0" 1507 | }, 1508 | "engines": { 1509 | "node": ">= 0.4" 1510 | }, 1511 | "funding": { 1512 | "url": "https://github.com/sponsors/ljharb" 1513 | } 1514 | }, 1515 | "node_modules/is-symbol": { 1516 | "version": "1.0.4", 1517 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1518 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1519 | "dev": true, 1520 | "dependencies": { 1521 | "has-symbols": "^1.0.2" 1522 | }, 1523 | "engines": { 1524 | "node": ">= 0.4" 1525 | }, 1526 | "funding": { 1527 | "url": "https://github.com/sponsors/ljharb" 1528 | } 1529 | }, 1530 | "node_modules/is-typed-array": { 1531 | "version": "1.1.12", 1532 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", 1533 | "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", 1534 | "dev": true, 1535 | "dependencies": { 1536 | "which-typed-array": "^1.1.11" 1537 | }, 1538 | "engines": { 1539 | "node": ">= 0.4" 1540 | }, 1541 | "funding": { 1542 | "url": "https://github.com/sponsors/ljharb" 1543 | } 1544 | }, 1545 | "node_modules/is-weakref": { 1546 | "version": "1.0.2", 1547 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1548 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1549 | "dev": true, 1550 | "dependencies": { 1551 | "call-bind": "^1.0.2" 1552 | }, 1553 | "funding": { 1554 | "url": "https://github.com/sponsors/ljharb" 1555 | } 1556 | }, 1557 | "node_modules/isarray": { 1558 | "version": "2.0.5", 1559 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1560 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 1561 | "dev": true 1562 | }, 1563 | "node_modules/isexe": { 1564 | "version": "2.0.0", 1565 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1566 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1567 | "dev": true 1568 | }, 1569 | "node_modules/js-yaml": { 1570 | "version": "4.1.0", 1571 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1572 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1573 | "dev": true, 1574 | "dependencies": { 1575 | "argparse": "^2.0.1" 1576 | }, 1577 | "bin": { 1578 | "js-yaml": "bin/js-yaml.js" 1579 | } 1580 | }, 1581 | "node_modules/json-buffer": { 1582 | "version": "3.0.1", 1583 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1584 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1585 | "dev": true 1586 | }, 1587 | "node_modules/json-schema-traverse": { 1588 | "version": "0.4.1", 1589 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1590 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1591 | "dev": true 1592 | }, 1593 | "node_modules/json-stable-stringify-without-jsonify": { 1594 | "version": "1.0.1", 1595 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1596 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1597 | "dev": true 1598 | }, 1599 | "node_modules/json5": { 1600 | "version": "1.0.2", 1601 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", 1602 | "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", 1603 | "dev": true, 1604 | "dependencies": { 1605 | "minimist": "^1.2.0" 1606 | }, 1607 | "bin": { 1608 | "json5": "lib/cli.js" 1609 | } 1610 | }, 1611 | "node_modules/keyv": { 1612 | "version": "4.5.4", 1613 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1614 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1615 | "dev": true, 1616 | "dependencies": { 1617 | "json-buffer": "3.0.1" 1618 | } 1619 | }, 1620 | "node_modules/levn": { 1621 | "version": "0.4.1", 1622 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1623 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1624 | "dev": true, 1625 | "dependencies": { 1626 | "prelude-ls": "^1.2.1", 1627 | "type-check": "~0.4.0" 1628 | }, 1629 | "engines": { 1630 | "node": ">= 0.8.0" 1631 | } 1632 | }, 1633 | "node_modules/locate-path": { 1634 | "version": "6.0.0", 1635 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1636 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1637 | "dev": true, 1638 | "dependencies": { 1639 | "p-locate": "^5.0.0" 1640 | }, 1641 | "engines": { 1642 | "node": ">=10" 1643 | }, 1644 | "funding": { 1645 | "url": "https://github.com/sponsors/sindresorhus" 1646 | } 1647 | }, 1648 | "node_modules/lodash.merge": { 1649 | "version": "4.6.2", 1650 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1651 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1652 | "dev": true 1653 | }, 1654 | "node_modules/metautil": { 1655 | "version": "5.2.0", 1656 | "resolved": "https://registry.npmjs.org/metautil/-/metautil-5.2.0.tgz", 1657 | "integrity": "sha512-oQK33F0fUEPF5jBsPCUKH/wrt4mryb+hQ1OYlY7OWW99XRmwV4WZEUj39B5MGDx2gs3XAvdPESnBK463FeAEpw==", 1658 | "engines": { 1659 | "node": "18 || 20 || 21" 1660 | }, 1661 | "funding": { 1662 | "type": "patreon", 1663 | "url": "https://www.patreon.com/tshemsedinov" 1664 | } 1665 | }, 1666 | "node_modules/minimatch": { 1667 | "version": "3.1.2", 1668 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1669 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1670 | "dev": true, 1671 | "dependencies": { 1672 | "brace-expansion": "^1.1.7" 1673 | }, 1674 | "engines": { 1675 | "node": "*" 1676 | } 1677 | }, 1678 | "node_modules/minimist": { 1679 | "version": "1.2.8", 1680 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1681 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1682 | "dev": true, 1683 | "funding": { 1684 | "url": "https://github.com/sponsors/ljharb" 1685 | } 1686 | }, 1687 | "node_modules/ms": { 1688 | "version": "2.1.2", 1689 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1690 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1691 | "dev": true 1692 | }, 1693 | "node_modules/natural-compare": { 1694 | "version": "1.4.0", 1695 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1696 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1697 | "dev": true 1698 | }, 1699 | "node_modules/object-inspect": { 1700 | "version": "1.13.1", 1701 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1702 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1703 | "dev": true, 1704 | "funding": { 1705 | "url": "https://github.com/sponsors/ljharb" 1706 | } 1707 | }, 1708 | "node_modules/object-keys": { 1709 | "version": "1.1.1", 1710 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1711 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1712 | "dev": true, 1713 | "engines": { 1714 | "node": ">= 0.4" 1715 | } 1716 | }, 1717 | "node_modules/object.assign": { 1718 | "version": "4.1.5", 1719 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", 1720 | "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", 1721 | "dev": true, 1722 | "dependencies": { 1723 | "call-bind": "^1.0.5", 1724 | "define-properties": "^1.2.1", 1725 | "has-symbols": "^1.0.3", 1726 | "object-keys": "^1.1.1" 1727 | }, 1728 | "engines": { 1729 | "node": ">= 0.4" 1730 | }, 1731 | "funding": { 1732 | "url": "https://github.com/sponsors/ljharb" 1733 | } 1734 | }, 1735 | "node_modules/object.fromentries": { 1736 | "version": "2.0.7", 1737 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", 1738 | "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", 1739 | "dev": true, 1740 | "dependencies": { 1741 | "call-bind": "^1.0.2", 1742 | "define-properties": "^1.2.0", 1743 | "es-abstract": "^1.22.1" 1744 | }, 1745 | "engines": { 1746 | "node": ">= 0.4" 1747 | }, 1748 | "funding": { 1749 | "url": "https://github.com/sponsors/ljharb" 1750 | } 1751 | }, 1752 | "node_modules/object.groupby": { 1753 | "version": "1.0.1", 1754 | "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", 1755 | "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", 1756 | "dev": true, 1757 | "dependencies": { 1758 | "call-bind": "^1.0.2", 1759 | "define-properties": "^1.2.0", 1760 | "es-abstract": "^1.22.1", 1761 | "get-intrinsic": "^1.2.1" 1762 | } 1763 | }, 1764 | "node_modules/object.values": { 1765 | "version": "1.1.7", 1766 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", 1767 | "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", 1768 | "dev": true, 1769 | "dependencies": { 1770 | "call-bind": "^1.0.2", 1771 | "define-properties": "^1.2.0", 1772 | "es-abstract": "^1.22.1" 1773 | }, 1774 | "engines": { 1775 | "node": ">= 0.4" 1776 | }, 1777 | "funding": { 1778 | "url": "https://github.com/sponsors/ljharb" 1779 | } 1780 | }, 1781 | "node_modules/once": { 1782 | "version": "1.4.0", 1783 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1784 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1785 | "dev": true, 1786 | "dependencies": { 1787 | "wrappy": "1" 1788 | } 1789 | }, 1790 | "node_modules/optionator": { 1791 | "version": "0.9.3", 1792 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 1793 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 1794 | "dev": true, 1795 | "dependencies": { 1796 | "@aashutoshrathi/word-wrap": "^1.2.3", 1797 | "deep-is": "^0.1.3", 1798 | "fast-levenshtein": "^2.0.6", 1799 | "levn": "^0.4.1", 1800 | "prelude-ls": "^1.2.1", 1801 | "type-check": "^0.4.0" 1802 | }, 1803 | "engines": { 1804 | "node": ">= 0.8.0" 1805 | } 1806 | }, 1807 | "node_modules/p-limit": { 1808 | "version": "3.1.0", 1809 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1810 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1811 | "dev": true, 1812 | "dependencies": { 1813 | "yocto-queue": "^0.1.0" 1814 | }, 1815 | "engines": { 1816 | "node": ">=10" 1817 | }, 1818 | "funding": { 1819 | "url": "https://github.com/sponsors/sindresorhus" 1820 | } 1821 | }, 1822 | "node_modules/p-locate": { 1823 | "version": "5.0.0", 1824 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1825 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1826 | "dev": true, 1827 | "dependencies": { 1828 | "p-limit": "^3.0.2" 1829 | }, 1830 | "engines": { 1831 | "node": ">=10" 1832 | }, 1833 | "funding": { 1834 | "url": "https://github.com/sponsors/sindresorhus" 1835 | } 1836 | }, 1837 | "node_modules/parent-module": { 1838 | "version": "1.0.1", 1839 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1840 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1841 | "dev": true, 1842 | "dependencies": { 1843 | "callsites": "^3.0.0" 1844 | }, 1845 | "engines": { 1846 | "node": ">=6" 1847 | } 1848 | }, 1849 | "node_modules/path-exists": { 1850 | "version": "4.0.0", 1851 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1852 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1853 | "dev": true, 1854 | "engines": { 1855 | "node": ">=8" 1856 | } 1857 | }, 1858 | "node_modules/path-is-absolute": { 1859 | "version": "1.0.1", 1860 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1861 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1862 | "dev": true, 1863 | "engines": { 1864 | "node": ">=0.10.0" 1865 | } 1866 | }, 1867 | "node_modules/path-key": { 1868 | "version": "3.1.1", 1869 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1870 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1871 | "dev": true, 1872 | "engines": { 1873 | "node": ">=8" 1874 | } 1875 | }, 1876 | "node_modules/path-parse": { 1877 | "version": "1.0.7", 1878 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1879 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1880 | "dev": true 1881 | }, 1882 | "node_modules/prelude-ls": { 1883 | "version": "1.2.1", 1884 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1885 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1886 | "dev": true, 1887 | "engines": { 1888 | "node": ">= 0.8.0" 1889 | } 1890 | }, 1891 | "node_modules/prettier": { 1892 | "version": "3.1.1", 1893 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", 1894 | "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", 1895 | "dev": true, 1896 | "bin": { 1897 | "prettier": "bin/prettier.cjs" 1898 | }, 1899 | "engines": { 1900 | "node": ">=14" 1901 | }, 1902 | "funding": { 1903 | "url": "https://github.com/prettier/prettier?sponsor=1" 1904 | } 1905 | }, 1906 | "node_modules/prettier-linter-helpers": { 1907 | "version": "1.0.0", 1908 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1909 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1910 | "dev": true, 1911 | "dependencies": { 1912 | "fast-diff": "^1.1.2" 1913 | }, 1914 | "engines": { 1915 | "node": ">=6.0.0" 1916 | } 1917 | }, 1918 | "node_modules/punycode": { 1919 | "version": "2.3.1", 1920 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1921 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1922 | "dev": true, 1923 | "engines": { 1924 | "node": ">=6" 1925 | } 1926 | }, 1927 | "node_modules/queue-microtask": { 1928 | "version": "1.2.3", 1929 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1930 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1931 | "dev": true, 1932 | "funding": [ 1933 | { 1934 | "type": "github", 1935 | "url": "https://github.com/sponsors/feross" 1936 | }, 1937 | { 1938 | "type": "patreon", 1939 | "url": "https://www.patreon.com/feross" 1940 | }, 1941 | { 1942 | "type": "consulting", 1943 | "url": "https://feross.org/support" 1944 | } 1945 | ] 1946 | }, 1947 | "node_modules/regexp.prototype.flags": { 1948 | "version": "1.5.1", 1949 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", 1950 | "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", 1951 | "dev": true, 1952 | "dependencies": { 1953 | "call-bind": "^1.0.2", 1954 | "define-properties": "^1.2.0", 1955 | "set-function-name": "^2.0.0" 1956 | }, 1957 | "engines": { 1958 | "node": ">= 0.4" 1959 | }, 1960 | "funding": { 1961 | "url": "https://github.com/sponsors/ljharb" 1962 | } 1963 | }, 1964 | "node_modules/resolve": { 1965 | "version": "1.22.8", 1966 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1967 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1968 | "dev": true, 1969 | "dependencies": { 1970 | "is-core-module": "^2.13.0", 1971 | "path-parse": "^1.0.7", 1972 | "supports-preserve-symlinks-flag": "^1.0.0" 1973 | }, 1974 | "bin": { 1975 | "resolve": "bin/resolve" 1976 | }, 1977 | "funding": { 1978 | "url": "https://github.com/sponsors/ljharb" 1979 | } 1980 | }, 1981 | "node_modules/resolve-from": { 1982 | "version": "4.0.0", 1983 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1984 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1985 | "dev": true, 1986 | "engines": { 1987 | "node": ">=4" 1988 | } 1989 | }, 1990 | "node_modules/reusify": { 1991 | "version": "1.0.4", 1992 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1993 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1994 | "dev": true, 1995 | "engines": { 1996 | "iojs": ">=1.0.0", 1997 | "node": ">=0.10.0" 1998 | } 1999 | }, 2000 | "node_modules/rimraf": { 2001 | "version": "3.0.2", 2002 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2003 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2004 | "dev": true, 2005 | "dependencies": { 2006 | "glob": "^7.1.3" 2007 | }, 2008 | "bin": { 2009 | "rimraf": "bin.js" 2010 | }, 2011 | "funding": { 2012 | "url": "https://github.com/sponsors/isaacs" 2013 | } 2014 | }, 2015 | "node_modules/run-parallel": { 2016 | "version": "1.2.0", 2017 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2018 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2019 | "dev": true, 2020 | "funding": [ 2021 | { 2022 | "type": "github", 2023 | "url": "https://github.com/sponsors/feross" 2024 | }, 2025 | { 2026 | "type": "patreon", 2027 | "url": "https://www.patreon.com/feross" 2028 | }, 2029 | { 2030 | "type": "consulting", 2031 | "url": "https://feross.org/support" 2032 | } 2033 | ], 2034 | "dependencies": { 2035 | "queue-microtask": "^1.2.2" 2036 | } 2037 | }, 2038 | "node_modules/safe-array-concat": { 2039 | "version": "1.0.1", 2040 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", 2041 | "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", 2042 | "dev": true, 2043 | "dependencies": { 2044 | "call-bind": "^1.0.2", 2045 | "get-intrinsic": "^1.2.1", 2046 | "has-symbols": "^1.0.3", 2047 | "isarray": "^2.0.5" 2048 | }, 2049 | "engines": { 2050 | "node": ">=0.4" 2051 | }, 2052 | "funding": { 2053 | "url": "https://github.com/sponsors/ljharb" 2054 | } 2055 | }, 2056 | "node_modules/safe-regex-test": { 2057 | "version": "1.0.1", 2058 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.1.tgz", 2059 | "integrity": "sha512-Y5NejJTTliTyY4H7sipGqY+RX5P87i3F7c4Rcepy72nq+mNLhIsD0W4c7kEmduMDQCSqtPsXPlSTsFhh2LQv+g==", 2060 | "dev": true, 2061 | "dependencies": { 2062 | "call-bind": "^1.0.5", 2063 | "get-intrinsic": "^1.2.2", 2064 | "is-regex": "^1.1.4" 2065 | }, 2066 | "engines": { 2067 | "node": ">= 0.4" 2068 | }, 2069 | "funding": { 2070 | "url": "https://github.com/sponsors/ljharb" 2071 | } 2072 | }, 2073 | "node_modules/semver": { 2074 | "version": "6.3.1", 2075 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2076 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2077 | "dev": true, 2078 | "bin": { 2079 | "semver": "bin/semver.js" 2080 | } 2081 | }, 2082 | "node_modules/set-function-length": { 2083 | "version": "1.1.1", 2084 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 2085 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 2086 | "dev": true, 2087 | "dependencies": { 2088 | "define-data-property": "^1.1.1", 2089 | "get-intrinsic": "^1.2.1", 2090 | "gopd": "^1.0.1", 2091 | "has-property-descriptors": "^1.0.0" 2092 | }, 2093 | "engines": { 2094 | "node": ">= 0.4" 2095 | } 2096 | }, 2097 | "node_modules/set-function-name": { 2098 | "version": "2.0.1", 2099 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", 2100 | "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", 2101 | "dev": true, 2102 | "dependencies": { 2103 | "define-data-property": "^1.0.1", 2104 | "functions-have-names": "^1.2.3", 2105 | "has-property-descriptors": "^1.0.0" 2106 | }, 2107 | "engines": { 2108 | "node": ">= 0.4" 2109 | } 2110 | }, 2111 | "node_modules/shebang-command": { 2112 | "version": "2.0.0", 2113 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2114 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2115 | "dev": true, 2116 | "dependencies": { 2117 | "shebang-regex": "^3.0.0" 2118 | }, 2119 | "engines": { 2120 | "node": ">=8" 2121 | } 2122 | }, 2123 | "node_modules/shebang-regex": { 2124 | "version": "3.0.0", 2125 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2126 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2127 | "dev": true, 2128 | "engines": { 2129 | "node": ">=8" 2130 | } 2131 | }, 2132 | "node_modules/side-channel": { 2133 | "version": "1.0.4", 2134 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2135 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2136 | "dev": true, 2137 | "dependencies": { 2138 | "call-bind": "^1.0.0", 2139 | "get-intrinsic": "^1.0.2", 2140 | "object-inspect": "^1.9.0" 2141 | }, 2142 | "funding": { 2143 | "url": "https://github.com/sponsors/ljharb" 2144 | } 2145 | }, 2146 | "node_modules/string.prototype.trim": { 2147 | "version": "1.2.8", 2148 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", 2149 | "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", 2150 | "dev": true, 2151 | "dependencies": { 2152 | "call-bind": "^1.0.2", 2153 | "define-properties": "^1.2.0", 2154 | "es-abstract": "^1.22.1" 2155 | }, 2156 | "engines": { 2157 | "node": ">= 0.4" 2158 | }, 2159 | "funding": { 2160 | "url": "https://github.com/sponsors/ljharb" 2161 | } 2162 | }, 2163 | "node_modules/string.prototype.trimend": { 2164 | "version": "1.0.7", 2165 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", 2166 | "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", 2167 | "dev": true, 2168 | "dependencies": { 2169 | "call-bind": "^1.0.2", 2170 | "define-properties": "^1.2.0", 2171 | "es-abstract": "^1.22.1" 2172 | }, 2173 | "funding": { 2174 | "url": "https://github.com/sponsors/ljharb" 2175 | } 2176 | }, 2177 | "node_modules/string.prototype.trimstart": { 2178 | "version": "1.0.7", 2179 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", 2180 | "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", 2181 | "dev": true, 2182 | "dependencies": { 2183 | "call-bind": "^1.0.2", 2184 | "define-properties": "^1.2.0", 2185 | "es-abstract": "^1.22.1" 2186 | }, 2187 | "funding": { 2188 | "url": "https://github.com/sponsors/ljharb" 2189 | } 2190 | }, 2191 | "node_modules/strip-ansi": { 2192 | "version": "6.0.1", 2193 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2194 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2195 | "dev": true, 2196 | "dependencies": { 2197 | "ansi-regex": "^5.0.1" 2198 | }, 2199 | "engines": { 2200 | "node": ">=8" 2201 | } 2202 | }, 2203 | "node_modules/strip-bom": { 2204 | "version": "3.0.0", 2205 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2206 | "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 2207 | "dev": true, 2208 | "engines": { 2209 | "node": ">=4" 2210 | } 2211 | }, 2212 | "node_modules/strip-json-comments": { 2213 | "version": "3.1.1", 2214 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2215 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2216 | "dev": true, 2217 | "engines": { 2218 | "node": ">=8" 2219 | }, 2220 | "funding": { 2221 | "url": "https://github.com/sponsors/sindresorhus" 2222 | } 2223 | }, 2224 | "node_modules/supports-color": { 2225 | "version": "7.2.0", 2226 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2227 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2228 | "dev": true, 2229 | "dependencies": { 2230 | "has-flag": "^4.0.0" 2231 | }, 2232 | "engines": { 2233 | "node": ">=8" 2234 | } 2235 | }, 2236 | "node_modules/supports-preserve-symlinks-flag": { 2237 | "version": "1.0.0", 2238 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2239 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2240 | "dev": true, 2241 | "engines": { 2242 | "node": ">= 0.4" 2243 | }, 2244 | "funding": { 2245 | "url": "https://github.com/sponsors/ljharb" 2246 | } 2247 | }, 2248 | "node_modules/synckit": { 2249 | "version": "0.8.8", 2250 | "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", 2251 | "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", 2252 | "dev": true, 2253 | "dependencies": { 2254 | "@pkgr/core": "^0.1.0", 2255 | "tslib": "^2.6.2" 2256 | }, 2257 | "engines": { 2258 | "node": "^14.18.0 || >=16.0.0" 2259 | }, 2260 | "funding": { 2261 | "url": "https://opencollective.com/unts" 2262 | } 2263 | }, 2264 | "node_modules/text-table": { 2265 | "version": "0.2.0", 2266 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2267 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2268 | "dev": true 2269 | }, 2270 | "node_modules/tsconfig-paths": { 2271 | "version": "3.15.0", 2272 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", 2273 | "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", 2274 | "dev": true, 2275 | "dependencies": { 2276 | "@types/json5": "^0.0.29", 2277 | "json5": "^1.0.2", 2278 | "minimist": "^1.2.6", 2279 | "strip-bom": "^3.0.0" 2280 | } 2281 | }, 2282 | "node_modules/tslib": { 2283 | "version": "2.6.2", 2284 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 2285 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 2286 | "dev": true 2287 | }, 2288 | "node_modules/type-check": { 2289 | "version": "0.4.0", 2290 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2291 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2292 | "dev": true, 2293 | "dependencies": { 2294 | "prelude-ls": "^1.2.1" 2295 | }, 2296 | "engines": { 2297 | "node": ">= 0.8.0" 2298 | } 2299 | }, 2300 | "node_modules/type-fest": { 2301 | "version": "0.20.2", 2302 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2303 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2304 | "dev": true, 2305 | "engines": { 2306 | "node": ">=10" 2307 | }, 2308 | "funding": { 2309 | "url": "https://github.com/sponsors/sindresorhus" 2310 | } 2311 | }, 2312 | "node_modules/typed-array-buffer": { 2313 | "version": "1.0.0", 2314 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", 2315 | "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", 2316 | "dev": true, 2317 | "dependencies": { 2318 | "call-bind": "^1.0.2", 2319 | "get-intrinsic": "^1.2.1", 2320 | "is-typed-array": "^1.1.10" 2321 | }, 2322 | "engines": { 2323 | "node": ">= 0.4" 2324 | } 2325 | }, 2326 | "node_modules/typed-array-byte-length": { 2327 | "version": "1.0.0", 2328 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", 2329 | "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", 2330 | "dev": true, 2331 | "dependencies": { 2332 | "call-bind": "^1.0.2", 2333 | "for-each": "^0.3.3", 2334 | "has-proto": "^1.0.1", 2335 | "is-typed-array": "^1.1.10" 2336 | }, 2337 | "engines": { 2338 | "node": ">= 0.4" 2339 | }, 2340 | "funding": { 2341 | "url": "https://github.com/sponsors/ljharb" 2342 | } 2343 | }, 2344 | "node_modules/typed-array-byte-offset": { 2345 | "version": "1.0.0", 2346 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", 2347 | "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", 2348 | "dev": true, 2349 | "dependencies": { 2350 | "available-typed-arrays": "^1.0.5", 2351 | "call-bind": "^1.0.2", 2352 | "for-each": "^0.3.3", 2353 | "has-proto": "^1.0.1", 2354 | "is-typed-array": "^1.1.10" 2355 | }, 2356 | "engines": { 2357 | "node": ">= 0.4" 2358 | }, 2359 | "funding": { 2360 | "url": "https://github.com/sponsors/ljharb" 2361 | } 2362 | }, 2363 | "node_modules/typed-array-length": { 2364 | "version": "1.0.4", 2365 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", 2366 | "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", 2367 | "dev": true, 2368 | "dependencies": { 2369 | "call-bind": "^1.0.2", 2370 | "for-each": "^0.3.3", 2371 | "is-typed-array": "^1.1.9" 2372 | }, 2373 | "funding": { 2374 | "url": "https://github.com/sponsors/ljharb" 2375 | } 2376 | }, 2377 | "node_modules/unbox-primitive": { 2378 | "version": "1.0.2", 2379 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 2380 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 2381 | "dev": true, 2382 | "dependencies": { 2383 | "call-bind": "^1.0.2", 2384 | "has-bigints": "^1.0.2", 2385 | "has-symbols": "^1.0.3", 2386 | "which-boxed-primitive": "^1.0.2" 2387 | }, 2388 | "funding": { 2389 | "url": "https://github.com/sponsors/ljharb" 2390 | } 2391 | }, 2392 | "node_modules/uri-js": { 2393 | "version": "4.4.1", 2394 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2395 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2396 | "dev": true, 2397 | "dependencies": { 2398 | "punycode": "^2.1.0" 2399 | } 2400 | }, 2401 | "node_modules/which": { 2402 | "version": "2.0.2", 2403 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2404 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2405 | "dev": true, 2406 | "dependencies": { 2407 | "isexe": "^2.0.0" 2408 | }, 2409 | "bin": { 2410 | "node-which": "bin/node-which" 2411 | }, 2412 | "engines": { 2413 | "node": ">= 8" 2414 | } 2415 | }, 2416 | "node_modules/which-boxed-primitive": { 2417 | "version": "1.0.2", 2418 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2419 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2420 | "dev": true, 2421 | "dependencies": { 2422 | "is-bigint": "^1.0.1", 2423 | "is-boolean-object": "^1.1.0", 2424 | "is-number-object": "^1.0.4", 2425 | "is-string": "^1.0.5", 2426 | "is-symbol": "^1.0.3" 2427 | }, 2428 | "funding": { 2429 | "url": "https://github.com/sponsors/ljharb" 2430 | } 2431 | }, 2432 | "node_modules/which-typed-array": { 2433 | "version": "1.1.13", 2434 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", 2435 | "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", 2436 | "dev": true, 2437 | "dependencies": { 2438 | "available-typed-arrays": "^1.0.5", 2439 | "call-bind": "^1.0.4", 2440 | "for-each": "^0.3.3", 2441 | "gopd": "^1.0.1", 2442 | "has-tostringtag": "^1.0.0" 2443 | }, 2444 | "engines": { 2445 | "node": ">= 0.4" 2446 | }, 2447 | "funding": { 2448 | "url": "https://github.com/sponsors/ljharb" 2449 | } 2450 | }, 2451 | "node_modules/wrappy": { 2452 | "version": "1.0.2", 2453 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2454 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2455 | "dev": true 2456 | }, 2457 | "node_modules/yocto-queue": { 2458 | "version": "0.1.0", 2459 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2460 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2461 | "dev": true, 2462 | "engines": { 2463 | "node": ">=10" 2464 | }, 2465 | "funding": { 2466 | "url": "https://github.com/sponsors/sindresorhus" 2467 | } 2468 | } 2469 | } 2470 | } 2471 | --------------------------------------------------------------------------------