@pragma.tools/pbxproj
Version:
Parser and serializer for .pbxproj files with customizing comment strategies
175 lines (134 loc) • 3.79 kB
Markdown
# pragma-pbxproj
Parser and builder for .pbxproj files with comment strategies
## Installation
```bash
npm install @pragma.tools/pbxproj
```
## Usage
### Node.js API
```javascript
import { parse, serialize, stringify } from '@pragma.tools/pbxproj';
import fs from 'fs';
// Read .pbxproj file
const pbxprojContent = fs.readFileSync('MyApp.xcodeproj/project.pbxproj', 'utf8');
// Parse to AST
const ast = parse(pbxprojContent);
// Serialize back to .pbxproj format
const serialized = serialize(ast, {
commentStrategy: 'generate' // 'preserve', 'strip', 'generate', or custom function
});
// Or use stringify (alias for serialize)
const stringified = stringify(ast, { commentStrategy: 'generate' });
console.log(serialized);
```
## Examples
### Input .pbxproj file
```
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
1A2B3C4D5E6F7890ABCDEF01 /* AppDelegate.swift in Sources */ = {
isa = PBXBuildFile;
fileRef = 1A2B3C4D5E6F7890ABCDEF02 /* AppDelegate.swift */;
};
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
1A2B3C4D5E6F7890ABCDEF02 /* AppDelegate.swift */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.swift;
path = AppDelegate.swift;
sourceTree = "<group>";
};
/* End PBXFileReference section */
};
rootObject = 1A2B3C4D5E6F7890ABCDEF06 /* Project object */;
}
```
### Parsed AST (JSON)
```json
{
"archiveVersion": 1,
"objectVersion": 56,
"objects": {
"1A2B3C4D5E6F7890ABCDEF01": {
"isa": "PBXBuildFile",
"fileRef": "1A2B3C4D5E6F7890ABCDEF02"
},
"1A2B3C4D5E6F7890ABCDEF02": {
"isa": "PBXFileReference",
"lastKnownFileType": "sourcecode.swift",
"path": "AppDelegate.swift",
"sourceTree": "<group>"
}
},
"rootObject": "1A2B3C4D5E6F7890ABCDEF06"
}
```
### Serialized .pbxproj with generated comments
```
archiveVersion = 1;
objectVersion = 56;
objects = {
1A2B3C4D5E6F7890ABCDEF01 /* PBXBuildFile */ = {
"isa" = "PBXBuildFile";
"fileRef" = "1A2B3C4D5E6F7890ABCDEF02";
};
1A2B3C4D5E6F7890ABCDEF02 /* AppDelegate.swift */ = {
"isa" = "PBXFileReference";
"lastKnownFileType" = "sourcecode.swift";
"path" = "AppDelegate.swift";
"sourceTree" = "<group>";
};
};
rootObject = 1A2B3C4D5E6F7890ABCDEF06;
```
### CLI
```bash
# Parse and rebuild with generated comments
pbxproj path/to/project.pbxproj
# Or using npx
npx @pragma.tools/pbxproj path/to/project.pbxproj
```
## Comment Strategies
- `preserve` - Keep original comments (default)
- `strip` - Remove all comments
- `generate` - Generate comments based on object properties
- Custom function - Provide your own comment generator
## API Reference
### `parse(pbxprojText, options = {})`
Parses .pbxproj file content into AST.
### `serialize(ast, options = {})`
Serializes AST back to .pbxproj format.
### `stringify(ast, options = {})`
Alias for `serialize` function.
### Legacy Support
- `build(ast, options = {})` - Legacy alias for `serialize`, maintained for backward compatibility
## Testing
```bash
# Run tests in watch mode
npm test
# Run tests once
npm run test:run
# Run tests in watch mode
npm run test:watch
```
The project includes comprehensive tests covering:
- **Unit tests** - Individual function testing (`parse`, `build`, `generateComment`)
- **Integration tests** - Full parse-build cycle testing
- **CLI tests** - Command-line interface testing
- **Edge cases** - Error handling and boundary conditions
Test coverage includes:
- ✅ All main module exports
- ✅ Different comment strategies
- ✅ Error handling scenarios
- ✅ CLI argument validation
- ✅ File I/O operations
## Author
Denis Kreshikhin <denis@kreshikhin.com>
## License
MIT