@wuchale/vite-plugin 0.10.3 → 0.12.0
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/dist/index.d.ts +5 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -46
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
- package/src/index.ts +0 -189
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
type
|
|
2
|
-
type HMRClient = {
|
|
3
|
-
send: SendFunc;
|
|
4
|
-
};
|
|
1
|
+
import type { CompiledElement } from "wuchale";
|
|
5
2
|
type ViteDevServer = {
|
|
6
3
|
ws: {
|
|
7
|
-
send:
|
|
8
|
-
on: (event: string, cb: (msg: {
|
|
9
|
-
loadID: string | null;
|
|
10
|
-
}, client: HMRClient) => void) => void;
|
|
4
|
+
send: (event: string, data: CompiledElement[]) => void;
|
|
11
5
|
};
|
|
6
|
+
moduleGraph: any;
|
|
12
7
|
};
|
|
13
8
|
declare class Plugin {
|
|
14
9
|
#private;
|
|
@@ -20,9 +15,10 @@ declare class Plugin {
|
|
|
20
15
|
};
|
|
21
16
|
root: string;
|
|
22
17
|
}) => Promise<void>;
|
|
23
|
-
configureServer: (server: ViteDevServer) => void;
|
|
24
18
|
handleHotUpdate: (ctx: {
|
|
25
19
|
file: string;
|
|
20
|
+
server: ViteDevServer;
|
|
21
|
+
timestamp: number;
|
|
26
22
|
}) => Promise<void>;
|
|
27
23
|
resolveId: (source: string, importer?: string) => string;
|
|
28
24
|
load: (id: string) => string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,eAAe,EAAC,MAAM,SAAS,CAAA;AAO3D,KAAK,aAAa,GAAG;IACjB,EAAE,EAAE;QAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;IAC9D,WAAW,EAAE,GAAG,CAAA;CACnB,CAAA;AAED,cAAM,MAAM;;IAER,IAAI,SAAa;gBAgBL,UAAU,EAAE,MAAM;IA+B9B,cAAc,GAAU,QAAQ;QAAE,GAAG,EAAE;YAAE,GAAG,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,mBASvE;IAoBD,eAAe,GAAU,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,mBA+BvF;IAED,SAAS,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,YAK7C;IAED,IAAI,GAAI,IAAI,MAAM,YAiCjB;IAeD,SAAS;eAAa,KAAK;wBAbM,MAAM,MAAM,MAAM;;;;MAaiB;CACvE;AAED,eAAO,MAAM,OAAO,GAAI,aAAa,MAAM,WAA2B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// $$ cd ../.. && npm run test
|
|
2
2
|
import { relative, resolve } from "node:path";
|
|
3
|
-
import { getConfig as getConfig } from "wuchale
|
|
4
|
-
import {
|
|
5
|
-
import { Logger } from "wuchale/log";
|
|
3
|
+
import { getConfig as getConfig, Logger, AdapterHandler } from "wuchale";
|
|
4
|
+
import { catalogVarName } from "wuchale/runtime";
|
|
6
5
|
const pluginName = 'wuchale';
|
|
7
6
|
const virtualPrefix = `virtual:${pluginName}/`;
|
|
8
7
|
const virtualResolvedPrefix = '\0';
|
|
@@ -11,7 +10,7 @@ class Plugin {
|
|
|
11
10
|
#config;
|
|
12
11
|
#locales = [];
|
|
13
12
|
#projectRoot = '';
|
|
14
|
-
#
|
|
13
|
+
#mode;
|
|
15
14
|
#adapters = {};
|
|
16
15
|
#adaptersByLoaderPath = {};
|
|
17
16
|
#adaptersByCatalogPath = {};
|
|
@@ -24,6 +23,7 @@ class Plugin {
|
|
|
24
23
|
this.#config = await getConfig(this.#configPath);
|
|
25
24
|
this.#locales = [this.#config.sourceLocale, ...this.#config.otherLocales];
|
|
26
25
|
this.#log = new Logger(this.#config.messages);
|
|
26
|
+
this.#mode = mode;
|
|
27
27
|
if (Object.keys(this.#config.adapters).length === 0) {
|
|
28
28
|
throw Error('At least one adapter is needed.');
|
|
29
29
|
}
|
|
@@ -48,40 +48,23 @@ class Plugin {
|
|
|
48
48
|
this.#projectRoot = config.root;
|
|
49
49
|
await this.#init(mode);
|
|
50
50
|
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
51
|
+
#loadCatalog(adapter, locale, loadID) {
|
|
52
|
+
const module = adapter.loadDataModule(locale, loadID);
|
|
53
|
+
if (this.#mode !== 'dev') {
|
|
54
|
+
return module;
|
|
55
|
+
}
|
|
56
|
+
return `
|
|
57
|
+
${module}
|
|
58
|
+
let updateCallback
|
|
59
|
+
export const onUpdate = callback => { updateCallback = callback }
|
|
60
|
+
if (import.meta.hot) {
|
|
61
|
+
import.meta.hot.on('${adapter.virtModEvent(locale, loadID)}', newData => {
|
|
62
|
+
${catalogVarName} = newData
|
|
63
|
+
updateCallback?.(newData)
|
|
64
|
+
})
|
|
66
65
|
}
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
#sendUpdateToClient = (adapter, locales) => {
|
|
70
|
-
if (!this.#server) {
|
|
71
|
-
// maybe not in dev mode
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
for (const loc of locales) {
|
|
75
|
-
if (!this.#config.adapters[adapter.key].granularLoad) {
|
|
76
|
-
this.#server.ws.send(adapter.virtModEvent(loc, null), adapter.compiled[loc].items);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
for (const [loadID, state] of Object.entries(adapter.granularStateByID)) {
|
|
80
|
-
const eventName = adapter.virtModEvent(loc, loadID);
|
|
81
|
-
this.#server.ws.send(eventName, state.compiled[loc].items);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
};
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
85
68
|
handleHotUpdate = async (ctx) => {
|
|
86
69
|
if (!(ctx.file in this.#adaptersByCatalogPath)) {
|
|
87
70
|
return;
|
|
@@ -89,20 +72,40 @@ class Plugin {
|
|
|
89
72
|
const adapter = this.#adaptersByCatalogPath[ctx.file];
|
|
90
73
|
const loc = adapter.catalogPathsToLocales[ctx.file];
|
|
91
74
|
await adapter.loadCatalogNCompile(loc);
|
|
92
|
-
|
|
75
|
+
const loadIDsToInvalidate = [];
|
|
76
|
+
if (this.#config.adapters[adapter.key].granularLoad) {
|
|
77
|
+
for (const [loadID, state] of Object.entries(adapter.granularStateByID)) {
|
|
78
|
+
loadIDsToInvalidate.push(loadID);
|
|
79
|
+
const eventName = adapter.virtModEvent(loc, loadID);
|
|
80
|
+
ctx.server.ws.send(eventName, state.compiled[loc].items);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
loadIDsToInvalidate.push(null);
|
|
85
|
+
ctx.server.ws.send(adapter.virtModEvent(loc, null), adapter.compiled[loc].items);
|
|
86
|
+
}
|
|
87
|
+
// invalidate for next reload
|
|
88
|
+
const invalidatedModules = new Set();
|
|
89
|
+
for (const loadID of loadIDsToInvalidate) {
|
|
90
|
+
const fileID = `${virtualResolvedPrefix}${adapter.virtModEvent(loc, loadID)}`;
|
|
91
|
+
for (const module of ctx.server.moduleGraph.getModulesByFile(fileID)) {
|
|
92
|
+
ctx.server.moduleGraph.invalidateModule(module, invalidatedModules, ctx.timestamp, false // no hmr, already sent event
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
93
96
|
};
|
|
94
97
|
resolveId = (source, importer) => {
|
|
95
98
|
if (!source.startsWith(virtualPrefix)) {
|
|
96
99
|
return null;
|
|
97
100
|
}
|
|
98
|
-
return `${virtualResolvedPrefix}${source}
|
|
101
|
+
return `${virtualResolvedPrefix}${source}?importer=${importer}`;
|
|
99
102
|
};
|
|
100
103
|
load = (id) => {
|
|
101
104
|
const prefix = virtualResolvedPrefix + virtualPrefix;
|
|
102
105
|
if (!id.startsWith(prefix)) {
|
|
103
106
|
return null;
|
|
104
107
|
}
|
|
105
|
-
const [path, importer] = id.slice(prefix.length).split('?');
|
|
108
|
+
const [path, importer] = id.slice(prefix.length).split('?importer=');
|
|
106
109
|
const [part, ...rest] = path.split('/');
|
|
107
110
|
if (part === 'catalog') {
|
|
108
111
|
const [adapterKey, loadID, locale] = rest;
|
|
@@ -111,7 +114,7 @@ class Plugin {
|
|
|
111
114
|
this.#log.error(`Adapter not found for key: ${adapterKey}`);
|
|
112
115
|
return null;
|
|
113
116
|
}
|
|
114
|
-
return adapter
|
|
117
|
+
return this.#loadCatalog(adapter, locale, loadID);
|
|
115
118
|
}
|
|
116
119
|
if (part === 'locales') {
|
|
117
120
|
return `export const locales = ['${this.#locales.join("', '")}']`;
|
|
@@ -138,11 +141,7 @@ class Plugin {
|
|
|
138
141
|
const filename = relative(this.#projectRoot, id);
|
|
139
142
|
for (const adapter of Object.values(this.#adapters)) {
|
|
140
143
|
if (adapter.fileMatches(filename)) {
|
|
141
|
-
|
|
142
|
-
if (catalogChanged) {
|
|
143
|
-
this.#sendUpdateToClient(adapter, this.#locales);
|
|
144
|
-
}
|
|
145
|
-
return output;
|
|
144
|
+
return await adapter.transform(code, filename);
|
|
146
145
|
}
|
|
147
146
|
}
|
|
148
147
|
return {};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,SAAS,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wuchale/vite-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Protobuf-like i18n from normal code",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "tsc --watch",
|
|
@@ -27,8 +27,7 @@
|
|
|
27
27
|
"lightweight"
|
|
28
28
|
],
|
|
29
29
|
"files": [
|
|
30
|
-
"dist"
|
|
31
|
-
"src"
|
|
30
|
+
"dist"
|
|
32
31
|
],
|
|
33
32
|
"main": "./dist/index.js",
|
|
34
33
|
"types": "./dist/index.d.ts",
|
|
@@ -41,7 +40,7 @@
|
|
|
41
40
|
"author": "K1DV5",
|
|
42
41
|
"license": "MIT",
|
|
43
42
|
"dependencies": {
|
|
44
|
-
"wuchale": "^0.
|
|
43
|
+
"wuchale": "^0.13.0"
|
|
45
44
|
},
|
|
46
45
|
"devDependencies": {
|
|
47
46
|
"typescript": "^5.8.3"
|
package/src/index.ts
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
// $$ cd ../.. && npm run test
|
|
2
|
-
import { relative, resolve } from "node:path"
|
|
3
|
-
import { getConfig as getConfig, type Config } from "wuchale/config"
|
|
4
|
-
import { AdapterHandler } from "wuchale/handler"
|
|
5
|
-
import type {Mode} from 'wuchale/handler'
|
|
6
|
-
import { Logger } from "wuchale/log"
|
|
7
|
-
|
|
8
|
-
const pluginName = 'wuchale'
|
|
9
|
-
const virtualPrefix = `virtual:${pluginName}/`
|
|
10
|
-
const virtualResolvedPrefix = '\0'
|
|
11
|
-
|
|
12
|
-
type SendFunc = (event: string, data: any[]) => void
|
|
13
|
-
type HMRClient = { send: SendFunc }
|
|
14
|
-
|
|
15
|
-
type ViteDevServer = {
|
|
16
|
-
ws: {
|
|
17
|
-
send: SendFunc,
|
|
18
|
-
on: (event: string, cb: (msg: {loadID: string | null}, client: HMRClient) => void) => void,
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
class Plugin {
|
|
23
|
-
|
|
24
|
-
name = pluginName
|
|
25
|
-
|
|
26
|
-
#config: Config
|
|
27
|
-
#locales: string[] = []
|
|
28
|
-
#projectRoot: string = ''
|
|
29
|
-
|
|
30
|
-
#server: ViteDevServer
|
|
31
|
-
|
|
32
|
-
#adapters: {[key: string]: AdapterHandler} = {}
|
|
33
|
-
#adaptersByLoaderPath: {[loader: string]: AdapterHandler} = {}
|
|
34
|
-
#adaptersByCatalogPath: {[path: string]: AdapterHandler} = {}
|
|
35
|
-
|
|
36
|
-
#log: Logger
|
|
37
|
-
|
|
38
|
-
#configPath: string
|
|
39
|
-
|
|
40
|
-
constructor(configPath: string) {
|
|
41
|
-
this.#configPath = configPath
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
#init = async (mode: Mode) => {
|
|
45
|
-
this.#config = await getConfig(this.#configPath)
|
|
46
|
-
this.#locales = [this.#config.sourceLocale, ...this.#config.otherLocales]
|
|
47
|
-
this.#log = new Logger(this.#config.messages)
|
|
48
|
-
if (Object.keys(this.#config.adapters).length === 0) {
|
|
49
|
-
throw Error('At least one adapter is needed.')
|
|
50
|
-
}
|
|
51
|
-
for (const [key, adapter] of Object.entries(this.#config.adapters)) {
|
|
52
|
-
const handler = new AdapterHandler(
|
|
53
|
-
adapter,
|
|
54
|
-
key,
|
|
55
|
-
this.#config,
|
|
56
|
-
mode,
|
|
57
|
-
virtualPrefix,
|
|
58
|
-
this.#projectRoot,
|
|
59
|
-
this.#log,
|
|
60
|
-
)
|
|
61
|
-
await handler.init()
|
|
62
|
-
this.#adapters[key] = handler
|
|
63
|
-
this.#adaptersByLoaderPath[resolve(handler.loaderPath)] = handler
|
|
64
|
-
for (const fname of Object.keys(handler.catalogPathsToLocales)) {
|
|
65
|
-
this.#adaptersByCatalogPath[fname] = handler
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
configResolved = async (config: { env: { DEV?: boolean }, root: string }) => {
|
|
71
|
-
let mode: Mode
|
|
72
|
-
if (config.env.DEV) {
|
|
73
|
-
mode = 'dev'
|
|
74
|
-
} else {
|
|
75
|
-
mode = 'prod'
|
|
76
|
-
}
|
|
77
|
-
this.#projectRoot = config.root
|
|
78
|
-
await this.#init(mode)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
configureServer = (server: ViteDevServer) => {
|
|
82
|
-
this.#server = server
|
|
83
|
-
// initial load
|
|
84
|
-
for (const [key, adapter] of Object.entries(this.#adapters)) {
|
|
85
|
-
for (const loc of this.#locales) {
|
|
86
|
-
const event = adapter.virtModEvent(loc, null)
|
|
87
|
-
server.ws.on(event, (payload, client) => {
|
|
88
|
-
const eventSend = adapter.virtModEvent(loc, payload.loadID)
|
|
89
|
-
if (!this.#config.adapters[key].granularLoad) {
|
|
90
|
-
client.send(eventSend, adapter.compiled[loc].items)
|
|
91
|
-
return
|
|
92
|
-
}
|
|
93
|
-
const compiled = adapter.granularStateByID[payload.loadID].compiled[loc]
|
|
94
|
-
client.send(eventSend, compiled.items)
|
|
95
|
-
})
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
#sendUpdateToClient = (adapter: AdapterHandler, locales: string[]) => {
|
|
101
|
-
if (!this.#server) {
|
|
102
|
-
// maybe not in dev mode
|
|
103
|
-
return
|
|
104
|
-
}
|
|
105
|
-
for (const loc of locales) {
|
|
106
|
-
if (!this.#config.adapters[adapter.key].granularLoad) {
|
|
107
|
-
this.#server.ws.send(adapter.virtModEvent(loc, null), adapter.compiled[loc].items)
|
|
108
|
-
return
|
|
109
|
-
}
|
|
110
|
-
for (const [loadID, state] of Object.entries(adapter.granularStateByID)) {
|
|
111
|
-
const eventName = adapter.virtModEvent(loc, loadID)
|
|
112
|
-
this.#server.ws.send(eventName, state.compiled[loc].items)
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
handleHotUpdate = async (ctx: {file: string}) => {
|
|
118
|
-
if (!(ctx.file in this.#adaptersByCatalogPath)) {
|
|
119
|
-
return
|
|
120
|
-
}
|
|
121
|
-
const adapter = this.#adaptersByCatalogPath[ctx.file]
|
|
122
|
-
const loc = adapter.catalogPathsToLocales[ctx.file]
|
|
123
|
-
await adapter.loadCatalogNCompile(loc)
|
|
124
|
-
this.#sendUpdateToClient(adapter, [loc])
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
resolveId = (source: string, importer?: string) => {
|
|
128
|
-
if (!source.startsWith(virtualPrefix)) {
|
|
129
|
-
return null
|
|
130
|
-
}
|
|
131
|
-
return `${virtualResolvedPrefix}${source}?${importer}`
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
load = (id: string) => {
|
|
135
|
-
const prefix = virtualResolvedPrefix + virtualPrefix
|
|
136
|
-
if (!id.startsWith(prefix)) {
|
|
137
|
-
return null
|
|
138
|
-
}
|
|
139
|
-
const [path, importer] = id.slice(prefix.length).split('?')
|
|
140
|
-
const [part, ...rest] = path.split('/')
|
|
141
|
-
if (part === 'catalog') {
|
|
142
|
-
const [adapterKey, loadID, locale] = rest
|
|
143
|
-
const adapter = this.#adapters[adapterKey]
|
|
144
|
-
if (adapter == null) {
|
|
145
|
-
this.#log.error(`Adapter not found for key: ${adapterKey}`)
|
|
146
|
-
return null
|
|
147
|
-
}
|
|
148
|
-
return adapter.loadDataModule(locale, loadID)
|
|
149
|
-
}
|
|
150
|
-
if (part === 'locales') {
|
|
151
|
-
return `export const locales = ['${this.#locales.join("', '")}']`
|
|
152
|
-
}
|
|
153
|
-
if (part !== 'proxy') {
|
|
154
|
-
this.#log.error(`Unknown virtual request: ${id}`)
|
|
155
|
-
return null
|
|
156
|
-
}
|
|
157
|
-
// loader proxy
|
|
158
|
-
const adapter = this.#adaptersByLoaderPath[importer]
|
|
159
|
-
if (adapter == null) {
|
|
160
|
-
this.#log.error(`Adapter not found for filename: ${importer}`)
|
|
161
|
-
return
|
|
162
|
-
}
|
|
163
|
-
if (rest[0] === 'sync') {
|
|
164
|
-
return adapter.getProxySync()
|
|
165
|
-
}
|
|
166
|
-
return adapter.getProxy()
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
#transformHandler = async (code: string, id: string) => {
|
|
170
|
-
if (!this.#config.hmr) {
|
|
171
|
-
return {}
|
|
172
|
-
}
|
|
173
|
-
const filename = relative(this.#projectRoot, id)
|
|
174
|
-
for (const adapter of Object.values(this.#adapters)) {
|
|
175
|
-
if (adapter.fileMatches(filename)) {
|
|
176
|
-
const {catalogChanged, ...output} = await adapter.transform(code, filename)
|
|
177
|
-
if (catalogChanged) {
|
|
178
|
-
this.#sendUpdateToClient(adapter, this.#locales)
|
|
179
|
-
}
|
|
180
|
-
return output
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return {}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
transform = { order: <'pre'>'pre', handler: this.#transformHandler }
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
export const wuchale = (configPath?: string) => new Plugin(configPath)
|