diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/ScopeManager.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/ScopeManager.kt index 2dfa9203a87..497e876e852 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/ScopeManager.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/ScopeManager.kt @@ -94,12 +94,6 @@ class ScopeManager : ScopeProvider { */ private val aliases = mutableMapOf>() - /** - * The language frontend tied to the scope manager. Can be used to implement language specific - * scope resolution or lookup. - */ - var lang: LanguageFrontend<*, *>? = null - /** True, if the scope manager is currently in a [BlockScope]. */ val isInBlock: Boolean get() = this.firstScopeOrNull { it is BlockScope } != null @@ -568,10 +562,7 @@ class ScopeManager : ScopeProvider { } } - /** - * Only used by the [de.fraunhofer.aisec.cpg.graph.TypeManager], adds typedefs to the current - * [ValueDeclarationScope]. - */ + /** Only used by the [TypeManager], adds typedefs to the current [ValueDeclarationScope]. */ fun addTypedef(typedef: TypedefDeclaration) { val scope = this.firstScopeIsInstanceOrNull() if (scope == null) { @@ -580,12 +571,6 @@ class ScopeManager : ScopeProvider { } scope.addTypedef(typedef) - - if (scope.astNode == null) { - lang?.currentTU?.addTypedef(typedef) - } else { - scope.astNode?.addTypedef(typedef) - } } private fun getCurrentTypedefs(searchScope: Scope?): Collection { @@ -878,14 +863,14 @@ class ScopeManager : ScopeProvider { list += Alias(from, to) } - fun typeDefFor(finalToCheck: Type): Type? { + fun typedefFor(alias: Type): Type? { var current = currentScope // We need to build a path from the current scope to the top most one. This ensures us that // a local definition overwrites / shadows one that was there on a higher scope. while (current != null) { if (current is ValueDeclarationScope) { - val decl = current.typedefs[finalToCheck] + val decl = current.typedefs[alias] if (decl != null) { return decl.type } diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/TypeManager.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/TypeManager.kt index 56c431b4b2a..276b50bc72b 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/TypeManager.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/TypeManager.kt @@ -252,7 +252,7 @@ class TypeManager { fun resolvePossibleTypedef(alias: Type, scopeManager: ScopeManager): Type { val finalToCheck = alias.root - val applicable = scopeManager.typeDefFor(finalToCheck) + val applicable = scopeManager.typedefFor(finalToCheck) return applicable ?: alias } } diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/LanguageFrontend.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/LanguageFrontend.kt index 6ecb61fcf7e..75965712a31 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/LanguageFrontend.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/LanguageFrontend.kt @@ -66,10 +66,6 @@ abstract class LanguageFrontend( val typeManager: TypeManager = ctx.typeManager val config: TranslationConfiguration = ctx.config - init { - this.scopeManager.lang = this - } - var currentTU: TranslationUnitDeclaration? = null @Throws(TranslationException::class) diff --git a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/Node.kt b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/Node.kt index 4466ada2906..129f9e03926 100644 --- a/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/Node.kt +++ b/cpg-core/src/main/kotlin/de/fraunhofer/aisec/cpg/graph/Node.kt @@ -34,7 +34,6 @@ import de.fraunhofer.aisec.cpg.frontends.Language import de.fraunhofer.aisec.cpg.graph.declarations.MethodDeclaration import de.fraunhofer.aisec.cpg.graph.declarations.RecordDeclaration import de.fraunhofer.aisec.cpg.graph.declarations.TranslationUnitDeclaration -import de.fraunhofer.aisec.cpg.graph.declarations.TypedefDeclaration import de.fraunhofer.aisec.cpg.graph.edge.* import de.fraunhofer.aisec.cpg.graph.edge.Properties import de.fraunhofer.aisec.cpg.graph.scopes.GlobalScope @@ -203,8 +202,6 @@ open class Node : IVisitable, Persistable, LanguageProvider, ScopeProvider /** Virtual property for accessing the parents of the Program Dependence Graph (PDG). */ var prevPDG: MutableSet by PropertyEdgeSetDelegate(Node::prevPDGEdges, false) - var typedefs: MutableSet = HashSet() - /** * If a node is marked as being inferred, it means that it was created artificially and does not * necessarily have a real counterpart in the scanned source code. However, the nodes @@ -333,10 +330,6 @@ open class Node : IVisitable, Persistable, LanguageProvider, ScopeProvider } } - fun addTypedef(typedef: TypedefDeclaration) { - typedefs.add(typedef) - } - fun addAnnotations(annotations: Collection) { this.annotations.addAll(annotations) } diff --git a/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/enhancements/types/TypedefTest.kt b/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/enhancements/types/TypedefTest.kt index 6416d951365..e98a7c0eee0 100644 --- a/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/enhancements/types/TypedefTest.kt +++ b/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/enhancements/types/TypedefTest.kt @@ -26,14 +26,17 @@ package de.fraunhofer.aisec.cpg.enhancements.types import de.fraunhofer.aisec.cpg.BaseTest -import de.fraunhofer.aisec.cpg.TestUtils.analyze +import de.fraunhofer.aisec.cpg.TestUtils.analyzeAndGetFirstTU import de.fraunhofer.aisec.cpg.TestUtils.findByUniqueName -import de.fraunhofer.aisec.cpg.TestUtils.findByUniquePredicate +import de.fraunhofer.aisec.cpg.assertLocalName import de.fraunhofer.aisec.cpg.frontends.cxx.CPPLanguage +import de.fraunhofer.aisec.cpg.graph.* import de.fraunhofer.aisec.cpg.graph.declarations.ValueDeclaration -import de.fraunhofer.aisec.cpg.graph.records +import de.fraunhofer.aisec.cpg.graph.objectType import de.fraunhofer.aisec.cpg.graph.types.FunctionPointerType +import de.fraunhofer.aisec.cpg.graph.types.IntegerType import de.fraunhofer.aisec.cpg.graph.types.NumericType +import de.fraunhofer.aisec.cpg.graph.types.ObjectType import de.fraunhofer.aisec.cpg.graph.variables import java.nio.file.Path import kotlin.test.* @@ -44,141 +47,185 @@ internal class TypedefTest : BaseTest() { @Test @Throws(Exception::class) fun testSingle() { - val result = analyze("cpp", topLevel, true) { it.registerLanguage() } - val variables = result.variables - - // normal type - val l1 = findByUniqueName(variables, "l1") - val l2 = findByUniqueName(variables, "l2") - assertEquals(l1.type, l2.type) - - // pointer - val longptr1 = findByUniqueName(variables, "longptr1") - val longptr2 = findByUniqueName(variables, "longptr2") - assertEquals(longptr1.type, longptr2.type) - - // array - val arr1 = findByUniqueName(variables, "arr1") - val arr2 = findByUniqueName(variables, "arr2") - assertEquals(arr1.type, arr2.type) - - // function pointer - val uintfp1 = findByUniqueName(variables, "uintfp1") - val uintfp2 = findByUniqueName(variables, "uintfp2") - - val fpType = uintfp1.type as? FunctionPointerType - assertNotNull(fpType) - - val returnType = fpType.returnType as? NumericType - assertNotNull(returnType) - assertEquals(NumericType.Modifier.UNSIGNED, returnType.modifier) - assertEquals(uintfp1.type, uintfp2.type) - - val typedefs = result.finalCtx.scopeManager.currentTypedefs - val def = - typedefs.stream().filter { it.alias.name.localName == "test" }.findAny().orElse(null) - assertNotNull(def) + val tu = + analyzeAndGetFirstTU( + listOf(topLevel.resolve("typedefs.cpp").toFile()), + topLevel, + true + ) { + it.registerLanguage() + } + with(tu) { + // normal type + val l1 = tu.variables["l1"] + val l2 = tu.variables["l2"] + assertEquals(l1?.type, l2?.type) + + // pointer + val longptr1 = tu.variables["longptr1"] + val longptr2 = tu.variables["longptr2"] + assertEquals(longptr1?.type, longptr2?.type) + + // array + val arr1 = tu.variables["arr1"] + val arr2 = tu.variables["arr2"] + assertEquals(arr1?.type, arr2?.type) + + // function pointer + val uintfp1 = tu.variables["uintfp1"] + val uintfp2 = tu.variables["uintfp2"] + + val fpType = uintfp1?.type as? FunctionPointerType + assertNotNull(fpType) + + val returnType = fpType.returnType as? NumericType + assertNotNull(returnType) + assertEquals(NumericType.Modifier.UNSIGNED, returnType.modifier) + assertEquals(uintfp1.type, uintfp2?.type) + + val type = tu.ctx?.scopeManager?.typedefFor(objectType("test")) + assertIs(type) + assertLocalName("uint8_t", type) + } } @Test @Throws(Exception::class) fun testWithModifier() { - val result = analyze("cpp", topLevel, true) { it.registerLanguage() } - val variables = result.variables + val tu = + analyzeAndGetFirstTU( + listOf(topLevel.resolve("typedefs.cpp").toFile()), + topLevel, + true + ) { + it.registerLanguage() + } // pointer - val l1ptr = findByUniqueName(variables, "l1ptr") - val l2ptr = findByUniqueName(variables, "l2ptr") - val l3ptr = findByUniqueName(variables, "l3ptr") - val l4ptr = findByUniqueName(variables, "l4ptr") - assertEquals(l1ptr.type, l2ptr.type) - assertEquals(l1ptr.type, l3ptr.type) - assertEquals(l1ptr.type, l4ptr.type) + val l1ptr = tu.variables["l1ptr"] + val l2ptr = tu.variables["l2ptr"] + val l3ptr = tu.variables["l3ptr"] + val l4ptr = tu.variables["l4ptr"] + assertEquals(l1ptr?.type, l2ptr?.type) + assertEquals(l1ptr?.type, l3ptr?.type) + assertEquals(l1ptr?.type, l4ptr?.type) } @Test @Throws(Exception::class) fun testChained() { - val result = analyze("cpp", topLevel, true) { it.registerLanguage() } - val variables = result.variables - val l1 = findByUniqueName(variables, "l1") - val l3 = findByUniqueName(variables, "l3") - val l4 = findByUniqueName(variables, "l4") - assertEquals(l1.type, l3.type) - assertEquals(l1.type, l4.type) + val tu = + analyzeAndGetFirstTU( + listOf(topLevel.resolve("typedefs.cpp").toFile()), + topLevel, + true + ) { + it.registerLanguage() + } + + val l1 = tu.variables["l1"] + val l3 = tu.variables["l3"] + val l4 = tu.variables["l4"] + assertEquals(l1?.type, l3?.type) + assertEquals(l1?.type, l4?.type) } @Test @Throws(Exception::class) fun testMultiple() { - val result = analyze("cpp", topLevel, true) { it.registerLanguage() } - val variables = result.variables - - // simple type - val i1 = findByUniqueName(variables, "i1") - val i2 = findByUniqueName(variables, "i2") - assertEquals(i1.type, i2.type) - - // array - val a1 = findByUniqueName(variables, "a1") - val a2 = findByUniqueName(variables, "a2") - assertEquals(a1.type, a2.type) - - // pointer - val intPtr1 = findByUniqueName(variables, "intPtr1") - val intPtr2 = findByUniqueName(variables, "intPtr2") - assertEquals(intPtr1.type, intPtr2.type) - - // function pointer - val fPtr1 = findByUniqueName(variables, "intFptr1") - val fPtr2 = findByUniqueName(variables, "intFptr2") - assertEquals(fPtr1.type, fPtr2.type) - - // template, not to be confused with multiple typedef - val template = - findByUniquePredicate(result.translationUnits.firstOrNull()?.typedefs ?: listOf()) { - it.type.typeName == "template_class_A" + val tu = + analyzeAndGetFirstTU( + listOf(topLevel.resolve("typedefs.cpp").toFile()), + topLevel, + true + ) { + it.registerLanguage() } - assertEquals(template.alias.typeName, "type_B") + with(tu) { + // simple type + val i1 = tu.variables["i1"] + val i2 = tu.variables["i2"] + assertEquals(i1?.type, i2?.type) + + // array + val a1 = tu.variables["a1"] + val a2 = tu.variables["a2"] + assertEquals(a1?.type, a2?.type) + + // pointer + val intPtr1 = tu.variables["intPtr1"] + val intPtr2 = tu.variables["intPtr2"] + assertEquals(intPtr1?.type, intPtr2?.type) + + // function pointer + val fPtr1 = tu.variables["intFptr1"] + val fPtr2 = tu.variables["intFptr2"] + assertEquals(fPtr1?.type, fPtr2?.type) + + val type = tu.ctx?.scopeManager?.typedefFor(objectType("type_B")) + assertLocalName("template_class_A", type) + assertIs(type) + assertEquals(listOf(primitiveType("int"), primitiveType("int")), type.generics) + } } @Test @Throws(Exception::class) fun testStructs() { - val result = analyze("cpp", topLevel, true) { it.registerLanguage() } - val variables = result.variables - val ps1 = findByUniqueName(variables, "ps1") - val ps2 = findByUniqueName(variables, "ps2") - assertEquals(ps1.type, ps2.type) + val tu = + analyzeAndGetFirstTU( + listOf(topLevel.resolve("typedefs.cpp").toFile()), + topLevel, + true + ) { + it.registerLanguage() + } + + val ps1 = tu.variables["ps1"] + val ps2 = tu.variables["ps2"] + assertEquals(ps1?.type, ps2?.type) } @Test @Throws(Exception::class) fun testArbitraryTypedefLocation() { - val result = analyze("cpp", topLevel, true) { it.registerLanguage() } - val variables = result.variables - val ullong1 = findByUniqueName(variables, "someUllong1") - val ullong2 = findByUniqueName(variables, "someUllong2") - assertEquals(ullong1.type, ullong2.type) + val tu = + analyzeAndGetFirstTU( + listOf(topLevel.resolve("typedefs.cpp").toFile()), + topLevel, + true + ) { + it.registerLanguage() + } + + val ullong1 = tu.variables["someUllong1"] + val ullong2 = tu.variables["someUllong2"] + assertEquals(ullong1?.type, ullong2?.type) } @Test @Throws(Exception::class) fun testMemberTypeDef() { - val result = analyze("cpp", topLevel, true) { it.registerLanguage() } - val variables = result.variables - val records = result.records - val addConst = findByUniqueName(records, "add_const") + val tu = + analyzeAndGetFirstTU( + listOf(topLevel.resolve("typedefs.cpp").toFile()), + topLevel, + true + ) { + it.registerLanguage() + } + + val addConst = tu.records["add_const"] val typeMember1: ValueDeclaration = findByUniqueName(addConst.fields, "typeMember1") val typeMember2: ValueDeclaration = findByUniqueName(addConst.fields, "typeMember2") assertEquals(typeMember1.type, typeMember2.type) - val typeMemberOutside = findByUniqueName(variables, "typeMemberOutside") - assertNotEquals(typeMemberOutside.type, typeMember2.type) + val typeMemberOutside = tu.variables["typeMemberOutside"] + assertNotEquals(typeMemberOutside?.type, typeMember2.type) - val cptr1 = findByUniqueName(variables, "cptr1") - val cptr2 = findByUniqueName(variables, "cptr2") - assertEquals(cptr1.type, cptr2.type) - assertNotEquals(typeMemberOutside.type, cptr2.type) + val cptr1 = tu.variables["cptr1"] + val cptr2 = tu.variables["cptr2"] + assertEquals(cptr1?.type, cptr2?.type) + assertNotEquals(typeMemberOutside?.type, cptr2?.type) } } diff --git a/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/CXXLanguageFrontendTest.kt b/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/CXXLanguageFrontendTest.kt index ca7769e965c..693673a7c22 100644 --- a/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/CXXLanguageFrontendTest.kt +++ b/cpg-language-cxx/src/test/kotlin/de/fraunhofer/aisec/cpg/frontends/cxx/CXXLanguageFrontendTest.kt @@ -1452,28 +1452,25 @@ internal class CXXLanguageFrontendTest : BaseTest() { @Throws(Exception::class) fun testTypedef() { val file = File("src/test/resources/c/typedef_in_header/main.c") - val result = - analyze(listOf(file), file.parentFile.toPath(), true) { + val tu = + analyzeAndGetFirstTU(listOf(file), file.parentFile.toPath(), true) { it.registerLanguage() } + with(tu) { + val typedefs = tu.ctx?.scopeManager?.typedefFor(objectType("MyStruct")) + assertLocalName("__myStruct", typedefs) - val typedefs = result.finalCtx.scopeManager.currentTypedefs - assertNotNull(typedefs) - assertTrue(typedefs.isNotEmpty()) - - val tu = result.translationUnits.firstOrNull() - assertNotNull(tu) - - val main = tu.byNameOrNull("main") - assertNotNull(main) + val main = tu.byNameOrNull("main") + assertNotNull(main) - val call = main.bodyOrNull() - assertNotNull(call) - assertTrue(call.invokes.isNotEmpty()) + val call = main.bodyOrNull() + assertNotNull(call) + assertTrue(call.invokes.isNotEmpty()) - val func = call.invokes.firstOrNull() - assertNotNull(func) - assertFalse(func.isInferred) + val func = call.invokes.firstOrNull() + assertNotNull(func) + assertFalse(func.isInferred) + } } @Test diff --git a/cpg-language-cxx/src/test/resources/typedefs/typedefs.cpp b/cpg-language-cxx/src/test/resources/typedefs/typedefs.cpp index ce7f569b787..f118811c43c 100644 --- a/cpg-language-cxx/src/test/resources/typedefs/typedefs.cpp +++ b/cpg-language-cxx/src/test/resources/typedefs/typedefs.cpp @@ -75,7 +75,7 @@ typedef long type; type typeMemberOutside; // sample typedef with tabs -typedef uint8 test; +typedef uint8_t test; struct add_const { typedef const int type; diff --git a/cpg-language-typescript/src/main/nodejs/package-lock.json b/cpg-language-typescript/src/main/nodejs/package-lock.json index 1c61fd47e94..78c0a2541d7 100644 --- a/cpg-language-typescript/src/main/nodejs/package-lock.json +++ b/cpg-language-typescript/src/main/nodejs/package-lock.json @@ -13,7 +13,7 @@ "@rollup/plugin-commonjs": "^25.0.3", "@rollup/plugin-node-resolve": "^15.1.0", "@rollup/plugin-typescript": "^11.1.2", - "rollup": "^3.26.3", + "rollup": "^4.0.0", "tslib": "^2.6.0" } }, @@ -100,9 +100,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -113,7 +113,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -121,6 +121,162 @@ } } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.1.tgz", + "integrity": "sha512-YaN43wTyEBaMqLDYeze+gQ4ZrW5RbTEGtT5o1GVDkhpdNcsLTnLRcLccvwy3E9wiDKWg9RIhuoy3JQKDRBfaZA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.5.1.tgz", + "integrity": "sha512-n1bX+LCGlQVuPlCofO0zOKe1b2XkFozAVRoczT+yxWZPGnkEAKTTYVOGZz8N4sKuBnKMxDbfhUsB1uwYdup/sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.5.1.tgz", + "integrity": "sha512-QqJBumdvfBqBBmyGHlKxje+iowZwrHna7pokj/Go3dV1PJekSKfmjKrjKQ/e6ESTGhkfPNLq3VXdYLAc+UtAQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.5.1.tgz", + "integrity": "sha512-RrkDNkR/P5AEQSPkxQPmd2ri8WTjSl0RYmuFOiEABkEY/FSg0a4riihWQGKDJ4LnV9gigWZlTMx2DtFGzUrYQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.5.1.tgz", + "integrity": "sha512-ZFPxvUZmE+fkB/8D9y/SWl/XaDzNSaxd1TJUSE27XAKlRpQ2VNce/86bGd9mEUgL3qrvjJ9XTGwoX0BrJkYK/A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.5.1.tgz", + "integrity": "sha512-FEuAjzVIld5WVhu+M2OewLmjmbXWd3q7Zcx+Rwy4QObQCqfblriDMMS7p7+pwgjZoo9BLkP3wa9uglQXzsB9ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.5.1.tgz", + "integrity": "sha512-f5Gs8WQixqGRtI0Iq/cMqvFYmgFzMinuJO24KRfnv7Ohi/HQclwrBCYkzQu1XfLEEt3DZyvveq9HWo4bLJf1Lw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.5.1.tgz", + "integrity": "sha512-CWPkPGrFfN2vj3mw+S7A/4ZaU3rTV7AkXUr08W9lNP+UzOvKLVf34tWCqrKrfwQ0NTk5GFqUr2XGpeR2p6R4gw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.5.1.tgz", + "integrity": "sha512-ZRETMFA0uVukUC9u31Ed1nx++29073goCxZtmZARwk5aF/ltuENaeTtRVsSQzFlzdd4J6L3qUm+EW8cbGt0CKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.5.1.tgz", + "integrity": "sha512-ihqfNJNb2XtoZMSCPeoo0cYMgU04ksyFIoOw5S0JUVbOhafLot+KD82vpKXOurE2+9o/awrqIxku9MRR9hozHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.5.1.tgz", + "integrity": "sha512-zK9MRpC8946lQ9ypFn4gLpdwr5a01aQ/odiIJeL9EbgZDMgbZjjT/XzTqJvDfTmnE1kHdbG20sAeNlpc91/wbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.1.tgz", + "integrity": "sha512-5I3Nz4Sb9TYOtkRwlH0ow+BhMH2vnh38tZ4J4mggE48M/YyJyp/0sPSxhw1UeS1+oBgQ8q7maFtSeKpeRJu41Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", @@ -373,18 +529,30 @@ } }, "node_modules/rollup": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.0.tgz", - "integrity": "sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.5.1.tgz", + "integrity": "sha512-0EQribZoPKpb5z1NW/QYm3XSR//Xr8BeEXU49Lc/mQmpmVVG5jPUVrpc2iptup/0WMrY9mzas0fxH+TjYvG2CA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.5.1", + "@rollup/rollup-android-arm64": "4.5.1", + "@rollup/rollup-darwin-arm64": "4.5.1", + "@rollup/rollup-darwin-x64": "4.5.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.5.1", + "@rollup/rollup-linux-arm64-gnu": "4.5.1", + "@rollup/rollup-linux-arm64-musl": "4.5.1", + "@rollup/rollup-linux-x64-gnu": "4.5.1", + "@rollup/rollup-linux-x64-musl": "4.5.1", + "@rollup/rollup-win32-arm64-msvc": "4.5.1", + "@rollup/rollup-win32-ia32-msvc": "4.5.1", + "@rollup/rollup-win32-x64-msvc": "4.5.1", "fsevents": "~2.3.2" } },