diff --git a/.gitignore b/.gitignore
index 95c878d..d98e728 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@ benchmarks/*.brs
isolate-*
v8*.log
*.cpuprofile
+roku_modules
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 678af4a..d682926 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -22,6 +22,14 @@
"${workspaceFolder}/**",
"!**/node_modules/**"
]
+ },
+ {
+ "name": "Debug test-project",
+ "type": "brightscript",
+ "request": "launch",
+ "host": "${promptForHost}",
+ "rootDir": "${workspaceFolder}/out/dist",
+ "preLaunchTask": "build-test-app"
}
]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 68d01a9..c2886cd 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -7,8 +7,7 @@
"**/.DS_Store": true,
"**/node_modules": true,
"**/.nyc_output": true,
- "**/coverage": true,
- "**/dist": true
+ "**/coverage": true
},
"search.exclude": {
"**/node_modules": true,
@@ -20,5 +19,6 @@
"typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": true,
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false,
"files.trimTrailingWhitespace": true,
- "typescript.tsdk": "node_modules\\typescript\\lib"
+ "typescript.tsdk": "node_modules\\typescript\\lib",
+ "brightscript.bsdk": "1.0.0-alpha.39"
}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index dc6a73a..cb8641a 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -9,6 +9,15 @@
"kind": "test",
"isDefault": true
}
+ },
+ {
+ "label": "build-test-app",
+ "type": "shell",
+ "command": "cd test-project && npx bsc",
+ "group": {
+ "kind": "test",
+ "isDefault": true
+ }
}
]
}
diff --git a/lib/bsconfig.json b/lib/bsconfig.json
index 0967ef4..a29bdce 100644
--- a/lib/bsconfig.json
+++ b/lib/bsconfig.json
@@ -1 +1,8 @@
-{}
+{
+ "files": [
+ "manifest",
+ "source/**/*.*",
+ "components/**/*.*",
+ "images/**/*.*"
+ ]
+}
diff --git a/lib/components/Reftracker.bs b/lib/components/Reftracker.bs
new file mode 100644
index 0000000..b3c6ff2
--- /dev/null
+++ b/lib/components/Reftracker.bs
@@ -0,0 +1,94 @@
+import "pkg:/source/roku_modules/promises/promises.brs"
+import "pkg:/source/reftrackerLib.bs"
+
+' typecast m as ReftrackerM
+interface ReftrackerM
+ nodesByKeypath as ifAssociativeArray
+ keypathsByNodeReftrackerId as ifAssociativeArray
+ allNodes as roSGNode[]
+ nodeQueue as NodeQueueItem[]
+ top as roSGNodeReftracker
+end interface
+
+function init()
+ 'build several parallel lookups for nodes to simplify discoverability later
+
+ ' a lookup of nodes by their keypath
+ m.nodesByKeypath = {}
+ 'a lookup of all keypaths for a node indexed by the node's reftrackerId
+ m.keypathsByNodeReftrackerId = {}
+ 'a flat list of all nodes discovered in this run
+ m.allNodes = []
+
+ m.top.runId = reftracker.internal.getRandomUUID()
+end function
+
+function discover()
+ 'seed the list of nodes with all roots (should be a good starting point)
+ for each root in m.top.getRoots() as roSGnode[]
+ registerNodeRef(`root:<${root.subtype()}>`, root)
+ end for
+
+ 'process the nodes one-by-one
+ promises.onThen(processNextNode(), function(result)
+ print "done processing nodes"
+ end function)
+end function
+
+'Register a reference to a node so we can process it later. This
+function registerNodeRef(keypath as string, node as roSGNode)
+ reftrackerId = reftracker.internal.getReftrackerId(node)
+
+ 'store a reference to the node by its keypath
+ m.nodesByKeypath[keypath] = node
+
+ isNewNode = m.keypathsByNodeReftrackerId[reftrackerId] = invalid
+
+ if isNewNode
+ 'build a new array to store all the keypaths for this node
+ m.keypathsByNodeReftrackerId[reftrackerId] = []
+ 'if this is the first time we've seen this node, store it in our list of all nodes
+ m.allNodes.push(node)
+
+ 'register this node for future evaluation
+ m.nodeQueue.push({
+ keypath: keypath,
+ node: node
+ })
+ end if
+ m.keypathsByNodeReftrackerId[reftrackerId].push(keypath)
+end function
+
+function processNextNode()
+ 'if we have no more nodes, we are done!
+ if m.nodeQueue.count() = 0
+ return promises.resolve(invalid)
+ end if
+
+ nodeQueueItem = m.nodeQueue.pop()
+
+ return promises.chain(promises.resolve(true), nodeQueueItem).then(function(result, queueItem as NodeQueueItem)
+ 'if this node supports reftracker functionality, process the node's internal `m`
+ if (nodeQueueItem.node as dynamic).reftrackerEnabled then
+ return nodeQueueItem.node@.reftracker_internal_execute({ command: "discover", reftracker: m.top })
+ end if
+ end function).then(function(result, nodeQueueItem as NodeQueueItem)
+ 'add all public fields to a list of stuff to work on
+ for each field in nodeQueueItem.node.getFields()
+ value = nodeQueueItem.node[field]
+ reftracker.internal.registerWorkItem(m.top, `${nodeQueueItem.keypath}.${field}`, value)
+ end for
+
+ 'now process this data (it will run async and process in chunks until all are finished)
+ return reftracker.internal.processWorkItems(m.top)
+
+ end function).then(function(result, nodeQueueItem as NodeQueueItem)
+
+ return processNextNode()
+ end function).toPromise()
+end function
+
+interface NodeQueueItem
+ keypath as string
+ node as roSGNode
+end interface
diff --git a/lib/components/Reftracker.xml b/lib/components/Reftracker.xml
new file mode 100644
index 0000000..6f4a387
--- /dev/null
+++ b/lib/components/Reftracker.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/lib/source/reftracker.bs b/lib/source/reftracker.bs
deleted file mode 100644
index 6e33105..0000000
--- a/lib/source/reftracker.bs
+++ /dev/null
@@ -1,5 +0,0 @@
-namespace reftracker
- ' This is a generic function injected into every component as a callfunc, to be a single point of contact for all commands.
- function execute()
- end function
-end namespace
diff --git a/lib/source/reftrackerLib.bs b/lib/source/reftrackerLib.bs
new file mode 100644
index 0000000..c099e58
--- /dev/null
+++ b/lib/source/reftrackerLib.bs
@@ -0,0 +1,173 @@
+import "pkg:/source/roku_modules/promises/promises.brs"
+
+'typecast m as mm
+
+interface mm
+ reftrackers as roSGNodeReftracker[]
+ processedItems as roAssociativeArray
+ __deviceInfo as roDeviceInfo
+end interface
+
+
+namespace reftracker
+
+ ' Find all references to a SceneGraph node by its ID
+ function findNodeById(id as string)
+ 'build the reftracker
+ tracker = createObject("roSGNode", "Reftracker")
+ 'store a reference to it so it doesn't get lost
+ reftracker.internal.registerReftracker(tracker)
+ 'run it
+ tracker@.discover()
+ end function
+end namespace
+
+
+namespace reftracker.internal
+
+ ' This is a generic function injected into every component as a callfunc, to be a single point of contact for all commands.
+ '@param {ExecuteOptions} options
+ function execute(options)
+ if options.command = "discover"
+ registerWorkItem(options.reftracker, options.keypath + ".m", m)
+ return processWorkItems(options.reftracker)
+ end if
+ end function
+
+ function getWorkQueue(tracker as roSGNodeReftracker) as WorkQueueItem[]
+ key = `__workQueue_${tracker.id}`
+ if m[key] = invalid
+ m[key] = []
+ end if
+ return m[key]
+ end function
+
+ ' register some item to be processed later
+ function registerWorkItem(tracker as roSGNodeReftracker, keypath as string, item as dynamic)
+ if item <> invalid
+ workQueue = getWorkQueue(tracker)
+
+ workQueue.push({
+ keypath: keypath
+ item: item
+ })
+ end if
+ end function
+
+ function processWorkItems(tracker as roSGNodeReftracker) as roSGNodepromises_Promise
+ startTime = createObject("roTimeSpan")
+
+ workQueue = getWorkQueue(tracker)
+
+ 'if we have work, and we've been running for less than 500ms, process another item
+ while workQueue[0] <> invalid and startTime.TotalMilliseconds() < 500
+ item = workQueue.Shift()
+
+ itemType = type(item)
+
+ 'if this is a node, push register it with the reftracker to be processed later
+ if itemType = "roSGNode"
+ tracker@.registerNodeRef(item)
+ else if itemType = "roArray" and not isProcessed(item)
+ 'if this is an array, register each item in the array
+ for i = 0 to (item as ifArray).Count() - 1
+ registerWorkItem(tracker, `${item.keypath}.${i}`, item[i])
+ end for
+ else if itemType = "roAssociativeArray" and not isProcessed(item)
+ 'if this is an associative array, register each item in the array
+ for each key in item
+ registerWorkItem(tracker, `${item.keypath}.${key}`, item[key])
+ end for
+ else
+ 'all other data types can be ignored, since they don't include references to other nodes
+ end if
+ end while
+
+ 'we have no more work, return a resolved promise
+ if workQueue[0] = invalid
+ return promises.resolve(true)
+ end if
+
+ 'small delay, then process work again
+ return promises.chain(reftracker.internal.delay(.01)).then(function(result, tracker)
+ 'process work items again
+ return processWorkItems(tracker)
+ end function, tracker).toPromise()
+ end function
+
+ function isProcessed(item as dynamic)
+ id = getReftrackerId(item)
+ 'if we've processed this item, it'll have its id in the processedItems array
+ return m.processedItems[id] = invalid
+ end function
+
+ 'Ensure this node has a unique reftracker id so we can use it for lookups and comparisons
+ function getReftrackerId(item as dynamic)
+ key = "reftracker_id"
+ itemType = type(item)
+ if itemType = "roSGNode" and item[key] = invalid then
+ item.addField(key, "string", reftracker.internal.getRandomUUID())
+ else if itemType = "roAssociativeArray" and item[key] = invalid
+ item[key] = reftracker.internal.getRandomUUID()
+ else if itemType = "roArray" and item[(item as roArray).Count() - 2] <> "reftracker_id"
+ item.push("reftracker_id")
+ item.push(reftracker.internal.getRandomUUID())
+ end if
+ end function
+
+ function registerReftracker(finder as roSGNodeRefTracker)
+ if m.reftrackers = invalid
+ m.reftrackers = []
+ end if
+ m.reftrackers.push(finder)
+ end function
+
+ function getDeviceObject() as object
+ if m.__deviceInfo <> invalid then return m.__deviceInfo
+ m.__deviceInfo = createObject("roDeviceInfo")
+ return m.__deviceInfo
+ end function
+
+ ' Get a promise that resolves after a given duration
+ sub delay(duration = 0.0001 as float)
+ timer = createObject("roSGNode", "Timer")
+ timer.duration = duration
+ timer.repeat = false
+ timer.id = "__delay_" + getRandomUUID()
+
+ m[timer.id] = {
+ timer: timer
+ promise: promises.create()
+ }
+
+ timer.observeFieldScoped("fire", (sub(event as object)
+ delayId = event.getNode()
+ options = m[delayId]
+ promise = options.promise
+ promises.resolve(promise, invalid)
+ m[delayId].unobserveFieldScoped("fire")
+ m.delete(delayId)
+ end sub).toStr().mid(10))
+
+ timer.control = "start"
+ end sub
+
+ function getRandomUUID()
+ return getDeviceObject().getRandomUUID()
+ end function
+
+ function isNode(value as dynamic, subtype = "" as string)
+ return type(value) = "roSGNode" and (subType = "" or value.isSubtype(subType))
+ end function
+
+ interface ExecuteOptions
+ command as string
+ keypath as string
+ reftracker as roSGNodeReftracker
+ end interface
+
+ interface WorkQueueItem
+ keypath as string
+ item as dynamic
+ end interface
+end namespace
diff --git a/package-lock.json b/package-lock.json
index c8e58dd..179a478 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,11 @@
"name": "bsc-plugin-reftracker",
"version": "1.0.0",
"license": "MIT",
+ "dependencies": {
+ "fast-glob": "^3.3.2",
+ "fs-extra": "^11.2.0",
+ "promises": "npm:@rokucommunity/promises@0.3.0"
+ },
"devDependencies": {
"@types/chai": "^4.1.2",
"@types/fs-extra": "^8.0.0",
@@ -20,14 +25,13 @@
"chai": "^4.2.0",
"eslint": "^8.16.0",
"eslint-plugin-no-only-tests": "2.6.0",
- "fs-extra": "^11.2.0",
"mocha": "^9.1.3",
"nyc": "^15.1.0",
"rimraf": "^2.7.1",
+ "ropm": "^0.10.26",
"source-map-support": "^0.5.13",
- "ts-node": "8.9.1",
- "typescript": "^4.7.2",
- "typescript-formatter": "^7.2.2",
+ "ts-node": "^10.9.2",
+ "typescript": "^5.6.3",
"undent": "^0.1.0"
},
"peerDependencies": {
@@ -405,6 +409,28 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -672,7 +698,6 @@
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
@@ -685,7 +710,6 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
"engines": {
"node": ">= 8"
}
@@ -694,7 +718,6 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
@@ -921,6 +944,30 @@
"node": ">= 10.0.0"
}
},
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+ "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true
+ },
"node_modules/@types/chai": {
"version": "4.3.11",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz",
@@ -1175,6 +1222,26 @@
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
"dev": true
},
+ "node_modules/@xml-tools/ast": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/@xml-tools/ast/-/ast-5.0.5.tgz",
+ "integrity": "sha512-avvzTOvGplCx9JSKdsTe3vK+ACvsHy2HxVfkcfIqPzu+kF5CT4rw5aUVzs0tJF4cnDyMRVkSyVxR07X0Px8gPA==",
+ "dev": true,
+ "dependencies": {
+ "@xml-tools/common": "^0.1.6",
+ "@xml-tools/parser": "^1.0.11",
+ "lodash": "4.17.21"
+ }
+ },
+ "node_modules/@xml-tools/common": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@xml-tools/common/-/common-0.1.6.tgz",
+ "integrity": "sha512-7aVZeEYccs1KI/Asd6KKnrB4dTAWXTkjRMjG40ApGEUp5NpfQIvWLEBvMv85Koj2lbSpagcAERwDy9qMsfWGdA==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "4.17.21"
+ }
+ },
"node_modules/@xml-tools/parser": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz",
@@ -1214,6 +1281,18 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -1370,6 +1449,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -1454,7 +1542,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
@@ -1775,18 +1862,6 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/commandpost": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/commandpost/-/commandpost-1.4.0.tgz",
- "integrity": "sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==",
- "dev": true
- },
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@@ -1812,6 +1887,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
"node_modules/cross-platform-clear-console": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz",
@@ -1947,6 +2028,59 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/del": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
+ "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
+ "dev": true,
+ "dependencies": {
+ "globby": "^11.0.1",
+ "graceful-fs": "^4.2.4",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.2",
+ "p-map": "^4.0.0",
+ "rimraf": "^3.0.2",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/del/node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/del/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -2001,46 +2135,6 @@
"safer-buffer": "^2.1.0"
}
},
- "node_modules/editorconfig": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
- "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
- "dev": true,
- "dependencies": {
- "commander": "^2.19.0",
- "lru-cache": "^4.1.5",
- "semver": "^5.6.0",
- "sigmund": "^1.0.1"
- },
- "bin": {
- "editorconfig": "bin/editorconfig"
- }
- },
- "node_modules/editorconfig/node_modules/lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dev": true,
- "dependencies": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "node_modules/editorconfig/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/editorconfig/node_modules/yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
- "dev": true
- },
"node_modules/electron-to-chromium": {
"version": "1.4.625",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.625.tgz",
@@ -2408,7 +2502,6 @@
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
"integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
@@ -2436,7 +2529,6 @@
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
"integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
- "dev": true,
"dependencies": {
"reusify": "^1.0.4"
}
@@ -2466,7 +2558,6 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -2598,8 +2689,6 @@
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
"integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
@@ -2613,7 +2702,6 @@
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
"dependencies": {
"universalify": "^2.0.0"
},
@@ -2625,7 +2713,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
"engines": {
"node": ">= 10.0.0"
}
@@ -2716,11 +2803,201 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/glob-all": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz",
+ "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.2",
+ "yargs": "^15.3.1"
+ },
+ "bin": {
+ "glob-all": "bin/glob-all"
+ }
+ },
+ "node_modules/glob-all/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/glob-all/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/glob-all/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/glob-all/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/glob-all/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/glob-all/node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob-all/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glob-all/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glob-all/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob-all/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glob-all/node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/glob-all/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glob-all/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
+ },
+ "node_modules/glob-all/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/glob-all/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -2778,8 +3055,7 @@
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
"node_modules/graphemer": {
"version": "1.4.0",
@@ -2894,6 +3170,15 @@
"node": ">= 4"
}
},
+ "node_modules/ignore-walk": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
+ "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^3.0.4"
+ }
+ },
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
@@ -2967,7 +3252,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -2985,7 +3269,6 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -2997,11 +3280,19 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
"engines": {
"node": ">=0.12.0"
}
},
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/is-path-inside": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
@@ -3377,6 +3668,12 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/latinize": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/latinize/-/latinize-0.5.0.tgz",
+ "integrity": "sha512-SHzxgdcFP/64lUEfX3183QALY2KdSQxad3gmhCc/b03QN1mbx0AnJWvsQjqoJLbucY9pJuK+NMbnasUIocDmnQ==",
+ "dev": true
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -3538,18 +3835,6 @@
"get-func-name": "^2.0.1"
}
},
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/luxon": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz",
@@ -3593,7 +3878,6 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
"engines": {
"node": ">= 8"
}
@@ -3602,7 +3886,6 @@
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
"dependencies": {
"braces": "^3.0.2",
"picomatch": "^2.3.1"
@@ -3874,6 +4157,39 @@
"node": ">=0.10.0"
}
},
+ "node_modules/npm-bundled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
+ "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
+ "dev": true,
+ "dependencies": {
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "node_modules/npm-normalize-package-bin": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+ "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
+ "dev": true
+ },
+ "node_modules/npm-packlist": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.4.tgz",
+ "integrity": "sha512-Qzg2pvXC9U4I4fLnUrBmcIT4x0woLtUgxUi9eC+Zrcv1Xx5eamytGAfbDWQ67j7xOcQ2VW1I3su9smVTIdu7Hw==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.6",
+ "ignore-walk": "^3.0.3",
+ "npm-bundled": "^1.1.1",
+ "npm-normalize-package-bin": "^1.0.1"
+ },
+ "bin": {
+ "npm-packlist": "bin/index.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/nyc": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
@@ -4344,7 +4660,6 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
"engines": {
"node": ">=8.6"
},
@@ -4487,11 +4802,11 @@
"node": ">=8"
}
},
- "node_modules/pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
- "dev": true
+ "node_modules/promises": {
+ "name": "@rokucommunity/promises",
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@rokucommunity/promises/-/promises-0.3.0.tgz",
+ "integrity": "sha512-r0D8pcxAZ/s6t5lgoI/3a/gPsBb7J97xMVmsfHT/qtILdeC70/f50pp6eKcR0wWAixwt65glCDEI9bJphJ+ygA=="
},
"node_modules/psl": {
"version": "1.9.0",
@@ -4530,7 +4845,6 @@
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -4655,7 +4969,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
@@ -4715,11 +5028,89 @@
"node": ">=6 <7 || >=8"
}
},
+ "node_modules/ropm": {
+ "version": "0.10.26",
+ "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.26.tgz",
+ "integrity": "sha512-NvWbT7OpQQNyp6ISxU8mvVXhHxA7vgxN+7Cg8xq5BudnlAfKT8JCLhPxA5tcC152thhOxtljSpdXs5wkzU4xVw==",
+ "dev": true,
+ "dependencies": {
+ "@xml-tools/ast": "^5.0.5",
+ "@xml-tools/parser": "1.0.10",
+ "brighterscript": "^0.67.7",
+ "del": "6.0.0",
+ "fs-extra": "9.1.0",
+ "glob-all": "3.2.1",
+ "latinize": "0.5.0",
+ "npm-packlist": "2.1.4",
+ "roku-deploy": "^3.12.1",
+ "semver": "^7.6.3",
+ "yargs": "16.2.0"
+ },
+ "bin": {
+ "ropm": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=8.1.10"
+ }
+ },
+ "node_modules/ropm/node_modules/@xml-tools/parser": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.10.tgz",
+ "integrity": "sha512-9oRb68wEKT+MRB7e2GwTiKicRKVXKzquBDGgH6YcGafvnSYXorWi2oaTVtbv2109RlGiQSnoXaQFUXCnHwFS7Q==",
+ "dev": true,
+ "dependencies": {
+ "chevrotain": "7.1.1"
+ }
+ },
+ "node_modules/ropm/node_modules/chevrotain": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz",
+ "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==",
+ "dev": true,
+ "dependencies": {
+ "regexp-to-ast": "0.5.0"
+ }
+ },
+ "node_modules/ropm/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ropm/node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/ropm/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -4766,13 +5157,10 @@
"license": "ISC"
},
"node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -4838,12 +5226,6 @@
"node": ">=8"
}
},
- "node_modules/sigmund": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==",
- "dev": true
- },
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -5073,7 +5455,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
"dependencies": {
"is-number": "^7.0.0"
},
@@ -5082,28 +5463,46 @@
}
},
"node_modules/ts-node": {
- "version": "8.9.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.9.1.tgz",
- "integrity": "sha512-yrq6ODsxEFTLz0R3BX2myf0WBCSQh9A+py8PBo1dCzWIOcvisbyH6akNKqDHMgXePF2kir5mm5JXJTH3OUJYOQ==",
- "dev": true,
- "dependencies": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
"arg": "^4.1.0",
+ "create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
+ "v8-compile-cache-lib": "^3.0.1",
"yn": "3.1.1"
},
"bin": {
"ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
"ts-node-script": "dist/bin-script.js",
"ts-node-transpile-only": "dist/bin-transpile.js",
"ts-script": "dist/bin-script-deprecated.js"
},
- "engines": {
- "node": ">=6.0.0"
- },
"peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
"typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
}
},
"node_modules/ts-node/node_modules/diff": {
@@ -5186,35 +5585,16 @@
}
},
"node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/typescript-formatter": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/typescript-formatter/-/typescript-formatter-7.2.2.tgz",
- "integrity": "sha512-V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ==",
- "dev": true,
- "dependencies": {
- "commandpost": "^1.0.0",
- "editorconfig": "^0.15.0"
- },
- "bin": {
- "tsfmt": "bin/tsfmt"
- },
- "engines": {
- "node": ">= 4.2.0"
- },
- "peerDependencies": {
- "typescript": "^2.1.6 || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev"
+ "node": ">=14.17"
}
},
"node_modules/undent": {
@@ -5298,6 +5678,12 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
"node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -5502,12 +5888,6 @@
"node": ">=10"
}
},
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
"node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
diff --git a/package.json b/package.json
index c0740db..9e34500 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"typings": "dist/index.d.ts",
"scripts": {
"build": "rimraf out && tsc",
+ "build-test-project": "cd test-project && npx bsc",
"lint": "eslint \"src/**\"",
"preversion": "npm run build && npm run lint && npm run test",
"test": "nyc mocha",
@@ -16,6 +17,9 @@
},
"author": "",
"license": "MIT",
+ "ropm": {
+ "rootDir": "lib"
+ },
"peerDependencies": {
"brighterscript": "^0.67.7"
},
@@ -31,14 +35,13 @@
"chai": "^4.2.0",
"eslint": "^8.16.0",
"eslint-plugin-no-only-tests": "2.6.0",
- "fs-extra": "^11.2.0",
"mocha": "^9.1.3",
"nyc": "^15.1.0",
"rimraf": "^2.7.1",
+ "ropm": "^0.10.26",
"source-map-support": "^0.5.13",
- "ts-node": "8.9.1",
- "typescript": "^4.7.2",
- "typescript-formatter": "^7.2.2",
+ "ts-node": "^10.9.2",
+ "typescript": "^5.6.3",
"undent": "^0.1.0"
},
"mocha": {
@@ -76,5 +79,10 @@
"statements": 100,
"functions": 100,
"branches": 100
+ },
+ "dependencies": {
+ "fast-glob": "^3.3.2",
+ "fs-extra": "^11.2.0",
+ "promises": "npm:@rokucommunity/promises@0.3.0"
}
}
diff --git a/src/Plugin.ts b/src/Plugin.ts
index 2499d64..607e20a 100644
--- a/src/Plugin.ts
+++ b/src/Plugin.ts
@@ -1,18 +1,25 @@
import * as fsExtra from 'fs-extra';
+import * as fastGlob from 'fast-glob';
import type { BeforeFileTranspileEvent, CompilerPlugin, Editor, Program, XmlFile } from 'brighterscript';
import { createSGAttribute, isBrsFile, isXmlFile, standardizePath as s } from 'brighterscript';
-import { SGFunction, SGInterface, SGScript, SGTag } from 'brighterscript/dist/parser/SGTypes';
-const libPath = s`${__dirname}/../lib/source/reftracker.bs`;
+import { SGField, SGFunction, SGInterface, SGScript } from 'brighterscript/dist/parser/SGTypes';
+const cwd = s`${__dirname}/../`;
export class Plugin implements CompilerPlugin {
name = 'bsc-plugin-reftracker';
afterProgramCreate(program: Program) {
- //inject the library file at the start of the program so it's available to all files from the very start
- program.setFile({
- src: libPath,
- dest: 'source/reftracker.bs'
- }, fsExtra.readFileSync(libPath).toString());
+ //inject the the required library files at the start of the program so they're available to all files from the very start
+ const files = fastGlob.sync('**/*.{bs,brs,xml}', {
+ absolute: false,
+ cwd: s`${cwd}/lib`
+ });
+ for (const file of files) {
+ program.setFile({
+ src: s`${cwd}/lib/${file}`,
+ dest: file
+ }, fsExtra.readFileSync(s`${cwd}/lib/${file}`).toString());
+ }
}
beforeFileTranspile(event: BeforeFileTranspileEvent) {
@@ -33,12 +40,25 @@ export class Plugin implements CompilerPlugin {
file.ast.component!.api.functions = [];
}
+ //add the interface function
editor.arrayPush(
file.ast.component!.api.functions,
new SGFunction(
{ text: 'function' },
[
- createSGAttribute('name', 'reftracker_execute')
+ createSGAttribute('name', 'reftracker_internal_execute')
+ ]
+ )
+ );
+ //add a new interface field indicating this function is available
+ editor.arrayPush(
+ file.ast.component!.api.fields,
+ new SGField(
+ { text: 'field' },
+ [
+ createSGAttribute('id', 'reftrackerEnabled'),
+ createSGAttribute('type', 'boolean'),
+ createSGAttribute('value', 'true')
]
)
);
@@ -50,7 +70,7 @@ export class Plugin implements CompilerPlugin {
{ text: 'script' },
[
createSGAttribute('type', 'text/brightscript'),
- createSGAttribute('uri', 'pkg:/source/reftracker.bs')
+ createSGAttribute('uri', 'pkg:/source/reftrackerLib.bs')
]
)
);
diff --git a/test-project/bsconfig.json b/test-project/bsconfig.json
new file mode 100644
index 0000000..12cce0d
--- /dev/null
+++ b/test-project/bsconfig.json
@@ -0,0 +1,19 @@
+{
+ "createPackage": false,
+ "stagingDir": "../out/dist",
+ "retainStagingDir": true,
+ "autoImportComponentScript": true,
+ "sourceMap": true,
+ "files": [
+ "manifest",
+ "source/**/*.*",
+ "components/**/*.*",
+ "images/**/*.*"
+ ],
+ "plugins": [
+ "../src/index.ts"
+ ],
+ "require": [
+ "ts-node/register"
+ ]
+}
diff --git a/test-project/components/MainScene.bs b/test-project/components/MainScene.bs
new file mode 100644
index 0000000..09111c1
--- /dev/null
+++ b/test-project/components/MainScene.bs
@@ -0,0 +1,8 @@
+sub init()
+ m.top.setFocus(true)
+ m.mainLabel = m.top.findNode("mainLabel")
+ 'change the color
+ m.mainLabel.color = "0xFFFFFF"
+ 'make the text really big
+ m.mainLabel.font.size = 100
+end sub
\ No newline at end of file
diff --git a/test-project/components/MainScene.xml b/test-project/components/MainScene.xml
new file mode 100644
index 0000000..d647a6e
--- /dev/null
+++ b/test-project/components/MainScene.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/test-project/manifest b/test-project/manifest
new file mode 100644
index 0000000..ef72069
--- /dev/null
+++ b/test-project/manifest
@@ -0,0 +1,8 @@
+## Channel Details
+title=bsc-plugin-reftracker-testapp
+major_version=1
+minor_version=0
+build_version=00001
+
+splash_color=#000000
+splash_min_time=1
diff --git a/test-project/source/main.bs b/test-project/source/main.bs
new file mode 100644
index 0000000..85f1172
--- /dev/null
+++ b/test-project/source/main.bs
@@ -0,0 +1,17 @@
+sub main()
+ print "main"
+
+ screen = CreateObject("roSGScreen")
+ port = CreateObject("roMessagePort")
+ screen.setMessagePort(port)
+
+ scene = screen.CreateScene("MainScene")
+ screen.show()
+ while true
+ msg = wait(0, port)
+ msgType = type(msg)
+ if msgType = "roSGScreenEvent"
+ if msg.isScreenClosed() then return
+ end if
+ end while
+end sub