Get tests passing without engine connection (#155)

We can create a enginelessExecutor that can be used for many of the
executor tests that will be much more performant for tests that don't
need the engine to actually do any modeling work.
This commit is contained in:
Kurt Hutten
2023-07-10 15:15:07 +10:00
committed by GitHub
parent a70399bacf
commit cda301997e
19 changed files with 551 additions and 482 deletions

View File

@ -22,7 +22,7 @@
"react-json-view": "^1.21.3", "react-json-view": "^1.21.3",
"react-modal-promise": "^1.0.2", "react-modal-promise": "^1.0.2",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"sketch-helpers": "^0.0.2", "sketch-helpers": "^0.0.3",
"swr": "^2.0.4", "swr": "^2.0.4",
"toml": "^3.0.0", "toml": "^3.0.0",
"ts-node": "^10.9.1", "ts-node": "^10.9.1",
@ -92,11 +92,14 @@
"@tauri-apps/cli": "^1.3.1", "@tauri-apps/cli": "^1.3.1",
"@types/crypto-js": "^4.1.1", "@types/crypto-js": "^4.1.1",
"@types/uuid": "^9.0.1", "@types/uuid": "^9.0.1",
"@types/ws": "^8.5.5",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"postcss": "^8.4.19", "postcss": "^8.4.19",
"prettier": "^2.8.0", "prettier": "^2.8.0",
"setimmediate": "^1.0.5", "setimmediate": "^1.0.5",
"tailwindcss": "^3.2.4", "tailwindcss": "^3.2.4",
"wrtc": "^0.4.7",
"ws": "^8.13.0",
"yarn": "^1.22.19" "yarn": "^1.22.19"
} }
} }

View File

@ -1,13 +1,14 @@
import { processMemory } from './MemoryPanel' import { processMemory } from './MemoryPanel'
import { lexer } from '../lang/tokeniser' import { lexer } from '../lang/tokeniser'
import { abstractSyntaxTree } from '../lang/abstractSyntaxTree' import { abstractSyntaxTree } from '../lang/abstractSyntaxTree'
import { executor } from '../lib/testHelpers' import { enginelessExecutor } from '../lib/testHelpers'
import { initPromise } from '../lang/rust' import { initPromise } from '../lang/rust'
beforeAll(() => initPromise) beforeAll(() => initPromise)
describe('processMemory', () => { describe('processMemory', () => {
it('should grab the values and remove and geo data', async () => { it('should grab the values and remove and geo data', async () => {
// Enable rotations #152
const code = ` const code = `
const myVar = 5 const myVar = 5
const myFn = (a) => { const myFn = (a) => {
@ -24,11 +25,11 @@ describe('processMemory', () => {
|> lineTo([-3.35, 0.17], %) |> lineTo([-3.35, 0.17], %)
|> lineTo([0.98, 5.16], %) |> lineTo([0.98, 5.16], %)
|> lineTo([2.15, 4.32], %) |> lineTo([2.15, 4.32], %)
|> rx(90, %) // |> rx(90, %)
show(theExtrude, theSketch)` show(theExtrude, theSketch)`
const tokens = lexer(code) const tokens = lexer(code)
const ast = abstractSyntaxTree(tokens) const ast = abstractSyntaxTree(tokens)
const programMemory = await executor(ast, { const programMemory = await enginelessExecutor(ast, {
root: { root: {
log: { log: {
type: 'userVal', type: 'userVal',
@ -48,24 +49,7 @@ describe('processMemory', () => {
myVar: 5, myVar: 5,
myFn: '__function__', myFn: '__function__',
otherVar: 3, otherVar: 3,
theExtrude: [ theExtrude: [],
{
type: 'extrudePlane',
position: [-1.2, 2.5, 0],
rotation: [
0.5984837231672995, -0.3765862890544571, 0.3765862890544572,
0.5984837231672996,
],
},
{
type: 'extrudePlane',
position: [-1.58, 4, 0],
rotation: [
0.3024567786448806, 0.6391556125481195, -0.6391556125481194,
0.30245677864488063,
],
},
],
theSketch: [ theSketch: [
{ type: 'toPoint', to: [-3.35, 0.17], from: [0, 0] }, { type: 'toPoint', to: [-3.35, 0.17], from: [0, 0] },
{ type: 'toPoint', to: [0.98, 5.16], from: [-3.35, 0.17] }, { type: 'toPoint', to: [0.98, 5.16], from: [-3.35, 0.17] },

View File

@ -2,24 +2,26 @@ import { abstractSyntaxTree } from './abstractSyntaxTree'
import { lexer } from './tokeniser' import { lexer } from './tokeniser'
import { SketchGroup, ExtrudeGroup } from './executor' import { SketchGroup, ExtrudeGroup } from './executor'
import { initPromise } from './rust' import { initPromise } from './rust'
import { executor } from '../lib/testHelpers' import { enginelessExecutor, executor } from '../lib/testHelpers'
beforeAll(() => initPromise) beforeAll(() => initPromise)
describe('testing artifacts', () => { describe('testing artifacts', () => {
// Enable rotations #152
test('sketch artifacts', async () => { test('sketch artifacts', async () => {
const code = ` const code = `
const mySketch001 = startSketchAt([0, 0]) const mySketch001 = startSketchAt([0, 0])
|> lineTo([-1.59, -1.54], %) |> lineTo([-1.59, -1.54], %)
|> lineTo([0.46, -5.82], %) |> lineTo([0.46, -5.82], %)
|> rx(45, %) // |> rx(45, %)
show(mySketch001)` show(mySketch001)`
const programMemory = await executor(abstractSyntaxTree(lexer(code))) const programMemory = await enginelessExecutor(
const geos = programMemory?.return?.map( abstractSyntaxTree(lexer(code))
)
const shown = programMemory?.return?.map(
(a) => programMemory?.root?.[a.name] (a) => programMemory?.root?.[a.name]
) )
const artifactsWithoutGeos = removeGeo(geos as any) expect(shown).toEqual([
expect(artifactsWithoutGeos).toEqual([
{ {
type: 'sketchGroup', type: 'sketchGroup',
start: { start: {
@ -30,7 +32,6 @@ show(mySketch001)`
id: '66366561-6465-4734-a463-366330356563', id: '66366561-6465-4734-a463-366330356563',
sourceRange: [21, 42], sourceRange: [21, 42],
pathToNode: [], pathToNode: [],
geos: ['sketchBase'],
}, },
}, },
value: [ value: [
@ -42,7 +43,6 @@ show(mySketch001)`
sourceRange: [48, 73], sourceRange: [48, 73],
id: '30366338-6462-4330-a364-303935626163', id: '30366338-6462-4330-a364-303935626163',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
}, },
{ {
@ -53,276 +53,99 @@ show(mySketch001)`
sourceRange: [79, 103], sourceRange: [79, 103],
id: '32653334-6331-4231-b162-663334363535', id: '32653334-6331-4231-b162-663334363535',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
}, },
], ],
position: [0, 0, 0], position: [0, 0, 0],
rotation: [0.3826834323650898, 0, 0, 0.9238795325112867], rotation: [0, 0, 0, 1],
__meta: [ id: '39643164-6130-4734-b432-623638393262',
{ sourceRange: [21, 42], pathToNode: [] }, __meta: [{ sourceRange: [21, 42], pathToNode: [] }],
{ sourceRange: [109, 118], pathToNode: [] },
],
}, },
]) ])
}) })
test('extrude artifacts', async () => { test('extrude artifacts', async () => {
// Enable rotations #152
const code = ` const code = `
const mySketch001 = startSketchAt([0, 0]) const mySketch001 = startSketchAt([0, 0])
|> lineTo([-1.59, -1.54], %) |> lineTo([-1.59, -1.54], %)
|> lineTo([0.46, -5.82], %) |> lineTo([0.46, -5.82], %)
|> rx(45, %) // |> rx(45, %)
|> extrude(2, %) |> extrude(2, %)
show(mySketch001)` show(mySketch001)`
const programMemory = await executor(abstractSyntaxTree(lexer(code))) const programMemory = await enginelessExecutor(
const geos = programMemory?.return?.map( abstractSyntaxTree(lexer(code))
)
const shown = programMemory?.return?.map(
(a) => programMemory?.root?.[a.name] (a) => programMemory?.root?.[a.name]
) )
const artifactsWithoutGeos = removeGeo(geos as any) expect(shown).toEqual([
expect(artifactsWithoutGeos).toEqual([
{ {
type: 'extrudeGroup', type: 'extrudeGroup',
value: [ id: '31616631-3438-4664-a464-393034663561',
{ value: [],
type: 'extrudePlane',
position: [-0.795, -0.5444722215136415, -0.5444722215136416],
rotation: [
0.35471170441873584, 0.3467252481708758, -0.14361830020955396,
0.8563498075401887,
],
__geoMeta: {
id: expect.anything(),
geo: undefined,
refId: '30366338-6462-4330-a364-303935626163',
sourceRange: [48, 73],
pathToNode: [],
},
},
{
type: 'extrudePlane',
position: [
-0.5650000000000001, -2.602152954766495, -2.602152954766495,
],
rotation: [
0.20394238048109659, 0.7817509623502217, -0.3238118510036805,
0.4923604609001174,
],
__geoMeta: {
id: expect.anything(),
geo: undefined,
refId: '32653334-6331-4231-b162-663334363535',
sourceRange: [79, 103],
pathToNode: [],
},
},
],
height: 2, height: 2,
position: [0, 0, 0], position: [0, 0, 0],
rotation: [0.3826834323650898, 0, 0, 0.9238795325112867], rotation: [0, 0, 0, 1],
__meta: [ __meta: [
{ sourceRange: [124, 137], pathToNode: [] }, { sourceRange: [127, 140], pathToNode: [] },
{ sourceRange: [21, 42], pathToNode: [] }, { sourceRange: [21, 42], pathToNode: [] },
], ],
}, },
]) ])
}) })
test('sketch extrude and sketch on one of the faces', async () => { test('sketch extrude and sketch on one of the faces', async () => {
// Enable rotations #152
// TODO #153 in order for getExtrudeWallTransform to work we need to query the engine for the location of a face.
const code = ` const code = `
const sk1 = startSketchAt([0, 0]) const sk1 = startSketchAt([0, 0])
|> lineTo([-2.5, 0], %) |> lineTo([-2.5, 0], %)
|> lineTo({ to: [0, 10], tag: "p" }, %) |> lineTo({ to: [0, 10], tag: "p" }, %)
|> lineTo([2.5, 0], %) |> lineTo([2.5, 0], %)
|> rx(45, %) // |> rx(45, %)
|> translate([1,0,1], %) // |> translate([1,0,1], %)
|> ry(5, %) // |> ry(5, %)
const theExtrude = extrude(2, sk1) const theExtrude = extrude(2, sk1)
const theTransf = getExtrudeWallTransform('p', theExtrude) // const theTransf = getExtrudeWallTransform('p', theExtrude)
const sk2 = startSketchAt([0, 0]) const sk2 = startSketchAt([0, 0])
|> lineTo([-2.5, 0], %) |> lineTo([-2.5, 0], %)
|> lineTo({ to: [0, 3], tag: "p" }, %) |> lineTo({ to: [0, 3], tag: "p" }, %)
|> lineTo([2.5, 0], %) |> lineTo([2.5, 0], %)
|> transform(theTransf, %) // |> transform(theTransf, %)
|> extrude(2, %) |> extrude(2, %)
show(theExtrude, sk2)` show(theExtrude, sk2)`
const programMemory = await executor(abstractSyntaxTree(lexer(code))) const programMemory = await enginelessExecutor(
const geos = programMemory?.return?.map( abstractSyntaxTree(lexer(code))
(a) => programMemory?.root?.[a.name]
) )
const artifactsWithoutGeos = removeGeo(geos as any) const geos = programMemory?.return?.map(
expect(artifactsWithoutGeos).toEqual([ ({ name }) => programMemory?.root?.[name]
)
expect(geos).toEqual([
{ {
type: 'extrudeGroup', type: 'extrudeGroup',
value: [ id: '35623732-3138-4137-a163-626336313834',
{ value: [],
type: 'extrudePlane',
position: [-0.1618929317752782, 0, 1.01798363377866],
rotation: [
0.3823192025331841, -0.04029905920751535, -0.016692416874629204,
0.9230002039112793,
],
__geoMeta: {
id: expect.anything(), // todo figure out why isn't deterministic
geo: undefined,
refId: '36613364-6238-4330-b766-613131633135',
sourceRange: [40, 60],
pathToNode: [],
},
},
{
type: 'extrudePlane',
position: [
0.14624915180581843, 3.5355339059327373, 4.540063765792454,
],
rotation: [
-0.24844095888221532, 0.7523143130765927, -0.2910733573455524,
-0.5362616571538269,
],
__geoMeta: {
id: expect.anything(),
geo: undefined,
refId: '32313832-3531-4933-b839-316634316237',
sourceRange: [66, 102],
pathToNode: [],
},
name: 'p',
},
{
type: 'extrudePlane',
position: [
2.636735897035183, 3.5355339059327386, 4.322174408923308,
],
rotation: [
0.22212685137378593, 0.7027132469491032, -0.3116187916437232,
0.5997895323824204,
],
__geoMeta: {
id: expect.anything(),
geo: undefined,
refId: '31356564-3364-4562-a438-653732633238',
sourceRange: [108, 127],
pathToNode: [],
},
},
],
height: 2, height: 2,
position: [1.083350440839404, 0, 0.9090389553440874], position: [0, 0, 0],
rotation: [ rotation: [0, 0, 0, 1],
0.38231920253318413, 0.04029905920751535, -0.01669241687462921,
0.9230002039112792,
],
__meta: [ __meta: [
{ sourceRange: [203, 218], pathToNode: [] }, { sourceRange: [212, 227], pathToNode: [] },
{ sourceRange: [13, 34], pathToNode: [] }, { sourceRange: [13, 34], pathToNode: [] },
], ],
}, },
{ {
type: 'extrudeGroup', type: 'extrudeGroup',
value: [ id: '64303137-3930-4039-a334-333164373166',
{ value: [],
type: 'extrudePlane',
position: [
0.5230004643466108, 4.393026831645281, 5.367870706359959,
],
rotation: [
-0.5548685410139091, 0.7377864971619333, 0.3261466075583827,
-0.20351996751370383,
],
__geoMeta: {
id: expect.anything(),
geo: undefined,
refId: '31623462-6433-4233-b361-303837663464',
sourceRange: [317, 337],
pathToNode: [],
},
},
{
type: 'extrudePlane',
position: [
0.43055783927228125, 5.453687003425103, 4.311246666755821,
],
rotation: [
0.5307054034531232, -0.4972416536396126, 0.3641462373475848,
-0.5818075544860157,
],
__geoMeta: {
id: expect.anything(),
geo: undefined,
refId: '66363230-3430-4961-b831-646363376538',
sourceRange: [343, 378],
pathToNode: [],
},
name: 'p',
},
{
type: 'extrudePlane',
position: [
-0.3229447858093035, 3.7387011520000146, 2.6556327856208117,
],
rotation: [
0.06000443169260189, 0.12863059446321826, 0.6408199244764428,
-0.7544557394170275,
],
__geoMeta: {
id: expect.anything(),
geo: undefined,
refId: '62366564-3261-4061-b533-623433336531',
sourceRange: [384, 403],
pathToNode: [],
},
},
],
height: 2, height: 2,
position: [0.14624915180581843, 3.5355339059327373, 4.540063765792454], position: [0, 0, 0],
rotation: [ rotation: [0, 0, 0, 1],
0.24844095888221532, -0.7523143130765927, 0.2910733573455524,
-0.5362616571538269,
],
__meta: [ __meta: [
{ sourceRange: [438, 451], pathToNode: [] }, { sourceRange: [453, 466], pathToNode: [] },
{ sourceRange: [290, 311], pathToNode: [] }, { sourceRange: [302, 323], pathToNode: [] },
], ],
}, },
]) ])
}) })
}) })
function removeGeo(arts: (SketchGroup | ExtrudeGroup)[]): any {
return arts.map((art) => {
if (!art) {
return {}
}
if (art?.type === 'extrudeGroup') {
return {
...art,
value: art.value.map((v) => ({
...v,
__geoMeta: {
...v.__geoMeta,
geo: (v?.__geoMeta as any)?.geo?.type,
},
})),
}
}
return {
...art,
start: art.start
? {
...art.start,
__geoMeta: {
...art.start.__geoMeta,
geos: art.start.__geoMeta.geos.map((g) => g.type),
},
}
: {},
value: art.value.map((v) => ({
...v,
__geoMeta: {
...v.__geoMeta,
geos: v.__geoMeta.geos.map((g) => g.type),
},
})),
}
})
}

View File

@ -4,7 +4,7 @@ import { abstractSyntaxTree } from './abstractSyntaxTree'
import { lexer } from './tokeniser' import { lexer } from './tokeniser'
import { ProgramMemory, Path, SketchGroup } from './executor' import { ProgramMemory, Path, SketchGroup } from './executor'
import { initPromise } from './rust' import { initPromise } from './rust'
import { executor } from '../lib/testHelpers' import { enginelessExecutor } from '../lib/testHelpers'
beforeAll(() => initPromise) beforeAll(() => initPromise)
@ -45,7 +45,7 @@ log(5, myVar)`
], ],
}, },
} }
const { root } = await executor(abstractSyntaxTree(lexer(code)), { const { root } = await enginelessExecutor(abstractSyntaxTree(lexer(code)), {
root: programMemoryOverride, root: programMemoryOverride,
pendingMemory: {}, pendingMemory: {},
}) })
@ -75,7 +75,7 @@ show(mySketch)
` `
const { root, return: _return } = await exe(code) const { root, return: _return } = await exe(code)
// geo is three js buffer geometry and is very bloated to have in tests // geo is three js buffer geometry and is very bloated to have in tests
const minusGeo = removeGeoFromPaths(root.mySketch.value) const minusGeo = root.mySketch.value
expect(minusGeo).toEqual([ expect(minusGeo).toEqual([
{ {
type: 'toPoint', type: 'toPoint',
@ -85,7 +85,6 @@ show(mySketch)
sourceRange: [43, 80], sourceRange: [43, 80],
id: '37333036-3033-4432-b530-643030303837', id: '37333036-3033-4432-b530-643030303837',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
name: 'myPath', name: 'myPath',
}, },
@ -97,7 +96,6 @@ show(mySketch)
sourceRange: [86, 102], sourceRange: [86, 102],
id: '32343136-3330-4134-a462-376437386365', id: '32343136-3330-4134-a462-376437386365',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
}, },
{ {
@ -108,7 +106,6 @@ show(mySketch)
sourceRange: [108, 151], sourceRange: [108, 151],
id: '32306132-6130-4138-b832-636363326330', id: '32306132-6130-4138-b832-636363326330',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
name: 'rightPath', name: 'rightPath',
}, },
@ -133,42 +130,43 @@ show(mySketch)
expect(root.myVar.value).toBe(7) expect(root.myVar.value).toBe(7)
}) })
it('rotated sketch', async () => { // Enable rotations #152
const code = [ // it('rotated sketch', async () => {
'const mySk1 = startSketchAt([0,0])', // const code = [
' |> lineTo([1,1], %)', // 'const mySk1 = startSketchAt([0,0])',
' |> lineTo({to: [0, 1], tag: "myPath"}, %)', // ' |> lineTo([1,1], %)',
' |> lineTo([1, 1], %)', // ' |> lineTo({to: [0, 1], tag: "myPath"}, %)',
'const rotated = rx(90, mySk1)', // ' |> lineTo([1, 1], %)',
].join('\n') // 'const rotated = rx(90, mySk1)',
const { root } = await exe(code) // ].join('\n')
expect(root.mySk1.value).toHaveLength(3) // const { root } = await exe(code)
expect(root?.rotated?.type).toBe('sketchGroup') // expect(root.mySk1.value).toHaveLength(3)
if ( // expect(root?.rotated?.type).toBe('sketchGroup')
root?.mySk1?.type !== 'sketchGroup' || // if (
root?.rotated?.type !== 'sketchGroup' // root?.mySk1?.type !== 'sketchGroup' ||
) // root?.rotated?.type !== 'sketchGroup'
throw new Error('not a sketch group') // )
expect(root.mySk1.rotation).toEqual([0, 0, 0, 1]) // throw new Error('not a sketch group')
expect(root.rotated.rotation.map((a) => a.toFixed(4))).toEqual([ // expect(root.mySk1.rotation).toEqual([0, 0, 0, 1])
'0.7071', // expect(root.rotated.rotation.map((a) => a.toFixed(4))).toEqual([
'0.0000', // '0.7071',
'0.0000', // '0.0000',
'0.7071', // '0.0000',
]) // '0.7071',
}) // ])
// })
it('execute pipe sketch into call expression', async () => { it('execute pipe sketch into call expression', async () => {
// Enable rotations #152
const code = [ const code = [
'const mySk1 = startSketchAt([0,0])', 'const mySk1 = startSketchAt([0,0])',
' |> lineTo([1,1], %)', ' |> lineTo([1,1], %)',
' |> lineTo({to: [0, 1], tag: "myPath"}, %)', ' |> lineTo({to: [0, 1], tag: "myPath"}, %)',
' |> lineTo([1,1], %)', ' |> lineTo([1,1], %)',
' |> rx(90, %)', // ' |> rx(90, %)',
].join('\n') ].join('\n')
const { root } = await exe(code) const { root } = await exe(code)
const striptVersion = removeGeoFromSketch(root.mySk1 as SketchGroup) expect(root.mySk1).toEqual({
expect(striptVersion).toEqual({
type: 'sketchGroup', type: 'sketchGroup',
start: { start: {
type: 'base', type: 'base',
@ -178,7 +176,6 @@ show(mySketch)
id: '37663863-3664-4366-a637-623739336334', id: '37663863-3664-4366-a637-623739336334',
sourceRange: [14, 34], sourceRange: [14, 34],
pathToNode: [], pathToNode: [],
geos: ['sketchBase'],
}, },
}, },
value: [ value: [
@ -190,7 +187,6 @@ show(mySketch)
sourceRange: [40, 56], sourceRange: [40, 56],
id: '34356231-3362-4363-b935-393033353034', id: '34356231-3362-4363-b935-393033353034',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
}, },
{ {
@ -201,7 +197,6 @@ show(mySketch)
sourceRange: [62, 100], sourceRange: [62, 100],
id: '39623339-3538-4366-b633-356630326639', id: '39623339-3538-4366-b633-356630326639',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
name: 'myPath', name: 'myPath',
}, },
@ -213,16 +208,13 @@ show(mySketch)
sourceRange: [106, 122], sourceRange: [106, 122],
id: '30636135-6232-4335-b665-366562303161', id: '30636135-6232-4335-b665-366562303161',
pathToNode: [], pathToNode: [],
geos: ['line', 'lineEnd'],
}, },
}, },
], ],
position: [0, 0, 0], position: [0, 0, 0],
rotation: [0.7071067811865475, 0, 0, 0.7071067811865476], rotation: [0, 0, 0, 1],
__meta: [ id: '30376661-3039-4965-b532-653665313731',
{ sourceRange: [14, 34], pathToNode: [] }, __meta: [{ sourceRange: [14, 34], pathToNode: [] }],
{ sourceRange: [128, 137], pathToNode: [] },
],
}) })
}) })
it('execute array expression', async () => { it('execute array expression', async () => {
@ -408,7 +400,7 @@ describe('testing math operators', () => {
'|> line([-2.21, -legLen(5, min(3, 999))], %)', '|> line([-2.21, -legLen(5, min(3, 999))], %)',
].join('\n') ].join('\n')
const { root } = await exe(code) const { root } = await exe(code)
const sketch = removeGeoFromSketch(root.part001 as SketchGroup) const sketch = root.part001
// result of `-legLen(5, min(3, 999))` should be -4 // result of `-legLen(5, min(3, 999))` should be -4
const yVal = sketch.value?.[0]?.to?.[1] const yVal = sketch.value?.[0]?.to?.[1]
expect(yVal).toBe(-4) expect(yVal).toBe(-4)
@ -426,7 +418,7 @@ describe('testing math operators', () => {
`show(part001)`, `show(part001)`,
].join('\n') ].join('\n')
const { root } = await exe(code) const { root } = await exe(code)
const sketch = removeGeoFromSketch(root.part001 as SketchGroup) const sketch = root.part001
// expect -legLen(segLen('seg01', %), myVar) to equal -4 setting the y value back to 0 // expect -legLen(segLen('seg01', %), myVar) to equal -4 setting the y value back to 0
expect(sketch.value?.[1]?.from).toEqual([3, 4]) expect(sketch.value?.[1]?.from).toEqual([3, 4])
expect(sketch.value?.[1]?.to).toEqual([6, 0]) expect(sketch.value?.[1]?.to).toEqual([6, 0])
@ -435,9 +427,8 @@ describe('testing math operators', () => {
`legLen(segLen('seg01', %), myVar)` `legLen(segLen('seg01', %), myVar)`
) )
const { root: removedUnaryExpRoot } = await exe(removedUnaryExp) const { root: removedUnaryExpRoot } = await exe(removedUnaryExp)
const removedUnaryExpRootSketch = removeGeoFromSketch( const removedUnaryExpRootSketch = removedUnaryExpRoot.part001
removedUnaryExpRoot.part001 as SketchGroup
)
// without the minus sign, the y value should be 8 // without the minus sign, the y value should be 8
expect(removedUnaryExpRootSketch.value?.[1]?.to).toEqual([6, 8]) expect(removedUnaryExpRootSketch.value?.[1]?.to).toEqual([6, 8])
}) })
@ -457,35 +448,6 @@ async function exe(
const tokens = lexer(code) const tokens = lexer(code)
const ast = abstractSyntaxTree(tokens) const ast = abstractSyntaxTree(tokens)
const result = await executor(ast, programMemory) const result = await enginelessExecutor(ast, programMemory)
return result return result
} }
function removeGeoFromSketch(sketch: SketchGroup): SketchGroup {
return {
...sketch,
start: !sketch.start
? undefined
: {
...sketch.start,
__geoMeta: {
...sketch.start.__geoMeta,
geos: sketch.start.__geoMeta.geos.map((geo) => geo.type as any),
},
},
value: removeGeoFromPaths(sketch.value),
}
}
function removeGeoFromPaths(paths: Path[]): any[] {
return paths.map((path: Path) => {
const newGeos = path?.__geoMeta?.geos.map((geo) => geo.type)
return {
...path,
__geoMeta: {
...path.__geoMeta,
geos: newGeos,
},
}
})
}

View File

@ -33,9 +33,6 @@ interface BasePath {
name?: string name?: string
__geoMeta: { __geoMeta: {
id: string id: string
geos: {
type: 'line' | 'lineEnd' | 'sketchBase'
}[]
sourceRange: SourceRange sourceRange: SourceRange
pathToNode: PathToNode pathToNode: PathToNode
} }
@ -94,6 +91,7 @@ export type ExtrudeSurface = GeoMeta &
export interface ExtrudeGroup { export interface ExtrudeGroup {
type: 'extrudeGroup' type: 'extrudeGroup'
id: string
value: ExtrudeSurface[] value: ExtrudeSurface[]
height: number height: number
position: Position position: Position

View File

@ -16,7 +16,7 @@ import {
import { recast } from './recast' import { recast } from './recast'
import { lexer } from './tokeniser' import { lexer } from './tokeniser'
import { initPromise } from './rust' import { initPromise } from './rust'
import { executor } from '../lib/testHelpers' import { enginelessExecutor } from '../lib/testHelpers'
beforeAll(() => initPromise) beforeAll(() => initPromise)
@ -196,7 +196,7 @@ const yo2 = hmm([identifierGuy + 5])
show(part001)` show(part001)`
it('should move a value into a new variable', async () => { it('should move a value into a new variable', async () => {
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const startIndex = code.indexOf('100 + 100') + 1 const startIndex = code.indexOf('100 + 100') + 1
const { modifiedAst } = moveValueIntoNewVariable( const { modifiedAst } = moveValueIntoNewVariable(
ast, ast,
@ -210,7 +210,7 @@ show(part001)`
}) })
it('should move a value into a new variable', async () => { it('should move a value into a new variable', async () => {
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const startIndex = code.indexOf('2.8') + 1 const startIndex = code.indexOf('2.8') + 1
const { modifiedAst } = moveValueIntoNewVariable( const { modifiedAst } = moveValueIntoNewVariable(
ast, ast,
@ -224,7 +224,7 @@ show(part001)`
}) })
it('should move a value into a new variable', async () => { it('should move a value into a new variable', async () => {
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const startIndex = code.indexOf('def(') const startIndex = code.indexOf('def(')
const { modifiedAst } = moveValueIntoNewVariable( const { modifiedAst } = moveValueIntoNewVariable(
ast, ast,
@ -238,7 +238,7 @@ show(part001)`
}) })
it('should move a value into a new variable', async () => { it('should move a value into a new variable', async () => {
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const startIndex = code.indexOf('jkl(') + 1 const startIndex = code.indexOf('jkl(') + 1
const { modifiedAst } = moveValueIntoNewVariable( const { modifiedAst } = moveValueIntoNewVariable(
ast, ast,
@ -252,7 +252,7 @@ show(part001)`
}) })
it('should move a value into a new variable', async () => { it('should move a value into a new variable', async () => {
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const startIndex = code.indexOf('identifierGuy +') + 1 const startIndex = code.indexOf('identifierGuy +') + 1
const { modifiedAst } = moveValueIntoNewVariable( const { modifiedAst } = moveValueIntoNewVariable(
ast, ast,

View File

@ -7,7 +7,7 @@ import {
} from './queryAst' } from './queryAst'
import { lexer } from './tokeniser' import { lexer } from './tokeniser'
import { initPromise } from './rust' import { initPromise } from './rust'
import { executor } from '../lib/testHelpers' import { enginelessExecutor } from '../lib/testHelpers'
import { import {
createArrayExpression, createArrayExpression,
createCallExpression, createCallExpression,
@ -38,7 +38,7 @@ const variableBelowShouldNotBeIncluded = 3
show(part001)` show(part001)`
const rangeStart = code.indexOf('// selection-range-7ish-before-this') - 7 const rangeStart = code.indexOf('// selection-range-7ish-before-this') - 7
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const { variables, bodyPath, insertIndex } = findAllPreviousVariables( const { variables, bodyPath, insertIndex } = findAllPreviousVariables(
ast, ast,

View File

@ -86,6 +86,8 @@ export class EngineCommandManager {
socket?: WebSocket socket?: WebSocket
pc?: RTCPeerConnection pc?: RTCPeerConnection
lossyDataChannel?: RTCDataChannel lossyDataChannel?: RTCDataChannel
waitForReady: Promise<void> = new Promise(() => {})
private resolveReady = () => {}
onHoverCallback: (id?: string) => void = () => {} onHoverCallback: (id?: string) => void = () => {}
onClickCallback: (selection: SelectionsArgs) => void = () => {} onClickCallback: (selection: SelectionsArgs) => void = () => {}
onCursorsSelectedCallback: (selections: CursorSelectionsArgs) => void = onCursorsSelectedCallback: (selections: CursorSelectionsArgs) => void =
@ -97,12 +99,18 @@ export class EngineCommandManager {
setMediaStream: (stream: MediaStream) => void setMediaStream: (stream: MediaStream) => void
setIsStreamReady: (isStreamReady: boolean) => void setIsStreamReady: (isStreamReady: boolean) => void
}) { }) {
this.waitForReady = new Promise((resolve) => {
this.resolveReady = resolve
})
const url = 'wss://api.dev.kittycad.io/ws/modeling/commands' const url = 'wss://api.dev.kittycad.io/ws/modeling/commands'
this.socket = new WebSocket(url)
this.socket = new WebSocket(url, [])
this.pc = new RTCPeerConnection() this.pc = new RTCPeerConnection()
this.pc.createDataChannel('unreliable_modeling_cmds') this.pc.createDataChannel('unreliable_modeling_cmds')
this.socket.addEventListener('open', (event) => { this.socket.addEventListener('open', (event) => {
console.log('Connected to websocket, waiting for ICE servers') console.log('Connected to websocket, waiting for ICE servers')
setIsStreamReady(true)
this.resolveReady()
}) })
this.socket.addEventListener('close', (event) => { this.socket.addEventListener('close', (event) => {
@ -114,7 +122,7 @@ export class EngineCommandManager {
}) })
this?.socket?.addEventListener('message', (event) => { this?.socket?.addEventListener('message', (event) => {
if (!this.pc || !this.socket) return if (!this.socket) return
//console.log('Message from server ', event.data); //console.log('Message from server ', event.data);
if (event.data instanceof Blob) { if (event.data instanceof Blob) {
@ -133,12 +141,12 @@ export class EngineCommandManager {
} else { } else {
const message = JSON.parse(event.data) const message = JSON.parse(event.data)
if (message.type === 'SDPAnswer') { if (message.type === 'SDPAnswer') {
this.pc.setRemoteDescription( this.pc?.setRemoteDescription(
new RTCSessionDescription(message.answer) new RTCSessionDescription(message.answer)
) )
} else if (message.type === 'IceServerInfo') { } else if (message.type === 'IceServerInfo' && this.pc) {
console.log('received IceServerInfo') console.log('received IceServerInfo')
this.pc.setConfiguration({ this.pc?.setConfiguration({
iceServers: message.ice_servers, iceServers: message.ice_servers,
}) })
this.pc.addEventListener('track', (event) => { this.pc.addEventListener('track', (event) => {
@ -184,7 +192,6 @@ export class EngineCommandManager {
this.lossyDataChannel = event.channel this.lossyDataChannel = event.channel
console.log('accepted lossy data channel', event.channel.label) console.log('accepted lossy data channel', event.channel.label)
this.lossyDataChannel.addEventListener('open', (event) => { this.lossyDataChannel.addEventListener('open', (event) => {
setIsStreamReady(true)
console.log('lossy data channel opened', event) console.log('lossy data channel opened', event)
}) })
this.lossyDataChannel.addEventListener('close', (event) => { this.lossyDataChannel.addEventListener('close', (event) => {
@ -197,23 +204,38 @@ export class EngineCommandManager {
console.log('lossy data channel message: ', event) console.log('lossy data channel message: ', event)
}) })
}) })
} else if (message.cmd_id) {
const id = message.cmd_id
const command = this.artifactMap[id]
if (command && command.type === 'pending') {
const resolve = command.resolve
this.artifactMap[id] = {
type: 'result',
data: message.result,
}
resolve({
id,
})
} else {
this.artifactMap[id] = {
type: 'result',
data: message.result,
}
} }
// TODO talk to the gang about this // TODO talk to the gang about this
// the following message types are made up // the following message types are made up
// and are placeholders // and are placeholders
else if (message.type === 'hover') { } else if (message.type === 'hover') {
this.onHoverCallback(message.id) this.onHoverCallback(message.id)
} else if (message.type === 'click') { } else if (message.type === 'click') {
this.onClickCallback(message) this.onClickCallback(message)
} else { } else {
console.log('other message', message)
} }
} }
}) })
} }
tearDown() { tearDown() {
// close all channels, sockets and WebRTC connections // close all channels, sockets and WebRTC connections
console.log('tearing it all down')
this.lossyDataChannel?.close() this.lossyDataChannel?.close()
this.socket?.close() this.socket?.close()
this.pc?.close() this.pc?.close()
@ -222,46 +244,6 @@ export class EngineCommandManager {
startNewSession() { startNewSession() {
this.artifactMap = {} this.artifactMap = {}
this.sourceRangeMap = {} this.sourceRangeMap = {}
// socket.on('command', ({ id, data }: any) => {
// const command = this.artifactMap[id]
// const geos: any = {}
// if (data.geo) {
// geos.position = data.position
// geos.rotation = data.rotation
// geos.originalId = data.originalId
// try {
// geos.geo = stlLoader.parse(data.geo)
// } catch (e) {}
// } else {
// Object.entries(data).forEach(([key, val]: [string, any]) => {
// let bufferGeometry = new BufferGeometry()
// try {
// bufferGeometry = stlLoader.parse(val)
// } catch (e) {
// console.log('val', val)
// }
// geos[key] = bufferGeometry
// })
// }
// if (command && command.type === 'pending') {
// const resolve = command.resolve
// this.artifactMap[id] = {
// type: 'result',
// data: geos,
// }
// resolve({
// id,
// geo: geos,
// })
// } else {
// this.artifactMap[id] = {
// type: 'result',
// data: geos,
// }
// }
// })
} }
endSession() { endSession() {
// this.socket?.close() // this.socket?.close()
@ -308,7 +290,6 @@ export class EngineCommandManager {
this.lossyDataChannel.send(JSON.stringify(command)) this.lossyDataChannel.send(JSON.stringify(command))
return return
} }
console.log('sending through TCP')
this.socket?.send(JSON.stringify(command)) this.socket?.send(JSON.stringify(command))
} }
sendModellingCommand({ sendModellingCommand({
@ -322,22 +303,12 @@ export class EngineCommandManager {
range: SourceRange range: SourceRange
command: EngineCommand command: EngineCommand
}): Promise<any> { }): Promise<any> {
if (!this.socket?.OPEN) {
console.log('socket not open')
return new Promise(() => {})
}
this.sourceRangeMap[id] = range this.sourceRangeMap[id] = range
// return early if the socket is still in CONNECTING state
if (this.socket?.readyState === 0) { if (this.socket?.readyState === 0) {
console.log('socket not ready') console.log('socket not ready')
return new Promise(() => {}) return new Promise(() => {})
} }
console.log('sending command', {
id,
data: params,
command,
})
this.socket?.send(JSON.stringify(command)) this.socket?.send(JSON.stringify(command))
let resolve: (val: any) => void = () => {} let resolve: (val: any) => void = () => {}
const promise = new Promise((_resolve, reject) => { const promise = new Promise((_resolve, reject) => {

View File

@ -56,6 +56,7 @@ export const extrude: InternalFn = (
return { return {
type: 'extrudeGroup', type: 'extrudeGroup',
id,
value: extrudeSurfaces, // TODO, this is just an empty array now, should be deleted. value: extrudeSurfaces, // TODO, this is just an empty array now, should be deleted.
height: length, height: length,
position, position,

View File

@ -9,7 +9,7 @@ import { lexer } from '../tokeniser'
import { abstractSyntaxTree } from '../abstractSyntaxTree' import { abstractSyntaxTree } from '../abstractSyntaxTree'
import { getNodePathFromSourceRange } from '../queryAst' import { getNodePathFromSourceRange } from '../queryAst'
import { recast } from '../recast' import { recast } from '../recast'
import { executor } from '../../lib/testHelpers' import { enginelessExecutor } from '../../lib/testHelpers'
import { initPromise } from '../rust' import { initPromise } from '../rust'
beforeAll(() => initPromise) beforeAll(() => initPromise)
@ -97,16 +97,17 @@ describe('testing changeSketchArguments', () => {
const lineToChange = 'lineTo([-1.59, -1.54], %)' const lineToChange = 'lineTo([-1.59, -1.54], %)'
const lineAfterChange = 'lineTo([2, 3], %)' const lineAfterChange = 'lineTo([2, 3], %)'
test('changeSketchArguments', async () => { test('changeSketchArguments', async () => {
// Enable rotations #152
const genCode = (line: string) => ` const genCode = (line: string) => `
const mySketch001 = startSketchAt([0, 0]) const mySketch001 = startSketchAt([0, 0])
|> ${line} |> ${line}
|> lineTo([0.46, -5.82], %) |> lineTo([0.46, -5.82], %)
|> rx(45, %) // |> rx(45, %)
show(mySketch001)` show(mySketch001)`
const code = genCode(lineToChange) const code = genCode(lineToChange)
const expectedCode = genCode(lineAfterChange) const expectedCode = genCode(lineAfterChange)
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const sourceStart = code.indexOf(lineToChange) const sourceStart = code.indexOf(lineToChange)
const { modifiedAst } = changeSketchArguments( const { modifiedAst } = changeSketchArguments(
ast, ast,
@ -136,14 +137,15 @@ describe('testing addNewSketchLn', () => {
const lineToChange = 'lineTo([-1.59, -1.54], %)' const lineToChange = 'lineTo([-1.59, -1.54], %)'
const lineAfterChange = 'lineTo([2, 3], %)' const lineAfterChange = 'lineTo([2, 3], %)'
test('addNewSketchLn', async () => { test('addNewSketchLn', async () => {
// Enable rotations #152
const code = ` const code = `
const mySketch001 = startSketchAt([0, 0]) const mySketch001 = startSketchAt([0, 0])
|> rx(45, %) // |> rx(45, %)
|> lineTo([-1.59, -1.54], %) |> lineTo([-1.59, -1.54], %)
|> lineTo([0.46, -5.82], %) |> lineTo([0.46, -5.82], %)
show(mySketch001)` show(mySketch001)`
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const sourceStart = code.indexOf(lineToChange) const sourceStart = code.indexOf(lineToChange)
const { modifiedAst } = addNewSketchLn({ const { modifiedAst } = addNewSketchLn({
node: ast, node: ast,
@ -158,9 +160,10 @@ show(mySketch001)`
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
], ],
}) })
// Enable rotations #152
const expectedCode = ` const expectedCode = `
const mySketch001 = startSketchAt([0, 0]) const mySketch001 = startSketchAt([0, 0])
|> rx(45, %) // |> rx(45, %)
|> lineTo([-1.59, -1.54], %) |> lineTo([-1.59, -1.54], %)
|> lineTo([0.46, -5.82], %) |> lineTo([0.46, -5.82], %)
|> lineTo([2, 3], %) |> lineTo([2, 3], %)
@ -172,15 +175,16 @@ show(mySketch001)`
describe('testing addTagForSketchOnFace', () => { describe('testing addTagForSketchOnFace', () => {
it('needs to be in it', async () => { it('needs to be in it', async () => {
const originalLine = 'lineTo([-1.59, -1.54], %)' const originalLine = 'lineTo([-1.59, -1.54], %)'
// Enable rotations #152
const genCode = (line: string) => ` const genCode = (line: string) => `
const mySketch001 = startSketchAt([0, 0]) const mySketch001 = startSketchAt([0, 0])
|> rx(45, %) // |> rx(45, %)
|> ${line} |> ${line}
|> lineTo([0.46, -5.82], %) |> lineTo([0.46, -5.82], %)
show(mySketch001)` show(mySketch001)`
const code = genCode(originalLine) const code = genCode(originalLine)
const ast = abstractSyntaxTree(lexer(code)) const ast = abstractSyntaxTree(lexer(code))
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const sourceStart = code.indexOf(originalLine) const sourceStart = code.indexOf(originalLine)
const sourceRange: [number, number] = [ const sourceRange: [number, number] = [
sourceStart, sourceStart,

View File

@ -154,14 +154,6 @@ export const lineTo: SketchLineHelper = {
sourceRange, sourceRange,
id, id,
pathToNode: [], // TODO pathToNode: [], // TODO
geos: [
{
type: 'line',
},
{
type: 'lineEnd',
},
],
}, },
} }
if ('tag' in data) { if ('tag' in data) {
@ -303,14 +295,6 @@ export const line: SketchLineHelper = {
id, id,
sourceRange, sourceRange,
pathToNode: [], // TODO pathToNode: [], // TODO
geos: [
{
type: 'line',
},
{
type: 'lineEnd',
},
],
}, },
} }
if (data !== 'default' && 'tag' in data) { if (data !== 'default' && 'tag' in data) {
@ -714,14 +698,6 @@ export const angledLine: SketchLineHelper = {
id, id,
sourceRange, sourceRange,
pathToNode: [], // TODO pathToNode: [], // TODO
geos: [
{
type: 'line',
},
{
type: 'lineEnd',
},
],
}, },
} }
if ('tag' in data) { if ('tag' in data) {
@ -1614,14 +1590,6 @@ export const close: InternalFn = (
id, id,
sourceRange, sourceRange,
pathToNode: [], // TODO pathToNode: [], // TODO
geos: [
{
type: 'line',
},
{
type: 'lineEnd',
},
],
}, },
} }
const newValue = [...sketchGroup.value] const newValue = [...sketchGroup.value]
@ -1700,11 +1668,6 @@ export const startSketchAt: InternalFn = (
id, id,
sourceRange, sourceRange,
pathToNode: [], // TODO pathToNode: [], // TODO
geos: [
{
type: 'sketchBase',
},
],
}, },
} }
if (data !== 'default' && 'tag' in data) { if (data !== 'default' && 'tag' in data) {

View File

@ -10,7 +10,7 @@ import { recast } from '../recast'
import { initPromise } from '../rust' import { initPromise } from '../rust'
import { getSketchSegmentFromSourceRange } from './sketchConstraints' import { getSketchSegmentFromSourceRange } from './sketchConstraints'
import { Selection } from '../../useStore' import { Selection } from '../../useStore'
import { executor } from '../../lib/testHelpers' import { enginelessExecutor } from '../../lib/testHelpers'
beforeAll(() => initPromise) beforeAll(() => initPromise)
@ -34,7 +34,7 @@ async function testingSwapSketchFnCall({
} }
const tokens = lexer(inputCode) const tokens = lexer(inputCode)
const ast = abstractSyntaxTree(tokens) const ast = abstractSyntaxTree(tokens)
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const selections = { const selections = {
codeBasedSelections: [range], codeBasedSelections: [range],
otherSelections: [], otherSelections: [],
@ -273,6 +273,7 @@ describe('testing swaping out sketch calls with xLine/xLineTo', () => {
}) })
describe('testing swaping out sketch calls with xLine/xLineTo while keeping variable/identifiers intact', () => { describe('testing swaping out sketch calls with xLine/xLineTo while keeping variable/identifiers intact', () => {
// Enable rotations #152
const variablesExampleArr = [ const variablesExampleArr = [
`const lineX = -1`, `const lineX = -1`,
`const lineToX = -1.3`, `const lineToX = -1.3`,
@ -282,7 +283,7 @@ describe('testing swaping out sketch calls with xLine/xLineTo while keeping vari
`const angledLineToXx = -1.86`, `const angledLineToXx = -1.86`,
`const angledLineToYy = -0.76`, `const angledLineToYy = -0.76`,
`const part001 = startSketchAt([0, 0])`, `const part001 = startSketchAt([0, 0])`,
` |> rx(90, %)`, // ` |> rx(90, %)`,
` |> lineTo([1, 1], %)`, ` |> lineTo([1, 1], %)`,
` |> line([lineX, 2.13], %)`, ` |> line([lineX, 2.13], %)`,
` |> lineTo([lineToX, 2.85], %)`, ` |> lineTo([lineToX, 2.85], %)`,
@ -382,7 +383,9 @@ const part001 = startSketchAt([0, 0.04]) // segment-in-start
|> xLine(3.54, %) |> xLine(3.54, %)
show(part001)` show(part001)`
it('normal case works', async () => { it('normal case works', async () => {
const programMemory = await executor(abstractSyntaxTree(lexer(code))) const programMemory = await enginelessExecutor(
abstractSyntaxTree(lexer(code))
)
const index = code.indexOf('// normal-segment') - 7 const index = code.indexOf('// normal-segment') - 7
const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange( const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange(
programMemory.root['part001'] as SketchGroup, programMemory.root['part001'] as SketchGroup,
@ -395,7 +398,9 @@ show(part001)`
}) })
}) })
it('verify it works when the segment is in the `start` property', async () => { it('verify it works when the segment is in the `start` property', async () => {
const programMemory = await executor(abstractSyntaxTree(lexer(code))) const programMemory = await enginelessExecutor(
abstractSyntaxTree(lexer(code))
)
const index = code.indexOf('// segment-in-start') - 7 const index = code.indexOf('// segment-in-start') - 7
const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange( const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange(
programMemory.root['part001'] as SketchGroup, programMemory.root['part001'] as SketchGroup,

View File

@ -10,7 +10,7 @@ import {
} from './sketchcombos' } from './sketchcombos'
import { initPromise } from '../rust' import { initPromise } from '../rust'
import { Selections, TooTip } from '../../useStore' import { Selections, TooTip } from '../../useStore'
import { executor } from '../../lib/testHelpers' import { enginelessExecutor } from '../../lib/testHelpers'
import { recast } from '../../lang/recast' import { recast } from '../../lang/recast'
beforeAll(() => initPromise) beforeAll(() => initPromise)
@ -210,7 +210,7 @@ show(part001)`
} }
}) })
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const transformInfos = getTransformInfos( const transformInfos = getTransformInfos(
makeSelections(selectionRanges.slice(1)), makeSelections(selectionRanges.slice(1)),
ast, ast,
@ -295,7 +295,7 @@ show(part001)`
} }
}) })
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const transformInfos = getTransformInfos( const transformInfos = getTransformInfos(
makeSelections(selectionRanges), makeSelections(selectionRanges),
ast, ast,
@ -352,7 +352,7 @@ show(part001)`
} }
}) })
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const transformInfos = getTransformInfos( const transformInfos = getTransformInfos(
makeSelections(selectionRanges), makeSelections(selectionRanges),
ast, ast,
@ -444,7 +444,7 @@ async function helperThing(
} }
}) })
const programMemory = await executor(ast) const programMemory = await enginelessExecutor(ast)
const transformInfos = getTransformInfos( const transformInfos = getTransformInfos(
makeSelections(selectionRanges.slice(1)), makeSelections(selectionRanges.slice(1)),
ast, ast,

View File

@ -1,5 +1,5 @@
import { abstractSyntaxTree } from '../abstractSyntaxTree' import { abstractSyntaxTree } from '../abstractSyntaxTree'
import { executor } from '../../lib/testHelpers' import { enginelessExecutor } from '../../lib/testHelpers'
import { lexer } from '../tokeniser' import { lexer } from '../tokeniser'
import { initPromise } from '../rust' import { initPromise } from '../rust'
@ -18,9 +18,11 @@ describe('testing angledLineThatIntersects', () => {
}, %) }, %)
const intersect = segEndX('yo2', part001) const intersect = segEndX('yo2', part001)
show(part001)` show(part001)`
const { root } = await executor(abstractSyntaxTree(lexer(code('-1')))) const { root } = await enginelessExecutor(
abstractSyntaxTree(lexer(code('-1')))
)
expect(root.intersect.value).toBe(1 + Math.sqrt(2)) expect(root.intersect.value).toBe(1 + Math.sqrt(2))
const { root: noOffset } = await executor( const { root: noOffset } = await enginelessExecutor(
abstractSyntaxTree(lexer(code('0'))) abstractSyntaxTree(lexer(code('0')))
) )
expect(noOffset.intersect.value).toBeCloseTo(1) expect(noOffset.intersect.value).toBeCloseTo(1)

View File

@ -95,7 +95,7 @@ const legAngY: InternalFn = (_, hypotenuse: number, leg: number): number =>
export const internalFns: { [key in InternalFnNames]: InternalFn } = { export const internalFns: { [key in InternalFnNames]: InternalFn } = {
// TODO - re-enable these // TODO - re-enable these
// rx: rotateOnAxis([1, 0, 0]), // rx: rotateOnAxis([1, 0, 0]), // Enable rotations #152
// ry: rotateOnAxis([0, 1, 0]), // ry: rotateOnAxis([0, 1, 0]),
// rz: rotateOnAxis([0, 0, 1]), // rz: rotateOnAxis([0, 0, 1]),
extrude, extrude,

View File

@ -23,7 +23,7 @@ export type InternalFnNames =
// TODO re-enable these // TODO re-enable these
// | 'translate' // | 'translate'
// | 'transform' // | 'transform'
// | 'rx' // | 'rx' // Enable rotations #152
// | 'ry' // | 'ry'
// | 'rz' // | 'rz'
| 'extrude' | 'extrude'

View File

@ -2,6 +2,33 @@ import { Program } from '../lang/abstractSyntaxTree'
import { ProgramMemory, _executor } from '../lang/executor' import { ProgramMemory, _executor } from '../lang/executor'
import { EngineCommandManager } from '../lang/std/engineConnection' import { EngineCommandManager } from '../lang/std/engineConnection'
class MockEngineCommandManager {
constructor(mockParams: {
setIsStreamReady: (isReady: boolean) => void
setMediaStream: (stream: MediaStream) => void
}) {}
startNewSession() {}
waitForAllCommands() {}
waitForReady = new Promise<void>((resolve) => resolve())
sendModellingCommand() {}
sendSceneCommand() {}
}
export async function enginelessExecutor(
ast: Program,
pm: ProgramMemory = { root: {}, pendingMemory: {} }
): Promise<ProgramMemory> {
const mockEngineCommandManager = new MockEngineCommandManager({
setIsStreamReady: () => {},
setMediaStream: () => {},
}) as any as EngineCommandManager
await mockEngineCommandManager.waitForReady
mockEngineCommandManager.startNewSession()
const programMemory = await _executor(ast, pm, mockEngineCommandManager)
await mockEngineCommandManager.waitForAllCommands()
return programMemory
}
export async function executor( export async function executor(
ast: Program, ast: Program,
pm: ProgramMemory = { root: {}, pendingMemory: {} } pm: ProgramMemory = { root: {}, pendingMemory: {} }
@ -10,6 +37,7 @@ export async function executor(
setIsStreamReady: () => {}, setIsStreamReady: () => {},
setMediaStream: () => {}, setMediaStream: () => {},
}) })
await engineCommandManager.waitForReady
engineCommandManager.startNewSession() engineCommandManager.startNewSession()
const programMemory = await _executor(ast, pm, engineCommandManager) const programMemory = await _executor(ast, pm, engineCommandManager)
await engineCommandManager.waitForAllCommands() await engineCommandManager.waitForAllCommands()

View File

@ -3,5 +3,21 @@
// expect(element).toHaveTextContent(/react/i) // expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom // learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom' import '@testing-library/jest-dom'
import WebSocket from 'ws';
import 'setimmediate' import 'setimmediate'
// @ts-ignore
import wrtc from 'wrtc'
class WebsocketWrapper {
constructor(url: string) {
return new WebSocket(url, {
headers: {
'Autherization': `Bearer ${process.env.KITTYCAD_TOKEN}`,
}
})
}
}
global.RTCPeerConnection = wrtc.RTCPeerConnection
// @ts-ignore
global.WebSocket = WebsocketWrapper

357
yarn.lock
View File

@ -2610,6 +2610,13 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/ws@^8.5.5":
version "8.5.5"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb"
integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==
dependencies:
"@types/node" "*"
"@types/yargs-parser@*": "@types/yargs-parser@*":
version "15.0.0" version "15.0.0"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
@ -2880,6 +2887,11 @@ abab@^2.0.3, abab@^2.0.5:
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
accepts@~1.3.4, accepts@~1.3.5: accepts@~1.3.4, accepts@~1.3.5:
version "1.3.7" version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@ -3063,6 +3075,11 @@ ansi-html-community@^0.0.8:
resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
ansi-regex@^5.0.0: ansi-regex@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
@ -3113,6 +3130,19 @@ anymatch@^3.0.3, anymatch@~3.1.2:
normalize-path "^3.0.0" normalize-path "^3.0.0"
picomatch "^2.0.4" picomatch "^2.0.4"
aproba@^1.0.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
are-we-there-yet@~1.1.2:
version "1.1.7"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==
dependencies:
delegates "^1.0.0"
readable-stream "^2.0.6"
arg@^4.1.0: arg@^4.1.0:
version "4.1.3" version "4.1.3"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
@ -3677,6 +3707,11 @@ chokidar@^3.4.2, chokidar@^3.5.3:
optionalDependencies: optionalDependencies:
fsevents "~2.3.2" fsevents "~2.3.2"
chownr@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
chownr@^2.0.0: chownr@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
@ -3739,6 +3774,11 @@ coa@^2.0.2:
chalk "^2.4.1" chalk "^2.4.1"
q "^1.1.2" q "^1.1.2"
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==
codemirror@^6.0.0: codemirror@^6.0.0:
version "6.0.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29"
@ -3863,6 +3903,11 @@ connect-history-api-fallback@^2.0.0:
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8"
integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
content-disposition@0.5.4: content-disposition@0.5.4:
version "0.5.4" version "0.5.4"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
@ -4219,7 +4264,7 @@ debug@^3.0.0:
dependencies: dependencies:
ms "^2.1.1" ms "^2.1.1"
debug@^3.2.7: debug@^3.2.6, debug@^3.2.7:
version "3.2.7" version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@ -4264,6 +4309,11 @@ deep-equal@^2.0.5:
which-collection "^1.0.1" which-collection "^1.0.1"
which-typed-array "^1.1.8" which-typed-array "^1.1.8"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-is@^0.1.3: deep-is@^0.1.3:
version "0.1.4" version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@ -4316,6 +4366,11 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
depd@2.0.0: depd@2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@ -4331,6 +4386,11 @@ destroy@1.2.0:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
detect-newline@^3.0.0: detect-newline@^3.0.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
@ -4460,6 +4520,13 @@ domelementtype@^2.2.0:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
domexception@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
dependencies:
webidl-conversions "^4.0.2"
domexception@^2.0.1: domexception@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
@ -5320,6 +5387,13 @@ fs-extra@^9.0.0, fs-extra@^9.0.1:
jsonfile "^6.0.1" jsonfile "^6.0.1"
universalify "^2.0.0" universalify "^2.0.0"
fs-minipass@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
dependencies:
minipass "^2.6.0"
fs-minipass@^2.0.0: fs-minipass@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@ -5362,6 +5436,20 @@ functions-have-names@^1.2.2:
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
has-unicode "^2.0.0"
object-assign "^4.1.0"
signal-exit "^3.0.0"
string-width "^1.0.1"
strip-ansi "^3.0.1"
wide-align "^1.1.0"
gensync@^1.0.0-beta.1: gensync@^1.0.0-beta.1:
version "1.0.0-beta.1" version "1.0.0-beta.1"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
@ -5558,6 +5646,11 @@ has-tostringtag@^1.0.0:
dependencies: dependencies:
has-symbols "^1.0.2" has-symbols "^1.0.2"
has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
has@^1.0.3: has@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@ -5740,7 +5833,7 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
iconv-lite@0.4.24: iconv-lite@0.4.24, iconv-lite@^0.4.4:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -5771,6 +5864,13 @@ identity-obj-proxy@^3.0.0:
dependencies: dependencies:
harmony-reflect "^1.4.6" harmony-reflect "^1.4.6"
ignore-walk@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335"
integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==
dependencies:
minimatch "^3.0.4"
ignore@^5.2.0: ignore@^5.2.0:
version "5.2.0" version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
@ -5843,6 +5943,11 @@ ini@^1.3.5:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
ini@~1.3.0:
version "1.3.8"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
internal-slot@^1.0.3: internal-slot@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
@ -5941,6 +6046,13 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==
dependencies:
number-is-nan "^1.0.0"
is-fullwidth-code-point@^3.0.0: is-fullwidth-code-point@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
@ -7215,6 +7327,14 @@ minimist@^1.2.6:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
minipass@^2.6.0, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"
minipass@^3.0.0: minipass@^3.0.0:
version "3.3.6" version "3.3.6"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
@ -7227,6 +7347,13 @@ minipass@^5.0.0:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
minizlib@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
dependencies:
minipass "^2.9.0"
minizlib@^2.1.1: minizlib@^2.1.1:
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
@ -7235,7 +7362,7 @@ minizlib@^2.1.1:
minipass "^3.0.0" minipass "^3.0.0"
yallist "^4.0.0" yallist "^4.0.0"
mkdirp@^0.5.6: mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@^0.5.6:
version "0.5.6" version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
@ -7292,6 +7419,15 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
needle@^2.2.1:
version "2.9.1"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684"
integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==
dependencies:
debug "^3.2.6"
iconv-lite "^0.4.4"
sax "^1.2.4"
negotiator@0.6.2: negotiator@0.6.2:
version "0.6.2" version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@ -7332,6 +7468,22 @@ node-int64@^0.4.0:
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
node-pre-gyp@^0.13.0:
version "0.13.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42"
integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.1"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4"
node-releases@^1.1.52: node-releases@^1.1.52:
version "1.1.52" version "1.1.52"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9"
@ -7344,6 +7496,14 @@ node-releases@^2.0.6:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
nopt@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
dependencies:
abbrev "1"
osenv "^0.1.4"
normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@ -7359,6 +7519,27 @@ normalize-url@^6.0.1:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
npm-bundled@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1"
integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==
dependencies:
npm-normalize-package-bin "^1.0.1"
npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
npm-packlist@^1.1.6:
version "1.4.8"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1"
npm-run-path@^4.0.1: npm-run-path@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
@ -7366,6 +7547,16 @@ npm-run-path@^4.0.1:
dependencies: dependencies:
path-key "^3.0.0" path-key "^3.0.0"
npmlog@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.7.3"
set-blocking "~2.0.0"
nth-check@^1.0.2: nth-check@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
@ -7380,6 +7571,11 @@ nth-check@^2.0.1:
dependencies: dependencies:
boolbase "^1.0.0" boolbase "^1.0.0"
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
nwsapi@^2.2.0: nwsapi@^2.2.0:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0"
@ -7560,6 +7756,24 @@ optionator@^0.9.1:
type-check "^0.4.0" type-check "^0.4.0"
word-wrap "^1.2.3" word-wrap "^1.2.3"
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==
os-tmpdir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
osenv@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
dependencies:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
p-limit@^2.0.0, p-limit@^2.2.0: p-limit@^2.0.0, p-limit@^2.2.0:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
@ -8513,6 +8727,16 @@ raw-body@2.5.1:
iconv-lite "0.4.24" iconv-lite "0.4.24"
unpipe "1.0.0" unpipe "1.0.0"
rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
react-app-polyfill@^3.0.0: react-app-polyfill@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7"
@ -8709,6 +8933,19 @@ readable-stream@^2.0.1:
string_decoder "~1.1.1" string_decoder "~1.1.1"
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readable-stream@^2.0.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.0.6: readable-stream@^3.0.6:
version "3.6.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@ -8947,6 +9184,13 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rimraf@^2.6.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"
rimraf@^3.0.0, rimraf@^3.0.2: rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
@ -8983,7 +9227,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@5.2.1: safe-buffer@5.2.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1:
version "5.2.1" version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@ -9020,7 +9264,7 @@ sass-loader@^12.3.0:
klona "^2.0.4" klona "^2.0.4"
neo-async "^2.6.2" neo-async "^2.6.2"
sax@~1.2.4: sax@^1.2.4, sax@~1.2.4:
version "1.2.4" version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@ -9092,7 +9336,7 @@ selfsigned@^2.1.1:
dependencies: dependencies:
node-forge "^1" node-forge "^1"
semver@^5.4.1: semver@^5.3.0, semver@^5.4.1:
version "5.7.1" version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@ -9165,6 +9409,11 @@ serve-static@1.15.0:
parseurl "~1.3.3" parseurl "~1.3.3"
send "0.18.0" send "0.18.0"
set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
setimmediate@^1.0.5: setimmediate@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
@ -9206,25 +9455,25 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2" get-intrinsic "^1.0.2"
object-inspect "^1.9.0" object-inspect "^1.9.0"
signal-exit@^3.0.0, signal-exit@^3.0.3:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
signal-exit@^3.0.2: signal-exit@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
signal-exit@^3.0.3:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
sisteransi@^1.0.4, sisteransi@^1.0.5: sisteransi@^1.0.4, sisteransi@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
sketch-helpers@^0.0.2: sketch-helpers@^0.0.3:
version "0.0.2" version "0.0.3"
resolved "https://registry.yarnpkg.com/sketch-helpers/-/sketch-helpers-0.0.2.tgz#7b088303a82d3b7008abfe4e20a476c6da20cc0e" resolved "https://registry.yarnpkg.com/sketch-helpers/-/sketch-helpers-0.0.3.tgz#e1980ef3671a7b74b1beb5cc23991106af526430"
integrity sha512-3VnjIlqg3ORxcIR9vATazvvQt6/4vzPymcorQ30vigjjZEXPHf4xT6Zh7pbZmR58RJBKEU1AtAANhqYar4CRFQ== integrity sha512-iYI35LfEQvfqaBVuI3QgVvbaQNVwDHn/p0cTYsl8JzEhW5x4P008yPNFdZMbbYq8t7ZTIvYltq1ZM1w31VBeVg==
slash@^3.0.0: slash@^3.0.0:
version "3.0.0" version "3.0.0"
@ -9383,6 +9632,24 @@ string-natural-compare@^3.0.1:
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^4.1.0: string-width@^4.1.0:
version "4.2.0" version "4.2.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
@ -9392,15 +9659,6 @@ string-width@^4.1.0:
is-fullwidth-code-point "^3.0.0" is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.7: string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.7:
version "4.0.7" version "4.0.7"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d"
@ -9472,6 +9730,13 @@ stringify-object@^3.3.0:
is-obj "^1.0.1" is-obj "^1.0.1"
is-regexp "^1.0.0" is-regexp "^1.0.0"
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^6.0.0: strip-ansi@^6.0.0:
version "6.0.0" version "6.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
@ -9525,6 +9790,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
style-loader@^3.3.1: style-loader@^3.3.1:
version "3.3.1" version "3.3.1"
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575"
@ -9694,6 +9964,19 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
tar@^4:
version "4.4.19"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==
dependencies:
chownr "^1.1.4"
fs-minipass "^1.2.7"
minipass "^2.9.0"
minizlib "^1.3.3"
mkdirp "^0.5.5"
safe-buffer "^5.2.1"
yallist "^3.1.1"
tar@^6.1.11: tar@^6.1.11:
version "6.1.15" version "6.1.15"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69"
@ -10465,6 +10748,13 @@ which@^2.0.1:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
wide-align@^1.1.0:
version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
word-wrap@^1.2.3, word-wrap@~1.2.3: word-wrap@^1.2.3, word-wrap@~1.2.3:
version "1.2.3" version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@ -10663,11 +10953,25 @@ write-file-atomic@^3.0.0:
signal-exit "^3.0.2" signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5" typedarray-to-buffer "^3.1.5"
wrtc@^0.4.7:
version "0.4.7"
resolved "https://registry.yarnpkg.com/wrtc/-/wrtc-0.4.7.tgz#c61530cd662713e50bffe64b7a78673ce070426c"
integrity sha512-P6Hn7VT4lfSH49HxLHcHhDq+aFf/jd9dPY7lDHeFhZ22N3858EKuwm2jmnlPzpsRGEPaoF6XwkcxY5SYnt4f/g==
dependencies:
node-pre-gyp "^0.13.0"
optionalDependencies:
domexception "^1.0.1"
ws@^7.4.6: ws@^7.4.6:
version "7.5.9" version "7.5.9"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
ws@^8.13.0:
version "8.13.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
ws@^8.4.2: ws@^8.4.2:
version "8.10.0" version "8.10.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.10.0.tgz#00a28c09dfb76eae4eb45c3b565f771d6951aa51" resolved "https://registry.yarnpkg.com/ws/-/ws-8.10.0.tgz#00a28c09dfb76eae4eb45c3b565f771d6951aa51"
@ -10693,6 +10997,11 @@ y18n@^5.0.5:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yallist@^3.0.0, yallist@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
yallist@^4.0.0: yallist@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"