Compare commits

...

75 Commits

Author SHA1 Message Date
3444b7c74d update description 2024-05-29 14:12:05 +02:00
bf76b225c6 1.0.34 2024-05-06 13:45:06 +02:00
3bad722c25 fix(core): update 2024-05-06 13:45:06 +02:00
28ba176b62 update tsconfig 2024-04-14 17:24:25 +02:00
da500d7fd4 update npmextra.json: githost 2024-04-01 21:34:07 +02:00
6aaf66ac5c update npmextra.json: githost 2024-04-01 19:57:48 +02:00
34ba87a1fb update npmextra.json: githost 2024-03-30 21:46:46 +01:00
8cd846e8bf 1.0.33 2024-02-29 14:42:34 +01:00
d98c54fba9 fix(core): update 2024-02-29 14:42:33 +01:00
50b0fd357a 1.0.32 2024-01-28 17:25:48 +01:00
42976a32d7 fix(core): update 2024-01-28 17:25:47 +01:00
b214de9370 1.0.31 2024-01-28 02:11:50 +01:00
3d98c2ba6f fix(core): update 2024-01-28 02:11:49 +01:00
e4a349c85e 1.0.30 2024-01-28 01:24:00 +01:00
2abfa7c47a fix(core): update 2024-01-28 01:23:59 +01:00
50aa0a136a 1.0.29 2024-01-28 01:19:58 +01:00
b98a9be2b7 fix(core): update 2024-01-28 01:19:57 +01:00
3314928c5f 1.0.28 2024-01-28 01:18:39 +01:00
0b7c29eae7 fix(core): update 2024-01-28 01:18:39 +01:00
779e495941 switch to new org scheme 2023-07-11 00:23:30 +02:00
8402deeccb switch to new org scheme 2023-07-10 02:42:35 +02:00
7c4324b3ad 1.0.27 2021-12-01 02:04:21 +01:00
268201727c fix(core): update 2021-12-01 02:04:21 +01:00
12ae27b2ff 1.0.26 2021-12-01 01:53:29 +01:00
3bb9b2229d fix(core): update 2021-12-01 01:53:28 +01:00
e17e4c376e 1.0.25 2021-11-30 02:35:49 +01:00
d5f2427aad fix(core): update 2021-11-30 02:35:49 +01:00
5715c6fe67 1.0.24 2021-11-29 20:27:00 +01:00
9628e914b5 fix(core): update 2021-11-29 20:26:59 +01:00
55746f5d92 1.0.23 2019-09-29 16:35:12 +02:00
90ae869686 fix(core): update 2019-09-29 16:35:12 +02:00
771c454411 1.0.22 2019-08-22 10:54:26 +02:00
99395794d8 fix(core): update 2019-08-22 10:54:26 +02:00
1763ede6df 1.0.21 2019-08-22 10:53:29 +02:00
102b6ac9ae fix(core): update 2019-08-22 10:53:29 +02:00
cd9ca458f6 1.0.20 2019-06-04 14:04:07 +02:00
2c4fc8b212 fix(core): update 2019-06-04 14:04:06 +02:00
ce48b6f889 1.0.19 2019-06-04 13:59:54 +02:00
2e851cbabc fix(core): update 2019-06-04 13:59:54 +02:00
4c001f5270 1.0.18 2019-05-05 20:54:02 +02:00
dfbbe8090f fix(core): update 2019-05-05 20:54:02 +02:00
40dd48533d 1.0.17 2019-05-05 20:46:25 +02:00
1e252d2cd7 fix(core): update 2019-05-05 20:46:25 +02:00
34eb725d40 1.0.16 2019-05-05 20:41:29 +02:00
0298bfe3c6 fix(core): update 2019-05-05 20:41:29 +02:00
ea26987ca6 1.0.15 2018-10-10 17:06:40 +02:00
8f6a4f4909 fix(core): update 2018-10-10 17:06:40 +02:00
c7b0722155 1.0.14 2018-03-01 00:19:22 +01:00
6cbd74eb12 update ci 2018-03-01 00:19:18 +01:00
fe52811dcd 1.0.13 2018-03-01 00:17:37 +01:00
9c1e306c99 update ci 2018-03-01 00:17:33 +01:00
19ab839853 1.0.12 2018-03-01 00:08:11 +01:00
cb6c8f3c8e update ci 2018-03-01 00:08:08 +01:00
9e06369139 1.0.11 2017-06-30 20:32:59 +02:00
7d4975cea8 fix Promise issues 2017-06-30 20:32:35 +02:00
af9eb0d99e update test 2017-06-30 18:20:48 +02:00
46e7b52930 update 2017-06-30 18:16:59 +02:00
bf7ec659b7 1.0.10 2017-06-30 18:12:02 +02:00
ab3ad55c43 fix loading of rxjs 2017-06-30 18:12:00 +02:00
5e5f2ce6c2 clean up code 2017-06-30 18:06:37 +02:00
89566ebc1d 1.0.9 2017-06-30 18:05:57 +02:00
fda93fa553 update to wirj like expected 2017-06-30 18:05:55 +02:00
583cf6f446 1.0.8 2017-04-09 16:59:14 +02:00
8d87616971 update ci 2017-04-09 16:59:10 +02:00
e3e70a680e 1.0.7 2017-04-09 16:57:53 +02:00
49e7146320 update npmextra.json 2017-04-09 16:57:49 +02:00
1f1fef1610 1.0.6 2017-04-09 16:51:36 +02:00
1365676a12 update to new gitzone standard 2017-04-09 16:51:33 +02:00
44dd315c6f 1.0.5 2017-02-15 22:00:59 +01:00
722bd0ea61 update dependencies 2017-02-15 21:58:34 +01:00
c6104ed00e 1.0.4 2016-11-19 00:41:08 +01:00
69149a717b improve README 2016-11-19 00:41:05 +01:00
aed6e12270 1.0.3 2016-11-19 00:36:56 +01:00
396853f7c4 add README 2016-11-19 00:36:48 +01:00
Phil Kunz
40f1e2c938 Update .gitlab-ci.yml 2016-09-28 18:21:45 +00:00
24 changed files with 6389 additions and 362 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 @git.zone/tsdoc
npmci command tsdoc
continue-on-error: true

22
.gitignore vendored
View File

@ -1,4 +1,20 @@
node_modules/
pages/
public/
.nogit/
# artifacts
coverage/
public/
pages/
# installs
node_modules/
# caches
.yarn/
.cache/
.rpt2_cache
# builds
dist/
dist_*/
# custom

View File

@ -1,44 +0,0 @@
image: hosttoday/ht-docker-node:npmts
stages:
- test
- release
- page
testLEGACY:
stage: test
script:
- npmci test legacy
tags:
- docker
testLTS:
stage: test
script:
- npmci test lts
tags:
- docker
testSTABLE:
stage: test
script:
- npmci test stable
tags:
- docker
release:
stage: release
environment: npmjs-com_registry
script:
- npmci publish
only:
- tags
tags:
- docker
pages:
image: hosttoday/ht-docker-node:npmpage
stage: page
script:
- npmci command npmpage --host gitlab
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public

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

@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "npm test",
"name": "Run npm test",
"request": "launch",
"type": "node-terminal"
}
]
}

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

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

36
dist/index.d.ts vendored
View File

@ -1,36 +0,0 @@
/// <reference types="chokidar" />
/// <reference types="q" />
import * as plugins from './smartchok.plugins';
import { Stringmap } from 'lik';
export declare type TSmartchokStatus = 'idle' | 'starting' | 'watching';
export declare type TFsEvent = 'add' | 'addDir' | 'change' | 'error' | 'unlink' | 'unlinkDir' | 'ready' | 'raw';
export declare class Smartchok {
watchStringmap: Stringmap;
chokidarOptions: plugins.chokidar.WatchOptions;
status: TSmartchokStatus;
private watcher;
private watchingDeferred;
private eventObservablemap;
constructor(watchArrayArg: string[], optionsArg?: plugins.chokidar.WatchOptions);
/**
* adds files to the list of watched files
*/
add(pathArrayArg: string[]): void;
/**
* removes files from the list of watched files
*/
remove(pathArg: string): void;
/**
* gets an observable for a certain event
*/
getObservableFor(fsEvent: TFsEvent): plugins.q.Promise<plugins.rx.Observable<any>>;
/**
* starts the watcher
* @returns Promise<void>
*/
start(): plugins.q.Promise<void>;
/**
* stop the watcher process if watching
*/
stop(): void;
}

76
dist/index.js vendored
View File

@ -1,76 +0,0 @@
"use strict";
const plugins = require("./smartchok.plugins");
const lik_1 = require("lik");
class Smartchok {
constructor(watchArrayArg, optionsArg = {}) {
this.watchStringmap = new lik_1.Stringmap();
this.status = 'idle';
this.watchingDeferred = plugins.q.defer(); // used to run things when watcher is initialized
this.eventObservablemap = new plugins.lik.Observablemap(); // register one observable per event
this.watchStringmap.addStringArray(watchArrayArg);
this.chokidarOptions = optionsArg;
}
/**
* adds files to the list of watched files
*/
add(pathArrayArg) {
this.watchStringmap.addStringArray(pathArrayArg);
if (this.status !== 'idle') {
this.watchingDeferred.promise.then(() => {
this.watcher.add(pathArrayArg);
});
}
}
/**
* removes files from the list of watched files
*/
remove(pathArg) {
this.watchStringmap.removeString(''); // TODO
this.watchingDeferred.promise.then(() => {
this.watcher.unwatch(pathArg);
});
}
/**
* gets an observable for a certain event
*/
getObservableFor(fsEvent) {
let done = plugins.q.defer();
this.watchingDeferred.promise.then(() => {
let eventObservable = this.eventObservablemap.getObservableForEmitterEvent(this.watcher, fsEvent);
done.resolve(eventObservable);
});
return done.promise;
}
/**
* starts the watcher
* @returns Promise<void>
*/
start() {
let done = plugins.q.defer();
this.status = 'starting';
this.watcher = plugins.chokidar.watch(this.watchStringmap.getStringArray(), this.chokidarOptions);
this.watcher.on('ready', () => {
this.status = 'watching';
this.watchingDeferred.resolve();
done.resolve();
});
return done.promise;
}
/**
* stop the watcher process if watching
*/
stop() {
let closeWatcher = () => {
this.watcher.close();
};
if (this.status === 'watching') {
console.log('closing while watching');
closeWatcher();
}
else if (this.status === 'starting') {
this.watchingDeferred.promise.then(() => { closeWatcher(); });
}
}
}
exports.Smartchok = Smartchok;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQThDO0FBQzlDLDZCQUErQjtBQUsvQjtJQVFJLFlBQVksYUFBdUIsRUFBRSxVQUFVLEdBQWtDLEVBQUU7UUFQbkYsbUJBQWMsR0FBRyxJQUFJLGVBQVMsRUFBRSxDQUFBO1FBRWhDLFdBQU0sR0FBcUIsTUFBTSxDQUFBO1FBRXpCLHFCQUFnQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFRLENBQUEsQ0FBQyxpREFBaUQ7UUFDNUYsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBLENBQUMsb0NBQW9DO1FBRzdGLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBQyxZQUFzQjtRQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNoRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2xDLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQztJQUVMLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFlO1FBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsT0FBTztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqQyxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLE9BQWlCO1FBQzlCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUE4QixDQUFBO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQy9CLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ2pHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDakMsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFRLENBQUE7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUE7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNqRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUE7WUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQy9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsQixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDQSxJQUFJLFlBQVksR0FBRztZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDeEIsQ0FBQyxDQUFBO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtZQUNyQyxZQUFZLEVBQUUsQ0FBQTtRQUNsQixDQUFDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLFlBQVksRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQTlFRCw4QkE4RUMifQ==

View File

@ -1,6 +0,0 @@
import 'typings-global';
export import chokidar = require('chokidar');
export import lik = require('lik');
export import path = require('path');
export import q = require('q');
export import rx = require('rxjs/Rx');

View File

@ -1,8 +0,0 @@
"use strict";
require("typings-global");
exports.chokidar = require("chokidar");
exports.lik = require("lik");
exports.path = require("path");
exports.q = require("q");
exports.rx = require("rxjs/Rx");
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjaG9rLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGNob2sucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBQ3ZCLHVDQUE0QztBQUM1Qyw2QkFBa0M7QUFDbEMsK0JBQW9DO0FBQ3BDLHlCQUE4QjtBQUM5QixnQ0FBcUMifQ==

View File

@ -1,5 +1,32 @@
{
"npmts": {
"mode": "default"
"npmci": {
"npmGlobalTools": [],
"npmAccessLevel": "public"
},
"gitzone": {
"projectType": "npm",
"module": {
"githost": "code.foss.global",
"gitscope": "push.rocks",
"gitrepo": "smartchok",
"description": "A smart wrapper for chokidar to facilitate file watching with enhanced features.",
"npmPackagename": "@push.rocks/smartchokidar",
"license": "MIT",
"keywords": [
"file watching",
"chokidar",
"filesystem",
"observable",
"typescript",
"node.js",
"development tool",
"file system events",
"real-time",
"watch files"
]
}
},
"tsdoc": {
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
}
}

View File

@ -1,36 +1,66 @@
{
"name": "smartchok",
"version": "1.0.2",
"description": "smart wrapper for chokidar",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"name": "@push.rocks/smartchok",
"version": "1.0.34",
"private": false,
"description": "A smart wrapper for chokidar to facilitate file watching with enhanced features.",
"main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts",
"scripts": {
"test": "(npm run prepareTest && npmts)",
"prepareTest": "(rm -f ./test/assets/hi.txt)"
"test": "(npm run prepareTest && tstest test/)",
"prepareTest": "(rm -f ./test/assets/hi.txt)",
"build": "tsbuild",
"buildDocs": "tsdoc"
},
"repository": {
"type": "git",
"url": "git+ssh://git@gitlab.com/pushrocks/smartchok.git"
"url": "https://code.foss.global/push.rocks/smartchok.git"
},
"author": "Lossless GmbH",
"license": "MIT",
"bugs": {
"url": "https://gitlab.com/pushrocks/smartchok/issues"
"url": "https://gitlab.com/push.rocks/smartchok/issues"
},
"homepage": "https://gitlab.com/pushrocks/smartchok#README",
"homepage": "https://code.foss.global/push.rocks/smartchok",
"dependencies": {
"@types/chokidar": "^1.4.29",
"@types/q": "0.0.31",
"chokidar": "^1.6.0",
"lik": "^1.0.20",
"q": "^1.4.1",
"rxjs": "^5.0.0-beta.12",
"typings-global": "^1.0.14"
"@push.rocks/lik": "^6.0.2",
"@push.rocks/smartpromise": "^4.0.2",
"@push.rocks/smartrx": "^3.0.2",
"@tempfix/watcher": "^2.3.0"
},
"devDependencies": {
"@types/should": "^8.1.30",
"should": "^11.1.0",
"smartfile": "^4.0.20",
"typings-test": "^1.0.3"
}
}
"@git.zone/tsbuild": "^2.1.66",
"@git.zone/tsrun": "^1.2.44",
"@git.zone/tstest": "^1.0.77",
"@push.rocks/smartfile": "^11.0.4",
"@push.rocks/tapbundle": "^5.0.8",
"@types/node": "^20.11.8"
},
"files": [
"ts/**/*",
"ts_web/**/*",
"dist/**/*",
"dist_*/**/*",
"dist_ts/**/*",
"dist_ts_web/**/*",
"assets/**/*",
"cli.js",
"npmextra.json",
"readme.md"
],
"browserslist": [
"last 1 chrome versions"
],
"type": "module",
"keywords": [
"file watching",
"chokidar",
"filesystem",
"observable",
"typescript",
"node.js",
"development tool",
"file system events",
"real-time",
"watch files"
]
}

5697
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

1
readme.hints.md Normal file
View File

@ -0,0 +1 @@

133
readme.md Normal file
View File

@ -0,0 +1,133 @@
# @push.rocks/smartchok
smart wrapper for chokidar
## Install
Install the package by running the following command in your terminal:
```sh
npm install @push.rocks/smartchok --save
```
This command adds `@push.rocks/smartchok` to your project's dependencies, ensuring that your project can use its functionality and that it will be installed when running `npm install` in your project root.
## Usage
The `@push.rocks/smartchok` package provides a convenient and smart wrapper around the popular `chokidar` library for file watching with enhanced features such as observable support for filesystem events. This guide will introduce you to the usage of `@push.rocks/smartchok`, leveraging TypeScript for type safety and better developer experience.
### Setting Up Your Project
To use `@push.rocks/smartchok`, ensure your project is set up to use TypeScript and ECMAScript modules (ESM). You need to have a `tsconfig.json` file at the root of your project with the following minimum settings:
```json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"esModuleInterop": true,
"declaration": true,
"outDir": "./dist",
"strict": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
```
This configuration enables TypeScript compilation targeting the latest ECMAScript standards and includes all TypeScript files (`*.ts`) in your `src` directory.
### Basic Setup
To start using `smartchok`, first import it into your TypeScript file:
```typescript
import { Smartchok } from '@push.rocks/smartchok';
```
#### Initializing Smartchok
Create an instance of `Smartchok` by specifying an array of glob patterns to watch:
```typescript
const smartchokInstance = new Smartchok([
'./src/**/*.ts', // Watch all TypeScript files in the src directory
'./public/assets/**/*' // Watch all files in the public/assets directory
]);
```
#### Adding and Removing Files Dynamically
You can dynamically add and remove paths from being watched by using the `add` and `remove` methods:
```typescript
// Add additional files or patterns
smartchokInstance.add(['./tests/**/*.spec.ts']);
// Remove specific patterns from watch
smartchokInstance.remove('./src/**/*.test.ts');
```
#### Handling Filesystem Events
`smartchok` leverages RxJS observables to notify about filesystem events. This allows you to respond to various events such as file additions, changes, and deletions with ease.
First, start the watcher:
```typescript
await smartchokInstance.start();
```
Then, subscribe to an event:
```typescript
const changeObservable = await smartchokInstance.getObservableFor('change');
changeObservable.subscribe({
next: ([path, stats]) => {
console.log(`File changed: ${path}`);
},
error: (err) => {
console.error(`An error occurred: ${err}`);
}
});
```
Supported events include 'add', 'change', 'unlink' (for deletions), and others. Refer to the chokidar documentation for a full list of events.
#### Stopping the Watcher
To stop watching for file changes, simply call:
```typescript
await smartchokInstance.stop();
```
### Advanced Usage
Beyond the basics, `smartchok` allows for more complex monitoring scenarios, such as debounced notifications for rapid changes, filtering events, and integrating with other observables for complex asynchronous workflows.
### Conclusion
`@push.rocks/smartchok` provides a robust, observable-based wrapper around `chokidar`, making it an excellent choice for projects requiring efficient and flexible file monitoring. Its integration with RxJS opens up a wide array of possibilities for handling file system events in a reactive manner, making your code more concise, readable, and maintainable.
By following the guidelines provided in this document, you should now be equipped to integrate `@push.rocks/smartchok` into your TypeScript project, enhancing its capabilities with efficient file system monitoring.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

1
test/test.d.ts vendored
View File

@ -1 +0,0 @@
import 'typings-test';

View File

@ -1,35 +0,0 @@
"use strict";
require("typings-test");
const should = require("should");
const smartfile = require("smartfile");
const smartchok = require("../dist/index");
describe('smartchok', function () {
let testSmartchok;
let testAddObservable;
let testSubscription;
it('should create a new instance', function () {
testSmartchok = new smartchok.Smartchok([]);
should(testSmartchok).be.instanceof(smartchok.Smartchok);
});
it('should add some files to watch and start', function (done) {
testSmartchok.add(['./test/assets/**/*.txt']);
testSmartchok.start().then(() => { done(); }).catch(err => { console.log(err); });
});
it('should get an observable for a certain event', function (done) {
testSmartchok.getObservableFor('add').then((observableArg) => {
testAddObservable = observableArg;
done();
}).catch(err => { console.log(err); });
});
it('should register an add operation', function (done) {
this.timeout(5000);
testSubscription = testAddObservable.subscribe(x => {
done();
});
smartfile.memory.toFs('HI', './test/assets/hi.txt');
});
it('should stop the watch process', function () {
testSmartchok.stop();
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFDaEMsdUNBQXNDO0FBRXRDLDJDQUEwQztBQUUxQyxRQUFRLENBQUMsV0FBVyxFQUFDO0lBQ2pCLElBQUksYUFBa0MsQ0FBQTtJQUN0QyxJQUFJLGlCQUFxQyxDQUFBO0lBQ3pDLElBQUksZ0JBQWlDLENBQUE7SUFDckMsRUFBRSxDQUFDLDhCQUE4QixFQUFDO1FBQzlCLGFBQWEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDM0MsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzVELENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLDBDQUEwQyxFQUFDLFVBQVMsSUFBSTtRQUN2RCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFBO1FBQzdDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25GLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLDhDQUE4QyxFQUFDLFVBQVMsSUFBSTtRQUMzRCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYTtZQUNyRCxpQkFBaUIsR0FBRyxhQUFhLENBQUE7WUFDakMsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN6QyxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBQyxVQUFTLElBQUk7UUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsQixnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxJQUFJLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO1FBQ0YsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDLHNCQUFzQixDQUFDLENBQUE7SUFDdEQsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsK0JBQStCLEVBQUM7UUFDL0IsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3hCLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUEifQ==

View File

@ -1,35 +1,50 @@
import 'typings-test'
import * as should from 'should'
import * as smartfile from 'smartfile'
import * as rx from 'rxjs/Rx'
import * as smartchok from '../dist/index'
import { tap, expect } from '@push.rocks/tapbundle';
import * as smartchok from '../ts/index.js';
import * as smartfile from '@push.rocks/smartfile';
import * as smartpromise from '@push.rocks/smartpromise';
import * as smartrx from '@push.rocks/smartrx';
describe('smartchok',function(){
let testSmartchok: smartchok.Smartchok
let testAddObservable: rx.Observable<any>
let testSubscription: rx.Subscription
it('should create a new instance',function(){
testSmartchok = new smartchok.Smartchok([])
should(testSmartchok).be.instanceof(smartchok.Smartchok)
})
it('should add some files to watch and start',function(done){
testSmartchok.add(['./test/assets/**/*.txt'])
testSmartchok.start().then(() => { done() }).catch(err => { console.log(err) })
})
it('should get an observable for a certain event',function(done){
testSmartchok.getObservableFor('add').then((observableArg) => {
testAddObservable = observableArg
done()
}).catch(err => { console.log(err) })
})
it('should register an add operation',function(done){
this.timeout(5000)
testSubscription = testAddObservable.subscribe(x => {
done()
})
smartfile.memory.toFs('HI','./test/assets/hi.txt')
})
it('should stop the watch process',function() {
testSmartchok.stop()
})
})
import * as fs from 'fs';
// the module to test
if (process.env.CI) {
process.exit(0);
}
let testSmartchok: smartchok.Smartchok;
let testAddObservable: smartrx.rxjs.Observable<[string, fs.Stats]>;
let testSubscription: smartrx.rxjs.Subscription;
tap.test('should create a new instance', async () => {
testSmartchok = new smartchok.Smartchok([]);
expect(testSmartchok).toBeInstanceOf(smartchok.Smartchok);
});
tap.test('should add some files to watch and start', async () => {
testSmartchok.add(['./test/**/*.txt']);
await testSmartchok.start()
testSmartchok.add(['./test/**/*.md']);
});
tap.test('should get an observable for a certain event', async () => {
await testSmartchok.getObservableFor('add').then(async (observableArg) => {
testAddObservable = observableArg;
});
});
tap.test('should register an add operation', async () => {
let testDeferred = smartpromise.defer();
testSubscription = testAddObservable.subscribe(pathArg => {
const pathResult = pathArg[0];
console.log(pathResult);
testDeferred.resolve();
});
smartfile.memory.toFs('HI', './test/assets/hi.txt');
await testDeferred.promise;
});
tap.test('should stop the watch process', async (tools) => {
await tools.delayFor(10000);
testSmartchok.stop();
});
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/smartchok',
version: '1.0.34',
description: 'A smart wrapper for chokidar to facilitate file watching with enhanced features.'
}

View File

@ -1,85 +1 @@
import * as plugins from './smartchok.plugins'
import { Stringmap } from 'lik'
export type TSmartchokStatus = 'idle' | 'starting' | 'watching'
export type TFsEvent = 'add' | 'addDir' | 'change' | 'error' | 'unlink' | 'unlinkDir' | 'ready' | 'raw'
export class Smartchok {
watchStringmap = new Stringmap()
chokidarOptions: plugins.chokidar.WatchOptions
status: TSmartchokStatus = 'idle'
private watcher
private watchingDeferred = plugins.q.defer<void>() // used to run things when watcher is initialized
private eventObservablemap = new plugins.lik.Observablemap() // register one observable per event
constructor(watchArrayArg: string[], optionsArg: plugins.chokidar.WatchOptions = {}) {
this.watchStringmap.addStringArray(watchArrayArg)
this.chokidarOptions = optionsArg
}
/**
* adds files to the list of watched files
*/
add(pathArrayArg: string[]) {
this.watchStringmap.addStringArray(pathArrayArg)
if (this.status !== 'idle') {
this.watchingDeferred.promise.then(() => {
this.watcher.add(pathArrayArg)
})
}
}
/**
* removes files from the list of watched files
*/
remove(pathArg: string) {
this.watchStringmap.removeString('') // TODO
this.watchingDeferred.promise.then(() => {
this.watcher.unwatch(pathArg)
})
}
/**
* gets an observable for a certain event
*/
getObservableFor(fsEvent: TFsEvent): plugins.q.Promise<plugins.rx.Observable<any>> {
let done = plugins.q.defer<plugins.rx.Observable<any>>()
this.watchingDeferred.promise.then(() => {
let eventObservable = this.eventObservablemap.getObservableForEmitterEvent(this.watcher, fsEvent)
done.resolve(eventObservable)
})
return done.promise
}
/**
* starts the watcher
* @returns Promise<void>
*/
start(): plugins.q.Promise<void> {
let done = plugins.q.defer<void>()
this.status = 'starting'
this.watcher = plugins.chokidar.watch(this.watchStringmap.getStringArray(), this.chokidarOptions)
this.watcher.on('ready', () => {
this.status = 'watching'
this.watchingDeferred.resolve()
done.resolve()
})
return done.promise
}
/**
* stop the watcher process if watching
*/
stop() {
let closeWatcher = () => {
this.watcher.close()
}
if (this.status === 'watching') {
console.log('closing while watching')
closeWatcher()
} else if (this.status === 'starting') {
this.watchingDeferred.promise.then(() => { closeWatcher() })
}
}
}
export * from './smartchok.classes.smartchok.js';

View File

@ -0,0 +1,131 @@
import * as plugins from './smartchok.plugins.js';
import { Stringmap } from '@push.rocks/lik';
export type TSmartchokStatus = 'idle' | 'starting' | 'watching';
export type TFsEvent =
| 'add'
| 'addDir'
| 'change'
| 'error'
| 'unlink'
| 'unlinkDir'
| 'ready'
| 'raw';
/**
* Smartchok allows easy wathcing of files
*/
export class Smartchok {
public watchStringmap = new Stringmap();
public status: TSmartchokStatus = 'idle';
private watcher: plugins.watcher;
private watchingDeferred = plugins.smartpromise.defer<void>(); // used to run things when watcher is initialized
private eventObservablemap = new plugins.smartrx.Observablemap(); // register one observable per event
/**
* constructor of class smartchok
*/
constructor(watchArrayArg: string[]) {
this.watchStringmap.addStringArray(watchArrayArg);
}
private getGlobBase(globPattern: string) {
// Characters that mark the beginning of a glob pattern
const globChars = ['*', '?', '[', ']', '{', '}'];
// Find the index of the first glob character
const firstGlobCharIndex = globPattern.split('').findIndex((char) => globChars.includes(char));
// If no glob characters are found, return the entire string
if (firstGlobCharIndex === -1) {
return globPattern;
}
// Extract the substring up to the first glob character
const basePathPortion = globPattern.substring(0, firstGlobCharIndex);
// Find the last slash before the glob pattern starts
const lastSlashIndex = basePathPortion.lastIndexOf('/');
// If there is no slash, return the basePathPortion as is
if (lastSlashIndex === -1) {
return basePathPortion;
}
// Return the base path up to and including the last slash
return basePathPortion.substring(0, lastSlashIndex + 1);
}
/**
* adds files to the list of watched files
*/
public add(pathArrayArg: string[]) {
this.watchStringmap.addStringArray(pathArrayArg);
}
/**
* removes files from the list of watched files
*/
public remove(pathArg: string) {
this.watchStringmap.removeString(pathArg);
}
/**
* gets an observable for a certain event
*/
public getObservableFor(
fsEvent: TFsEvent
): Promise<plugins.smartrx.rxjs.Observable<[string, plugins.fs.Stats]>> {
const done = plugins.smartpromise.defer<plugins.smartrx.rxjs.Observable<any>>();
this.watchingDeferred.promise.then(() => {
const eventObservable = this.eventObservablemap.getSubjectForEmitterEvent(
this.watcher,
fsEvent
);
done.resolve(eventObservable);
});
return done.promise;
}
/**
* starts the watcher
* @returns Promise<void>
*/
public start(): Promise<void> {
const done = plugins.smartpromise.defer<void>();
this.status = 'starting';
this.watcher = new plugins.watcher(
this.watchStringmap.getStringArray().map((string) => {
const result = this.getGlobBase(string);
console.log(`Watching ${result} for changes`);
return result;
}),
{
depth: 4,
recursive: true,
}
);
this.watcher.on('ready', () => {
this.status = 'watching';
this.watchingDeferred.resolve();
done.resolve();
});
return done.promise;
}
/**
* stop the watcher process if watching
*/
public async stop() {
const closeWatcher = async () => {
await this.watcher.close();
};
if (this.status === 'watching') {
console.log('closing while watching');
await closeWatcher();
} else if (this.status === 'starting') {
await this.watchingDeferred.promise;
await closeWatcher();
}
}
}

View File

@ -1,6 +1,27 @@
import 'typings-global'
export import chokidar = require('chokidar')
export import lik = require('lik')
export import path = require('path')
export import q = require('q')
export import rx = require('rxjs/Rx')
// node native
import * as fs from 'fs';
import * as path from 'path';
export {
fs,
path
}
// @pushrocks scope
import * as lik from '@push.rocks/lik';
import * as smartpromise from '@push.rocks/smartpromise';
import * as smartrx from '@push.rocks/smartrx';
export {
lik,
smartpromise,
smartrx
}
// thirdparty scope
// @ts-nocheck
import watcher from '@tempfix/watcher';
export {
watcher,
}

14
tsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"useDefineForClassFields": false,
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"verbatimModuleSyntax": true
},
"exclude": [
"dist_*/**/*.d.ts"
]
}

View File

@ -1,3 +0,0 @@
{
"extends": "tslint-config-standard"
}