Skip to content

Commit

Permalink
feat: init plugin transform
Browse files Browse the repository at this point in the history
  • Loading branch information
yjl9903 committed Jan 29, 2023
1 parent 11210f0 commit 870dac6
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 78 deletions.
9 changes: 8 additions & 1 deletion packages/vite-plugin-worker/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,19 @@
"test:ci": "vitest --run",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"mlly": "^1.1.0"
},
"devDependencies": {
"@types/node": "^18.0.0",
"@types/node": "^18.11.18",
"@types/sharedworker": "^0.0.91",
"unbuild": "^1.1.1",
"vite": "^4.0.4",
"vitest": "^0.28.3"
},
"peerDependencies": {
"vite": "^4.0.4"
},
"engines": {
"node": ">=v16.16.0"
}
Expand Down
50 changes: 47 additions & 3 deletions packages/vite-plugin-worker/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,47 @@
export function hello() {
return 'world';
}
import { type Plugin, normalizePath } from 'vite';

import path from 'path';
import { findExports } from 'mlly';

export default function SharedWorker(options?: { root?: string }): Plugin {
let root = process.cwd();
const { root: workerRoot = './worker' } = options ?? {};

return {
name: 'vite-plugin-sharedworker:client',
enforce: 'pre',
configResolved(config) {
root = normalizePath(path.join(config.root, workerRoot));
},
transform(code, id) {
if (id.startsWith(root)) {
const isClient = !id.endsWith('worker_file');

// console.log(id);
if (isClient) {
const exports = findExports(code);

return [
`const worker = new SharedWorker(new URL(${JSON.stringify(
id
)}, import.meta.url), { type: 'module', name: 'worker' });`,
`worker.port.start()`,
...exports
.filter((ex) => ex.name)
.map((ex) => `export const ${ex.name} = (...args: any[]) => {}`)
].join('\n');
} else {
const imports = [
`// vite-plugin-sharedworker starts`,
`import { defineSharedWorker } from 'vite-plugin-sharedworker/runtime'`,
`defineSharedWorker(self)`,
`// vite-plugin-sharedworker ends`,
''
];

return imports.join('\n') + '\n' + code;
}
}
}
};
}
2 changes: 2 additions & 0 deletions packages/vite-plugin-worker/src/runtime.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
/// <reference lib="WebWorker" />

export function defineSharedWorker(self: SharedWorkerGlobalScope) {
self.addEventListener('connect', (event) => {
console.log('connect', event);
Expand Down
2 changes: 1 addition & 1 deletion packages/vite-plugin-worker/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"lib": ["ESNext", "WebWorker"],
"lib": ["ESNext"],
"moduleResolution": "Node",
"esModuleInterop": true,
"strict": true,
Expand Down
19 changes: 9 additions & 10 deletions playground/main.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
const worker1 = new SharedWorker(new URL('./worker.ts', import.meta.url), {
type: 'module'
});

worker1.port.start();
import { add } from './worker';

worker1.port.postMessage('hello 1');
console.log(add(1, 2));

const worker2 = new SharedWorker(new URL('./worker.ts', import.meta.url), {
type: 'module'
const worker = new SharedWorker(new URL('./worker/index.ts', import.meta.url), {
type: 'module',
name: 'worker'
});

worker2.port.start();
worker.port.start();

worker.port.postMessage('hello 1');

worker2.port.postMessage('hello 2');
console.log('OK');

export {};
2 changes: 1 addition & 1 deletion playground/tsconfig.worker.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
"lib": ["ESNext", "WebWorker"],
"types": ["vite/client"]
},
"include": ["./worker.ts"],
"include": ["./worker/*.ts"],
"extends": "./tsconfig.json"
}
3 changes: 2 additions & 1 deletion playground/vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { defineConfig } from 'vite';

import BuildInfo from 'vite-plugin-info';
import SharedWorkerClient from 'vite-plugin-sharedworker';

export default defineConfig({
plugins: [BuildInfo()]
plugins: [BuildInfo(), SharedWorkerClient()]
});
9 changes: 0 additions & 9 deletions playground/worker.ts

This file was deleted.

9 changes: 9 additions & 0 deletions playground/worker/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// /// <reference lib="WebWorker" />
// declare const self: SharedWorkerGlobalScope;
// import { defineSharedWorker } from 'vite-plugin-sharedworker/runtime';
// defineSharedWorker(self);
// export type {};

export function add(a: number, b: number) {
return a + b;
}
65 changes: 13 additions & 52 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 870dac6

Please sign in to comment.