mirror of
https://github.com/modrinth/code.git
synced 2026-08-02 06:05:54 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cdc373986c | ||
|
|
9d939c1b1b |
@@ -1,5 +1,15 @@
|
||||
# @vintl/nuxt
|
||||
|
||||
## 1.8.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 9d939c1: Switched to using module ID markers
|
||||
|
||||
Previously VIntl for Nuxt kept track of files that were used as locale messages and matched module IDs based on them. This, however, was very unreliable in certain environments.
|
||||
|
||||
With this change VIntl for Nuxt now uses ‘markers’, URL parameters added to the end of imported module IDs. This allows it to very quickly test whether a specific module is imported through a message file and should be processed by the VIntl unplugin.
|
||||
|
||||
## 1.7.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vintl/nuxt",
|
||||
"version": "1.7.1",
|
||||
"version": "1.8.0",
|
||||
"description": "Nuxt Module for VIntl integration",
|
||||
"keywords": [
|
||||
"i18n",
|
||||
|
||||
@@ -96,7 +96,7 @@ export default defineNuxtModule<ModuleOptions>({
|
||||
return resolveInResDir(specifier).relativeTo(optionsFile.dst)
|
||||
},
|
||||
registerMessagesFile(file, importPath) {
|
||||
pluginOptionsBank.registerFile(
|
||||
return pluginOptionsBank.registerFile(
|
||||
file,
|
||||
resolvePath(dirname(optionsFile.dst), importPath),
|
||||
)
|
||||
|
||||
@@ -623,11 +623,12 @@ interface GeneratorContext {
|
||||
*
|
||||
* @param file Input message file options.
|
||||
* @param importPath Resolved path.
|
||||
* @returns Marked import path.
|
||||
*/
|
||||
registerMessagesFile(
|
||||
file: t.output<typeof messagesImportSourceSchema>,
|
||||
importPath: string,
|
||||
): void
|
||||
): string
|
||||
|
||||
/**
|
||||
* Resolves a module from the runtime directory.
|
||||
@@ -780,8 +781,10 @@ export function generate(
|
||||
|
||||
for (const messageFile of files) {
|
||||
const { from: importPath, name: importKey } = messageFile
|
||||
const resolvedPath = resolve(messageFile.from)
|
||||
registerMessagesFile(messageFile, resolvedPath)
|
||||
const resolvedPath = registerMessagesFile(
|
||||
messageFile,
|
||||
resolve(messageFile.from),
|
||||
)
|
||||
|
||||
if (isDefaultLocale) {
|
||||
// if import key is 'default' then:
|
||||
|
||||
@@ -12,9 +12,36 @@ import type {
|
||||
|
||||
type UniqueOptions = t.output<typeof messagesImportOptionsSchema>
|
||||
|
||||
class Marker {
|
||||
private readonly regExp: RegExp
|
||||
|
||||
public constructor(public readonly marker: string) {
|
||||
this.regExp = new RegExp(`(\\?|&)${marker}(&|$)`)
|
||||
}
|
||||
|
||||
public apply(id: string) {
|
||||
return `${id}${id.includes('?') ? '&' : '?'}${this.marker}`
|
||||
}
|
||||
|
||||
public matches(id: string) {
|
||||
return this.regExp.test(id)
|
||||
}
|
||||
}
|
||||
|
||||
class MarkedFileSet extends Set<string> {
|
||||
public readonly marker: Marker
|
||||
|
||||
constructor(marker: Marker, iterable?: Iterable<string> | null | undefined) {
|
||||
super(iterable)
|
||||
this.marker = marker
|
||||
}
|
||||
}
|
||||
|
||||
export class PluginOptionsBank {
|
||||
// let the uniqueOptions be a map of unique options to a list of files that have the same options
|
||||
private readonly filesByOptions: Map<UniqueOptions, Set<string>> = new Map()
|
||||
private readonly filesByOptions = new Map<UniqueOptions, MarkedFileSet>()
|
||||
|
||||
private incrementingMarker = 0
|
||||
|
||||
private findOrCreateFileSet(optionsVariation: UniqueOptions) {
|
||||
for (const [knownOptionsVariation, files] of this.filesByOptions) {
|
||||
@@ -31,7 +58,9 @@ export class PluginOptionsBank {
|
||||
parser: optionsVariation.parser,
|
||||
}
|
||||
|
||||
const fileSet = new Set<string>()
|
||||
const marker = new Marker(`icu-messages-${this.incrementingMarker++}`)
|
||||
|
||||
const fileSet = new MarkedFileSet(marker)
|
||||
this.filesByOptions.set(filteredOptions, fileSet)
|
||||
return fileSet
|
||||
}
|
||||
@@ -40,7 +69,8 @@ export class PluginOptionsBank {
|
||||
file: t.output<typeof messagesImportSourceSchema>,
|
||||
resolvedPath: string,
|
||||
) {
|
||||
this.findOrCreateFileSet(file).add(resolvedPath)
|
||||
const { marker } = this.findOrCreateFileSet(file).add(resolvedPath)
|
||||
return marker.apply(resolvedPath)
|
||||
}
|
||||
|
||||
public createOptions<T extends { name: string }>(
|
||||
@@ -49,7 +79,7 @@ export class PluginOptionsBank {
|
||||
const options: PluginOptions<T>[] = []
|
||||
|
||||
for (const [{ format, parser }, files] of this.filesByOptions) {
|
||||
const filter = (id: string) => files.has(id)
|
||||
const filter = (id: string) => files.marker.matches(id)
|
||||
|
||||
options.push({
|
||||
...baseOptions,
|
||||
|
||||
Reference in New Issue
Block a user