├── .github └── workflows │ └── build.yml ├── .gitignore ├── .yarn └── releases │ └── yarn-3.1.1.cjs ├── .yarnrc.yml ├── LICENSE ├── README.md ├── package.json ├── src └── y-pojo.ts ├── test └── yjsdiff_test.js ├── tsconfig.json └── yarn.lock /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build JS 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | 11 | build: 12 | name: Build and test 13 | runs-on: ubuntu-20.04 14 | timeout-minutes: 15 15 | steps: 16 | - name: Check out code 17 | uses: actions/checkout@v2 18 | 19 | - name: Setup node 20 | uses: actions/setup-node@v3 21 | with: 22 | node-version: 16.13.1 23 | 24 | - name: Get yarn cache directory path 25 | id: yarn-cache-dir-path 26 | run: echo "::set-output name=dir::$(yarn config get cacheFolder)" 27 | 28 | - name: Cache yarn dependencies 29 | uses: actions/cache@v2 30 | id: yarn-cache 31 | with: 32 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 33 | key: yarn-cache-folder-${{ hashFiles('**/yarn.lock', 'frontend/.yarnrc.yml') }} 34 | restore-keys: | 35 | yarn-cache-folder- 36 | 37 | - name: Install dependencies 38 | run: yarn install --immutable 39 | 40 | - name: Test 41 | run: yarn test 42 | 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | .yarn/* 4 | !.yarn/patches 5 | !.yarn/releases 6 | !.yarn/plugins 7 | !.yarn/sdks 8 | !.yarn/versions 9 | .pnp.* 10 | .DS_Store 11 | 12 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | 3 | yarnPath: .yarn/releases/yarn-3.1.1.cjs 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 boourns 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # y-pojo 2 | 3 | Syncronize a YJS document to/from a plain old javascript object 4 | 5 | This library enables multiple users to share state in the form of a Plain ol' Javascript object (POJO), by mapping changes on the POJO into a Y.Map, and mapping Y.Map changes back into a new copy of the POJO (via `yMap.toJSON`). 6 | 7 | It supports regular, simple, javascript objects (called a `Record` in Typescript). It supports objects, arrays, and other simple types that can be JSON marshalled. 8 | 9 | It contains two methods, `syncronize` and `deepEquals`. Call `syncronize(yMap, pojo)` to compare the current state of a YJS map to the state of the POJO, and apply the required changes to the YJS map to make it equal to the same value as the pojo. It assumes your network layer is registered with the YJS document to capture and communicate these updates to the other users. 10 | 11 | When a remote user has updated the YJS document, simple call `yMap.toJSON()` to get the new copy of the POJO on the other clients. 12 | 13 | # Example 14 | 15 | ```javascript 16 | import {syncronize} from "y-pojo" 17 | import * as Y from 'yjs' 18 | 19 | let doc1 = new Y.Doc() 20 | let root = doc1.getMap("r") 21 | let targetObject = { 22 | name: "Tom", 23 | count: 42, 24 | pets: [{"name": "Jerry"}, {"name": "Bob"}] 25 | } 26 | syncronize(root, targetObject) 27 | console.log(JSON.stringify(root.toJSON())) // {"name":"Tom","count":42,"pets":[{"name":"Jerry"},{"name":"Bob"}]} 28 | 29 | let updatedTargetObject = { 30 | name: "Tom", 31 | count: 42, 32 | pets: [{"name": "Jerry"}, {"name": "Bob"}, {"name": "Carol"}] 33 | } 34 | 35 | syncronize(root, updatedTargetObject) 36 | console.log(JSON.stringify(root.toJSON())) // {"name":"Tom","count":42,"pets":[{"name":"Jerry"},{"name":"Bob"},{"name":"Carol"}]} 37 | ``` 38 | 39 | # Limitations 40 | - It won't work with Regex, or Date, or other classes. 41 | - strings within the javascript object are not represented as Y.Text and deep compared - they are static strings that get replaced when edited. So it would be better to use Y.Text directly for text document editing. 42 | - 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "y-pojo", 3 | "version": "0.0.8", 4 | "description": "Syncronize a YJS document to/from a plain old javascript object", 5 | "main": "dist/y-pojo.js", 6 | "types": "dist/y-pojo.d.ts", 7 | "type": "module", 8 | "scripts": { 9 | "build": "./node_modules/.bin/tsc", 10 | "prepack": "yarn build", 11 | "test": "yarn build && ./node_modules/.bin/mocha" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+ssh://git@github.com/boourns/y-pojo.git" 16 | }, 17 | "keywords": [ 18 | "yjs", 19 | "crdt" 20 | ], 21 | "author": "Tom Burns", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/boourns/y-pojo/issues" 25 | }, 26 | "homepage": "https://github.com/boourns/y-pojo#readme", 27 | "packageManager": "yarn@3.1.1", 28 | "peerDependencies": { 29 | "yjs": "^13.5.38" 30 | }, 31 | "devDependencies": { 32 | "mocha": "^10.0.0", 33 | "typescript": "^4.0.5", 34 | "yjs": "^13.5.38" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/y-pojo.ts: -------------------------------------------------------------------------------- 1 | import * as Y from "yjs"; 2 | 3 | type managedType = Y.Map | Y.Array | string | number 4 | type supportedType = object | string | number 5 | 6 | export function deepEquals(managed: managedType, target: supportedType | supportedType[]): boolean { 7 | const managedType = detectManagedType(managed) 8 | 9 | try { 10 | var targetType = target.constructor.name 11 | } catch (e) { 12 | targetType = "undefined" 13 | } 14 | 15 | if (managedType == "YArray" && targetType == "Array") { 16 | const targetArray = (target as Array) 17 | const managedArray = (managed as Y.Array) 18 | 19 | const result = managedArray.length == targetArray.length && targetArray.every((t, i) => deepEquals(managedArray.get(i), targetArray[i])) 20 | return result 21 | } else if (managedType == "YMap" && targetType == "Object") { 22 | const targetMap = (target as Record) 23 | const managedMap = (managed as Y.Map) 24 | 25 | let targetKeyCount = 0 26 | for (let targetKey in targetMap) { 27 | targetKeyCount++ 28 | if (!deepEquals(managedMap.get(targetKey), targetMap[targetKey])) { 29 | return false 30 | } 31 | } 32 | return targetKeyCount == Array.from(managedMap.keys()).length 33 | } else { 34 | return target === managed 35 | } 36 | } 37 | 38 | export function syncronize( 39 | managedObj: Y.Map | Y.Array, 40 | targetObj: Record | any[], 41 | ): boolean { 42 | 43 | let changed = false 44 | 45 | const managedType = detectManagedType(managedObj) 46 | 47 | switch (managedType) { 48 | case "YArray": 49 | if (!Array.isArray(targetObj)) { 50 | throw new Error(`Sync failed, ${targetObj} was not array`) 51 | } 52 | 53 | const managedArray = managedObj as Y.Array 54 | const targetArray = targetObj as any[] 55 | const outOfRange = Symbol() 56 | 57 | let cursor = 0 58 | for (let i = 0; i < targetArray.length; i++) { 59 | let match = false 60 | const targetValue = targetArray[i] 61 | const len = (managedArray.length > targetArray.length) ? managedArray.length : targetArray.length 62 | for (let j = cursor; !match && j < len; j++) { 63 | const managedValue = (j < managedArray.length) ? managedArray.get(j) : outOfRange 64 | const targetValue = (i < targetArray.length) ? targetArray[i] : outOfRange 65 | 66 | if (deepEquals(managedValue, targetValue)) { 67 | for (let x = j-1; x >= cursor; x--) { 68 | changed = true 69 | managedArray.delete(x) 70 | } 71 | const deletedCount = j - cursor 72 | cursor = j+1 - deletedCount 73 | match = true 74 | } 75 | } 76 | if (!match) { 77 | try { 78 | var childType = targetValue.constructor.name 79 | } catch (e) { 80 | childType = "undefined" 81 | } 82 | const managedChild = (cursor < managedArray.length) ? managedArray.get(cursor) : "undefined" 83 | const managedType = detectManagedType(managedChild) 84 | 85 | // but if they're compatible types we should go deeper 86 | // there was no exact match in the list, so assume the immediately next object should be the match 87 | if ((managedType == "YMap" && childType == "Object") || 88 | (managedType == "YArray" && childType == "Array")) { 89 | syncronize(managedChild, targetValue) 90 | } else { 91 | managedArray.insert(cursor, [syncChild(targetValue)]) 92 | } 93 | 94 | cursor++ 95 | changed = true 96 | } 97 | } 98 | while (managedArray.length > targetArray.length) { 99 | changed = true 100 | managedArray.delete(targetArray.length) 101 | } 102 | 103 | break 104 | case "YMap": 105 | if (targetObj.constructor.name !== "Object") { 106 | throw new Error(`Sync failed, ${targetObj} was not object`) 107 | } 108 | 109 | const managedMap = managedObj as Y.Map 110 | const targetMap = targetObj as Record 111 | 112 | for (const key of managedMap.keys()) { 113 | if (!(key in targetObj)) { 114 | // item's been removed from target 115 | managedMap.delete(key) 116 | changed = true 117 | continue 118 | } 119 | const managedChild = managedMap.get(key) 120 | const targetChild = targetMap[key] 121 | 122 | const managedType = detectManagedType(managedChild) 123 | 124 | try { 125 | var childType = targetChild.constructor.name 126 | } catch (e) { 127 | childType = "undefined" 128 | } 129 | 130 | if ((managedType == "YMap" && childType !== "Object") || 131 | (managedType == "YArray" && childType !== "Array") || 132 | (!["YMap", "YArray"].includes(managedType) && managedType !== childType)) { 133 | // this item has fundamentally changed, delete the existing record and recreate it in second pass 134 | managedMap.delete(key) 135 | changed = true 136 | } else if (managedType == "YMap" || managedType == "YArray") { 137 | // they match in types, so go deeper 138 | const childChanged = syncronize(managedChild, targetChild) 139 | changed ||= childChanged 140 | } else { 141 | // they are not complex types so just assign it into the map 142 | if (managedChild !== targetChild) { 143 | managedMap.set(key, targetChild) 144 | changed = true 145 | } 146 | } 147 | } 148 | 149 | for (const key in targetMap) { 150 | if (!managedMap.has(key)) { 151 | const child = syncChild(targetMap[key]) 152 | 153 | managedMap.set(key, child) 154 | changed = true 155 | } 156 | } 157 | break 158 | default: 159 | throw new Error(`can only iterate over Y.Map and Y.Array, got ${managedObj}`) 160 | } 161 | return changed 162 | } 163 | 164 | function syncChild(child: any): any { 165 | try { 166 | var childType = child.constructor.name 167 | } catch (e) { 168 | childType = "undefined" 169 | } 170 | 171 | if (childType == "Array") { 172 | const arr = new Y.Array() 173 | 174 | syncronize(arr,child) 175 | return arr 176 | } else if (childType == "Object") { 177 | const map = new Y.Map() 178 | 179 | syncronize(map, child) 180 | return map 181 | } else { 182 | return child 183 | } 184 | } 185 | 186 | function detectManagedType(managed: any): string { 187 | try { 188 | if (managed.length !== undefined && managed.get !== undefined) { 189 | return "YArray" 190 | } else if (managed.keys !== undefined && managed.get !== undefined) { 191 | return "YMap" 192 | } else { 193 | return managed.constructor.name 194 | } 195 | } catch (e) { 196 | return "undefined" 197 | } 198 | } -------------------------------------------------------------------------------- /test/yjsdiff_test.js: -------------------------------------------------------------------------------- 1 | import assert, { deepStrictEqual } from "assert" 2 | import * as Y from "yjs" 3 | import {deepEquals, syncronize} from "../dist/y-pojo.js" 4 | 5 | describe("syncronize", () => { 6 | 7 | it("Applies basic additions on Y.Map", () => { 8 | const target = { 9 | name: "two" 10 | } 11 | 12 | const doc = new Y.Doc() 13 | const root = doc.getMap("root") 14 | 15 | const changed = syncronize(root, target) 16 | 17 | assert(root.get("name") == "two") 18 | assert(changed) 19 | }) 20 | 21 | it("Applies nested patches on Y.Map", () => { 22 | const target = { 23 | inner: { 24 | foo: "bar" 25 | } 26 | } 27 | 28 | const doc = new Y.Doc() 29 | const root = doc.getMap("root") 30 | 31 | const changed = syncronize(root, target) 32 | assert(changed) 33 | 34 | // @ts-ignore 35 | assert(root.get("inner").get("foo") == "bar") 36 | }) 37 | 38 | it("Detects removed keys on Y.Map", () => { 39 | const first = { 40 | inner: { 41 | foo: "bar" 42 | }, 43 | second: 123 44 | } 45 | const target = { 46 | second: 123 47 | } 48 | 49 | const doc = new Y.Doc() 50 | const root = doc.getMap("root") 51 | 52 | let changed = syncronize(root, first) 53 | assert(changed) 54 | 55 | changed = syncronize(root, target) 56 | assert(changed) 57 | 58 | // @ts-ignore 59 | assert(!root.has("inner")) 60 | assert(root.has("second")) 61 | assert(root.get("second") == 123) 62 | }) 63 | 64 | it("Does not change YJS doc when no changes in target", () => { 65 | const target = { 66 | inner: { 67 | foo: "bar" 68 | }, 69 | second: 123 70 | } 71 | const doc = new Y.Doc() 72 | const root = doc.getMap("root") 73 | 74 | let changed = syncronize(root, target) 75 | let sv1 = Y.encodeStateVector(doc) 76 | assert(changed) 77 | 78 | changed = syncronize(root, target) 79 | let sv2 = Y.encodeStateVector(doc) 80 | assert(!changed) 81 | 82 | deepStrictEqual(sv1, sv2) 83 | 84 | }) 85 | 86 | it ("syncronizes deleted items to Y.Array", () => { 87 | const target = { 88 | val: ["a", "b", "c"] 89 | } 90 | 91 | const doc = new Y.Doc() 92 | const root = doc.getMap("root") 93 | 94 | let changed = syncronize(root, { 95 | val: ["a", "b", "c"] 96 | }) 97 | assert(changed) 98 | 99 | changed = syncronize(root, { 100 | val: ["b", "c"] 101 | }) 102 | assert(changed) 103 | 104 | let arr = root.get("val") 105 | assert(arr.length == 2 && arr.get(0) == "b" && arr.get(1) == "c") 106 | }) 107 | 108 | it ("syncronizes added items to Y.Array", () => { 109 | const target = { 110 | val: ["a", "b", "c"] 111 | } 112 | 113 | const doc = new Y.Doc() 114 | const root = doc.getMap("root") 115 | 116 | let changed = syncronize(root, { 117 | val: ["a", "b", "c"] 118 | }) 119 | assert(changed) 120 | 121 | changed = syncronize(root, { 122 | val: ["d", "a", "b", "c"] 123 | }) 124 | assert(changed) 125 | 126 | let arr = root.get("val") 127 | assert(arr.length == 4 && arr.get(0) == "d" && arr.get(1) == "a" && arr.get(2) == "b" && arr.get(3) == "c") 128 | }) 129 | 130 | it ("detects changed items to Y.Array", () => { 131 | const target = { 132 | val: ["a", "b", "c"] 133 | } 134 | 135 | const doc = new Y.Doc() 136 | const root = doc.getMap("root") 137 | 138 | let changed = syncronize(root, { 139 | val: ["a", "b", "c"] 140 | }) 141 | assert(changed) 142 | 143 | changed = syncronize(root, { 144 | val: ["a", "x", "c"] 145 | }) 146 | assert(changed) 147 | 148 | let arr = root.get("val") 149 | assert(arr.length == 3 && arr.get(0) == "a" && arr.get(1) == "x" && arr.get(2) == "c") 150 | }) 151 | 152 | it ("detects changed items at end of Y.Array", () => { 153 | const target = { 154 | val: ["a", "b", "c"] 155 | } 156 | 157 | const doc = new Y.Doc() 158 | const root = doc.getMap("root") 159 | 160 | let changed = syncronize(root, { 161 | val: ["a", "b", "c"] 162 | }) 163 | assert(changed) 164 | 165 | changed = syncronize(root, { 166 | val: ["a", "b", "x"] 167 | }) 168 | assert(changed) 169 | 170 | let arr = root.get("val") 171 | assert(arr.length == 3 && arr.get(0) == "a" && arr.get(1) == "b" && arr.get(2) == "x") 172 | }) 173 | 174 | it ("detects added items at end of Y.Array", () => { 175 | const target = { 176 | val: ["a", "b", "c"] 177 | } 178 | 179 | const doc = new Y.Doc() 180 | const root = doc.getMap("root") 181 | 182 | let changed = syncronize(root, { 183 | val: ["a", "b", "c"] 184 | }) 185 | assert(changed) 186 | 187 | changed = syncronize(root, { 188 | val: ["a", "b", "c", "c"] 189 | }) 190 | assert(changed) 191 | 192 | let arr = root.get("val") 193 | assert(arr.length == 4 && arr.get(0) == "a" && arr.get(1) == "b" && arr.get(2) == "c" && arr.get(3) == "c") 194 | }) 195 | 196 | it ("detects removed complex items at end of Y.Array", () => { 197 | const target = { 198 | val: ["a", "b", "c"] 199 | } 200 | 201 | const doc = new Y.Doc() 202 | const root = doc.getMap("root") 203 | 204 | let changed = syncronize(root, { 205 | clips: [ 206 | { length: 96, notes: [], id: "fuxgvenru" }, 207 | { length: 96, notes: [], id: "znrwtur" }, 208 | { length: 96, notes: [], id: "znrwtur" } 209 | ] 210 | }) 211 | assert(changed) 212 | 213 | changed = syncronize(root, { 214 | clips: [ 215 | { length: 96, notes: [], id: "fuxgvenru" }, 216 | { length: 96, notes: [], id: "znrwtur" }, 217 | ] 218 | }) 219 | assert(changed) 220 | 221 | let arr = root.get("clips") 222 | assert(arr.length == 2) 223 | }) 224 | 225 | it ("does not append extra copies of complex items at end of Y.Array", () => { 226 | const target = { 227 | val: ["a", "b", "c"] 228 | } 229 | 230 | const doc = new Y.Doc() 231 | const root = doc.getMap("root") 232 | 233 | let changed = syncronize(root, { 234 | clips: [ 235 | { length: 96, notes: [], id: "fuxgvenru" }, 236 | { length: 96, notes: [], id: "znrwtur" }, 237 | ] 238 | }) 239 | let arr = root.get("clips") 240 | assert(arr.length == 2) 241 | assert(changed) 242 | 243 | changed = syncronize(root, { 244 | clips: [ 245 | { length: 96, notes: [], id: "fuxgvenru" }, 246 | { length: 96, notes: [], id: "znrwtur" }, 247 | ] 248 | }) 249 | assert(!changed) 250 | 251 | arr = root.get("clips") 252 | assert(arr.length == 2) 253 | }) 254 | 255 | it("Does not change YJS doc when no changes in target", () => { 256 | const target = { 257 | inner: [1, 2, 3], 258 | second: 123 259 | } 260 | const doc = new Y.Doc() 261 | const root = doc.getMap("root") 262 | 263 | let changed = syncronize(root, target) 264 | let sv1 = Y.encodeStateVector(doc) 265 | assert(changed) 266 | 267 | changed = syncronize(root, target) 268 | let sv2 = Y.encodeStateVector(doc) 269 | assert(!changed) 270 | 271 | deepStrictEqual(sv1, sv2) 272 | 273 | }) 274 | 275 | it("Does not recreate complex nested object when a child has changed", () => { 276 | const target = { 277 | inner: [ 278 | { 279 | "name": "tom", 280 | "count": 52 281 | }, 282 | { 283 | "name": "jerry", 284 | "count": 43 285 | } 286 | ] 287 | } 288 | 289 | const doc = new Y.Doc() 290 | const root = doc.getMap("root") 291 | 292 | let changed = syncronize(root, target) 293 | assert(changed) 294 | 295 | let el = root.get("inner").get(0) 296 | 297 | changed = syncronize(root, { 298 | inner: [ 299 | { 300 | "name": "tom", 301 | "count": 590 302 | }, 303 | { 304 | "name": "jerry", 305 | "count": 43 306 | } 307 | ] 308 | }) 309 | assert(changed) 310 | 311 | assert(el.get("count") == 590) 312 | }) 313 | 314 | it("Works even when managed class name changes", () => { 315 | class Blah extends Y.Map {} 316 | 317 | const target = { 318 | inner: [1, 2, 3], 319 | second: 123 320 | } 321 | const doc = new Y.Doc() 322 | 323 | const root = doc.get("root", Blah) 324 | 325 | let changed = syncronize(root, target) 326 | let sv1 = Y.encodeStateVector(doc) 327 | assert(changed) 328 | 329 | changed = syncronize(root, target) 330 | let sv2 = Y.encodeStateVector(doc) 331 | assert(!changed) 332 | 333 | deepStrictEqual(sv1, sv2) 334 | }) 335 | 336 | it("does not remove last item from long complex arrays", () => { 337 | const start = {"clips":[{"length":96,"notes":[],"id":"cacsslnhq"},{"length":96,"notes":[{"tick":6,"number":58,"duration":6,"velocity":100},{"tick":12,"number":58,"duration":6,"velocity":100},{"tick":18,"number":58,"duration":6,"velocity":100},{"tick":24,"number":58,"duration":6,"velocity":100},{"tick":30,"number":58,"duration":6,"velocity":100},{"tick":36,"number":59,"duration":6,"velocity":100},{"tick":42,"number":55,"duration":6,"velocity":100},{"tick":42,"number":58,"duration":6,"velocity":100},{"tick":48,"number":53,"duration":6,"velocity":100},{"tick":48,"number":59,"duration":6,"velocity":100}],"id":"poutonrzg"}]} 338 | const target = {"clips":[{"length":96,"notes":[],"id":"cacsslnhq"},{"length":96,"notes":[{"tick":12,"number":58,"duration":6,"velocity":100},{"tick":18,"number":58,"duration":6,"velocity":100},{"tick":24,"number":58,"duration":6,"velocity":100},{"tick":30,"number":58,"duration":6,"velocity":100},{"tick":36,"number":59,"duration":6,"velocity":100},{"tick":42,"number":55,"duration":6,"velocity":100},{"tick":42,"number":58,"duration":6,"velocity":100},{"tick":48,"number":53,"duration":6,"velocity":100},{"tick":48,"number":59,"duration":6,"velocity":100}],"id":"poutonrzg"}]} 339 | 340 | const doc = new Y.Doc() 341 | const root = doc.getMap("root") 342 | 343 | syncronize(root, start) 344 | deepStrictEqual(root.toJSON(), start) 345 | 346 | syncronize(root, target) 347 | 348 | const result = root.toJSON() 349 | 350 | deepStrictEqual(result, target) 351 | }) 352 | 353 | it("clears a long array properly", () => { 354 | const start = {"arr": ["a", "b", "c", "d", "e", "f", "g", "h", "i"]} 355 | const target = {"arr": []} 356 | 357 | const doc = new Y.Doc() 358 | const root = doc.getMap("root") 359 | 360 | syncronize(root, start) 361 | deepStrictEqual(root.toJSON(), start) 362 | 363 | syncronize(root, target) 364 | deepStrictEqual(root.toJSON(), target) 365 | }) 366 | 367 | it("syncronizes a deep complex object", () => { 368 | const start = {"params":{"paramState":{"parameterValues":{"cutoff":{"value":64},"res":{"value":0}}}},"definition":{"controlGroups":[{"label":"Controls","controls":[{"label":"Cutoff","id":"cutoff"},{"label":"Res","id":"res"}]}]}} 369 | const target = {"params":{"paramState":{"parameterValues":{"cutoff":{"value":64},"res":{"value":0},"cc55":{"value":100}}}},"definition":{"controlGroups":[{"label":"Controls","controls":[{"label":"Cutoff","id":"cutoff"},{"label":"Res","id":"res"},{"id":"cc55","label":"CC55"}]}]}} 370 | 371 | const doc = new Y.Doc() 372 | const root = doc.getMap("root") 373 | 374 | syncronize(root, start) 375 | deepStrictEqual(root.toJSON(), start) 376 | 377 | syncronize(root, target) 378 | 379 | deepStrictEqual(root.toJSON(), target) 380 | }) 381 | 382 | }) 383 | 384 | describe("deepEquals", () => { 385 | it("returns true when Y.Map matches object", () => { 386 | const target = { 387 | "foo": "bar", 388 | "a": "b", 389 | } 390 | 391 | const doc = new Y.Doc() 392 | const root = doc.getMap("root") 393 | root.set("foo", "bar") 394 | root.set("a", "b") 395 | 396 | assert(deepEquals(root, target)) 397 | }) 398 | 399 | it("returns false when Y.Map does not match object", () => { 400 | const target = { 401 | "foo": "zoo", 402 | "a": "b", 403 | } 404 | 405 | const doc = new Y.Doc() 406 | const root = doc.getMap("root") 407 | root.set("foo", "bar") 408 | root.set("a", "b") 409 | 410 | assert(!deepEquals(root, target)) 411 | }) 412 | 413 | it("returns false when Y.Map missing key in target", () => { 414 | const target = { 415 | "foo": "bar", 416 | "a": "b", 417 | } 418 | 419 | const doc = new Y.Doc() 420 | const root = doc.getMap("root") 421 | root.set("foo", "bar") 422 | 423 | assert(!deepEquals(root, target)) 424 | }) 425 | 426 | it("returns false when target missing key in Y.Map", () => { 427 | const target = { 428 | "foo": "bar", 429 | } 430 | 431 | const doc = new Y.Doc() 432 | const root = doc.getMap("root") 433 | root.set("foo", "bar") 434 | root.set("a", "b") 435 | 436 | assert(!deepEquals(root, target)) 437 | }) 438 | 439 | it("returns false when target undefined", () => { 440 | const doc = new Y.Doc() 441 | const root = doc.getMap("root") 442 | root.set("foo", "bar") 443 | 444 | assert(!deepEquals(root, undefined)) 445 | }) 446 | 447 | it("returns false when Y.Map undefined", () => { 448 | assert(!deepEquals(undefined, {"foo": "bar"})) 449 | }) 450 | 451 | it("returns true when Y.Array matches input array", () => { 452 | const target = ["a", "b", {"foo": "bar"}] 453 | 454 | const doc = new Y.Doc() 455 | const root = doc.getArray("root") 456 | 457 | const m = new Y.Map() 458 | m.set("foo", "bar") 459 | root.insert(0, ["a", "b", m]) 460 | 461 | assert(deepEquals(root, target)) 462 | }) 463 | 464 | it("returns false when Y.Array does not match input array", () => { 465 | const target = ["a", {"foo": "bar"}] 466 | 467 | const doc = new Y.Doc() 468 | const root = doc.getArray("root") 469 | 470 | const m = new Y.Map() 471 | m.set("foo", "bar") 472 | root.insert(0, ["a", "b", m]) 473 | 474 | assert(!deepEquals(root, target)) 475 | }) 476 | }) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "ES2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ 8 | "module": "ES2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 9 | "lib": ["ES2016", "DOM"], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "react", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "jsxFactory": "h", 14 | // "jsxFragmentFactory": "Fragment", 15 | 16 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 17 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 18 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 19 | //"outFile": "dist/index.js", /* Concatenate and emit output to single file. */ 20 | "outDir": "./dist", /* Redirect output structure to the directory. */ 21 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 22 | // "composite": true, /* Enable project compilation */ 23 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 24 | // "removeComments": true, /* Do not emit comments to output. */ 25 | // "noEmit": true, /* Do not emit outputs. */ 26 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 27 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 28 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 29 | 30 | /* Strict Type-Checking Options */ 31 | "strict": true, /* Enable all strict type-checking options. */ 32 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 33 | // "strictNullChecks": true, /* Enable strict null checks. */ 34 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 35 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 36 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 37 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 38 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 39 | 40 | /* Additional Checks */ 41 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 42 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 43 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 44 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 45 | 46 | /* Module Resolution Options */ 47 | "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 48 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 49 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 50 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 51 | // "typeRoots": [], /* List of folders to include type definitions from. */ 52 | // "types": [], /* Type declaration files to be included in compilation. */ 53 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 54 | // "esModuleInterop": false, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 55 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 56 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 57 | 58 | /* Source Map Options */ 59 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 61 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 62 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 63 | 64 | /* Experimental Options */ 65 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 66 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 67 | 68 | /* Advanced Options */ 69 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 70 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 71 | }, 72 | 73 | "include": ["src/**/*"] 74 | } 75 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 5 6 | cacheKey: 8 7 | 8 | "@gar/promisify@npm:^1.1.3": 9 | version: 1.1.3 10 | resolution: "@gar/promisify@npm:1.1.3" 11 | checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 12 | languageName: node 13 | linkType: hard 14 | 15 | "@npmcli/fs@npm:^2.1.0": 16 | version: 2.1.0 17 | resolution: "@npmcli/fs@npm:2.1.0" 18 | dependencies: 19 | "@gar/promisify": ^1.1.3 20 | semver: ^7.3.5 21 | checksum: 6ec6d678af6da49f9dac50cd882d7f661934dd278972ffbaacde40d9eaa2871292d634000a0cca9510f6fc29855fbd4af433e1adbff90a524ec3eaf140f1219b 22 | languageName: node 23 | linkType: hard 24 | 25 | "@npmcli/move-file@npm:^2.0.0": 26 | version: 2.0.0 27 | resolution: "@npmcli/move-file@npm:2.0.0" 28 | dependencies: 29 | mkdirp: ^1.0.4 30 | rimraf: ^3.0.2 31 | checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0 32 | languageName: node 33 | linkType: hard 34 | 35 | "@tootallnate/once@npm:2": 36 | version: 2.0.0 37 | resolution: "@tootallnate/once@npm:2.0.0" 38 | checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 39 | languageName: node 40 | linkType: hard 41 | 42 | "@ungap/promise-all-settled@npm:1.1.2": 43 | version: 1.1.2 44 | resolution: "@ungap/promise-all-settled@npm:1.1.2" 45 | checksum: 08d37fdfa23a6fe8139f1305313562ebad973f3fac01bcce2773b2bda5bcb0146dfdcf3cb6a722cf0a5f2ca0bc56a827eac8f1e7b3beddc548f654addf1fc34c 46 | languageName: node 47 | linkType: hard 48 | 49 | "abbrev@npm:1": 50 | version: 1.1.1 51 | resolution: "abbrev@npm:1.1.1" 52 | checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 53 | languageName: node 54 | linkType: hard 55 | 56 | "agent-base@npm:6, agent-base@npm:^6.0.2": 57 | version: 6.0.2 58 | resolution: "agent-base@npm:6.0.2" 59 | dependencies: 60 | debug: 4 61 | checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d 62 | languageName: node 63 | linkType: hard 64 | 65 | "agentkeepalive@npm:^4.2.1": 66 | version: 4.2.1 67 | resolution: "agentkeepalive@npm:4.2.1" 68 | dependencies: 69 | debug: ^4.1.0 70 | depd: ^1.1.2 71 | humanize-ms: ^1.2.1 72 | checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 73 | languageName: node 74 | linkType: hard 75 | 76 | "aggregate-error@npm:^3.0.0": 77 | version: 3.1.0 78 | resolution: "aggregate-error@npm:3.1.0" 79 | dependencies: 80 | clean-stack: ^2.0.0 81 | indent-string: ^4.0.0 82 | checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 83 | languageName: node 84 | linkType: hard 85 | 86 | "ansi-colors@npm:4.1.1": 87 | version: 4.1.1 88 | resolution: "ansi-colors@npm:4.1.1" 89 | checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 90 | languageName: node 91 | linkType: hard 92 | 93 | "ansi-regex@npm:^5.0.1": 94 | version: 5.0.1 95 | resolution: "ansi-regex@npm:5.0.1" 96 | checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b 97 | languageName: node 98 | linkType: hard 99 | 100 | "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": 101 | version: 4.3.0 102 | resolution: "ansi-styles@npm:4.3.0" 103 | dependencies: 104 | color-convert: ^2.0.1 105 | checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 106 | languageName: node 107 | linkType: hard 108 | 109 | "anymatch@npm:~3.1.2": 110 | version: 3.1.2 111 | resolution: "anymatch@npm:3.1.2" 112 | dependencies: 113 | normalize-path: ^3.0.0 114 | picomatch: ^2.0.4 115 | checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9 116 | languageName: node 117 | linkType: hard 118 | 119 | "aproba@npm:^1.0.3 || ^2.0.0": 120 | version: 2.0.0 121 | resolution: "aproba@npm:2.0.0" 122 | checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 123 | languageName: node 124 | linkType: hard 125 | 126 | "are-we-there-yet@npm:^3.0.0": 127 | version: 3.0.0 128 | resolution: "are-we-there-yet@npm:3.0.0" 129 | dependencies: 130 | delegates: ^1.0.0 131 | readable-stream: ^3.6.0 132 | checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981 133 | languageName: node 134 | linkType: hard 135 | 136 | "argparse@npm:^2.0.1": 137 | version: 2.0.1 138 | resolution: "argparse@npm:2.0.1" 139 | checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced 140 | languageName: node 141 | linkType: hard 142 | 143 | "balanced-match@npm:^1.0.0": 144 | version: 1.0.2 145 | resolution: "balanced-match@npm:1.0.2" 146 | checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 147 | languageName: node 148 | linkType: hard 149 | 150 | "binary-extensions@npm:^2.0.0": 151 | version: 2.2.0 152 | resolution: "binary-extensions@npm:2.2.0" 153 | checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 154 | languageName: node 155 | linkType: hard 156 | 157 | "brace-expansion@npm:^1.1.7": 158 | version: 1.1.11 159 | resolution: "brace-expansion@npm:1.1.11" 160 | dependencies: 161 | balanced-match: ^1.0.0 162 | concat-map: 0.0.1 163 | checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 164 | languageName: node 165 | linkType: hard 166 | 167 | "brace-expansion@npm:^2.0.1": 168 | version: 2.0.1 169 | resolution: "brace-expansion@npm:2.0.1" 170 | dependencies: 171 | balanced-match: ^1.0.0 172 | checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 173 | languageName: node 174 | linkType: hard 175 | 176 | "braces@npm:~3.0.2": 177 | version: 3.0.2 178 | resolution: "braces@npm:3.0.2" 179 | dependencies: 180 | fill-range: ^7.0.1 181 | checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 182 | languageName: node 183 | linkType: hard 184 | 185 | "browser-stdout@npm:1.3.1": 186 | version: 1.3.1 187 | resolution: "browser-stdout@npm:1.3.1" 188 | checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 189 | languageName: node 190 | linkType: hard 191 | 192 | "cacache@npm:^16.1.0": 193 | version: 16.1.0 194 | resolution: "cacache@npm:16.1.0" 195 | dependencies: 196 | "@npmcli/fs": ^2.1.0 197 | "@npmcli/move-file": ^2.0.0 198 | chownr: ^2.0.0 199 | fs-minipass: ^2.1.0 200 | glob: ^8.0.1 201 | infer-owner: ^1.0.4 202 | lru-cache: ^7.7.1 203 | minipass: ^3.1.6 204 | minipass-collect: ^1.0.2 205 | minipass-flush: ^1.0.5 206 | minipass-pipeline: ^1.2.4 207 | mkdirp: ^1.0.4 208 | p-map: ^4.0.0 209 | promise-inflight: ^1.0.1 210 | rimraf: ^3.0.2 211 | ssri: ^9.0.0 212 | tar: ^6.1.11 213 | unique-filename: ^1.1.1 214 | checksum: ddfcf92f079f24ccecef4e2ca1e4428443787b61429b921803b020fd0f33d9ac829ac47837b74b40868d8ae4f1b2ed82e164cdaa5508fbd790eee005a9d88469 215 | languageName: node 216 | linkType: hard 217 | 218 | "camelcase@npm:^6.0.0": 219 | version: 6.3.0 220 | resolution: "camelcase@npm:6.3.0" 221 | checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d 222 | languageName: node 223 | linkType: hard 224 | 225 | "chalk@npm:^4.1.0": 226 | version: 4.1.2 227 | resolution: "chalk@npm:4.1.2" 228 | dependencies: 229 | ansi-styles: ^4.1.0 230 | supports-color: ^7.1.0 231 | checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc 232 | languageName: node 233 | linkType: hard 234 | 235 | "chokidar@npm:3.5.3": 236 | version: 3.5.3 237 | resolution: "chokidar@npm:3.5.3" 238 | dependencies: 239 | anymatch: ~3.1.2 240 | braces: ~3.0.2 241 | fsevents: ~2.3.2 242 | glob-parent: ~5.1.2 243 | is-binary-path: ~2.1.0 244 | is-glob: ~4.0.1 245 | normalize-path: ~3.0.0 246 | readdirp: ~3.6.0 247 | dependenciesMeta: 248 | fsevents: 249 | optional: true 250 | checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c 251 | languageName: node 252 | linkType: hard 253 | 254 | "chownr@npm:^2.0.0": 255 | version: 2.0.0 256 | resolution: "chownr@npm:2.0.0" 257 | checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f 258 | languageName: node 259 | linkType: hard 260 | 261 | "clean-stack@npm:^2.0.0": 262 | version: 2.2.0 263 | resolution: "clean-stack@npm:2.2.0" 264 | checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 265 | languageName: node 266 | linkType: hard 267 | 268 | "cliui@npm:^7.0.2": 269 | version: 7.0.4 270 | resolution: "cliui@npm:7.0.4" 271 | dependencies: 272 | string-width: ^4.2.0 273 | strip-ansi: ^6.0.0 274 | wrap-ansi: ^7.0.0 275 | checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f 276 | languageName: node 277 | linkType: hard 278 | 279 | "color-convert@npm:^2.0.1": 280 | version: 2.0.1 281 | resolution: "color-convert@npm:2.0.1" 282 | dependencies: 283 | color-name: ~1.1.4 284 | checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 285 | languageName: node 286 | linkType: hard 287 | 288 | "color-name@npm:~1.1.4": 289 | version: 1.1.4 290 | resolution: "color-name@npm:1.1.4" 291 | checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 292 | languageName: node 293 | linkType: hard 294 | 295 | "color-support@npm:^1.1.3": 296 | version: 1.1.3 297 | resolution: "color-support@npm:1.1.3" 298 | bin: 299 | color-support: bin.js 300 | checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b 301 | languageName: node 302 | linkType: hard 303 | 304 | "concat-map@npm:0.0.1": 305 | version: 0.0.1 306 | resolution: "concat-map@npm:0.0.1" 307 | checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af 308 | languageName: node 309 | linkType: hard 310 | 311 | "console-control-strings@npm:^1.1.0": 312 | version: 1.1.0 313 | resolution: "console-control-strings@npm:1.1.0" 314 | checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed 315 | languageName: node 316 | linkType: hard 317 | 318 | "debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.3.3": 319 | version: 4.3.4 320 | resolution: "debug@npm:4.3.4" 321 | dependencies: 322 | ms: 2.1.2 323 | peerDependenciesMeta: 324 | supports-color: 325 | optional: true 326 | checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 327 | languageName: node 328 | linkType: hard 329 | 330 | "decamelize@npm:^4.0.0": 331 | version: 4.0.0 332 | resolution: "decamelize@npm:4.0.0" 333 | checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 334 | languageName: node 335 | linkType: hard 336 | 337 | "delegates@npm:^1.0.0": 338 | version: 1.0.0 339 | resolution: "delegates@npm:1.0.0" 340 | checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd 341 | languageName: node 342 | linkType: hard 343 | 344 | "depd@npm:^1.1.2": 345 | version: 1.1.2 346 | resolution: "depd@npm:1.1.2" 347 | checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 348 | languageName: node 349 | linkType: hard 350 | 351 | "diff@npm:5.0.0": 352 | version: 5.0.0 353 | resolution: "diff@npm:5.0.0" 354 | checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46 355 | languageName: node 356 | linkType: hard 357 | 358 | "emoji-regex@npm:^8.0.0": 359 | version: 8.0.0 360 | resolution: "emoji-regex@npm:8.0.0" 361 | checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 362 | languageName: node 363 | linkType: hard 364 | 365 | "encoding@npm:^0.1.13": 366 | version: 0.1.13 367 | resolution: "encoding@npm:0.1.13" 368 | dependencies: 369 | iconv-lite: ^0.6.2 370 | checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f 371 | languageName: node 372 | linkType: hard 373 | 374 | "env-paths@npm:^2.2.0": 375 | version: 2.2.1 376 | resolution: "env-paths@npm:2.2.1" 377 | checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e 378 | languageName: node 379 | linkType: hard 380 | 381 | "err-code@npm:^2.0.2": 382 | version: 2.0.3 383 | resolution: "err-code@npm:2.0.3" 384 | checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 385 | languageName: node 386 | linkType: hard 387 | 388 | "escalade@npm:^3.1.1": 389 | version: 3.1.1 390 | resolution: "escalade@npm:3.1.1" 391 | checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 392 | languageName: node 393 | linkType: hard 394 | 395 | "escape-string-regexp@npm:4.0.0": 396 | version: 4.0.0 397 | resolution: "escape-string-regexp@npm:4.0.0" 398 | checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 399 | languageName: node 400 | linkType: hard 401 | 402 | "fill-range@npm:^7.0.1": 403 | version: 7.0.1 404 | resolution: "fill-range@npm:7.0.1" 405 | dependencies: 406 | to-regex-range: ^5.0.1 407 | checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 408 | languageName: node 409 | linkType: hard 410 | 411 | "find-up@npm:5.0.0": 412 | version: 5.0.0 413 | resolution: "find-up@npm:5.0.0" 414 | dependencies: 415 | locate-path: ^6.0.0 416 | path-exists: ^4.0.0 417 | checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 418 | languageName: node 419 | linkType: hard 420 | 421 | "flat@npm:^5.0.2": 422 | version: 5.0.2 423 | resolution: "flat@npm:5.0.2" 424 | bin: 425 | flat: cli.js 426 | checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d 427 | languageName: node 428 | linkType: hard 429 | 430 | "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": 431 | version: 2.1.0 432 | resolution: "fs-minipass@npm:2.1.0" 433 | dependencies: 434 | minipass: ^3.0.0 435 | checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 436 | languageName: node 437 | linkType: hard 438 | 439 | "fs.realpath@npm:^1.0.0": 440 | version: 1.0.0 441 | resolution: "fs.realpath@npm:1.0.0" 442 | checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 443 | languageName: node 444 | linkType: hard 445 | 446 | "fsevents@npm:~2.3.2": 447 | version: 2.3.2 448 | resolution: "fsevents@npm:2.3.2" 449 | dependencies: 450 | node-gyp: latest 451 | checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f 452 | conditions: os=darwin 453 | languageName: node 454 | linkType: hard 455 | 456 | "fsevents@patch:fsevents@~2.3.2#~builtin": 457 | version: 2.3.2 458 | resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" 459 | dependencies: 460 | node-gyp: latest 461 | conditions: os=darwin 462 | languageName: node 463 | linkType: hard 464 | 465 | "gauge@npm:^4.0.3": 466 | version: 4.0.4 467 | resolution: "gauge@npm:4.0.4" 468 | dependencies: 469 | aproba: ^1.0.3 || ^2.0.0 470 | color-support: ^1.1.3 471 | console-control-strings: ^1.1.0 472 | has-unicode: ^2.0.1 473 | signal-exit: ^3.0.7 474 | string-width: ^4.2.3 475 | strip-ansi: ^6.0.1 476 | wide-align: ^1.1.5 477 | checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d 478 | languageName: node 479 | linkType: hard 480 | 481 | "get-caller-file@npm:^2.0.5": 482 | version: 2.0.5 483 | resolution: "get-caller-file@npm:2.0.5" 484 | checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 485 | languageName: node 486 | linkType: hard 487 | 488 | "glob-parent@npm:~5.1.2": 489 | version: 5.1.2 490 | resolution: "glob-parent@npm:5.1.2" 491 | dependencies: 492 | is-glob: ^4.0.1 493 | checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e 494 | languageName: node 495 | linkType: hard 496 | 497 | "glob@npm:7.2.0": 498 | version: 7.2.0 499 | resolution: "glob@npm:7.2.0" 500 | dependencies: 501 | fs.realpath: ^1.0.0 502 | inflight: ^1.0.4 503 | inherits: 2 504 | minimatch: ^3.0.4 505 | once: ^1.3.0 506 | path-is-absolute: ^1.0.0 507 | checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 508 | languageName: node 509 | linkType: hard 510 | 511 | "glob@npm:^7.1.3, glob@npm:^7.1.4": 512 | version: 7.2.3 513 | resolution: "glob@npm:7.2.3" 514 | dependencies: 515 | fs.realpath: ^1.0.0 516 | inflight: ^1.0.4 517 | inherits: 2 518 | minimatch: ^3.1.1 519 | once: ^1.3.0 520 | path-is-absolute: ^1.0.0 521 | checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 522 | languageName: node 523 | linkType: hard 524 | 525 | "glob@npm:^8.0.1": 526 | version: 8.0.3 527 | resolution: "glob@npm:8.0.3" 528 | dependencies: 529 | fs.realpath: ^1.0.0 530 | inflight: ^1.0.4 531 | inherits: 2 532 | minimatch: ^5.0.1 533 | once: ^1.3.0 534 | checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 535 | languageName: node 536 | linkType: hard 537 | 538 | "graceful-fs@npm:^4.2.6": 539 | version: 4.2.10 540 | resolution: "graceful-fs@npm:4.2.10" 541 | checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da 542 | languageName: node 543 | linkType: hard 544 | 545 | "has-flag@npm:^4.0.0": 546 | version: 4.0.0 547 | resolution: "has-flag@npm:4.0.0" 548 | checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad 549 | languageName: node 550 | linkType: hard 551 | 552 | "has-unicode@npm:^2.0.1": 553 | version: 2.0.1 554 | resolution: "has-unicode@npm:2.0.1" 555 | checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 556 | languageName: node 557 | linkType: hard 558 | 559 | "he@npm:1.2.0": 560 | version: 1.2.0 561 | resolution: "he@npm:1.2.0" 562 | bin: 563 | he: bin/he 564 | checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 565 | languageName: node 566 | linkType: hard 567 | 568 | "http-cache-semantics@npm:^4.1.0": 569 | version: 4.1.0 570 | resolution: "http-cache-semantics@npm:4.1.0" 571 | checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 572 | languageName: node 573 | linkType: hard 574 | 575 | "http-proxy-agent@npm:^5.0.0": 576 | version: 5.0.0 577 | resolution: "http-proxy-agent@npm:5.0.0" 578 | dependencies: 579 | "@tootallnate/once": 2 580 | agent-base: 6 581 | debug: 4 582 | checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 583 | languageName: node 584 | linkType: hard 585 | 586 | "https-proxy-agent@npm:^5.0.0": 587 | version: 5.0.1 588 | resolution: "https-proxy-agent@npm:5.0.1" 589 | dependencies: 590 | agent-base: 6 591 | debug: 4 592 | checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 593 | languageName: node 594 | linkType: hard 595 | 596 | "humanize-ms@npm:^1.2.1": 597 | version: 1.2.1 598 | resolution: "humanize-ms@npm:1.2.1" 599 | dependencies: 600 | ms: ^2.0.0 601 | checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 602 | languageName: node 603 | linkType: hard 604 | 605 | "iconv-lite@npm:^0.6.2": 606 | version: 0.6.3 607 | resolution: "iconv-lite@npm:0.6.3" 608 | dependencies: 609 | safer-buffer: ">= 2.1.2 < 3.0.0" 610 | checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf 611 | languageName: node 612 | linkType: hard 613 | 614 | "imurmurhash@npm:^0.1.4": 615 | version: 0.1.4 616 | resolution: "imurmurhash@npm:0.1.4" 617 | checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 618 | languageName: node 619 | linkType: hard 620 | 621 | "indent-string@npm:^4.0.0": 622 | version: 4.0.0 623 | resolution: "indent-string@npm:4.0.0" 624 | checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 625 | languageName: node 626 | linkType: hard 627 | 628 | "infer-owner@npm:^1.0.4": 629 | version: 1.0.4 630 | resolution: "infer-owner@npm:1.0.4" 631 | checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 632 | languageName: node 633 | linkType: hard 634 | 635 | "inflight@npm:^1.0.4": 636 | version: 1.0.6 637 | resolution: "inflight@npm:1.0.6" 638 | dependencies: 639 | once: ^1.3.0 640 | wrappy: 1 641 | checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd 642 | languageName: node 643 | linkType: hard 644 | 645 | "inherits@npm:2, inherits@npm:^2.0.3": 646 | version: 2.0.4 647 | resolution: "inherits@npm:2.0.4" 648 | checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 649 | languageName: node 650 | linkType: hard 651 | 652 | "ip@npm:^1.1.5": 653 | version: 1.1.8 654 | resolution: "ip@npm:1.1.8" 655 | checksum: a2ade53eb339fb0cbe9e69a44caab10d6e3784662285eb5d2677117ee4facc33a64679051c35e0dfdb1a3983a51ce2f5d2cb36446d52e10d01881789b76e28fb 656 | languageName: node 657 | linkType: hard 658 | 659 | "is-binary-path@npm:~2.1.0": 660 | version: 2.1.0 661 | resolution: "is-binary-path@npm:2.1.0" 662 | dependencies: 663 | binary-extensions: ^2.0.0 664 | checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c 665 | languageName: node 666 | linkType: hard 667 | 668 | "is-extglob@npm:^2.1.1": 669 | version: 2.1.1 670 | resolution: "is-extglob@npm:2.1.1" 671 | checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 672 | languageName: node 673 | linkType: hard 674 | 675 | "is-fullwidth-code-point@npm:^3.0.0": 676 | version: 3.0.0 677 | resolution: "is-fullwidth-code-point@npm:3.0.0" 678 | checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 679 | languageName: node 680 | linkType: hard 681 | 682 | "is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": 683 | version: 4.0.3 684 | resolution: "is-glob@npm:4.0.3" 685 | dependencies: 686 | is-extglob: ^2.1.1 687 | checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 688 | languageName: node 689 | linkType: hard 690 | 691 | "is-lambda@npm:^1.0.1": 692 | version: 1.0.1 693 | resolution: "is-lambda@npm:1.0.1" 694 | checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 695 | languageName: node 696 | linkType: hard 697 | 698 | "is-number@npm:^7.0.0": 699 | version: 7.0.0 700 | resolution: "is-number@npm:7.0.0" 701 | checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a 702 | languageName: node 703 | linkType: hard 704 | 705 | "is-plain-obj@npm:^2.1.0": 706 | version: 2.1.0 707 | resolution: "is-plain-obj@npm:2.1.0" 708 | checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa 709 | languageName: node 710 | linkType: hard 711 | 712 | "is-unicode-supported@npm:^0.1.0": 713 | version: 0.1.0 714 | resolution: "is-unicode-supported@npm:0.1.0" 715 | checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 716 | languageName: node 717 | linkType: hard 718 | 719 | "isexe@npm:^2.0.0": 720 | version: 2.0.0 721 | resolution: "isexe@npm:2.0.0" 722 | checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 723 | languageName: node 724 | linkType: hard 725 | 726 | "isomorphic.js@npm:^0.2.4": 727 | version: 0.2.5 728 | resolution: "isomorphic.js@npm:0.2.5" 729 | checksum: d8d1b083f05f3c337a06628b982ac3ce6db953bbef14a9de8ad49131250c3592f864b73c12030fdc9ef138ce97b76ef55c7d96a849561ac215b1b4b9d301c8e9 730 | languageName: node 731 | linkType: hard 732 | 733 | "js-yaml@npm:4.1.0": 734 | version: 4.1.0 735 | resolution: "js-yaml@npm:4.1.0" 736 | dependencies: 737 | argparse: ^2.0.1 738 | bin: 739 | js-yaml: bin/js-yaml.js 740 | checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a 741 | languageName: node 742 | linkType: hard 743 | 744 | "lib0@npm:^0.2.49": 745 | version: 0.2.51 746 | resolution: "lib0@npm:0.2.51" 747 | dependencies: 748 | isomorphic.js: ^0.2.4 749 | checksum: bdd00ba42b66d27d048fc169e7d472b9dfe9140e067daeb92db82f40209365d9399aaed679078cc440c496c43d429427b0e231dbaaf171793d98ea6f5476aa3a 750 | languageName: node 751 | linkType: hard 752 | 753 | "locate-path@npm:^6.0.0": 754 | version: 6.0.0 755 | resolution: "locate-path@npm:6.0.0" 756 | dependencies: 757 | p-locate: ^5.0.0 758 | checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a 759 | languageName: node 760 | linkType: hard 761 | 762 | "log-symbols@npm:4.1.0": 763 | version: 4.1.0 764 | resolution: "log-symbols@npm:4.1.0" 765 | dependencies: 766 | chalk: ^4.1.0 767 | is-unicode-supported: ^0.1.0 768 | checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 769 | languageName: node 770 | linkType: hard 771 | 772 | "lru-cache@npm:^6.0.0": 773 | version: 6.0.0 774 | resolution: "lru-cache@npm:6.0.0" 775 | dependencies: 776 | yallist: ^4.0.0 777 | checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 778 | languageName: node 779 | linkType: hard 780 | 781 | "lru-cache@npm:^7.7.1": 782 | version: 7.10.1 783 | resolution: "lru-cache@npm:7.10.1" 784 | checksum: e8b190d71ed0fcd7b29c71a3e9b01f851c92d1ef8865ff06b5581ca991db1e5e006920ed4da8b56da1910664ed51abfd76c46fb55e82ac252ff6c970ff910d72 785 | languageName: node 786 | linkType: hard 787 | 788 | "make-fetch-happen@npm:^10.0.3": 789 | version: 10.1.5 790 | resolution: "make-fetch-happen@npm:10.1.5" 791 | dependencies: 792 | agentkeepalive: ^4.2.1 793 | cacache: ^16.1.0 794 | http-cache-semantics: ^4.1.0 795 | http-proxy-agent: ^5.0.0 796 | https-proxy-agent: ^5.0.0 797 | is-lambda: ^1.0.1 798 | lru-cache: ^7.7.1 799 | minipass: ^3.1.6 800 | minipass-collect: ^1.0.2 801 | minipass-fetch: ^2.0.3 802 | minipass-flush: ^1.0.5 803 | minipass-pipeline: ^1.2.4 804 | negotiator: ^0.6.3 805 | promise-retry: ^2.0.1 806 | socks-proxy-agent: ^6.1.1 807 | ssri: ^9.0.0 808 | checksum: b0b42a1ccdcbc3180749727a52cf6887d9df6218d8ca35101bb9f7ab35729dd166d99203b70149a19a818d1ba72de40b982002ddb0b308c548457f5725d6e7f6 809 | languageName: node 810 | linkType: hard 811 | 812 | "minimatch@npm:5.0.1": 813 | version: 5.0.1 814 | resolution: "minimatch@npm:5.0.1" 815 | dependencies: 816 | brace-expansion: ^2.0.1 817 | checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 818 | languageName: node 819 | linkType: hard 820 | 821 | "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": 822 | version: 3.1.2 823 | resolution: "minimatch@npm:3.1.2" 824 | dependencies: 825 | brace-expansion: ^1.1.7 826 | checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a 827 | languageName: node 828 | linkType: hard 829 | 830 | "minimatch@npm:^5.0.1": 831 | version: 5.1.0 832 | resolution: "minimatch@npm:5.1.0" 833 | dependencies: 834 | brace-expansion: ^2.0.1 835 | checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90 836 | languageName: node 837 | linkType: hard 838 | 839 | "minipass-collect@npm:^1.0.2": 840 | version: 1.0.2 841 | resolution: "minipass-collect@npm:1.0.2" 842 | dependencies: 843 | minipass: ^3.0.0 844 | checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 845 | languageName: node 846 | linkType: hard 847 | 848 | "minipass-fetch@npm:^2.0.3": 849 | version: 2.1.0 850 | resolution: "minipass-fetch@npm:2.1.0" 851 | dependencies: 852 | encoding: ^0.1.13 853 | minipass: ^3.1.6 854 | minipass-sized: ^1.0.3 855 | minizlib: ^2.1.2 856 | dependenciesMeta: 857 | encoding: 858 | optional: true 859 | checksum: 1334732859a3f7959ed22589bafd9c40384b885aebb5932328071c33f86b3eb181d54c86919675d1825ab5f1c8e4f328878c863873258d113c29d79a4b0c9c9f 860 | languageName: node 861 | linkType: hard 862 | 863 | "minipass-flush@npm:^1.0.5": 864 | version: 1.0.5 865 | resolution: "minipass-flush@npm:1.0.5" 866 | dependencies: 867 | minipass: ^3.0.0 868 | checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf 869 | languageName: node 870 | linkType: hard 871 | 872 | "minipass-pipeline@npm:^1.2.4": 873 | version: 1.2.4 874 | resolution: "minipass-pipeline@npm:1.2.4" 875 | dependencies: 876 | minipass: ^3.0.0 877 | checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b 878 | languageName: node 879 | linkType: hard 880 | 881 | "minipass-sized@npm:^1.0.3": 882 | version: 1.0.3 883 | resolution: "minipass-sized@npm:1.0.3" 884 | dependencies: 885 | minipass: ^3.0.0 886 | checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 887 | languageName: node 888 | linkType: hard 889 | 890 | "minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": 891 | version: 3.1.6 892 | resolution: "minipass@npm:3.1.6" 893 | dependencies: 894 | yallist: ^4.0.0 895 | checksum: 57a04041413a3531a65062452cb5175f93383ef245d6f4a2961d34386eb9aa8ac11ac7f16f791f5e8bbaf1dfb1ef01596870c88e8822215db57aa591a5bb0a77 896 | languageName: node 897 | linkType: hard 898 | 899 | "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": 900 | version: 2.1.2 901 | resolution: "minizlib@npm:2.1.2" 902 | dependencies: 903 | minipass: ^3.0.0 904 | yallist: ^4.0.0 905 | checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 906 | languageName: node 907 | linkType: hard 908 | 909 | "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": 910 | version: 1.0.4 911 | resolution: "mkdirp@npm:1.0.4" 912 | bin: 913 | mkdirp: bin/cmd.js 914 | checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f 915 | languageName: node 916 | linkType: hard 917 | 918 | "mocha@npm:^10.0.0": 919 | version: 10.0.0 920 | resolution: "mocha@npm:10.0.0" 921 | dependencies: 922 | "@ungap/promise-all-settled": 1.1.2 923 | ansi-colors: 4.1.1 924 | browser-stdout: 1.3.1 925 | chokidar: 3.5.3 926 | debug: 4.3.4 927 | diff: 5.0.0 928 | escape-string-regexp: 4.0.0 929 | find-up: 5.0.0 930 | glob: 7.2.0 931 | he: 1.2.0 932 | js-yaml: 4.1.0 933 | log-symbols: 4.1.0 934 | minimatch: 5.0.1 935 | ms: 2.1.3 936 | nanoid: 3.3.3 937 | serialize-javascript: 6.0.0 938 | strip-json-comments: 3.1.1 939 | supports-color: 8.1.1 940 | workerpool: 6.2.1 941 | yargs: 16.2.0 942 | yargs-parser: 20.2.4 943 | yargs-unparser: 2.0.0 944 | bin: 945 | _mocha: bin/_mocha 946 | mocha: bin/mocha.js 947 | checksum: ba49ddcf8015a467e744b06c396aab361b1281302e38e7c1269af25ba51ff9ab681a9c36e9046bb7491e751cd7d5ce85e276a00ce7e204f96b2c418e4595edfe 948 | languageName: node 949 | linkType: hard 950 | 951 | "ms@npm:2.1.2": 952 | version: 2.1.2 953 | resolution: "ms@npm:2.1.2" 954 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f 955 | languageName: node 956 | linkType: hard 957 | 958 | "ms@npm:2.1.3, ms@npm:^2.0.0": 959 | version: 2.1.3 960 | resolution: "ms@npm:2.1.3" 961 | checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d 962 | languageName: node 963 | linkType: hard 964 | 965 | "nanoid@npm:3.3.3": 966 | version: 3.3.3 967 | resolution: "nanoid@npm:3.3.3" 968 | bin: 969 | nanoid: bin/nanoid.cjs 970 | checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0 971 | languageName: node 972 | linkType: hard 973 | 974 | "negotiator@npm:^0.6.3": 975 | version: 0.6.3 976 | resolution: "negotiator@npm:0.6.3" 977 | checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 978 | languageName: node 979 | linkType: hard 980 | 981 | "node-gyp@npm:latest": 982 | version: 9.0.0 983 | resolution: "node-gyp@npm:9.0.0" 984 | dependencies: 985 | env-paths: ^2.2.0 986 | glob: ^7.1.4 987 | graceful-fs: ^4.2.6 988 | make-fetch-happen: ^10.0.3 989 | nopt: ^5.0.0 990 | npmlog: ^6.0.0 991 | rimraf: ^3.0.2 992 | semver: ^7.3.5 993 | tar: ^6.1.2 994 | which: ^2.0.2 995 | bin: 996 | node-gyp: bin/node-gyp.js 997 | checksum: 4d8ef8860f7e4f4d86c91db3f519d26ed5cc23b48fe54543e2afd86162b4acbd14f21de42a5db344525efb69a991e021b96a68c70c6e2d5f4a5cb770793da6d3 998 | languageName: node 999 | linkType: hard 1000 | 1001 | "nopt@npm:^5.0.0": 1002 | version: 5.0.0 1003 | resolution: "nopt@npm:5.0.0" 1004 | dependencies: 1005 | abbrev: 1 1006 | bin: 1007 | nopt: bin/nopt.js 1008 | checksum: d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f 1009 | languageName: node 1010 | linkType: hard 1011 | 1012 | "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": 1013 | version: 3.0.0 1014 | resolution: "normalize-path@npm:3.0.0" 1015 | checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 1016 | languageName: node 1017 | linkType: hard 1018 | 1019 | "npmlog@npm:^6.0.0": 1020 | version: 6.0.2 1021 | resolution: "npmlog@npm:6.0.2" 1022 | dependencies: 1023 | are-we-there-yet: ^3.0.0 1024 | console-control-strings: ^1.1.0 1025 | gauge: ^4.0.3 1026 | set-blocking: ^2.0.0 1027 | checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a 1028 | languageName: node 1029 | linkType: hard 1030 | 1031 | "once@npm:^1.3.0": 1032 | version: 1.4.0 1033 | resolution: "once@npm:1.4.0" 1034 | dependencies: 1035 | wrappy: 1 1036 | checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 1037 | languageName: node 1038 | linkType: hard 1039 | 1040 | "p-limit@npm:^3.0.2": 1041 | version: 3.1.0 1042 | resolution: "p-limit@npm:3.1.0" 1043 | dependencies: 1044 | yocto-queue: ^0.1.0 1045 | checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 1046 | languageName: node 1047 | linkType: hard 1048 | 1049 | "p-locate@npm:^5.0.0": 1050 | version: 5.0.0 1051 | resolution: "p-locate@npm:5.0.0" 1052 | dependencies: 1053 | p-limit: ^3.0.2 1054 | checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 1055 | languageName: node 1056 | linkType: hard 1057 | 1058 | "p-map@npm:^4.0.0": 1059 | version: 4.0.0 1060 | resolution: "p-map@npm:4.0.0" 1061 | dependencies: 1062 | aggregate-error: ^3.0.0 1063 | checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c 1064 | languageName: node 1065 | linkType: hard 1066 | 1067 | "path-exists@npm:^4.0.0": 1068 | version: 4.0.0 1069 | resolution: "path-exists@npm:4.0.0" 1070 | checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 1071 | languageName: node 1072 | linkType: hard 1073 | 1074 | "path-is-absolute@npm:^1.0.0": 1075 | version: 1.0.1 1076 | resolution: "path-is-absolute@npm:1.0.1" 1077 | checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 1078 | languageName: node 1079 | linkType: hard 1080 | 1081 | "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1": 1082 | version: 2.3.1 1083 | resolution: "picomatch@npm:2.3.1" 1084 | checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf 1085 | languageName: node 1086 | linkType: hard 1087 | 1088 | "promise-inflight@npm:^1.0.1": 1089 | version: 1.0.1 1090 | resolution: "promise-inflight@npm:1.0.1" 1091 | checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 1092 | languageName: node 1093 | linkType: hard 1094 | 1095 | "promise-retry@npm:^2.0.1": 1096 | version: 2.0.1 1097 | resolution: "promise-retry@npm:2.0.1" 1098 | dependencies: 1099 | err-code: ^2.0.2 1100 | retry: ^0.12.0 1101 | checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 1102 | languageName: node 1103 | linkType: hard 1104 | 1105 | "randombytes@npm:^2.1.0": 1106 | version: 2.1.0 1107 | resolution: "randombytes@npm:2.1.0" 1108 | dependencies: 1109 | safe-buffer: ^5.1.0 1110 | checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 1111 | languageName: node 1112 | linkType: hard 1113 | 1114 | "readable-stream@npm:^3.6.0": 1115 | version: 3.6.0 1116 | resolution: "readable-stream@npm:3.6.0" 1117 | dependencies: 1118 | inherits: ^2.0.3 1119 | string_decoder: ^1.1.1 1120 | util-deprecate: ^1.0.1 1121 | checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 1122 | languageName: node 1123 | linkType: hard 1124 | 1125 | "readdirp@npm:~3.6.0": 1126 | version: 3.6.0 1127 | resolution: "readdirp@npm:3.6.0" 1128 | dependencies: 1129 | picomatch: ^2.2.1 1130 | checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 1131 | languageName: node 1132 | linkType: hard 1133 | 1134 | "require-directory@npm:^2.1.1": 1135 | version: 2.1.1 1136 | resolution: "require-directory@npm:2.1.1" 1137 | checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 1138 | languageName: node 1139 | linkType: hard 1140 | 1141 | "retry@npm:^0.12.0": 1142 | version: 0.12.0 1143 | resolution: "retry@npm:0.12.0" 1144 | checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c 1145 | languageName: node 1146 | linkType: hard 1147 | 1148 | "rimraf@npm:^3.0.2": 1149 | version: 3.0.2 1150 | resolution: "rimraf@npm:3.0.2" 1151 | dependencies: 1152 | glob: ^7.1.3 1153 | bin: 1154 | rimraf: bin.js 1155 | checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 1156 | languageName: node 1157 | linkType: hard 1158 | 1159 | "safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": 1160 | version: 5.2.1 1161 | resolution: "safe-buffer@npm:5.2.1" 1162 | checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 1163 | languageName: node 1164 | linkType: hard 1165 | 1166 | "safer-buffer@npm:>= 2.1.2 < 3.0.0": 1167 | version: 2.1.2 1168 | resolution: "safer-buffer@npm:2.1.2" 1169 | checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 1170 | languageName: node 1171 | linkType: hard 1172 | 1173 | "semver@npm:^7.3.5": 1174 | version: 7.3.7 1175 | resolution: "semver@npm:7.3.7" 1176 | dependencies: 1177 | lru-cache: ^6.0.0 1178 | bin: 1179 | semver: bin/semver.js 1180 | checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232 1181 | languageName: node 1182 | linkType: hard 1183 | 1184 | "serialize-javascript@npm:6.0.0": 1185 | version: 6.0.0 1186 | resolution: "serialize-javascript@npm:6.0.0" 1187 | dependencies: 1188 | randombytes: ^2.1.0 1189 | checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 1190 | languageName: node 1191 | linkType: hard 1192 | 1193 | "set-blocking@npm:^2.0.0": 1194 | version: 2.0.0 1195 | resolution: "set-blocking@npm:2.0.0" 1196 | checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 1197 | languageName: node 1198 | linkType: hard 1199 | 1200 | "signal-exit@npm:^3.0.7": 1201 | version: 3.0.7 1202 | resolution: "signal-exit@npm:3.0.7" 1203 | checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 1204 | languageName: node 1205 | linkType: hard 1206 | 1207 | "smart-buffer@npm:^4.2.0": 1208 | version: 4.2.0 1209 | resolution: "smart-buffer@npm:4.2.0" 1210 | checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b 1211 | languageName: node 1212 | linkType: hard 1213 | 1214 | "socks-proxy-agent@npm:^6.1.1": 1215 | version: 6.2.0 1216 | resolution: "socks-proxy-agent@npm:6.2.0" 1217 | dependencies: 1218 | agent-base: ^6.0.2 1219 | debug: ^4.3.3 1220 | socks: ^2.6.2 1221 | checksum: 6723fd64fb50334e2b340fd0a80fd8488ffc5bc43d85b7cf1d25612044f814dd7d6ea417fd47602159941236f7f4bd15669fa5d7e1f852598a31288e1a43967b 1222 | languageName: node 1223 | linkType: hard 1224 | 1225 | "socks@npm:^2.6.2": 1226 | version: 2.6.2 1227 | resolution: "socks@npm:2.6.2" 1228 | dependencies: 1229 | ip: ^1.1.5 1230 | smart-buffer: ^4.2.0 1231 | checksum: dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e 1232 | languageName: node 1233 | linkType: hard 1234 | 1235 | "ssri@npm:^9.0.0": 1236 | version: 9.0.1 1237 | resolution: "ssri@npm:9.0.1" 1238 | dependencies: 1239 | minipass: ^3.1.1 1240 | checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb 1241 | languageName: node 1242 | linkType: hard 1243 | 1244 | "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": 1245 | version: 4.2.3 1246 | resolution: "string-width@npm:4.2.3" 1247 | dependencies: 1248 | emoji-regex: ^8.0.0 1249 | is-fullwidth-code-point: ^3.0.0 1250 | strip-ansi: ^6.0.1 1251 | checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb 1252 | languageName: node 1253 | linkType: hard 1254 | 1255 | "string_decoder@npm:^1.1.1": 1256 | version: 1.3.0 1257 | resolution: "string_decoder@npm:1.3.0" 1258 | dependencies: 1259 | safe-buffer: ~5.2.0 1260 | checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 1261 | languageName: node 1262 | linkType: hard 1263 | 1264 | "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 1265 | version: 6.0.1 1266 | resolution: "strip-ansi@npm:6.0.1" 1267 | dependencies: 1268 | ansi-regex: ^5.0.1 1269 | checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c 1270 | languageName: node 1271 | linkType: hard 1272 | 1273 | "strip-json-comments@npm:3.1.1": 1274 | version: 3.1.1 1275 | resolution: "strip-json-comments@npm:3.1.1" 1276 | checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 1277 | languageName: node 1278 | linkType: hard 1279 | 1280 | "supports-color@npm:8.1.1": 1281 | version: 8.1.1 1282 | resolution: "supports-color@npm:8.1.1" 1283 | dependencies: 1284 | has-flag: ^4.0.0 1285 | checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 1286 | languageName: node 1287 | linkType: hard 1288 | 1289 | "supports-color@npm:^7.1.0": 1290 | version: 7.2.0 1291 | resolution: "supports-color@npm:7.2.0" 1292 | dependencies: 1293 | has-flag: ^4.0.0 1294 | checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a 1295 | languageName: node 1296 | linkType: hard 1297 | 1298 | "tar@npm:^6.1.11, tar@npm:^6.1.2": 1299 | version: 6.1.11 1300 | resolution: "tar@npm:6.1.11" 1301 | dependencies: 1302 | chownr: ^2.0.0 1303 | fs-minipass: ^2.0.0 1304 | minipass: ^3.0.0 1305 | minizlib: ^2.1.1 1306 | mkdirp: ^1.0.3 1307 | yallist: ^4.0.0 1308 | checksum: a04c07bb9e2d8f46776517d4618f2406fb977a74d914ad98b264fc3db0fe8224da5bec11e5f8902c5b9bcb8ace22d95fbe3c7b36b8593b7dfc8391a25898f32f 1309 | languageName: node 1310 | linkType: hard 1311 | 1312 | "to-regex-range@npm:^5.0.1": 1313 | version: 5.0.1 1314 | resolution: "to-regex-range@npm:5.0.1" 1315 | dependencies: 1316 | is-number: ^7.0.0 1317 | checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed 1318 | languageName: node 1319 | linkType: hard 1320 | 1321 | "typescript@npm:^4.0.5": 1322 | version: 4.7.2 1323 | resolution: "typescript@npm:4.7.2" 1324 | bin: 1325 | tsc: bin/tsc 1326 | tsserver: bin/tsserver 1327 | checksum: 5163585e6b56410f77d5483b698d9489bbee8902c99029eb70cf6d21525a186530ce19a00951af84eefd4a131cc51d0959f5118e25e70ab61f45ac4057dbd1ef 1328 | languageName: node 1329 | linkType: hard 1330 | 1331 | "typescript@patch:typescript@^4.0.5#~builtin": 1332 | version: 4.7.2 1333 | resolution: "typescript@patch:typescript@npm%3A4.7.2#~builtin::version=4.7.2&hash=493e53" 1334 | bin: 1335 | tsc: bin/tsc 1336 | tsserver: bin/tsserver 1337 | checksum: 09d93fc0983d38eadd9b0427f790b49b4437f45002a87d447be3fbe53120880e87a91dd03e1d900498f99205d6e0b7c9784fe41fca11d56f4bbce371f74bb160 1338 | languageName: node 1339 | linkType: hard 1340 | 1341 | "unique-filename@npm:^1.1.1": 1342 | version: 1.1.1 1343 | resolution: "unique-filename@npm:1.1.1" 1344 | dependencies: 1345 | unique-slug: ^2.0.0 1346 | checksum: cf4998c9228cc7647ba7814e255dec51be43673903897b1786eff2ac2d670f54d4d733357eb08dea969aa5e6875d0e1bd391d668fbdb5a179744e7c7551a6f80 1347 | languageName: node 1348 | linkType: hard 1349 | 1350 | "unique-slug@npm:^2.0.0": 1351 | version: 2.0.2 1352 | resolution: "unique-slug@npm:2.0.2" 1353 | dependencies: 1354 | imurmurhash: ^0.1.4 1355 | checksum: 5b6876a645da08d505dedb970d1571f6cebdf87044cb6b740c8dbb24f0d6e1dc8bdbf46825fd09f994d7cf50760e6f6e063cfa197d51c5902c00a861702eb75a 1356 | languageName: node 1357 | linkType: hard 1358 | 1359 | "util-deprecate@npm:^1.0.1": 1360 | version: 1.0.2 1361 | resolution: "util-deprecate@npm:1.0.2" 1362 | checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 1363 | languageName: node 1364 | linkType: hard 1365 | 1366 | "which@npm:^2.0.2": 1367 | version: 2.0.2 1368 | resolution: "which@npm:2.0.2" 1369 | dependencies: 1370 | isexe: ^2.0.0 1371 | bin: 1372 | node-which: ./bin/node-which 1373 | checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 1374 | languageName: node 1375 | linkType: hard 1376 | 1377 | "wide-align@npm:^1.1.5": 1378 | version: 1.1.5 1379 | resolution: "wide-align@npm:1.1.5" 1380 | dependencies: 1381 | string-width: ^1.0.2 || 2 || 3 || 4 1382 | checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 1383 | languageName: node 1384 | linkType: hard 1385 | 1386 | "workerpool@npm:6.2.1": 1387 | version: 6.2.1 1388 | resolution: "workerpool@npm:6.2.1" 1389 | checksum: c2c6eebbc5225f10f758d599a5c016fa04798bcc44e4c1dffb34050cd361d7be2e97891aa44419e7afe647b1f767b1dc0b85a5e046c409d890163f655028b09d 1390 | languageName: node 1391 | linkType: hard 1392 | 1393 | "wrap-ansi@npm:^7.0.0": 1394 | version: 7.0.0 1395 | resolution: "wrap-ansi@npm:7.0.0" 1396 | dependencies: 1397 | ansi-styles: ^4.0.0 1398 | string-width: ^4.1.0 1399 | strip-ansi: ^6.0.0 1400 | checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b 1401 | languageName: node 1402 | linkType: hard 1403 | 1404 | "wrappy@npm:1": 1405 | version: 1.0.2 1406 | resolution: "wrappy@npm:1.0.2" 1407 | checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 1408 | languageName: node 1409 | linkType: hard 1410 | 1411 | "y-pojo@workspace:.": 1412 | version: 0.0.0-use.local 1413 | resolution: "y-pojo@workspace:." 1414 | dependencies: 1415 | mocha: ^10.0.0 1416 | typescript: ^4.0.5 1417 | yjs: ^13.5.38 1418 | peerDependencies: 1419 | yjs: ^13.5.38 1420 | languageName: unknown 1421 | linkType: soft 1422 | 1423 | "y18n@npm:^5.0.5": 1424 | version: 5.0.8 1425 | resolution: "y18n@npm:5.0.8" 1426 | checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 1427 | languageName: node 1428 | linkType: hard 1429 | 1430 | "yallist@npm:^4.0.0": 1431 | version: 4.0.0 1432 | resolution: "yallist@npm:4.0.0" 1433 | checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 1434 | languageName: node 1435 | linkType: hard 1436 | 1437 | "yargs-parser@npm:20.2.4": 1438 | version: 20.2.4 1439 | resolution: "yargs-parser@npm:20.2.4" 1440 | checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 1441 | languageName: node 1442 | linkType: hard 1443 | 1444 | "yargs-parser@npm:^20.2.2": 1445 | version: 20.2.9 1446 | resolution: "yargs-parser@npm:20.2.9" 1447 | checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 1448 | languageName: node 1449 | linkType: hard 1450 | 1451 | "yargs-unparser@npm:2.0.0": 1452 | version: 2.0.0 1453 | resolution: "yargs-unparser@npm:2.0.0" 1454 | dependencies: 1455 | camelcase: ^6.0.0 1456 | decamelize: ^4.0.0 1457 | flat: ^5.0.2 1458 | is-plain-obj: ^2.1.0 1459 | checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 1460 | languageName: node 1461 | linkType: hard 1462 | 1463 | "yargs@npm:16.2.0": 1464 | version: 16.2.0 1465 | resolution: "yargs@npm:16.2.0" 1466 | dependencies: 1467 | cliui: ^7.0.2 1468 | escalade: ^3.1.1 1469 | get-caller-file: ^2.0.5 1470 | require-directory: ^2.1.1 1471 | string-width: ^4.2.0 1472 | y18n: ^5.0.5 1473 | yargs-parser: ^20.2.2 1474 | checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 1475 | languageName: node 1476 | linkType: hard 1477 | 1478 | "yjs@npm:^13.5.38": 1479 | version: 13.5.38 1480 | resolution: "yjs@npm:13.5.38" 1481 | dependencies: 1482 | lib0: ^0.2.49 1483 | checksum: 48be9cfe514b5f9f7c64cddf38f7fd59142fe56553200ba88543c6c2c5df6a6be6876440d40f8b1a0f34e5a92ba8efe6b8da5da657278393ceb5171c4fc3a4e0 1484 | languageName: node 1485 | linkType: hard 1486 | 1487 | "yocto-queue@npm:^0.1.0": 1488 | version: 0.1.0 1489 | resolution: "yocto-queue@npm:0.1.0" 1490 | checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 1491 | languageName: node 1492 | linkType: hard 1493 | --------------------------------------------------------------------------------