├── .gitignore ├── .markdownlint.json ├── LICENSE ├── PROTOCOL.md ├── README.md ├── auth.js ├── awareness.js ├── awareness.test.js ├── package-lock.json ├── package.json ├── rollup.config.js ├── sync.js ├── test.html ├── test.js └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | *.d.ts 4 | *.d.ts.map -------------------------------------------------------------------------------- /.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": true, 3 | "no-inline-html": false 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Kevin Jahns . 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 | -------------------------------------------------------------------------------- /PROTOCOL.md: -------------------------------------------------------------------------------- 1 | 2 | # Protocol Spec 3 | 4 | y-protocol implements different binary communication protocols for efficient exchange of information. 5 | 6 | This is the recommended approach to exchange Awareness updates, and syncing Yjs documents & incremental updates. 7 | 8 | ## Base encoding approaches 9 | 10 | We use efficient variable-length encoding where possible. 11 | 12 | The protocol operates on byte arrays. We use the `•` operator to define concatenations on array buffers (i.e. `[1, 2] = [1] • [2]`). A "buffer" shall refer to any byte array. 13 | 14 | * `varUint(number)` - encodes a 53bit unsigned integer to 1-8 bytes. 15 | - unsigned integers are serialized 7 bits at a time, starting with the 16 | least significant bits. 17 | - the most significant bit (msb) in each output byte indicates if there 18 | is a continuation byte (msb = 1). 19 | - A reference implementation can be found in lib0: [encoding.writeVarUint](https://github.com/dmonad/lib0/blob/1ca4b11f355c5ccec25f20ac8d3e2382e6c4303c/encoding.js#L243) [decoding.readVarUint](https://github.com/dmonad/lib0/blob/1ca4b11f355c5ccec25f20ac8d3e2382e6c4303c/decoding.js#L235) 20 | * `varByteArray(buffer) := varUint(length(buffer)) • buffer` - allows us to read any buffer by prepending the size of the buffer 21 | * `utf8(string)` - transforms a string to a utf8-encoded byte array. 22 | * `varString(string) := varByteArray(utf8(string))` 23 | * `json(object) := varString(JSON.stringify(object))` - Write a JavaScript object as a JSON string. 24 | 25 | ### Sync protocol (v1 encoding) 26 | 27 | The Sync protocol defines a few message types that allow two peers to efficiently sync Yjs documents with each other. For more information about Yjs updates and sync messages, please look at [Yjs Docs / Document Updates](https://docs.yjs.dev/api/document-updates). 28 | 29 | We initially sync using the state-vector approach. First, each client sends a `SyncStep1` message to the other peer that contains a `state-vector` (see Yjs docs). When receiving `SyncStep1`, one should reply with `SyncStep2` which contains the missing document updates (`Y.encodeStateAsUpdate(remoteYdoc, sv)`). Once a client receives `SyncStep2`, it knows that it is now synced with the other peer. From now on all changes on the Yjs document should be send to the remote client using an `Update` message containing the update messages generated by Yjs. 30 | 31 | #### Message types 32 | 33 | * `SyncStep1MessageType := 0` 34 | * `SyncStep2MessageType := 1` 35 | * `UpdateMessageType:= 2` 36 | 37 | #### Encodings 38 | 39 | * `syncStep1(sv) := varUint(SyncStep1MessageType) • varByteArray(sv)` - Initial sync request. The state vector can be received by calling `Y.encodeStateVector(ydoc)`. 40 | * `syncStep2(documentState) := varUint(SyncStep2MessageType) • varByteArray(documentState)` - As a reply to `SyncStep1`. The document state can be received by calling `Y.encodeStateAsUpdate(ydoc, sv)`. 41 | * `documentUpdate(update) := varUint(UpdateMessageType) • varByteArray(update)` - Incremental updates the Yjs event handler `Y.on('update', update => sendUpdate(update))`. The receiving part should apply incremental updates to the Yjs document `Y.applyUpdate(ydoc, update)`. 42 | 43 | ### Awareness protocol 44 | 45 | The Awareness protocol synchronizes the pure state-based Awareness CRDT between peers. This can be useful to exchange ephemeral data like presence, cursor positions, etc.. 46 | 47 | Each peer is allocated a unique entry in the Awareness CRDT that only they can modify. Eventually, this state is going to be removed by either a timeout or by the owner setting the state to `null`. 48 | 49 | Since the Awareness CRDT is purely state-based, we always exchange the whole state of all locally known clients. Eventually, all Awareness CRDT instances will synchronize. The Awareness CRDT must remove clients from clients that haven't been updated for longer than `30` seconds. With each generated update, the `clock: uint` counter must increase. The Awareness CRDT must only apply updates if the received `clock` is newer / larger than the currently known `clock` for that client. 50 | 51 | `awarenessUpdate(clients) := varUint(clients.length) • clients.map(client => varUint(client.clientid) • varUint(client.clock) • json(client.state))` 52 | 53 | 54 | ## Combining protocols 55 | 56 | The base protocols can be mixed with your own protocols. The y-protocol package only defines the "base" protocol layers that can be reused across communication providers. 57 | 58 | * `SyncProtocolMessageType := 0` 59 | * `AwarenessProtocolMessageType := 1` 60 | 61 | A message should start with the message-type (e.g. `SyncProtocolMessageType`) and be appended with a specify protocol message (e.g. `SyncStep1MessageType`) 62 | 63 | * E.g. encoding a SyncStep1 message over the communication protocol: `varUint(SyncProtocolMessage) • syncStep1(sv)` 64 | * E.g. encoding an awareness update over the communication protocol: `varUint(AwarenessProtocolMessageType) • awarenessUpdate(clients)` 65 | 66 | A communication provider could parse protocols as follows: 67 | 68 | ```js 69 | 70 | import * as decoding from 'lib0/decoding' 71 | import * as encoding from 'lib0/encoding' 72 | import * as sync from 'y-protocols/sync' 73 | import * as awareness from 'y-protocols/awareness' 74 | 75 | const messageTypes = { 76 | [SyncProtocolMessageType]: sync.readSyncMessage, 77 | [SyncProtocolMessageType]: awareness.readAwarenessMessage, 78 | [YourCustomMessageType]: readCustomMessage 79 | } 80 | 81 | function readMessage (buffer) { 82 | const decoder = decoding.createDecoder(buffer) 83 | const messageType = decoding.readVarUint(decoder) 84 | const replyMessage = encoding.createEncoder() 85 | 86 | const messageHandler = messageTypes[messageType] 87 | if (messageHandler) { 88 | messageHandler(decoder, encoder, ydoc) 89 | if (encoding.length(encoder) > 0) { 90 | // the message handler wants to send a reply (e.g. after receiving SyncStep1 the client should respond with SyncStep2) 91 | provider.sendMessage(encoding.toUint8Array(encoder)) 92 | } 93 | } else { 94 | throw new Error('Unknown message type') 95 | } 96 | } 97 | 98 | ``` 99 | 100 | ### Handling read-only users 101 | 102 | Yjs itself doesn't distinguish between read-only and read-write users. However, you can enforce that no modifying operations are accepted by the server/peer if the client doesn't have write-access. 103 | 104 | It suffices to read the first two bytes in order to determine whether a message should be accepted from a read-only user. 105 | 106 | * `[0, 0, ..]` is a SyncStep1. It is request to receive the missing state (it contains a state-vector that the server uses to compute the missing updates) 107 | * `[0, 1, ..]` is SyncStep2, which is the reply to a SyncStep1. It contains the missing updates. You want to ignore this message as it contains document updates. 108 | * `[0, 2, ..]` is a regular document update message. 109 | * `[1, ..]` Awareness message. This information is only used to represent shared cursors and the name of each user. However, with enough malice intention you could assign other users temporarily false identities. 110 | 111 | It suffices to block messages that start with `[0, 1, ..]` or `[0, 2, ..]`. Optionally, awareness can be disabled by blocking `[1, ..]`. 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Yjs Protocols 2 | > Binary encoding protocols for *syncing*, *awareness*, and *history information* 3 | 4 | This API is unstable and subject to change. 5 | 6 | ## API 7 | 8 | ### Awareness Protocol 9 | 10 | ```js 11 | import * as awarenessProtocol from 'y-protocols/awareness.js' 12 | ``` 13 | 14 | The Awareness protocol implements a simple network agnostic algorithm that 15 | manages user status (who is online?) and propagate awareness information like 16 | cursor location, username, or email address. Each client can update its own 17 | local state and listen to state changes of remote clients. 18 | 19 | Each client has an awareness state. Remote awareness are stored in a Map that 20 | maps from remote client id to remote awareness state. An *awareness state* is an 21 | increasing clock attached to a schemaless json object. 22 | 23 | Whenever the client changes its local state, it increases the clock and 24 | propagates its own awareness state to all peers. When a client receives a remote 25 | awareness state, and overwrites the clients state if the received state is newer 26 | than the local awareness state for that client. If the state is `null`, the 27 | client is marked as offline. If a client doesn't receive updates from a remote 28 | peer for 30 seconds, it marks the remote client as offline. Hence each client 29 | must broadcast its own awareness state in a regular interval to make sure that 30 | remote clients don't mark it as offline. 31 | 32 | #### awarenessProtocol.Awareness Class 33 | 34 | ```js 35 | const ydoc = new Y.Doc() 36 | const awareness = new awarenessProtocol.Awareness(ydoc) 37 | ``` 38 | 39 |
40 | clientID:number 41 |
A unique identifier that identifies this client.
42 | getLocalState():Object<string,any>|null 43 |
Get the local awareness state.
44 | setLocalState(Object<string,any>|null) 45 |
46 | Set/Update the local awareness state. Set `null` to mark the local client as 47 | offline. 48 |
49 | setLocalStateField(string, any) 50 |
51 | Only update a single field on the local awareness object. Does not do 52 | anything if the local state is not set. 53 |
54 | getStates():Map<number,Object<string,any>> 55 |
56 | Get all client awareness states (remote and local). Maps from clientID to 57 | awareness state. 58 |
59 | 60 | on('change', ({ added: Array<number>, updated: Array<number> 61 | removed: Array<number> }, [transactionOrigin:any]) => ..) 62 | 63 |
64 | Listen to remote and local state changes on the awareness instance. 65 |
66 | 67 | on('update', ({ added: Array<number>, updated: Array<number> 68 | removed: Array<number> }, [transactionOrigin:any]) => ..) 69 | 70 |
71 | Listen to remote and local awareness changes on the awareness instance. 72 | This event is called even when the awarenes state does not change. 73 |
74 |
75 | 76 | ### License 77 | 78 | [The MIT License](./LICENSE) © Kevin Jahns 79 | -------------------------------------------------------------------------------- /auth.js: -------------------------------------------------------------------------------- 1 | 2 | import * as Y from 'yjs' // eslint-disable-line 3 | import * as encoding from 'lib0/encoding' 4 | import * as decoding from 'lib0/decoding' 5 | 6 | export const messagePermissionDenied = 0 7 | 8 | /** 9 | * @param {encoding.Encoder} encoder 10 | * @param {string} reason 11 | */ 12 | export const writePermissionDenied = (encoder, reason) => { 13 | encoding.writeVarUint(encoder, messagePermissionDenied) 14 | encoding.writeVarString(encoder, reason) 15 | } 16 | 17 | /** 18 | * @callback PermissionDeniedHandler 19 | * @param {any} y 20 | * @param {string} reason 21 | */ 22 | 23 | /** 24 | * 25 | * @param {decoding.Decoder} decoder 26 | * @param {Y.Doc} y 27 | * @param {PermissionDeniedHandler} permissionDeniedHandler 28 | */ 29 | export const readAuthMessage = (decoder, y, permissionDeniedHandler) => { 30 | switch (decoding.readVarUint(decoder)) { 31 | case messagePermissionDenied: permissionDeniedHandler(y, decoding.readVarString(decoder)) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /awareness.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module awareness-protocol 3 | */ 4 | 5 | import * as encoding from 'lib0/encoding' 6 | import * as decoding from 'lib0/decoding' 7 | import * as time from 'lib0/time' 8 | import * as math from 'lib0/math' 9 | import { Observable } from 'lib0/observable' 10 | import * as f from 'lib0/function' 11 | import * as Y from 'yjs' // eslint-disable-line 12 | 13 | export const outdatedTimeout = 30000 14 | 15 | /** 16 | * @typedef {Object} MetaClientState 17 | * @property {number} MetaClientState.clock 18 | * @property {number} MetaClientState.lastUpdated unix timestamp 19 | */ 20 | 21 | /** 22 | * The Awareness class implements a simple shared state protocol that can be used for non-persistent data like awareness information 23 | * (cursor, username, status, ..). Each client can update its own local state and listen to state changes of 24 | * remote clients. Every client may set a state of a remote peer to `null` to mark the client as offline. 25 | * 26 | * Each client is identified by a unique client id (something we borrow from `doc.clientID`). A client can override 27 | * its own state by propagating a message with an increasing timestamp (`clock`). If such a message is received, it is 28 | * applied if the known state of that client is older than the new state (`clock < newClock`). If a client thinks that 29 | * a remote client is offline, it may propagate a message with 30 | * `{ clock: currentClientClock, state: null, client: remoteClient }`. If such a 31 | * message is received, and the known clock of that client equals the received clock, it will override the state with `null`. 32 | * 33 | * Before a client disconnects, it should propagate a `null` state with an updated clock. 34 | * 35 | * Awareness states must be updated every 30 seconds. Otherwise the Awareness instance will delete the client state. 36 | * 37 | * @extends {Observable} 38 | */ 39 | export class Awareness extends Observable { 40 | /** 41 | * @param {Y.Doc} doc 42 | */ 43 | constructor (doc) { 44 | super() 45 | this.doc = doc 46 | /** 47 | * @type {number} 48 | */ 49 | this.clientID = doc.clientID 50 | /** 51 | * Maps from client id to client state 52 | * @type {Map>} 53 | */ 54 | this.states = new Map() 55 | /** 56 | * @type {Map} 57 | */ 58 | this.meta = new Map() 59 | this._checkInterval = /** @type {any} */ (setInterval(() => { 60 | const now = time.getUnixTime() 61 | if (this.getLocalState() !== null && (outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ (this.meta.get(this.clientID)).lastUpdated)) { 62 | // renew local clock 63 | this.setLocalState(this.getLocalState()) 64 | } 65 | /** 66 | * @type {Array} 67 | */ 68 | const remove = [] 69 | this.meta.forEach((meta, clientid) => { 70 | if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) { 71 | remove.push(clientid) 72 | } 73 | }) 74 | if (remove.length > 0) { 75 | removeAwarenessStates(this, remove, 'timeout') 76 | } 77 | }, math.floor(outdatedTimeout / 10))) 78 | doc.on('destroy', () => { 79 | this.destroy() 80 | }) 81 | this.setLocalState({}) 82 | } 83 | 84 | destroy () { 85 | this.emit('destroy', [this]) 86 | this.setLocalState(null) 87 | super.destroy() 88 | clearInterval(this._checkInterval) 89 | } 90 | 91 | /** 92 | * @return {Object|null} 93 | */ 94 | getLocalState () { 95 | return this.states.get(this.clientID) || null 96 | } 97 | 98 | /** 99 | * @param {Object|null} state 100 | */ 101 | setLocalState (state) { 102 | const clientID = this.clientID 103 | const currLocalMeta = this.meta.get(clientID) 104 | const clock = currLocalMeta === undefined ? 0 : currLocalMeta.clock + 1 105 | const prevState = this.states.get(clientID) 106 | if (state === null) { 107 | this.states.delete(clientID) 108 | } else { 109 | this.states.set(clientID, state) 110 | } 111 | this.meta.set(clientID, { 112 | clock, 113 | lastUpdated: time.getUnixTime() 114 | }) 115 | const added = [] 116 | const updated = [] 117 | const filteredUpdated = [] 118 | const removed = [] 119 | if (state === null) { 120 | removed.push(clientID) 121 | } else if (prevState == null) { 122 | if (state != null) { 123 | added.push(clientID) 124 | } 125 | } else { 126 | updated.push(clientID) 127 | if (!f.equalityDeep(prevState, state)) { 128 | filteredUpdated.push(clientID) 129 | } 130 | } 131 | if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) { 132 | this.emit('change', [{ added, updated: filteredUpdated, removed }, 'local']) 133 | } 134 | this.emit('update', [{ added, updated, removed }, 'local']) 135 | } 136 | 137 | /** 138 | * @param {string} field 139 | * @param {any} value 140 | */ 141 | setLocalStateField (field, value) { 142 | const state = this.getLocalState() 143 | if (state !== null) { 144 | this.setLocalState({ 145 | ...state, 146 | [field]: value 147 | }) 148 | } 149 | } 150 | 151 | /** 152 | * @return {Map>} 153 | */ 154 | getStates () { 155 | return this.states 156 | } 157 | } 158 | 159 | /** 160 | * Mark (remote) clients as inactive and remove them from the list of active peers. 161 | * This change will be propagated to remote clients. 162 | * 163 | * @param {Awareness} awareness 164 | * @param {Array} clients 165 | * @param {any} origin 166 | */ 167 | export const removeAwarenessStates = (awareness, clients, origin) => { 168 | const removed = [] 169 | for (let i = 0; i < clients.length; i++) { 170 | const clientID = clients[i] 171 | if (awareness.states.has(clientID)) { 172 | awareness.states.delete(clientID) 173 | if (clientID === awareness.clientID) { 174 | const curMeta = /** @type {MetaClientState} */ (awareness.meta.get(clientID)) 175 | awareness.meta.set(clientID, { 176 | clock: curMeta.clock + 1, 177 | lastUpdated: time.getUnixTime() 178 | }) 179 | } 180 | removed.push(clientID) 181 | } 182 | } 183 | if (removed.length > 0) { 184 | awareness.emit('change', [{ added: [], updated: [], removed }, origin]) 185 | awareness.emit('update', [{ added: [], updated: [], removed }, origin]) 186 | } 187 | } 188 | 189 | /** 190 | * @param {Awareness} awareness 191 | * @param {Array} clients 192 | * @return {Uint8Array} 193 | */ 194 | export const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => { 195 | const len = clients.length 196 | const encoder = encoding.createEncoder() 197 | encoding.writeVarUint(encoder, len) 198 | for (let i = 0; i < len; i++) { 199 | const clientID = clients[i] 200 | const state = states.get(clientID) || null 201 | const clock = /** @type {MetaClientState} */ (awareness.meta.get(clientID)).clock 202 | encoding.writeVarUint(encoder, clientID) 203 | encoding.writeVarUint(encoder, clock) 204 | encoding.writeVarString(encoder, JSON.stringify(state)) 205 | } 206 | return encoding.toUint8Array(encoder) 207 | } 208 | 209 | /** 210 | * Modify the content of an awareness update before re-encoding it to an awareness update. 211 | * 212 | * This might be useful when you have a central server that wants to ensure that clients 213 | * cant hijack somebody elses identity. 214 | * 215 | * @param {Uint8Array} update 216 | * @param {function(any):any} modify 217 | * @return {Uint8Array} 218 | */ 219 | export const modifyAwarenessUpdate = (update, modify) => { 220 | const decoder = decoding.createDecoder(update) 221 | const encoder = encoding.createEncoder() 222 | const len = decoding.readVarUint(decoder) 223 | encoding.writeVarUint(encoder, len) 224 | for (let i = 0; i < len; i++) { 225 | const clientID = decoding.readVarUint(decoder) 226 | const clock = decoding.readVarUint(decoder) 227 | const state = JSON.parse(decoding.readVarString(decoder)) 228 | const modifiedState = modify(state) 229 | encoding.writeVarUint(encoder, clientID) 230 | encoding.writeVarUint(encoder, clock) 231 | encoding.writeVarString(encoder, JSON.stringify(modifiedState)) 232 | } 233 | return encoding.toUint8Array(encoder) 234 | } 235 | 236 | /** 237 | * @param {Awareness} awareness 238 | * @param {Uint8Array} update 239 | * @param {any} origin This will be added to the emitted change event 240 | */ 241 | export const applyAwarenessUpdate = (awareness, update, origin) => { 242 | const decoder = decoding.createDecoder(update) 243 | const timestamp = time.getUnixTime() 244 | const added = [] 245 | const updated = [] 246 | const filteredUpdated = [] 247 | const removed = [] 248 | const len = decoding.readVarUint(decoder) 249 | for (let i = 0; i < len; i++) { 250 | const clientID = decoding.readVarUint(decoder) 251 | let clock = decoding.readVarUint(decoder) 252 | const state = JSON.parse(decoding.readVarString(decoder)) 253 | const clientMeta = awareness.meta.get(clientID) 254 | const prevState = awareness.states.get(clientID) 255 | const currClock = clientMeta === undefined ? 0 : clientMeta.clock 256 | if (currClock < clock || (currClock === clock && state === null && awareness.states.has(clientID))) { 257 | if (state === null) { 258 | // never let a remote client remove this local state 259 | if (clientID === awareness.clientID && awareness.getLocalState() != null) { 260 | // remote client removed the local state. Do not remote state. Broadcast a message indicating 261 | // that this client still exists by increasing the clock 262 | clock++ 263 | } else { 264 | awareness.states.delete(clientID) 265 | } 266 | } else { 267 | awareness.states.set(clientID, state) 268 | } 269 | awareness.meta.set(clientID, { 270 | clock, 271 | lastUpdated: timestamp 272 | }) 273 | if (clientMeta === undefined && state !== null) { 274 | added.push(clientID) 275 | } else if (clientMeta !== undefined && state === null) { 276 | removed.push(clientID) 277 | } else if (state !== null) { 278 | if (!f.equalityDeep(state, prevState)) { 279 | filteredUpdated.push(clientID) 280 | } 281 | updated.push(clientID) 282 | } 283 | } 284 | } 285 | if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) { 286 | awareness.emit('change', [{ 287 | added, updated: filteredUpdated, removed 288 | }, origin]) 289 | } 290 | if (added.length > 0 || updated.length > 0 || removed.length > 0) { 291 | awareness.emit('update', [{ 292 | added, updated, removed 293 | }, origin]) 294 | } 295 | } 296 | -------------------------------------------------------------------------------- /awareness.test.js: -------------------------------------------------------------------------------- 1 | 2 | import * as Y from 'yjs' 3 | import * as t from 'lib0/testing' 4 | import * as awareness from './awareness' 5 | 6 | /** 7 | * @param {t.TestCase} tc 8 | */ 9 | export const testAwareness = tc => { 10 | const doc1 = new Y.Doc() 11 | doc1.clientID = 0 12 | const doc2 = new Y.Doc() 13 | doc2.clientID = 1 14 | const aw1 = new awareness.Awareness(doc1) 15 | const aw2 = new awareness.Awareness(doc2) 16 | aw1.on('update', /** @param {any} p */ ({ added, updated, removed }) => { 17 | const enc = awareness.encodeAwarenessUpdate(aw1, added.concat(updated).concat(removed)) 18 | awareness.applyAwarenessUpdate(aw2, enc, 'custom') 19 | }) 20 | let lastChangeLocal = /** @type {any} */ (null) 21 | aw1.on('change', /** @param {any} change */ change => { 22 | lastChangeLocal = change 23 | }) 24 | let lastChange = /** @type {any} */ (null) 25 | aw2.on('change', /** @param {any} change */ change => { 26 | lastChange = change 27 | }) 28 | aw1.setLocalState({ x: 3 }) 29 | t.compare(aw2.getStates().get(0), { x: 3 }) 30 | t.assert(/** @type {any} */ (aw2.meta.get(0)).clock === 1) 31 | t.compare(lastChange.added, [0]) 32 | // When creating an Awareness instance, the the local client is already marked as available, so it is not updated. 33 | t.compare(lastChangeLocal, { added: [], updated: [0], removed: [] }) 34 | 35 | // update state 36 | lastChange = null 37 | lastChangeLocal = null 38 | aw1.setLocalState({ x: 4 }) 39 | t.compare(aw2.getStates().get(0), { x: 4 }) 40 | t.compare(lastChangeLocal, { added: [], updated: [0], removed: [] }) 41 | t.compare(lastChangeLocal, lastChange) 42 | 43 | lastChange = null 44 | lastChangeLocal = null 45 | aw1.setLocalState({ x: 4 }) 46 | t.assert(lastChange === null) 47 | t.assert(/** @type {any} */ (aw2.meta.get(0)).clock === 3) 48 | t.compare(lastChangeLocal, lastChange) 49 | aw1.setLocalState(null) 50 | t.assert(lastChange.removed.length === 1) 51 | t.compare(aw1.getStates().get(0), undefined) 52 | t.compare(lastChangeLocal, lastChange) 53 | } 54 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@y/protocols", 3 | "version": "1.0.6-1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@y/protocols", 9 | "version": "1.0.6-1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "lib0": "^0.2.85" 13 | }, 14 | "devDependencies": { 15 | "@rollup/plugin-commonjs": "^25.0.4", 16 | "@rollup/plugin-node-resolve": "^15.2.1", 17 | "@types/node": "^20.6.2", 18 | "concurrently": "^5.3.0", 19 | "rollup": "^3.29.2", 20 | "standard": "^12.0.1", 21 | "typescript": "^5.8.3", 22 | "yjs": "^13.6.26" 23 | }, 24 | "engines": { 25 | "node": ">=16.0.0", 26 | "npm": ">=8.0.0" 27 | }, 28 | "funding": { 29 | "type": "GitHub Sponsors ❤", 30 | "url": "https://github.com/sponsors/dmonad" 31 | }, 32 | "peerDependencies": { 33 | "yjs": "^14.0.0-1 || ^14 || ^13" 34 | } 35 | }, 36 | "node_modules/@babel/runtime": { 37 | "version": "7.27.1", 38 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", 39 | "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", 40 | "dev": true, 41 | "license": "MIT", 42 | "engines": { 43 | "node": ">=6.9.0" 44 | } 45 | }, 46 | "node_modules/@jridgewell/sourcemap-codec": { 47 | "version": "1.4.15", 48 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 49 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 50 | "dev": true 51 | }, 52 | "node_modules/@rollup/plugin-commonjs": { 53 | "version": "25.0.4", 54 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.4.tgz", 55 | "integrity": "sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==", 56 | "dev": true, 57 | "dependencies": { 58 | "@rollup/pluginutils": "^5.0.1", 59 | "commondir": "^1.0.1", 60 | "estree-walker": "^2.0.2", 61 | "glob": "^8.0.3", 62 | "is-reference": "1.2.1", 63 | "magic-string": "^0.27.0" 64 | }, 65 | "engines": { 66 | "node": ">=14.0.0" 67 | }, 68 | "peerDependencies": { 69 | "rollup": "^2.68.0||^3.0.0" 70 | }, 71 | "peerDependenciesMeta": { 72 | "rollup": { 73 | "optional": true 74 | } 75 | } 76 | }, 77 | "node_modules/@rollup/plugin-node-resolve": { 78 | "version": "15.2.1", 79 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.1.tgz", 80 | "integrity": "sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==", 81 | "dev": true, 82 | "dependencies": { 83 | "@rollup/pluginutils": "^5.0.1", 84 | "@types/resolve": "1.20.2", 85 | "deepmerge": "^4.2.2", 86 | "is-builtin-module": "^3.2.1", 87 | "is-module": "^1.0.0", 88 | "resolve": "^1.22.1" 89 | }, 90 | "engines": { 91 | "node": ">=14.0.0" 92 | }, 93 | "peerDependencies": { 94 | "rollup": "^2.78.0||^3.0.0" 95 | }, 96 | "peerDependenciesMeta": { 97 | "rollup": { 98 | "optional": true 99 | } 100 | } 101 | }, 102 | "node_modules/@rollup/pluginutils": { 103 | "version": "5.0.4", 104 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz", 105 | "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==", 106 | "dev": true, 107 | "dependencies": { 108 | "@types/estree": "^1.0.0", 109 | "estree-walker": "^2.0.2", 110 | "picomatch": "^2.3.1" 111 | }, 112 | "engines": { 113 | "node": ">=14.0.0" 114 | }, 115 | "peerDependencies": { 116 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 117 | }, 118 | "peerDependenciesMeta": { 119 | "rollup": { 120 | "optional": true 121 | } 122 | } 123 | }, 124 | "node_modules/@types/estree": { 125 | "version": "1.0.1", 126 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", 127 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", 128 | "dev": true 129 | }, 130 | "node_modules/@types/node": { 131 | "version": "20.6.2", 132 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", 133 | "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==", 134 | "dev": true 135 | }, 136 | "node_modules/@types/resolve": { 137 | "version": "1.20.2", 138 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 139 | "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", 140 | "dev": true 141 | }, 142 | "node_modules/acorn": { 143 | "version": "6.4.2", 144 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 145 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 146 | "dev": true, 147 | "bin": { 148 | "acorn": "bin/acorn" 149 | }, 150 | "engines": { 151 | "node": ">=0.4.0" 152 | } 153 | }, 154 | "node_modules/acorn-jsx": { 155 | "version": "5.3.2", 156 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 157 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 158 | "dev": true, 159 | "peerDependencies": { 160 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 161 | } 162 | }, 163 | "node_modules/ajv": { 164 | "version": "6.12.6", 165 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 166 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 167 | "dev": true, 168 | "dependencies": { 169 | "fast-deep-equal": "^3.1.1", 170 | "fast-json-stable-stringify": "^2.0.0", 171 | "json-schema-traverse": "^0.4.1", 172 | "uri-js": "^4.2.2" 173 | }, 174 | "funding": { 175 | "type": "github", 176 | "url": "https://github.com/sponsors/epoberezkin" 177 | } 178 | }, 179 | "node_modules/ajv-keywords": { 180 | "version": "3.5.2", 181 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 182 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 183 | "dev": true, 184 | "peerDependencies": { 185 | "ajv": "^6.9.1" 186 | } 187 | }, 188 | "node_modules/ansi-escapes": { 189 | "version": "3.2.0", 190 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 191 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 192 | "dev": true, 193 | "engines": { 194 | "node": ">=4" 195 | } 196 | }, 197 | "node_modules/ansi-regex": { 198 | "version": "3.0.1", 199 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", 200 | "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", 201 | "dev": true, 202 | "engines": { 203 | "node": ">=4" 204 | } 205 | }, 206 | "node_modules/ansi-styles": { 207 | "version": "3.2.1", 208 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 209 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 210 | "dev": true, 211 | "dependencies": { 212 | "color-convert": "^1.9.0" 213 | }, 214 | "engines": { 215 | "node": ">=4" 216 | } 217 | }, 218 | "node_modules/argparse": { 219 | "version": "1.0.10", 220 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 221 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 222 | "dev": true, 223 | "dependencies": { 224 | "sprintf-js": "~1.0.2" 225 | } 226 | }, 227 | "node_modules/array-buffer-byte-length": { 228 | "version": "1.0.0", 229 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", 230 | "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", 231 | "dev": true, 232 | "dependencies": { 233 | "call-bind": "^1.0.2", 234 | "is-array-buffer": "^3.0.1" 235 | }, 236 | "funding": { 237 | "url": "https://github.com/sponsors/ljharb" 238 | } 239 | }, 240 | "node_modules/array-includes": { 241 | "version": "3.1.7", 242 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", 243 | "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", 244 | "dev": true, 245 | "dependencies": { 246 | "call-bind": "^1.0.2", 247 | "define-properties": "^1.2.0", 248 | "es-abstract": "^1.22.1", 249 | "get-intrinsic": "^1.2.1", 250 | "is-string": "^1.0.7" 251 | }, 252 | "engines": { 253 | "node": ">= 0.4" 254 | }, 255 | "funding": { 256 | "url": "https://github.com/sponsors/ljharb" 257 | } 258 | }, 259 | "node_modules/arraybuffer.prototype.slice": { 260 | "version": "1.0.2", 261 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", 262 | "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", 263 | "dev": true, 264 | "dependencies": { 265 | "array-buffer-byte-length": "^1.0.0", 266 | "call-bind": "^1.0.2", 267 | "define-properties": "^1.2.0", 268 | "es-abstract": "^1.22.1", 269 | "get-intrinsic": "^1.2.1", 270 | "is-array-buffer": "^3.0.2", 271 | "is-shared-array-buffer": "^1.0.2" 272 | }, 273 | "engines": { 274 | "node": ">= 0.4" 275 | }, 276 | "funding": { 277 | "url": "https://github.com/sponsors/ljharb" 278 | } 279 | }, 280 | "node_modules/available-typed-arrays": { 281 | "version": "1.0.5", 282 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 283 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 284 | "dev": true, 285 | "engines": { 286 | "node": ">= 0.4" 287 | }, 288 | "funding": { 289 | "url": "https://github.com/sponsors/ljharb" 290 | } 291 | }, 292 | "node_modules/babel-code-frame": { 293 | "version": "6.26.0", 294 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 295 | "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", 296 | "dev": true, 297 | "dependencies": { 298 | "chalk": "^1.1.3", 299 | "esutils": "^2.0.2", 300 | "js-tokens": "^3.0.2" 301 | } 302 | }, 303 | "node_modules/babel-code-frame/node_modules/ansi-regex": { 304 | "version": "2.1.1", 305 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 306 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 307 | "dev": true, 308 | "engines": { 309 | "node": ">=0.10.0" 310 | } 311 | }, 312 | "node_modules/babel-code-frame/node_modules/ansi-styles": { 313 | "version": "2.2.1", 314 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 315 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 316 | "dev": true, 317 | "engines": { 318 | "node": ">=0.10.0" 319 | } 320 | }, 321 | "node_modules/babel-code-frame/node_modules/chalk": { 322 | "version": "1.1.3", 323 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 324 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 325 | "dev": true, 326 | "dependencies": { 327 | "ansi-styles": "^2.2.1", 328 | "escape-string-regexp": "^1.0.2", 329 | "has-ansi": "^2.0.0", 330 | "strip-ansi": "^3.0.0", 331 | "supports-color": "^2.0.0" 332 | }, 333 | "engines": { 334 | "node": ">=0.10.0" 335 | } 336 | }, 337 | "node_modules/babel-code-frame/node_modules/strip-ansi": { 338 | "version": "3.0.1", 339 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 340 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 341 | "dev": true, 342 | "dependencies": { 343 | "ansi-regex": "^2.0.0" 344 | }, 345 | "engines": { 346 | "node": ">=0.10.0" 347 | } 348 | }, 349 | "node_modules/babel-code-frame/node_modules/supports-color": { 350 | "version": "2.0.0", 351 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 352 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 353 | "dev": true, 354 | "engines": { 355 | "node": ">=0.8.0" 356 | } 357 | }, 358 | "node_modules/balanced-match": { 359 | "version": "1.0.2", 360 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 361 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 362 | "dev": true 363 | }, 364 | "node_modules/brace-expansion": { 365 | "version": "2.0.1", 366 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 367 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 368 | "dev": true, 369 | "dependencies": { 370 | "balanced-match": "^1.0.0" 371 | } 372 | }, 373 | "node_modules/builtin-modules": { 374 | "version": "3.3.0", 375 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 376 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 377 | "dev": true, 378 | "engines": { 379 | "node": ">=6" 380 | }, 381 | "funding": { 382 | "url": "https://github.com/sponsors/sindresorhus" 383 | } 384 | }, 385 | "node_modules/call-bind": { 386 | "version": "1.0.2", 387 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 388 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 389 | "dev": true, 390 | "dependencies": { 391 | "function-bind": "^1.1.1", 392 | "get-intrinsic": "^1.0.2" 393 | }, 394 | "funding": { 395 | "url": "https://github.com/sponsors/ljharb" 396 | } 397 | }, 398 | "node_modules/caller-path": { 399 | "version": "0.1.0", 400 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 401 | "integrity": "sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==", 402 | "dev": true, 403 | "dependencies": { 404 | "callsites": "^0.2.0" 405 | }, 406 | "engines": { 407 | "node": ">=0.10.0" 408 | } 409 | }, 410 | "node_modules/callsites": { 411 | "version": "0.2.0", 412 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 413 | "integrity": "sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==", 414 | "dev": true, 415 | "engines": { 416 | "node": ">=0.10.0" 417 | } 418 | }, 419 | "node_modules/camelcase": { 420 | "version": "5.3.1", 421 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 422 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 423 | "dev": true, 424 | "engines": { 425 | "node": ">=6" 426 | } 427 | }, 428 | "node_modules/chalk": { 429 | "version": "2.4.2", 430 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 431 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 432 | "dev": true, 433 | "dependencies": { 434 | "ansi-styles": "^3.2.1", 435 | "escape-string-regexp": "^1.0.5", 436 | "supports-color": "^5.3.0" 437 | }, 438 | "engines": { 439 | "node": ">=4" 440 | } 441 | }, 442 | "node_modules/chalk/node_modules/supports-color": { 443 | "version": "5.5.0", 444 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 445 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 446 | "dev": true, 447 | "dependencies": { 448 | "has-flag": "^3.0.0" 449 | }, 450 | "engines": { 451 | "node": ">=4" 452 | } 453 | }, 454 | "node_modules/chardet": { 455 | "version": "0.4.2", 456 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 457 | "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", 458 | "dev": true 459 | }, 460 | "node_modules/circular-json": { 461 | "version": "0.3.3", 462 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 463 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 464 | "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", 465 | "dev": true 466 | }, 467 | "node_modules/cli-cursor": { 468 | "version": "2.1.0", 469 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 470 | "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", 471 | "dev": true, 472 | "dependencies": { 473 | "restore-cursor": "^2.0.0" 474 | }, 475 | "engines": { 476 | "node": ">=4" 477 | } 478 | }, 479 | "node_modules/cli-width": { 480 | "version": "2.2.1", 481 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 482 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 483 | "dev": true 484 | }, 485 | "node_modules/cliui": { 486 | "version": "5.0.0", 487 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 488 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 489 | "dev": true, 490 | "dependencies": { 491 | "string-width": "^3.1.0", 492 | "strip-ansi": "^5.2.0", 493 | "wrap-ansi": "^5.1.0" 494 | } 495 | }, 496 | "node_modules/cliui/node_modules/ansi-regex": { 497 | "version": "4.1.1", 498 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 499 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 500 | "dev": true, 501 | "engines": { 502 | "node": ">=6" 503 | } 504 | }, 505 | "node_modules/cliui/node_modules/string-width": { 506 | "version": "3.1.0", 507 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 508 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 509 | "dev": true, 510 | "dependencies": { 511 | "emoji-regex": "^7.0.1", 512 | "is-fullwidth-code-point": "^2.0.0", 513 | "strip-ansi": "^5.1.0" 514 | }, 515 | "engines": { 516 | "node": ">=6" 517 | } 518 | }, 519 | "node_modules/cliui/node_modules/strip-ansi": { 520 | "version": "5.2.0", 521 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 522 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 523 | "dev": true, 524 | "dependencies": { 525 | "ansi-regex": "^4.1.0" 526 | }, 527 | "engines": { 528 | "node": ">=6" 529 | } 530 | }, 531 | "node_modules/color-convert": { 532 | "version": "1.9.3", 533 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 534 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 535 | "dev": true, 536 | "dependencies": { 537 | "color-name": "1.1.3" 538 | } 539 | }, 540 | "node_modules/color-name": { 541 | "version": "1.1.3", 542 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 543 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 544 | "dev": true 545 | }, 546 | "node_modules/commondir": { 547 | "version": "1.0.1", 548 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 549 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 550 | "dev": true 551 | }, 552 | "node_modules/concat-map": { 553 | "version": "0.0.1", 554 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 555 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 556 | "dev": true 557 | }, 558 | "node_modules/concurrently": { 559 | "version": "5.3.0", 560 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz", 561 | "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", 562 | "dev": true, 563 | "dependencies": { 564 | "chalk": "^2.4.2", 565 | "date-fns": "^2.0.1", 566 | "lodash": "^4.17.15", 567 | "read-pkg": "^4.0.1", 568 | "rxjs": "^6.5.2", 569 | "spawn-command": "^0.0.2-1", 570 | "supports-color": "^6.1.0", 571 | "tree-kill": "^1.2.2", 572 | "yargs": "^13.3.0" 573 | }, 574 | "bin": { 575 | "concurrently": "bin/concurrently.js" 576 | }, 577 | "engines": { 578 | "node": ">=6.0.0" 579 | } 580 | }, 581 | "node_modules/contains-path": { 582 | "version": "0.1.0", 583 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 584 | "integrity": "sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==", 585 | "dev": true, 586 | "engines": { 587 | "node": ">=0.10.0" 588 | } 589 | }, 590 | "node_modules/cross-spawn": { 591 | "version": "6.0.6", 592 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", 593 | "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", 594 | "dev": true, 595 | "license": "MIT", 596 | "dependencies": { 597 | "nice-try": "^1.0.4", 598 | "path-key": "^2.0.1", 599 | "semver": "^5.5.0", 600 | "shebang-command": "^1.2.0", 601 | "which": "^1.2.9" 602 | }, 603 | "engines": { 604 | "node": ">=4.8" 605 | } 606 | }, 607 | "node_modules/date-fns": { 608 | "version": "2.30.0", 609 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", 610 | "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", 611 | "dev": true, 612 | "dependencies": { 613 | "@babel/runtime": "^7.21.0" 614 | }, 615 | "engines": { 616 | "node": ">=0.11" 617 | }, 618 | "funding": { 619 | "type": "opencollective", 620 | "url": "https://opencollective.com/date-fns" 621 | } 622 | }, 623 | "node_modules/debug": { 624 | "version": "3.2.7", 625 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 626 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 627 | "dev": true, 628 | "dependencies": { 629 | "ms": "^2.1.1" 630 | } 631 | }, 632 | "node_modules/debug-log": { 633 | "version": "1.0.1", 634 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 635 | "integrity": "sha512-gV/pe1YIaKNgLYnd1g9VNW80tcb7oV5qvNUxG7NM8rbDpnl6RGunzlAtlGSb0wEs3nesu2vHNiX9TSsZ+Y+RjA==", 636 | "dev": true, 637 | "engines": { 638 | "node": ">=0.10.0" 639 | } 640 | }, 641 | "node_modules/decamelize": { 642 | "version": "1.2.0", 643 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 644 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 645 | "dev": true, 646 | "engines": { 647 | "node": ">=0.10.0" 648 | } 649 | }, 650 | "node_modules/deep-is": { 651 | "version": "0.1.4", 652 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 653 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 654 | "dev": true 655 | }, 656 | "node_modules/deepmerge": { 657 | "version": "4.3.1", 658 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 659 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 660 | "dev": true, 661 | "engines": { 662 | "node": ">=0.10.0" 663 | } 664 | }, 665 | "node_modules/define-data-property": { 666 | "version": "1.1.0", 667 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", 668 | "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", 669 | "dev": true, 670 | "dependencies": { 671 | "get-intrinsic": "^1.2.1", 672 | "gopd": "^1.0.1", 673 | "has-property-descriptors": "^1.0.0" 674 | }, 675 | "engines": { 676 | "node": ">= 0.4" 677 | } 678 | }, 679 | "node_modules/define-properties": { 680 | "version": "1.2.1", 681 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 682 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 683 | "dev": true, 684 | "dependencies": { 685 | "define-data-property": "^1.0.1", 686 | "has-property-descriptors": "^1.0.0", 687 | "object-keys": "^1.1.1" 688 | }, 689 | "engines": { 690 | "node": ">= 0.4" 691 | }, 692 | "funding": { 693 | "url": "https://github.com/sponsors/ljharb" 694 | } 695 | }, 696 | "node_modules/deglob": { 697 | "version": "2.1.1", 698 | "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", 699 | "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", 700 | "dev": true, 701 | "dependencies": { 702 | "find-root": "^1.0.0", 703 | "glob": "^7.0.5", 704 | "ignore": "^3.0.9", 705 | "pkg-config": "^1.1.0", 706 | "run-parallel": "^1.1.2", 707 | "uniq": "^1.0.1" 708 | } 709 | }, 710 | "node_modules/deglob/node_modules/brace-expansion": { 711 | "version": "1.1.11", 712 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 713 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 714 | "dev": true, 715 | "dependencies": { 716 | "balanced-match": "^1.0.0", 717 | "concat-map": "0.0.1" 718 | } 719 | }, 720 | "node_modules/deglob/node_modules/glob": { 721 | "version": "7.2.3", 722 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 723 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 724 | "dev": true, 725 | "dependencies": { 726 | "fs.realpath": "^1.0.0", 727 | "inflight": "^1.0.4", 728 | "inherits": "2", 729 | "minimatch": "^3.1.1", 730 | "once": "^1.3.0", 731 | "path-is-absolute": "^1.0.0" 732 | }, 733 | "engines": { 734 | "node": "*" 735 | }, 736 | "funding": { 737 | "url": "https://github.com/sponsors/isaacs" 738 | } 739 | }, 740 | "node_modules/deglob/node_modules/ignore": { 741 | "version": "3.3.10", 742 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 743 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", 744 | "dev": true 745 | }, 746 | "node_modules/deglob/node_modules/minimatch": { 747 | "version": "3.1.2", 748 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 749 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 750 | "dev": true, 751 | "dependencies": { 752 | "brace-expansion": "^1.1.7" 753 | }, 754 | "engines": { 755 | "node": "*" 756 | } 757 | }, 758 | "node_modules/doctrine": { 759 | "version": "2.1.0", 760 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 761 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 762 | "dev": true, 763 | "dependencies": { 764 | "esutils": "^2.0.2" 765 | }, 766 | "engines": { 767 | "node": ">=0.10.0" 768 | } 769 | }, 770 | "node_modules/emoji-regex": { 771 | "version": "7.0.3", 772 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 773 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 774 | "dev": true 775 | }, 776 | "node_modules/error-ex": { 777 | "version": "1.3.2", 778 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 779 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 780 | "dev": true, 781 | "dependencies": { 782 | "is-arrayish": "^0.2.1" 783 | } 784 | }, 785 | "node_modules/es-abstract": { 786 | "version": "1.22.2", 787 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", 788 | "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", 789 | "dev": true, 790 | "dependencies": { 791 | "array-buffer-byte-length": "^1.0.0", 792 | "arraybuffer.prototype.slice": "^1.0.2", 793 | "available-typed-arrays": "^1.0.5", 794 | "call-bind": "^1.0.2", 795 | "es-set-tostringtag": "^2.0.1", 796 | "es-to-primitive": "^1.2.1", 797 | "function.prototype.name": "^1.1.6", 798 | "get-intrinsic": "^1.2.1", 799 | "get-symbol-description": "^1.0.0", 800 | "globalthis": "^1.0.3", 801 | "gopd": "^1.0.1", 802 | "has": "^1.0.3", 803 | "has-property-descriptors": "^1.0.0", 804 | "has-proto": "^1.0.1", 805 | "has-symbols": "^1.0.3", 806 | "internal-slot": "^1.0.5", 807 | "is-array-buffer": "^3.0.2", 808 | "is-callable": "^1.2.7", 809 | "is-negative-zero": "^2.0.2", 810 | "is-regex": "^1.1.4", 811 | "is-shared-array-buffer": "^1.0.2", 812 | "is-string": "^1.0.7", 813 | "is-typed-array": "^1.1.12", 814 | "is-weakref": "^1.0.2", 815 | "object-inspect": "^1.12.3", 816 | "object-keys": "^1.1.1", 817 | "object.assign": "^4.1.4", 818 | "regexp.prototype.flags": "^1.5.1", 819 | "safe-array-concat": "^1.0.1", 820 | "safe-regex-test": "^1.0.0", 821 | "string.prototype.trim": "^1.2.8", 822 | "string.prototype.trimend": "^1.0.7", 823 | "string.prototype.trimstart": "^1.0.7", 824 | "typed-array-buffer": "^1.0.0", 825 | "typed-array-byte-length": "^1.0.0", 826 | "typed-array-byte-offset": "^1.0.0", 827 | "typed-array-length": "^1.0.4", 828 | "unbox-primitive": "^1.0.2", 829 | "which-typed-array": "^1.1.11" 830 | }, 831 | "engines": { 832 | "node": ">= 0.4" 833 | }, 834 | "funding": { 835 | "url": "https://github.com/sponsors/ljharb" 836 | } 837 | }, 838 | "node_modules/es-set-tostringtag": { 839 | "version": "2.0.1", 840 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", 841 | "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", 842 | "dev": true, 843 | "dependencies": { 844 | "get-intrinsic": "^1.1.3", 845 | "has": "^1.0.3", 846 | "has-tostringtag": "^1.0.0" 847 | }, 848 | "engines": { 849 | "node": ">= 0.4" 850 | } 851 | }, 852 | "node_modules/es-to-primitive": { 853 | "version": "1.2.1", 854 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 855 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 856 | "dev": true, 857 | "dependencies": { 858 | "is-callable": "^1.1.4", 859 | "is-date-object": "^1.0.1", 860 | "is-symbol": "^1.0.2" 861 | }, 862 | "engines": { 863 | "node": ">= 0.4" 864 | }, 865 | "funding": { 866 | "url": "https://github.com/sponsors/ljharb" 867 | } 868 | }, 869 | "node_modules/escape-string-regexp": { 870 | "version": "1.0.5", 871 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 872 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 873 | "dev": true, 874 | "engines": { 875 | "node": ">=0.8.0" 876 | } 877 | }, 878 | "node_modules/eslint": { 879 | "version": "5.4.0", 880 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", 881 | "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", 882 | "dev": true, 883 | "dependencies": { 884 | "ajv": "^6.5.0", 885 | "babel-code-frame": "^6.26.0", 886 | "chalk": "^2.1.0", 887 | "cross-spawn": "^6.0.5", 888 | "debug": "^3.1.0", 889 | "doctrine": "^2.1.0", 890 | "eslint-scope": "^4.0.0", 891 | "eslint-utils": "^1.3.1", 892 | "eslint-visitor-keys": "^1.0.0", 893 | "espree": "^4.0.0", 894 | "esquery": "^1.0.1", 895 | "esutils": "^2.0.2", 896 | "file-entry-cache": "^2.0.0", 897 | "functional-red-black-tree": "^1.0.1", 898 | "glob": "^7.1.2", 899 | "globals": "^11.7.0", 900 | "ignore": "^4.0.2", 901 | "imurmurhash": "^0.1.4", 902 | "inquirer": "^5.2.0", 903 | "is-resolvable": "^1.1.0", 904 | "js-yaml": "^3.11.0", 905 | "json-stable-stringify-without-jsonify": "^1.0.1", 906 | "levn": "^0.3.0", 907 | "lodash": "^4.17.5", 908 | "minimatch": "^3.0.4", 909 | "mkdirp": "^0.5.1", 910 | "natural-compare": "^1.4.0", 911 | "optionator": "^0.8.2", 912 | "path-is-inside": "^1.0.2", 913 | "pluralize": "^7.0.0", 914 | "progress": "^2.0.0", 915 | "regexpp": "^2.0.0", 916 | "require-uncached": "^1.0.3", 917 | "semver": "^5.5.0", 918 | "strip-ansi": "^4.0.0", 919 | "strip-json-comments": "^2.0.1", 920 | "table": "^4.0.3", 921 | "text-table": "^0.2.0" 922 | }, 923 | "bin": { 924 | "eslint": "bin/eslint.js" 925 | }, 926 | "engines": { 927 | "node": "^6.14.0 || ^8.10.0 || >=9.10.0" 928 | } 929 | }, 930 | "node_modules/eslint-config-standard": { 931 | "version": "12.0.0", 932 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", 933 | "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", 934 | "dev": true, 935 | "peerDependencies": { 936 | "eslint": ">=5.0.0", 937 | "eslint-plugin-import": ">=2.13.0", 938 | "eslint-plugin-node": ">=7.0.0", 939 | "eslint-plugin-promise": ">=4.0.0", 940 | "eslint-plugin-standard": ">=4.0.0" 941 | } 942 | }, 943 | "node_modules/eslint-config-standard-jsx": { 944 | "version": "6.0.2", 945 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", 946 | "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", 947 | "dev": true, 948 | "peerDependencies": { 949 | "eslint": ">=5.0.0", 950 | "eslint-plugin-react": ">=7.11.1" 951 | } 952 | }, 953 | "node_modules/eslint-import-resolver-node": { 954 | "version": "0.3.9", 955 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", 956 | "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", 957 | "dev": true, 958 | "dependencies": { 959 | "debug": "^3.2.7", 960 | "is-core-module": "^2.13.0", 961 | "resolve": "^1.22.4" 962 | } 963 | }, 964 | "node_modules/eslint-module-utils": { 965 | "version": "2.8.0", 966 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", 967 | "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", 968 | "dev": true, 969 | "dependencies": { 970 | "debug": "^3.2.7" 971 | }, 972 | "engines": { 973 | "node": ">=4" 974 | }, 975 | "peerDependenciesMeta": { 976 | "eslint": { 977 | "optional": true 978 | } 979 | } 980 | }, 981 | "node_modules/eslint-plugin-es": { 982 | "version": "1.4.1", 983 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", 984 | "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", 985 | "dev": true, 986 | "dependencies": { 987 | "eslint-utils": "^1.4.2", 988 | "regexpp": "^2.0.1" 989 | }, 990 | "engines": { 991 | "node": ">=6.5.0" 992 | }, 993 | "peerDependencies": { 994 | "eslint": ">=4.19.1" 995 | } 996 | }, 997 | "node_modules/eslint-plugin-import": { 998 | "version": "2.14.0", 999 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", 1000 | "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "contains-path": "^0.1.0", 1004 | "debug": "^2.6.8", 1005 | "doctrine": "1.5.0", 1006 | "eslint-import-resolver-node": "^0.3.1", 1007 | "eslint-module-utils": "^2.2.0", 1008 | "has": "^1.0.1", 1009 | "lodash": "^4.17.4", 1010 | "minimatch": "^3.0.3", 1011 | "read-pkg-up": "^2.0.0", 1012 | "resolve": "^1.6.0" 1013 | }, 1014 | "engines": { 1015 | "node": ">=4" 1016 | }, 1017 | "peerDependencies": { 1018 | "eslint": "2.x - 5.x" 1019 | } 1020 | }, 1021 | "node_modules/eslint-plugin-import/node_modules/brace-expansion": { 1022 | "version": "1.1.11", 1023 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1024 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "balanced-match": "^1.0.0", 1028 | "concat-map": "0.0.1" 1029 | } 1030 | }, 1031 | "node_modules/eslint-plugin-import/node_modules/debug": { 1032 | "version": "2.6.9", 1033 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1034 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1035 | "dev": true, 1036 | "dependencies": { 1037 | "ms": "2.0.0" 1038 | } 1039 | }, 1040 | "node_modules/eslint-plugin-import/node_modules/doctrine": { 1041 | "version": "1.5.0", 1042 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 1043 | "integrity": "sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==", 1044 | "dev": true, 1045 | "dependencies": { 1046 | "esutils": "^2.0.2", 1047 | "isarray": "^1.0.0" 1048 | }, 1049 | "engines": { 1050 | "node": ">=0.10.0" 1051 | } 1052 | }, 1053 | "node_modules/eslint-plugin-import/node_modules/isarray": { 1054 | "version": "1.0.0", 1055 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1056 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1057 | "dev": true 1058 | }, 1059 | "node_modules/eslint-plugin-import/node_modules/minimatch": { 1060 | "version": "3.1.2", 1061 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1062 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1063 | "dev": true, 1064 | "dependencies": { 1065 | "brace-expansion": "^1.1.7" 1066 | }, 1067 | "engines": { 1068 | "node": "*" 1069 | } 1070 | }, 1071 | "node_modules/eslint-plugin-import/node_modules/ms": { 1072 | "version": "2.0.0", 1073 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1074 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1075 | "dev": true 1076 | }, 1077 | "node_modules/eslint-plugin-node": { 1078 | "version": "7.0.1", 1079 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", 1080 | "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", 1081 | "dev": true, 1082 | "dependencies": { 1083 | "eslint-plugin-es": "^1.3.1", 1084 | "eslint-utils": "^1.3.1", 1085 | "ignore": "^4.0.2", 1086 | "minimatch": "^3.0.4", 1087 | "resolve": "^1.8.1", 1088 | "semver": "^5.5.0" 1089 | }, 1090 | "engines": { 1091 | "node": ">=6" 1092 | }, 1093 | "peerDependencies": { 1094 | "eslint": ">=4.19.1" 1095 | } 1096 | }, 1097 | "node_modules/eslint-plugin-node/node_modules/brace-expansion": { 1098 | "version": "1.1.11", 1099 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1100 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1101 | "dev": true, 1102 | "dependencies": { 1103 | "balanced-match": "^1.0.0", 1104 | "concat-map": "0.0.1" 1105 | } 1106 | }, 1107 | "node_modules/eslint-plugin-node/node_modules/minimatch": { 1108 | "version": "3.1.2", 1109 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1110 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1111 | "dev": true, 1112 | "dependencies": { 1113 | "brace-expansion": "^1.1.7" 1114 | }, 1115 | "engines": { 1116 | "node": "*" 1117 | } 1118 | }, 1119 | "node_modules/eslint-plugin-promise": { 1120 | "version": "4.0.1", 1121 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", 1122 | "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", 1123 | "dev": true, 1124 | "engines": { 1125 | "node": ">=6" 1126 | } 1127 | }, 1128 | "node_modules/eslint-plugin-react": { 1129 | "version": "7.11.1", 1130 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", 1131 | "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", 1132 | "dev": true, 1133 | "dependencies": { 1134 | "array-includes": "^3.0.3", 1135 | "doctrine": "^2.1.0", 1136 | "has": "^1.0.3", 1137 | "jsx-ast-utils": "^2.0.1", 1138 | "prop-types": "^15.6.2" 1139 | }, 1140 | "engines": { 1141 | "node": ">=4" 1142 | }, 1143 | "peerDependencies": { 1144 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0" 1145 | } 1146 | }, 1147 | "node_modules/eslint-plugin-standard": { 1148 | "version": "4.0.2", 1149 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", 1150 | "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", 1151 | "dev": true, 1152 | "funding": [ 1153 | { 1154 | "type": "github", 1155 | "url": "https://github.com/sponsors/feross" 1156 | }, 1157 | { 1158 | "type": "patreon", 1159 | "url": "https://www.patreon.com/feross" 1160 | }, 1161 | { 1162 | "type": "consulting", 1163 | "url": "https://feross.org/support" 1164 | } 1165 | ], 1166 | "peerDependencies": { 1167 | "eslint": ">=5.0.0" 1168 | } 1169 | }, 1170 | "node_modules/eslint-scope": { 1171 | "version": "4.0.3", 1172 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 1173 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 1174 | "dev": true, 1175 | "dependencies": { 1176 | "esrecurse": "^4.1.0", 1177 | "estraverse": "^4.1.1" 1178 | }, 1179 | "engines": { 1180 | "node": ">=4.0.0" 1181 | } 1182 | }, 1183 | "node_modules/eslint-utils": { 1184 | "version": "1.4.3", 1185 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 1186 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 1187 | "dev": true, 1188 | "dependencies": { 1189 | "eslint-visitor-keys": "^1.1.0" 1190 | }, 1191 | "engines": { 1192 | "node": ">=6" 1193 | } 1194 | }, 1195 | "node_modules/eslint-visitor-keys": { 1196 | "version": "1.3.0", 1197 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1198 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1199 | "dev": true, 1200 | "engines": { 1201 | "node": ">=4" 1202 | } 1203 | }, 1204 | "node_modules/eslint/node_modules/brace-expansion": { 1205 | "version": "1.1.11", 1206 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1207 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1208 | "dev": true, 1209 | "dependencies": { 1210 | "balanced-match": "^1.0.0", 1211 | "concat-map": "0.0.1" 1212 | } 1213 | }, 1214 | "node_modules/eslint/node_modules/glob": { 1215 | "version": "7.2.3", 1216 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1217 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1218 | "dev": true, 1219 | "dependencies": { 1220 | "fs.realpath": "^1.0.0", 1221 | "inflight": "^1.0.4", 1222 | "inherits": "2", 1223 | "minimatch": "^3.1.1", 1224 | "once": "^1.3.0", 1225 | "path-is-absolute": "^1.0.0" 1226 | }, 1227 | "engines": { 1228 | "node": "*" 1229 | }, 1230 | "funding": { 1231 | "url": "https://github.com/sponsors/isaacs" 1232 | } 1233 | }, 1234 | "node_modules/eslint/node_modules/minimatch": { 1235 | "version": "3.1.2", 1236 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1237 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1238 | "dev": true, 1239 | "dependencies": { 1240 | "brace-expansion": "^1.1.7" 1241 | }, 1242 | "engines": { 1243 | "node": "*" 1244 | } 1245 | }, 1246 | "node_modules/espree": { 1247 | "version": "4.1.0", 1248 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", 1249 | "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", 1250 | "dev": true, 1251 | "dependencies": { 1252 | "acorn": "^6.0.2", 1253 | "acorn-jsx": "^5.0.0", 1254 | "eslint-visitor-keys": "^1.0.0" 1255 | }, 1256 | "engines": { 1257 | "node": ">=6.0.0" 1258 | } 1259 | }, 1260 | "node_modules/esprima": { 1261 | "version": "4.0.1", 1262 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1263 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1264 | "dev": true, 1265 | "bin": { 1266 | "esparse": "bin/esparse.js", 1267 | "esvalidate": "bin/esvalidate.js" 1268 | }, 1269 | "engines": { 1270 | "node": ">=4" 1271 | } 1272 | }, 1273 | "node_modules/esquery": { 1274 | "version": "1.5.0", 1275 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 1276 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 1277 | "dev": true, 1278 | "dependencies": { 1279 | "estraverse": "^5.1.0" 1280 | }, 1281 | "engines": { 1282 | "node": ">=0.10" 1283 | } 1284 | }, 1285 | "node_modules/esquery/node_modules/estraverse": { 1286 | "version": "5.3.0", 1287 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1288 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1289 | "dev": true, 1290 | "engines": { 1291 | "node": ">=4.0" 1292 | } 1293 | }, 1294 | "node_modules/esrecurse": { 1295 | "version": "4.3.0", 1296 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1297 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1298 | "dev": true, 1299 | "dependencies": { 1300 | "estraverse": "^5.2.0" 1301 | }, 1302 | "engines": { 1303 | "node": ">=4.0" 1304 | } 1305 | }, 1306 | "node_modules/esrecurse/node_modules/estraverse": { 1307 | "version": "5.3.0", 1308 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1309 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1310 | "dev": true, 1311 | "engines": { 1312 | "node": ">=4.0" 1313 | } 1314 | }, 1315 | "node_modules/estraverse": { 1316 | "version": "4.3.0", 1317 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1318 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1319 | "dev": true, 1320 | "engines": { 1321 | "node": ">=4.0" 1322 | } 1323 | }, 1324 | "node_modules/estree-walker": { 1325 | "version": "2.0.2", 1326 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1327 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1328 | "dev": true 1329 | }, 1330 | "node_modules/esutils": { 1331 | "version": "2.0.3", 1332 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1333 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1334 | "dev": true, 1335 | "engines": { 1336 | "node": ">=0.10.0" 1337 | } 1338 | }, 1339 | "node_modules/external-editor": { 1340 | "version": "2.2.0", 1341 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 1342 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 1343 | "dev": true, 1344 | "dependencies": { 1345 | "chardet": "^0.4.0", 1346 | "iconv-lite": "^0.4.17", 1347 | "tmp": "^0.0.33" 1348 | }, 1349 | "engines": { 1350 | "node": ">=0.12" 1351 | } 1352 | }, 1353 | "node_modules/fast-deep-equal": { 1354 | "version": "3.1.3", 1355 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1356 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1357 | "dev": true 1358 | }, 1359 | "node_modules/fast-json-stable-stringify": { 1360 | "version": "2.1.0", 1361 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1362 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1363 | "dev": true 1364 | }, 1365 | "node_modules/fast-levenshtein": { 1366 | "version": "2.0.6", 1367 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1368 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1369 | "dev": true 1370 | }, 1371 | "node_modules/figures": { 1372 | "version": "2.0.0", 1373 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 1374 | "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", 1375 | "dev": true, 1376 | "dependencies": { 1377 | "escape-string-regexp": "^1.0.5" 1378 | }, 1379 | "engines": { 1380 | "node": ">=4" 1381 | } 1382 | }, 1383 | "node_modules/file-entry-cache": { 1384 | "version": "2.0.0", 1385 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 1386 | "integrity": "sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==", 1387 | "dev": true, 1388 | "dependencies": { 1389 | "flat-cache": "^1.2.1", 1390 | "object-assign": "^4.0.1" 1391 | }, 1392 | "engines": { 1393 | "node": ">=0.10.0" 1394 | } 1395 | }, 1396 | "node_modules/find-root": { 1397 | "version": "1.1.0", 1398 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 1399 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 1400 | "dev": true 1401 | }, 1402 | "node_modules/find-up": { 1403 | "version": "2.1.0", 1404 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1405 | "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", 1406 | "dev": true, 1407 | "dependencies": { 1408 | "locate-path": "^2.0.0" 1409 | }, 1410 | "engines": { 1411 | "node": ">=4" 1412 | } 1413 | }, 1414 | "node_modules/flat-cache": { 1415 | "version": "1.3.4", 1416 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", 1417 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", 1418 | "dev": true, 1419 | "dependencies": { 1420 | "circular-json": "^0.3.1", 1421 | "graceful-fs": "^4.1.2", 1422 | "rimraf": "~2.6.2", 1423 | "write": "^0.2.1" 1424 | }, 1425 | "engines": { 1426 | "node": ">=0.10.0" 1427 | } 1428 | }, 1429 | "node_modules/for-each": { 1430 | "version": "0.3.3", 1431 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1432 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1433 | "dev": true, 1434 | "dependencies": { 1435 | "is-callable": "^1.1.3" 1436 | } 1437 | }, 1438 | "node_modules/fs.realpath": { 1439 | "version": "1.0.0", 1440 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1441 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1442 | "dev": true 1443 | }, 1444 | "node_modules/fsevents": { 1445 | "version": "2.3.3", 1446 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1447 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1448 | "dev": true, 1449 | "hasInstallScript": true, 1450 | "optional": true, 1451 | "os": [ 1452 | "darwin" 1453 | ], 1454 | "engines": { 1455 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1456 | } 1457 | }, 1458 | "node_modules/function-bind": { 1459 | "version": "1.1.1", 1460 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1461 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1462 | "dev": true 1463 | }, 1464 | "node_modules/function.prototype.name": { 1465 | "version": "1.1.6", 1466 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", 1467 | "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", 1468 | "dev": true, 1469 | "dependencies": { 1470 | "call-bind": "^1.0.2", 1471 | "define-properties": "^1.2.0", 1472 | "es-abstract": "^1.22.1", 1473 | "functions-have-names": "^1.2.3" 1474 | }, 1475 | "engines": { 1476 | "node": ">= 0.4" 1477 | }, 1478 | "funding": { 1479 | "url": "https://github.com/sponsors/ljharb" 1480 | } 1481 | }, 1482 | "node_modules/functional-red-black-tree": { 1483 | "version": "1.0.1", 1484 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1485 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 1486 | "dev": true 1487 | }, 1488 | "node_modules/functions-have-names": { 1489 | "version": "1.2.3", 1490 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 1491 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 1492 | "dev": true, 1493 | "funding": { 1494 | "url": "https://github.com/sponsors/ljharb" 1495 | } 1496 | }, 1497 | "node_modules/get-caller-file": { 1498 | "version": "2.0.5", 1499 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1500 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1501 | "dev": true, 1502 | "engines": { 1503 | "node": "6.* || 8.* || >= 10.*" 1504 | } 1505 | }, 1506 | "node_modules/get-intrinsic": { 1507 | "version": "1.2.1", 1508 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 1509 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 1510 | "dev": true, 1511 | "dependencies": { 1512 | "function-bind": "^1.1.1", 1513 | "has": "^1.0.3", 1514 | "has-proto": "^1.0.1", 1515 | "has-symbols": "^1.0.3" 1516 | }, 1517 | "funding": { 1518 | "url": "https://github.com/sponsors/ljharb" 1519 | } 1520 | }, 1521 | "node_modules/get-stdin": { 1522 | "version": "6.0.0", 1523 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 1524 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 1525 | "dev": true, 1526 | "engines": { 1527 | "node": ">=4" 1528 | } 1529 | }, 1530 | "node_modules/get-symbol-description": { 1531 | "version": "1.0.0", 1532 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 1533 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 1534 | "dev": true, 1535 | "dependencies": { 1536 | "call-bind": "^1.0.2", 1537 | "get-intrinsic": "^1.1.1" 1538 | }, 1539 | "engines": { 1540 | "node": ">= 0.4" 1541 | }, 1542 | "funding": { 1543 | "url": "https://github.com/sponsors/ljharb" 1544 | } 1545 | }, 1546 | "node_modules/glob": { 1547 | "version": "8.1.0", 1548 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1549 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1550 | "dev": true, 1551 | "dependencies": { 1552 | "fs.realpath": "^1.0.0", 1553 | "inflight": "^1.0.4", 1554 | "inherits": "2", 1555 | "minimatch": "^5.0.1", 1556 | "once": "^1.3.0" 1557 | }, 1558 | "engines": { 1559 | "node": ">=12" 1560 | }, 1561 | "funding": { 1562 | "url": "https://github.com/sponsors/isaacs" 1563 | } 1564 | }, 1565 | "node_modules/globals": { 1566 | "version": "11.12.0", 1567 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1568 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1569 | "dev": true, 1570 | "engines": { 1571 | "node": ">=4" 1572 | } 1573 | }, 1574 | "node_modules/globalthis": { 1575 | "version": "1.0.3", 1576 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 1577 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 1578 | "dev": true, 1579 | "dependencies": { 1580 | "define-properties": "^1.1.3" 1581 | }, 1582 | "engines": { 1583 | "node": ">= 0.4" 1584 | }, 1585 | "funding": { 1586 | "url": "https://github.com/sponsors/ljharb" 1587 | } 1588 | }, 1589 | "node_modules/gopd": { 1590 | "version": "1.0.1", 1591 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1592 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1593 | "dev": true, 1594 | "dependencies": { 1595 | "get-intrinsic": "^1.1.3" 1596 | }, 1597 | "funding": { 1598 | "url": "https://github.com/sponsors/ljharb" 1599 | } 1600 | }, 1601 | "node_modules/graceful-fs": { 1602 | "version": "4.2.11", 1603 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1604 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1605 | "dev": true 1606 | }, 1607 | "node_modules/has": { 1608 | "version": "1.0.3", 1609 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1610 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1611 | "dev": true, 1612 | "dependencies": { 1613 | "function-bind": "^1.1.1" 1614 | }, 1615 | "engines": { 1616 | "node": ">= 0.4.0" 1617 | } 1618 | }, 1619 | "node_modules/has-ansi": { 1620 | "version": "2.0.0", 1621 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1622 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 1623 | "dev": true, 1624 | "dependencies": { 1625 | "ansi-regex": "^2.0.0" 1626 | }, 1627 | "engines": { 1628 | "node": ">=0.10.0" 1629 | } 1630 | }, 1631 | "node_modules/has-ansi/node_modules/ansi-regex": { 1632 | "version": "2.1.1", 1633 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1634 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 1635 | "dev": true, 1636 | "engines": { 1637 | "node": ">=0.10.0" 1638 | } 1639 | }, 1640 | "node_modules/has-bigints": { 1641 | "version": "1.0.2", 1642 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 1643 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 1644 | "dev": true, 1645 | "funding": { 1646 | "url": "https://github.com/sponsors/ljharb" 1647 | } 1648 | }, 1649 | "node_modules/has-flag": { 1650 | "version": "3.0.0", 1651 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1652 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1653 | "dev": true, 1654 | "engines": { 1655 | "node": ">=4" 1656 | } 1657 | }, 1658 | "node_modules/has-property-descriptors": { 1659 | "version": "1.0.0", 1660 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 1661 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 1662 | "dev": true, 1663 | "dependencies": { 1664 | "get-intrinsic": "^1.1.1" 1665 | }, 1666 | "funding": { 1667 | "url": "https://github.com/sponsors/ljharb" 1668 | } 1669 | }, 1670 | "node_modules/has-proto": { 1671 | "version": "1.0.1", 1672 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1673 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 1674 | "dev": true, 1675 | "engines": { 1676 | "node": ">= 0.4" 1677 | }, 1678 | "funding": { 1679 | "url": "https://github.com/sponsors/ljharb" 1680 | } 1681 | }, 1682 | "node_modules/has-symbols": { 1683 | "version": "1.0.3", 1684 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1685 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1686 | "dev": true, 1687 | "engines": { 1688 | "node": ">= 0.4" 1689 | }, 1690 | "funding": { 1691 | "url": "https://github.com/sponsors/ljharb" 1692 | } 1693 | }, 1694 | "node_modules/has-tostringtag": { 1695 | "version": "1.0.0", 1696 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1697 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1698 | "dev": true, 1699 | "dependencies": { 1700 | "has-symbols": "^1.0.2" 1701 | }, 1702 | "engines": { 1703 | "node": ">= 0.4" 1704 | }, 1705 | "funding": { 1706 | "url": "https://github.com/sponsors/ljharb" 1707 | } 1708 | }, 1709 | "node_modules/hosted-git-info": { 1710 | "version": "2.8.9", 1711 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 1712 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 1713 | "dev": true 1714 | }, 1715 | "node_modules/iconv-lite": { 1716 | "version": "0.4.24", 1717 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1718 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1719 | "dev": true, 1720 | "dependencies": { 1721 | "safer-buffer": ">= 2.1.2 < 3" 1722 | }, 1723 | "engines": { 1724 | "node": ">=0.10.0" 1725 | } 1726 | }, 1727 | "node_modules/ignore": { 1728 | "version": "4.0.6", 1729 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1730 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1731 | "dev": true, 1732 | "engines": { 1733 | "node": ">= 4" 1734 | } 1735 | }, 1736 | "node_modules/imurmurhash": { 1737 | "version": "0.1.4", 1738 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1739 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1740 | "dev": true, 1741 | "engines": { 1742 | "node": ">=0.8.19" 1743 | } 1744 | }, 1745 | "node_modules/inflight": { 1746 | "version": "1.0.6", 1747 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1748 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1749 | "dev": true, 1750 | "dependencies": { 1751 | "once": "^1.3.0", 1752 | "wrappy": "1" 1753 | } 1754 | }, 1755 | "node_modules/inherits": { 1756 | "version": "2.0.4", 1757 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1758 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1759 | "dev": true 1760 | }, 1761 | "node_modules/inquirer": { 1762 | "version": "5.2.0", 1763 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", 1764 | "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", 1765 | "dev": true, 1766 | "dependencies": { 1767 | "ansi-escapes": "^3.0.0", 1768 | "chalk": "^2.0.0", 1769 | "cli-cursor": "^2.1.0", 1770 | "cli-width": "^2.0.0", 1771 | "external-editor": "^2.1.0", 1772 | "figures": "^2.0.0", 1773 | "lodash": "^4.3.0", 1774 | "mute-stream": "0.0.7", 1775 | "run-async": "^2.2.0", 1776 | "rxjs": "^5.5.2", 1777 | "string-width": "^2.1.0", 1778 | "strip-ansi": "^4.0.0", 1779 | "through": "^2.3.6" 1780 | }, 1781 | "engines": { 1782 | "node": ">=6.0.0" 1783 | } 1784 | }, 1785 | "node_modules/inquirer/node_modules/rxjs": { 1786 | "version": "5.5.12", 1787 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", 1788 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", 1789 | "dev": true, 1790 | "dependencies": { 1791 | "symbol-observable": "1.0.1" 1792 | }, 1793 | "engines": { 1794 | "npm": ">=2.0.0" 1795 | } 1796 | }, 1797 | "node_modules/internal-slot": { 1798 | "version": "1.0.5", 1799 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", 1800 | "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", 1801 | "dev": true, 1802 | "dependencies": { 1803 | "get-intrinsic": "^1.2.0", 1804 | "has": "^1.0.3", 1805 | "side-channel": "^1.0.4" 1806 | }, 1807 | "engines": { 1808 | "node": ">= 0.4" 1809 | } 1810 | }, 1811 | "node_modules/is-array-buffer": { 1812 | "version": "3.0.2", 1813 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", 1814 | "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", 1815 | "dev": true, 1816 | "dependencies": { 1817 | "call-bind": "^1.0.2", 1818 | "get-intrinsic": "^1.2.0", 1819 | "is-typed-array": "^1.1.10" 1820 | }, 1821 | "funding": { 1822 | "url": "https://github.com/sponsors/ljharb" 1823 | } 1824 | }, 1825 | "node_modules/is-arrayish": { 1826 | "version": "0.2.1", 1827 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1828 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 1829 | "dev": true 1830 | }, 1831 | "node_modules/is-bigint": { 1832 | "version": "1.0.4", 1833 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1834 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1835 | "dev": true, 1836 | "dependencies": { 1837 | "has-bigints": "^1.0.1" 1838 | }, 1839 | "funding": { 1840 | "url": "https://github.com/sponsors/ljharb" 1841 | } 1842 | }, 1843 | "node_modules/is-boolean-object": { 1844 | "version": "1.1.2", 1845 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1846 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1847 | "dev": true, 1848 | "dependencies": { 1849 | "call-bind": "^1.0.2", 1850 | "has-tostringtag": "^1.0.0" 1851 | }, 1852 | "engines": { 1853 | "node": ">= 0.4" 1854 | }, 1855 | "funding": { 1856 | "url": "https://github.com/sponsors/ljharb" 1857 | } 1858 | }, 1859 | "node_modules/is-builtin-module": { 1860 | "version": "3.2.1", 1861 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", 1862 | "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", 1863 | "dev": true, 1864 | "dependencies": { 1865 | "builtin-modules": "^3.3.0" 1866 | }, 1867 | "engines": { 1868 | "node": ">=6" 1869 | }, 1870 | "funding": { 1871 | "url": "https://github.com/sponsors/sindresorhus" 1872 | } 1873 | }, 1874 | "node_modules/is-callable": { 1875 | "version": "1.2.7", 1876 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 1877 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 1878 | "dev": true, 1879 | "engines": { 1880 | "node": ">= 0.4" 1881 | }, 1882 | "funding": { 1883 | "url": "https://github.com/sponsors/ljharb" 1884 | } 1885 | }, 1886 | "node_modules/is-core-module": { 1887 | "version": "2.13.0", 1888 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", 1889 | "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", 1890 | "dev": true, 1891 | "dependencies": { 1892 | "has": "^1.0.3" 1893 | }, 1894 | "funding": { 1895 | "url": "https://github.com/sponsors/ljharb" 1896 | } 1897 | }, 1898 | "node_modules/is-date-object": { 1899 | "version": "1.0.5", 1900 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1901 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1902 | "dev": true, 1903 | "dependencies": { 1904 | "has-tostringtag": "^1.0.0" 1905 | }, 1906 | "engines": { 1907 | "node": ">= 0.4" 1908 | }, 1909 | "funding": { 1910 | "url": "https://github.com/sponsors/ljharb" 1911 | } 1912 | }, 1913 | "node_modules/is-fullwidth-code-point": { 1914 | "version": "2.0.0", 1915 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1916 | "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", 1917 | "dev": true, 1918 | "engines": { 1919 | "node": ">=4" 1920 | } 1921 | }, 1922 | "node_modules/is-module": { 1923 | "version": "1.0.0", 1924 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1925 | "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", 1926 | "dev": true 1927 | }, 1928 | "node_modules/is-negative-zero": { 1929 | "version": "2.0.2", 1930 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1931 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1932 | "dev": true, 1933 | "engines": { 1934 | "node": ">= 0.4" 1935 | }, 1936 | "funding": { 1937 | "url": "https://github.com/sponsors/ljharb" 1938 | } 1939 | }, 1940 | "node_modules/is-number-object": { 1941 | "version": "1.0.7", 1942 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1943 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1944 | "dev": true, 1945 | "dependencies": { 1946 | "has-tostringtag": "^1.0.0" 1947 | }, 1948 | "engines": { 1949 | "node": ">= 0.4" 1950 | }, 1951 | "funding": { 1952 | "url": "https://github.com/sponsors/ljharb" 1953 | } 1954 | }, 1955 | "node_modules/is-reference": { 1956 | "version": "1.2.1", 1957 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 1958 | "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 1959 | "dev": true, 1960 | "dependencies": { 1961 | "@types/estree": "*" 1962 | } 1963 | }, 1964 | "node_modules/is-regex": { 1965 | "version": "1.1.4", 1966 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1967 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1968 | "dev": true, 1969 | "dependencies": { 1970 | "call-bind": "^1.0.2", 1971 | "has-tostringtag": "^1.0.0" 1972 | }, 1973 | "engines": { 1974 | "node": ">= 0.4" 1975 | }, 1976 | "funding": { 1977 | "url": "https://github.com/sponsors/ljharb" 1978 | } 1979 | }, 1980 | "node_modules/is-resolvable": { 1981 | "version": "1.1.0", 1982 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1983 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1984 | "dev": true 1985 | }, 1986 | "node_modules/is-shared-array-buffer": { 1987 | "version": "1.0.2", 1988 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1989 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1990 | "dev": true, 1991 | "dependencies": { 1992 | "call-bind": "^1.0.2" 1993 | }, 1994 | "funding": { 1995 | "url": "https://github.com/sponsors/ljharb" 1996 | } 1997 | }, 1998 | "node_modules/is-string": { 1999 | "version": "1.0.7", 2000 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 2001 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 2002 | "dev": true, 2003 | "dependencies": { 2004 | "has-tostringtag": "^1.0.0" 2005 | }, 2006 | "engines": { 2007 | "node": ">= 0.4" 2008 | }, 2009 | "funding": { 2010 | "url": "https://github.com/sponsors/ljharb" 2011 | } 2012 | }, 2013 | "node_modules/is-symbol": { 2014 | "version": "1.0.4", 2015 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 2016 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 2017 | "dev": true, 2018 | "dependencies": { 2019 | "has-symbols": "^1.0.2" 2020 | }, 2021 | "engines": { 2022 | "node": ">= 0.4" 2023 | }, 2024 | "funding": { 2025 | "url": "https://github.com/sponsors/ljharb" 2026 | } 2027 | }, 2028 | "node_modules/is-typed-array": { 2029 | "version": "1.1.12", 2030 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", 2031 | "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", 2032 | "dev": true, 2033 | "dependencies": { 2034 | "which-typed-array": "^1.1.11" 2035 | }, 2036 | "engines": { 2037 | "node": ">= 0.4" 2038 | }, 2039 | "funding": { 2040 | "url": "https://github.com/sponsors/ljharb" 2041 | } 2042 | }, 2043 | "node_modules/is-weakref": { 2044 | "version": "1.0.2", 2045 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 2046 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 2047 | "dev": true, 2048 | "dependencies": { 2049 | "call-bind": "^1.0.2" 2050 | }, 2051 | "funding": { 2052 | "url": "https://github.com/sponsors/ljharb" 2053 | } 2054 | }, 2055 | "node_modules/isarray": { 2056 | "version": "2.0.5", 2057 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 2058 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 2059 | "dev": true 2060 | }, 2061 | "node_modules/isexe": { 2062 | "version": "2.0.0", 2063 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2064 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2065 | "dev": true 2066 | }, 2067 | "node_modules/isomorphic.js": { 2068 | "version": "0.2.5", 2069 | "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", 2070 | "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", 2071 | "funding": { 2072 | "type": "GitHub Sponsors ❤", 2073 | "url": "https://github.com/sponsors/dmonad" 2074 | } 2075 | }, 2076 | "node_modules/js-tokens": { 2077 | "version": "3.0.2", 2078 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 2079 | "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", 2080 | "dev": true 2081 | }, 2082 | "node_modules/js-yaml": { 2083 | "version": "3.14.1", 2084 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 2085 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 2086 | "dev": true, 2087 | "dependencies": { 2088 | "argparse": "^1.0.7", 2089 | "esprima": "^4.0.0" 2090 | }, 2091 | "bin": { 2092 | "js-yaml": "bin/js-yaml.js" 2093 | } 2094 | }, 2095 | "node_modules/json-parse-better-errors": { 2096 | "version": "1.0.2", 2097 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 2098 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 2099 | "dev": true 2100 | }, 2101 | "node_modules/json-schema-traverse": { 2102 | "version": "0.4.1", 2103 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2104 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2105 | "dev": true 2106 | }, 2107 | "node_modules/json-stable-stringify-without-jsonify": { 2108 | "version": "1.0.1", 2109 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2110 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2111 | "dev": true 2112 | }, 2113 | "node_modules/jsx-ast-utils": { 2114 | "version": "2.4.1", 2115 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", 2116 | "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", 2117 | "dev": true, 2118 | "dependencies": { 2119 | "array-includes": "^3.1.1", 2120 | "object.assign": "^4.1.0" 2121 | }, 2122 | "engines": { 2123 | "node": ">=4.0" 2124 | } 2125 | }, 2126 | "node_modules/levn": { 2127 | "version": "0.3.0", 2128 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 2129 | "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", 2130 | "dev": true, 2131 | "dependencies": { 2132 | "prelude-ls": "~1.1.2", 2133 | "type-check": "~0.3.2" 2134 | }, 2135 | "engines": { 2136 | "node": ">= 0.8.0" 2137 | } 2138 | }, 2139 | "node_modules/lib0": { 2140 | "version": "0.2.105", 2141 | "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.105.tgz", 2142 | "integrity": "sha512-5vtbuBi2P43ZYOfVMV+TZYkWEa0J9kijXirzEgrPA+nJDQCtMx805/rqW4G1nXbM9IRIhwW+OyNNgcQdbhKfSw==", 2143 | "license": "MIT", 2144 | "dependencies": { 2145 | "isomorphic.js": "^0.2.4" 2146 | }, 2147 | "bin": { 2148 | "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", 2149 | "0gentesthtml": "bin/gentesthtml.js", 2150 | "0serve": "bin/0serve.js" 2151 | }, 2152 | "engines": { 2153 | "node": ">=16" 2154 | }, 2155 | "funding": { 2156 | "type": "GitHub Sponsors ❤", 2157 | "url": "https://github.com/sponsors/dmonad" 2158 | } 2159 | }, 2160 | "node_modules/load-json-file": { 2161 | "version": "4.0.0", 2162 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 2163 | "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", 2164 | "dev": true, 2165 | "dependencies": { 2166 | "graceful-fs": "^4.1.2", 2167 | "parse-json": "^4.0.0", 2168 | "pify": "^3.0.0", 2169 | "strip-bom": "^3.0.0" 2170 | }, 2171 | "engines": { 2172 | "node": ">=4" 2173 | } 2174 | }, 2175 | "node_modules/locate-path": { 2176 | "version": "2.0.0", 2177 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 2178 | "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", 2179 | "dev": true, 2180 | "dependencies": { 2181 | "p-locate": "^2.0.0", 2182 | "path-exists": "^3.0.0" 2183 | }, 2184 | "engines": { 2185 | "node": ">=4" 2186 | } 2187 | }, 2188 | "node_modules/lodash": { 2189 | "version": "4.17.21", 2190 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2191 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2192 | "dev": true 2193 | }, 2194 | "node_modules/loose-envify": { 2195 | "version": "1.4.0", 2196 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2197 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2198 | "dev": true, 2199 | "dependencies": { 2200 | "js-tokens": "^3.0.0 || ^4.0.0" 2201 | }, 2202 | "bin": { 2203 | "loose-envify": "cli.js" 2204 | } 2205 | }, 2206 | "node_modules/magic-string": { 2207 | "version": "0.27.0", 2208 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 2209 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 2210 | "dev": true, 2211 | "dependencies": { 2212 | "@jridgewell/sourcemap-codec": "^1.4.13" 2213 | }, 2214 | "engines": { 2215 | "node": ">=12" 2216 | } 2217 | }, 2218 | "node_modules/mimic-fn": { 2219 | "version": "1.2.0", 2220 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 2221 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 2222 | "dev": true, 2223 | "engines": { 2224 | "node": ">=4" 2225 | } 2226 | }, 2227 | "node_modules/minimatch": { 2228 | "version": "5.1.6", 2229 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 2230 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 2231 | "dev": true, 2232 | "dependencies": { 2233 | "brace-expansion": "^2.0.1" 2234 | }, 2235 | "engines": { 2236 | "node": ">=10" 2237 | } 2238 | }, 2239 | "node_modules/minimist": { 2240 | "version": "1.2.8", 2241 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 2242 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 2243 | "dev": true, 2244 | "funding": { 2245 | "url": "https://github.com/sponsors/ljharb" 2246 | } 2247 | }, 2248 | "node_modules/mkdirp": { 2249 | "version": "0.5.6", 2250 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 2251 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 2252 | "dev": true, 2253 | "dependencies": { 2254 | "minimist": "^1.2.6" 2255 | }, 2256 | "bin": { 2257 | "mkdirp": "bin/cmd.js" 2258 | } 2259 | }, 2260 | "node_modules/ms": { 2261 | "version": "2.1.3", 2262 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2263 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2264 | "dev": true 2265 | }, 2266 | "node_modules/mute-stream": { 2267 | "version": "0.0.7", 2268 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 2269 | "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", 2270 | "dev": true 2271 | }, 2272 | "node_modules/natural-compare": { 2273 | "version": "1.4.0", 2274 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2275 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2276 | "dev": true 2277 | }, 2278 | "node_modules/nice-try": { 2279 | "version": "1.0.5", 2280 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 2281 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 2282 | "dev": true 2283 | }, 2284 | "node_modules/normalize-package-data": { 2285 | "version": "2.5.0", 2286 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 2287 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 2288 | "dev": true, 2289 | "dependencies": { 2290 | "hosted-git-info": "^2.1.4", 2291 | "resolve": "^1.10.0", 2292 | "semver": "2 || 3 || 4 || 5", 2293 | "validate-npm-package-license": "^3.0.1" 2294 | } 2295 | }, 2296 | "node_modules/object-assign": { 2297 | "version": "4.1.1", 2298 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2299 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2300 | "dev": true, 2301 | "engines": { 2302 | "node": ">=0.10.0" 2303 | } 2304 | }, 2305 | "node_modules/object-inspect": { 2306 | "version": "1.12.3", 2307 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 2308 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 2309 | "dev": true, 2310 | "funding": { 2311 | "url": "https://github.com/sponsors/ljharb" 2312 | } 2313 | }, 2314 | "node_modules/object-keys": { 2315 | "version": "1.1.1", 2316 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2317 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2318 | "dev": true, 2319 | "engines": { 2320 | "node": ">= 0.4" 2321 | } 2322 | }, 2323 | "node_modules/object.assign": { 2324 | "version": "4.1.4", 2325 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 2326 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 2327 | "dev": true, 2328 | "dependencies": { 2329 | "call-bind": "^1.0.2", 2330 | "define-properties": "^1.1.4", 2331 | "has-symbols": "^1.0.3", 2332 | "object-keys": "^1.1.1" 2333 | }, 2334 | "engines": { 2335 | "node": ">= 0.4" 2336 | }, 2337 | "funding": { 2338 | "url": "https://github.com/sponsors/ljharb" 2339 | } 2340 | }, 2341 | "node_modules/once": { 2342 | "version": "1.4.0", 2343 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2344 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2345 | "dev": true, 2346 | "dependencies": { 2347 | "wrappy": "1" 2348 | } 2349 | }, 2350 | "node_modules/onetime": { 2351 | "version": "2.0.1", 2352 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 2353 | "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", 2354 | "dev": true, 2355 | "dependencies": { 2356 | "mimic-fn": "^1.0.0" 2357 | }, 2358 | "engines": { 2359 | "node": ">=4" 2360 | } 2361 | }, 2362 | "node_modules/optionator": { 2363 | "version": "0.8.3", 2364 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 2365 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 2366 | "dev": true, 2367 | "dependencies": { 2368 | "deep-is": "~0.1.3", 2369 | "fast-levenshtein": "~2.0.6", 2370 | "levn": "~0.3.0", 2371 | "prelude-ls": "~1.1.2", 2372 | "type-check": "~0.3.2", 2373 | "word-wrap": "~1.2.3" 2374 | }, 2375 | "engines": { 2376 | "node": ">= 0.8.0" 2377 | } 2378 | }, 2379 | "node_modules/os-tmpdir": { 2380 | "version": "1.0.2", 2381 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2382 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 2383 | "dev": true, 2384 | "engines": { 2385 | "node": ">=0.10.0" 2386 | } 2387 | }, 2388 | "node_modules/p-limit": { 2389 | "version": "1.3.0", 2390 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 2391 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 2392 | "dev": true, 2393 | "dependencies": { 2394 | "p-try": "^1.0.0" 2395 | }, 2396 | "engines": { 2397 | "node": ">=4" 2398 | } 2399 | }, 2400 | "node_modules/p-locate": { 2401 | "version": "2.0.0", 2402 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 2403 | "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", 2404 | "dev": true, 2405 | "dependencies": { 2406 | "p-limit": "^1.1.0" 2407 | }, 2408 | "engines": { 2409 | "node": ">=4" 2410 | } 2411 | }, 2412 | "node_modules/p-try": { 2413 | "version": "1.0.0", 2414 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 2415 | "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", 2416 | "dev": true, 2417 | "engines": { 2418 | "node": ">=4" 2419 | } 2420 | }, 2421 | "node_modules/parse-json": { 2422 | "version": "4.0.0", 2423 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 2424 | "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", 2425 | "dev": true, 2426 | "dependencies": { 2427 | "error-ex": "^1.3.1", 2428 | "json-parse-better-errors": "^1.0.1" 2429 | }, 2430 | "engines": { 2431 | "node": ">=4" 2432 | } 2433 | }, 2434 | "node_modules/path-exists": { 2435 | "version": "3.0.0", 2436 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2437 | "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", 2438 | "dev": true, 2439 | "engines": { 2440 | "node": ">=4" 2441 | } 2442 | }, 2443 | "node_modules/path-is-absolute": { 2444 | "version": "1.0.1", 2445 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2446 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2447 | "dev": true, 2448 | "engines": { 2449 | "node": ">=0.10.0" 2450 | } 2451 | }, 2452 | "node_modules/path-is-inside": { 2453 | "version": "1.0.2", 2454 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2455 | "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", 2456 | "dev": true 2457 | }, 2458 | "node_modules/path-key": { 2459 | "version": "2.0.1", 2460 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2461 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", 2462 | "dev": true, 2463 | "engines": { 2464 | "node": ">=4" 2465 | } 2466 | }, 2467 | "node_modules/path-parse": { 2468 | "version": "1.0.7", 2469 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2470 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2471 | "dev": true 2472 | }, 2473 | "node_modules/path-type": { 2474 | "version": "2.0.0", 2475 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 2476 | "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", 2477 | "dev": true, 2478 | "dependencies": { 2479 | "pify": "^2.0.0" 2480 | }, 2481 | "engines": { 2482 | "node": ">=4" 2483 | } 2484 | }, 2485 | "node_modules/path-type/node_modules/pify": { 2486 | "version": "2.3.0", 2487 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2488 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2489 | "dev": true, 2490 | "engines": { 2491 | "node": ">=0.10.0" 2492 | } 2493 | }, 2494 | "node_modules/picomatch": { 2495 | "version": "2.3.1", 2496 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2497 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2498 | "dev": true, 2499 | "engines": { 2500 | "node": ">=8.6" 2501 | }, 2502 | "funding": { 2503 | "url": "https://github.com/sponsors/jonschlinkert" 2504 | } 2505 | }, 2506 | "node_modules/pify": { 2507 | "version": "3.0.0", 2508 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2509 | "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", 2510 | "dev": true, 2511 | "engines": { 2512 | "node": ">=4" 2513 | } 2514 | }, 2515 | "node_modules/pkg-conf": { 2516 | "version": "2.1.0", 2517 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", 2518 | "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", 2519 | "dev": true, 2520 | "dependencies": { 2521 | "find-up": "^2.0.0", 2522 | "load-json-file": "^4.0.0" 2523 | }, 2524 | "engines": { 2525 | "node": ">=4" 2526 | } 2527 | }, 2528 | "node_modules/pkg-config": { 2529 | "version": "1.1.1", 2530 | "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", 2531 | "integrity": "sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw==", 2532 | "dev": true, 2533 | "dependencies": { 2534 | "debug-log": "^1.0.0", 2535 | "find-root": "^1.0.0", 2536 | "xtend": "^4.0.1" 2537 | }, 2538 | "engines": { 2539 | "node": ">=0.10" 2540 | } 2541 | }, 2542 | "node_modules/pluralize": { 2543 | "version": "7.0.0", 2544 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 2545 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 2546 | "dev": true, 2547 | "engines": { 2548 | "node": ">=4" 2549 | } 2550 | }, 2551 | "node_modules/prelude-ls": { 2552 | "version": "1.1.2", 2553 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2554 | "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", 2555 | "dev": true, 2556 | "engines": { 2557 | "node": ">= 0.8.0" 2558 | } 2559 | }, 2560 | "node_modules/progress": { 2561 | "version": "2.0.3", 2562 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2563 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2564 | "dev": true, 2565 | "engines": { 2566 | "node": ">=0.4.0" 2567 | } 2568 | }, 2569 | "node_modules/prop-types": { 2570 | "version": "15.8.1", 2571 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 2572 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 2573 | "dev": true, 2574 | "dependencies": { 2575 | "loose-envify": "^1.4.0", 2576 | "object-assign": "^4.1.1", 2577 | "react-is": "^16.13.1" 2578 | } 2579 | }, 2580 | "node_modules/punycode": { 2581 | "version": "2.3.0", 2582 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 2583 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 2584 | "dev": true, 2585 | "engines": { 2586 | "node": ">=6" 2587 | } 2588 | }, 2589 | "node_modules/queue-microtask": { 2590 | "version": "1.2.3", 2591 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2592 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2593 | "dev": true, 2594 | "funding": [ 2595 | { 2596 | "type": "github", 2597 | "url": "https://github.com/sponsors/feross" 2598 | }, 2599 | { 2600 | "type": "patreon", 2601 | "url": "https://www.patreon.com/feross" 2602 | }, 2603 | { 2604 | "type": "consulting", 2605 | "url": "https://feross.org/support" 2606 | } 2607 | ] 2608 | }, 2609 | "node_modules/react-is": { 2610 | "version": "16.13.1", 2611 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2612 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 2613 | "dev": true 2614 | }, 2615 | "node_modules/read-pkg": { 2616 | "version": "4.0.1", 2617 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", 2618 | "integrity": "sha512-+UBirHHDm5J+3WDmLBZYSklRYg82nMlz+enn+GMZ22nSR2f4bzxmhso6rzQW/3mT2PVzpzDTiYIZahk8UmZ44w==", 2619 | "dev": true, 2620 | "dependencies": { 2621 | "normalize-package-data": "^2.3.2", 2622 | "parse-json": "^4.0.0", 2623 | "pify": "^3.0.0" 2624 | }, 2625 | "engines": { 2626 | "node": ">=6" 2627 | } 2628 | }, 2629 | "node_modules/read-pkg-up": { 2630 | "version": "2.0.0", 2631 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 2632 | "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", 2633 | "dev": true, 2634 | "dependencies": { 2635 | "find-up": "^2.0.0", 2636 | "read-pkg": "^2.0.0" 2637 | }, 2638 | "engines": { 2639 | "node": ">=4" 2640 | } 2641 | }, 2642 | "node_modules/read-pkg-up/node_modules/load-json-file": { 2643 | "version": "2.0.0", 2644 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 2645 | "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", 2646 | "dev": true, 2647 | "dependencies": { 2648 | "graceful-fs": "^4.1.2", 2649 | "parse-json": "^2.2.0", 2650 | "pify": "^2.0.0", 2651 | "strip-bom": "^3.0.0" 2652 | }, 2653 | "engines": { 2654 | "node": ">=4" 2655 | } 2656 | }, 2657 | "node_modules/read-pkg-up/node_modules/parse-json": { 2658 | "version": "2.2.0", 2659 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 2660 | "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", 2661 | "dev": true, 2662 | "dependencies": { 2663 | "error-ex": "^1.2.0" 2664 | }, 2665 | "engines": { 2666 | "node": ">=0.10.0" 2667 | } 2668 | }, 2669 | "node_modules/read-pkg-up/node_modules/pify": { 2670 | "version": "2.3.0", 2671 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2672 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2673 | "dev": true, 2674 | "engines": { 2675 | "node": ">=0.10.0" 2676 | } 2677 | }, 2678 | "node_modules/read-pkg-up/node_modules/read-pkg": { 2679 | "version": "2.0.0", 2680 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 2681 | "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", 2682 | "dev": true, 2683 | "dependencies": { 2684 | "load-json-file": "^2.0.0", 2685 | "normalize-package-data": "^2.3.2", 2686 | "path-type": "^2.0.0" 2687 | }, 2688 | "engines": { 2689 | "node": ">=4" 2690 | } 2691 | }, 2692 | "node_modules/regexp.prototype.flags": { 2693 | "version": "1.5.1", 2694 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", 2695 | "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", 2696 | "dev": true, 2697 | "dependencies": { 2698 | "call-bind": "^1.0.2", 2699 | "define-properties": "^1.2.0", 2700 | "set-function-name": "^2.0.0" 2701 | }, 2702 | "engines": { 2703 | "node": ">= 0.4" 2704 | }, 2705 | "funding": { 2706 | "url": "https://github.com/sponsors/ljharb" 2707 | } 2708 | }, 2709 | "node_modules/regexpp": { 2710 | "version": "2.0.1", 2711 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 2712 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 2713 | "dev": true, 2714 | "engines": { 2715 | "node": ">=6.5.0" 2716 | } 2717 | }, 2718 | "node_modules/require-directory": { 2719 | "version": "2.1.1", 2720 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2721 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2722 | "dev": true, 2723 | "engines": { 2724 | "node": ">=0.10.0" 2725 | } 2726 | }, 2727 | "node_modules/require-main-filename": { 2728 | "version": "2.0.0", 2729 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2730 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 2731 | "dev": true 2732 | }, 2733 | "node_modules/require-uncached": { 2734 | "version": "1.0.3", 2735 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 2736 | "integrity": "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==", 2737 | "dev": true, 2738 | "dependencies": { 2739 | "caller-path": "^0.1.0", 2740 | "resolve-from": "^1.0.0" 2741 | }, 2742 | "engines": { 2743 | "node": ">=0.10.0" 2744 | } 2745 | }, 2746 | "node_modules/resolve": { 2747 | "version": "1.22.6", 2748 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", 2749 | "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", 2750 | "dev": true, 2751 | "dependencies": { 2752 | "is-core-module": "^2.13.0", 2753 | "path-parse": "^1.0.7", 2754 | "supports-preserve-symlinks-flag": "^1.0.0" 2755 | }, 2756 | "bin": { 2757 | "resolve": "bin/resolve" 2758 | }, 2759 | "funding": { 2760 | "url": "https://github.com/sponsors/ljharb" 2761 | } 2762 | }, 2763 | "node_modules/resolve-from": { 2764 | "version": "1.0.1", 2765 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 2766 | "integrity": "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==", 2767 | "dev": true, 2768 | "engines": { 2769 | "node": ">=0.10.0" 2770 | } 2771 | }, 2772 | "node_modules/restore-cursor": { 2773 | "version": "2.0.0", 2774 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2775 | "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", 2776 | "dev": true, 2777 | "dependencies": { 2778 | "onetime": "^2.0.0", 2779 | "signal-exit": "^3.0.2" 2780 | }, 2781 | "engines": { 2782 | "node": ">=4" 2783 | } 2784 | }, 2785 | "node_modules/rimraf": { 2786 | "version": "2.6.3", 2787 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2788 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2789 | "dev": true, 2790 | "dependencies": { 2791 | "glob": "^7.1.3" 2792 | }, 2793 | "bin": { 2794 | "rimraf": "bin.js" 2795 | } 2796 | }, 2797 | "node_modules/rimraf/node_modules/brace-expansion": { 2798 | "version": "1.1.11", 2799 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2800 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2801 | "dev": true, 2802 | "dependencies": { 2803 | "balanced-match": "^1.0.0", 2804 | "concat-map": "0.0.1" 2805 | } 2806 | }, 2807 | "node_modules/rimraf/node_modules/glob": { 2808 | "version": "7.2.3", 2809 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2810 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2811 | "dev": true, 2812 | "dependencies": { 2813 | "fs.realpath": "^1.0.0", 2814 | "inflight": "^1.0.4", 2815 | "inherits": "2", 2816 | "minimatch": "^3.1.1", 2817 | "once": "^1.3.0", 2818 | "path-is-absolute": "^1.0.0" 2819 | }, 2820 | "engines": { 2821 | "node": "*" 2822 | }, 2823 | "funding": { 2824 | "url": "https://github.com/sponsors/isaacs" 2825 | } 2826 | }, 2827 | "node_modules/rimraf/node_modules/minimatch": { 2828 | "version": "3.1.2", 2829 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2830 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2831 | "dev": true, 2832 | "dependencies": { 2833 | "brace-expansion": "^1.1.7" 2834 | }, 2835 | "engines": { 2836 | "node": "*" 2837 | } 2838 | }, 2839 | "node_modules/rollup": { 2840 | "version": "3.29.5", 2841 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", 2842 | "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", 2843 | "dev": true, 2844 | "license": "MIT", 2845 | "bin": { 2846 | "rollup": "dist/bin/rollup" 2847 | }, 2848 | "engines": { 2849 | "node": ">=14.18.0", 2850 | "npm": ">=8.0.0" 2851 | }, 2852 | "optionalDependencies": { 2853 | "fsevents": "~2.3.2" 2854 | } 2855 | }, 2856 | "node_modules/run-async": { 2857 | "version": "2.4.1", 2858 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 2859 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 2860 | "dev": true, 2861 | "engines": { 2862 | "node": ">=0.12.0" 2863 | } 2864 | }, 2865 | "node_modules/run-parallel": { 2866 | "version": "1.2.0", 2867 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2868 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2869 | "dev": true, 2870 | "funding": [ 2871 | { 2872 | "type": "github", 2873 | "url": "https://github.com/sponsors/feross" 2874 | }, 2875 | { 2876 | "type": "patreon", 2877 | "url": "https://www.patreon.com/feross" 2878 | }, 2879 | { 2880 | "type": "consulting", 2881 | "url": "https://feross.org/support" 2882 | } 2883 | ], 2884 | "dependencies": { 2885 | "queue-microtask": "^1.2.2" 2886 | } 2887 | }, 2888 | "node_modules/rxjs": { 2889 | "version": "6.6.7", 2890 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 2891 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 2892 | "dev": true, 2893 | "dependencies": { 2894 | "tslib": "^1.9.0" 2895 | }, 2896 | "engines": { 2897 | "npm": ">=2.0.0" 2898 | } 2899 | }, 2900 | "node_modules/safe-array-concat": { 2901 | "version": "1.0.1", 2902 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", 2903 | "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", 2904 | "dev": true, 2905 | "dependencies": { 2906 | "call-bind": "^1.0.2", 2907 | "get-intrinsic": "^1.2.1", 2908 | "has-symbols": "^1.0.3", 2909 | "isarray": "^2.0.5" 2910 | }, 2911 | "engines": { 2912 | "node": ">=0.4" 2913 | }, 2914 | "funding": { 2915 | "url": "https://github.com/sponsors/ljharb" 2916 | } 2917 | }, 2918 | "node_modules/safe-regex-test": { 2919 | "version": "1.0.0", 2920 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", 2921 | "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", 2922 | "dev": true, 2923 | "dependencies": { 2924 | "call-bind": "^1.0.2", 2925 | "get-intrinsic": "^1.1.3", 2926 | "is-regex": "^1.1.4" 2927 | }, 2928 | "funding": { 2929 | "url": "https://github.com/sponsors/ljharb" 2930 | } 2931 | }, 2932 | "node_modules/safer-buffer": { 2933 | "version": "2.1.2", 2934 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2935 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2936 | "dev": true 2937 | }, 2938 | "node_modules/semver": { 2939 | "version": "5.7.2", 2940 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 2941 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 2942 | "dev": true, 2943 | "bin": { 2944 | "semver": "bin/semver" 2945 | } 2946 | }, 2947 | "node_modules/set-blocking": { 2948 | "version": "2.0.0", 2949 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2950 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 2951 | "dev": true 2952 | }, 2953 | "node_modules/set-function-name": { 2954 | "version": "2.0.1", 2955 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", 2956 | "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", 2957 | "dev": true, 2958 | "dependencies": { 2959 | "define-data-property": "^1.0.1", 2960 | "functions-have-names": "^1.2.3", 2961 | "has-property-descriptors": "^1.0.0" 2962 | }, 2963 | "engines": { 2964 | "node": ">= 0.4" 2965 | } 2966 | }, 2967 | "node_modules/shebang-command": { 2968 | "version": "1.2.0", 2969 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2970 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", 2971 | "dev": true, 2972 | "dependencies": { 2973 | "shebang-regex": "^1.0.0" 2974 | }, 2975 | "engines": { 2976 | "node": ">=0.10.0" 2977 | } 2978 | }, 2979 | "node_modules/shebang-regex": { 2980 | "version": "1.0.0", 2981 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2982 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", 2983 | "dev": true, 2984 | "engines": { 2985 | "node": ">=0.10.0" 2986 | } 2987 | }, 2988 | "node_modules/side-channel": { 2989 | "version": "1.0.4", 2990 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2991 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2992 | "dev": true, 2993 | "dependencies": { 2994 | "call-bind": "^1.0.0", 2995 | "get-intrinsic": "^1.0.2", 2996 | "object-inspect": "^1.9.0" 2997 | }, 2998 | "funding": { 2999 | "url": "https://github.com/sponsors/ljharb" 3000 | } 3001 | }, 3002 | "node_modules/signal-exit": { 3003 | "version": "3.0.7", 3004 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3005 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 3006 | "dev": true 3007 | }, 3008 | "node_modules/slice-ansi": { 3009 | "version": "1.0.0", 3010 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 3011 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 3012 | "dev": true, 3013 | "dependencies": { 3014 | "is-fullwidth-code-point": "^2.0.0" 3015 | }, 3016 | "engines": { 3017 | "node": ">=4" 3018 | } 3019 | }, 3020 | "node_modules/spawn-command": { 3021 | "version": "0.0.2-1", 3022 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 3023 | "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", 3024 | "dev": true 3025 | }, 3026 | "node_modules/spdx-correct": { 3027 | "version": "3.2.0", 3028 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", 3029 | "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", 3030 | "dev": true, 3031 | "dependencies": { 3032 | "spdx-expression-parse": "^3.0.0", 3033 | "spdx-license-ids": "^3.0.0" 3034 | } 3035 | }, 3036 | "node_modules/spdx-exceptions": { 3037 | "version": "2.3.0", 3038 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 3039 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 3040 | "dev": true 3041 | }, 3042 | "node_modules/spdx-expression-parse": { 3043 | "version": "3.0.1", 3044 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 3045 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 3046 | "dev": true, 3047 | "dependencies": { 3048 | "spdx-exceptions": "^2.1.0", 3049 | "spdx-license-ids": "^3.0.0" 3050 | } 3051 | }, 3052 | "node_modules/spdx-license-ids": { 3053 | "version": "3.0.13", 3054 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", 3055 | "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", 3056 | "dev": true 3057 | }, 3058 | "node_modules/sprintf-js": { 3059 | "version": "1.0.3", 3060 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3061 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 3062 | "dev": true 3063 | }, 3064 | "node_modules/standard": { 3065 | "version": "12.0.1", 3066 | "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", 3067 | "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", 3068 | "dev": true, 3069 | "dependencies": { 3070 | "eslint": "~5.4.0", 3071 | "eslint-config-standard": "12.0.0", 3072 | "eslint-config-standard-jsx": "6.0.2", 3073 | "eslint-plugin-import": "~2.14.0", 3074 | "eslint-plugin-node": "~7.0.1", 3075 | "eslint-plugin-promise": "~4.0.0", 3076 | "eslint-plugin-react": "~7.11.1", 3077 | "eslint-plugin-standard": "~4.0.0", 3078 | "standard-engine": "~9.0.0" 3079 | }, 3080 | "bin": { 3081 | "standard": "bin/cmd.js" 3082 | }, 3083 | "engines": { 3084 | "node": ">=4" 3085 | } 3086 | }, 3087 | "node_modules/standard-engine": { 3088 | "version": "9.0.0", 3089 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", 3090 | "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", 3091 | "dev": true, 3092 | "dependencies": { 3093 | "deglob": "^2.1.0", 3094 | "get-stdin": "^6.0.0", 3095 | "minimist": "^1.1.0", 3096 | "pkg-conf": "^2.0.0" 3097 | } 3098 | }, 3099 | "node_modules/string-width": { 3100 | "version": "2.1.1", 3101 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 3102 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 3103 | "dev": true, 3104 | "dependencies": { 3105 | "is-fullwidth-code-point": "^2.0.0", 3106 | "strip-ansi": "^4.0.0" 3107 | }, 3108 | "engines": { 3109 | "node": ">=4" 3110 | } 3111 | }, 3112 | "node_modules/string.prototype.trim": { 3113 | "version": "1.2.8", 3114 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", 3115 | "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", 3116 | "dev": true, 3117 | "dependencies": { 3118 | "call-bind": "^1.0.2", 3119 | "define-properties": "^1.2.0", 3120 | "es-abstract": "^1.22.1" 3121 | }, 3122 | "engines": { 3123 | "node": ">= 0.4" 3124 | }, 3125 | "funding": { 3126 | "url": "https://github.com/sponsors/ljharb" 3127 | } 3128 | }, 3129 | "node_modules/string.prototype.trimend": { 3130 | "version": "1.0.7", 3131 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", 3132 | "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", 3133 | "dev": true, 3134 | "dependencies": { 3135 | "call-bind": "^1.0.2", 3136 | "define-properties": "^1.2.0", 3137 | "es-abstract": "^1.22.1" 3138 | }, 3139 | "funding": { 3140 | "url": "https://github.com/sponsors/ljharb" 3141 | } 3142 | }, 3143 | "node_modules/string.prototype.trimstart": { 3144 | "version": "1.0.7", 3145 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", 3146 | "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", 3147 | "dev": true, 3148 | "dependencies": { 3149 | "call-bind": "^1.0.2", 3150 | "define-properties": "^1.2.0", 3151 | "es-abstract": "^1.22.1" 3152 | }, 3153 | "funding": { 3154 | "url": "https://github.com/sponsors/ljharb" 3155 | } 3156 | }, 3157 | "node_modules/strip-ansi": { 3158 | "version": "4.0.0", 3159 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 3160 | "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", 3161 | "dev": true, 3162 | "dependencies": { 3163 | "ansi-regex": "^3.0.0" 3164 | }, 3165 | "engines": { 3166 | "node": ">=4" 3167 | } 3168 | }, 3169 | "node_modules/strip-bom": { 3170 | "version": "3.0.0", 3171 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 3172 | "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 3173 | "dev": true, 3174 | "engines": { 3175 | "node": ">=4" 3176 | } 3177 | }, 3178 | "node_modules/strip-json-comments": { 3179 | "version": "2.0.1", 3180 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3181 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 3182 | "dev": true, 3183 | "engines": { 3184 | "node": ">=0.10.0" 3185 | } 3186 | }, 3187 | "node_modules/supports-color": { 3188 | "version": "6.1.0", 3189 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 3190 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 3191 | "dev": true, 3192 | "dependencies": { 3193 | "has-flag": "^3.0.0" 3194 | }, 3195 | "engines": { 3196 | "node": ">=6" 3197 | } 3198 | }, 3199 | "node_modules/supports-preserve-symlinks-flag": { 3200 | "version": "1.0.0", 3201 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3202 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3203 | "dev": true, 3204 | "engines": { 3205 | "node": ">= 0.4" 3206 | }, 3207 | "funding": { 3208 | "url": "https://github.com/sponsors/ljharb" 3209 | } 3210 | }, 3211 | "node_modules/symbol-observable": { 3212 | "version": "1.0.1", 3213 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 3214 | "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", 3215 | "dev": true, 3216 | "engines": { 3217 | "node": ">=0.10.0" 3218 | } 3219 | }, 3220 | "node_modules/table": { 3221 | "version": "4.0.3", 3222 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", 3223 | "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", 3224 | "dev": true, 3225 | "dependencies": { 3226 | "ajv": "^6.0.1", 3227 | "ajv-keywords": "^3.0.0", 3228 | "chalk": "^2.1.0", 3229 | "lodash": "^4.17.4", 3230 | "slice-ansi": "1.0.0", 3231 | "string-width": "^2.1.1" 3232 | }, 3233 | "engines": { 3234 | "node": ">=4.0.0" 3235 | } 3236 | }, 3237 | "node_modules/text-table": { 3238 | "version": "0.2.0", 3239 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3240 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 3241 | "dev": true 3242 | }, 3243 | "node_modules/through": { 3244 | "version": "2.3.8", 3245 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3246 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 3247 | "dev": true 3248 | }, 3249 | "node_modules/tmp": { 3250 | "version": "0.0.33", 3251 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 3252 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 3253 | "dev": true, 3254 | "dependencies": { 3255 | "os-tmpdir": "~1.0.2" 3256 | }, 3257 | "engines": { 3258 | "node": ">=0.6.0" 3259 | } 3260 | }, 3261 | "node_modules/tree-kill": { 3262 | "version": "1.2.2", 3263 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 3264 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 3265 | "dev": true, 3266 | "bin": { 3267 | "tree-kill": "cli.js" 3268 | } 3269 | }, 3270 | "node_modules/tslib": { 3271 | "version": "1.14.1", 3272 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 3273 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 3274 | "dev": true 3275 | }, 3276 | "node_modules/type-check": { 3277 | "version": "0.3.2", 3278 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3279 | "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", 3280 | "dev": true, 3281 | "dependencies": { 3282 | "prelude-ls": "~1.1.2" 3283 | }, 3284 | "engines": { 3285 | "node": ">= 0.8.0" 3286 | } 3287 | }, 3288 | "node_modules/typed-array-buffer": { 3289 | "version": "1.0.0", 3290 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", 3291 | "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", 3292 | "dev": true, 3293 | "dependencies": { 3294 | "call-bind": "^1.0.2", 3295 | "get-intrinsic": "^1.2.1", 3296 | "is-typed-array": "^1.1.10" 3297 | }, 3298 | "engines": { 3299 | "node": ">= 0.4" 3300 | } 3301 | }, 3302 | "node_modules/typed-array-byte-length": { 3303 | "version": "1.0.0", 3304 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", 3305 | "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", 3306 | "dev": true, 3307 | "dependencies": { 3308 | "call-bind": "^1.0.2", 3309 | "for-each": "^0.3.3", 3310 | "has-proto": "^1.0.1", 3311 | "is-typed-array": "^1.1.10" 3312 | }, 3313 | "engines": { 3314 | "node": ">= 0.4" 3315 | }, 3316 | "funding": { 3317 | "url": "https://github.com/sponsors/ljharb" 3318 | } 3319 | }, 3320 | "node_modules/typed-array-byte-offset": { 3321 | "version": "1.0.0", 3322 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", 3323 | "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", 3324 | "dev": true, 3325 | "dependencies": { 3326 | "available-typed-arrays": "^1.0.5", 3327 | "call-bind": "^1.0.2", 3328 | "for-each": "^0.3.3", 3329 | "has-proto": "^1.0.1", 3330 | "is-typed-array": "^1.1.10" 3331 | }, 3332 | "engines": { 3333 | "node": ">= 0.4" 3334 | }, 3335 | "funding": { 3336 | "url": "https://github.com/sponsors/ljharb" 3337 | } 3338 | }, 3339 | "node_modules/typed-array-length": { 3340 | "version": "1.0.4", 3341 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", 3342 | "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", 3343 | "dev": true, 3344 | "dependencies": { 3345 | "call-bind": "^1.0.2", 3346 | "for-each": "^0.3.3", 3347 | "is-typed-array": "^1.1.9" 3348 | }, 3349 | "funding": { 3350 | "url": "https://github.com/sponsors/ljharb" 3351 | } 3352 | }, 3353 | "node_modules/typescript": { 3354 | "version": "5.8.3", 3355 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 3356 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 3357 | "dev": true, 3358 | "license": "Apache-2.0", 3359 | "bin": { 3360 | "tsc": "bin/tsc", 3361 | "tsserver": "bin/tsserver" 3362 | }, 3363 | "engines": { 3364 | "node": ">=14.17" 3365 | } 3366 | }, 3367 | "node_modules/unbox-primitive": { 3368 | "version": "1.0.2", 3369 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 3370 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 3371 | "dev": true, 3372 | "dependencies": { 3373 | "call-bind": "^1.0.2", 3374 | "has-bigints": "^1.0.2", 3375 | "has-symbols": "^1.0.3", 3376 | "which-boxed-primitive": "^1.0.2" 3377 | }, 3378 | "funding": { 3379 | "url": "https://github.com/sponsors/ljharb" 3380 | } 3381 | }, 3382 | "node_modules/uniq": { 3383 | "version": "1.0.1", 3384 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 3385 | "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", 3386 | "dev": true 3387 | }, 3388 | "node_modules/uri-js": { 3389 | "version": "4.4.1", 3390 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3391 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3392 | "dev": true, 3393 | "dependencies": { 3394 | "punycode": "^2.1.0" 3395 | } 3396 | }, 3397 | "node_modules/validate-npm-package-license": { 3398 | "version": "3.0.4", 3399 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 3400 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 3401 | "dev": true, 3402 | "dependencies": { 3403 | "spdx-correct": "^3.0.0", 3404 | "spdx-expression-parse": "^3.0.0" 3405 | } 3406 | }, 3407 | "node_modules/which": { 3408 | "version": "1.3.1", 3409 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3410 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3411 | "dev": true, 3412 | "dependencies": { 3413 | "isexe": "^2.0.0" 3414 | }, 3415 | "bin": { 3416 | "which": "bin/which" 3417 | } 3418 | }, 3419 | "node_modules/which-boxed-primitive": { 3420 | "version": "1.0.2", 3421 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 3422 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 3423 | "dev": true, 3424 | "dependencies": { 3425 | "is-bigint": "^1.0.1", 3426 | "is-boolean-object": "^1.1.0", 3427 | "is-number-object": "^1.0.4", 3428 | "is-string": "^1.0.5", 3429 | "is-symbol": "^1.0.3" 3430 | }, 3431 | "funding": { 3432 | "url": "https://github.com/sponsors/ljharb" 3433 | } 3434 | }, 3435 | "node_modules/which-module": { 3436 | "version": "2.0.1", 3437 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", 3438 | "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", 3439 | "dev": true 3440 | }, 3441 | "node_modules/which-typed-array": { 3442 | "version": "1.1.11", 3443 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", 3444 | "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", 3445 | "dev": true, 3446 | "dependencies": { 3447 | "available-typed-arrays": "^1.0.5", 3448 | "call-bind": "^1.0.2", 3449 | "for-each": "^0.3.3", 3450 | "gopd": "^1.0.1", 3451 | "has-tostringtag": "^1.0.0" 3452 | }, 3453 | "engines": { 3454 | "node": ">= 0.4" 3455 | }, 3456 | "funding": { 3457 | "url": "https://github.com/sponsors/ljharb" 3458 | } 3459 | }, 3460 | "node_modules/word-wrap": { 3461 | "version": "1.2.5", 3462 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 3463 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 3464 | "dev": true, 3465 | "engines": { 3466 | "node": ">=0.10.0" 3467 | } 3468 | }, 3469 | "node_modules/wrap-ansi": { 3470 | "version": "5.1.0", 3471 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 3472 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 3473 | "dev": true, 3474 | "dependencies": { 3475 | "ansi-styles": "^3.2.0", 3476 | "string-width": "^3.0.0", 3477 | "strip-ansi": "^5.0.0" 3478 | }, 3479 | "engines": { 3480 | "node": ">=6" 3481 | } 3482 | }, 3483 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 3484 | "version": "4.1.1", 3485 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 3486 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 3487 | "dev": true, 3488 | "engines": { 3489 | "node": ">=6" 3490 | } 3491 | }, 3492 | "node_modules/wrap-ansi/node_modules/string-width": { 3493 | "version": "3.1.0", 3494 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 3495 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 3496 | "dev": true, 3497 | "dependencies": { 3498 | "emoji-regex": "^7.0.1", 3499 | "is-fullwidth-code-point": "^2.0.0", 3500 | "strip-ansi": "^5.1.0" 3501 | }, 3502 | "engines": { 3503 | "node": ">=6" 3504 | } 3505 | }, 3506 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 3507 | "version": "5.2.0", 3508 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 3509 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 3510 | "dev": true, 3511 | "dependencies": { 3512 | "ansi-regex": "^4.1.0" 3513 | }, 3514 | "engines": { 3515 | "node": ">=6" 3516 | } 3517 | }, 3518 | "node_modules/wrappy": { 3519 | "version": "1.0.2", 3520 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3521 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3522 | "dev": true 3523 | }, 3524 | "node_modules/write": { 3525 | "version": "0.2.1", 3526 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 3527 | "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", 3528 | "dev": true, 3529 | "dependencies": { 3530 | "mkdirp": "^0.5.1" 3531 | }, 3532 | "engines": { 3533 | "node": ">=0.10.0" 3534 | } 3535 | }, 3536 | "node_modules/xtend": { 3537 | "version": "4.0.2", 3538 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3539 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3540 | "dev": true, 3541 | "engines": { 3542 | "node": ">=0.4" 3543 | } 3544 | }, 3545 | "node_modules/y18n": { 3546 | "version": "4.0.3", 3547 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 3548 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", 3549 | "dev": true 3550 | }, 3551 | "node_modules/yargs": { 3552 | "version": "13.3.2", 3553 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 3554 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 3555 | "dev": true, 3556 | "dependencies": { 3557 | "cliui": "^5.0.0", 3558 | "find-up": "^3.0.0", 3559 | "get-caller-file": "^2.0.1", 3560 | "require-directory": "^2.1.1", 3561 | "require-main-filename": "^2.0.0", 3562 | "set-blocking": "^2.0.0", 3563 | "string-width": "^3.0.0", 3564 | "which-module": "^2.0.0", 3565 | "y18n": "^4.0.0", 3566 | "yargs-parser": "^13.1.2" 3567 | } 3568 | }, 3569 | "node_modules/yargs-parser": { 3570 | "version": "13.1.2", 3571 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 3572 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 3573 | "dev": true, 3574 | "dependencies": { 3575 | "camelcase": "^5.0.0", 3576 | "decamelize": "^1.2.0" 3577 | } 3578 | }, 3579 | "node_modules/yargs/node_modules/ansi-regex": { 3580 | "version": "4.1.1", 3581 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 3582 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 3583 | "dev": true, 3584 | "engines": { 3585 | "node": ">=6" 3586 | } 3587 | }, 3588 | "node_modules/yargs/node_modules/find-up": { 3589 | "version": "3.0.0", 3590 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 3591 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 3592 | "dev": true, 3593 | "dependencies": { 3594 | "locate-path": "^3.0.0" 3595 | }, 3596 | "engines": { 3597 | "node": ">=6" 3598 | } 3599 | }, 3600 | "node_modules/yargs/node_modules/locate-path": { 3601 | "version": "3.0.0", 3602 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 3603 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 3604 | "dev": true, 3605 | "dependencies": { 3606 | "p-locate": "^3.0.0", 3607 | "path-exists": "^3.0.0" 3608 | }, 3609 | "engines": { 3610 | "node": ">=6" 3611 | } 3612 | }, 3613 | "node_modules/yargs/node_modules/p-limit": { 3614 | "version": "2.3.0", 3615 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 3616 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 3617 | "dev": true, 3618 | "dependencies": { 3619 | "p-try": "^2.0.0" 3620 | }, 3621 | "engines": { 3622 | "node": ">=6" 3623 | }, 3624 | "funding": { 3625 | "url": "https://github.com/sponsors/sindresorhus" 3626 | } 3627 | }, 3628 | "node_modules/yargs/node_modules/p-locate": { 3629 | "version": "3.0.0", 3630 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 3631 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 3632 | "dev": true, 3633 | "dependencies": { 3634 | "p-limit": "^2.0.0" 3635 | }, 3636 | "engines": { 3637 | "node": ">=6" 3638 | } 3639 | }, 3640 | "node_modules/yargs/node_modules/p-try": { 3641 | "version": "2.2.0", 3642 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 3643 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 3644 | "dev": true, 3645 | "engines": { 3646 | "node": ">=6" 3647 | } 3648 | }, 3649 | "node_modules/yargs/node_modules/string-width": { 3650 | "version": "3.1.0", 3651 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 3652 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 3653 | "dev": true, 3654 | "dependencies": { 3655 | "emoji-regex": "^7.0.1", 3656 | "is-fullwidth-code-point": "^2.0.0", 3657 | "strip-ansi": "^5.1.0" 3658 | }, 3659 | "engines": { 3660 | "node": ">=6" 3661 | } 3662 | }, 3663 | "node_modules/yargs/node_modules/strip-ansi": { 3664 | "version": "5.2.0", 3665 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 3666 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 3667 | "dev": true, 3668 | "dependencies": { 3669 | "ansi-regex": "^4.1.0" 3670 | }, 3671 | "engines": { 3672 | "node": ">=6" 3673 | } 3674 | }, 3675 | "node_modules/yjs": { 3676 | "version": "13.6.26", 3677 | "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.26.tgz", 3678 | "integrity": "sha512-wiARO3wixu7mtoRP5f7LqpUtsURP9SmNgXUt3RlnZg4qDuF7dUjthwIvwxIDmK55dPw4Wl4QdW5A3ag0atwu7g==", 3679 | "dev": true, 3680 | "license": "MIT", 3681 | "dependencies": { 3682 | "lib0": "^0.2.99" 3683 | }, 3684 | "engines": { 3685 | "node": ">=16.0.0", 3686 | "npm": ">=8.0.0" 3687 | }, 3688 | "funding": { 3689 | "type": "GitHub Sponsors ❤", 3690 | "url": "https://github.com/sponsors/dmonad" 3691 | } 3692 | } 3693 | } 3694 | } 3695 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@y/protocols", 3 | "version": "1.0.6-1", 4 | "description": "Yjs encoding protocols", 5 | "type": "module", 6 | "funding": { 7 | "type": "GitHub Sponsors ❤", 8 | "url": "https://github.com/sponsors/dmonad" 9 | }, 10 | "files": [ 11 | "dist/*", 12 | "auth.*", 13 | "sync.*", 14 | "awareness.*" 15 | ], 16 | "scripts": { 17 | "clean": "rm -rf dist *.d.ts */*.d.ts *.d.ts.map */*.d.ts.map", 18 | "dist": "rm -rf dist && rollup -c", 19 | "test": "npm run lint && npm run dist && node dist/test.cjs", 20 | "lint": "standard && tsc", 21 | "types": "tsc --outDir .", 22 | "debug": "rollup -c && concurrently 'rollup -wc' 'http-server -o test.html'", 23 | "preversion": "npm run dist && npm run test && npm run types", 24 | "postpublish": "npm run clean" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "git+https://github.com/yjs/y-protocols.git" 29 | }, 30 | "keywords": [ 31 | "Yjs" 32 | ], 33 | "author": "Kevin Jahns ", 34 | "license": "MIT", 35 | "standard": { 36 | "ignore": [ 37 | "/dist", 38 | "/node_modules" 39 | ] 40 | }, 41 | "bugs": { 42 | "url": "https://github.com/yjs/y-protocols/issues" 43 | }, 44 | "homepage": "https://github.com/yjs/y-protocols#readme", 45 | "exports": { 46 | "./package.json": "./package.json", 47 | "./sync.js": "./sync.js", 48 | "./dist/sync.cjs": "./dist/sync.cjs", 49 | "./sync": { 50 | "types": "./sync.d.ts", 51 | "module": "./sync.js", 52 | "import": "./sync.js", 53 | "require": "./dist/sync.cjs" 54 | }, 55 | "./awareness.js": "./awareness.js", 56 | "./dist/awareness.cjs": "./dist/awareness.cjs", 57 | "./awareness": { 58 | "types": "./awareness.d.ts", 59 | "module": "./awareness.js", 60 | "import": "./awareness.js", 61 | "require": "./dist/awareness.cjs" 62 | }, 63 | "./auth.js": "./auth.js", 64 | "./dist/auth.cjs": "./dist/auth.cjs", 65 | "./auth": { 66 | "types": "./auth.d.ts", 67 | "module": "./auth.js", 68 | "import": "./auth.js", 69 | "require": "./dist/auth.cjs" 70 | } 71 | }, 72 | "dependencies": { 73 | "lib0": "^0.2.85" 74 | }, 75 | "devDependencies": { 76 | "@rollup/plugin-commonjs": "^25.0.4", 77 | "@rollup/plugin-node-resolve": "^15.2.1", 78 | "@types/node": "^20.6.2", 79 | "concurrently": "^5.3.0", 80 | "rollup": "^3.29.2", 81 | "standard": "^12.0.1", 82 | "typescript": "^5.8.3", 83 | "yjs": "^13.6.26" 84 | }, 85 | "peerDependencies": { 86 | "yjs": "^14.0.0-1 || ^14 || ^13" 87 | }, 88 | "engines": { 89 | "npm": ">=8.0.0", 90 | "node": ">=16.0.0" 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import resolve from '@rollup/plugin-node-resolve' 2 | import commonjs from '@rollup/plugin-commonjs' 3 | 4 | const files = ['awareness.js', 'auth.js', 'sync.js', 'test.js'] 5 | 6 | export default [{ 7 | input: './test.js', 8 | output: { 9 | file: './dist/test.js', 10 | format: 'iife', 11 | sourcemap: true 12 | }, 13 | plugins: [ 14 | resolve({ mainFields: ['module', 'browser', 'main'] }), 15 | commonjs() 16 | ] 17 | }, { 18 | input: files, 19 | output: { 20 | dir: './dist', 21 | format: 'cjs', 22 | sourcemap: true, 23 | entryFileNames: '[name].cjs', 24 | chunkFileNames: '[name]-[hash].cjs', 25 | paths: /** @param {any} path */ path => { 26 | if (/^lib0\//.test(path)) { 27 | return `lib0/dist/${path.slice(5) + '.cjs'}` 28 | } 29 | return path 30 | } 31 | }, 32 | external: /** @param {any} id */ id => /^lib0\/|yjs/.test(id) 33 | }] 34 | -------------------------------------------------------------------------------- /sync.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module sync-protocol 3 | */ 4 | 5 | import * as encoding from 'lib0/encoding' 6 | import * as decoding from 'lib0/decoding' 7 | import * as Y from 'yjs' 8 | 9 | /** 10 | * @typedef {Map} StateMap 11 | */ 12 | 13 | /** 14 | * Core Yjs defines two message types: 15 | * • YjsSyncStep1: Includes the State Set of the sending client. When received, the client should reply with YjsSyncStep2. 16 | * • YjsSyncStep2: Includes all missing structs and the complete delete set. When received, the client is assured that it 17 | * received all information from the remote client. 18 | * 19 | * In a peer-to-peer network, you may want to introduce a SyncDone message type. Both parties should initiate the connection 20 | * with SyncStep1. When a client received SyncStep2, it should reply with SyncDone. When the local client received both 21 | * SyncStep2 and SyncDone, it is assured that it is synced to the remote client. 22 | * 23 | * In a client-server model, you want to handle this differently: The client should initiate the connection with SyncStep1. 24 | * When the server receives SyncStep1, it should reply with SyncStep2 immediately followed by SyncStep1. The client replies 25 | * with SyncStep2 when it receives SyncStep1. Optionally the server may send a SyncDone after it received SyncStep2, so the 26 | * client knows that the sync is finished. There are two reasons for this more elaborated sync model: 1. This protocol can 27 | * easily be implemented on top of http and websockets. 2. The server should only reply to requests, and not initiate them. 28 | * Therefore it is necessary that the client initiates the sync. 29 | * 30 | * Construction of a message: 31 | * [messageType : varUint, message definition..] 32 | * 33 | * Note: A message does not include information about the room name. This must to be handled by the upper layer protocol! 34 | * 35 | * stringify[messageType] stringifies a message definition (messageType is already read from the bufffer) 36 | */ 37 | 38 | export const messageYjsSyncStep1 = 0 39 | export const messageYjsSyncStep2 = 1 40 | export const messageYjsUpdate = 2 41 | 42 | /** 43 | * Create a sync step 1 message based on the state of the current shared document. 44 | * 45 | * @param {encoding.Encoder} encoder 46 | * @param {Y.Doc} doc 47 | */ 48 | export const writeSyncStep1 = (encoder, doc) => { 49 | encoding.writeVarUint(encoder, messageYjsSyncStep1) 50 | const sv = Y.encodeStateVector(doc) 51 | encoding.writeVarUint8Array(encoder, sv) 52 | } 53 | 54 | /** 55 | * @param {encoding.Encoder} encoder 56 | * @param {Y.Doc} doc 57 | * @param {Uint8Array} [encodedStateVector] 58 | */ 59 | export const writeSyncStep2 = (encoder, doc, encodedStateVector) => { 60 | encoding.writeVarUint(encoder, messageYjsSyncStep2) 61 | encoding.writeVarUint8Array(encoder, Y.encodeStateAsUpdate(doc, encodedStateVector)) 62 | } 63 | 64 | /** 65 | * Read SyncStep1 message and reply with SyncStep2. 66 | * 67 | * @param {decoding.Decoder} decoder The reply to the received message 68 | * @param {encoding.Encoder} encoder The received message 69 | * @param {Y.Doc} doc 70 | */ 71 | export const readSyncStep1 = (decoder, encoder, doc) => 72 | writeSyncStep2(encoder, doc, decoding.readVarUint8Array(decoder)) 73 | 74 | /** 75 | * Read and apply Structs and then DeleteStore to a y instance. 76 | * 77 | * @param {decoding.Decoder} decoder 78 | * @param {Y.Doc} doc 79 | * @param {any} transactionOrigin 80 | */ 81 | export const readSyncStep2 = (decoder, doc, transactionOrigin) => { 82 | try { 83 | Y.applyUpdate(doc, decoding.readVarUint8Array(decoder), transactionOrigin) 84 | } catch (error) { 85 | // This catches errors that are thrown by event handlers 86 | console.error('Caught error while handling a Yjs update', error) 87 | } 88 | } 89 | 90 | /** 91 | * @param {encoding.Encoder} encoder 92 | * @param {Uint8Array} update 93 | */ 94 | export const writeUpdate = (encoder, update) => { 95 | encoding.writeVarUint(encoder, messageYjsUpdate) 96 | encoding.writeVarUint8Array(encoder, update) 97 | } 98 | 99 | /** 100 | * Read and apply Structs and then DeleteStore to a y instance. 101 | * 102 | * @param {decoding.Decoder} decoder 103 | * @param {Y.Doc} doc 104 | * @param {any} transactionOrigin 105 | */ 106 | export const readUpdate = readSyncStep2 107 | 108 | /** 109 | * @param {decoding.Decoder} decoder A message received from another client 110 | * @param {encoding.Encoder} encoder The reply message. Does not need to be sent if empty. 111 | * @param {Y.Doc} doc 112 | * @param {any} transactionOrigin 113 | */ 114 | export const readSyncMessage = (decoder, encoder, doc, transactionOrigin) => { 115 | const messageType = decoding.readVarUint(decoder) 116 | switch (messageType) { 117 | case messageYjsSyncStep1: 118 | readSyncStep1(decoder, encoder, doc) 119 | break 120 | case messageYjsSyncStep2: 121 | readSyncStep2(decoder, doc, transactionOrigin) 122 | break 123 | case messageYjsUpdate: 124 | readUpdate(decoder, doc, transactionOrigin) 125 | break 126 | default: 127 | throw new Error('Unknown message type') 128 | } 129 | return messageType 130 | } 131 | -------------------------------------------------------------------------------- /test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Testing y-protocols 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | import { runTests } from 'lib0/testing' 2 | import * as log from 'lib0/logging' 3 | import * as awareness from './awareness.test.js' 4 | 5 | import { isBrowser, isNode } from 'lib0/environment' 6 | 7 | /* istanbul ignore if */ 8 | if (isBrowser) { 9 | log.createVConsole(document.body) 10 | } 11 | 12 | runTests({ 13 | awareness 14 | }).then(success => { 15 | /* istanbul ignore next */ 16 | if (isNode) { 17 | process.exit(success ? 0 : 1) 18 | } 19 | }) 20 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "es2018", 5 | "lib": ["es2018", "dom"], /* Specify library files to be included in the compilation. */ 6 | "allowJs": true, /* Allow javascript files to be compiled. */ 7 | "checkJs": true, /* Report errors in .js files. */ 8 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 9 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 10 | "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 11 | // "outFile": "./index.js", /* Concatenate and emit output to single file. */ 12 | "outDir": "dist", // this is overritten by `npm run types` 13 | "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 14 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 15 | "emitDeclarationOnly": true, 16 | "strict": true, 17 | "noImplicitAny": true, 18 | "moduleResolution": "node", 19 | "allowSyntheticDefaultImports": true 20 | }, 21 | "include": ["./*.js"], 22 | "exclude": ["./dist", "./node_modules"] 23 | } 24 | --------------------------------------------------------------------------------