@utoo/web 1.0.7 → 1.2.0-rc.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.
Files changed (37) hide show
  1. package/esm/aa0ad15d2a587c43406f.wasm +0 -0
  2. package/esm/internalProject.d.ts +1 -0
  3. package/esm/internalProject.js +10 -85
  4. package/esm/loaderWorker.js +2 -0
  5. package/esm/loaderWorker.js.LICENSE.txt +44 -0
  6. package/esm/loaderWorkerPool.d.ts +3 -0
  7. package/esm/loaderWorkerPool.js +125 -0
  8. package/esm/project.d.ts +1 -0
  9. package/esm/project.js +2 -0
  10. package/esm/sabcom.d.ts +31 -0
  11. package/esm/sabcom.js +71 -0
  12. package/esm/type.d.ts +1 -0
  13. package/esm/utoo/index.d.ts +71 -46
  14. package/esm/utoo/index.js +260 -168
  15. package/esm/utoo/index_bg.wasm +0 -0
  16. package/esm/webpackLoaders/loaders/less-loader/index.js +7 -12
  17. package/esm/webpackLoaders/loaders/less-loader/options.json +1 -3
  18. package/esm/webpackLoaders/loaders/less-loader/utils.js +14 -34
  19. package/esm/webpackLoaders/worker/cjs.js +253 -58
  20. package/esm/webpackLoaders/worker/index.d.ts +2 -2
  21. package/esm/webpackLoaders/worker/index.js +36 -26
  22. package/esm/webpackLoaders/worker/polyfills/fastGlobPolyfill.d.ts +2 -0
  23. package/esm/webpackLoaders/worker/polyfills/fastGlobPolyfill.js +48 -0
  24. package/esm/webpackLoaders/worker/polyfills/fsPolyfill.d.ts +124 -0
  25. package/esm/webpackLoaders/worker/polyfills/fsPolyfill.js +316 -0
  26. package/esm/webpackLoaders/worker/polyfills/fsPromisesPolyfill.d.ts +9 -0
  27. package/esm/webpackLoaders/worker/polyfills/fsPromisesPolyfill.js +9 -0
  28. package/esm/webpackLoaders/worker/polyfills/nodePolyFills.d.ts +94 -0
  29. package/esm/webpackLoaders/worker/polyfills/nodePolyFills.js +229 -0
  30. package/esm/webpackLoaders/worker/polyfills/workerThreadsPolyfill.d.ts +7 -0
  31. package/esm/webpackLoaders/worker/polyfills/workerThreadsPolyfill.js +16 -0
  32. package/esm/webpackLoaders/worker/type.d.ts +1 -1
  33. package/package.json +11 -11
  34. package/esm/webpackLoaders/worker/nodePolyFills.d.ts +0 -14
  35. package/esm/webpackLoaders/worker/nodePolyFills.js +0 -24
  36. package/esm/webpackLoaders/workerContent.d.ts +0 -2
  37. package/esm/webpackLoaders/workerContent.js +0 -1
@@ -0,0 +1,44 @@
1
+ /*!
2
+ * SystemJS 6.15.1
3
+ */
4
+
5
+ /*!
6
+ * The buffer module from node.js, for the browser.
7
+ *
8
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
9
+ * @license MIT
10
+ */
11
+
12
+ /*!
13
+ * The buffer module from node.js, for the browser.
14
+ *
15
+ * @author Feross Aboukhadijeh <https://feross.org>
16
+ * @license MIT
17
+ */
18
+
19
+ /*!
20
+ * fill-range <https://github.com/jonschlinkert/fill-range>
21
+ *
22
+ * Copyright (c) 2014-present, Jon Schlinkert.
23
+ * Licensed under the MIT License.
24
+ */
25
+
26
+ /*!
27
+ * is-number <https://github.com/jonschlinkert/is-number>
28
+ *
29
+ * Copyright (c) 2014-present, Jon Schlinkert.
30
+ * Released under the MIT License.
31
+ */
32
+
33
+ /*!
34
+ * to-regex-range <https://github.com/micromatch/to-regex-range>
35
+ *
36
+ * Copyright (c) 2015-present, Jon Schlinkert.
37
+ * Released under the MIT License.
38
+ */
39
+
40
+ /*! https://mths.be/punycode v1.4.1 by @mathias */
41
+
42
+ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
43
+
44
+ /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
@@ -0,0 +1,3 @@
1
+ import { Binding } from "./type";
2
+ import { Project as ProjectInternal } from "./utoo";
3
+ export declare const runLoaderWorkerPool: (binding: Binding, projectCwd: string, projectInternal: ProjectInternal, workerUrl: string, loadersImportMap?: Record<string, string>) => Promise<void>;
@@ -0,0 +1,125 @@
1
+ import { SAB_OP_COPY_FILE, SAB_OP_MKDIR, SAB_OP_READ_DIR, SAB_OP_READ_FILE, SAB_OP_RM, SAB_OP_RMDIR, SAB_OP_WRITE_FILE, SabComHost, } from "./sabcom";
2
+ import initWasm, { registerWorkerScheduler, workerCreated, } from "./utoo";
3
+ let nextWorkerId = 0;
4
+ const loaderWorkers = {};
5
+ export const runLoaderWorkerPool = async (binding, projectCwd, projectInternal, workerUrl, loadersImportMap) => {
6
+ registerWorkerScheduler(async (creation) => {
7
+ const { options: { filename, cwd }, } = creation;
8
+ nextWorkerId += 1;
9
+ const workerId = nextWorkerId;
10
+ const sab = new SharedArrayBuffer(1024 * 1024 * 10); // 10MB
11
+ const sabHost = new SabComHost(sab);
12
+ const worker = new Worker(workerUrl, { name: filename });
13
+ worker.onmessage = async (event) => {
14
+ if (event.data === "sab_request") {
15
+ const { op, data: path } = sabHost.readRequest();
16
+ try {
17
+ if (op === SAB_OP_READ_FILE) {
18
+ const bytes = await projectInternal.read(path);
19
+ sabHost.writeResponse(bytes);
20
+ }
21
+ else if (op === SAB_OP_READ_DIR) {
22
+ const entries = await projectInternal.readDir(path);
23
+ sabHost.writeResponse(JSON.stringify(entries.map((e) => e.toJSON())));
24
+ }
25
+ else if (op === SAB_OP_WRITE_FILE) {
26
+ const { content, encoding } = JSON.parse(path);
27
+ const filePath = content.path;
28
+ const fileContent = content.data;
29
+ // TODO: handle binary content (base64?)
30
+ await projectInternal.writeString(filePath, fileContent);
31
+ sabHost.writeResponse("ok");
32
+ }
33
+ else if (op === SAB_OP_MKDIR) {
34
+ const { path: dirPath, recursive } = JSON.parse(path);
35
+ if (recursive) {
36
+ await projectInternal.createDirAll(dirPath);
37
+ }
38
+ else {
39
+ await projectInternal.createDir(dirPath);
40
+ }
41
+ sabHost.writeResponse("ok");
42
+ }
43
+ else if (op === SAB_OP_RM) {
44
+ const { path: rmPath, recursive } = JSON.parse(path);
45
+ // Mimic internalProject.rm logic
46
+ const metadata = await projectInternal.metadata(rmPath);
47
+ const type = metadata.toJSON().type;
48
+ if (type === "file") {
49
+ await projectInternal.removeFile(rmPath);
50
+ }
51
+ else if (type === "directory") {
52
+ await projectInternal.removeDir(rmPath, !!recursive);
53
+ }
54
+ sabHost.writeResponse("ok");
55
+ }
56
+ else if (op === SAB_OP_RMDIR) {
57
+ const { path: rmPath, recursive } = JSON.parse(path);
58
+ await projectInternal.removeDir(rmPath, !!recursive);
59
+ sabHost.writeResponse("ok");
60
+ }
61
+ else if (op === SAB_OP_COPY_FILE) {
62
+ const { src, dst } = JSON.parse(path);
63
+ await projectInternal.copyFile(src, dst);
64
+ sabHost.writeResponse("ok");
65
+ }
66
+ else {
67
+ sabHost.writeError("Unknown op");
68
+ }
69
+ }
70
+ catch (e) {
71
+ sabHost.writeError(e.message);
72
+ }
73
+ }
74
+ };
75
+ let finalCwd = cwd;
76
+ let finalFilename = filename;
77
+ if (projectCwd) {
78
+ const sep = "/";
79
+ const pCwd = projectCwd.endsWith(sep)
80
+ ? projectCwd.slice(0, -1)
81
+ : projectCwd;
82
+ let cCwd = cwd.startsWith(sep) ? cwd.slice(1) : cwd;
83
+ if (cCwd === "." || cCwd === "./") {
84
+ cCwd = "";
85
+ }
86
+ finalCwd = cCwd ? `${pCwd}${sep}${cCwd}` : pCwd;
87
+ if (!filename.startsWith("/")) {
88
+ let fName = filename;
89
+ if (fName.startsWith("./"))
90
+ fName = fName.slice(2);
91
+ finalFilename = `${pCwd}${sep}${fName}`;
92
+ }
93
+ }
94
+ worker.postMessage([
95
+ // @ts-ignore
96
+ initWasm.__wbindgen_wasm_module,
97
+ binding.memory,
98
+ {
99
+ workerData: {
100
+ cwd: finalCwd,
101
+ workerId: workerId,
102
+ },
103
+ loaderAssets: {
104
+ importMaps: { ...loadersImportMap },
105
+ entrypoint: finalFilename,
106
+ },
107
+ sab,
108
+ },
109
+ ]);
110
+ const workers = loaderWorkers[filename] || (loaderWorkers[filename] = new Map());
111
+ workers.set(workerId, worker);
112
+ workerCreated(workerId);
113
+ }, (termination) => {
114
+ const { workerId, options } = termination;
115
+ const entrypoint = options.filename;
116
+ const workers = loaderWorkers[entrypoint];
117
+ if (workers) {
118
+ const worker = workers.get(workerId);
119
+ if (worker) {
120
+ worker.terminate();
121
+ workers.delete(workerId);
122
+ }
123
+ }
124
+ });
125
+ };
package/esm/project.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { BuildOutput, Dirent, PackFile, ProjectEndpoint, ProjectOptions, ServiceWorkerOptions } from "./type";
2
2
  export declare class Project implements ProjectEndpoint {
3
3
  #private;
4
+ private options;
4
5
  readonly cwd: string;
5
6
  readonly serviceWorkerOptions?: ServiceWorkerOptions;
6
7
  private remote;
package/esm/project.js CHANGED
@@ -21,6 +21,7 @@ const ConnectedPorts = new Set();
21
21
  export class Project {
22
22
  constructor(options) {
23
23
  var _a, _b;
24
+ this.options = options;
24
25
  _Project_mount.set(this, void 0);
25
26
  const { cwd, workerUrl, wasmUrl, threadWorkerUrl, serviceWorker, logFilter, loadersImportMap, } = options;
26
27
  this.cwd = cwd;
@@ -43,6 +44,7 @@ export class Project {
43
44
  cwd,
44
45
  wasmUrl,
45
46
  threadWorkerUrl,
47
+ loaderWorkerUrl: this.options.loaderWorkerUrl,
46
48
  loadersImportMap,
47
49
  logFilter,
48
50
  }), "f");
@@ -0,0 +1,31 @@
1
+ export declare const SAB_STATE_IDLE = 0;
2
+ export declare const SAB_STATE_REQUEST = 1;
3
+ export declare const SAB_STATE_RESPONSE = 2;
4
+ export declare const SAB_STATE_ERROR = 3;
5
+ export declare const SAB_OP_READ_FILE = 1;
6
+ export declare const SAB_OP_READ_DIR = 2;
7
+ export declare const SAB_OP_WRITE_FILE = 3;
8
+ export declare const SAB_OP_MKDIR = 4;
9
+ export declare const SAB_OP_RM = 5;
10
+ export declare const SAB_OP_RMDIR = 6;
11
+ export declare const SAB_OP_COPY_FILE = 7;
12
+ export declare class SabComHost {
13
+ private sab;
14
+ private int32;
15
+ private uint8;
16
+ constructor(sab: SharedArrayBuffer);
17
+ readRequest(): {
18
+ op: number;
19
+ data: string;
20
+ };
21
+ writeResponse(data: Uint8Array | string): void;
22
+ writeError(message: string): void;
23
+ }
24
+ export declare class SabComClient {
25
+ private sab;
26
+ private notifyHost;
27
+ private int32;
28
+ private uint8;
29
+ constructor(sab: SharedArrayBuffer, notifyHost: () => void);
30
+ call(op: number, data: string): Uint8Array<ArrayBuffer>;
31
+ }
package/esm/sabcom.js ADDED
@@ -0,0 +1,71 @@
1
+ export const SAB_STATE_IDLE = 0;
2
+ export const SAB_STATE_REQUEST = 1;
3
+ export const SAB_STATE_RESPONSE = 2;
4
+ export const SAB_STATE_ERROR = 3;
5
+ export const SAB_OP_READ_FILE = 1;
6
+ export const SAB_OP_READ_DIR = 2;
7
+ export const SAB_OP_WRITE_FILE = 3;
8
+ export const SAB_OP_MKDIR = 4;
9
+ export const SAB_OP_RM = 5;
10
+ export const SAB_OP_RMDIR = 6;
11
+ export const SAB_OP_COPY_FILE = 7;
12
+ // Layout:
13
+ // 0: State (Int32)
14
+ // 1: Op (Int32)
15
+ // 2: Data Length (Int32)
16
+ // 12...: Data (Uint8) - Start at byte 12 (3 * 4 bytes)
17
+ export class SabComHost {
18
+ constructor(sab) {
19
+ this.sab = sab;
20
+ this.int32 = new Int32Array(sab);
21
+ this.uint8 = new Uint8Array(sab);
22
+ }
23
+ readRequest() {
24
+ const op = this.int32[1];
25
+ const len = this.int32[2];
26
+ const data = new TextDecoder().decode(this.uint8.slice(12, 12 + len));
27
+ return { op, data };
28
+ }
29
+ writeResponse(data) {
30
+ if (typeof data === "string") {
31
+ data = new TextEncoder().encode(data);
32
+ }
33
+ // TODO: Check size overflow
34
+ this.int32[2] = data.length;
35
+ this.uint8.set(data, 12);
36
+ Atomics.store(this.int32, 0, SAB_STATE_RESPONSE);
37
+ Atomics.notify(this.int32, 0);
38
+ }
39
+ writeError(message) {
40
+ const data = new TextEncoder().encode(message);
41
+ this.int32[2] = data.length;
42
+ this.uint8.set(data, 12);
43
+ Atomics.store(this.int32, 0, SAB_STATE_ERROR);
44
+ Atomics.notify(this.int32, 0);
45
+ }
46
+ }
47
+ export class SabComClient {
48
+ constructor(sab, notifyHost) {
49
+ this.sab = sab;
50
+ this.notifyHost = notifyHost;
51
+ this.int32 = new Int32Array(sab);
52
+ this.uint8 = new Uint8Array(sab);
53
+ }
54
+ call(op, data) {
55
+ const encoded = new TextEncoder().encode(data);
56
+ this.int32[1] = op;
57
+ this.int32[2] = encoded.length;
58
+ this.uint8.set(encoded, 12);
59
+ Atomics.store(this.int32, 0, SAB_STATE_REQUEST);
60
+ this.notifyHost();
61
+ Atomics.wait(this.int32, 0, SAB_STATE_REQUEST);
62
+ const state = Atomics.load(this.int32, 0);
63
+ if (state === SAB_STATE_ERROR) {
64
+ const len = this.int32[2];
65
+ const msg = new TextDecoder().decode(this.uint8.slice(12, 12 + len));
66
+ throw new Error(msg);
67
+ }
68
+ const len = this.int32[2];
69
+ return this.uint8.slice(12, 12 + len);
70
+ }
71
+ }
package/esm/type.d.ts CHANGED
@@ -44,6 +44,7 @@ export interface ProjectOptions {
44
44
  cwd: string;
45
45
  workerUrl: string;
46
46
  threadWorkerUrl: string;
47
+ loaderWorkerUrl?: string;
47
48
  wasmUrl?: string;
48
49
  serviceWorker?: ServiceWorkerOptions;
49
50
  logFilter?: string;
@@ -1,38 +1,27 @@
1
1
  /**
2
- * @returns {Promise<WorkerTermination>}
2
+ * @param {any} message
3
+ * @returns {Promise<void>}
3
4
  */
4
- export function recvWorkerTermination(): Promise<WorkerTermination>;
5
+ export function sendTaskMessage(message: any): Promise<void>;
5
6
  /**
6
- * @param {number} task_id
7
7
  * @param {number} worker_id
8
- * @returns {Promise<void>}
8
+ * @returns {Promise<WasmTaskMessage>}
9
9
  */
10
- export function notifyWorkerAck(task_id: number, worker_id: number): Promise<void>;
10
+ export function recvTaskMessageInWorker(worker_id: number): Promise<WasmTaskMessage>;
11
+ export function init_pack(): void;
11
12
  /**
12
- * @param {number} task_id
13
- * @param {string} message
14
- * @returns {Promise<void>}
13
+ * @param {string} filter
15
14
  */
16
- export function sendTaskMessage(task_id: number, message: string): Promise<void>;
15
+ export function init_log_filter(filter: string): void;
17
16
  /**
18
17
  * @param {number} worker_id
19
- * @returns {Promise<string>}
20
- */
21
- export function recvMessageInWorker(worker_id: number): Promise<string>;
22
- /**
23
- * @param {string} pool_id
24
- * @returns {Promise<number>}
25
18
  */
26
- export function recvWorkerRequest(pool_id: string): Promise<number>;
19
+ export function workerCreated(worker_id: number): void;
27
20
  /**
28
- * @returns {Promise<PoolOptions>}
21
+ * @param {Function} creator
22
+ * @param {Function} terminator
29
23
  */
30
- export function recvPoolRequest(): Promise<PoolOptions>;
31
- /**
32
- * @param {string} filter
33
- */
34
- export function init_log_filter(filter: string): void;
35
- export function init_pack(): void;
24
+ export function registerWorkerScheduler(creator: Function, terminator: Function): void;
36
25
  /**
37
26
  * Entry point for web workers
38
27
  * @param {number} ptr
@@ -79,28 +68,6 @@ export class Metadata {
79
68
  __wbg_ptr: number | undefined;
80
69
  free(): void;
81
70
  }
82
- export class PoolOptions {
83
- static __wrap(ptr: any): any;
84
- __destroy_into_raw(): number | undefined;
85
- __wbg_ptr: number | undefined;
86
- free(): void;
87
- /**
88
- * @param {string} arg0
89
- */
90
- set filename(arg0: string);
91
- /**
92
- * @returns {string}
93
- */
94
- get filename(): string;
95
- /**
96
- * @param {number} arg0
97
- */
98
- set maxConcurrency(arg0: number);
99
- /**
100
- * @returns {number}
101
- */
102
- get maxConcurrency(): number;
103
- }
104
71
  export class Project {
105
72
  /**
106
73
  * @param {string} cwd
@@ -197,7 +164,43 @@ export class Project {
197
164
  */
198
165
  copyFile(src: string, dst: string): Promise<void>;
199
166
  }
200
- export class WorkerTermination {
167
+ export class WasmTaskMessage {
168
+ static __wrap(ptr: any): any;
169
+ __destroy_into_raw(): number | undefined;
170
+ __wbg_ptr: number | undefined;
171
+ free(): void;
172
+ /**
173
+ * @param {number} arg0
174
+ */
175
+ set taskId(arg0: number);
176
+ /**
177
+ * @returns {number}
178
+ */
179
+ get taskId(): number;
180
+ /**
181
+ * @param {string} arg0
182
+ */
183
+ set data(arg0: string);
184
+ /**
185
+ * @returns {string}
186
+ */
187
+ get data(): string;
188
+ }
189
+ export class WebWorkerCreation {
190
+ static __wrap(ptr: any): any;
191
+ __destroy_into_raw(): number | undefined;
192
+ __wbg_ptr: number | undefined;
193
+ free(): void;
194
+ /**
195
+ * @param {WebWorkerOptions} arg0
196
+ */
197
+ set options(arg0: WebWorkerOptions);
198
+ /**
199
+ * @returns {WebWorkerOptions}
200
+ */
201
+ get options(): WebWorkerOptions;
202
+ }
203
+ export class WebWorkerOptions {
201
204
  static __wrap(ptr: any): any;
202
205
  __destroy_into_raw(): number | undefined;
203
206
  __wbg_ptr: number | undefined;
@@ -210,6 +213,28 @@ export class WorkerTermination {
210
213
  * @returns {string}
211
214
  */
212
215
  get filename(): string;
216
+ /**
217
+ * @param {string} arg0
218
+ */
219
+ set cwd(arg0: string);
220
+ /**
221
+ * @returns {string}
222
+ */
223
+ get cwd(): string;
224
+ }
225
+ export class WebWorkerTermination {
226
+ static __wrap(ptr: any): any;
227
+ __destroy_into_raw(): number | undefined;
228
+ __wbg_ptr: number | undefined;
229
+ free(): void;
230
+ /**
231
+ * @param {WebWorkerOptions} arg0
232
+ */
233
+ set options(arg0: WebWorkerOptions);
234
+ /**
235
+ * @returns {WebWorkerOptions}
236
+ */
237
+ get options(): WebWorkerOptions;
213
238
  /**
214
239
  * @param {number} arg0
215
240
  */