Compare commits
48 Commits
Author | SHA1 | Date | |
---|---|---|---|
b32c06aef2 | |||
27f60f6719 | |||
b2482ab8a5 | |||
9c614bd2f3 | |||
b12de7aed4 | |||
d6eb54d21c | |||
6646f173c6 | |||
f20657ff71 | |||
7f3f2da702 | |||
1e60ab375b | |||
98fa607c43 | |||
12b1672e58 | |||
9fca2c3aa4 | |||
5b7d822cfc | |||
ce57478e39 | |||
292c2699ea | |||
afb7fa8e89 | |||
e2c3005a08 | |||
53e595a023 | |||
93702dca78 | |||
0a95ae6284 | |||
de09f85c34 | |||
b9fefc7c95 | |||
76eae15f7d | |||
2e457f6011 | |||
e83c63fd2a | |||
c01006e365 | |||
a7adec8275 | |||
2eddbf5751 | |||
eca3e141d2 | |||
701b77eff5 | |||
e3c46cdd2c | |||
7204607c8a | |||
039c6f7fc6 | |||
b42595fccc | |||
2d9a65d11c | |||
b3ce66167e | |||
c7f800fc88 | |||
d8f4b011b7 | |||
b4add67f37 | |||
f86f053bd5 | |||
a78ca67b43 | |||
b1bedd0f54 | |||
ec58f7ac55 | |||
80743576ad | |||
32a6db645d | |||
45dfa16ab7 | |||
4fc4cda786 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,8 +15,6 @@ node_modules/
|
||||
|
||||
# builds
|
||||
dist/
|
||||
dist_web/
|
||||
dist_serve/
|
||||
dist_ts_web/
|
||||
dist_*/
|
||||
|
||||
# custom
|
102
.gitlab-ci.yml
102
.gitlab-ci.yml
@ -3,14 +3,14 @@ image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .npmci_cache/
|
||||
key: "$CI_BUILD_STAGE"
|
||||
- .npmci_cache/
|
||||
key: '$CI_BUILD_STAGE'
|
||||
|
||||
stages:
|
||||
- security
|
||||
- test
|
||||
- release
|
||||
- metadata
|
||||
- security
|
||||
- test
|
||||
- release
|
||||
- metadata
|
||||
|
||||
# ====================
|
||||
# security stage
|
||||
@ -18,48 +18,74 @@ stages:
|
||||
mirror:
|
||||
stage: security
|
||||
script:
|
||||
- npmci git mirror
|
||||
- npmci git mirror
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
snyk:
|
||||
auditProductionDependencies:
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
stage: security
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci command npm install -g snyk
|
||||
- npmci command npm install --ignore-scripts
|
||||
- npmci command snyk test
|
||||
- npmci command npm install --production --ignore-scripts
|
||||
- npmci command npm config set registry https://registry.npmjs.org
|
||||
- npmci command npm audit --audit-level=high --only=prod --production
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- docker
|
||||
|
||||
auditDevDependencies:
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
stage: security
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci command npm install --ignore-scripts
|
||||
- npmci command npm config set registry https://registry.npmjs.org
|
||||
- npmci command npm audit --audit-level=high --only=dev
|
||||
tags:
|
||||
- docker
|
||||
allow_failure: true
|
||||
|
||||
# ====================
|
||||
# test stage
|
||||
# ====================
|
||||
|
||||
testLTS:
|
||||
testStable:
|
||||
stage: test
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install lts
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
- npmci npm prepare
|
||||
- npmci node install stable
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- docker
|
||||
|
||||
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:
|
||||
stage: release
|
||||
script:
|
||||
- npmci node install lts
|
||||
- npmci npm publish
|
||||
- npmci node install stable
|
||||
- npmci npm publish
|
||||
only:
|
||||
- tags
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
# ====================
|
||||
# metadata stage
|
||||
@ -67,33 +93,39 @@ release:
|
||||
codequality:
|
||||
stage: metadata
|
||||
allow_failure: true
|
||||
only:
|
||||
- tags
|
||||
script:
|
||||
- npmci command npm install -g tslint typescript
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
||||
tags:
|
||||
- docker
|
||||
- priv
|
||||
- lossless
|
||||
- docker
|
||||
- priv
|
||||
|
||||
trigger:
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci trigger
|
||||
- npmci trigger
|
||||
only:
|
||||
- tags
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
pages:
|
||||
image: hosttoday/ht-docker-node:npmci
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci node install lts
|
||||
- npmci command npm install -g @gitzone/tsdoc
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command tsdoc
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
only:
|
||||
@ -101,5 +133,5 @@ pages:
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- public
|
||||
- public
|
||||
allow_failure: true
|
||||
|
29
.vscode/launch.json
vendored
Normal file
29
.vscode/launch.json
vendored
Normal 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
26
.vscode/settings.json
vendored
Normal 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"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
40
README.md
40
README.md
@ -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
|
||||
[](https://gitlab.com/pushrocks/smartfile/commits/master)
|
||||
[](https://gitlab.com/pushrocks/smartfile/commits/master)
|
||||
[](https://www.npmjs.com/package/@pushrocks/smartfile)
|
||||
[](https://snyk.io/test/npm/@pushrocks/smartfile)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](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)
|
||||
|
||||
[](https://maintainedby.lossless.com)
|
@ -9,6 +9,7 @@
|
||||
"npmAccessLevel": "public"
|
||||
},
|
||||
"gitzone": {
|
||||
"projectType": "npm",
|
||||
"module": {
|
||||
"githost": "gitlab.com",
|
||||
"gitscope": "pushrocks",
|
||||
|
26866
package-lock.json
generated
26866
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
64
package.json
64
package.json
@ -1,17 +1,13 @@
|
||||
{
|
||||
"name": "@pushrocks/smartfile",
|
||||
"private": false,
|
||||
"version": "7.0.4",
|
||||
"version": "9.0.3",
|
||||
"description": "offers smart ways to work with files in nodejs",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"main": "dist_ts/index.js",
|
||||
"typings": "dist_ts/index.d.ts",
|
||||
"scripts": {
|
||||
"test": "(tstest test/)",
|
||||
"reinstall": "(rm -r node_modules && npm install)",
|
||||
"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)"
|
||||
"build": "(tsbuild --web)"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -21,41 +17,51 @@
|
||||
"filesystem",
|
||||
"json"
|
||||
],
|
||||
"author": "Smart Coordination GmbH <office@push.rocks> (https://push.rocks)",
|
||||
"author": "Lossless GmbH <hello@lossless.com> (https://lossless.com)",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://gitlab.com/pushrocks/smartfile/issues"
|
||||
},
|
||||
"homepage": "https://gitlab.com/pushrocks/smartfile",
|
||||
"dependencies": {
|
||||
"@pushrocks/smartpath": "^4.0.1",
|
||||
"@pushrocks/smartpromise": "^3.0.2",
|
||||
"@pushrocks/smartrequest": "^1.1.14",
|
||||
"@types/fs-extra": "^5.0.5",
|
||||
"@types/vinyl": "^2.0.2",
|
||||
"fs-extra": "^7.0.1",
|
||||
"glob": "^7.1.3",
|
||||
"js-yaml": "^3.13.1",
|
||||
"vinyl-file": "^3.0.0"
|
||||
"@pushrocks/lik": "^5.0.0",
|
||||
"@pushrocks/smartfile-interfaces": "^1.0.7",
|
||||
"@pushrocks/smarthash": "^2.1.10",
|
||||
"@pushrocks/smartjson": "^4.0.6",
|
||||
"@pushrocks/smartmime": "^1.0.5",
|
||||
"@pushrocks/smartpath": "^4.0.3",
|
||||
"@pushrocks/smartpromise": "^3.1.6",
|
||||
"@pushrocks/smartrequest": "^1.1.52",
|
||||
"@types/fs-extra": "^9.0.13",
|
||||
"@types/glob": "^7.2.0",
|
||||
"@types/js-yaml": "^4.0.5",
|
||||
"fs-extra": "^10.0.0",
|
||||
"glob": "^7.2.0",
|
||||
"js-yaml": "^4.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@gitzone/tsbuild": "^2.1.8",
|
||||
"@gitzone/tsrun": "^1.2.1",
|
||||
"@gitzone/tstest": "^1.0.18",
|
||||
"@pushrocks/tapbundle": "^3.0.7",
|
||||
"@types/node": "^11.13.0",
|
||||
"@gitzone/tsbuild": "^2.1.28",
|
||||
"@gitzone/tsrun": "^1.2.18",
|
||||
"@gitzone/tstest": "^1.0.60",
|
||||
"@pushrocks/tapbundle": "^3.2.14",
|
||||
"@types/node": "^16.11.11",
|
||||
"gulp-function": "^2.2.14",
|
||||
"tslint": "^5.15.0",
|
||||
"tslint": "^6.1.3",
|
||||
"tslint-config-prettier": "^1.18.0"
|
||||
},
|
||||
"files": [
|
||||
"ts/*",
|
||||
"ts_web/*",
|
||||
"dist/*",
|
||||
"dist_web/*",
|
||||
"assets/*",
|
||||
"ts/**/*",
|
||||
"ts_web/**/*",
|
||||
"dist/**/*",
|
||||
"dist_*/**/*",
|
||||
"dist_ts/**/*",
|
||||
"dist_ts_web/**/*",
|
||||
"assets/**/*",
|
||||
"cli.js",
|
||||
"npmextra.json",
|
||||
"readme.md"
|
||||
],
|
||||
"browserslist": [
|
||||
"last 1 chrome versions"
|
||||
]
|
||||
}
|
||||
|
51
readme.md
Normal file
51
readme.md
Normal 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 | [](https://lossless.cloud)
|
||||
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
||||
npm | [](https://lossless.cloud)
|
||||
Snyk | [](https://lossless.cloud)
|
||||
TypeScript Support | [](https://lossless.cloud)
|
||||
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
Code Style | [](https://lossless.cloud)
|
||||
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
||||
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
||||
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
||||
Platform support | [](https://lossless.cloud) [](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 | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
|
||||
|
||||
[](https://maintainedby.lossless.com)
|
111
test/test.ts
111
test/test.ts
@ -1,5 +1,5 @@
|
||||
import * as smartfile from '../ts/index';
|
||||
import path = require('path');
|
||||
import * as path from 'path';
|
||||
|
||||
import { expect, tap } from '@pushrocks/tapbundle';
|
||||
|
||||
@ -8,14 +8,16 @@ import { expect, tap } from '@pushrocks/tapbundle';
|
||||
// ---------------------------
|
||||
|
||||
tap.test('.fs.fileExistsSync -> should return an accurate boolean', async () => {
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(smartfile.fs.fileExistsSync('./test/testassets/mytest.json')).to.be.true;
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(smartfile.fs.fileExistsSync('./test/testassets/notthere.json')).be.false;
|
||||
});
|
||||
|
||||
tap.test('.fs.fileExists -> should resolve or reject a promise', async () => {
|
||||
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/notthere.json').catch(err => {
|
||||
await smartfile.fs.fileExists('./test/testassets/notthere.json').catch((err) => {
|
||||
return expect(err.message).to.equal(
|
||||
"ENOENT: no such file or directory, access './test/testassets/notthere.json'"
|
||||
);
|
||||
@ -28,7 +30,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 () => {
|
||||
let folderArrayArg = await smartfile.fs.listFolders('./test/testassets/');
|
||||
const folderArrayArg = await smartfile.fs.listFolders('./test/testassets/');
|
||||
expect(folderArrayArg).to.include('testfolder');
|
||||
expect(folderArrayArg).to.not.include('notExistentFolder');
|
||||
});
|
||||
@ -36,24 +38,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 () => {
|
||||
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/', /mytest\.json/)).to.include('mytest.json');
|
||||
expect(smartfile.fs.listFilesSync('./test/testassets/', /mytests.json/)).to.not.include('mytest.json');
|
||||
expect(smartfile.fs.listFilesSync('./test/testassets/', /mytest\.json/)).to.include(
|
||||
'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 () => {
|
||||
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.not.include('notExistentFile');
|
||||
});
|
||||
|
||||
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.not.include('mytest.json');
|
||||
});
|
||||
|
||||
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].contents.toString()).to.equal(fileArrayArg[0].contentBuffer.toString());
|
||||
});
|
||||
@ -67,7 +79,10 @@ tap.test('.fs.copy() -> should copy a file', 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 () => {});
|
||||
@ -82,38 +97,45 @@ tap.test('.fs.removeSync -> should remove single files synchronouly', 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(() => {
|
||||
expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile1.txt')).to.be.false;
|
||||
expect(smartfile.fs.fileExistsSync('./test/testassets/temp/testfile2.txt')).to.be.false;
|
||||
});
|
||||
smartfile.fs
|
||||
.removeMany(['./test/testassets/temp/testfile1.txt', './test/testassets/temp/testfile2.txt'])
|
||||
.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 () => {
|
||||
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/testfile2.txt')).to.be.false;
|
||||
});
|
||||
|
||||
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({ key2: 'this works too' });
|
||||
});
|
||||
tap.test(
|
||||
'.fs.toObjectSync() -> should state unknown file type for unknown file types',
|
||||
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 () => {
|
||||
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({ key2: 'this works too' });
|
||||
});
|
||||
|
||||
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 +151,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 () => {
|
||||
let localString = 'myString';
|
||||
await smartfile.memory.toFs(localString, path.join(process.cwd(), './test/testassets/temp/testMemToFs.txt'));
|
||||
const localString = 'myString';
|
||||
await smartfile.memory.toFs(
|
||||
localString,
|
||||
path.join(process.cwd(), './test/testassets/temp/testMemToFs.txt')
|
||||
);
|
||||
});
|
||||
|
||||
tap.test(
|
||||
'.memory.toFsSync() -> should write a file to disk and return true if successfull',
|
||||
async () => {
|
||||
let localString = 'myString';
|
||||
const localString = 'myString';
|
||||
smartfile.memory.toFsSync(
|
||||
localString,
|
||||
path.join(process.cwd(), './test/testassets/temp/testMemToFsSync.txt')
|
||||
@ -144,28 +169,16 @@ tap.test(
|
||||
}
|
||||
);
|
||||
|
||||
tap.test('.remote.toString() -> should load a remote file to a variable', async () => {
|
||||
const responseString = await smartfile.remote.toString(
|
||||
'https://raw.githubusercontent.com/pushrocks/smartfile/master/test/testassets/mytest.txt'
|
||||
);
|
||||
expect(responseString).to.equal('Some TestString &&%$');
|
||||
});
|
||||
|
||||
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 => {
|
||||
return expect(err.message).to.equal(
|
||||
'could not get remote file from https://push.rocks/doesnotexist.txt'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
// ---------------------------
|
||||
// smartfile.Smartfile
|
||||
// ---------------------------
|
||||
|
||||
tap.test('.Smartfile -> should produce vinyl compatible files', async () => {
|
||||
let smartfileArray = await smartfile.fs.fileTreeToObject(process.cwd(), './test/testassets/testfolder/**/*');
|
||||
let localSmartfile = smartfileArray[0];
|
||||
const smartfileArray = await smartfile.fs.fileTreeToObject(
|
||||
process.cwd(),
|
||||
'./test/testassets/testfolder/**/*'
|
||||
);
|
||||
const localSmartfile = smartfileArray[0];
|
||||
expect(localSmartfile).to.be.instanceof(smartfile.Smartfile);
|
||||
expect(localSmartfile.contents).to.be.instanceof(Buffer);
|
||||
// tslint:disable-next-line:no-unused-expression
|
||||
@ -177,12 +190,12 @@ tap.test('.Smartfile -> should produce vinyl compatible files', async () => {
|
||||
});
|
||||
|
||||
tap.test('should output a smartfile array to disk', async () => {
|
||||
let smartfileArray = await smartfile.fs.fileTreeToObject('./test/testassets/testfolder/', '*');
|
||||
for (let smartfile of smartfileArray) {
|
||||
console.log(smartfile.relative);
|
||||
console.log(smartfile.path);
|
||||
console.log(smartfile.base);
|
||||
console.log(smartfile.parsedPath);
|
||||
const smartfileArray = await smartfile.fs.fileTreeToObject('./test/testassets/testfolder/', '*');
|
||||
for (const smartfileInstance of smartfileArray) {
|
||||
console.log(smartfileInstance.relative);
|
||||
console.log(smartfileInstance.path);
|
||||
console.log(smartfileInstance.base);
|
||||
console.log(smartfileInstance.parsedPath);
|
||||
}
|
||||
await smartfile.memory.smartfileArrayToFs(
|
||||
smartfileArray,
|
||||
@ -190,4 +203,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();
|
||||
|
15
test/test.virtualdirectory.ts
Normal file
15
test/test.virtualdirectory.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import { tap, expect } from '@pushrocks/tapbundle';
|
||||
|
||||
import * as smartfile from '../ts';
|
||||
|
||||
tap.test('should create a virtualdirectory', async () => {
|
||||
const virtualDir = await smartfile.VirtualDirectory.fromFsDirPath('./test/testassets/testfolder');
|
||||
expect(virtualDir.smartfileArray.length).to.equal(4);
|
||||
});
|
||||
|
||||
tap.test('should write to a directory', async () => {
|
||||
const virtualDir = await smartfile.VirtualDirectory.fromFsDirPath('./test/testassets/testfolder');
|
||||
virtualDir.saveToDisk('./test/testassets/test');
|
||||
});
|
||||
|
||||
tap.start();
|
@ -0,0 +1 @@
|
||||
okidoks
|
1
test/testassets/test/subfolder/subtestfile.txt
Normal file
1
test/testassets/test/subfolder/subtestfile.txt
Normal file
@ -0,0 +1 @@
|
||||
hi
|
0
test/testassets/test/testfile1.txt
Normal file
0
test/testassets/test/testfile1.txt
Normal file
0
test/testassets/test/testfile2.txt
Normal file
0
test/testassets/test/testfile2.txt
Normal file
1
test/testassets/utf8.txt
Normal file
1
test/testassets/utf8.txt
Normal file
@ -0,0 +1 @@
|
||||
hi there
|
18
ts/index.ts
18
ts/index.ts
@ -1,12 +1,12 @@
|
||||
import * as plugins from './smartfile.plugins';
|
||||
import * as SmartfileFs from './smartfile.fs';
|
||||
import * as SmartfileInterpreter from './smartfile.interpreter';
|
||||
import * as SmartfileMemory from './smartfile.memory';
|
||||
import * as SmartfileRemote from './smartfile.remote';
|
||||
import * as fsMod from './smartfile.fs';
|
||||
import * as interpreterMod from './smartfile.interpreter';
|
||||
import * as memoryMod from './smartfile.memory';
|
||||
|
||||
export { Smartfile } from './smartfile.classes.smartfile';
|
||||
export { Smartfile, ISmartfileConstructorOptions } from './smartfile.classes.smartfile';
|
||||
export { VirtualDirectory } from './smartfile.classes.virtualdirectory';
|
||||
|
||||
export let fs = SmartfileFs;
|
||||
export let interpreter = SmartfileInterpreter;
|
||||
export let memory = SmartfileMemory;
|
||||
export let remote = SmartfileRemote;
|
||||
|
||||
export let fs = fsMod;
|
||||
export let interpreter = interpreterMod;
|
||||
export let memory = memoryMod;
|
||||
|
@ -3,17 +3,16 @@ import * as fs from './smartfile.fs';
|
||||
import * as memory from './smartfile.memory';
|
||||
|
||||
export interface ISmartfileConstructorOptions {
|
||||
path?: string;
|
||||
contentString?: string;
|
||||
contentBuffer?: Buffer;
|
||||
base?: string;
|
||||
path: string;
|
||||
contentBuffer: Buffer;
|
||||
base: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* class Smartfile
|
||||
* -> is vinyl file compatible
|
||||
*/
|
||||
export class Smartfile {
|
||||
export class Smartfile extends plugins.smartjson.Smartjson {
|
||||
// ======
|
||||
// STATIC
|
||||
// ======
|
||||
@ -22,44 +21,91 @@ export class Smartfile {
|
||||
* creates a Smartfile from a filePath
|
||||
* @param filePath
|
||||
*/
|
||||
public static async fromFilePath(filePath: string) {
|
||||
public static async fromFilePath(filePath: string, baseArg: string = process.cwd()) {
|
||||
filePath = plugins.path.resolve(filePath);
|
||||
const fileString = fs.toStringSync(filePath);
|
||||
const fileBuffer = fs.toBufferSync(filePath);
|
||||
const smartfile = new Smartfile({
|
||||
path: filePath,
|
||||
contentString: fileString
|
||||
contentBuffer: fileBuffer,
|
||||
base: baseArg,
|
||||
path: plugins.path.relative(baseArg, filePath),
|
||||
});
|
||||
return smartfile;
|
||||
}
|
||||
|
||||
public static async fromBuffer(
|
||||
filePath: string,
|
||||
contentBufferArg: Buffer,
|
||||
baseArg: string = process.cwd()
|
||||
) {
|
||||
const smartfile = new Smartfile({
|
||||
contentBuffer: contentBufferArg,
|
||||
base: baseArg,
|
||||
path: plugins.path.relative(baseArg, filePath),
|
||||
});
|
||||
|
||||
return smartfile;
|
||||
}
|
||||
|
||||
public static async fromString(
|
||||
filePath: string,
|
||||
contentStringArg: string,
|
||||
encodingArg: 'utf8' | 'binary',
|
||||
baseArg = process.cwd()
|
||||
) {
|
||||
const smartfile = new Smartfile({
|
||||
contentBuffer: Buffer.from(contentStringArg, encodingArg),
|
||||
base: baseArg,
|
||||
path: plugins.path.relative(baseArg, filePath),
|
||||
});
|
||||
|
||||
return smartfile;
|
||||
}
|
||||
|
||||
public static async fromFoldedJson(foldedJsonArg: string) {
|
||||
return new Smartfile(plugins.smartjson.parse(foldedJsonArg));
|
||||
}
|
||||
|
||||
// ========
|
||||
// INSTANCE
|
||||
// ========
|
||||
/**
|
||||
* the full path of the file on disk
|
||||
* the relative path of the file
|
||||
*/
|
||||
path: string;
|
||||
@plugins.smartjson.foldDec()
|
||||
public path: string;
|
||||
|
||||
/**
|
||||
*
|
||||
* a parsed path
|
||||
*/
|
||||
parsedPath: plugins.path.ParsedPath;
|
||||
public get parsedPath (): plugins.path.ParsedPath {
|
||||
return plugins.path.parse(this.path);
|
||||
};
|
||||
public get absolutePath () {
|
||||
return plugins.path.join(this.base, this.path);
|
||||
}
|
||||
|
||||
public get absoluteParsedPath() {
|
||||
return plugins.path.parse(this.absolutePath);
|
||||
}
|
||||
|
||||
/**
|
||||
* the content of the file as Buffer
|
||||
*/
|
||||
contentBuffer: Buffer;
|
||||
@plugins.smartjson.foldDec()
|
||||
public contentBuffer: Buffer;
|
||||
|
||||
/**
|
||||
* The current working directory of the file
|
||||
* Note:this is similar to gulp and different from native node path base
|
||||
*/
|
||||
base: string;
|
||||
@plugins.smartjson.foldDec()
|
||||
public base: string;
|
||||
|
||||
/**
|
||||
* sync the file with disk
|
||||
*/
|
||||
sync: boolean;
|
||||
@plugins.smartjson.foldDec()
|
||||
public sync: boolean;
|
||||
|
||||
/**
|
||||
* the constructor of Smartfile
|
||||
@ -67,15 +113,13 @@ export class Smartfile {
|
||||
*/
|
||||
|
||||
constructor(optionsArg: ISmartfileConstructorOptions) {
|
||||
super();
|
||||
if (optionsArg.contentBuffer) {
|
||||
this.contentBuffer = optionsArg.contentBuffer;
|
||||
} else if (optionsArg.contentString) {
|
||||
this.setContentsFromString(optionsArg.contentString);
|
||||
} else {
|
||||
console.log('created empty Smartfile?');
|
||||
}
|
||||
this.path = optionsArg.path;
|
||||
this.parsedPath = plugins.path.parse(this.path);
|
||||
this.base = optionsArg.base;
|
||||
}
|
||||
|
||||
@ -83,24 +127,56 @@ export class Smartfile {
|
||||
* set contents from string
|
||||
* @param contentString
|
||||
*/
|
||||
setContentsFromString(contentString: string) {
|
||||
this.contents = new Buffer(contentString);
|
||||
public setContentsFromString(contentString: string, encodingArg: 'utf8' | 'binary' = 'utf8') {
|
||||
this.contents = new Buffer(contentString, encodingArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* write file to disk
|
||||
* write file to disk at its original location
|
||||
* Behaviours:
|
||||
* - no argument write to exactly where the file was picked up
|
||||
*/
|
||||
async write(pathArg?: string) {
|
||||
const stringToWrite = this.contentBuffer.toString();
|
||||
await memory.toFs(stringToWrite, this.path);
|
||||
public async write() {
|
||||
await memory.toFs(this.contentBuffer, plugins.path.join(this.base, this.path));
|
||||
}
|
||||
|
||||
/**
|
||||
* writes the file to path given as argument
|
||||
* note: if the path is not absolute, takes process.cwd() as base
|
||||
* @param filePathArg
|
||||
*/
|
||||
public async writeToDiskAtPath(filePathArg: string) {
|
||||
if (!plugins.path.isAbsolute(filePathArg)) {
|
||||
filePathArg = plugins.path.join(process.cwd(), filePathArg);
|
||||
}
|
||||
await memory.toFs(this.contentBuffer, filePathArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* writes the file to a directory combined with the relative path portion
|
||||
* @param dirPathArg
|
||||
* @returns
|
||||
*/
|
||||
public async writeToDir(dirPathArg: string) {
|
||||
dirPathArg = plugins.smartpath.transform.toAbsolute(dirPathArg);
|
||||
const filePath = plugins.path.join(dirPathArg, this.path);
|
||||
await memory.toFs(this.contentBuffer, filePath);
|
||||
return filePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* read file from disk
|
||||
*/
|
||||
async read() {}
|
||||
public async read() {
|
||||
this.contentBuffer = await fs.toBuffer(plugins.path.join(this.base, this.path));
|
||||
}
|
||||
|
||||
/**
|
||||
* deletes the file from disk at its original location
|
||||
*/
|
||||
public async delete() {
|
||||
await fs.remove(plugins.path.join(this.base, this.path));
|
||||
}
|
||||
|
||||
// -----------------------------------------------
|
||||
// vinyl compatibility
|
||||
@ -118,21 +194,21 @@ export class Smartfile {
|
||||
/**
|
||||
* vinyl-compatibility
|
||||
*/
|
||||
get cwd() {
|
||||
public get cwd() {
|
||||
return process.cwd();
|
||||
}
|
||||
|
||||
/**
|
||||
* return relative path of file
|
||||
*/
|
||||
get relative(): string {
|
||||
return plugins.path.relative(this.base, this.path);
|
||||
public get relative(): string {
|
||||
return this.path;
|
||||
}
|
||||
|
||||
/**
|
||||
* return truw when the file has content
|
||||
*/
|
||||
isNull(): boolean {
|
||||
public isNull(): boolean {
|
||||
if (!this.contentBuffer) {
|
||||
return true;
|
||||
}
|
||||
@ -142,28 +218,28 @@ export class Smartfile {
|
||||
/**
|
||||
* return true if contents are Buffer
|
||||
*/
|
||||
isBuffer(): boolean {
|
||||
public isBuffer(): boolean {
|
||||
if (this.contents instanceof Buffer) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
isDirectory() {
|
||||
public isDirectory() {
|
||||
return false;
|
||||
}
|
||||
|
||||
isStream() {
|
||||
public isStream() {
|
||||
return false;
|
||||
}
|
||||
|
||||
isSymbolic() {
|
||||
public isSymbolic() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// update things
|
||||
updateFileName(fileNameArg: string) {
|
||||
let oldFileName = this.parsedPath.base;
|
||||
public updateFileName(fileNameArg: string) {
|
||||
const oldFileName = this.parsedPath.base;
|
||||
this.path = this.path.replace(new RegExp(oldFileName + '$'), fileNameArg);
|
||||
}
|
||||
}
|
||||
|
61
ts/smartfile.classes.virtualdirectory.ts
Normal file
61
ts/smartfile.classes.virtualdirectory.ts
Normal file
@ -0,0 +1,61 @@
|
||||
import { Smartfile } from './smartfile.classes.smartfile';
|
||||
import * as plugins from './smartfile.plugins';
|
||||
import * as fs from './smartfile.fs';
|
||||
|
||||
/**
|
||||
* a virtual directory exposes a fs api
|
||||
*/
|
||||
export class VirtualDirectory {
|
||||
// STATIC
|
||||
public static async fromFsDirPath(pathArg: string): Promise<VirtualDirectory> {
|
||||
const newVirtualDir = new VirtualDirectory();
|
||||
newVirtualDir.addSmartfiles(await fs.fileTreeToObject(pathArg, '**/*'));
|
||||
return newVirtualDir;
|
||||
}
|
||||
|
||||
public static async fromVirtualDirTransferableObject(
|
||||
virtualDirTransferableObjectArg: plugins.smartfileInterfaces.VirtualDirTransferableObject
|
||||
): Promise<VirtualDirectory> {
|
||||
const newVirtualDir = new VirtualDirectory();
|
||||
for (const fileArg of virtualDirTransferableObjectArg.files) {
|
||||
newVirtualDir.addSmartfiles([Smartfile.enfoldFromJson(fileArg) as Smartfile]);
|
||||
}
|
||||
return newVirtualDir;
|
||||
}
|
||||
|
||||
// INSTANCE
|
||||
public smartfileArray: Smartfile[] = [];
|
||||
|
||||
constructor() {}
|
||||
|
||||
public addSmartfiles(smartfileArrayArg: Smartfile[]) {
|
||||
this.smartfileArray = this.smartfileArray.concat(smartfileArrayArg);
|
||||
}
|
||||
|
||||
public async getFileByPath(pathArg: string) {
|
||||
for (const smartfile of this.smartfileArray) {
|
||||
if (smartfile.path === pathArg) {
|
||||
return smartfile;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async toVirtualDirTransferableObject(): Promise<plugins.smartfileInterfaces.VirtualDirTransferableObject> {
|
||||
return {
|
||||
files: this.smartfileArray.map(smartfileArg => smartfileArg.foldToJson())
|
||||
};
|
||||
}
|
||||
|
||||
public async saveToDisk(dirArg: string) {
|
||||
console.log(`writing VirtualDirectory with ${this.smartfileArray.length} to directory:
|
||||
--> ${dirArg}`);
|
||||
for (const smartfileArg of this.smartfileArray) {
|
||||
const filePath = await smartfileArg.writeToDir(dirArg);
|
||||
console.log(`wrote ${smartfileArg.relative} to
|
||||
--> ${filePath}`);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO implement root shifting to get subdirectories as new virtual directories
|
||||
// TODO implement root shifting to combine VirtualDirecotries in a parent virtual directory
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
import plugins = require('./smartfile.plugins');
|
||||
import SmartfileInterpreter = require('./smartfile.interpreter');
|
||||
import * as plugins from './smartfile.plugins';
|
||||
import * as interpreter from './smartfile.interpreter';
|
||||
|
||||
import { Smartfile } from './smartfile.classes.smartfile';
|
||||
|
||||
@ -29,9 +29,9 @@ export const fileExistsSync = (filePath): boolean => {
|
||||
* @param filePath
|
||||
* @returns {any}
|
||||
*/
|
||||
export let fileExists = async (filePath): Promise<boolean> => {
|
||||
export const fileExists = async (filePath): Promise<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);
|
||||
});
|
||||
return done.promise;
|
||||
@ -84,16 +84,14 @@ export const copySync = (fromArg: string, toArg: string): boolean => {
|
||||
/**
|
||||
* ensures that a directory is in place
|
||||
*/
|
||||
export let ensureDir = (dirPathArg: string) => {
|
||||
let done = plugins.smartpromise.defer();
|
||||
plugins.fsExtra.ensureDir(dirPathArg, done.resolve);
|
||||
return done.promise;
|
||||
export const ensureDir = async (dirPathArg: string) => {
|
||||
await plugins.fsExtra.ensureDir(dirPathArg);
|
||||
};
|
||||
|
||||
/**
|
||||
* ensures that a directory is in place
|
||||
*/
|
||||
export let ensureDirSync = (dirPathArg: string) => {
|
||||
export const ensureDirSync = (dirPathArg: string) => {
|
||||
plugins.fsExtra.ensureDirSync(dirPathArg);
|
||||
};
|
||||
|
||||
@ -101,19 +99,16 @@ export let ensureDirSync = (dirPathArg: string) => {
|
||||
* ensure an empty directory
|
||||
* @executes ASYNC
|
||||
*/
|
||||
export let ensureEmptyDir = (dirPathArg: string) => {
|
||||
let done = plugins.smartpromise.defer();
|
||||
plugins.fsExtra.ensureDir(dirPathArg, () => {
|
||||
plugins.fsExtra.emptyDir(dirPathArg, done.resolve);
|
||||
});
|
||||
return done.promise;
|
||||
export const ensureEmptyDir = async (dirPathArg: string) => {
|
||||
await plugins.fsExtra.ensureDir(dirPathArg);
|
||||
await plugins.fsExtra.emptyDir(dirPathArg);
|
||||
};
|
||||
|
||||
/**
|
||||
* ensure an empty directory
|
||||
* @executes SYNC
|
||||
*/
|
||||
export let ensureEmptyDirSync = (dirPathArg: string) => {
|
||||
export const ensureEmptyDirSync = (dirPathArg: string) => {
|
||||
plugins.fsExtra.ensureDirSync(dirPathArg);
|
||||
plugins.fsExtra.emptyDirSync(dirPathArg);
|
||||
};
|
||||
@ -125,11 +120,8 @@ export let ensureEmptyDirSync = (dirPathArg: string) => {
|
||||
* @returns Promise<void>
|
||||
* @exec ASYNC
|
||||
*/
|
||||
export let ensureFile = (filePathArg, initFileStringArg): Promise<void> => {
|
||||
let done = plugins.smartpromise.defer<void>();
|
||||
export const ensureFile = async (filePathArg, initFileStringArg): Promise<void> => {
|
||||
ensureFileSync(filePathArg, initFileStringArg);
|
||||
done.resolve();
|
||||
return done.promise;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -139,7 +131,7 @@ export let ensureFile = (filePathArg, initFileStringArg): Promise<void> => {
|
||||
* @returns Promise<void>
|
||||
* @exec SYNC
|
||||
*/
|
||||
export let ensureFileSync = (filePathArg: string, initFileStringArg: string): void => {
|
||||
export const ensureFileSync = (filePathArg: string, initFileStringArg: string): void => {
|
||||
if (fileExistsSync(filePathArg)) {
|
||||
return null;
|
||||
} else {
|
||||
@ -150,38 +142,33 @@ export let ensureFileSync = (filePathArg: string, initFileStringArg: string): vo
|
||||
/**
|
||||
* removes a file or folder from local disk
|
||||
*/
|
||||
export let remove = function(pathArg: string): Promise<void> {
|
||||
let done = plugins.smartpromise.defer<void>();
|
||||
plugins.fsExtra.remove(pathArg, function() {
|
||||
done.resolve();
|
||||
});
|
||||
return done.promise;
|
||||
export const remove = async (pathArg: string): Promise<void> => {
|
||||
await plugins.fsExtra.remove(pathArg);
|
||||
};
|
||||
|
||||
/**
|
||||
* removes a file SYNCHRONOUSLY from local disk
|
||||
*/
|
||||
export let removeSync = function(pathArg: string): boolean {
|
||||
export const removeSync = (pathArg: string): void => {
|
||||
plugins.fsExtra.removeSync(pathArg);
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* removes an array of filePaths from disk
|
||||
*/
|
||||
export let removeMany = function(filePathArrayArg: string[]) {
|
||||
let promiseArray: Promise<void>[] = [];
|
||||
for (let filePath of filePathArrayArg) {
|
||||
export const removeMany = async (filePathArrayArg: string[]) => {
|
||||
const promiseArray: Array<Promise<void>> = [];
|
||||
for (const filePath of filePathArrayArg) {
|
||||
promiseArray.push(remove(filePath));
|
||||
}
|
||||
return Promise.all(promiseArray);
|
||||
await Promise.all(promiseArray);
|
||||
};
|
||||
|
||||
/**
|
||||
* like removeFilePathArray but SYNCHRONOUSLY
|
||||
*/
|
||||
export let removeManySync = function(filePathArrayArg: string[]): void {
|
||||
for (let filePath of filePathArrayArg) {
|
||||
export const removeManySync = (filePathArrayArg: string[]): void => {
|
||||
for (const filePath of filePathArrayArg) {
|
||||
removeSync(filePath);
|
||||
}
|
||||
};
|
||||
@ -196,71 +183,86 @@ export let removeManySync = function(filePathArrayArg: string[]): void {
|
||||
* @param fileTypeArg
|
||||
* @returns {any}
|
||||
*/
|
||||
export let toObjectSync = function(filePathArg, fileTypeArg?) {
|
||||
export const toObjectSync = (filePathArg, fileTypeArg?) => {
|
||||
const fileString = plugins.fsExtra.readFileSync(filePathArg, 'utf8');
|
||||
let fileType;
|
||||
fileTypeArg ? (fileType = fileTypeArg) : (fileType = SmartfileInterpreter.filetype(filePathArg));
|
||||
return SmartfileInterpreter.objectFile(fileString, fileType);
|
||||
fileTypeArg ? (fileType = fileTypeArg) : (fileType = interpreter.filetype(filePathArg));
|
||||
return interpreter.objectFile(fileString, fileType);
|
||||
};
|
||||
|
||||
/**
|
||||
* reads a file content to a String
|
||||
* @param filePath
|
||||
* @returns {string|Buffer|any}
|
||||
*/
|
||||
export const toStringSync = (filePath: string): string => {
|
||||
const fileString: string = plugins.fsExtra.readFileSync(filePath, 'utf8');
|
||||
const encoding = plugins.smartmime.getEncoding(filePath);
|
||||
let fileString: string | Buffer = plugins.fsExtra.readFileSync(filePath, encoding);
|
||||
if (Buffer.isBuffer(fileString)) {
|
||||
fileString = fileString.toString('binary');
|
||||
}
|
||||
return fileString;
|
||||
};
|
||||
|
||||
export const toBuffer = async (filePath: string): Promise<Buffer> => {
|
||||
return plugins.fsExtra.readFile(filePath);
|
||||
};
|
||||
|
||||
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) => {
|
||||
// handle absolute miniMatchFilter
|
||||
let dirPath: string;
|
||||
if (plugins.path.isAbsolute(miniMatchFilter)) {
|
||||
dirPath = '/';
|
||||
} else {
|
||||
dirPath = dirPathArg;
|
||||
dirPath = plugins.smartpath.transform.toAbsolute(dirPathArg);
|
||||
}
|
||||
|
||||
const fileTree = await listFileTree(dirPath, miniMatchFilter);
|
||||
const smartfileArray: Smartfile[] = [];
|
||||
for (let filePath of fileTree) {
|
||||
let readPath = ((): string => {
|
||||
for (const filePath of fileTree) {
|
||||
const readPath = ((): string => {
|
||||
if (!plugins.path.isAbsolute(filePath)) {
|
||||
return plugins.path.join(dirPath, filePath);
|
||||
} else {
|
||||
return filePath;
|
||||
}
|
||||
})();
|
||||
let fileContentString = toStringSync(readPath);
|
||||
const fileContentString = toStringSync(readPath);
|
||||
|
||||
// push a read file as Smartfile
|
||||
smartfileArray.push(
|
||||
new Smartfile({
|
||||
contentBuffer: Buffer.from(fileContentString),
|
||||
base: dirPath,
|
||||
path: filePath
|
||||
path: filePath,
|
||||
})
|
||||
);
|
||||
}
|
||||
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
|
||||
* @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);
|
||||
};
|
||||
|
||||
@ -268,12 +270,12 @@ export let listFolders = async (pathArg: string, regexFilter?: RegExp): Promise<
|
||||
* lists Folders SYNCHRONOUSLY in a directory on local disk
|
||||
* @returns an array with the folder names as strings
|
||||
*/
|
||||
export let listFoldersSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
||||
let folderArray = plugins.fsExtra.readdirSync(pathArg).filter(file => {
|
||||
export const listFoldersSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
||||
let folderArray = plugins.fsExtra.readdirSync(pathArg).filter((file) => {
|
||||
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isDirectory();
|
||||
});
|
||||
if (regexFilter) {
|
||||
folderArray = folderArray.filter(fileItem => {
|
||||
folderArray = folderArray.filter((fileItem) => {
|
||||
return regexFilter.test(fileItem);
|
||||
});
|
||||
}
|
||||
@ -284,7 +286,7 @@ export let listFoldersSync = (pathArg: string, regexFilter?: RegExp): string[] =
|
||||
* lists Files in a directory on local disk
|
||||
* @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);
|
||||
};
|
||||
|
||||
@ -292,12 +294,12 @@ export let listFiles = async (pathArg: string, regexFilter?: RegExp): Promise<st
|
||||
* lists Files SYNCHRONOUSLY in a directory on local disk
|
||||
* @returns an array with the folder names as strings
|
||||
*/
|
||||
export let listFilesSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
||||
let fileArray = plugins.fsExtra.readdirSync(pathArg).filter(file => {
|
||||
export const listFilesSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
||||
let fileArray = plugins.fsExtra.readdirSync(pathArg).filter((file) => {
|
||||
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
|
||||
});
|
||||
if (regexFilter) {
|
||||
fileArray = fileArray.filter(fileItem => {
|
||||
fileArray = fileArray.filter((fileItem) => {
|
||||
return regexFilter.test(fileItem);
|
||||
});
|
||||
}
|
||||
@ -308,7 +310,7 @@ export let listFilesSync = (pathArg: string, regexFilter?: RegExp): string[] =>
|
||||
* lists all items (folders AND files) in a directory on local disk
|
||||
* @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);
|
||||
};
|
||||
|
||||
@ -317,12 +319,12 @@ export let listAllItems = async (pathArg: string, regexFilter?: RegExp): Promise
|
||||
* @returns an array with the folder names as strings
|
||||
* @executes SYNC
|
||||
*/
|
||||
export let listAllItemsSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
||||
let allItmesArray = plugins.fsExtra.readdirSync(pathArg).filter(function(file) {
|
||||
export const listAllItemsSync = (pathArg: string, regexFilter?: RegExp): string[] => {
|
||||
let allItmesArray = plugins.fsExtra.readdirSync(pathArg).filter((file) => {
|
||||
return plugins.fsExtra.statSync(plugins.path.join(pathArg, file)).isFile();
|
||||
});
|
||||
if (regexFilter) {
|
||||
allItmesArray = allItmesArray.filter(fileItem => {
|
||||
allItmesArray = allItmesArray.filter((fileItem) => {
|
||||
return regexFilter.test(fileItem);
|
||||
});
|
||||
}
|
||||
@ -334,7 +336,11 @@ export let listAllItemsSync = (pathArg: string, regexFilter?: RegExp): string[]
|
||||
* 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
|
||||
*/
|
||||
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[]>();
|
||||
|
||||
// handle absolute miniMatchFilter
|
||||
@ -348,7 +354,7 @@ export const listFileTree = async (dirPathArg: string, miniMatchFilter: string,
|
||||
const options = {
|
||||
cwd: dirPath,
|
||||
nodir: true,
|
||||
dot: true
|
||||
dot: true,
|
||||
};
|
||||
plugins.glob(miniMatchFilter, options, (err, files: string[]) => {
|
||||
if (err) {
|
||||
@ -357,13 +363,25 @@ export const listFileTree = async (dirPathArg: string, miniMatchFilter: string,
|
||||
}
|
||||
done.resolve(files);
|
||||
});
|
||||
|
||||
|
||||
let fileList = await done.promise;
|
||||
if (absolutePathsBool) {
|
||||
fileList = fileList.map(filePath => {
|
||||
fileList = fileList.map((filePath) => {
|
||||
return plugins.path.resolve(plugins.path.join(dirPath, filePath));
|
||||
});
|
||||
}
|
||||
|
||||
return fileList;
|
||||
};
|
||||
|
||||
/**
|
||||
* checks wether a file is ready for processing
|
||||
*/
|
||||
export const waitForFileToBeReady = async (filePathArg: string) => {
|
||||
const limitedArray = new plugins.lik.LimitedArray<string>(3);
|
||||
if(!plugins.path.isAbsolute(filePathArg)) {
|
||||
filePathArg = plugins.path.resolve(filePathArg);
|
||||
};
|
||||
const stats = await plugins.fsExtra.stat(filePathArg);
|
||||
stats.size
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
import plugins = require('./smartfile.plugins');
|
||||
import * as plugins from './smartfile.plugins';
|
||||
|
||||
export let filetype = (pathArg: string): string => {
|
||||
let extName = plugins.path.extname(pathArg);
|
||||
let fileType = extName.replace(/\.([a-z]*)/, '$1'); // remove . form fileType
|
||||
const extName = plugins.path.extname(pathArg);
|
||||
const fileType = extName.replace(/\.([a-z]*)/, '$1'); // remove . form fileType
|
||||
return fileType;
|
||||
};
|
||||
|
||||
@ -10,7 +10,7 @@ export let objectFile = (fileStringArg: string, fileTypeArg) => {
|
||||
switch (fileTypeArg) {
|
||||
case 'yml':
|
||||
case 'yaml':
|
||||
return plugins.yaml.safeLoad(fileStringArg);
|
||||
return plugins.yaml.load(fileStringArg);
|
||||
case 'json':
|
||||
return JSON.parse(fileStringArg);
|
||||
default:
|
||||
|
@ -1,8 +1,7 @@
|
||||
import plugins = require('./smartfile.plugins');
|
||||
import * as plugins from './smartfile.plugins';
|
||||
import { Smartfile } from './smartfile.classes.smartfile';
|
||||
import * as smartfileFs from './smartfile.fs';
|
||||
|
||||
import SmartfileInterpreter = require('./smartfile.interpreter');
|
||||
import * as interpreter from './smartfile.interpreter';
|
||||
|
||||
/**
|
||||
* converts file to Object
|
||||
@ -10,8 +9,8 @@ import SmartfileInterpreter = require('./smartfile.interpreter');
|
||||
* @param fileTypeArg
|
||||
* @returns {any|any}
|
||||
*/
|
||||
export let toObject = function(fileStringArg: string, fileTypeArg: string) {
|
||||
return SmartfileInterpreter.objectFile(fileStringArg, fileTypeArg);
|
||||
export let toObject = (fileStringArg: string, fileTypeArg: string) => {
|
||||
return interpreter.objectFile(fileStringArg, fileTypeArg);
|
||||
};
|
||||
|
||||
export interface IToFsOptions {
|
||||
@ -25,11 +24,11 @@ export interface IToFsOptions {
|
||||
* @param fileBaseArg
|
||||
*/
|
||||
export let toFs = async (
|
||||
fileContentArg: string | Smartfile,
|
||||
filePathArg,
|
||||
fileContentArg: string | Buffer | Smartfile,
|
||||
filePathArg: string,
|
||||
optionsArg: IToFsOptions = {}
|
||||
) => {
|
||||
let done = plugins.smartpromise.defer();
|
||||
const done = plugins.smartpromise.defer();
|
||||
|
||||
// check args
|
||||
if (!fileContentArg || !filePathArg) {
|
||||
@ -37,24 +36,27 @@ export let toFs = async (
|
||||
}
|
||||
|
||||
// prepare actual write action
|
||||
let fileString: string;
|
||||
let fileContent: string | Buffer;
|
||||
let fileEncoding: 'utf8' | 'binary' = 'utf8';
|
||||
let filePath: string = filePathArg;
|
||||
|
||||
// handle Smartfile
|
||||
if (fileContentArg instanceof Smartfile) {
|
||||
let fileContentArg2: any = fileContentArg;
|
||||
fileString = fileContentArg.contentBuffer.toString();
|
||||
fileContent = fileContentArg.contentBuffer;
|
||||
// handle options
|
||||
if (optionsArg.respectRelative) {
|
||||
filePath = plugins.path.join(filePath, fileContentArg.path);
|
||||
}
|
||||
} else if (Buffer.isBuffer(fileContentArg)) {
|
||||
fileContent = fileContentArg;
|
||||
fileEncoding = 'binary';
|
||||
} else if (typeof fileContentArg === 'string') {
|
||||
fileString = fileContentArg;
|
||||
fileContent = fileContentArg;
|
||||
} else {
|
||||
throw new Error('fileContent is neither string nor Smartfile');
|
||||
}
|
||||
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;
|
||||
};
|
||||
|
||||
@ -63,7 +65,7 @@ export let toFs = async (
|
||||
* @param fileArg
|
||||
* @param filePathArg
|
||||
*/
|
||||
export let toFsSync = function(fileArg: string, filePathArg: string) {
|
||||
export const toFsSync = (fileArg: string, filePathArg: string) => {
|
||||
// function checks to abort if needed
|
||||
if (!fileArg || !filePathArg) {
|
||||
throw new Error('expected a valid arguments');
|
||||
@ -71,7 +73,7 @@ export let toFsSync = function(fileArg: string, filePathArg: string) {
|
||||
|
||||
// prepare actual write action
|
||||
let fileString: string;
|
||||
let filePath: string = filePathArg;
|
||||
const filePath: string = filePathArg;
|
||||
|
||||
if (typeof fileArg !== 'string') {
|
||||
throw new Error('fileArg is not of type String.');
|
||||
@ -83,9 +85,9 @@ export let toFsSync = function(fileArg: string, filePathArg: string) {
|
||||
|
||||
export let smartfileArrayToFs = async (smartfileArrayArg: Smartfile[], dirArg: string) => {
|
||||
await smartfileFs.ensureDir(dirArg);
|
||||
for (let smartfile of smartfileArrayArg) {
|
||||
for (const smartfile of smartfileArrayArg) {
|
||||
await toFs(smartfile, dirArg, {
|
||||
respectRelative: true
|
||||
respectRelative: true,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -1,9 +1,24 @@
|
||||
export import fs = require('fs');
|
||||
export import fsExtra = require('fs-extra');
|
||||
export let glob = require('glob');
|
||||
export import path = require('path');
|
||||
export import smartpromise = require('@pushrocks/smartpromise');
|
||||
export import smartrequest = require('@pushrocks/smartrequest');
|
||||
export import smartpath = require('@pushrocks/smartpath');
|
||||
export let vinylFile = require('vinyl-file');
|
||||
export let yaml = require('js-yaml');
|
||||
// node native scope
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
export { fs, path };
|
||||
|
||||
// @pushrocks scope
|
||||
import * as lik from '@pushrocks/lik';
|
||||
import * as smartfileInterfaces from '@pushrocks/smartfile-interfaces';
|
||||
import * as smarthash from '@pushrocks/smarthash';
|
||||
import * as smartjson from '@pushrocks/smartjson';
|
||||
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 { lik, smartfileInterfaces, smarthash, smartjson, 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 };
|
||||
|
@ -1,50 +0,0 @@
|
||||
import plugins = require('./smartfile.plugins');
|
||||
import SmartfileInterpreter = require('./smartfile.interpreter');
|
||||
|
||||
/* export let toFs = function (from: string, toPath: string) {
|
||||
let done = plugins.q.defer()
|
||||
let stream = plugins.smartrequest(from).pipe(plugins.fsExtra.createWriteStream(toPath))
|
||||
stream.on('finish', function () {
|
||||
done.resolve(toPath)
|
||||
})
|
||||
return done.promise
|
||||
} */
|
||||
|
||||
/**
|
||||
*
|
||||
* @param fromArg
|
||||
* @returns {any}
|
||||
*/
|
||||
export let toObject = function(fromArg: string) {
|
||||
let done = plugins.smartpromise.defer();
|
||||
plugins.smartrequest
|
||||
.request(fromArg, {
|
||||
method: 'get'
|
||||
})
|
||||
.then((res: any) => {
|
||||
if (res.statusCode === 200) {
|
||||
done.resolve(res.body);
|
||||
} else {
|
||||
console.log('could not get remote file from ' + fromArg);
|
||||
done.reject(new Error('could not get remote file from ' + fromArg));
|
||||
}
|
||||
});
|
||||
return done.promise;
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param fromArg
|
||||
* @returns {any}
|
||||
*/
|
||||
export let toString = (fromArg: string) => {
|
||||
let done = plugins.smartpromise.defer();
|
||||
plugins.smartrequest.getBinary(fromArg).then((res: any) => {
|
||||
if (res.statusCode === 200) {
|
||||
done.resolve(res.body);
|
||||
} else {
|
||||
done.reject(new Error('could not get remote file from ' + fromArg));
|
||||
}
|
||||
});
|
||||
return done.promise;
|
||||
};
|
8
tsconfig.json
Normal file
8
tsconfig.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"experimentalDecorators": true,
|
||||
"esModuleInterop": true,
|
||||
"target": "ES2017",
|
||||
"moduleResolution": "node"
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user