Compare commits

..

31 Commits

Author SHA1 Message Date
35f66736f0 3.0.8 2023-07-26 16:13:53 +02:00
99ac52b3d4 fix(core): update 2023-07-26 16:13:52 +02:00
1d25d4e21b 3.0.7 2023-07-26 16:13:34 +02:00
fbdb75d673 fix(core): update 2023-07-26 16:13:33 +02:00
d90e833270 switch to new org scheme 2023-07-11 00:12:53 +02:00
4cb3232317 switch to new org scheme 2023-07-10 02:42:07 +02:00
0d50cdafbf 3.0.6 2022-06-07 18:04:35 +02:00
4b3c9c9269 fix(core): update 2022-06-07 18:04:35 +02:00
447a02b4c0 3.0.5 2022-06-07 17:11:13 +02:00
9e14d881ba fix(core): update 2022-06-07 17:11:13 +02:00
277a3fff41 3.0.4 2022-06-06 11:29:13 +02:00
fc107509ff fix(core): update 2022-06-06 11:29:13 +02:00
08d5461602 3.0.3 2022-06-06 11:17:57 +02:00
0b93067783 fix(core): update 2022-06-06 11:17:56 +02:00
f70177001b 3.0.2 2022-04-13 15:41:07 +02:00
232bb80bcb update 2022-04-04 19:50:42 +02:00
55e9287468 3.0.1 2022-04-04 16:28:45 +02:00
a71fdf805d fix build 2022-04-04 16:28:40 +02:00
69cf63c80a 3.0.0 2022-04-04 14:15:58 +02:00
14e823fbfd BREANKING CHANGE(core): switch to esm 2022-04-04 14:15:51 +02:00
abe1299203 2.0.4 2021-04-19 14:14:25 +00:00
99ce99795a fix(core): update 2021-04-19 14:14:24 +00:00
f6a54ead5d 2.0.3 2021-04-19 14:13:53 +00:00
cb48cfa948 fix(core): update 2021-04-19 14:13:53 +00:00
36a5c2480f 2.0.2 2021-04-19 12:15:24 +00:00
70a08fd92b fix(core): update 2021-04-19 12:15:23 +00:00
02a0646a49 2.0.1 2021-04-19 12:12:49 +00:00
17eda1e56a fix(core): update 2021-04-19 12:12:48 +00:00
ea6c514a40 2.0.0 2021-04-19 11:59:14 +00:00
ca3975abea 1.0.14 2021-04-19 11:53:49 +00:00
c405a83689 fix(core): update 2021-04-19 11:53:49 +00:00
24 changed files with 5540 additions and 13356 deletions

View File

@ -0,0 +1,66 @@
name: Default (not tags)
on:
push:
tags-ignore:
- '**'
env:
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
jobs:
security:
runs-on: ubuntu-latest
continue-on-error: true
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Install pnpm and npmci
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
- name: Run npm prepare
run: npmci npm prepare
- name: Audit production dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --prod
continue-on-error: true
- name: Audit development dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --dev
continue-on-error: true
test:
if: ${{ always() }}
needs: security
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Test stable
run: |
npmci node install stable
npmci npm install
npmci npm test
- name: Test build
run: |
npmci node install stable
npmci npm install
npmci npm build

View File

@ -0,0 +1,124 @@
name: Default (tags)
on:
push:
tags:
- '*'
env:
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
jobs:
security:
runs-on: ubuntu-latest
continue-on-error: true
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
npmci npm prepare
- name: Audit production dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --prod
continue-on-error: true
- name: Audit development dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --dev
continue-on-error: true
test:
if: ${{ always() }}
needs: security
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
npmci npm prepare
- name: Test stable
run: |
npmci node install stable
npmci npm install
npmci npm test
- name: Test build
run: |
npmci node install stable
npmci npm install
npmci npm build
release:
needs: test
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
npmci npm prepare
- name: Release
run: |
npmci node install stable
npmci npm publish
metadata:
needs: test
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
container:
image: ${{ env.IMAGE }}
continue-on-error: true
steps:
- uses: actions/checkout@v3
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @shipzone/npmci
npmci npm prepare
- name: Code quality
run: |
npmci command npm install -g typescript
npmci npm install
- name: Trigger
run: npmci trigger
- name: Build docs and upload artifacts
run: |
npmci node install stable
npmci npm install
pnpm install -g @gitzone/tsdoc
npmci command tsdoc
continue-on-error: true

View File

@ -1,137 +0,0 @@
# gitzone ci_default
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache:
paths:
- .npmci_cache/
key: '$CI_BUILD_STAGE'
stages:
- security
- test
- release
- metadata
# ====================
# security stage
# ====================
mirror:
stage: security
script:
- npmci git mirror
only:
- tags
tags:
- lossless
- docker
- notpriv
auditProductionDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security
script:
- npmci npm prepare
- 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
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
# ====================
testStable:
stage: test
script:
- npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- 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 stable
- npmci npm publish
only:
- tags
tags:
- lossless
- docker
- notpriv
# ====================
# metadata stage
# ====================
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:
- lossless
- docker
- priv
trigger:
stage: metadata
script:
- npmci trigger
only:
- tags
tags:
- lossless
- docker
- notpriv
pages:
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:
- tags
artifacts:
expire_in: 1 week
paths:
- public
allow_failure: true

24
.vscode/launch.json vendored
View File

@ -2,28 +2,10 @@
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "current file", "command": "npm test",
"type": "node", "name": "Run npm test",
"request": "launch", "request": "launch",
"args": [ "type": "node-terminal"
"${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"
} }
] ]
} }

2
dist_ts/index.d.ts vendored
View File

@ -1 +1 @@
export * from './smartarchive.classes.smartarchive'; export * from './smartarchive.classes.smartarchive.js';

View File

@ -1,7 +1,2 @@
"use strict"; export * from './smartarchive.classes.smartarchive.js';
function __export(m) { //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdDQUF3QyxDQUFDIn0=
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
__export(require("./smartarchive.classes.smartarchive"));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlEQUFvRCJ9

View File

@ -1,5 +1,34 @@
/// <reference types="node" resolution-mode="require"/>
import * as plugins from './smartarchive.plugins.js';
export declare class SmartArchive { export declare class SmartArchive {
archiveDirectory: string;
constructor(); constructor();
extractArchiveFromFilePath(filePathArg: string, targetDir: string): void; /**
* extracts an archive from a given url
*/
extractArchiveFromUrlToFs(urlArg: string, targetDir: string): Promise<void>;
/**
* extracts an archive from a given filePath on disk
* @param filePathArg
* @param targetDirArg
*/
extractArchiveFromFilePathToFs(filePathArg: string, targetDirArg: string): Promise<void>;
/**
* extracts to Observable
* where the Observable is emitting smartfiles
*/
extractArchiveFromBufferToObservable(bufferArg: Buffer): Promise<plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>>;
extractArchiveWithIntakeAndReplaySubject(): {
intake: plugins.smartstream.StreamIntake<Buffer>;
replaySubject: plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>;
};
/**
* extracts to Observable
*/
extractArchiveFromUrlToObservable(urlArg: string): Promise<plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>>;
extractArchiveFromUrlToStream(): Promise<void>;
extractArchiveFromFilePathToStream(): Promise<void>;
extractArchiveFromStreamToStream(): Promise<void>;
packFromStreamToStream(): Promise<void>;
packFromDirPathToStream(): Promise<void>;
packFromDirPathToFs(): Promise<void>;
} }

File diff suppressed because one or more lines are too long

View File

@ -1,13 +1,4 @@
"use strict"; import * as plugins from './smartarchive.plugins.js';
var __importStar = (this && this.__importStar) || function (mod) { export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
if (mod && mod.__esModule) return mod; export const nogitDir = plugins.path.join(packageDir, './.nogit');
var result = {}; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhcmNoaXZlLnBhdGhzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhcmNoaXZlLnBhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN6QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUMvRCxLQUFLLENBQ04sQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMifQ==
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = __importStar(require("./smartarchive.plugins"));
exports.packageDir = plugins.path.join(__dirname, '../');
exports.nogitDir = plugins.path.join(__dirname, './.nogit');
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhcmNoaXZlLnBhdGhzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhcmNoaXZlLnBhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLGdFQUFrRDtBQUVyQyxRQUFBLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakQsUUFBQSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDIn0=

View File

@ -1,7 +1,14 @@
import path from 'path'; import * as path from 'path';
export { path }; export { path };
import * as smartfile from '@pushrocks/smartfile'; import * as smartfile from '@push.rocks/smartfile';
import * as smartpath from '@pushrocks/smartpath'; import * as smartpath from '@push.rocks/smartpath';
export { smartfile, smartpath }; import * as smartpromise from '@push.rocks/smartpromise';
import * as smartrequest from '@push.rocks/smartrequest';
import * as smartunique from '@push.rocks/smartunique';
import * as smartstream from '@push.rocks/smartstream';
import * as smartrx from '@push.rocks/smartrx';
export { smartfile, smartpath, smartpromise, smartrequest, smartunique, smartstream, smartrx };
import gunzipMaybe from 'gunzip-maybe';
import tar from 'tar'; import tar from 'tar';
export { tar }; import tarStream from 'tar-stream';
export { gunzipMaybe, tar, tarStream };

View File

@ -1,24 +1,19 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
// node native scope // node native scope
const path_1 = __importDefault(require("path")); import * as path from 'path';
exports.path = path_1.default; export { path };
// @pushrocks scope // @pushrocks scope
const smartfile = __importStar(require("@pushrocks/smartfile")); import * as smartfile from '@push.rocks/smartfile';
exports.smartfile = smartfile; import * as smartpath from '@push.rocks/smartpath';
const smartpath = __importStar(require("@pushrocks/smartpath")); import * as smartpromise from '@push.rocks/smartpromise';
exports.smartpath = smartpath; import * as smartrequest from '@push.rocks/smartrequest';
import * as smartunique from '@push.rocks/smartunique';
import * as smartstream from '@push.rocks/smartstream';
import * as smartrx from '@push.rocks/smartrx';
export { smartfile, smartpath, smartpromise, smartrequest, smartunique, smartstream, smartrx };
// third party scope // third party scope
const tar_1 = __importDefault(require("tar")); import gunzipMaybe from 'gunzip-maybe';
exports.tar = tar_1.default; // @ts-ignore
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhcmNoaXZlLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFyY2hpdmUucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxvQkFBb0I7QUFDcEIsZ0RBQXdCO0FBRWYsZUFGRixjQUFJLENBRUU7QUFFYixtQkFBbUI7QUFDbkIsZ0VBQWtEO0FBR3pDLDhCQUFTO0FBRmxCLGdFQUFrRDtBQUU5Qiw4QkFBUztBQUU3QixvQkFBb0I7QUFDcEIsOENBQXNCO0FBRWIsY0FGRixhQUFHLENBRUUifQ== import tar from 'tar';
import tarStream from 'tar-stream';
export { gunzipMaybe, tar, tarStream };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhcmNoaXZlLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFyY2hpdmUucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBRWhCLG1CQUFtQjtBQUNuQixPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUUvRixvQkFBb0I7QUFDcEIsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBRXZDLGFBQWE7QUFDYixPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDdEIsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=

View File

@ -7,10 +7,10 @@
"projectType": "npm", "projectType": "npm",
"module": { "module": {
"githost": "gitlab.com", "githost": "gitlab.com",
"gitscope": "pushrocks", "gitscope": "push.rocks",
"gitrepo": "smartarchive", "gitrepo": "smartarchive",
"shortDescription": "work with archives", "description": "work with archives",
"npmPackagename": "@pushrocks/smartarchive", "npmPackagename": "@push.rocks/smartarchive",
"license": "MIT" "license": "MIT"
} }
} }

13026
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,14 @@
{ {
"name": "@pushrocks/smartarchive", "name": "@push.rocks/smartarchive",
"version": "1.0.13", "version": "3.0.8",
"description": "work with archives", "description": "work with archives",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts", "typings": "dist_ts/index.d.ts",
"type": "module",
"scripts": { "scripts": {
"test": "tstest test/", "test": "(tstest test/ --web)",
"build": "tsbuild" "build": "tsbuild --web --allowimplicitany",
"buildDocs": "tsdoc"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -19,25 +21,24 @@
}, },
"homepage": "https://github.com/pushrocks/smartarchive#readme", "homepage": "https://github.com/pushrocks/smartarchive#readme",
"dependencies": { "dependencies": {
"@pushrocks/smartfile": "^8.0.9", "@push.rocks/smartfile": "^10.0.28",
"@pushrocks/smartpath": "^4.0.3", "@push.rocks/smartpath": "^5.0.11",
"@pushrocks/smartrequest": "^1.1.51", "@push.rocks/smartpromise": "^4.0.3",
"@pushrocks/smartrx": "^2.0.19", "@push.rocks/smartrequest": "^2.0.18",
"@pushrocks/smartunique": "^3.0.3", "@push.rocks/smartrx": "^3.0.6",
"@pushrocks/streamfunction": "^2.0.1", "@push.rocks/smartstream": "^2.0.4",
"@push.rocks/smartunique": "^3.0.3",
"@types/gunzip-maybe": "^1.4.0", "@types/gunzip-maybe": "^1.4.0",
"@types/tar": "^4.0.4", "@types/tar-stream": "^2.2.2",
"@types/tar-stream": "^2.2.0",
"gunzip-maybe": "^1.4.2", "gunzip-maybe": "^1.4.2",
"tar": "^6.1.0", "tar": "^6.1.15",
"tar-stream": "^2.2.0" "tar-stream": "^3.1.6"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.25", "@gitzone/tsbuild": "^2.1.66",
"@gitzone/tstest": "^1.0.52", "@gitzone/tsrun": "^1.2.44",
"@pushrocks/tapbundle": "^3.2.14", "@gitzone/tstest": "^1.0.77",
"tslint": "^6.1.3", "@push.rocks/tapbundle": "^5.0.12"
"tslint-config-prettier": "^1.18.0"
}, },
"private": false, "private": false,
"files": [ "files": [

4971
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,27 +1,26 @@
# @pushrocks/smartarchive # @push.rocks/smartarchive
work with archives work with archives
## Availabililty and Links ## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartarchive) * [npmjs.org (npm package)](https://www.npmjs.com/package/@push.rocks/smartarchive)
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartarchive) * [gitlab.com (source)](https://gitlab.com/push.rocks/smartarchive)
* [github.com (source mirror)](https://github.com/pushrocks/smartarchive) * [github.com (source mirror)](https://github.com/push.rocks/smartarchive)
* [docs (typedoc)](https://pushrocks.gitlab.io/smartarchive/) * [docs (typedoc)](https://push.rocks.gitlab.io/smartarchive/)
## Status for master ## Status for master
Status Category | Status Badge Status Category | Status Badge
-- | -- -- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/pushrocks/smartarchive/badges/master/pipeline.svg)](https://lossless.cloud) GitLab Pipelines | [![pipeline status](https://gitlab.com/push.rocks/smartarchive/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/pushrocks/smartarchive/badges/master/coverage.svg)](https://lossless.cloud) GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/push.rocks/smartarchive/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@pushrocks/smartarchive)](https://lossless.cloud) npm | [![npm downloads per month](https://badgen.net/npm/dy/@push.rocks/smartarchive)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/pushrocks/smartarchive)](https://lossless.cloud) Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/push.rocks/smartarchive)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](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/) 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) 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/smartarchive)](https://lossless.cloud) PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@push.rocks/smartarchive)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@pushrocks/smartarchive)](https://lossless.cloud) PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@push.rocks/smartarchive)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@pushrocks/smartarchive)](https://lossless.cloud) BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@push.rocks/smartarchive)](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 ## Usage
@ -50,7 +49,6 @@ We are always happy for code contributions. If you are not the code contributing
For further information read the linked docs at the top of this readme. For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh) ## Legal
> MIT licensed | **&copy;** [Task Venture Capital GmbH](https://task.vc)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy) | 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

@ -1,8 +1,9 @@
import { tap, expect } from '@pushrocks/tapbundle'; import { tap, expect } from '@push.rocks/tapbundle';
import * as path from 'path'; import * as path from 'path';
import * as smartfile from '@pushrocks/smartfile'; import * as smartpath from '@push.rocks/smartpath';
import * as smartrequest from '@pushrocks/smartrequest'; import * as smartfile from '@push.rocks/smartfile';
import * as smartrequest from '@push.rocks/smartrequest';
const testPlugins = { const testPlugins = {
path, path,
@ -11,11 +12,17 @@ const testPlugins = {
}; };
const testPaths = { const testPaths = {
nogitDir: testPlugins.path.join(__dirname, '../.nogit/'), nogitDir: testPlugins.path.join(
remoteDir: testPlugins.path.join(__dirname, '../.nogit/remote'), smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
'../.nogit/'
),
remoteDir: testPlugins.path.join(
smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
'../.nogit/remote'
),
}; };
import * as smartarchive from '../ts/index'; import * as smartarchive from '../ts/index.js';
tap.preTask('should prepare .nogit dir', async () => { tap.preTask('should prepare .nogit dir', async () => {
await testPlugins.smartfile.fs.ensureDir(testPaths.remoteDir); await testPlugins.smartfile.fs.ensureDir(testPaths.remoteDir);
@ -24,7 +31,7 @@ tap.preTask('should prepare .nogit dir', async () => {
tap.preTask('should prepare downloads', async (tools) => { tap.preTask('should prepare downloads', async (tools) => {
const downloadedFile: Buffer = ( const downloadedFile: Buffer = (
await testPlugins.smartrequest.getBinary( await testPlugins.smartrequest.getBinary(
'https://verdaccio.lossless.one/@pushrocks%2fwebsetup/-/websetup-2.0.14.tgz' 'https://verdaccio.lossless.digital/@pushrocks%2fwebsetup/-/websetup-2.0.14.tgz'
) )
).body; ).body;
await testPlugins.smartfile.memory.toFs( await testPlugins.smartfile.memory.toFs(
@ -44,12 +51,13 @@ tap.test('should extract existing files on disk', async () => {
tap.test('should download a package from the registry', async () => { tap.test('should download a package from the registry', async () => {
const testSmartarchive = new smartarchive.SmartArchive(); const testSmartarchive = new smartarchive.SmartArchive();
await testSmartarchive.extractArchiveFromUrlToFs( await testSmartarchive.extractArchiveFromUrlToFs(
'https://verdaccio.lossless.one/@pushrocks%2fsmartfile/-/smartfile-7.0.11.tgz', 'https://verdaccio.lossless.digital/@pushrocks%2fsmartfile/-/smartfile-7.0.11.tgz',
testPaths.remoteDir testPaths.remoteDir
); );
}); });
tap.test('should extract a package using tarStream', async () => { tap.test('should extract a package using tarStream', async (tools) => {
const done = tools.defer();
const testSmartarchive = new smartarchive.SmartArchive(); const testSmartarchive = new smartarchive.SmartArchive();
const testTgzBuffer = ( const testTgzBuffer = (
await testPlugins.smartfile.Smartfile.fromFilePath( await testPlugins.smartfile.Smartfile.fromFilePath(
@ -59,10 +67,38 @@ tap.test('should extract a package using tarStream', async () => {
const extractionFileObservable = await testSmartarchive.extractArchiveFromBufferToObservable( const extractionFileObservable = await testSmartarchive.extractArchiveFromBufferToObservable(
testTgzBuffer testTgzBuffer
); );
const subscription = extractionFileObservable.subscribe(file => { const subscription = extractionFileObservable.subscribe(
console.log(file.path); (file) => {
console.log(file.path);
}); },
(err) => {
console.log(err);
},
() => {
done.resolve();
}
);
await done.promise;
});
tap.test('should extract a file from url to replaySubject', async (tools) => {
const done = tools.defer();
const testSmartarchive = new smartarchive.SmartArchive();
const extractionFileObservable = await testSmartarchive.extractArchiveFromUrlToObservable(
'https://verdaccio.lossless.digital/@pushrocks%2fwebsetup/-/websetup-2.0.14.tgz'
);
const subscription = extractionFileObservable.subscribe(
(file) => {
console.log(file.path);
},
(err) => {
console.log(err);
},
() => {
done.resolve();
}
);
await done.promise;
}); });
tap.start(); tap.start();

8
ts/00_commitinfo_data.ts Normal file
View File

@ -0,0 +1,8 @@
/**
* autocreated commitinfo by @pushrocks/commitinfo
*/
export const commitinfo = {
name: '@push.rocks/smartarchive',
version: '3.0.8',
description: 'work with archives'
}

View File

@ -1 +1 @@
export * from './smartarchive.classes.smartarchive'; export * from './smartarchive.classes.smartarchive.js';

View File

@ -1,9 +1,7 @@
import * as plugins from './smartarchive.plugins'; import * as plugins from './smartarchive.plugins.js';
import * as paths from './smartarchive.paths'; import * as paths from './smartarchive.paths.js';
import { extract } from 'tar';
export class SmartArchive { export class SmartArchive {
public archiveDirectory: string;
constructor() {} constructor() {}
/** /**
@ -12,6 +10,7 @@ export class SmartArchive {
public async extractArchiveFromUrlToFs(urlArg: string, targetDir: string) { public async extractArchiveFromUrlToFs(urlArg: string, targetDir: string) {
const parsedPath = plugins.path.parse(urlArg); const parsedPath = plugins.path.parse(urlArg);
const uniqueFileName = plugins.smartunique.uni() + parsedPath.ext; const uniqueFileName = plugins.smartunique.uni() + parsedPath.ext;
plugins.smartfile.fs.ensureDir(paths.nogitDir); // TODO: totally remove caching needs
const downloadPath = plugins.path.join(paths.nogitDir, uniqueFileName); const downloadPath = plugins.path.join(paths.nogitDir, uniqueFileName);
const downloadedArchive = (await plugins.smartrequest.getBinary(urlArg)).body; const downloadedArchive = (await plugins.smartrequest.getBinary(urlArg)).body;
await plugins.smartfile.memory.toFs(downloadedArchive, downloadPath); await plugins.smartfile.memory.toFs(downloadedArchive, downloadPath);
@ -22,28 +21,52 @@ export class SmartArchive {
/** /**
* extracts an archive from a given filePath on disk * extracts an archive from a given filePath on disk
* @param filePathArg * @param filePathArg
* @param targetDir * @param targetDirArg
*/ */
public async extractArchiveFromFilePathToFs(filePathArg: string, targetDir: string) { public async extractArchiveFromFilePathToFs(filePathArg: string, targetDirArg: string) {
const parsedPath = plugins.path.parse(filePathArg); console.log(`extracting ${filePathArg}`);
switch (parsedPath.ext) { const done = plugins.smartpromise.defer();
case '.tgz': filePathArg = plugins.smartpath.transform.makeAbsolute(filePathArg);
console.log(`detected a .tgz archive`); targetDirArg = plugins.smartpath.transform.makeAbsolute(targetDirArg);
await plugins.tar.extract({ const readableStream = plugins.smartfile.fsStream.createReadStream(filePathArg);
file: filePathArg, const extractPipeStop = plugins.tarStream.extract();
cwd: targetDir, extractPipeStop.on('entry', async (header, stream, next) => {
}); const targetFilePath = plugins.path.join(targetDirArg, header.name);
break; const parsedPath = plugins.path.parse(targetFilePath);
} await plugins.smartfile.fs.ensureDir(parsedPath.dir);
const writeStream = plugins.smartfile.fsStream.createWriteStream(targetFilePath);
stream.pipe(writeStream);
stream.on('end', () => {
console.log(`extracted ${header.name}`);
next();
});
stream.resume();
});
extractPipeStop.on('finish', () => {
console.log(`Sucessfully extracted ${filePathArg}!`);
done.resolve();
});
// lets run the stream
readableStream.pipe(plugins.gunzipMaybe()).pipe(extractPipeStop);
await done.promise;
} }
/** /**
* extracts to Observable * extracts to Observable
* where the Observable is emitting smartfiles
*/ */
public async extractArchiveFromBufferToObservable( public async extractArchiveFromBufferToObservable(
bufferArg: Buffer bufferArg: Buffer
): Promise<plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>> { ): Promise<plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>> {
const intake = new plugins.streamfunction.Intake(); const { intake, replaySubject } = this.extractArchiveWithIntakeAndReplaySubject();
intake.pushData(bufferArg);
intake.signalEnd();
return replaySubject;
}
extractArchiveWithIntakeAndReplaySubject() {
const intake = new plugins.smartstream.StreamIntake<Buffer>();
const replaySubject = new plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>(); const replaySubject = new plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>();
const readableStream = intake.getReadableStream(); const readableStream = intake.getReadableStream();
const extractPipeStop = plugins.tarStream.extract(); const extractPipeStop = plugins.tarStream.extract();
@ -59,8 +82,9 @@ export class SmartArchive {
stream.on('end', () => { stream.on('end', () => {
replaySubject.next( replaySubject.next(
new plugins.smartfile.Smartfile({ new plugins.smartfile.Smartfile({
base: null, // no working directory for this one
contentBuffer: fileBuffer, contentBuffer: fileBuffer,
path: header.name, path: `${header.name}`,
}) })
); );
next(); next();
@ -68,14 +92,42 @@ export class SmartArchive {
stream.resume(); stream.resume();
}); });
extractPipeStop.on('finish', () => { extractPipeStop.on('finish', () => {
replaySubject.unsubscribe(); replaySubject.complete();
}); });
// lets run the stream // lets run the stream
readableStream readableStream.pipe(plugins.gunzipMaybe()).pipe(extractPipeStop);
.pipe(plugins.gunzipMaybe()) return {
.pipe(extractPipeStop); intake,
intake.pushData(bufferArg); replaySubject,
intake.signalEnd(); };
}
/**
* extracts to Observable
*/
public async extractArchiveFromUrlToObservable(
urlArg: string
): Promise<plugins.smartrx.rxjs.ReplaySubject<plugins.smartfile.Smartfile>> {
const response = await plugins.smartrequest.getBinary(urlArg);
const replaySubject = this.extractArchiveFromBufferToObservable(response.body);
return replaySubject; return replaySubject;
} }
// TODO
public async extractArchiveFromUrlToStream() {}
// TODO
public async extractArchiveFromFilePathToStream() {}
// TODO
public async extractArchiveFromStreamToStream() {}
// TODO
public async packFromStreamToStream() {}
// TODO
public async packFromDirPathToStream() {}
// TODO
public async packFromDirPathToFs() {}
} }

View File

@ -1,5 +1,7 @@
import * as plugins from './smartarchive.plugins'; import * as plugins from './smartarchive.plugins.js';
export const packageDir = plugins.path.join(__dirname, '../'); export const packageDir = plugins.path.join(
export const nogitDir = plugins.path.join(__dirname, './.nogit'); plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
plugins.smartfile.fs.ensureDir(nogitDir); '../'
);
export const nogitDir = plugins.path.join(packageDir, './.nogit');

View File

@ -1,20 +1,23 @@
// node native scope // node native scope
import path from 'path'; import * as path from 'path';
export { path }; export { path };
// @pushrocks scope // @pushrocks scope
import * as smartfile from '@pushrocks/smartfile'; import * as smartfile from '@push.rocks/smartfile';
import * as smartpath from '@pushrocks/smartpath'; import * as smartpath from '@push.rocks/smartpath';
import * as smartrequest from '@pushrocks/smartrequest'; import * as smartpromise from '@push.rocks/smartpromise';
import * as smartunique from '@pushrocks/smartunique'; import * as smartrequest from '@push.rocks/smartrequest';
import * as streamfunction from '@pushrocks/streamfunction'; import * as smartunique from '@push.rocks/smartunique';
import * as smartrx from '@pushrocks/smartrx'; import * as smartstream from '@push.rocks/smartstream';
import * as smartrx from '@push.rocks/smartrx';
export { smartfile, smartpath, smartrequest, smartunique, streamfunction, smartrx }; export { smartfile, smartpath, smartpromise, smartrequest, smartunique, smartstream, smartrx };
// third party scope // third party scope
import gunzipMaybe from 'gunzip-maybe'; import gunzipMaybe from 'gunzip-maybe';
// @ts-ignore
import tar from 'tar'; import tar from 'tar';
import tarStream from 'tar-stream'; import tarStream from 'tar-stream';

9
tsconfig.json Normal file
View File

@ -0,0 +1,9 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"useDefineForClassFields": false,
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "nodenext"
}
}

View File

@ -1,17 +0,0 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}