Multiple debugger updates:
- Always extract the debugger zip.
- Update debugger to log to both console and file.
- Allow the setting of the debugger's log level and log filepath from the launch.json.
- the logback.xml uses environment variables:
- DAFFODIL_DEBUG_LOG_LEVEL
- DAFFODIL_DEBUG_LOG_FILE
- These get set when the debugger is ran.
- default log level is INFO
- default log filepath is /tmp/daffodil-debugger.log
- Create custom scala nodemon watcher.
- When any of the files dealing with the debugger are changed it will automatically rebuild the debugger code.
Closes #471
Closes #679
Closes #691
diff --git a/debugger/src/main/resources/logback.xml b/debugger/src/main/resources/logback.xml
index b960eb4..6575137 100644
--- a/debugger/src/main/resources/logback.xml
+++ b/debugger/src/main/resources/logback.xml
@@ -27,7 +27,17 @@
<pattern>%date{ISO8601} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
- <root level="DEBUG">
+
+ <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+ <file>${DAFFODIL_DEBUG_LOG_FILE:-/tmp/daffodil-debugger.log}</file>
+ <append>false</append>
+ <encoder>
+ <pattern>%date{ISO8601} [%thread] %-5level %logger{15} - %msg %n</pattern>
+ </encoder>
+ </appender>
+
+ <root level="${DAFFODIL_DEBUG_LOG_LEVEL:-INFO}">
<appender-ref ref="STDOUT" />
+ <appender-ref ref="FILE" />
</root>
</configuration>
diff --git a/package.json b/package.json
index d048f98..fb2e2f0 100644
--- a/package.json
+++ b/package.json
@@ -29,8 +29,9 @@
"compile": "tsc -p ./ && yarn sbt",
"lint": "yarn prettier src -c && cd src/svelte && yarn lint",
"lint:fix": "yarn prettier src -w && cd src/svelte && yarn lint:fix",
- "prewatch": "yarn gen-version-ts && yarn sbt",
- "watch": "concurrently --kill-others \"webpack --watch --devtool nosources-source-map --config ./build/extension.webpack.config.js\" \"yarn watch:svelte\"",
+ "prewatch": "yarn gen-version-ts",
+ "scalawatch": "nodemon --verbose -e sbt,scala,xml,xjb -w debugger -w project -w build.sbt --ignore \"**/target/**\" --exec \"yarn sbt\"",
+ "watch": "concurrently --kill-others \"yarn scalawatch\" \"webpack --watch --devtool nosources-source-map --config ./build/extension.webpack.config.js\" \"yarn watch:svelte\"",
"watch:svelte": "cd src/svelte && yarn dev",
"webpack": "webpack --mode production --config ./build/extension.webpack.config.js",
"prepackage": "yarn install && yarn compile && yarn webpack",
@@ -39,13 +40,14 @@
"package-create": "node -e \"require('./build/scripts/package.ts').create()\"",
"pretest": "yarn compile && yarn webpack",
"test": "sbt test && node ./out/tests/runTest.js",
- "sbt": "sbt universal:packageBin"
+ "sbt": "sbt debugger/Universal/packageBin"
},
"dependencies": {
- "@vscode/debugadapter": "1.59.0",
"@omega-edit/client": "0.9.63",
+ "@vscode/debugadapter": "1.59.0",
"await-notify": "1.0.1",
"hexy": "0.3.4",
+ "nodemon": "^3.0.1",
"unzip-stream": "0.3.1",
"uuid": "9.0.0",
"wait-port": "1.0.4",
@@ -345,7 +347,7 @@
"description": "Destination for final Infoset ('file' | 'console' | 'none')",
"default": {
"type": "file",
- "path": "${workspaceFolder}/target/infoset.xml"
+ "path": "${workspaceFolder}/target/infoset.xml"
}
},
"tdmlConfig": {
@@ -420,6 +422,16 @@
"logFile": "${workspaceFolder}/dataEditor-${omegaEditPort}.log",
"logLevel": "info"
}
+ },
+ "dfdlDebugger": {
+ "type": "object",
+ "description": "Configuration for debugger. Settings are logging (level and file)",
+ "default": {
+ "logging": {
+ "level": "INFO",
+ "file": "/tmp/daffodil-debugger.log"
+ }
+ }
}
}
}
@@ -435,7 +447,7 @@
"infosetFormat": "xml",
"infosetOutput": {
"type": "file",
- "path": "${workspaceFolder}/target/infoset.xml"
+ "path": "${workspaceFolder}/target/infoset.xml"
},
"debugServer": 4711,
"openHexView": false,
@@ -448,6 +460,12 @@
"port": 9000,
"logFile": "${workspaceFolder}/dataEditor-${omegaEditPort}.log",
"logLevel": "info"
+ },
+ "dfdlDebugger": {
+ "logging": {
+ "level": "INFO",
+ "file": "/tmp/daffodil-debugger.log"
+ }
}
}
],
@@ -465,7 +483,7 @@
"infosetFormat": "xml",
"infosetOutput": {
"type": "file",
- "path": "${workspaceFolder}/target/infoset.xml"
+ "path": "${workspaceFolder}/target/infoset.xml"
},
"debugServer": 4711,
"openHexView": false,
@@ -478,6 +496,12 @@
"port": 9000,
"logFile": "${workspaceFolder}/dataEditor-${omegaEditPort}.log",
"logLevel": "info"
+ },
+ "dfdlDebugger": {
+ "logging": {
+ "level": "INFO",
+ "file": "/tmp/daffodil-debugger.log"
+ }
}
}
}
@@ -548,7 +572,7 @@
"infosetOutputFilePath": {
"type": "string",
"description": "Path to output for Infoset file (req: infosetOutput=file)",
- "default": "${workspaceFolder}/target/infoset.xml"
+ "default": "${workspaceFolder}/target/infoset.xml"
},
"stopOnEntry": {
"type": "boolean",
@@ -625,6 +649,31 @@
"trace"
],
"default": "info"
+ },
+ "dfdlDebuggerLogLevel": {
+ "type": "string",
+ "description": "Log level for debugger",
+ "enum": [
+ "ALL",
+ "DEBUG",
+ "ERROR",
+ "INFO",
+ "OFF",
+ "TRACE",
+ "WARN"
+ ],
+ "default": "INFO"
+ },
+ "dfdlDebuggerLogFile": {
+ "type": "string",
+ "description": "Path to log file for debugger",
+ "default": "/tmp/daffodil-debugger.log"
+ },
+ "dfdlDebugger": {
+ "logging": {
+ "level": "INFO",
+ "file": "/tmp/daffodil-debugger.log"
+ }
}
}
}
diff --git a/src/classes/vscode-launch.ts b/src/classes/vscode-launch.ts
index e2e277f..7c24444 100644
--- a/src/classes/vscode-launch.ts
+++ b/src/classes/vscode-launch.ts
@@ -23,6 +23,15 @@
file: string
}
+export interface LoggingConfig {
+ level: string
+ file: string
+}
+
+export interface DFDLDebugger {
+ logging: LoggingConfig
+}
+
export interface VSCodeLaunchConfigArgs {
name: string
request: string
@@ -41,4 +50,5 @@
openInfosetView: boolean
openInfosetDiffView: boolean
daffodilDebugClasspath: string
+ dfdlDebugger: DFDLDebugger
}
diff --git a/src/daffodilDebugger/debugger.ts b/src/daffodilDebugger/debugger.ts
index 7116cb3..621eb59 100644
--- a/src/daffodilDebugger/debugger.ts
+++ b/src/daffodilDebugger/debugger.ts
@@ -19,11 +19,11 @@
import * as fs from 'fs'
import XDGAppPaths from 'xdg-app-paths'
import * as path from 'path'
-import { regexp, unzipFile } from '../utils'
+import { regexp, getConfig } from '../utils'
import {
- buildDebugger,
daffodilArtifact,
daffodilVersion,
+ extractDebugger,
runDebugger,
stopDebugger,
stopDebugging,
@@ -220,22 +220,7 @@
fs.mkdirSync(rootPath, { recursive: true })
}
- // Code for downloading and setting up daffodil-debugger files
- if (!fs.existsSync(`${rootPath}/${artifact.name}`)) {
- // Get daffodil-debugger zip from extension files
- const filePath = path
- .join(
- context.asAbsolutePath('./debugger/target/universal'),
- artifact.archive
- )
- .toString()
-
- // If debugging the extension without vsix installed make sure debugger is created
- await buildDebugger(context.asAbsolutePath('.'), filePath)
-
- // Unzip file
- await unzipFile(filePath, rootPath)
- }
+ await extractDebugger(context, artifact.archive, rootPath)
await stopDebugger()
@@ -265,7 +250,8 @@
rootPath,
daffodilDebugClasspath,
context.asAbsolutePath('./package.json'),
- config.debugServer
+ config.debugServer,
+ getConfig(config).dfdlDebugger
)
}
}
diff --git a/src/daffodilDebugger/utils.ts b/src/daffodilDebugger/utils.ts
index 7053b0c..b1c069a 100644
--- a/src/daffodilDebugger/utils.ts
+++ b/src/daffodilDebugger/utils.ts
@@ -16,14 +16,14 @@
*/
import * as vscode from 'vscode'
-import * as fs from 'fs'
import * as path from 'path'
import * as child_process from 'child_process'
import { LIB_VERSION } from '../version'
import { deactivate } from '../adapter/extension'
import { getDaffodilVersion } from './daffodil'
import { Artifact } from '../classes/artifact'
-import { osCheck, runScript } from '../utils'
+import { DFDLDebugger } from '../classes/vscode-launch'
+import { osCheck, runScript, unzipFile } from '../utils'
export const daffodilVersion = (filePath: string): string => {
return getDaffodilVersion(filePath)
@@ -33,32 +33,17 @@
return new Artifact('daffodil-debugger', version, 'daffodil-debugger')
}
-export async function buildDebugger(baseFolder: string, filePath: string) {
- if (!filePath.includes('.vscode/extension')) {
- if (!fs.existsSync(filePath)) {
- let command = osCheck(
- 'sbt universal:packageBin',
- '/bin/bash --login -c "sbt universal:packageBin"'
- ) // Needed --login so it could resolve sbt command
-
- child_process.execSync(command, { cwd: baseFolder })
- }
- }
-}
-
export const stopDebugger = (id: number | undefined = undefined) =>
child_process.exec(osCheck(`taskkill /F /PID ${id}`, `kill -9 ${id}`))
-export const shellArgs = (scriptName: string, port: number) => [
- '--listenPort',
- `${port}`,
-]
+export const shellArgs = (port: number) => ['--listenPort', `${port}`]
export async function runDebugger(
rootPath: string,
daffodilDebugClasspath: string,
filePath: string,
serverPort: number,
+ dfdlDebugger: DFDLDebugger,
createTerminal: boolean = false
): Promise<vscode.Terminal> {
const dfdlVersion = daffodilVersion(filePath)
@@ -78,9 +63,11 @@
scriptPath,
artifact.scriptName,
createTerminal,
- shellArgs(artifact.scriptName, serverPort),
+ shellArgs(serverPort),
{
DAFFODIL_DEBUG_CLASSPATH: daffodilDebugClasspath,
+ DAFFODIL_DEBUG_LOG_LEVEL: dfdlDebugger.logging.level,
+ DAFFODIL_DEBUG_LOG_FILE: dfdlDebugger.logging.file,
},
'daffodil'
)
@@ -94,3 +81,20 @@
await stopDebugger(id)
})
}
+
+export async function extractDebugger(
+ context: vscode.ExtensionContext,
+ artifactArchive: string,
+ rootPath: string
+) {
+ // Get daffodil-debugger zip from extension files
+ const filePath = path
+ .join(
+ context.asAbsolutePath('./debugger/target/universal'),
+ artifactArchive
+ )
+ .toString()
+
+ // Unzip file
+ await unzipFile(filePath, rootPath)
+}
diff --git a/src/tests/suite/daffodilDebugger.test.ts b/src/tests/suite/daffodilDebugger.test.ts
index f697ace..d30ab59 100644
--- a/src/tests/suite/daffodilDebugger.test.ts
+++ b/src/tests/suite/daffodilDebugger.test.ts
@@ -28,6 +28,7 @@
stopDebugging,
} from '../../daffodilDebugger'
import { before, after } from 'mocha'
+import { DFDLDebugger } from '../../classes/vscode-launch'
// Not using the debug adapter like adapter.test.ts as it will not fully connect the debugger
suite('Daffodil Debugger', () => {
@@ -61,13 +62,42 @@
logLevel: 'info',
}
+ const dfdlDebuggers: Array<DFDLDebugger> = [
+ {
+ logging: {
+ level: 'INFO',
+ file: 'daffodil-debugger-4711.log',
+ },
+ },
+ {
+ logging: {
+ level: 'INFO',
+ file: 'daffodil-debugger-4712.log',
+ },
+ },
+ ]
+
before(async () => {
await unzipFile(SCALA_PATH, PROJECT_ROOT)
debuggers.push(
- await runDebugger(PROJECT_ROOT, '', PACKAGE_PATH, 4711, true)
+ await runDebugger(
+ PROJECT_ROOT,
+ '',
+ PACKAGE_PATH,
+ 4711,
+ dfdlDebuggers[0],
+ true
+ )
)
debuggers.push(
- await runDebugger(PROJECT_ROOT, '', PACKAGE_PATH, 4712, true)
+ await runDebugger(
+ PROJECT_ROOT,
+ '',
+ PACKAGE_PATH,
+ 4712,
+ dfdlDebuggers[1],
+ true
+ )
)
})
@@ -79,6 +109,10 @@
fs.rmSync(EXTRACTED_FOLDER, { recursive: true })
if (fs.existsSync(XML_INFOSET_PATH)) fs.rmSync(XML_INFOSET_PATH)
if (fs.existsSync(JSON_INFOSET_PATH)) fs.rmSync(JSON_INFOSET_PATH)
+ dfdlDebuggers.forEach((dfdlDebugger) => {
+ if (fs.existsSync(dfdlDebugger.logging.file))
+ fs.rmSync(dfdlDebugger.logging.file)
+ })
})
test('should output xml infoset', async () => {
diff --git a/src/tests/suite/utils.test.ts b/src/tests/suite/utils.test.ts
index 8b7df36..9ab2d48 100644
--- a/src/tests/suite/utils.test.ts
+++ b/src/tests/suite/utils.test.ts
@@ -47,6 +47,12 @@
logFile: '${workspaceFolder}/dataEditor-${omegaEditPort}.log',
logLevel: 'info',
},
+ dfdlDebugger: {
+ logging: {
+ level: 'INFO',
+ file: '/tmp/daffodil-debugger.log',
+ },
+ },
}
test('Default config', async () => {
diff --git a/src/utils.ts b/src/utils.ts
index 5a78967..85ab994 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -123,6 +123,15 @@
),
logLevel: defaultConf.get('dataEditorLogLevel', 'info'),
},
+ dfdlDebugger: {
+ logging: {
+ level: defaultConf.get('dfdlDebuggerLogLevel', 'INFO'),
+ file: defaultConf.get(
+ 'dfdlDebuggerLogFile',
+ '/tmp/daffodil-debugger.log'
+ ),
+ },
+ },
}
Object.entries(defaultValues).map(
diff --git a/yarn.lock b/yarn.lock
index 0a864fc..60cfa00 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -508,6 +508,11 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+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==
+
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@@ -876,7 +881,7 @@
parse5 "^7.0.0"
parse5-htmlparser2-tree-adapter "^7.0.0"
-chokidar@3.5.3:
+chokidar@3.5.3, chokidar@^3.5.2:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -1076,6 +1081,13 @@
dependencies:
ms "2.1.2"
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
decamelize@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
@@ -1597,6 +1609,11 @@
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+ignore-by-default@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+ integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==
+
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
@@ -1973,7 +1990,7 @@
dependencies:
brace-expansion "^2.0.1"
-minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1:
+minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -2047,7 +2064,7 @@
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@2.1.3:
+ms@2.1.3, ms@^2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -2094,6 +2111,29 @@
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f"
integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==
+nodemon@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.1.tgz#affe822a2c5f21354466b2fc8ae83277d27dadc7"
+ integrity sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==
+ dependencies:
+ chokidar "^3.5.2"
+ debug "^3.2.7"
+ ignore-by-default "^1.0.1"
+ minimatch "^3.1.2"
+ pstree.remy "^1.1.8"
+ semver "^7.5.3"
+ simple-update-notifier "^2.0.0"
+ supports-color "^5.5.0"
+ touch "^3.1.0"
+ undefsafe "^2.0.5"
+
+nopt@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+ integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==
+ dependencies:
+ abbrev "1"
+
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@@ -2355,6 +2395,11 @@
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
+pstree.remy@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
+ integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
+
pump@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
@@ -2584,6 +2629,13 @@
dependencies:
lru-cache "^6.0.0"
+semver@^7.5.3:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
serialize-javascript@6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
@@ -2667,6 +2719,13 @@
once "^1.3.1"
simple-concat "^1.0.0"
+simple-update-notifier@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb"
+ integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==
+ dependencies:
+ semver "^7.5.3"
+
sonic-boom@^3.1.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.3.0.tgz#cffab6dafee3b2bcb88d08d589394198bee1838c"
@@ -2749,7 +2808,7 @@
dependencies:
has-flag "^4.0.0"
-supports-color@^5.3.0:
+supports-color@^5.3.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
@@ -2876,6 +2935,13 @@
dependencies:
is-number "^7.0.0"
+touch@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
+ integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
+ dependencies:
+ nopt "~1.0.10"
+
"traverse@>=0.3.0 <0.4":
version "0.3.9"
resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
@@ -2969,6 +3035,11 @@
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+undefsafe@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
+ integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
+
underscore@^1.12.1:
version "1.13.6"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441"