Skip to content

Commit

Permalink
use buffer (requires Sketch 52)
Browse files Browse the repository at this point in the history
  • Loading branch information
mathieudutour committed Sep 5, 2018
1 parent 3d0bbe0 commit 4de19b9
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 97 deletions.
4 changes: 4 additions & 0 deletions README.md
@@ -1,3 +1,7 @@
# `fs` for Sketch

All the sync [nodejs fs](https://nodejs.org/api/fs.html) API is available.

:warning: The version 0.2.* requires Sketch 52 or above. Use the version 0.1.* if you need to support earlier version of Sketch.

`fs.writeFileSync`, `fs.appendFileSync` and `fs.readFileSync` accept an `NSData` as encoding
125 changes: 29 additions & 96 deletions index.js
@@ -1,5 +1,16 @@
// TODO: async. Should probably be done with NSFileHandle and some notifications
// TODO: file descriptor. Needs to be done with NSFileHandle
var Buffer = require('buffer').Buffer

function encodingFromOptions(options, defaultValue) {
return options && options.encoding
? String(options.encoding)
: (
options
? String(options)
: defaultValue
)
}

module.exports.constants = {
F_OK: 0,
Expand Down Expand Up @@ -40,43 +51,11 @@ module.exports.appendFileSync = function(file, data, options) {
var handle = NSFileHandle.fileHandleForWritingAtPath(file)
handle.seekToEndOfFile()

if (data && data.mocha && data.mocha().class() === 'NSData') {
handle.writeData(data)
return
}
var encoding = encodingFromOptions(options, 'utf8')

var encoding = options && options.encoding ? options.encoding : (options ? options : 'utf8')

var string = NSString.stringWithString(data)
var nsdata

switch (encoding) {
case 'utf8':
nsdata = string.dataUsingEncoding(NSUTF8StringEncoding)
break
case 'ascii':
nsdata = string.dataUsingEncoding(NSASCIIStringEncoding)
break
case 'utf16le':
case 'ucs2':
nsdata = string.dataUsingEncoding(NSUTF16LittleEndianStringEncoding)
break
case 'base64':
var plainData = string.dataUsingEncoding(NSUTF8StringEncoding)
nsdata = plainData.base64EncodedStringWithOptions(0).dataUsingEncoding(NSUTF8StringEncoding)
break
case 'latin1':
case 'binary':
nsdata = string.dataUsingEncoding(NSISOLatin1StringEncoding)
break
case 'hex':
// TODO: how?
default:
nsdata = string.dataUsingEncoding(NSUTF8StringEncoding)
break
}
var nsdata = Buffer.from(data, encoding === 'NSData' || encoding === 'buffer' ? undefined : encoding).toNSData()

handle.writeData(data)
handle.writeData(nsdata)
}

module.exports.chmodSync = function(path, mode) {
Expand Down Expand Up @@ -149,34 +128,23 @@ module.exports.readdirSync = function(path) {
var paths = fileManager.subpathsAtPath(path)
var arr = []
for (var i = 0; i < paths.length; i++) {
arr.push(paths[i])
arr.push(String(paths[i]))
}
return arr
}

module.exports.readFileSync = function(path, options) {
var encoding = options && options.encoding ? options.encoding : (options ? options : 'buffer')
var encoding = encodingFromOptions(options, 'buffer')
var fileManager = NSFileManager.defaultManager()
var data = fileManager.contentsAtPath(path)
switch (encoding) {
case 'utf8':
return String(NSString.alloc().initWithData_encoding(data, NSUTF8StringEncoding))
case 'ascii':
return String(NSString.alloc().initWithData_encoding(data, NSASCIIStringEncoding))
case 'utf16le':
case 'ucs2':
return String(NSString.alloc().initWithData_encoding(data, NSUTF16LittleEndianStringEncoding))
case 'base64':
var nsdataDecoded = NSData.alloc().initWithBase64EncodedData_options(data, 0)
return String(NSString.alloc().initWithData_encoding(nsdataDecoded, NSUTF8StringEncoding))
case 'latin1':
case 'binary':
return String(NSString.alloc().initWithData_encoding(data, NSISOLatin1StringEncoding))
case 'hex':
// TODO: how?
return data
default:
return data
var buffer = Buffer.from(data)

if (encoding === 'buffer') {
return buffer
} else if (encoding === 'NSData') {
return buffer.toNSData()
} else {
return buffer.toString(encoding)
}
}

Expand All @@ -189,11 +157,11 @@ module.exports.readlinkSync = function(path) {
throw new Error(err.value())
}

return result
return String(result)
}

module.exports.realpathSync = function(path) {
return NSString.stringByResolvingSymlinksInPath(path)
return String(NSString.stringByResolvingSymlinksInPath(path))
}

module.exports.renameSync = function(oldPath, newPath) {
Expand Down Expand Up @@ -293,44 +261,9 @@ module.exports.utimesSync = function(path, aTime, mTime) {
}

module.exports.writeFileSync = function(path, data, options) {
var encoding = options && options.encoding ? options.encoding : (options ? options : 'utf8')

if (data && data.mocha && data.mocha().class() === 'NSData') {
data.writeToFile_atomically(path, true)
return
}
var encoding = encodingFromOptions(options, 'utf8')

var err = MOPointer.alloc().init()
var string = NSString.stringWithString(data)

switch (encoding) {
case 'utf8':
string.writeToFile_atomically_encoding_error(path, true, NSUTF8StringEncoding, err)
break
case 'ascii':
string.writeToFile_atomically_encoding_error(path, true, NSASCIIStringEncoding, err)
break
case 'utf16le':
case 'ucs2':
string.writeToFile_atomically_encoding_error(path, true, NSUTF16LittleEndianStringEncoding, err)
break
case 'base64':
var plainData = string.dataUsingEncoding(NSUTF8StringEncoding)
var nsdataEncoded = plainData.base64EncodedStringWithOptions(0)
nsdataEncoded.writeToFile_atomically(path, true)
break
case 'latin1':
case 'binary':
string.writeToFile_atomically_encoding_error(path, true, NSISOLatin1StringEncoding, err)
break
case 'hex':
// TODO: how?
default:
string.writeToFile_atomically_encoding_error(path, true, NSUTF8StringEncoding, err)
break
}
var nsdata = Buffer.from(data, encoding === 'NSData' || encoding === 'buffer' ? undefined : encoding).toNSData()

if (err.value() !== null) {
throw new Error(err.value())
}
nsdata.writeToFile_atomically(path, true)
}
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "@skpm/fs",
"version": "0.1.4",
"version": "0.2.0",
"description": "A sketch module to interact with the file system",
"main": "index.js",
"scripts": {
Expand Down

0 comments on commit 4de19b9

Please sign in to comment.