Compare commits

...

18 Commits

Author SHA1 Message Date
701b77eff5 8.0.0 2020-08-10 20:58:23 +00:00
e3c46cdd2c BREAKING CHANGE(Smartfile class): switch to a Buffer only approach 2020-08-10 20:58:22 +00:00
7204607c8a 7.0.12 2020-04-13 17:48:25 +00:00
039c6f7fc6 fix(core): update 2020-04-13 17:48:25 +00:00
b42595fccc 7.0.11 2020-03-15 19:08:42 +00:00
2d9a65d11c fix(core): update 2020-03-15 19:08:41 +00:00
b3ce66167e 7.0.10 2020-03-15 18:58:46 +00:00
c7f800fc88 fix(core): update 2020-03-15 18:58:46 +00:00
d8f4b011b7 7.0.9 2020-03-04 16:31:14 +00:00
b4add67f37 fix(core): update 2020-03-04 16:31:13 +00:00
f86f053bd5 7.0.8 2020-02-07 21:00:54 +00:00
a78ca67b43 fix(core): update 2020-02-07 21:00:54 +00:00
b1bedd0f54 7.0.7 2020-02-07 21:00:05 +00:00
ec58f7ac55 fix(core): update 2020-02-07 21:00:04 +00:00
80743576ad 7.0.6 2019-09-29 16:43:32 +02:00
32a6db645d fix(core): update 2019-09-29 16:43:31 +02:00
45dfa16ab7 7.0.5 2019-09-27 11:00:17 +02:00
4fc4cda786 fix(core): update 2019-09-27 11:00:17 +02:00
17 changed files with 10189 additions and 1026 deletions

4
.gitignore vendored
View File

@ -15,8 +15,6 @@ node_modules/
# builds # builds
dist/ dist/
dist_web/ dist_*/
dist_serve/
dist_ts_web/
# custom # custom

View File

@ -3,14 +3,14 @@ image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache: cache:
paths: paths:
- .npmci_cache/ - .npmci_cache/
key: "$CI_BUILD_STAGE" key: '$CI_BUILD_STAGE'
stages: stages:
- security - security
- test - test
- release - release
- metadata - metadata
# ==================== # ====================
# security stage # security stage
@ -18,48 +18,62 @@ stages:
mirror: mirror:
stage: security stage: security
script: script:
- npmci git mirror - npmci git mirror
only:
- tags
tags: tags:
- docker - lossless
- notpriv - docker
- notpriv
snyk: audit:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security stage: security
script: script:
- npmci npm prepare - npmci npm prepare
- npmci command npm install -g snyk
- npmci command npm install --ignore-scripts - npmci command npm install --ignore-scripts
- npmci command snyk test - npmci command npm config set registry https://registry.npmjs.org
- npmci command npm audit --audit-level=high
tags: tags:
- docker - docker
- notpriv
# ==================== # ====================
# test stage # test stage
# ==================== # ====================
testLTS: testStable:
stage: test stage: test
script: script:
- npmci npm prepare - npmci npm prepare
- npmci node install lts - npmci node install stable
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
- notpriv
testBuild:
stage: test
script:
- npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
release: release:
stage: release stage: release
script: script:
- npmci node install lts - npmci node install stable
- npmci npm publish - npmci npm publish
only: only:
- tags - tags
tags: tags:
- docker - lossless
- notpriv - docker
- notpriv
# ==================== # ====================
# metadata stage # metadata stage
@ -67,33 +81,39 @@ release:
codequality: codequality:
stage: metadata stage: metadata
allow_failure: true allow_failure: true
only:
- tags
script: script:
- npmci command npm install -g tslint typescript - npmci command npm install -g tslint typescript
- npmci npm prepare
- npmci npm install - npmci npm install
- npmci command "tslint -c tslint.json ./ts/**/*.ts" - npmci command "tslint -c tslint.json ./ts/**/*.ts"
tags: tags:
- docker - lossless
- priv - docker
- priv
trigger: trigger:
stage: metadata stage: metadata
script: script:
- npmci trigger - npmci trigger
only: only:
- tags - tags
tags: tags:
- docker - lossless
- notpriv - docker
- notpriv
pages: pages:
image: hosttoday/ht-docker-node:npmci
stage: metadata stage: metadata
script: script:
- npmci node install lts
- npmci command npm install -g @gitzone/tsdoc - npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare - npmci npm prepare
- npmci npm install - npmci npm install
- npmci command tsdoc - npmci command tsdoc
tags: tags:
- lossless
- docker - docker
- notpriv - notpriv
only: only:
@ -101,5 +121,5 @@ pages:
artifacts: artifacts:
expire_in: 1 week expire_in: 1 week
paths: paths:
- public - public
allow_failure: true allow_failure: true

29
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,29 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "current file",
"type": "node",
"request": "launch",
"args": [
"${relativeFile}"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "test.ts",
"type": "node",
"request": "launch",
"args": [
"test/test.ts"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
}
]
}

26
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"json.schemas": [
{
"fileMatch": ["/npmextra.json"],
"schema": {
"type": "object",
"properties": {
"npmci": {
"type": "object",
"description": "settings for npmci"
},
"gitzone": {
"type": "object",
"description": "settings for gitzone",
"properties": {
"projectType": {
"type": "string",
"enum": ["website", "element", "service", "npm", "wcc"]
}
}
}
}
}
}
]
}

View File

@ -1,40 +0,0 @@
# @pushrocks/smartfile
smart ways to work with files in nodejs
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartfile)
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartfile)
* [github.com (source mirror)](https://github.com/pushrocks/smartfile)
* [docs (typedoc)](https://pushrocks.gitlab.io/smartfile/)
## Status for master
[![build status](https://gitlab.com/pushrocks/smartfile/badges/master/build.svg)](https://gitlab.com/pushrocks/smartfile/commits/master)
[![coverage report](https://gitlab.com/pushrocks/smartfile/badges/master/coverage.svg)](https://gitlab.com/pushrocks/smartfile/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/smartfile.svg)](https://www.npmjs.com/package/@pushrocks/smartfile)
[![Known Vulnerabilities](https://snyk.io/test/npm/@pushrocks/smartfile/badge.svg)](https://snyk.io/test/npm/@pushrocks/smartfile)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## Usage
smartfile is an approach of being one tool to handle files in diverse environments.
### Smartfile Sections
smartfile thinks in sections:
| section | description |
| ----------- | ---------------------------------------------------------------------------- |
| fs | (object) gets data from fs to somewhere |
| memory | gets data from memory to somewhere |
| remote | gets data from remote locations to somewhere |
| interpreter | (object) handles yaml and json |
| smartfile | (class) a virtual representation of a file, alternative to vinyl file format |
For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com)

View File

@ -9,6 +9,7 @@
"npmAccessLevel": "public" "npmAccessLevel": "public"
}, },
"gitzone": { "gitzone": {
"projectType": "npm",
"module": { "module": {
"githost": "gitlab.com", "githost": "gitlab.com",
"gitscope": "pushrocks", "gitscope": "pushrocks",

10546
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +1,13 @@
{ {
"name": "@pushrocks/smartfile", "name": "@pushrocks/smartfile",
"private": false, "private": false,
"version": "7.0.4", "version": "8.0.0",
"description": "offers smart ways to work with files in nodejs", "description": "offers smart ways to work with files in nodejs",
"main": "dist/index.js", "main": "dist_ts/index.js",
"typings": "dist/index.d.ts", "typings": "dist_ts/index.d.ts",
"scripts": { "scripts": {
"test": "(tstest test/)", "test": "(tstest test/)",
"reinstall": "(rm -r node_modules && npm install)", "build": "(tsbuild --web)"
"release": "(git pull origin master && npm version patch && git push origin master && git checkout release && git merge master && git push origin release && git checkout master)",
"update": "(git checkout master && git pull origin master && npm install)",
"upgrade": "(npm run update) && (ncu upgradeAll && npm install)",
"build": "(tsbuild)"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -21,41 +17,46 @@
"filesystem", "filesystem",
"json" "json"
], ],
"author": "Smart Coordination GmbH <office@push.rocks> (https://push.rocks)", "author": "Lossless GmbH <hello@lossless.com> (https://lossless.com)",
"license": "MIT", "license": "MIT",
"bugs": { "bugs": {
"url": "https://gitlab.com/pushrocks/smartfile/issues" "url": "https://gitlab.com/pushrocks/smartfile/issues"
}, },
"homepage": "https://gitlab.com/pushrocks/smartfile", "homepage": "https://gitlab.com/pushrocks/smartfile",
"dependencies": { "dependencies": {
"@pushrocks/smartpath": "^4.0.1", "@pushrocks/smarthash": "^2.1.6",
"@pushrocks/smartpromise": "^3.0.2", "@pushrocks/smartmime": "^1.0.3",
"@pushrocks/smartrequest": "^1.1.14", "@pushrocks/smartpath": "^4.0.3",
"@types/fs-extra": "^5.0.5", "@pushrocks/smartpromise": "^3.0.6",
"@types/vinyl": "^2.0.2", "@pushrocks/smartrequest": "^1.1.47",
"fs-extra": "^7.0.1", "@types/fs-extra": "^9.0.1",
"glob": "^7.1.3", "fs-extra": "^9.0.1",
"js-yaml": "^3.13.1", "glob": "^7.1.6",
"vinyl-file": "^3.0.0" "js-yaml": "^3.14.0"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.8", "@gitzone/tsbuild": "^2.1.24",
"@gitzone/tsrun": "^1.2.1", "@gitzone/tsrun": "^1.2.12",
"@gitzone/tstest": "^1.0.18", "@gitzone/tstest": "^1.0.43",
"@pushrocks/tapbundle": "^3.0.7", "@pushrocks/tapbundle": "^3.2.9",
"@types/node": "^11.13.0", "@types/node": "^14.0.27",
"gulp-function": "^2.2.14", "gulp-function": "^2.2.14",
"tslint": "^5.15.0", "tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0" "tslint-config-prettier": "^1.18.0"
}, },
"files": [ "files": [
"ts/*", "ts/**/*",
"ts_web/*", "ts_web/**/*",
"dist/*", "dist/**/*",
"dist_web/*", "dist_*/**/*",
"assets/*", "dist_ts/**/*",
"dist_ts_web/**/*",
"assets/**/*",
"cli.js", "cli.js",
"npmextra.json", "npmextra.json",
"readme.md" "readme.md"
],
"browserslist": [
"last 1 chrome versions"
] ]
} }

51
readme.md Normal file
View File

@ -0,0 +1,51 @@
# @pushrocks/smartfile
smart ways to work with files in nodejs
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartfile)
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartfile)
* [github.com (source mirror)](https://github.com/pushrocks/smartfile)
* [docs (typedoc)](https://pushrocks.gitlab.io/smartfile/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/pushrocks/smartfile/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/pushrocks/smartfile/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@pushrocks/smartfile)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/pushrocks/smartfile)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@pushrocks/smartfile)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@pushrocks/smartfile)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@pushrocks/smartfile)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
smartfile is an approach of being one tool to handle files in diverse environments.
### Smartfile Sections
smartfile thinks in sections:
| section | description |
| ----------- | ---------------------------------------------------------------------------- |
| fs | (object) gets data from fs to somewhere |
| memory | gets data from memory to somewhere |
| remote | gets data from remote locations to somewhere |
| interpreter | (object) handles yaml and json |
| smartfile | (class) a virtual representation of a file, alternative to vinyl file format |
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -15,7 +15,7 @@ tap.test('.fs.fileExistsSync -> should return an accurate boolean', async () =>
tap.test('.fs.fileExists -> should resolve or reject a promise', async () => { tap.test('.fs.fileExists -> should resolve or reject a promise', async () => {
expect(smartfile.fs.fileExists('./test/testassets/mytest.json')).to.be.instanceof(Promise); expect(smartfile.fs.fileExists('./test/testassets/mytest.json')).to.be.instanceof(Promise);
await smartfile.fs.fileExists('./test/testassets/mytest.json'); await smartfile.fs.fileExists('./test/testassets/mytest.json');
await smartfile.fs.fileExists('./test/testassets/notthere.json').catch(err => { await smartfile.fs.fileExists('./test/testassets/notthere.json').catch((err) => {
return expect(err.message).to.equal( return expect(err.message).to.equal(
"ENOENT: no such file or directory, access './test/testassets/notthere.json'" "ENOENT: no such file or directory, access './test/testassets/notthere.json'"
); );
@ -28,7 +28,7 @@ tap.test('.fs.listFoldersSync() -> should get the file type from a string', asyn
}); });
tap.test('.fs.listFolders() -> should get the file type from a string', async () => { tap.test('.fs.listFolders() -> should get the file type from a string', async () => {
let folderArrayArg = await smartfile.fs.listFolders('./test/testassets/'); const folderArrayArg = await smartfile.fs.listFolders('./test/testassets/');
expect(folderArrayArg).to.include('testfolder'); expect(folderArrayArg).to.include('testfolder');
expect(folderArrayArg).to.not.include('notExistentFolder'); expect(folderArrayArg).to.not.include('notExistentFolder');
}); });
@ -36,24 +36,34 @@ tap.test('.fs.listFolders() -> should get the file type from a string', async ()
tap.test('.fs.listFilesSync() -> should get the file type from a string', async () => { tap.test('.fs.listFilesSync() -> should get the file type from a string', async () => {
expect(smartfile.fs.listFilesSync('./test/testassets/')).to.include('mytest.json'); expect(smartfile.fs.listFilesSync('./test/testassets/')).to.include('mytest.json');
expect(smartfile.fs.listFilesSync('./test/testassets/')).to.not.include('notExistentFile'); expect(smartfile.fs.listFilesSync('./test/testassets/')).to.not.include('notExistentFile');
expect(smartfile.fs.listFilesSync('./test/testassets/', /mytest\.json/)).to.include('mytest.json'); expect(smartfile.fs.listFilesSync('./test/testassets/', /mytest\.json/)).to.include(
expect(smartfile.fs.listFilesSync('./test/testassets/', /mytests.json/)).to.not.include('mytest.json'); 'mytest.json'
);
expect(smartfile.fs.listFilesSync('./test/testassets/', /mytests.json/)).to.not.include(
'mytest.json'
);
}); });
tap.test('.fs.listFiles() -> should get the file type from a string', async () => { tap.test('.fs.listFiles() -> should get the file type from a string', async () => {
let folderArrayArg = await smartfile.fs.listFiles('./test/testassets/'); const folderArrayArg = await smartfile.fs.listFiles('./test/testassets/');
expect(folderArrayArg).to.include('mytest.json'); expect(folderArrayArg).to.include('mytest.json');
expect(folderArrayArg).to.not.include('notExistentFile'); expect(folderArrayArg).to.not.include('notExistentFile');
}); });
tap.test('.fs.listFileTree() -> should get a file tree', async () => { tap.test('.fs.listFileTree() -> should get a file tree', async () => {
let folderArrayArg = await smartfile.fs.listFileTree(path.resolve('./test/testassets/'), '**/*.txt'); const folderArrayArg = await smartfile.fs.listFileTree(
path.resolve('./test/testassets/'),
'**/*.txt'
);
expect(folderArrayArg).to.include('testfolder/testfile1.txt'); expect(folderArrayArg).to.include('testfolder/testfile1.txt');
expect(folderArrayArg).to.not.include('mytest.json'); expect(folderArrayArg).to.not.include('mytest.json');
}); });
tap.test('.fs.fileTreeToObject -> should read a file tree into an Object', async () => { tap.test('.fs.fileTreeToObject -> should read a file tree into an Object', async () => {
let fileArrayArg = await smartfile.fs.fileTreeToObject(path.resolve('./test/testassets/'), '**/*.txt'); const fileArrayArg = await smartfile.fs.fileTreeToObject(
path.resolve('./test/testassets/'),
'**/*.txt'
);
expect(fileArrayArg[0]).to.be.instanceof(smartfile.Smartfile); expect(fileArrayArg[0]).to.be.instanceof(smartfile.Smartfile);
expect(fileArrayArg[0].contents.toString()).to.equal(fileArrayArg[0].contentBuffer.toString()); expect(fileArrayArg[0].contents.toString()).to.equal(fileArrayArg[0].contentBuffer.toString());
}); });
@ -67,7 +77,10 @@ tap.test('.fs.copy() -> should copy a file', async () => {
}); });
tap.test('.fs.copy() -> should copy a file and rename it', async () => { tap.test('.fs.copy() -> should copy a file and rename it', async () => {
await smartfile.fs.copy('./test/testassets/mytest.yaml', './test/testassets/temp/mytestRenamed.yaml'); await smartfile.fs.copy(
'./test/testassets/mytest.yaml',
'./test/testassets/temp/mytestRenamed.yaml'
);
}); });
tap.test('.fs.remove() -> should remove an entire directory', async () => {}); tap.test('.fs.remove() -> should remove an entire directory', async () => {});
@ -82,38 +95,45 @@ tap.test('.fs.removeSync -> should remove single files synchronouly', async () =
}); });
tap.test('.fs.removeMany -> should remove and array of files', async () => { tap.test('.fs.removeMany -> should remove and array of files', async () => {
smartfile.fs.removeMany(['./test/testassets/temp/testfile1.txt', './test/testassets/temp/testfile2.txt']).then(() => { smartfile.fs
expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile1.txt')).to.be.false; .removeMany(['./test/testassets/temp/testfile1.txt', './test/testassets/temp/testfile2.txt'])
expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile2.txt')).to.be.false; .then(() => {
}); expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile1.txt')).to.be.false;
expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile2.txt')).to.be.false;
});
}); });
tap.test('.fs.removeManySync -> should remove and array of single files synchronouly', async () => { tap.test('.fs.removeManySync -> should remove and array of single files synchronouly', async () => {
smartfile.fs.removeManySync(['./test/testassets/temp/testfile1.txt', './test/testassets/temp/testfile2.txt']); smartfile.fs.removeManySync([
'./test/testassets/temp/testfile1.txt',
'./test/testassets/temp/testfile2.txt',
]);
expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile1.txt')).to.be.false; expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile1.txt')).to.be.false;
expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile2.txt')).to.be.false; expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile2.txt')).to.be.false;
}); });
tap.test('.fs.toObjectSync() -> should read an ' + '.yaml' + ' file to an object', async () => { tap.test('.fs.toObjectSync() -> should read an ' + '.yaml' + ' file to an object', async () => {
let testData = smartfile.fs.toObjectSync('./test/testassets/mytest.yaml'); const testData = smartfile.fs.toObjectSync('./test/testassets/mytest.yaml');
expect(testData).to.include({ key1: 'this works' }); expect(testData).to.include({ key1: 'this works' });
expect(testData).to.include({ key2: 'this works too' }); expect(testData).to.include({ key2: 'this works too' });
}); });
tap.test( tap.test(
'.fs.toObjectSync() -> should state unknown file type for unknown file types', '.fs.toObjectSync() -> should state unknown file type for unknown file types',
async () => { async () => {
let testData = smartfile.fs.toObjectSync('./test/testassets/mytest.txt'); const testData = smartfile.fs.toObjectSync('./test/testassets/mytest.txt');
} }
); );
tap.test('.fs.toObjectSync() -> should read an ' + '.json' + ' file to an object', async () => { tap.test('.fs.toObjectSync() -> should read an ' + '.json' + ' file to an object', async () => {
let testData = smartfile.fs.toObjectSync('./test/testassets/mytest.json'); const testData = smartfile.fs.toObjectSync('./test/testassets/mytest.json');
expect(testData).to.include({ key1: 'this works' }); expect(testData).to.include({ key1: 'this works' });
expect(testData).to.include({ key2: 'this works too' }); expect(testData).to.include({ key2: 'this works too' });
}); });
tap.test('.fs.toStringSync() -> should read a file to a string', async () => { tap.test('.fs.toStringSync() -> should read a file to a string', async () => {
expect(smartfile.fs.toStringSync('./test/testassets/mytest.txt')).to.equal('Some TestString &&%$'); expect(smartfile.fs.toStringSync('./test/testassets/mytest.txt')).to.equal(
'Some TestString &&%$'
);
}); });
// --------------------------- // ---------------------------
@ -129,14 +149,17 @@ tap.test('.interpreter.filetype() -> should get the file type from a string', as
// --------------------------- // ---------------------------
tap.test('.memory.toFs() -> should write a file to disk and return a promise', async () => { tap.test('.memory.toFs() -> should write a file to disk and return a promise', async () => {
let localString = 'myString'; const localString = 'myString';
await smartfile.memory.toFs(localString, path.join(process.cwd(), './test/testassets/temp/testMemToFs.txt')); await smartfile.memory.toFs(
localString,
path.join(process.cwd(), './test/testassets/temp/testMemToFs.txt')
);
}); });
tap.test( tap.test(
'.memory.toFsSync() -> should write a file to disk and return true if successfull', '.memory.toFsSync() -> should write a file to disk and return true if successfull',
async () => { async () => {
let localString = 'myString'; const localString = 'myString';
smartfile.memory.toFsSync( smartfile.memory.toFsSync(
localString, localString,
path.join(process.cwd(), './test/testassets/temp/testMemToFsSync.txt') path.join(process.cwd(), './test/testassets/temp/testMemToFsSync.txt')
@ -151,8 +174,8 @@ tap.test('.remote.toString() -> should load a remote file to a variable', async
expect(responseString).to.equal('Some TestString &&%$'); expect(responseString).to.equal('Some TestString &&%$');
}); });
tap.test('.remote.toString() -> should reject a Promise when the link is false', async tools => { tap.test('.remote.toString() -> should reject a Promise when the link is false', async (tools) => {
await smartfile.remote.toString('https://push.rocks/doesnotexist.txt').catch(err => { await smartfile.remote.toString('https://push.rocks/doesnotexist.txt').catch((err) => {
return expect(err.message).to.equal( return expect(err.message).to.equal(
'could not get remote file from https://push.rocks/doesnotexist.txt' 'could not get remote file from https://push.rocks/doesnotexist.txt'
); );
@ -164,8 +187,11 @@ tap.test('.remote.toString() -> should reject a Promise when the link is false',
// --------------------------- // ---------------------------
tap.test('.Smartfile -> should produce vinyl compatible files', async () => { tap.test('.Smartfile -> should produce vinyl compatible files', async () => {
let smartfileArray = await smartfile.fs.fileTreeToObject(process.cwd(), './test/testassets/testfolder/**/*'); const smartfileArray = await smartfile.fs.fileTreeToObject(
let localSmartfile = smartfileArray[0]; process.cwd(),
'./test/testassets/testfolder/**/*'
);
const localSmartfile = smartfileArray[0];
expect(localSmartfile).to.be.instanceof(smartfile.Smartfile); expect(localSmartfile).to.be.instanceof(smartfile.Smartfile);
expect(localSmartfile.contents).to.be.instanceof(Buffer); expect(localSmartfile.contents).to.be.instanceof(Buffer);
// tslint:disable-next-line:no-unused-expression // tslint:disable-next-line:no-unused-expression
@ -177,12 +203,12 @@ tap.test('.Smartfile -> should produce vinyl compatible files', async () => {
}); });
tap.test('should output a smartfile array to disk', async () => { tap.test('should output a smartfile array to disk', async () => {
let smartfileArray = await smartfile.fs.fileTreeToObject('./test/testassets/testfolder/', '*'); const smartfileArray = await smartfile.fs.fileTreeToObject('./test/testassets/testfolder/', '*');
for (let smartfile of smartfileArray) { for (const smartfileInstance of smartfileArray) {
console.log(smartfile.relative); console.log(smartfileInstance.relative);
console.log(smartfile.path); console.log(smartfileInstance.path);
console.log(smartfile.base); console.log(smartfileInstance.base);
console.log(smartfile.parsedPath); console.log(smartfileInstance.parsedPath);
} }
await smartfile.memory.smartfileArrayToFs( await smartfile.memory.smartfileArrayToFs(
smartfileArray, smartfileArray,
@ -190,4 +216,14 @@ tap.test('should output a smartfile array to disk', async () => {
); );
}); });
tap.test('should create, store and retrieve valid smartfiles', async () => {
const fileString = 'hi there';
const filePath = './test/testassets/utf8.txt';
const smartfileInstance = await smartfile.Smartfile.fromString(filePath, fileString, 'utf8');
smartfileInstance.write();
const smartfileInstance2 = await smartfile.Smartfile.fromFilePath(filePath);
const retrievedString = smartfileInstance.contents.toString();
expect(retrievedString).to.equal(fileString);
});
tap.start(); tap.start();

1
test/testassets/utf8.txt Normal file
View File

@ -0,0 +1 @@
hi there

View File

@ -4,7 +4,6 @@ import * as memory from './smartfile.memory';
export interface ISmartfileConstructorOptions { export interface ISmartfileConstructorOptions {
path?: string; path?: string;
contentString?: string;
contentBuffer?: Buffer; contentBuffer?: Buffer;
base?: string; base?: string;
} }
@ -24,42 +23,64 @@ export class Smartfile {
*/ */
public static async fromFilePath(filePath: string) { public static async fromFilePath(filePath: string) {
filePath = plugins.path.resolve(filePath); filePath = plugins.path.resolve(filePath);
const fileString = fs.toStringSync(filePath); const fileBuffer = fs.toBufferSync(filePath);
const smartfile = new Smartfile({ const smartfile = new Smartfile({
path: filePath, path: filePath,
contentString: fileString contentBuffer: fileBuffer,
}); });
return smartfile; return smartfile;
} }
public static async fromBuffer(filePath: string, contentBufferArg: Buffer) {
const smartfile = new Smartfile({
contentBuffer: contentBufferArg,
path: filePath,
});
return smartfile;
}
public static async fromString(
filePath: string,
contentStringArg: string,
encodingArg: 'utf8' | 'binary'
) {
const smartfile = new Smartfile({
contentBuffer: Buffer.from(contentStringArg, encodingArg),
path: filePath,
});
return smartfile;
}
// ======== // ========
// INSTANCE // INSTANCE
// ======== // ========
/** /**
* the full path of the file on disk * the full path of the file on disk
*/ */
path: string; public path: string;
/** /**
* *
*/ */
parsedPath: plugins.path.ParsedPath; public parsedPath: plugins.path.ParsedPath;
/** /**
* the content of the file as Buffer * the content of the file as Buffer
*/ */
contentBuffer: Buffer; public contentBuffer: Buffer;
/** /**
* The current working directory of the file * The current working directory of the file
* Note:this is similar to gulp and different from native node path base * Note:this is similar to gulp and different from native node path base
*/ */
base: string; public base: string;
/** /**
* sync the file with disk * sync the file with disk
*/ */
sync: boolean; public sync: boolean;
/** /**
* the constructor of Smartfile * the constructor of Smartfile
@ -69,8 +90,6 @@ export class Smartfile {
constructor(optionsArg: ISmartfileConstructorOptions) { constructor(optionsArg: ISmartfileConstructorOptions) {
if (optionsArg.contentBuffer) { if (optionsArg.contentBuffer) {
this.contentBuffer = optionsArg.contentBuffer; this.contentBuffer = optionsArg.contentBuffer;
} else if (optionsArg.contentString) {
this.setContentsFromString(optionsArg.contentString);
} else { } else {
console.log('created empty Smartfile?'); console.log('created empty Smartfile?');
} }
@ -83,8 +102,8 @@ export class Smartfile {
* set contents from string * set contents from string
* @param contentString * @param contentString
*/ */
setContentsFromString(contentString: string) { public setContentsFromString(contentString: string, encodingArg: 'utf8' | 'binary' = 'utf8') {
this.contents = new Buffer(contentString); this.contents = new Buffer(contentString, encodingArg);
} }
/** /**
@ -92,7 +111,7 @@ export class Smartfile {
* Behaviours: * Behaviours:
* - no argument write to exactly where the file was picked up * - no argument write to exactly where the file was picked up
*/ */
async write(pathArg?: string) { public async write(pathArg?: string) {
const stringToWrite = this.contentBuffer.toString(); const stringToWrite = this.contentBuffer.toString();
await memory.toFs(stringToWrite, this.path); await memory.toFs(stringToWrite, this.path);
} }
@ -100,7 +119,7 @@ export class Smartfile {
/** /**
* read file from disk * read file from disk
*/ */
async read() {} public async read() {}
// ----------------------------------------------- // -----------------------------------------------
// vinyl compatibility // vinyl compatibility
@ -118,21 +137,21 @@ export class Smartfile {
/** /**
* vinyl-compatibility * vinyl-compatibility
*/ */
get cwd() { public get cwd() {
return process.cwd(); return process.cwd();
} }
/** /**
* return relative path of file * return relative path of file
*/ */
get relative(): string { public get relative(): string {
return plugins.path.relative(this.base, this.path); return plugins.path.relative(this.base, this.path);
} }
/** /**
* return truw when the file has content * return truw when the file has content
*/ */
isNull(): boolean { public isNull(): boolean {
if (!this.contentBuffer) { if (!this.contentBuffer) {
return true; return true;
} }
@ -142,28 +161,28 @@ export class Smartfile {
/** /**
* return true if contents are Buffer * return true if contents are Buffer
*/ */
isBuffer(): boolean { public isBuffer(): boolean {
if (this.contents instanceof Buffer) { if (this.contents instanceof Buffer) {
return true; return true;
} }
return false; return false;
} }
isDirectory() { public isDirectory() {
return false; return false;
} }
isStream() { public isStream() {
return false; return false;
} }
isSymbolic() { public isSymbolic() {
return false; return false;
} }
// update things // update things
updateFileName(fileNameArg: string) { public updateFileName(fileNameArg: string) {
let oldFileName = this.parsedPath.base; const oldFileName = this.parsedPath.base;
this.path = this.path.replace(new RegExp(oldFileName + '$'), fileNameArg); this.path = this.path.replace(new RegExp(oldFileName + '$'), fileNameArg);
} }
} }

View File

@ -29,9 +29,9 @@ export const fileExistsSync = (filePath): boolean => {
* @param filePath * @param filePath
* @returns {any} * @returns {any}
*/ */
export let fileExists = async (filePath): Promise<boolean> => { export const fileExists = async (filePath): Promise<boolean> => {
const done = plugins.smartpromise.defer<boolean>(); const done = plugins.smartpromise.defer<boolean>();
plugins.fs.access(filePath, 4, err => { plugins.fs.access(filePath, 4, (err) => {
err ? done.resolve(false) : done.resolve(true); err ? done.resolve(false) : done.resolve(true);
}); });
return done.promise; return done.promise;
@ -84,16 +84,14 @@ export const copySync = (fromArg: string, toArg: string): boolean => {
/** /**
* ensures that a directory is in place * ensures that a directory is in place
*/ */
export let ensureDir = (dirPathArg: string) => { export const ensureDir = async (dirPathArg: string) => {
let done = plugins.smartpromise.defer(); await plugins.fsExtra.ensureDir(dirPathArg);
plugins.fsExtra.ensureDir(dirPathArg, done.resolve);
return done.promise;
}; };
/** /**
* ensures that a directory is in place * ensures that a directory is in place
*/ */
export let ensureDirSync = (dirPathArg: string) => { export const ensureDirSync = (dirPathArg: string) => {
plugins.fsExtra.ensureDirSync(dirPathArg); plugins.fsExtra.ensureDirSync(dirPathArg);
}; };
@ -101,19 +99,16 @@ export let ensureDirSync = (dirPathArg: string) => {
* ensure an empty directory * ensure an empty directory
* @executes ASYNC * @executes ASYNC
*/ */
export let ensureEmptyDir = (dirPathArg: string) => { export const ensureEmptyDir = async (dirPathArg: string) => {
let done = plugins.smartpromise.defer(); await plugins.fsExtra.ensureDir(dirPathArg);
plugins.fsExtra.ensureDir(dirPathArg, () => { await plugins.fsExtra.emptyDir(dirPathArg);
plugins.fsExtra.emptyDir(dirPathArg, done.resolve);
});
return done.promise;
}; };
/** /**
* ensure an empty directory * ensure an empty directory
* @executes SYNC * @executes SYNC
*/ */
export let ensureEmptyDirSync = (dirPathArg: string) => { export const ensureEmptyDirSync = (dirPathArg: string) => {
plugins.fsExtra.ensureDirSync(dirPathArg); plugins.fsExtra.ensureDirSync(dirPathArg);
plugins.fsExtra.emptyDirSync(dirPathArg); plugins.fsExtra.emptyDirSync(dirPathArg);
}; };
@ -125,11 +120,8 @@ export let ensureEmptyDirSync = (dirPathArg: string) => {
* @returns Promise<void> * @returns Promise<void>
* @exec ASYNC * @exec ASYNC
*/ */
export let ensureFile = (filePathArg, initFileStringArg): Promise<void> => { export const ensureFile = async (filePathArg, initFileStringArg): Promise<void> => {
let done = plugins.smartpromise.defer<void>();
ensureFileSync(filePathArg, initFileStringArg); ensureFileSync(filePathArg, initFileStringArg);
done.resolve();
return done.promise;
}; };
/** /**
@ -139,7 +131,7 @@ export let ensureFile = (filePathArg, initFileStringArg): Promise<void> => {
* @returns Promise<void> * @returns Promise<void>
* @exec SYNC * @exec SYNC
*/ */
export let ensureFileSync = (filePathArg: string, initFileStringArg: string): void => { export const ensureFileSync = (filePathArg: string, initFileStringArg: string): void => {
if (fileExistsSync(filePathArg)) { if (fileExistsSync(filePathArg)) {
return null; return null;
} else { } else {
@ -150,38 +142,33 @@ export let ensureFileSync = (filePathArg: string, initFileStringArg: string): vo
/** /**
* removes a file or folder from local disk * removes a file or folder from local disk
*/ */
export let remove = function(pathArg: string): Promise<void> { export const remove = async (pathArg: string): Promise<void> => {
let done = plugins.smartpromise.defer<void>(); await plugins.fsExtra.remove(pathArg);
plugins.fsExtra.remove(pathArg, function() {
done.resolve();
});
return done.promise;
}; };
/** /**
* removes a file SYNCHRONOUSLY from local disk * removes a file SYNCHRONOUSLY from local disk
*/ */
export let removeSync = function(pathArg: string): boolean { export const removeSync = (pathArg: string): void => {
plugins.fsExtra.removeSync(pathArg); plugins.fsExtra.removeSync(pathArg);
return true;
}; };
/** /**
* removes an array of filePaths from disk * removes an array of filePaths from disk
*/ */
export let removeMany = function(filePathArrayArg: string[]) { export const removeMany = async (filePathArrayArg: string[]) => {
let promiseArray: Promise<void>[] = []; const promiseArray: Array<Promise<void>> = [];
for (let filePath of filePathArrayArg) { for (const filePath of filePathArrayArg) {
promiseArray.push(remove(filePath)); promiseArray.push(remove(filePath));
} }
return Promise.all(promiseArray); await Promise.all(promiseArray);
}; };
/** /**
* like removeFilePathArray but SYNCHRONOUSLY * like removeFilePathArray but SYNCHRONOUSLY
*/ */
export let removeManySync = function(filePathArrayArg: string[]): void { export const removeManySync = (filePathArrayArg: string[]): void => {
for (let filePath of filePathArrayArg) { for (const filePath of filePathArrayArg) {
removeSync(filePath); removeSync(filePath);
} }
}; };
@ -196,7 +183,7 @@ export let removeManySync = function(filePathArrayArg: string[]): void {
* @param fileTypeArg * @param fileTypeArg
* @returns {any} * @returns {any}
*/ */
export let toObjectSync = function(filePathArg, fileTypeArg?) { export const toObjectSync = (filePathArg, fileTypeArg?) => {
const fileString = plugins.fsExtra.readFileSync(filePathArg, 'utf8'); const fileString = plugins.fsExtra.readFileSync(filePathArg, 'utf8');
let fileType; let fileType;
fileTypeArg ? (fileType = fileTypeArg) : (fileType = SmartfileInterpreter.filetype(filePathArg)); fileTypeArg ? (fileType = fileTypeArg) : (fileType = SmartfileInterpreter.filetype(filePathArg));
@ -205,14 +192,32 @@ export let toObjectSync = function(filePathArg, fileTypeArg?) {
/** /**
* reads a file content to a String * reads a file content to a String
* @param filePath
* @returns {string|Buffer|any}
*/ */
export const toStringSync = (filePath: string): string => { export const toStringSync = (filePath: string): string => {
const fileString: string = plugins.fsExtra.readFileSync(filePath, 'utf8'); const encoding = plugins.smartmime.getEncoding(filePath);
const fileString: string = plugins.fsExtra.readFileSync(filePath, encoding);
return fileString; return fileString;
}; };
export const toBufferSync = (filePath: string): Buffer => {
return plugins.fsExtra.readFileSync(filePath);
};
export const fileTreeToHash = async (dirPathArg: string, miniMatchFilter: string) => {
const fileTreeObject = await fileTreeToObject(dirPathArg, miniMatchFilter);
let combinedString = '';
for (const smartfile of fileTreeObject) {
combinedString += smartfile.contentBuffer.toString();
}
const hash = await plugins.smarthash.sha256FromString(combinedString);
return hash;
};
/**
* creates a smartfile array from a directory
* @param dirPathArg the directory to start from
* @param miniMatchFilter a minimatch filter of what files to include
*/
export const fileTreeToObject = async (dirPathArg: string, miniMatchFilter: string) => { export const fileTreeToObject = async (dirPathArg: string, miniMatchFilter: string) => {
// handle absolute miniMatchFilter // handle absolute miniMatchFilter
let dirPath: string; let dirPath: string;
@ -224,43 +229,33 @@ export const fileTreeToObject = async (dirPathArg: string, miniMatchFilter: stri
const fileTree = await listFileTree(dirPath, miniMatchFilter); const fileTree = await listFileTree(dirPath, miniMatchFilter);
const smartfileArray: Smartfile[] = []; const smartfileArray: Smartfile[] = [];
for (let filePath of fileTree) { for (const filePath of fileTree) {
let readPath = ((): string => { const readPath = ((): string => {
if (!plugins.path.isAbsolute(filePath)) { if (!plugins.path.isAbsolute(filePath)) {
return plugins.path.join(dirPath, filePath); return plugins.path.join(dirPath, filePath);
} else { } else {
return filePath; return filePath;
} }
})(); })();
let fileContentString = toStringSync(readPath); const fileContentString = toStringSync(readPath);
// push a read file as Smartfile // push a read file as Smartfile
smartfileArray.push( smartfileArray.push(
new Smartfile({ new Smartfile({
contentBuffer: Buffer.from(fileContentString), contentBuffer: Buffer.from(fileContentString),
base: dirPath, base: dirPath,
path: filePath path: filePath,
}) })
); );
} }
return smartfileArray; return smartfileArray;
}; };
/**
*
* @param filePathArg
* @param options
* @returns {number}
*/
export let toVinylSync = function(filePathArg, options = {}) {
return plugins.vinylFile.readSync(filePathArg, options);
};
/** /**
* lists Folders in a directory on local disk * lists Folders in a directory on local disk
* @returns Promise with an array that contains the folder names * @returns Promise with an array that contains the folder names
*/ */
export let listFolders = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => { export const listFolders = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => {
return listFoldersSync(pathArg, regexFilter); return listFoldersSync(pathArg, regexFilter);
}; };
@ -268,12 +263,12 @@ export let listFolders = async (pathArg: string, regexFilter?: RegExp): Promise<
* lists Folders SYNCHRONOUSLY in a directory on local disk * lists Folders SYNCHRONOUSLY in a directory on local disk
* @returns an array with the folder names as strings * @returns an array with the folder names as strings
*/ */
export let listFoldersSync = (pathArg: string, regexFilter?: RegExp): string[] => { export const listFoldersSync = (pathArg: string, regexFilter?: RegExp): string[] => {
let folderArray = plugins.fsExtra.readdirSync(pathArg).filter(file => { let folderArray = plugins.fsExtra.readdirSync(pathArg).filter((file) => {
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isDirectory(); return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isDirectory();
}); });
if (regexFilter) { if (regexFilter) {
folderArray = folderArray.filter(fileItem => { folderArray = folderArray.filter((fileItem) => {
return regexFilter.test(fileItem); return regexFilter.test(fileItem);
}); });
} }
@ -284,7 +279,7 @@ export let listFoldersSync = (pathArg: string, regexFilter?: RegExp): string[] =
* lists Files in a directory on local disk * lists Files in a directory on local disk
* @returns Promise * @returns Promise
*/ */
export let listFiles = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => { export const listFiles = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => {
return listFilesSync(pathArg, regexFilter); return listFilesSync(pathArg, regexFilter);
}; };
@ -292,12 +287,12 @@ export let listFiles = async (pathArg: string, regexFilter?: RegExp): Promise<st
* lists Files SYNCHRONOUSLY in a directory on local disk * lists Files SYNCHRONOUSLY in a directory on local disk
* @returns an array with the folder names as strings * @returns an array with the folder names as strings
*/ */
export let listFilesSync = (pathArg: string, regexFilter?: RegExp): string[] => { export const listFilesSync = (pathArg: string, regexFilter?: RegExp): string[] => {
let fileArray = plugins.fsExtra.readdirSync(pathArg).filter(file => { let fileArray = plugins.fsExtra.readdirSync(pathArg).filter((file) => {
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile(); return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
}); });
if (regexFilter) { if (regexFilter) {
fileArray = fileArray.filter(fileItem => { fileArray = fileArray.filter((fileItem) => {
return regexFilter.test(fileItem); return regexFilter.test(fileItem);
}); });
} }
@ -308,7 +303,7 @@ export let listFilesSync = (pathArg: string, regexFilter?: RegExp): string[] =>
* lists all items (folders AND files) in a directory on local disk * lists all items (folders AND files) in a directory on local disk
* @returns Promise<string[]> * @returns Promise<string[]>
*/ */
export let listAllItems = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => { export const listAllItems = async (pathArg: string, regexFilter?: RegExp): Promise<string[]> => {
return listAllItemsSync(pathArg, regexFilter); return listAllItemsSync(pathArg, regexFilter);
}; };
@ -317,12 +312,12 @@ export let listAllItems = async (pathArg: string, regexFilter?: RegExp): Promise
* @returns an array with the folder names as strings * @returns an array with the folder names as strings
* @executes SYNC * @executes SYNC
*/ */
export let listAllItemsSync = (pathArg: string, regexFilter?: RegExp): string[] => { export const listAllItemsSync = (pathArg: string, regexFilter?: RegExp): string[] => {
let allItmesArray = plugins.fsExtra.readdirSync(pathArg).filter(function(file) { let allItmesArray = plugins.fsExtra.readdirSync(pathArg).filter((file) => {
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile(); return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
}); });
if (regexFilter) { if (regexFilter) {
allItmesArray = allItmesArray.filter(fileItem => { allItmesArray = allItmesArray.filter((fileItem) => {
return regexFilter.test(fileItem); return regexFilter.test(fileItem);
}); });
} }
@ -334,7 +329,11 @@ export let listAllItemsSync = (pathArg: string, regexFilter?: RegExp): string[]
* note: if the miniMatch Filter is an absolute path, the cwdArg will be omitted * note: if the miniMatch Filter is an absolute path, the cwdArg will be omitted
* @returns Promise<string[]> string array with the absolute paths of all matching files * @returns Promise<string[]> string array with the absolute paths of all matching files
*/ */
export const listFileTree = async (dirPathArg: string, miniMatchFilter: string, absolutePathsBool: boolean = false): Promise<string[]> => { export const listFileTree = async (
dirPathArg: string,
miniMatchFilter: string,
absolutePathsBool: boolean = false
): Promise<string[]> => {
const done = plugins.smartpromise.defer<string[]>(); const done = plugins.smartpromise.defer<string[]>();
// handle absolute miniMatchFilter // handle absolute miniMatchFilter
@ -348,7 +347,7 @@ export const listFileTree = async (dirPathArg: string, miniMatchFilter: string,
const options = { const options = {
cwd: dirPath, cwd: dirPath,
nodir: true, nodir: true,
dot: true dot: true,
}; };
plugins.glob(miniMatchFilter, options, (err, files: string[]) => { plugins.glob(miniMatchFilter, options, (err, files: string[]) => {
if (err) { if (err) {
@ -357,10 +356,10 @@ export const listFileTree = async (dirPathArg: string, miniMatchFilter: string,
} }
done.resolve(files); done.resolve(files);
}); });
let fileList = await done.promise; let fileList = await done.promise;
if (absolutePathsBool) { if (absolutePathsBool) {
fileList = fileList.map(filePath => { fileList = fileList.map((filePath) => {
return plugins.path.resolve(plugins.path.join(dirPath, filePath)); return plugins.path.resolve(plugins.path.join(dirPath, filePath));
}); });
} }

View File

@ -1,8 +1,8 @@
import plugins = require('./smartfile.plugins'); import plugins = require('./smartfile.plugins');
export let filetype = (pathArg: string): string => { export let filetype = (pathArg: string): string => {
let extName = plugins.path.extname(pathArg); const extName = plugins.path.extname(pathArg);
let fileType = extName.replace(/\.([a-z]*)/, '$1'); // remove . form fileType const fileType = extName.replace(/\.([a-z]*)/, '$1'); // remove . form fileType
return fileType; return fileType;
}; };

View File

@ -10,7 +10,7 @@ import SmartfileInterpreter = require('./smartfile.interpreter');
* @param fileTypeArg * @param fileTypeArg
* @returns {any|any} * @returns {any|any}
*/ */
export let toObject = function(fileStringArg: string, fileTypeArg: string) { export let toObject = function (fileStringArg: string, fileTypeArg: string) {
return SmartfileInterpreter.objectFile(fileStringArg, fileTypeArg); return SmartfileInterpreter.objectFile(fileStringArg, fileTypeArg);
}; };
@ -25,11 +25,11 @@ export interface IToFsOptions {
* @param fileBaseArg * @param fileBaseArg
*/ */
export let toFs = async ( export let toFs = async (
fileContentArg: string | Smartfile, fileContentArg: string | Buffer | Smartfile,
filePathArg, filePathArg: string,
optionsArg: IToFsOptions = {} optionsArg: IToFsOptions = {}
) => { ) => {
let done = plugins.smartpromise.defer(); const done = plugins.smartpromise.defer();
// check args // check args
if (!fileContentArg || !filePathArg) { if (!fileContentArg || !filePathArg) {
@ -37,24 +37,27 @@ export let toFs = async (
} }
// prepare actual write action // prepare actual write action
let fileString: string; let fileContent: string | Buffer;
let fileEncoding: 'utf8' | 'binary' = 'utf8';
let filePath: string = filePathArg; let filePath: string = filePathArg;
// handle Smartfile // handle Smartfile
if (fileContentArg instanceof Smartfile) { if (fileContentArg instanceof Smartfile) {
let fileContentArg2: any = fileContentArg; fileContent = fileContentArg.contentBuffer;
fileString = fileContentArg.contentBuffer.toString();
// handle options // handle options
if (optionsArg.respectRelative) { if (optionsArg.respectRelative) {
filePath = plugins.path.join(filePath, fileContentArg.path); filePath = plugins.path.join(filePath, fileContentArg.path);
} }
} else if (Buffer.isBuffer(fileContentArg)) {
fileContent = fileContentArg;
fileEncoding = 'binary';
} else if (typeof fileContentArg === 'string') { } else if (typeof fileContentArg === 'string') {
fileString = fileContentArg; fileContent = fileContentArg;
} else { } else {
throw new Error('fileContent is neither string nor Smartfile'); throw new Error('fileContent is neither string nor Smartfile');
} }
await smartfileFs.ensureDir(plugins.path.parse(filePath).dir); await smartfileFs.ensureDir(plugins.path.parse(filePath).dir);
plugins.fsExtra.writeFile(filePath, fileString, { encoding: 'utf8' }, done.resolve); plugins.fsExtra.writeFile(filePath, fileContent, { encoding: fileEncoding }, done.resolve);
return await done.promise; return await done.promise;
}; };
@ -63,7 +66,7 @@ export let toFs = async (
* @param fileArg * @param fileArg
* @param filePathArg * @param filePathArg
*/ */
export let toFsSync = function(fileArg: string, filePathArg: string) { export const toFsSync = (fileArg: string, filePathArg: string) => {
// function checks to abort if needed // function checks to abort if needed
if (!fileArg || !filePathArg) { if (!fileArg || !filePathArg) {
throw new Error('expected a valid arguments'); throw new Error('expected a valid arguments');
@ -71,7 +74,7 @@ export let toFsSync = function(fileArg: string, filePathArg: string) {
// prepare actual write action // prepare actual write action
let fileString: string; let fileString: string;
let filePath: string = filePathArg; const filePath: string = filePathArg;
if (typeof fileArg !== 'string') { if (typeof fileArg !== 'string') {
throw new Error('fileArg is not of type String.'); throw new Error('fileArg is not of type String.');
@ -83,9 +86,9 @@ export let toFsSync = function(fileArg: string, filePathArg: string) {
export let smartfileArrayToFs = async (smartfileArrayArg: Smartfile[], dirArg: string) => { export let smartfileArrayToFs = async (smartfileArrayArg: Smartfile[], dirArg: string) => {
await smartfileFs.ensureDir(dirArg); await smartfileFs.ensureDir(dirArg);
for (let smartfile of smartfileArrayArg) { for (const smartfile of smartfileArrayArg) {
await toFs(smartfile, dirArg, { await toFs(smartfile, dirArg, {
respectRelative: true respectRelative: true,
}); });
} }
}; };

View File

@ -1,9 +1,21 @@
export import fs = require('fs'); // node native scope
export import fsExtra = require('fs-extra'); import * as fs from 'fs';
export let glob = require('glob'); import * as path from 'path';
export import path = require('path');
export import smartpromise = require('@pushrocks/smartpromise'); export { fs, path };
export import smartrequest = require('@pushrocks/smartrequest');
export import smartpath = require('@pushrocks/smartpath'); // @pushrocks scope
export let vinylFile = require('vinyl-file'); import * as smarthash from '@pushrocks/smarthash';
export let yaml = require('js-yaml'); import * as smartmime from '@pushrocks/smartmime';
import * as smartpath from '@pushrocks/smartpath';
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartrequest from '@pushrocks/smartrequest';
export { smarthash, smartmime, smartpath, smartpromise, smartrequest };
// third party scope
import * as fsExtra from 'fs-extra';
import glob from 'glob';
import yaml from 'js-yaml';
export { fsExtra, glob, yaml };

View File

@ -15,11 +15,11 @@ import SmartfileInterpreter = require('./smartfile.interpreter');
* @param fromArg * @param fromArg
* @returns {any} * @returns {any}
*/ */
export let toObject = function(fromArg: string) { export let toObject = (fromArg: string) => {
let done = plugins.smartpromise.defer(); const done = plugins.smartpromise.defer();
plugins.smartrequest plugins.smartrequest
.request(fromArg, { .request(fromArg, {
method: 'get' method: 'get',
}) })
.then((res: any) => { .then((res: any) => {
if (res.statusCode === 200) { if (res.statusCode === 200) {
@ -37,11 +37,12 @@ export let toObject = function(fromArg: string) {
* @param fromArg * @param fromArg
* @returns {any} * @returns {any}
*/ */
export let toString = (fromArg: string) => { export let toString = (fromArg: string): Promise<string> => {
let done = plugins.smartpromise.defer(); const done = plugins.smartpromise.defer<string>();
plugins.smartrequest.getBinary(fromArg).then((res: any) => { plugins.smartrequest.getBinary(fromArg).then((res: any) => {
if (res.statusCode === 200) { if (res.statusCode === 200) {
done.resolve(res.body); const encoding = plugins.smartmime.getEncoding(fromArg);
done.resolve(res.body.toString(encoding));
} else { } else {
done.reject(new Error('could not get remote file from ' + fromArg)); done.reject(new Error('could not get remote file from ' + fromArg));
} }