@youcan/app 1.2.0-beta.0 → 1.2.0-beta.2
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.
|
@@ -17,7 +17,7 @@ class WorkerLogger extends Writable {
|
|
|
17
17
|
return false;
|
|
18
18
|
}
|
|
19
19
|
const channel = this.channel === 'stdout' ? stdout : stderr;
|
|
20
|
-
const time = dayjs().format('HH:mm:SSS');
|
|
20
|
+
const time = dayjs().format('HH:mm:ss:SSS');
|
|
21
21
|
const lines = chunk.toString().split('\n').map(s => s.trim()).filter(s => s !== '');
|
|
22
22
|
for (let i = 0; i < lines.length; i++) {
|
|
23
23
|
i === 0
|
|
@@ -22,11 +22,10 @@ class AppWorker extends AbstractWorker {
|
|
|
22
22
|
stabilityThreshold: 50,
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
|
-
watcher.
|
|
26
|
-
watcher.close();
|
|
25
|
+
watcher.once('change', async () => {
|
|
26
|
+
await watcher.close();
|
|
27
27
|
this.command.controller.abort();
|
|
28
28
|
this.logger.write('config update detected, reloading workers...');
|
|
29
|
-
this.command.output.wait(2000);
|
|
30
29
|
this.command.config.runCommand(this.command.id, this.command.argv);
|
|
31
30
|
});
|
|
32
31
|
}
|
|
@@ -6,9 +6,10 @@ export default class ThemeExtensionWorker extends AbstractWorker {
|
|
|
6
6
|
private app;
|
|
7
7
|
private extension;
|
|
8
8
|
private logger;
|
|
9
|
+
private queue;
|
|
9
10
|
FILE_TYPES: string[];
|
|
10
11
|
constructor(command: Cli.Command, app: App, extension: Extension);
|
|
11
12
|
boot(): Promise<void>;
|
|
12
13
|
run(): Promise<void>;
|
|
13
|
-
private
|
|
14
|
+
private enqueue;
|
|
14
15
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Color, Session, Http, Env, Path, Filesystem,
|
|
1
|
+
import { Color, Session, Http, Env, Path, Filesystem, Form } from '@youcan/cli-kit';
|
|
2
2
|
import AbstractWorker, { WorkerLogger } from './abstract-worker.js';
|
|
3
3
|
|
|
4
4
|
class ThemeExtensionWorker extends AbstractWorker {
|
|
@@ -6,6 +6,7 @@ class ThemeExtensionWorker extends AbstractWorker {
|
|
|
6
6
|
app;
|
|
7
7
|
extension;
|
|
8
8
|
logger;
|
|
9
|
+
queue = [];
|
|
9
10
|
FILE_TYPES = [
|
|
10
11
|
'assets',
|
|
11
12
|
'locales',
|
|
@@ -38,18 +39,17 @@ class ThemeExtensionWorker extends AbstractWorker {
|
|
|
38
39
|
for (const type of this.FILE_TYPES) {
|
|
39
40
|
const descriptors = this.extension.metadata[type] ?? [];
|
|
40
41
|
const directory = Path.resolve(this.extension.root, type);
|
|
41
|
-
const present = await Filesystem.
|
|
42
|
+
const present = await Filesystem.exists(directory)
|
|
43
|
+
? await Filesystem.readdir(directory)
|
|
44
|
+
: [];
|
|
42
45
|
present.filter(f => !descriptors.find(d => d.file_name === f))
|
|
43
|
-
.forEach(async (file) =>
|
|
46
|
+
.forEach(async (file) => this.enqueue('put', type, file));
|
|
44
47
|
descriptors.forEach(async (descriptor) => {
|
|
45
48
|
const path = Path.resolve(directory, descriptor.file_name);
|
|
46
49
|
if (!(await Filesystem.exists(path))) {
|
|
47
|
-
return
|
|
48
|
-
}
|
|
49
|
-
const buff = await Filesystem.readFile(path);
|
|
50
|
-
if (Crypto.sha1(buff) !== descriptor.hash) {
|
|
51
|
-
await this.file('put', type, descriptor.file_name);
|
|
50
|
+
return this.enqueue('del', type, descriptor.file_name);
|
|
52
51
|
}
|
|
52
|
+
this.enqueue('put', type, descriptor.file_name);
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
const paths = this.FILE_TYPES
|
|
@@ -76,10 +76,10 @@ class ThemeExtensionWorker extends AbstractWorker {
|
|
|
76
76
|
switch (event) {
|
|
77
77
|
case 'add':
|
|
78
78
|
case 'change':
|
|
79
|
-
|
|
79
|
+
this.enqueue('put', filetype, filename);
|
|
80
80
|
break;
|
|
81
81
|
case 'unlink':
|
|
82
|
-
|
|
82
|
+
this.enqueue('del', filetype, filename);
|
|
83
83
|
break;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -87,17 +87,27 @@ class ThemeExtensionWorker extends AbstractWorker {
|
|
|
87
87
|
this.command.output.warn(err);
|
|
88
88
|
}
|
|
89
89
|
});
|
|
90
|
+
// quick racing conditions hack
|
|
91
|
+
setInterval(async () => {
|
|
92
|
+
const task = this.queue.shift();
|
|
93
|
+
if (task == null) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
await task();
|
|
97
|
+
}, 10);
|
|
90
98
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
enqueue(op, type, name) {
|
|
100
|
+
this.queue.push(async () => {
|
|
101
|
+
const path = Path.resolve(this.extension.root, type, name);
|
|
102
|
+
await Http.post(`${Env.apiHostname()}/apps/draft/${this.app.config.id}/extensions/${this.extension.id}/file`, {
|
|
103
|
+
body: Form.convert({
|
|
104
|
+
file_name: name,
|
|
105
|
+
file_type: type,
|
|
106
|
+
file_operation: op,
|
|
107
|
+
file_content: await Form.file(path),
|
|
108
|
+
}),
|
|
109
|
+
});
|
|
110
|
+
this.logger.write(`[${op === 'put' ? 'updated' : 'deleted'}] - ${Path.join(type, name)}`);
|
|
101
111
|
});
|
|
102
112
|
}
|
|
103
113
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@youcan/app",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.2.0-beta.
|
|
4
|
+
"version": "1.2.0-beta.2",
|
|
5
5
|
"description": "OCLIF plugin for building apps",
|
|
6
6
|
"author": "YouCan <contact@youcan.shop> (https://youcan.shop)",
|
|
7
7
|
"license": "MIT",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@oclif/core": "^2.15.0",
|
|
19
19
|
"dayjs": "^1.11.10",
|
|
20
|
-
"@youcan/cli-kit": "1.2.0-beta.
|
|
20
|
+
"@youcan/cli-kit": "1.2.0-beta.2"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@oclif/plugin-legacy": "^1.3.0",
|