as-soon 0.0.11 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +121 -110
- package/dist/cli.js.map +1 -1
- package/package.json +12 -18
- package/src/cli.ts +7 -3
- package/tsconfig.json +14 -9
- package/dist/chunk-AVQVENQ2.js +0 -25
- package/dist/chunk-AVQVENQ2.js.map +0 -1
- package/dist/cli.cjs +0 -176
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.d.cts +0 -1
- package/dist/index.cjs +0 -31
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -3
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
- package/src/index.ts +0 -1
- package/tsup.config.ts +0 -5
package/README.md
CHANGED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# as-soon
|
|
2
|
+
|
|
3
|
+
A lightweight file watcher that executes commands as soon as files change.
|
|
4
|
+
|
|
5
|
+
## What is as-soon?
|
|
6
|
+
|
|
7
|
+
`as-soon` is a command-line tool that watches specified files or directories and automatically executes a command whenever changes are detected. It's perfect for development workflows where you need to rebuild, test, or restart processes whenever your code changes.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- **Simple and fast** - Watch files and execute commands with minimal configuration
|
|
12
|
+
- **Flexible watching** - Watch specific directories or the current working directory
|
|
13
|
+
- **Debounced execution** - Commands are debounced (200ms) to avoid excessive runs during rapid file changes
|
|
14
|
+
- **File creation support** - Can watch for files that don't exist yet and automatically start watching them once created
|
|
15
|
+
- **Environment variables** - Loads environment variables from `.env` files automatically
|
|
16
|
+
- **Directory recreation handling** - Automatically re-subscribes when watched directories are deleted and recreated
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g as-soon
|
|
22
|
+
# or
|
|
23
|
+
pnpm add -g as-soon
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or use it locally in your project:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install -D as-soon
|
|
30
|
+
# or
|
|
31
|
+
pnpm add -D as-soon
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
### Basic Usage
|
|
37
|
+
|
|
38
|
+
Watch the current directory and execute a command on any file change:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
as-soon command
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Watch Specific Directories
|
|
45
|
+
|
|
46
|
+
Use the `-w` flag to watch specific directories:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
as-soon -w src -w public pnpm build
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Watch Specific Files
|
|
53
|
+
|
|
54
|
+
You can also watch specific files:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
as-soon -w package.json -w tsconfig.json pnpm build
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Pass Arguments to Commands
|
|
61
|
+
|
|
62
|
+
Any arguments after the command are passed through:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
as-soon pnpm test -- --watch
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Multiple Watch Paths
|
|
69
|
+
|
|
70
|
+
Watch multiple directories:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
as-soon -w src -w test pnpm build
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## How It Works
|
|
77
|
+
|
|
78
|
+
1. **Initial Execution**: The command runs immediately when you start as-soon
|
|
79
|
+
2. **File Watching**: It watches the specified directories (or current directory by default)
|
|
80
|
+
3. **Change Detection**: When files are added, modified, or deleted, it detects the changes
|
|
81
|
+
4. **Debounced Execution**: After a 200ms debounce period, the command executes again
|
|
82
|
+
5. **Continuous Watching**: The process continues until you stop it (Ctrl+C)
|
|
83
|
+
|
|
84
|
+
## Examples
|
|
85
|
+
|
|
86
|
+
### Development Workflow
|
|
87
|
+
|
|
88
|
+
Watch your source files and rebuild on changes:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
as-soon -w src pnpm build
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Test Runner
|
|
95
|
+
|
|
96
|
+
Run tests whenever test files change:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
as-soon -w test pnpm test
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Type Checking
|
|
103
|
+
|
|
104
|
+
Run TypeScript type checking on file changes:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
as-soon -w src tsc --noEmit
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Multiple Workspaces
|
|
111
|
+
|
|
112
|
+
Watch multiple directories in a monorepo:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
as-soon -w packages/app/src -w packages/lib/src pnpm build
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Watch Non-Existent Files
|
|
119
|
+
|
|
120
|
+
You can even watch for files that don't exist yet:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
as-soon -w ./config/dev.ts pnpm build
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
This is useful for configuration files that might be created later.
|
|
127
|
+
|
|
128
|
+
## Command-Line Options
|
|
129
|
+
|
|
130
|
+
- `-w <path>` - Specify a directory or file to watch (can be used multiple times)
|
|
131
|
+
- All other arguments are treated as the command to execute
|
|
132
|
+
|
|
133
|
+
## Environment Variables
|
|
134
|
+
|
|
135
|
+
as-soon automatically loads environment variables from `.env` files using `ldenv`.
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
|
|
139
|
+
MIT
|
package/dist/cli.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
CHANGED
|
@@ -1,136 +1,147 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import path from "path";
|
|
10
|
-
import fs from "fs";
|
|
11
|
-
import { debounce } from "lodash";
|
|
12
|
-
import { loadEnv } from "ldenv";
|
|
13
|
-
var args = process.argv.slice(2);
|
|
2
|
+
import { execFileSync } from 'child_process';
|
|
3
|
+
import watcher from '@parcel/watcher';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import { debounce } from 'lodash';
|
|
7
|
+
import { loadEnv } from 'ldenv';
|
|
8
|
+
const args = process.argv.slice(2);
|
|
14
9
|
function error(msg) {
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
console.error(msg);
|
|
11
|
+
process.exit(1);
|
|
17
12
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
var options = {};
|
|
13
|
+
let argToConsume;
|
|
14
|
+
let command;
|
|
15
|
+
let commandArgs;
|
|
16
|
+
const options = {};
|
|
23
17
|
for (let i = 0; i < args.length; i++) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
18
|
+
const arg = args[i];
|
|
19
|
+
if (arg.startsWith('--')) {
|
|
20
|
+
argToConsume = arg.substring(2);
|
|
21
|
+
}
|
|
22
|
+
else if (arg.startsWith('-')) {
|
|
23
|
+
argToConsume = arg.substring(1);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
if (argToConsume) {
|
|
27
|
+
if (options[argToConsume]) {
|
|
28
|
+
options[argToConsume].push(arg);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
options[argToConsume] = [arg];
|
|
32
|
+
}
|
|
33
|
+
argToConsume = undefined;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
command = arg;
|
|
37
|
+
commandArgs = args.slice(i + 1);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
41
40
|
}
|
|
42
|
-
}
|
|
43
41
|
}
|
|
44
42
|
if (!command) {
|
|
45
|
-
|
|
43
|
+
error(`please specify a command`);
|
|
44
|
+
}
|
|
45
|
+
const commandToUse = command;
|
|
46
|
+
console.log(`"${commandToUse} ${commandArgs?.join(' ') || ''}"`);
|
|
47
|
+
if (options['mode'] || options['m']) {
|
|
48
|
+
loadEnv({ mode: options['mode'][0] || options['m'][0] });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
loadEnv();
|
|
46
52
|
}
|
|
47
|
-
var commandToUse = command;
|
|
48
|
-
console.log(`"${commandToUse} ${(commandArgs == null ? void 0 : commandArgs.join(" ")) || ""}"`);
|
|
49
|
-
loadEnv({ mode: deploymentContext });
|
|
50
53
|
function _execute() {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
try {
|
|
55
|
+
execFileSync(commandToUse, commandArgs, { stdio: ['inherit', 'inherit', 'inherit'] });
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.error('failed to execue', err);
|
|
59
|
+
}
|
|
60
|
+
console.log(`-------------------------------------`);
|
|
57
61
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
// let counter = 0;
|
|
63
|
+
async function subscribe_folder(absolute_path, execute, filename) {
|
|
64
|
+
// const c = ++counter;
|
|
65
|
+
const p = path.relative(process.cwd(), absolute_path) || '.';
|
|
66
|
+
const subscription = await watcher.subscribe(absolute_path, (err, events) => {
|
|
67
|
+
// console.log(`Files changed under ${p} (${c})`);
|
|
68
|
+
if (filename) {
|
|
69
|
+
for (const event of events) {
|
|
70
|
+
if (path.normalize(event.path) === filename) {
|
|
71
|
+
console.log(`"${path.basename(filename)}" changed under ${p}`);
|
|
72
|
+
execute();
|
|
73
|
+
}
|
|
74
|
+
else if (event.type === 'delete' && event.path === absolute_path) {
|
|
75
|
+
subscription.unsubscribe();
|
|
76
|
+
listen(filename, execute);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
72
80
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
else {
|
|
82
|
+
console.log(`Files changed under ${p}`);
|
|
83
|
+
for (const event of events) {
|
|
84
|
+
if (event.type === 'delete' && event.path === absolute_path) {
|
|
85
|
+
subscription.unsubscribe();
|
|
86
|
+
listen(absolute_path, execute);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
execute();
|
|
81
91
|
}
|
|
82
|
-
execute();
|
|
83
|
-
}
|
|
84
92
|
});
|
|
85
|
-
});
|
|
86
93
|
}
|
|
87
|
-
function listen(absolute_path, execute) {
|
|
88
|
-
return __async(this, null, function* () {
|
|
94
|
+
async function listen(absolute_path, execute) {
|
|
89
95
|
const exists = fs.existsSync(absolute_path);
|
|
90
96
|
if (exists) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (!fs.existsSync(parent)) {
|
|
100
|
-
console.error(`cannot listen on folder who have no parent yet: ${absolute_path}`);
|
|
101
|
-
process.exit(1);
|
|
102
|
-
}
|
|
103
|
-
let tmp_subscription = yield watcher.subscribe(parent, (err, events) => {
|
|
104
|
-
for (const event of events) {
|
|
105
|
-
if (event.type === "create" && path.normalize(event.path) === absolute_path) {
|
|
106
|
-
tmp_subscription == null ? void 0 : tmp_subscription.unsubscribe();
|
|
107
|
-
tmp_subscription = void 0;
|
|
108
|
-
setTimeout((v) => {
|
|
109
|
-
listen(absolute_path, execute);
|
|
110
|
-
}, 500);
|
|
111
|
-
}
|
|
97
|
+
const isDirectory = fs.statSync(absolute_path).isDirectory();
|
|
98
|
+
if (isDirectory) {
|
|
99
|
+
// console.log(`listen for folder changes...`);
|
|
100
|
+
subscribe_folder(absolute_path, execute);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// console.log(`listen for file changes...`);
|
|
104
|
+
subscribe_folder(path.dirname(absolute_path), execute, absolute_path);
|
|
112
105
|
}
|
|
113
|
-
});
|
|
114
106
|
}
|
|
115
|
-
|
|
107
|
+
else {
|
|
108
|
+
const parent = path.dirname(absolute_path);
|
|
109
|
+
if (!fs.existsSync(parent)) {
|
|
110
|
+
console.error(`cannot listen on folder who have no parent yet: ${absolute_path}`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
// console.log(`${absolute_path} do not exist yet, listening on parent : ${parent}`);
|
|
114
|
+
let tmp_subscription = await watcher.subscribe(parent, (err, events) => {
|
|
115
|
+
for (const event of events) {
|
|
116
|
+
if (event.type === 'create' && path.normalize(event.path) === absolute_path) {
|
|
117
|
+
// console.log(`${absolute_path} just got created, listening for it...`);
|
|
118
|
+
tmp_subscription?.unsubscribe();
|
|
119
|
+
tmp_subscription = undefined;
|
|
120
|
+
// wrap in a timeout to ensure @parcel/watcher hook on the correct inode?
|
|
121
|
+
setTimeout(() => {
|
|
122
|
+
listen(absolute_path, execute);
|
|
123
|
+
}, 500);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
116
128
|
}
|
|
117
|
-
function main() {
|
|
118
|
-
return __async(this, null, function* () {
|
|
129
|
+
async function main() {
|
|
119
130
|
const execute = debounce(_execute, 200);
|
|
120
131
|
execute();
|
|
121
|
-
if (options[
|
|
122
|
-
|
|
123
|
-
|
|
132
|
+
if (options['w']) {
|
|
133
|
+
const folders = options['w'].map((p) => path.normalize(path.join(process.cwd(), p)));
|
|
134
|
+
for (const folder of folders) {
|
|
135
|
+
listen(folder, execute);
|
|
136
|
+
console.log(`Now listening on ${folder}`);
|
|
137
|
+
console.log(`-------------------------------------`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const folder = path.normalize(process.cwd());
|
|
142
|
+
console.log(`listening on current folder: ${folder}`);
|
|
124
143
|
listen(folder, execute);
|
|
125
|
-
console.log(`Now listening on ${folder}`);
|
|
126
|
-
console.log(`-------------------------------------`);
|
|
127
|
-
}
|
|
128
|
-
} else {
|
|
129
|
-
const folder = path.normalize(process.cwd());
|
|
130
|
-
console.log(`listening on current folder: ${folder}`);
|
|
131
|
-
listen(folder, execute);
|
|
132
144
|
}
|
|
133
|
-
});
|
|
134
145
|
}
|
|
135
146
|
main();
|
|
136
147
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "as-soon",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "watch and execute",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"type": "module",
|
|
9
|
-
|
|
10
|
-
"module": "dist/index.js",
|
|
11
|
-
"types": "dist/index.d.ts",
|
|
9
|
+
|
|
12
10
|
"bin": {
|
|
13
|
-
"as-soon": "dist/cli.
|
|
11
|
+
"as-soon": "dist/cli.js"
|
|
14
12
|
},
|
|
15
13
|
"dependencies": {
|
|
16
|
-
"@parcel/watcher": "^2.4
|
|
17
|
-
"ldenv": "^0.3.
|
|
18
|
-
"lodash": "^4.17.
|
|
19
|
-
"lodash-es": "^4.17.21"
|
|
14
|
+
"@parcel/watcher": "^2.5.4",
|
|
15
|
+
"ldenv": "^0.3.16",
|
|
16
|
+
"lodash": "^4.17.23"
|
|
20
17
|
},
|
|
21
18
|
"devDependencies": {
|
|
22
|
-
"@types/lodash": "^4.
|
|
23
|
-
"@types/
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"tsup": "^8.0.1",
|
|
27
|
-
"typescript": "^5.3.3"
|
|
19
|
+
"@types/lodash": "^4.17.23",
|
|
20
|
+
"@types/node": "^25.0.10",
|
|
21
|
+
"as-soon": "^0.0.11",
|
|
22
|
+
"typescript": "^5.9.3"
|
|
28
23
|
},
|
|
29
24
|
"scripts": {
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"dev": "tsup --entry src/index.ts --entry src/cli.ts --dts --watch --format esm,cjs"
|
|
25
|
+
"build": "tsc --project tsconfig.json",
|
|
26
|
+
"dev": "as-soon -w src pnpm build"
|
|
33
27
|
}
|
|
34
28
|
}
|
package/src/cli.ts
CHANGED
|
@@ -13,7 +13,6 @@ function error(msg: string) {
|
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
let deploymentContext = 'localhost';
|
|
17
16
|
let argToConsume;
|
|
18
17
|
let command: string | undefined;
|
|
19
18
|
let commandArgs: string[] | undefined;
|
|
@@ -47,7 +46,12 @@ const commandToUse = command!;
|
|
|
47
46
|
|
|
48
47
|
console.log(`"${commandToUse} ${commandArgs?.join(' ') || ''}"`);
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
if (options['mode'] || options['m']) {
|
|
50
|
+
loadEnv({mode: options['mode'][0] || options['m'][0]});
|
|
51
|
+
} else {
|
|
52
|
+
loadEnv();
|
|
53
|
+
}
|
|
54
|
+
|
|
51
55
|
|
|
52
56
|
function _execute() {
|
|
53
57
|
try {
|
|
@@ -115,7 +119,7 @@ async function listen(absolute_path: string, execute: () => void) {
|
|
|
115
119
|
tmp_subscription?.unsubscribe();
|
|
116
120
|
tmp_subscription = undefined;
|
|
117
121
|
// wrap in a timeout to ensure @parcel/watcher hook on the correct inode?
|
|
118
|
-
setTimeout((
|
|
122
|
+
setTimeout(() => {
|
|
119
123
|
listen(absolute_path, execute);
|
|
120
124
|
}, 500);
|
|
121
125
|
}
|
package/tsconfig.json
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"target": "
|
|
3
|
+
"strict": true,
|
|
4
|
+
"strictNullChecks": true,
|
|
5
|
+
"target": "ESNext",
|
|
6
|
+
"module": "NodeNext",
|
|
7
|
+
"lib": ["ESNext", "dom"],
|
|
8
|
+
"moduleResolution": "NodeNext",
|
|
9
|
+
"resolveJsonModule": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"sourceMap": true,
|
|
6
12
|
"declaration": true,
|
|
7
13
|
"declarationMap": true,
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
+
"rootDir": "./src",
|
|
15
|
+
"outDir": "./dist"
|
|
16
|
+
},
|
|
17
|
+
"include": ["src/**/*.ts"]
|
|
18
|
+
}
|
package/dist/chunk-AVQVENQ2.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
var __async = (__this, __arguments, generator) => {
|
|
2
|
-
return new Promise((resolve, reject) => {
|
|
3
|
-
var fulfilled = (value) => {
|
|
4
|
-
try {
|
|
5
|
-
step(generator.next(value));
|
|
6
|
-
} catch (e) {
|
|
7
|
-
reject(e);
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var rejected = (value) => {
|
|
11
|
-
try {
|
|
12
|
-
step(generator.throw(value));
|
|
13
|
-
} catch (e) {
|
|
14
|
-
reject(e);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export {
|
|
23
|
-
__async
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=chunk-AVQVENQ2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/cli.cjs
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
18
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
19
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
20
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
21
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
22
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
23
|
-
mod
|
|
24
|
-
));
|
|
25
|
-
var __async = (__this, __arguments, generator) => {
|
|
26
|
-
return new Promise((resolve, reject) => {
|
|
27
|
-
var fulfilled = (value) => {
|
|
28
|
-
try {
|
|
29
|
-
step(generator.next(value));
|
|
30
|
-
} catch (e) {
|
|
31
|
-
reject(e);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
var rejected = (value) => {
|
|
35
|
-
try {
|
|
36
|
-
step(generator.throw(value));
|
|
37
|
-
} catch (e) {
|
|
38
|
-
reject(e);
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
42
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// src/cli.ts
|
|
47
|
-
var import_child_process = require("child_process");
|
|
48
|
-
var import_watcher = __toESM(require("@parcel/watcher"), 1);
|
|
49
|
-
var import_node_path = __toESM(require("path"), 1);
|
|
50
|
-
var import_node_fs = __toESM(require("fs"), 1);
|
|
51
|
-
var import_lodash = require("lodash");
|
|
52
|
-
var import_ldenv = require("ldenv");
|
|
53
|
-
var args = process.argv.slice(2);
|
|
54
|
-
function error(msg) {
|
|
55
|
-
console.error(msg);
|
|
56
|
-
process.exit(1);
|
|
57
|
-
}
|
|
58
|
-
var deploymentContext = "localhost";
|
|
59
|
-
var argToConsume;
|
|
60
|
-
var command;
|
|
61
|
-
var commandArgs;
|
|
62
|
-
var options = {};
|
|
63
|
-
for (let i = 0; i < args.length; i++) {
|
|
64
|
-
const arg = args[i];
|
|
65
|
-
if (arg.startsWith("--")) {
|
|
66
|
-
argToConsume = arg.substring(2);
|
|
67
|
-
} else if (arg.startsWith("-")) {
|
|
68
|
-
argToConsume = arg.substring(1);
|
|
69
|
-
} else {
|
|
70
|
-
if (argToConsume) {
|
|
71
|
-
if (options[argToConsume]) {
|
|
72
|
-
options[argToConsume].push(arg);
|
|
73
|
-
} else {
|
|
74
|
-
options[argToConsume] = [arg];
|
|
75
|
-
}
|
|
76
|
-
argToConsume = void 0;
|
|
77
|
-
} else {
|
|
78
|
-
command = arg;
|
|
79
|
-
commandArgs = args.slice(i + 1);
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
if (!command) {
|
|
85
|
-
error(`please specify a command`);
|
|
86
|
-
}
|
|
87
|
-
var commandToUse = command;
|
|
88
|
-
console.log(`"${commandToUse} ${(commandArgs == null ? void 0 : commandArgs.join(" ")) || ""}"`);
|
|
89
|
-
(0, import_ldenv.loadEnv)({ mode: deploymentContext });
|
|
90
|
-
function _execute() {
|
|
91
|
-
try {
|
|
92
|
-
(0, import_child_process.execFileSync)(commandToUse, commandArgs, { stdio: ["inherit", "inherit", "inherit"] });
|
|
93
|
-
} catch (err) {
|
|
94
|
-
console.error("failed to execue", err);
|
|
95
|
-
}
|
|
96
|
-
console.log(`-------------------------------------`);
|
|
97
|
-
}
|
|
98
|
-
function subscribe_folder(absolute_path, execute, filename) {
|
|
99
|
-
return __async(this, null, function* () {
|
|
100
|
-
const p = import_node_path.default.relative(process.cwd(), absolute_path) || ".";
|
|
101
|
-
const subscription = yield import_watcher.default.subscribe(absolute_path, (err, events) => {
|
|
102
|
-
if (filename) {
|
|
103
|
-
for (const event of events) {
|
|
104
|
-
if (import_node_path.default.normalize(event.path) === filename) {
|
|
105
|
-
console.log(`"${import_node_path.default.basename(filename)}" changed under ${p}`);
|
|
106
|
-
execute();
|
|
107
|
-
} else if (event.type === "delete" && event.path === absolute_path) {
|
|
108
|
-
subscription.unsubscribe();
|
|
109
|
-
listen(filename, execute);
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
console.log(`Files changed under ${p}`);
|
|
115
|
-
for (const event of events) {
|
|
116
|
-
if (event.type === "delete" && event.path === absolute_path) {
|
|
117
|
-
subscription.unsubscribe();
|
|
118
|
-
listen(absolute_path, execute);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
execute();
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
function listen(absolute_path, execute) {
|
|
128
|
-
return __async(this, null, function* () {
|
|
129
|
-
const exists = import_node_fs.default.existsSync(absolute_path);
|
|
130
|
-
if (exists) {
|
|
131
|
-
const isDirectory = import_node_fs.default.statSync(absolute_path).isDirectory();
|
|
132
|
-
if (isDirectory) {
|
|
133
|
-
subscribe_folder(absolute_path, execute);
|
|
134
|
-
} else {
|
|
135
|
-
subscribe_folder(import_node_path.default.dirname(absolute_path), execute, absolute_path);
|
|
136
|
-
}
|
|
137
|
-
} else {
|
|
138
|
-
const parent = import_node_path.default.dirname(absolute_path);
|
|
139
|
-
if (!import_node_fs.default.existsSync(parent)) {
|
|
140
|
-
console.error(`cannot listen on folder who have no parent yet: ${absolute_path}`);
|
|
141
|
-
process.exit(1);
|
|
142
|
-
}
|
|
143
|
-
let tmp_subscription = yield import_watcher.default.subscribe(parent, (err, events) => {
|
|
144
|
-
for (const event of events) {
|
|
145
|
-
if (event.type === "create" && import_node_path.default.normalize(event.path) === absolute_path) {
|
|
146
|
-
tmp_subscription == null ? void 0 : tmp_subscription.unsubscribe();
|
|
147
|
-
tmp_subscription = void 0;
|
|
148
|
-
setTimeout((v) => {
|
|
149
|
-
listen(absolute_path, execute);
|
|
150
|
-
}, 500);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
function main() {
|
|
158
|
-
return __async(this, null, function* () {
|
|
159
|
-
const execute = (0, import_lodash.debounce)(_execute, 200);
|
|
160
|
-
execute();
|
|
161
|
-
if (options["w"]) {
|
|
162
|
-
const folders = options["w"].map((p) => import_node_path.default.normalize(import_node_path.default.join(process.cwd(), p)));
|
|
163
|
-
for (const folder of folders) {
|
|
164
|
-
listen(folder, execute);
|
|
165
|
-
console.log(`Now listening on ${folder}`);
|
|
166
|
-
console.log(`-------------------------------------`);
|
|
167
|
-
}
|
|
168
|
-
} else {
|
|
169
|
-
const folder = import_node_path.default.normalize(process.cwd());
|
|
170
|
-
console.log(`listening on current folder: ${folder}`);
|
|
171
|
-
listen(folder, execute);
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
main();
|
|
176
|
-
//# sourceMappingURL=cli.cjs.map
|
package/dist/cli.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport {execFileSync} from 'child_process';\nimport watcher, {AsyncSubscription} from '@parcel/watcher';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport {debounce} from 'lodash';\nimport {loadEnv} from 'ldenv';\n\nconst args = process.argv.slice(2);\n\nfunction error(msg: string) {\n\tconsole.error(msg);\n\tprocess.exit(1);\n}\n\nlet deploymentContext = 'localhost';\nlet argToConsume;\nlet command: string | undefined;\nlet commandArgs: string[] | undefined;\nconst options: {[key: string]: string[]} = {};\nfor (let i = 0; i < args.length; i++) {\n\tconst arg = args[i];\n\tif (arg.startsWith('--')) {\n\t\targToConsume = arg.substring(2);\n\t} else if (arg.startsWith('-')) {\n\t\targToConsume = arg.substring(1);\n\t} else {\n\t\tif (argToConsume) {\n\t\t\tif (options[argToConsume]) {\n\t\t\t\toptions[argToConsume].push(arg);\n\t\t\t} else {\n\t\t\t\toptions[argToConsume] = [arg];\n\t\t\t}\n\t\t\targToConsume = undefined;\n\t\t} else {\n\t\t\tcommand = arg;\n\t\t\tcommandArgs = args.slice(i + 1);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nif (!command) {\n\terror(`please specify a command`);\n}\nconst commandToUse = command!;\n\nconsole.log(`\"${commandToUse} ${commandArgs?.join(' ') || ''}\"`);\n\nloadEnv({mode: deploymentContext});\n\nfunction _execute() {\n\ttry {\n\t\texecFileSync(commandToUse, commandArgs, {stdio: ['inherit', 'inherit', 'inherit']});\n\t} catch (err) {\n\t\tconsole.error('failed to execue', err);\n\t}\n\tconsole.log(`-------------------------------------`);\n}\n\n// let counter = 0;\nasync function subscribe_folder(absolute_path: string, execute: () => void, filename?: string) {\n\t// const c = ++counter;\n\tconst p = path.relative(process.cwd(), absolute_path) || '.';\n\tconst subscription = await watcher.subscribe(absolute_path, (err, events) => {\n\t\t// console.log(`Files changed under ${p} (${c})`);\n\t\tif (filename) {\n\t\t\tfor (const event of events) {\n\t\t\t\tif (path.normalize(event.path) === filename) {\n\t\t\t\t\tconsole.log(`\"${path.basename(filename)}\" changed under ${p}`);\n\t\t\t\t\texecute();\n\t\t\t\t} else if (event.type === 'delete' && event.path === absolute_path) {\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t\tlisten(filename, execute);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(`Files changed under ${p}`);\n\t\t\tfor (const event of events) {\n\t\t\t\tif (event.type === 'delete' && event.path === absolute_path) {\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t\tlisten(absolute_path, execute);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\texecute();\n\t\t}\n\t});\n}\n\nasync function listen(absolute_path: string, execute: () => void) {\n\tconst exists = fs.existsSync(absolute_path);\n\n\tif (exists) {\n\t\tconst isDirectory = fs.statSync(absolute_path).isDirectory();\n\t\tif (isDirectory) {\n\t\t\t// console.log(`listen for folder changes...`);\n\t\t\tsubscribe_folder(absolute_path, execute);\n\t\t} else {\n\t\t\t// console.log(`listen for file changes...`);\n\t\t\tsubscribe_folder(path.dirname(absolute_path), execute, absolute_path);\n\t\t}\n\t} else {\n\t\tconst parent = path.dirname(absolute_path);\n\t\tif (!fs.existsSync(parent)) {\n\t\t\tconsole.error(`cannot listen on folder who have no parent yet: ${absolute_path}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\t// console.log(`${absolute_path} do not exist yet, listening on parent : ${parent}`);\n\t\tlet tmp_subscription: AsyncSubscription | undefined = await watcher.subscribe(parent, (err, events) => {\n\t\t\tfor (const event of events) {\n\t\t\t\tif (event.type === 'create' && path.normalize(event.path) === absolute_path) {\n\t\t\t\t\t// console.log(`${absolute_path} just got created, listening for it...`);\n\t\t\t\t\ttmp_subscription?.unsubscribe();\n\t\t\t\t\ttmp_subscription = undefined;\n\t\t\t\t\t// wrap in a timeout to ensure @parcel/watcher hook on the correct inode?\n\t\t\t\t\tsetTimeout((v) => {\n\t\t\t\t\t\tlisten(absolute_path, execute);\n\t\t\t\t\t}, 500);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\nasync function main() {\n\tconst execute = debounce(_execute, 200);\n\texecute();\n\tif (options['w']) {\n\t\tconst folders = options['w'].map((p) => path.normalize(path.join(process.cwd(), p)));\n\t\tfor (const folder of folders) {\n\t\t\tlisten(folder, execute);\n\n\t\t\tconsole.log(`Now listening on ${folder}`);\n\t\t\tconsole.log(`-------------------------------------`);\n\t\t}\n\t} else {\n\t\tconst folder = path.normalize(process.cwd());\n\t\tconsole.log(`listening on current folder: ${folder}`);\n\t\tlisten(folder, execute);\n\t}\n}\nmain();\n"],"mappings":"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","names":["path","watcher","fs"]}
|
package/dist/cli.d.cts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
package/dist/index.cjs
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
|
-
var src_exports = {};
|
|
22
|
-
__export(src_exports, {
|
|
23
|
-
nothing: () => nothing
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(src_exports);
|
|
26
|
-
var nothing = 0;
|
|
27
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
-
0 && (module.exports = {
|
|
29
|
-
nothing
|
|
30
|
-
});
|
|
31
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const nothing = 0;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,UAAU;","names":[]}
|
package/dist/index.d.cts
DELETED
package/dist/index.d.ts
DELETED
package/dist/index.js
DELETED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const nothing = 0;\n"],"mappings":";;;AAAO,IAAM,UAAU;","names":[]}
|
package/src/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const nothing = 0;
|