@verbaly/vite 0.32.0 → 0.33.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.js +5 -4
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -88,12 +88,13 @@ function verbaly(options = {}) {
|
|
|
88
88
|
},
|
|
89
89
|
transform(code, id) {
|
|
90
90
|
if (!isTransformTarget(id) || !included(id)) return void 0;
|
|
91
|
-
const {
|
|
92
|
-
|
|
91
|
+
const { messages, result } = transformSource(code, id, registry);
|
|
92
|
+
const found = Object.entries(messages);
|
|
93
|
+
if (!isBuild && found.length > 0) {
|
|
93
94
|
const source = catalogs[cfg.sourceLocale] ??= {};
|
|
94
95
|
let changed = false;
|
|
95
|
-
for (const
|
|
96
|
-
source[
|
|
96
|
+
for (const [key, message] of found) if (source[key] !== message) {
|
|
97
|
+
source[key] = message;
|
|
97
98
|
changed = true;
|
|
98
99
|
}
|
|
99
100
|
if (changed) scheduleFlush();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\n LOCALE_MODULE_PREFIX,\n MessageRegistry,\n RESOLVED_VIRTUAL_ID,\n createSourceFilter,\n isTransformTarget,\n loadCatalogs,\n loadConfig,\n loadVirtualModule,\n resolveVirtualId,\n runBuildGate,\n syncCatalogs,\n transformSource,\n writeCatalog,\n writeDts,\n type Catalogs,\n type PluginOptions,\n type ResolvedConfig,\n} from '@verbaly/compiler';\nimport { readFileSync } from 'node:fs';\nimport type { Plugin, ViteDevServer } from 'vite';\n\nfunction safeRead(file: string): string | undefined {\n try {\n return readFileSync(file, 'utf8');\n } catch {\n return undefined;\n }\n}\n\nexport type { VerbalyConfig } from '@verbaly/compiler';\nexport type ViteVerbalyOptions = PluginOptions;\n\nexport default function verbaly(options: ViteVerbalyOptions = {}): Plugin {\n let cfg: ResolvedConfig;\n let catalogs: Catalogs;\n let isBuild = false;\n let server: ViteDevServer | undefined;\n let writeTimer: ReturnType<typeof setTimeout> | undefined;\n let included: (id: string) => boolean;\n const registry = new MessageRegistry();\n const selfWrites = new Map<string, string>();\n\n function invalidateVirtual(): void {\n if (!server) return;\n const ids = [\n RESOLVED_VIRTUAL_ID,\n ...cfg.locales.map((locale) => LOCALE_MODULE_PREFIX + locale),\n ];\n for (const id of ids) {\n const mod = server.moduleGraph.getModuleById(id);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n server.ws.send({ type: 'full-reload' });\n }\n\n // cfg.dts is the merged option: @verbaly/astro fills its override before Vite resolves config\n function flushDts(): void {\n if (cfg.dts === false) return;\n writeDts(cfg, catalogs[cfg.sourceLocale] ?? {}, cfg.dts);\n }\n\n function flushCatalogs(): void {\n syncCatalogs(cfg, catalogs, registry);\n for (const locale of cfg.locales) {\n const serialized = writeCatalog(cfg, locale, catalogs[locale] ?? {});\n selfWrites.set(locale, serialized);\n }\n flushDts();\n invalidateVirtual();\n }\n\n function scheduleFlush(): void {\n clearTimeout(writeTimer);\n writeTimer = setTimeout(flushCatalogs, 50);\n }\n\n async function reloadFromDisk(): Promise<void> {\n cfg = await loadConfig(cfg.root, options);\n catalogs = loadCatalogs(cfg);\n invalidateVirtual();\n }\n\n return {\n name: 'verbaly',\n enforce: 'pre',\n\n async configResolved(viteConfig) {\n isBuild = viteConfig.command === 'build';\n cfg = await loadConfig(options.root ?? viteConfig.root, options);\n catalogs = loadCatalogs(cfg);\n included = createSourceFilter(cfg);\n if (!isBuild) {\n flushDts();\n }\n },\n\n configureServer(devServer) {\n server = devServer;\n devServer.watcher.add(cfg.dir);\n const onCatalogFile = (file: string): void => {\n if (!file.startsWith(cfg.dir) || !file.endsWith('.json')) return;\n const locale = file.split(/[\\\\/]/).pop()!.slice(0, -5);\n const expected = selfWrites.get(locale);\n if (expected !== undefined) {\n selfWrites.delete(locale);\n // content compare: a stale entry must not swallow an external edit\n if (safeRead(file) === expected) return;\n }\n void reloadFromDisk();\n };\n devServer.watcher.on('change', onCatalogFile);\n devServer.watcher.on('add', onCatalogFile);\n devServer.watcher.on('unlink', (file) => {\n if (isTransformTarget(file) && included(file)) {\n registry.remove(file);\n scheduleFlush();\n }\n });\n },\n\n resolveId(id) {\n return resolveVirtualId(id);\n },\n\n load(id) {\n return loadVirtualModule(id, cfg, catalogs);\n },\n\n transform(code, id) {\n if (!isTransformTarget(id) || !included(id)) return undefined;\n const {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\n LOCALE_MODULE_PREFIX,\n MessageRegistry,\n RESOLVED_VIRTUAL_ID,\n createSourceFilter,\n isTransformTarget,\n loadCatalogs,\n loadConfig,\n loadVirtualModule,\n resolveVirtualId,\n runBuildGate,\n syncCatalogs,\n transformSource,\n writeCatalog,\n writeDts,\n type Catalogs,\n type PluginOptions,\n type ResolvedConfig,\n} from '@verbaly/compiler';\nimport { readFileSync } from 'node:fs';\nimport type { Plugin, ViteDevServer } from 'vite';\n\nfunction safeRead(file: string): string | undefined {\n try {\n return readFileSync(file, 'utf8');\n } catch {\n return undefined;\n }\n}\n\nexport type { VerbalyConfig } from '@verbaly/compiler';\nexport type ViteVerbalyOptions = PluginOptions;\n\nexport default function verbaly(options: ViteVerbalyOptions = {}): Plugin {\n let cfg: ResolvedConfig;\n let catalogs: Catalogs;\n let isBuild = false;\n let server: ViteDevServer | undefined;\n let writeTimer: ReturnType<typeof setTimeout> | undefined;\n let included: (id: string) => boolean;\n const registry = new MessageRegistry();\n const selfWrites = new Map<string, string>();\n\n function invalidateVirtual(): void {\n if (!server) return;\n const ids = [\n RESOLVED_VIRTUAL_ID,\n ...cfg.locales.map((locale) => LOCALE_MODULE_PREFIX + locale),\n ];\n for (const id of ids) {\n const mod = server.moduleGraph.getModuleById(id);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n server.ws.send({ type: 'full-reload' });\n }\n\n // cfg.dts is the merged option: @verbaly/astro fills its override before Vite resolves config\n function flushDts(): void {\n if (cfg.dts === false) return;\n writeDts(cfg, catalogs[cfg.sourceLocale] ?? {}, cfg.dts);\n }\n\n function flushCatalogs(): void {\n syncCatalogs(cfg, catalogs, registry);\n for (const locale of cfg.locales) {\n const serialized = writeCatalog(cfg, locale, catalogs[locale] ?? {});\n selfWrites.set(locale, serialized);\n }\n flushDts();\n invalidateVirtual();\n }\n\n function scheduleFlush(): void {\n clearTimeout(writeTimer);\n writeTimer = setTimeout(flushCatalogs, 50);\n }\n\n async function reloadFromDisk(): Promise<void> {\n cfg = await loadConfig(cfg.root, options);\n catalogs = loadCatalogs(cfg);\n invalidateVirtual();\n }\n\n return {\n name: 'verbaly',\n enforce: 'pre',\n\n async configResolved(viteConfig) {\n isBuild = viteConfig.command === 'build';\n cfg = await loadConfig(options.root ?? viteConfig.root, options);\n catalogs = loadCatalogs(cfg);\n included = createSourceFilter(cfg);\n if (!isBuild) {\n flushDts();\n }\n },\n\n configureServer(devServer) {\n server = devServer;\n devServer.watcher.add(cfg.dir);\n const onCatalogFile = (file: string): void => {\n if (!file.startsWith(cfg.dir) || !file.endsWith('.json')) return;\n const locale = file.split(/[\\\\/]/).pop()!.slice(0, -5);\n const expected = selfWrites.get(locale);\n if (expected !== undefined) {\n selfWrites.delete(locale);\n // content compare: a stale entry must not swallow an external edit\n if (safeRead(file) === expected) return;\n }\n void reloadFromDisk();\n };\n devServer.watcher.on('change', onCatalogFile);\n devServer.watcher.on('add', onCatalogFile);\n devServer.watcher.on('unlink', (file) => {\n if (isTransformTarget(file) && included(file)) {\n registry.remove(file);\n scheduleFlush();\n }\n });\n },\n\n resolveId(id) {\n return resolveVirtualId(id);\n },\n\n load(id) {\n return loadVirtualModule(id, cfg, catalogs);\n },\n\n transform(code, id) {\n if (!isTransformTarget(id) || !included(id)) return undefined;\n const { messages, result } = transformSource(code, id, registry);\n\n const found = Object.entries(messages);\n if (!isBuild && found.length > 0) {\n const source = (catalogs[cfg.sourceLocale] ??= {});\n let changed = false;\n for (const [key, message] of found) {\n if (source[key] !== message) {\n source[key] = message;\n changed = true;\n }\n }\n if (changed) scheduleFlush();\n }\n\n return result ?? undefined;\n },\n\n buildEnd() {\n if (!isBuild) return;\n runBuildGate(cfg, registry, options.failOnMissing);\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verbaly/vite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.0",
|
|
4
4
|
"description": "Zero-config Vite plugin for Verbaly: extraction, codegen and HMR.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"i18n",
|
|
@@ -38,15 +38,15 @@
|
|
|
38
38
|
"access": "public"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@verbaly/compiler": "0.
|
|
41
|
+
"@verbaly/compiler": "0.33.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"vite": "^7.0.0 || ^8.0.0",
|
|
45
|
-
"verbaly": "^0.
|
|
45
|
+
"verbaly": "^0.33.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"vite": "^8.1.5",
|
|
49
|
-
"verbaly": "^0.
|
|
49
|
+
"verbaly": "^0.33.0"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {
|
|
52
52
|
"build": "tsdown",
|