{"id":17173253,"url":"https://github.com/stevenaw/vs-parse","last_synced_at":"2026-03-14T12:35:46.021Z","repository":{"id":31156641,"uuid":"126640527","full_name":"stevenaw/vs-parse","owner":"stevenaw","description":"Node-based utilities for parsing Visual Studio files","archived":false,"fork":false,"pushed_at":"2022-05-28T17:39:58.000Z","size":216,"stargazers_count":4,"open_issues_count":2,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-07T21:43:05.690Z","etag":null,"topics":["csproj","node","npm","parse","parser","visual-studio"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stevenaw.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-24T21:11:29.000Z","updated_at":"2022-12-24T16:13:56.000Z","dependencies_parsed_at":"2022-07-28T23:19:08.727Z","dependency_job_id":null,"html_url":"https://github.com/stevenaw/vs-parse","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/stevenaw/vs-parse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevenaw%2Fvs-parse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevenaw%2Fvs-parse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevenaw%2Fvs-parse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevenaw%2Fvs-parse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stevenaw","download_url":"https://codeload.github.com/stevenaw/vs-parse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevenaw%2Fvs-parse/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260629114,"owners_count":23038872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csproj","node","npm","parse","parser","visual-studio"],"created_at":"2024-10-14T23:50:26.493Z","updated_at":"2026-03-14T12:35:46.014Z","avatar_url":"https://github.com/stevenaw.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# vs-parse\n[![build status](https://img.shields.io/github/actions/workflow/status/stevenaw/vs-parse/ci.yml?branch=main)](https://github.com/stevenaw/vs-parse/actions/workflows/ci.yml?query=branch%3Amain)\n\nNode-based parser of Visual Studio projects/solutions.\n\n## Modules\nAll functions come in synchronous and asynchronous versions. Synchronous versions are suffixed with \"Sync\".\nAsynchronous versions return a promise which resolves to the same value as the synchronous version of a function.\n\n### parseSolution\n### parseSolutionSync\nSolution file parser\n\n```js\nconst parseSolution = (file, options = {}) =\u003e Promise.resolve({})\nconst parseSolutionSync = (file, options = {}) =\u003e {}\n```\n\n#### Examples\n\nFrom a path\n\n```js\nconst parser = require('vs-parse');\nconst solutionData = await parser.parseSolution('HelloWorld.sln');\n```\n\nFrom a string\n\n```js\nconst parser = require('vs-parse');\nconst fs = require('fs');\n\nconst contents = fs.readFileSync('HelloWorld.sln', { encoding: 'utf-8' });\nconst solutionData = await parser.parseSolution(contents);\n```\n\nFrom a buffer\n\n```js\nconst parser = require('vs-parse');\nconst fs = require('fs');\n\nconst buffer = fs.readFileSync('HelloWorld.sln');\nconst solutionData = await parser.parseSolution(buffer);\n```\n\n#### Sample Output\n\n```js\nconst parser = require('vs-parse');\nconst solutionData = await parser.parseSolution('HelloWorld.sln');\n\nconsole.log(solutionData);\n/*\n  Outputs:\n\n  {\n    fileFormatVersion: '12.00',\n    visualStudioVersion: '15.0.27004.2009',\n    minimumVisualStudioVersion: '10.0.40219.1',\n    projects: [\n      {\n        id: '1580E0CD-6DAA-4328-92F6-2E0B0F0AB7AF',\n        name: 'TestNUnit3',\n        relativePath: 'TestNUnit3\\\\TestNUnit3.csproj',\n        projectTypeId: 'FAE04EC0-301F-11D3-BF4B-00C04F79EFBC'\n      }\n    ]\n  }\n*/\n```\n\nA full parse of a solution and all its dependencies can be done by passing the [`deepParse` option](#deep-parse). This will force the parser to enumerate and parse all dependent projects (as well as their dependencies). See [parseProject()](#parseproject) for details.\n\nExample:\n```js\nconst parser = require('vs-parse');\nconst solutionData = await parser.parseSolution('HelloWorld.sln' { deepParse: true });\n\nconsole.log(solutionData);\n/*\n  Outputs:\n\n  {\n    fileFormatVersion: '12.00',\n    visualStudioVersion: '15.0.27004.2009',\n    minimumVisualStudioVersion: '10.0.40219.1',\n    projects: [\n      {\n        id: '1580E0CD-6DAA-4328-92F6-2E0B0F0AB7AF',\n        name: 'TestNUnit3',\n        relativePath: 'TestNUnit3\\\\TestNUnit3.csproj',\n        projectTypeId: 'FAE04EC0-301F-11D3-BF4B-00C04F79EFBC',\n        codeFiles: [\n          {\n            fileName: 'MyFile.cs'\n          }\n        ],\n        packages: [\n          {\n            name: 'NUnit',\n            version: '3.7.1',\n            targetFramework: 'net452'  \n          }\n        ],\n        references: [\n          {\n            assemblyName: 'nunit.framework',\n            culture: 'neutral',\n            hintPath: '..\\packages\\NUnit.3.7.1\\lib\\net45\\nunit.framework.dll',\n            processorArchitecture: 'MSIL',\n            publicKeyToken: 'b035f5f7f11d50a3a',\n            version: '3.7.1.0'\n          }\n        ]\n      }\n    ]\n  }\n*/\n```\n\n### parseProject\n### parseProjectSync\nParses a project file.\n\n```js\nconst parseProject = (file, options = {}) =\u003e Promise.resolve({})\nconst parseProjectSync = (file, options = {}) =\u003e {}\n```\n\n#### Examples\n\nFrom a path\n\n```js\nconst parser = require('vs-parse');\nconst projectData = await parser.parseProject('./TestNUnit3/TestNUnit3.csproj');\n```\n\nFrom a string\n\n```js\nconst parser = require('vs-parse');\nconst fs = require('fs');\n\nconst contents = fs.readFileSync('./TestNUnit3/TestNUnit3.csproj', { encoding: 'utf-8' });\nconst projectData = await parser.parseProject(contents);\n```\n\nFrom a buffer\n\n```js\nconst parser = require('vs-parse');\nconst fs = require('fs');\n\nconst buffer = fs.readFileSync('./TestNUnit3/TestNUnit3.csproj');\nconst projectData = await parser.parseProject(buffer);\n```\n\n#### Sample Output\n\nExample:\n```js\nconst parser = require('vs-parse');\nconst projectData = await parser.parseProject('./TestNUnit3/TestNUnit3.csproj');\n\nconsole.log(projectData);\n/*\n  Outputs:\n\n  {\n    codeFiles: [\n      {\n        fileName: 'Class1.cs'\n      }\n    ],\n    references: [\n      {\n        assemblyName: 'nunit.framework',\n        culture: 'neutral',\n        hintPath: '..\\packages\\NUnit.3.7.1\\lib\\net45\\nunit.framework.dll',\n        processorArchitecture: 'MSIL',\n        publicKeyToken: 'b035f5f7f11d50a3a',\n        version: '3.7.1.0'\n      }\n    ]\n  }\n*/\n```\n\nA full parse of a project and all its dependencies can be done by passing the [`deepParse` option](#deep-parse). This will force the parser to enumerate and parse all packages. Project files using the `\u003cPackageReference\u003e` format do not require this option to return dependent packages. Dependency parsing will defer to the dependencies listed in `packages.config` over `\u003cPackageReference\u003e` if a `packages.config` file is present.\n\nExample:\n```js\nconst parser = require('vs-parse');\nconst projectData = await parser.parseProject('./TestNUnit3/TestNUnit3.csproj', { deepParse: true });\n\nconsole.log(projectData);\n/*\n  Outputs:\n\n  {\n    codeFiles: [\n      {\n        fileName: 'Class1.cs'\n      }\n    ],\n    packages: [\n      {\n        name: 'NUnit',\n        version: '3.7.1',\n        targetFramework: 'net452'  \n      }\n    ],\n    references: [\n      {\n        assemblyName: 'nunit.framework',\n        culture: 'neutral',\n        hintPath: '..\\packages\\NUnit.3.7.1\\lib\\net45\\nunit.framework.dll',\n        processorArchitecture: 'MSIL',\n        publicKeyToken: 'b035f5f7f11d50a3a',\n        version: '3.7.1.0'\n      }\n    ]\n  }\n*/\n```\n\n### parsePackages\n### parsePackagesSync\nParses a nuget 'packages.config' file.\n\n```js\nconst parsePackages = (file, options = {}) =\u003e Promise.resolve({})\nconst parsePackagesSync = (file, options = {}) =\u003e {}\n```\n\n#### Examples\n```js\nconst parser = require('vs-parse');\nconst packages = await parser.parsePackages('./packages.config');\n\nconsole.log(packages);\n/*\n  Outputs:\n\n  [\n    {\n      name: 'NUnit',\n      version: '3.7.1',\n      targetFramework: 'net452'  \n    }\n  ]\n*/\n```\n\n### parseSemverSync\nA very simple semver parser. Mostly a wrapper over standardized tools, with support for .NET-specific assembly versioning.\n\n```js\nconst parser = require('vs-parse');\n\nconst versionString = '1.2.3.4';\nconst versionInfo = parser.parseSemverSync(versionString);\n\nconsole.log(versionInfo);\n/*\n Outputs:\n\n {\n    major: '1',\n    minor: '2',\n    patch: '3',\n    version: '1.2.3',\n    originalString: '1.2.3.4'\n  }\n*/\n```\n\n## Module Parser Options\nAn `options` object can be passed to a parsing function to customize its behaviour.\n\n#### Deep Parse\n`deepParse` - Specifying `true` will also read and parse all dependencies. Defaults to `false`.\n\nExample: A solution is dependent on its projects, while a project is dependent on its packages.\n\n#### Directory Root\n`dirRoot` - The root directory under which the solution or project lives. Defaults to `undefined`.\n\nRequired when doing a deep parse of a solution or project from file contents or a buffer.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevenaw%2Fvs-parse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstevenaw%2Fvs-parse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevenaw%2Fvs-parse/lists"}