@cldmv/slothlet 3.1.0 → 3.2.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/README.md +12 -7
- package/dist/lib/builders/api_builder.mjs +101 -4
- package/dist/lib/handlers/api-manager.mjs +179 -14
- package/dist/lib/handlers/metadata.mjs +15 -0
- package/dist/lib/handlers/unified-wrapper.mjs +22 -11
- package/dist/lib/handlers/version-manager.mjs +773 -0
- package/dist/lib/helpers/config.mjs +20 -5
- package/dist/lib/i18n/languages/de-de.json +15 -1
- package/dist/lib/i18n/languages/en-gb.json +15 -1
- package/dist/lib/i18n/languages/en-us.json +15 -1
- package/dist/lib/i18n/languages/es-mx.json +15 -1
- package/dist/lib/i18n/languages/fr-fr.json +15 -1
- package/dist/lib/i18n/languages/hi-in.json +15 -1
- package/dist/lib/i18n/languages/ja-jp.json +15 -1
- package/dist/lib/i18n/languages/ko-kr.json +15 -1
- package/dist/lib/i18n/languages/pt-br.json +15 -1
- package/dist/lib/i18n/languages/ru-ru.json +15 -1
- package/dist/lib/i18n/languages/zh-cn.json +15 -1
- package/dist/slothlet.mjs +70 -1
- package/package.json +5 -2
- package/types/dist/lib/builders/api_builder.d.mts.map +1 -1
- package/types/dist/lib/handlers/api-manager.d.mts +28 -0
- package/types/dist/lib/handlers/api-manager.d.mts.map +1 -1
- package/types/dist/lib/handlers/metadata.d.mts +15 -0
- package/types/dist/lib/handlers/metadata.d.mts.map +1 -1
- package/types/dist/lib/handlers/unified-wrapper.d.mts.map +1 -1
- package/types/dist/lib/handlers/version-manager.d.mts +234 -0
- package/types/dist/lib/handlers/version-manager.d.mts.map +1 -0
- package/types/dist/lib/helpers/config.d.mts.map +1 -1
- package/types/dist/slothlet.d.mts +15 -0
- package/types/dist/slothlet.d.mts.map +1 -1
|
@@ -125,7 +125,8 @@ export class Config extends ComponentBase {
|
|
|
125
125
|
ownership: false,
|
|
126
126
|
context: false,
|
|
127
127
|
initialization: false,
|
|
128
|
-
materialize: false
|
|
128
|
+
materialize: false,
|
|
129
|
+
versioning: false
|
|
129
130
|
};
|
|
130
131
|
}
|
|
131
132
|
|
|
@@ -140,7 +141,8 @@ export class Config extends ComponentBase {
|
|
|
140
141
|
ownership: true,
|
|
141
142
|
context: true,
|
|
142
143
|
initialization: true,
|
|
143
|
-
materialize: true
|
|
144
|
+
materialize: true,
|
|
145
|
+
versioning: true
|
|
144
146
|
};
|
|
145
147
|
}
|
|
146
148
|
|
|
@@ -155,7 +157,8 @@ export class Config extends ComponentBase {
|
|
|
155
157
|
ownership: debug.ownership || false,
|
|
156
158
|
context: debug.context || false,
|
|
157
159
|
initialization: debug.initialization || false,
|
|
158
|
-
materialize: debug.materialize || false
|
|
160
|
+
materialize: debug.materialize || false,
|
|
161
|
+
versioning: debug.versioning || false
|
|
159
162
|
};
|
|
160
163
|
}
|
|
161
164
|
|
|
@@ -169,7 +172,8 @@ export class Config extends ComponentBase {
|
|
|
169
172
|
ownership: false,
|
|
170
173
|
context: false,
|
|
171
174
|
initialization: false,
|
|
172
|
-
materialize: false
|
|
175
|
+
materialize: false,
|
|
176
|
+
versioning: false
|
|
173
177
|
};
|
|
174
178
|
}
|
|
175
179
|
|
|
@@ -270,6 +274,16 @@ export class Config extends ComponentBase {
|
|
|
270
274
|
}
|
|
271
275
|
|
|
272
276
|
|
|
277
|
+
if (config.versionDispatcher !== undefined && config.versionDispatcher !== null) {
|
|
278
|
+
if (typeof config.versionDispatcher !== "string" && typeof config.versionDispatcher !== "function") {
|
|
279
|
+
throw new this.SlothletError("INVALID_CONFIG_VERSION_DISPATCHER", {
|
|
280
|
+
received: typeof config.versionDispatcher,
|
|
281
|
+
validationError: true
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
|
|
273
287
|
let i18nConfig = null;
|
|
274
288
|
if (config.i18n && typeof config.i18n === "object") {
|
|
275
289
|
i18nConfig = {
|
|
@@ -300,7 +314,8 @@ export class Config extends ComponentBase {
|
|
|
300
314
|
backgroundMaterialize: config.backgroundMaterialize === true,
|
|
301
315
|
silent: config.silent === true,
|
|
302
316
|
typescript: this.normalizeTypeScript(config.typescript),
|
|
303
|
-
env: this.normalizeEnv(config.env)
|
|
317
|
+
env: this.normalizeEnv(config.env),
|
|
318
|
+
versionDispatcher: config.versionDispatcher ?? null
|
|
304
319
|
};
|
|
305
320
|
}
|
|
306
321
|
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "Pfad existiert bereits und Kollisionsmodus ist 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "Pfad-Segment existiert nicht oder kann nicht durchlaufen werden",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "apiPath ist für die removeApi Operation erforderlich",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "Versionierte API-Komponenten können nicht am Root-Pfad eingehängt werden; geben Sie einen punkt-separierten Pfad an, z. B. 'auth' oder 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "Ungültiger API-Pfad: '{apiPath}' existiert nicht in der geladenen API.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "Stellen Sie sicher, dass der API-Pfad existiert, bevor Sie ihn benutzen. Benutzen Sie einen dot-separierten Pfad (z.B. 'math.add'), der auf ein aktuell geladenes Modul verweist.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "Zugriff auf Hook-Funktionalität nicht möglich: Der Hook-Manager ist nicht initialisiert.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "Für diese Slothlet-Instanz ist kein Context-Manager konfiguriert.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "Kontext-Operationen erfordern einen Context-Manager. Initialisieren Sie Slothlet mit 'contextManager: new AsyncContextManager()' oder 'contextManager: new LiveContextManager()' in Ihrer Konfiguration.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "Nicht unterstützter Context-Manager: '{manager}'. Nur AsyncContextManager und LiveContextManager werden unterstützt.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Benutzen Sie AsyncContextManager für asynchrone/ALS-basierten Kontext oder LiveContextManager für synchronen Live-Binding-Kontext."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Benutzen Sie AsyncContextManager für asynchrone/ALS-basierten Kontext oder LiveContextManager für synchronen Live-Binding-Kontext.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher muss ein String (Metadatenschlüssel) oder eine Funktion sein; erhalten: {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version muss ein nicht leerer String sein; erhalten: {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "Version '{version}' ist unter dem Pfad '{apiPath}' nicht registriert.",
|
|
375
|
+
"VERSION_NO_DEFAULT": "Für den Pfad '{apiPath}' ist keine Standardversion konfiguriert, und aus den Aufrufer-Metadaten konnte keine Version aufgelöst werden.",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "Der versionierte Dispatcher unter '{apiPath}' ist ein Namespace und keine aufrufbare Funktion.",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "Version '{version}' ist unter dem Pfad '{apiPath}' bereits registriert. Verwenden Sie collisionMode 'replace', um sie zu überschreiben.",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "Rufen Sie zuerst api.slothlet.versioning.unregister('{apiPath}', '{version}') auf oder registrieren Sie mit einem anderen Versions-Tag.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "Rufen Sie api.slothlet.versioning.list('{apiPath}') auf, um zu sehen, welche Versions-Tags derzeit unter diesem Pfad registriert sind.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "Die Funktion versionDispatcher hat '{returned}' zurückgegeben, was kein für den Pfad '{apiPath}' registriertes Versions-Tag ist.",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "Version aufgelöst: {version} für Pfad {apiPath} (Aufrufer: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "Keine Discriminator-Übereinstimmung für Pfad {apiPath}; Standardversion {version} wird verwendet.",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "Version {version} unter {logicalPath} registriert (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "Version {version} von {logicalPath} abgemeldet"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "de-de",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "path already exists and collision mode is 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "path segment does not exist or is not traversable",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "apiPath is required for removeApi operation",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "versioned API components cannot be mounted at the root path; provide a dot-separated path such as 'auth' or 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "Invalid API path: '{apiPath}' does not exist in the loaded API.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "Ensure the API path exists before using it. Use a dot-separated path (e.g. 'math.add') that refers to a currently loaded module.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "Cannot access hook functionality: the hook manager is not initialized.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "No context manager is configured for this slothlet instance.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "Context operations require a context manager. Initialize slothlet with 'contextManager: new AsyncContextManager()' or 'contextManager: new LiveContextManager()' in your configuration.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "Unsupported context manager: '{manager}'. Only AsyncContextManager and LiveContextManager are supported.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager for async/ALS-based context isolation or LiveContextManager for synchronous live-binding context."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager for async/ALS-based context isolation or LiveContextManager for synchronous live-binding context.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher must be a string (metadata key) or a function, received {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version must be a non-empty string, received {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "Version '{version}' is not registered at path '{apiPath}'",
|
|
375
|
+
"VERSION_NO_DEFAULT": "No default version configured for path '{apiPath}' and no version could be resolved from caller metadata",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "The versioned dispatcher at '{apiPath}' is a namespace, not a callable function",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "Version '{version}' is already registered at path '{apiPath}'. Use collisionMode 'replace' to overwrite",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "Call api.slothlet.versioning.unregister('{apiPath}', '{version}') first, or register with a different version tag.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "Call api.slothlet.versioning.list('{apiPath}') to see which version tags are currently registered at that path.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "versionDispatcher function returned '{returned}' which is not a registered version tag for path '{apiPath}'",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "Version resolved: {version} for path {apiPath} (caller: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "No discriminator match for path {apiPath}; using default version {version}",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "Version {version} registered at {logicalPath} (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "Version {version} unregistered from {logicalPath}"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "en-gb",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "path already exists and collision mode is 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "path segment does not exist or is not traversable",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "apiPath is required for removeApi operation",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "versioned API components cannot be mounted at the root path; provide a dot-separated path such as 'auth' or 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "Invalid API path: '{apiPath}' does not exist in the loaded API.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "Ensure the API path exists before using it. Use a dot-separated path (e.g. 'math.add') that refers to a currently loaded module.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "Cannot access hook functionality: the hook manager is not initialized.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "No context manager is configured for this slothlet instance.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "Context operations require a context manager. Initialize slothlet with 'contextManager: new AsyncContextManager()' or 'contextManager: new LiveContextManager()' in your configuration.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "Unsupported context manager: '{manager}'. Only AsyncContextManager and LiveContextManager are supported.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager for async/ALS-based context isolation or LiveContextManager for synchronous live-binding context."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager for async/ALS-based context isolation or LiveContextManager for synchronous live-binding context.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher must be a string (metadata key) or a function, received {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version must be a non-empty string, received {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "Version '{version}' is not registered at path '{apiPath}'",
|
|
375
|
+
"VERSION_NO_DEFAULT": "No default version configured for path '{apiPath}' and no version could be resolved from caller metadata",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "The versioned dispatcher at '{apiPath}' is a namespace, not a callable function",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "Version '{version}' is already registered at path '{apiPath}'. Use collisionMode 'replace' to overwrite",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "Call api.slothlet.versioning.unregister('{apiPath}', '{version}') first, or register with a different version tag.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "Call api.slothlet.versioning.list('{apiPath}') to see which version tags are currently registered at that path.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "versionDispatcher function returned '{returned}' which is not a registered version tag for path '{apiPath}'",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "Version resolved: {version} for path {apiPath} (caller: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "No discriminator match for path {apiPath}; using default version {version}",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "Version {version} registered at {logicalPath} (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "Version {version} unregistered from {logicalPath}"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "en-us",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "la ruta ya existe y el modo de colisión es 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "el segmento de ruta no existe o no se puede recorrer",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "apiPath es obligatorio para la operación removeApi",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "Los componentes API versionados no pueden montarse en la ruta raíz; proporcione una ruta separada por puntos como 'auth' o 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "Ruta de API inválida: '{apiPath}' no existe en la API cargada.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "Asegúrese de que la ruta de la API existe antes de usarla. Use una ruta separada por puntos (ej. 'math.add') que se refiera a un módulo cargado actualmente.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "No se puede acceder a la funcionalidad de ganchos: el gestor de ganchos no está inicializado.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "No se ha configurado ningún gestor de contexto para esta instancia de slothlet.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "Las operaciones de contexto requieren un gestor de contexto. Inicialice slothlet con 'contextManager: new AsyncContextManager()' o 'contextManager: new LiveContextManager()' en su configuración.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "Gestor de contexto no soportado: '{manager}'. Solo se soportan AsyncContextManager y LiveContextManager.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager para aislamiento de contexto basado en async/ALS o LiveContextManager para contexto de enlace en vivo síncrono."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager para aislamiento de contexto basado en async/ALS o LiveContextManager para contexto de enlace en vivo síncrono.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher debe ser una cadena (clave de metadatos) o una función; recibido: {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version debe ser una cadena no vacía; recibido: {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "La versión '{version}' no está registrada en la ruta '{apiPath}'.",
|
|
375
|
+
"VERSION_NO_DEFAULT": "No hay versión predeterminada configurada para la ruta '{apiPath}' y no se pudo resolver ninguna versión desde los metadatos del llamador.",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "El despachador versionado en '{apiPath}' es un namespace, no una función invocable.",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "La versión '{version}' ya está registrada en la ruta '{apiPath}'. Use collisionMode 'replace' para sobrescribir.",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "Llame primero a api.slothlet.versioning.unregister('{apiPath}', '{version}') o regístrela con una etiqueta de versión diferente.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "Llame a api.slothlet.versioning.list('{apiPath}') para ver qué etiquetas de versión están actualmente registradas en esa ruta.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "La función versionDispatcher devolvió '{returned}', que no es una etiqueta de versión registrada para la ruta '{apiPath}'.",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "Versión resuelta: {version} para la ruta {apiPath} (llamador: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "Sin coincidencia del discriminador para la ruta {apiPath}; se usa la versión predeterminada {version}.",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "Versión {version} registrada en {logicalPath} (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "Versión {version} dada de baja de {logicalPath}"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "es-mx",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "le chemin existe déjà et le mode de collision est 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "le segment de chemin n'existe pas ou n'est pas traversable",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "apiPath est requis pour l'opération removeApi",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "Les composants API versionnés ne peuvent pas être montés à la racine ; fournissez un chemin séparé par des points, tel que 'auth' ou 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "Chemin d'API invalide : '{apiPath}' n'existe pas dans l'API chargée.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "Assurez-vous que le chemin d'API existe avant de l'utiliser. Utilisez un chemin séparé par des points (ex : 'math.add') qui fait référence à un module actuellement chargé.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "Impossible d'accéder aux fonctionnalités de hook : le gestionnaire de hook n'est pas initialisé.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "Aucun gestionnaire de contexte n'est configuré pour cette instance Slothlet.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "Les opérations de contexte nécessitent un gestionnaire de contexte. Initialisez Slothlet avec 'contextManager: new AsyncContextManager()' ou 'contextManager: new LiveContextManager()' dans votre configuration.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "Gestionnaire de contexte non supporté : '{manager}'. Seuls AsyncContextManager et LiveContextManager sont supportés.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Utilisez AsyncContextManager pour l'isolation de contexte basée sur l'async/ALS ou LiveContextManager pour un contexte de live-binding synchrone."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Utilisez AsyncContextManager pour l'isolation de contexte basée sur l'async/ALS ou LiveContextManager pour un contexte de live-binding synchrone.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher doit être une chaîne (clé de métadonnées) ou une fonction ; reçu : {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version doit être une chaîne non vide ; reçu : {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "La version '{version}' n'est pas enregistrée au chemin '{apiPath}'.",
|
|
375
|
+
"VERSION_NO_DEFAULT": "Aucune version par défaut configurée pour le chemin '{apiPath}' et aucune version n'a pu être résolue depuis les métadonnées de l'appelant.",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "Le dispatcher versionné à '{apiPath}' est un espace de noms, pas une fonction appelable.",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "La version '{version}' est déjà enregistrée au chemin '{apiPath}'. Utilisez collisionMode 'replace' pour écraser.",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "Appelez d'abord api.slothlet.versioning.unregister('{apiPath}', '{version}') ou enregistrez avec un tag de version différent.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "Appelez api.slothlet.versioning.list('{apiPath}') pour voir quels tags de version sont actuellement enregistrés à ce chemin.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "La fonction versionDispatcher a retourné '{returned}', qui n'est pas un tag de version enregistré pour le chemin '{apiPath}'.",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "Version résolue : {version} pour le chemin {apiPath} (appelant : {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "Aucune correspondance de discriminateur pour le chemin {apiPath} ; utilisation de la version par défaut {version}.",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "Version {version} enregistrée à {logicalPath} (moduleID : {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "Version {version} désinscrite de {logicalPath}"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "fr-fr",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "पथ पहले से मौजूद है और टकराव मोड 'error' है",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "पथ खंड मौजूद नहीं है या पार करने योग्य नहीं है",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "removeApi ऑपरेशन के लिए apiPath आवश्यक है",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "संस्करणित API घटकों को रूट पथ पर माउंट नहीं किया जा सकता, इसके बजाय 'auth' या 'v1.auth' जैसा डॉट-अलग पथ प्रदान करें",
|
|
361
362
|
"INVALID_API_PATH": "अमान्य API पथ: लोड की गई API में '{apiPath}' मौजूद नहीं है।",
|
|
362
363
|
"HINT_INVALID_API_PATH": "उपयोग करने से पहले सुनिश्चित करें कि API पथ मौजूद है। डॉट-सेपरेटेड पथ (उदा. 'math.add') का उपयोग करें जो वर्तमान में लोड किए गए मॉड्यूल को संदर्भित करता है।",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "हुक कार्यक्षमता तक नहीं पहुँचा जा सकता: हुक मैनेजर प्रारंभ नहीं किया गया है।",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "इस slothlet इंस्टेंस के लिए कोई संदर्भ प्रबंधक (context manager) कॉन्फ़िगर नहीं है।",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "संदर्भ संचालन के लिए एक संदर्भ प्रबंधक की आवश्यकता होती है। अपने कॉन्फ़िगरेशन में 'contextManager: new AsyncContextManager()' या 'contextManager: new LiveContextManager()' के साथ slothlet प्रारंभ करें।",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "असमर्थित संदर्भ प्रबंधक: '{manager}'। केवल AsyncContextManager और LiveContextManager समर्थित हैं।",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "एसिंक/ALS-आधारित संदर्भ अलगाव के लिए AsyncContextManager या सिंक्रोनस लाइव-बाइंडिंग संदर्भ के लिए LiveContextManager का उपयोग करें।"
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "एसिंक/ALS-आधारित संदर्भ अलगाव के लिए AsyncContextManager या सिंक्रोनस लाइव-बाइंडिंग संदर्भ के लिए LiveContextManager का उपयोग करें।",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher एक स्ट्रिंग (मेटाडेटा कुंजी) या फ़ंक्शन होना चाहिए; प्राप्त: {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version एक गैर-रिक्त स्ट्रिंग होनी चाहिए; प्राप्त: {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "संस्करण '{version}' पथ '{apiPath}' पर पंजीकृत नहीं है।",
|
|
375
|
+
"VERSION_NO_DEFAULT": "पथ '{apiPath}' के लिए कोई डिफ़ॉल्ट संस्करण कॉन्फ़िगर नहीं किया गया है और कॉलर मेटाडेटा से कोई संस्करण हल नहीं किया जा सका।",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "'{apiPath}' पर वर्शन Dispatcher एक namespace है, कॉल करने योग्य फ़ंक्शन नहीं।",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "संस्करण '{version}' पहले से ही पथ '{apiPath}' पर पंजीकृत है। अधिलेखित करने के लिए collisionMode 'replace' का उपयोग करें।",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "पहले api.slothlet.versioning.unregister('{apiPath}', '{version}') को कॉल करें या किसी भिन्न संस्करण टैग के साथ पंजीकृत करें।",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "api.slothlet.versioning.list('{apiPath}') को कॉल करें यह देखने के लिए कि उस पथ पर कौन से संस्करण टैग वर्तमान में पंजीकृत हैं।",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "versionDispatcher फ़ंक्शन ने '{returned}' लौटाया, जो पथ '{apiPath}' के लिए पंजीकृत संस्करण टैग नहीं है।",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "संस्करण हल किया गया: {version}, पथ: {apiPath} (कॉलर: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "पथ {apiPath} के लिए कोई Discriminator मिलान नहीं; डिफ़ॉल्ट संस्करण {version} का उपयोग किया जा रहा है।",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "संस्करण {version} को {logicalPath} पर पंजीकृत किया गया (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "संस्करण {version} को {logicalPath} से हटाया गया"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "hi-in",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "パスが既に存在し、衝突モードが 'error' です",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "パスセグメントが存在しないか、探索不可能です",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "removeApi 操作には apiPath が必要です",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "バージョン管理された API コンポーネントはルートパスにマウントできません。'auth' や 'v1.auth' のようなドット区切りのパスを指定してください",
|
|
361
362
|
"INVALID_API_PATH": "無効な API パス: '{apiPath}' は読み込まれた API 内に存在しません。",
|
|
362
363
|
"HINT_INVALID_API_PATH": "API パスを使用する前に存在することを確認してください。現在読み込まれているモジュールを参照するドット区切りのパス (例: 'math.add') を使用してください。",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "フック機能にアクセスできません: フックマネージャーが初期化されていません。",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "この Slothlet インスタンスにはコンテキストマネージャーが構成されていません。",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "コンテキスト操作にはコンテキストマネージャーが必要です。構成時に 'contextManager: new AsyncContextManager()' または 'contextManager: new LiveContextManager()' を使って Slothlet を初期化してください。",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "サポートされていないコンテキストマネージャー: '{manager}' です。 AsyncContextManager と LiveContextManager のみがサポートされています。",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "async/ALS ベースのコンテキスト分離には AsyncContextManager を、同期的な live-binding コンテキストには LiveContextManager を使用してください。"
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "async/ALS ベースのコンテキスト分離には AsyncContextManager を、同期的な live-binding コンテキストには LiveContextManager を使用してください。",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher は文字列(メタデータキー)または関数である必要があります。受信値: {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version は空でない文字列である必要があります。受信値: {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "バージョン '{version}' はパス '{apiPath}' に登録されていません。",
|
|
375
|
+
"VERSION_NO_DEFAULT": "パス '{apiPath}' にデフォルトバージョンが設定されておらず、呼び出し元メタデータからバージョンを解決できませんでした。",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "'{apiPath}' のバージョン Dispatcher は名前空間であり、呼び出し可能な関数ではありません。",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "バージョン '{version}' はすでにパス '{apiPath}' に登録されています。上書きするには collisionMode 'replace' を使用してください。",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "最初に api.slothlet.versioning.unregister('{apiPath}', '{version}') を呼び出すか、別のバージョンタグで登録してください。",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "api.slothlet.versioning.list('{apiPath}') を呼び出して、そのパスに現在登録されているバージョンタグを確認してください。",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "versionDispatcher 関数が '{returned}' を返しましたが、これはパス '{apiPath}' の登録済みバージョンタグではありません。",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "バージョン解決済み: {version}、パス: {apiPath}(呼び出し元: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "パス {apiPath} の Discriminator に一致なし。デフォルトバージョン {version} を使用します。",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "バージョン {version} が {logicalPath} に登録されました(moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "バージョン {version} が {logicalPath} から登録解除されました"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "ja-jp",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "경로가 이미 존재하고 충돌 모드가 'error'임",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "경로 세그먼트가 존재하지 않거나 탐색할 수 없음",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "removeApi 작업에 apiPath가 필요함",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "버전이 지정된 API 컴포넌트는 루트 경로에 마운트할 수 없습니다. 'auth' 또는 'v1.auth'와 같이 점으로 구분된 경로를 제공하세요",
|
|
361
362
|
"INVALID_API_PATH": "유효하지 않은 API 경로: 로드된 API에 '{apiPath}'이(가) 존재하지 않습니다.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "API 경로가 사용 전에 존재하는지 확인하십시오. 현재 로드된 모듈을 가리키는 점 구분 경로(예: 'math.add')를 사용하십시오.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "후크 기능에 액세스할 수 없습니다: 후크 관리자가 초기화되지 않았습니다.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "이 Slothlet 인스턴스에 설정된 컨텍스트 관리자가 없습니다.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "컨텍스트 작업에는 컨텍스트 관리자가 필요합니다. 설정 시 'contextManager: new AsyncContextManager()' 또는 'contextManager: new LiveContextManager()'로 Slothlet을 초기화하십시오.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "지원되지 않는 컨텍스트 관리자: '{manager}'. AsyncContextManager와 LiveContextManager만 지원됩니다.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "비동기/ALS 기반 컨텍스트 격리는 AsyncContextManager를, 동기식 라이브 데이터 바인딩 컨텍스트에는 LiveContextManager를 사용하십시오."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "비동기/ALS 기반 컨텍스트 격리는 AsyncContextManager를, 동기식 라이브 데이터 바인딩 컨텍스트에는 LiveContextManager를 사용하십시오.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher는 문자열(메타데이터 키) 또는 함수여야 합니다. 수신됨: {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version은 비어 있지 않은 문자열이어야 합니다. 수신됨: {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "버전 '{version}'은(는) 경로 '{apiPath}'에 등록되지 않았습니다.",
|
|
375
|
+
"VERSION_NO_DEFAULT": "경로 '{apiPath}'에 대한 기본 버전이 구성되지 않았으며, 호출자 메타데이터에서 버전을 해석할 수 없습니다.",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "'{apiPath}'의 버전 Dispatcher는 네임스페이스이며 호출 가능한 함수가 아닙니다.",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "버전 '{version}'은(는) 이미 경로 '{apiPath}'에 등록되어 있습니다. 덮어쓰려면 collisionMode 'replace'를 사용하세요.",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "먼저 api.slothlet.versioning.unregister('{apiPath}', '{version}')를 호출하거나 다른 버전 태그로 등록하세요.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "api.slothlet.versioning.list('{apiPath}')를 호출하여 해당 경로에 현재 등록된 버전 태그를 확인하세요.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "versionDispatcher 함수가 '{returned}'를 반환했는데, 이는 경로 '{apiPath}'에 등록된 버전 태그가 아닙니다.",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "버전 해석됨: {version}, 경로: {apiPath} (호출자: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "경로 {apiPath}에 대한 Discriminator 일치 없음; 기본 버전 {version}을(를) 사용합니다.",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "버전 {version}이(가) {logicalPath}에 등록됨 (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "버전 {version}이(가) {logicalPath}에서 등록 취소됨"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "ko-kr",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "o caminho já existe e o modo de colisão é 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "o segmento do caminho não existe ou não é atravessável",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "apiPath é obrigatório para a operação removeApi",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "Componentes de API versionados não podem ser montados no caminho raiz; forneça um caminho separado por pontos como 'auth' ou 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "Caminho de API inválido: '{apiPath}' não existe na API carregada.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "Certifique-se de que o caminho da API existe antes de usá-lo. Use um caminho separado por pontos (ex: 'math.add') que se refira a um módulo carregado no momento.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "Não é possível acessar a funcionalidade de gancho (hook): o gerenciador de ganchos não foi inicializado.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "Nenhum gerenciador de contexto está configurado para esta instância do slothlet.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "As operações de contexto requerem um gerenciador de contexto. Inicialize o slothlet com 'contextManager: new AsyncContextManager()' ou 'contextManager: new LiveContextManager()' em sua configuração.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "Gerenciador de contexto não suportado: '{manager}'. Apenas AsyncContextManager e LiveContextManager são suportados.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager para isolamento de contexto baseado em async/ALS ou LiveContextManager para contexto síncrono de live-binding."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Use AsyncContextManager para isolamento de contexto baseado em async/ALS ou LiveContextManager para contexto síncrono de live-binding.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher deve ser uma string (chave de metadados) ou uma função; recebido: {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version deve ser uma string não vazia; recebido: {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "A versão '{version}' não está registrada no caminho '{apiPath}'.",
|
|
375
|
+
"VERSION_NO_DEFAULT": "Nenhuma versão padrão configurada para o caminho '{apiPath}' e nenhuma versão pôde ser resolvida a partir dos metadados do chamador.",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "O despachante versionado em '{apiPath}' é um namespace, não uma função invocável.",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "A versão '{version}' já está registrada no caminho '{apiPath}'. Use collisionMode 'replace' para sobrescrever.",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "Chame api.slothlet.versioning.unregister('{apiPath}', '{version}') primeiro ou registre com uma tag de versão diferente.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "Chame api.slothlet.versioning.list('{apiPath}') para ver quais tags de versão estão atualmente registradas nesse caminho.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "A função versionDispatcher retornou '{returned}', que não é uma tag de versão registrada para o caminho '{apiPath}'.",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "Versão resolvida: {version} para o caminho {apiPath} (chamador: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "Nenhuma correspondência de discriminador para o caminho {apiPath}; usando versão padrão {version}.",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "Versão {version} registrada em {logicalPath} (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "Versão {version} removida de {logicalPath}"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "pt-br",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "Путь уже существует и режим столкновения 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "Сегмент пути не существует или не может быть пройден",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "apiPath обязателен для операции removeApi",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "Версионированные API-компоненты нельзя монтировать в корневом пути; укажите путь через точку, например 'auth' или 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "Неверный API-путь: '{apiPath}' не существует в загруженной API.",
|
|
362
363
|
"HINT_INVALID_API_PATH": "Убедитесь, что путь API существует перед использованием. Используйте точечную нотацию, напр. 'math.add'.",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "Невозможно использовать hooks: менеджер hook не инициализирован.",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "Для этого экземпляра Slothlet не настроен менеджер контекста.",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "Инициализируйте Slothlet с 'contextManager: new AsyncContextManager()' или 'new LiveContextManager()'.",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "Неподдерживаемый менеджер контекста: '{manager}'. Поддерживаются AsyncContextManager и LiveContextManager.",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Используйте AsyncContextManager для async/ALS или LiveContextManager для live-binding."
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "Используйте AsyncContextManager для async/ALS или LiveContextManager для live-binding.",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher должен быть строкой (ключ метаданных) или функцией; получено: {received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version должен быть непустой строкой; получено: {received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "Версия '{version}' не зарегистрирована по пути '{apiPath}'.",
|
|
375
|
+
"VERSION_NO_DEFAULT": "Для пути '{apiPath}' не настроена версия по умолчанию, и версия не может быть определена из метаданных вызывающего.",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "Версионированный диспетчер по пути '{apiPath}' является пространством имён, а не вызываемой функцией.",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "Версия '{version}' уже зарегистрирована по пути '{apiPath}'. Используйте collisionMode 'replace' для замены.",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "Сначала вызовите api.slothlet.versioning.unregister('{apiPath}', '{version}') или зарегистрируйте с другим тегом версии.",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "Вызовите api.slothlet.versioning.list('{apiPath}'), чтобы увидеть, какие теги версий зарегистрированы по этому пути.",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "Функция versionDispatcher вернула '{returned}', что не является зарегистрированным тегом версии для пути '{apiPath}'.",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "Версия определена: {version} для пути {apiPath} (вызывающий: {callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "Нет совпадения дискриминатора для пути {apiPath}; используется версия по умолчанию {version}.",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "Версия {version} зарегистрирована в {logicalPath} (moduleID: {moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "Версия {version} удалена из {logicalPath}"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "ru-ru",
|
|
@@ -358,6 +358,7 @@
|
|
|
358
358
|
"API_PATH_REASON_COLLISION_ERROR": "路径已存在且冲突模式为 'error'",
|
|
359
359
|
"API_PATH_REASON_NOT_TRAVERSABLE": "路径段不存在或不可遍历",
|
|
360
360
|
"API_PATH_REASON_REQUIRED": "removeApi 操作需要指定 apiPath",
|
|
361
|
+
"API_PATH_REASON_VERSIONED_ROOT": "已版本化的 API 组件不能挂载在根路径下;请提供以点分隔的路径,例如 'auth' 或 'v1.auth'",
|
|
361
362
|
"INVALID_API_PATH": "无效的 API 路径:'{apiPath}' 在已加载的 API 中不存在。",
|
|
362
363
|
"HINT_INVALID_API_PATH": "在使用前确保 API 路径存在。使用点分写法(例如 'math.add')指向当前已加载的模块。",
|
|
363
364
|
"HOOKS_NOT_INITIALIZED": "无法访问钩子功能:钩子管理器未初始化。",
|
|
@@ -367,7 +368,20 @@
|
|
|
367
368
|
"NO_CONTEXT_MANAGER": "此 slothlet 实例未配置上下文管理器。",
|
|
368
369
|
"HINT_NO_CONTEXT_MANAGER": "上下文操作需要上下文管理器。在配置中初始化 slothlet,例如 'contextManager: new AsyncContextManager()' 或 'contextManager: new LiveContextManager()'。",
|
|
369
370
|
"UNSUPPORTED_CONTEXT_MANAGER": "不支持的上下文管理器:'{manager}'。仅支持 AsyncContextManager 和 LiveContextManager。",
|
|
370
|
-
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "对异步/ALS 上下文隔离使用 AsyncContextManager,对同步实时绑定上下文使用 LiveContextManager。"
|
|
371
|
+
"HINT_UNSUPPORTED_CONTEXT_MANAGER": "对异步/ALS 上下文隔离使用 AsyncContextManager,对同步实时绑定上下文使用 LiveContextManager。",
|
|
372
|
+
"INVALID_CONFIG_VERSION_DISPATCHER": "config.versionDispatcher 必须是字符串(元数据键)或函数;收到:{received}",
|
|
373
|
+
"INVALID_CONFIG_VERSION_TAG": "versionConfig.version 必须是非空字符串;收到:{received}",
|
|
374
|
+
"VERSION_NOT_FOUND": "版本 '{version}' 未在路径 '{apiPath}' 注册。",
|
|
375
|
+
"VERSION_NO_DEFAULT": "路径 '{apiPath}' 未配置默认版本,且无法从调用方元数据中解析版本。",
|
|
376
|
+
"VERSION_DISPATCH_NOT_CALLABLE": "'{apiPath}' 处的版本调度器是命名空间,不是可调用函数。",
|
|
377
|
+
"VERSION_REGISTER_DUPLICATE": "版本 '{version}' 已在路径 '{apiPath}' 注册。使用 collisionMode 'replace' 覆盖。",
|
|
378
|
+
"HINT_VERSION_REGISTER_DUPLICATE": "请先调用 api.slothlet.versioning.unregister('{apiPath}', '{version}'),或使用不同的版本标签注册。",
|
|
379
|
+
"HINT_VERSION_NOT_FOUND": "调用 api.slothlet.versioning.list('{apiPath}') 查看当前在该路径注册的版本标签。",
|
|
380
|
+
"VERSION_DISCRIMINATOR_INVALID_RETURN": "versionDispatcher 函数返回了 '{returned}',它不是路径 '{apiPath}' 的已注册版本标签。",
|
|
381
|
+
"DEBUG_VERSION_RESOLVED": "已解析版本:{version},路径:{apiPath}(调用方:{callerModule})",
|
|
382
|
+
"DEBUG_VERSION_DEFAULT_USED": "路径 {apiPath} 无匹配判别器;使用默认版本 {version}。",
|
|
383
|
+
"DEBUG_VERSION_REGISTERED": "版本 {version} 已在 {logicalPath} 注册(moduleID:{moduleID})",
|
|
384
|
+
"DEBUG_VERSION_UNREGISTERED": "版本 {version} 已从 {logicalPath} 注销"
|
|
371
385
|
},
|
|
372
386
|
"metadata": {
|
|
373
387
|
"code": "zh-cn",
|
package/dist/slothlet.mjs
CHANGED
|
@@ -23,6 +23,7 @@ import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
23
23
|
import { getContextManager } from "@cldmv/slothlet/factories/context";
|
|
24
24
|
import { SlothletError, SlothletWarning, SlothletDebug } from "@cldmv/slothlet/errors";
|
|
25
25
|
import { registerInstance } from "@cldmv/slothlet/handlers/lifecycle-token";
|
|
26
|
+
import { resolveWrapper } from "@cldmv/slothlet/handlers/unified-wrapper";
|
|
26
27
|
import { initI18n } from "@cldmv/slothlet/i18n";
|
|
27
28
|
import {
|
|
28
29
|
enableEventEmitterPatching,
|
|
@@ -596,7 +597,8 @@ class Slothlet {
|
|
|
596
597
|
|
|
597
598
|
|
|
598
599
|
options: { ...(operation.options || {}), recordHistory: false },
|
|
599
|
-
moduleID: `replay_${this.helpers.utilities.generateId().substring(0, 8)}
|
|
600
|
+
moduleID: `replay_${this.helpers.utilities.generateId().substring(0, 8)}`,
|
|
601
|
+
versionConfig: operation.versionConfig || null
|
|
600
602
|
});
|
|
601
603
|
|
|
602
604
|
|
|
@@ -662,12 +664,76 @@ class Slothlet {
|
|
|
662
664
|
}
|
|
663
665
|
|
|
664
666
|
|
|
667
|
+
async _drainInFlightLoads() {
|
|
668
|
+
if (!this.api) return;
|
|
669
|
+
|
|
670
|
+
const pending = [];
|
|
671
|
+
const seen = new Set();
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
const collect = (obj, depth = 0) => {
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
const objType = typeof obj;
|
|
680
|
+
if (!obj || (objType !== "object" && objType !== "function") || depth > 15 || seen.has(obj)) return;
|
|
681
|
+
seen.add(obj);
|
|
682
|
+
|
|
683
|
+
try {
|
|
684
|
+
|
|
685
|
+
if (obj.__isVersionDispatcher === true) return;
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
const wrapper = resolveWrapper(obj);
|
|
692
|
+
if (wrapper) {
|
|
693
|
+
const mat = wrapper.____slothletInternal.materializationPromise;
|
|
694
|
+
if (mat) pending.push(mat);
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
|
|
700
|
+
|
|
701
|
+
for (const key of Object.keys(wrapper)) {
|
|
702
|
+
if (!key.startsWith("____")) collect(wrapper[key], depth + 1);
|
|
703
|
+
}
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
for (const key of Object.keys(obj)) {
|
|
708
|
+
collect(obj[key], depth + 1);
|
|
709
|
+
}
|
|
710
|
+
} catch {
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
}
|
|
714
|
+
};
|
|
715
|
+
|
|
716
|
+
for (const key of Object.keys(this.api)) {
|
|
717
|
+
collect(this.api[key]);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
if (pending.length > 0) {
|
|
721
|
+
await Promise.allSettled(pending);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
|
|
665
726
|
async shutdown() {
|
|
666
727
|
if (!this.isLoaded) {
|
|
667
728
|
return;
|
|
668
729
|
}
|
|
669
730
|
|
|
670
731
|
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
await this._drainInFlightLoads();
|
|
735
|
+
|
|
736
|
+
|
|
671
737
|
disableEventEmitterPatching();
|
|
672
738
|
cleanupEventEmitterResources();
|
|
673
739
|
|
|
@@ -684,6 +750,9 @@ class Slothlet {
|
|
|
684
750
|
}
|
|
685
751
|
|
|
686
752
|
|
|
753
|
+
this.handlers.versionManager?.shutdown();
|
|
754
|
+
|
|
755
|
+
|
|
687
756
|
|
|
688
757
|
this.isLoaded = false;
|
|
689
758
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cldmv/slothlet",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"moduleVersions": {
|
|
5
5
|
"lazy": "3.0.0",
|
|
6
6
|
"eager": "3.0.0",
|
|
@@ -125,6 +125,7 @@
|
|
|
125
125
|
"vitest": "node tests/vitests/run-all-vitest.mjs --workers 8",
|
|
126
126
|
"baseline": "npm run vitest -- --baseline",
|
|
127
127
|
"coverage": "npm run vitest -- --coverage-quiet",
|
|
128
|
+
"ci:coverage": "npm run coverage",
|
|
128
129
|
"test": "npm run test:pre-build",
|
|
129
130
|
"test:pre-build": "node tests/test-conditional.mjs",
|
|
130
131
|
"test:post-build": "npm run test:types",
|
|
@@ -132,6 +133,7 @@
|
|
|
132
133
|
"test:node": "node tests/run-all-tests.mjs",
|
|
133
134
|
"test:all": "node tests/test-conditional.mjs && npm run test:node",
|
|
134
135
|
"test:types": "node tests/validate-typescript.mjs",
|
|
136
|
+
"ci:test:types": "npm run build:dist && npm run build:types && npm run test:types",
|
|
135
137
|
"test:performance": "node tests/performance/performance-benchmark-aggregated.mjs",
|
|
136
138
|
"test:performance-simple": "node tests/performance/performance-benchmark.mjs",
|
|
137
139
|
"lint": "eslint --config .configs/eslint.config.mjs .",
|
|
@@ -141,7 +143,8 @@
|
|
|
141
143
|
"fix:headers": "node tools/dev/fix-headers.mjs",
|
|
142
144
|
"build": "npm run build:dev",
|
|
143
145
|
"build:ci": "npm run build:cleanup && npm run build:dist && npm run build:types && npm run build:exports && npm run test:types && npm run build:prepend-license && npm run ci:cleanup-src",
|
|
144
|
-
"build:dev": "npm run build:cleanup && npm run build:dist && npm run build:types && npm run build:exports && npm run test:types && npm run build:prepend-license
|
|
146
|
+
"build:dev": "npm run build:cleanup && npm run build:dist && npm run build:types && npm run build:exports && npm run test:types && npm run build:prepend-license",
|
|
147
|
+
"build:dev:test": "npm run build:cleanup && npm run build:dist && npm run build:types && npm run build:exports && npm run test:types && npm run build:prepend-license && npm run build:cleanup",
|
|
145
148
|
"build:unsafe": "npm run build:cleanup && npm run build:dist && npm run build:types && npm run build:exports && npm run test:types && npm run build:prepend-license",
|
|
146
149
|
"ci:cleanup-src": "node tools/ci/ci-cleanup-src.mjs",
|
|
147
150
|
"build:cleanup": "shx rm -rf types && shx rm -rf dist",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api_builder.d.mts","sourceRoot":"","sources":["../../../../dist/lib/builders/api_builder.mjs"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api_builder.d.mts","sourceRoot":"","sources":["../../../../dist/lib/builders/api_builder.mjs"],"names":[],"mappings":"AAyEA;;;;;;;;;;;;;GAaG;AACH;IACC,gCAAuC;IAcvC;;;;;OAKG;IACH,oCAHa,OAAO,KAAQ,CAiG3B;IAED;;;;;;;;;;;OAWG;IACH,gCA2uCC;IAED;;;;OAIG;IACH,+BAYC;IAED;;;;OAIG;IACH,0BAgCC;IAED;;;;OAIG;IACH,4BAoMC;IAED;;;;;OAKG;IACH,8BAyCC;IAED;;;;;OAKG;IACH,uBAgCC;CACD;;;;;;;;;;;;;;;;;;;;;;;;;;8BAvwD6B,0CAA0C"}
|
|
@@ -273,6 +273,34 @@ export class ApiManager extends ComponentBase {
|
|
|
273
273
|
folderPath: string | string[];
|
|
274
274
|
options?: Record<string, unknown>;
|
|
275
275
|
}): Promise<string | string[]>;
|
|
276
|
+
/**
|
|
277
|
+
* Roll back a failed versioned add.
|
|
278
|
+
*
|
|
279
|
+
* @description
|
|
280
|
+
* Called when `versionManager.registerVersion()` throws after the API tree, cache,
|
|
281
|
+
* ownership, and history have already been mutated by `addApiComponent()`. Scrubs
|
|
282
|
+
* the orphaned "add" entry from `operationHistory`, then delegates tree/cache/ownership
|
|
283
|
+
* and `addHistory` cleanup to `removeApiComponent({ recordHistory: false })` so that
|
|
284
|
+
* no spurious "remove" entry is pushed into `operationHistory`.
|
|
285
|
+
*
|
|
286
|
+
* The rollback is best-effort: if `removeApiComponent` itself throws the error is
|
|
287
|
+
* swallowed and the caller re-throws the original registration error.
|
|
288
|
+
*
|
|
289
|
+
* @param {object} opts - Rollback context.
|
|
290
|
+
* @param {string} opts.moduleID - The moduleID of the just-added component.
|
|
291
|
+
* @param {string} opts.effectivePath - The effective (versioned) mount path, e.g. "v1.auth".
|
|
292
|
+
* @param {string} opts.normalizedPath - The logical path, e.g. "auth".
|
|
293
|
+
* @returns {Promise<void>}
|
|
294
|
+
* @package
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* await this._rollbackFailedVersionedAdd({ moduleID, effectivePath, normalizedPath });
|
|
298
|
+
*/
|
|
299
|
+
_rollbackFailedVersionedAdd({ moduleID, effectivePath, normalizedPath }: {
|
|
300
|
+
moduleID: string;
|
|
301
|
+
effectivePath: string;
|
|
302
|
+
normalizedPath: string;
|
|
303
|
+
}): Promise<void>;
|
|
276
304
|
/**
|
|
277
305
|
* Remove API modules at runtime.
|
|
278
306
|
* @param {string} pathOrModuleId - API path (with dots) or module ID (with underscore) to remove.
|