@cldmv/slothlet 3.2.3 → 3.3.2

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.
Files changed (138) hide show
  1. package/README.md +22 -9
  2. package/REFERENCE.md +23 -0
  3. package/dist/lib/builders/api-assignment.mjs +1 -589
  4. package/dist/lib/builders/api_builder.mjs +1 -1155
  5. package/dist/lib/builders/builder.mjs +1 -78
  6. package/dist/lib/builders/modes-processor.mjs +1 -1800
  7. package/dist/lib/errors.mjs +9 -211
  8. package/dist/lib/factories/component-base.mjs +1 -80
  9. package/dist/lib/factories/context.mjs +1 -22
  10. package/dist/lib/handlers/api-cache-manager.mjs +1 -200
  11. package/dist/lib/handlers/api-manager.mjs +1 -2513
  12. package/dist/lib/handlers/context-async.mjs +1 -168
  13. package/dist/lib/handlers/context-live.mjs +1 -168
  14. package/dist/lib/handlers/hook-manager.mjs +1 -773
  15. package/dist/lib/handlers/lifecycle-token.mjs +1 -28
  16. package/dist/lib/handlers/lifecycle.mjs +1 -115
  17. package/dist/lib/handlers/materialize-manager.mjs +1 -48
  18. package/dist/lib/handlers/metadata.mjs +1 -501
  19. package/dist/lib/handlers/ownership.mjs +1 -322
  20. package/dist/lib/handlers/permission-manager.mjs +17 -0
  21. package/dist/lib/handlers/unified-wrapper.mjs +1 -3042
  22. package/dist/lib/handlers/version-manager.mjs +1 -885
  23. package/dist/lib/helpers/class-instance-wrapper.mjs +1 -109
  24. package/dist/lib/helpers/config.mjs +1 -355
  25. package/dist/lib/helpers/eventemitter-context.mjs +1 -349
  26. package/dist/lib/helpers/hint-detector.mjs +1 -47
  27. package/dist/lib/helpers/modes-utils.mjs +1 -37
  28. package/dist/lib/helpers/pattern-matcher.mjs +17 -0
  29. package/dist/lib/helpers/resolve-from-caller.mjs +1 -169
  30. package/dist/lib/helpers/sanitize.mjs +1 -340
  31. package/dist/lib/helpers/utilities.mjs +1 -70
  32. package/dist/lib/i18n/languages/de-de.json +21 -1
  33. package/dist/lib/i18n/languages/en-gb.json +21 -1
  34. package/dist/lib/i18n/languages/en-us.json +21 -1
  35. package/dist/lib/i18n/languages/es-mx.json +21 -1
  36. package/dist/lib/i18n/languages/fr-fr.json +21 -1
  37. package/dist/lib/i18n/languages/hi-in.json +21 -1
  38. package/dist/lib/i18n/languages/ja-jp.json +21 -1
  39. package/dist/lib/i18n/languages/ko-kr.json +21 -1
  40. package/dist/lib/i18n/languages/pt-br.json +21 -1
  41. package/dist/lib/i18n/languages/ru-ru.json +21 -1
  42. package/dist/lib/i18n/languages/zh-cn.json +21 -1
  43. package/dist/lib/i18n/translations.mjs +1 -126
  44. package/dist/lib/modes/eager.mjs +1 -59
  45. package/dist/lib/modes/lazy.mjs +1 -81
  46. package/dist/lib/processors/flatten.mjs +1 -437
  47. package/dist/lib/processors/loader.mjs +1 -339
  48. package/dist/lib/processors/type-generator.mjs +1 -275
  49. package/dist/lib/processors/typescript.mjs +1 -172
  50. package/dist/lib/runtime/runtime-asynclocalstorage.mjs +1 -113
  51. package/dist/lib/runtime/runtime-livebindings.mjs +1 -78
  52. package/dist/lib/runtime/runtime.mjs +1 -102
  53. package/dist/slothlet.mjs +1 -808
  54. package/package.json +37 -31
  55. package/types/dist/lib/builders/api-assignment.d.mts +3 -92
  56. package/types/dist/lib/builders/api-assignment.d.mts.map +1 -1
  57. package/types/dist/lib/builders/api_builder.d.mts +102 -91
  58. package/types/dist/lib/builders/api_builder.d.mts.map +1 -1
  59. package/types/dist/lib/builders/builder.d.mts +1 -55
  60. package/types/dist/lib/builders/builder.d.mts.map +1 -1
  61. package/types/dist/lib/builders/modes-processor.d.mts +3 -27
  62. package/types/dist/lib/builders/modes-processor.d.mts.map +1 -1
  63. package/types/dist/lib/errors.d.mts +19 -109
  64. package/types/dist/lib/errors.d.mts.map +1 -1
  65. package/types/dist/lib/factories/component-base.d.mts +7 -177
  66. package/types/dist/lib/factories/component-base.d.mts.map +1 -1
  67. package/types/dist/lib/factories/context.d.mts +4 -22
  68. package/types/dist/lib/factories/context.d.mts.map +1 -1
  69. package/types/dist/lib/handlers/api-cache-manager.d.mts +20 -203
  70. package/types/dist/lib/handlers/api-cache-manager.d.mts.map +1 -1
  71. package/types/dist/lib/handlers/api-manager.d.mts +33 -408
  72. package/types/dist/lib/handlers/api-manager.d.mts.map +1 -1
  73. package/types/dist/lib/handlers/context-async.d.mts +23 -61
  74. package/types/dist/lib/handlers/context-async.d.mts.map +1 -1
  75. package/types/dist/lib/handlers/context-live.d.mts +22 -59
  76. package/types/dist/lib/handlers/context-live.d.mts.map +1 -1
  77. package/types/dist/lib/handlers/hook-manager.d.mts +46 -185
  78. package/types/dist/lib/handlers/hook-manager.d.mts.map +1 -1
  79. package/types/dist/lib/handlers/lifecycle-token.d.mts +3 -48
  80. package/types/dist/lib/handlers/lifecycle-token.d.mts.map +1 -1
  81. package/types/dist/lib/handlers/lifecycle.d.mts +5 -82
  82. package/types/dist/lib/handlers/lifecycle.d.mts.map +1 -1
  83. package/types/dist/lib/handlers/materialize-manager.d.mts +8 -70
  84. package/types/dist/lib/handlers/materialize-manager.d.mts.map +1 -1
  85. package/types/dist/lib/handlers/metadata.d.mts +17 -221
  86. package/types/dist/lib/handlers/metadata.d.mts.map +1 -1
  87. package/types/dist/lib/handlers/ownership.d.mts +44 -160
  88. package/types/dist/lib/handlers/ownership.d.mts.map +1 -1
  89. package/types/dist/lib/handlers/permission-manager.d.mts +47 -0
  90. package/types/dist/lib/handlers/permission-manager.d.mts.map +1 -0
  91. package/types/dist/lib/handlers/unified-wrapper.d.mts +26 -239
  92. package/types/dist/lib/handlers/unified-wrapper.d.mts.map +1 -1
  93. package/types/dist/lib/handlers/version-manager.d.mts +28 -225
  94. package/types/dist/lib/handlers/version-manager.d.mts.map +1 -1
  95. package/types/dist/lib/helpers/class-instance-wrapper.d.mts +2 -52
  96. package/types/dist/lib/helpers/class-instance-wrapper.d.mts.map +1 -1
  97. package/types/dist/lib/helpers/config.d.mts +125 -123
  98. package/types/dist/lib/helpers/config.d.mts.map +1 -1
  99. package/types/dist/lib/helpers/eventemitter-context.d.mts +3 -29
  100. package/types/dist/lib/helpers/eventemitter-context.d.mts.map +1 -1
  101. package/types/dist/lib/helpers/hint-detector.d.mts +2 -15
  102. package/types/dist/lib/helpers/hint-detector.d.mts.map +1 -1
  103. package/types/dist/lib/helpers/modes-utils.d.mts +3 -30
  104. package/types/dist/lib/helpers/modes-utils.d.mts.map +1 -1
  105. package/types/dist/lib/helpers/pattern-matcher.d.mts +4 -0
  106. package/types/dist/lib/helpers/pattern-matcher.d.mts.map +1 -0
  107. package/types/dist/lib/helpers/resolve-from-caller.d.mts +3 -27
  108. package/types/dist/lib/helpers/resolve-from-caller.d.mts.map +1 -1
  109. package/types/dist/lib/helpers/sanitize.d.mts +4 -92
  110. package/types/dist/lib/helpers/sanitize.d.mts.map +1 -1
  111. package/types/dist/lib/helpers/utilities.d.mts +4 -52
  112. package/types/dist/lib/helpers/utilities.d.mts.map +1 -1
  113. package/types/dist/lib/i18n/translations.d.mts +4 -37
  114. package/types/dist/lib/i18n/translations.d.mts.map +1 -1
  115. package/types/dist/lib/modes/eager.d.mts +8 -30
  116. package/types/dist/lib/modes/eager.d.mts.map +1 -1
  117. package/types/dist/lib/modes/lazy.d.mts +10 -43
  118. package/types/dist/lib/modes/lazy.d.mts.map +1 -1
  119. package/types/dist/lib/processors/flatten.d.mts +56 -107
  120. package/types/dist/lib/processors/flatten.d.mts.map +1 -1
  121. package/types/dist/lib/processors/loader.d.mts +6 -41
  122. package/types/dist/lib/processors/loader.d.mts.map +1 -1
  123. package/types/dist/lib/processors/type-generator.d.mts +2 -16
  124. package/types/dist/lib/processors/type-generator.d.mts.map +1 -1
  125. package/types/dist/lib/processors/typescript.d.mts +6 -53
  126. package/types/dist/lib/processors/typescript.d.mts.map +1 -1
  127. package/types/dist/lib/runtime/runtime-asynclocalstorage.d.mts +3 -71
  128. package/types/dist/lib/runtime/runtime-asynclocalstorage.d.mts.map +1 -1
  129. package/types/dist/lib/runtime/runtime-livebindings.d.mts +2 -37
  130. package/types/dist/lib/runtime/runtime-livebindings.d.mts.map +1 -1
  131. package/types/dist/lib/runtime/runtime.d.mts +3 -39
  132. package/types/dist/lib/runtime/runtime.d.mts.map +1 -1
  133. package/types/dist/slothlet.d.mts +3 -249
  134. package/types/dist/slothlet.d.mts.map +1 -1
  135. package/types/index.d.mts +36 -16
  136. package/types/index.d.mts.map +1 -0
  137. package/AGENT-USAGE.md +0 -736
  138. package/docs/API-RULES.md +0 -712
@@ -14,343 +14,4 @@
14
14
  limitations under the License.
15
15
  */
16
16
 
17
-
18
-
19
-
20
-
21
- import { ComponentBase } from "@cldmv/slothlet/factories/component-base";
22
-
23
-
24
-
25
-
26
-
27
-
28
- export class Sanitize extends ComponentBase {
29
- static slothletProperty = "sanitize";
30
-
31
-
32
-
33
-
34
-
35
-
36
- #compileGlobPattern(pattern, caseSensitive = true) {
37
-
38
- if (pattern.startsWith("**") && pattern.endsWith("**") && pattern.length > 4) {
39
- const innerString = pattern.slice(2, -2);
40
- const escapedString = innerString.replace(/[.+^${}()|[\]\\*?]/g, "\\$&");
41
- const flags = caseSensitive ? "" : "i";
42
- return new RegExp(`(?<=.)${escapedString}(?=.)`, flags);
43
- }
44
-
45
-
46
- const regexPattern = pattern
47
- .replace(/[.+^${}()|[\]\\]/g, "\\$&")
48
- .replace(/\*/g, ".*")
49
- .replace(/\?/g, ".");
50
-
51
- const flags = caseSensitive ? "" : "i";
52
- return new RegExp(`^${regexPattern}$`, flags);
53
- }
54
-
55
-
56
- #matchesAnyPattern(input, patterns, caseSensitive = false) {
57
- for (const pattern of patterns) {
58
- if (pattern.includes("*") || pattern.includes("?")) {
59
- const regex = this.#compileGlobPattern(pattern, caseSensitive);
60
- if (regex && regex.test(input)) return true;
61
- } else {
62
- const match = caseSensitive ? input === pattern : input.toLowerCase() === pattern.toLowerCase();
63
- if (match) return true;
64
- }
65
- }
66
- return false;
67
- }
68
-
69
-
70
- #extractPatternLiterals(pattern) {
71
- return pattern.split(/[*?]+/).filter(Boolean);
72
- }
73
-
74
-
75
-
76
-
77
-
78
-
79
- #applySegmentRules(segment, index, originalString, config) {
80
- const { preserveAllUpper, preserveAllLower, leaveRules, leaveInsensitiveRules, upperRules, lowerRules } = config;
81
-
82
-
83
- if (this.#matchesAnyPattern(segment, leaveRules, true)) {
84
- return segment;
85
- }
86
-
87
-
88
- if (this.#matchesAnyPattern(segment, leaveInsensitiveRules, false)) {
89
- return segment;
90
- }
91
-
92
-
93
-
94
- if (preserveAllUpper && segment === segment.toUpperCase() && segment !== segment.toLowerCase() && /[A-Z]/.test(segment)) {
95
- return segment;
96
- }
97
-
98
-
99
-
100
- if (preserveAllLower && segment === segment.toLowerCase() && segment !== segment.toUpperCase() && /[a-z]/.test(segment)) {
101
- return segment;
102
- }
103
-
104
-
105
-
106
- for (const pattern of [...upperRules, ...lowerRules]) {
107
- if (pattern.includes("*") || pattern.includes("?")) {
108
- const regex = this.#compileGlobPattern(pattern, false);
109
- if (regex && regex.test(originalString)) {
110
-
111
- const literals = this.#extractPatternLiterals(pattern);
112
- for (const literal of literals) {
113
-
114
- const cleanLiteral = literal.replace(/[^A-Za-z0-9_$]/g, "").replace(/^_+|_+$/g, "");
115
- if (cleanLiteral && segment.toLowerCase() === cleanLiteral.toLowerCase()) {
116
- return upperRules.includes(pattern) ? segment.toUpperCase() : segment.toLowerCase();
117
- }
118
- }
119
- }
120
- } else {
121
-
122
- if (segment.toLowerCase() === pattern.toLowerCase()) {
123
- return upperRules.includes(pattern) ? segment.toUpperCase() : segment.toLowerCase();
124
- }
125
- }
126
- }
127
-
128
-
129
- let transformed = this.#applyWithinSegmentPatterns(segment, upperRules, lowerRules);
130
- if (transformed !== segment) {
131
- return transformed;
132
- }
133
-
134
-
135
-
136
- return segment;
137
- }
138
-
139
-
140
- #applyWithinSegmentPatterns(segment, upperRules, lowerRules) {
141
- let result = segment;
142
-
143
- const applyBoundaryPattern = (pattern, toUpper) => {
144
-
145
- if (pattern.startsWith("**") && pattern.endsWith("**") && pattern.length > 4) {
146
- const innerString = pattern.slice(2, -2);
147
- const innerRegex = new RegExp(innerString.replace(/[.+^${}()|[\]\\*?]/g, "\\$&"), "gi");
148
- const matches = [...result.matchAll(innerRegex)];
149
-
150
- for (const match of matches) {
151
- const startPos = match.index;
152
- const endPos = startPos + match[0].length;
153
- const hasCharBefore = startPos > 0;
154
- const hasCharAfter = endPos < result.length;
155
-
156
- if (hasCharBefore && hasCharAfter) {
157
- const replacement = toUpper ? innerString.toUpperCase() : innerString.toLowerCase();
158
- result = result.substring(0, startPos) + replacement + result.substring(endPos);
159
- break;
160
- }
161
- }
162
- }
163
-
164
- else if (pattern.includes("*") && !pattern.startsWith("**")) {
165
-
166
- const literalParts = pattern.split("*").filter(Boolean);
167
- for (const literal of literalParts) {
168
- const literalRegex = new RegExp(literal.replace(/[.+^${}()|[\]\\]/g, "\\$&"), "gi");
169
- const replacement = toUpper ? literal.toUpperCase() : literal.toLowerCase();
170
- result = result.replace(literalRegex, replacement);
171
- }
172
- }
173
- };
174
-
175
- upperRules.forEach((pattern) => applyBoundaryPattern(pattern, true));
176
- lowerRules.forEach((pattern) => applyBoundaryPattern(pattern, false));
177
-
178
- return result;
179
- }
180
-
181
-
182
-
183
-
184
-
185
-
186
- sanitizePropertyName(input, options = {}) {
187
- const { lowerFirst = true, preserveAllUpper = false, preserveAllLower = false, rules = {} } = options;
188
-
189
-
190
- const leaveRules = (rules.leave || []).map((s) => String(s));
191
- const leaveInsensitiveRules = (rules.leaveInsensitive || []).map((s) => String(s));
192
- const upperRules = (rules.upper || []).map((s) => String(s));
193
- const lowerRules = (rules.lower || []).map((s) => String(s));
194
-
195
- const originalString = String(input).trim();
196
-
197
-
198
- const isAllUpper =
199
- originalString === originalString.toUpperCase() && originalString !== originalString.toLowerCase() && /[A-Z]/.test(originalString);
200
- const isAllLower =
201
- originalString === originalString.toLowerCase() && originalString !== originalString.toUpperCase() && /[a-z]/.test(originalString);
202
-
203
- if (preserveAllUpper && isAllUpper) {
204
- return originalString;
205
- }
206
-
207
-
208
- if (preserveAllLower && isAllLower && !/-/.test(originalString)) {
209
- return originalString;
210
- }
211
-
212
-
213
-
214
- let primarySegments = originalString.split(/[-]+|[^A-Za-z0-9_$]+/).filter(Boolean);
215
-
216
-
217
- if (primarySegments.length === 0) return "_";
218
-
219
-
220
- while (primarySegments.length && !/^[A-Za-z_$]/.test(primarySegments[0][0])) {
221
- primarySegments[0] = primarySegments[0].replace(/^[^A-Za-z_$]+/, "");
222
- if (!primarySegments[0]) primarySegments.shift();
223
- }
224
- if (primarySegments.length === 0) return "_";
225
-
226
-
227
-
228
-
229
-
230
-
231
- const lowerRuleApplied = [];
232
- const processedPrimarySegments = primarySegments.map((primarySeg, primaryIdx) => {
233
-
234
- const parts = primarySeg.split(/(_+)/);
235
-
236
-
237
- const processedParts = parts.map((part, partIdx) => {
238
-
239
- if (partIdx % 2 === 1) return part;
240
- if (!part) return part;
241
-
242
-
243
- const cleanSeg = part.replace(/[^A-Za-z0-9_$]/g, "");
244
-
245
-
246
- const config = { preserveAllUpper, preserveAllLower, leaveRules, leaveInsensitiveRules, upperRules, lowerRules };
247
- const result = this.#applySegmentRules(cleanSeg, 0, originalString, config);
248
-
249
-
250
-
251
- const matchesLower = lowerRules.some((pattern) => {
252
- if (pattern.includes("*") || pattern.includes("?")) {
253
- const regex = this.#compileGlobPattern(pattern, false);
254
- if (regex && regex.test(originalString)) {
255
-
256
- const literals = this.#extractPatternLiterals(pattern);
257
- for (const literal of literals) {
258
- const cleanLiteral = literal.replace(/[^A-Za-z0-9_$]/g, "").replace(/^_+|_+$/g, "");
259
- if (cleanLiteral && cleanSeg.toLowerCase() === cleanLiteral.toLowerCase()) {
260
- return true;
261
- }
262
- }
263
- }
264
- } else {
265
-
266
- if (cleanSeg.toLowerCase() === pattern.toLowerCase()) {
267
- return true;
268
- }
269
- }
270
- return false;
271
- });
272
-
273
- if (matchesLower && result === cleanSeg.toLowerCase()) {
274
- lowerRuleApplied[primaryIdx] = true;
275
- }
276
-
277
- return result;
278
- });
279
-
280
-
281
- return processedParts.join("");
282
- });
283
-
284
-
285
- const camelCasedSegments = processedPrimarySegments.map((seg, idx) => {
286
-
287
- const matchesLeave = this.#matchesAnyPattern(seg, leaveRules, true);
288
- const matchesLeaveInsensitive = this.#matchesAnyPattern(seg, leaveInsensitiveRules, false);
289
- const matchesUpper = this.#matchesAnyPattern(seg, upperRules, false);
290
-
291
-
292
- const hasUnderscores = seg.includes("_");
293
- const isAllUpper = !hasUnderscores && preserveAllUpper && seg === seg.toUpperCase() && seg !== seg.toLowerCase() && /[A-Z]/.test(seg);
294
- const isAllLower = !hasUnderscores && preserveAllLower && seg === seg.toLowerCase() && seg !== seg.toUpperCase() && /[a-z]/.test(seg);
295
-
296
-
297
- if (matchesLeave || matchesLeaveInsensitive || matchesUpper || isAllUpper || isAllLower) {
298
- return seg;
299
- }
300
-
301
-
302
-
303
- let transformed;
304
- if (idx === 0) {
305
-
306
- transformed = lowerFirst ? seg[0].toLowerCase() + seg.slice(1) : seg;
307
- } else {
308
-
309
-
310
- if (lowerRuleApplied[idx]) {
311
- transformed = seg;
312
- } else {
313
- transformed = seg[0].toUpperCase() + seg.slice(1);
314
- }
315
- }
316
-
317
- return transformed;
318
- });
319
-
320
-
321
- let result = camelCasedSegments.join("");
322
- result = result.replace(/[^A-Za-z0-9_$]/g, "");
323
-
324
- return result;
325
- }
326
-
327
-
328
- getModuleId(filePath, baseDir) {
329
-
330
- let relative = filePath.replace(baseDir, "").replace(/\\/g, "/");
331
- relative = relative.replace(/^\//, "");
332
- relative = relative.replace(/\.(mjs|cjs|js)$/, "");
333
-
334
- return relative;
335
- }
336
-
337
-
338
- shouldPreserveFunctionCase(name) {
339
- const preservePatterns = [
340
- /^[A-Z]{2,}$/,
341
- /[A-Z]{2,}/
342
- ];
343
-
344
- return preservePatterns.some((pattern) => pattern.test(name));
345
- }
346
- }
347
-
348
-
349
-
350
-
351
-
352
-
353
- export function sanitizePropertyName(input, options = {}) {
354
- const sanitizer = new Sanitize(null);
355
- return sanitizer.sanitizePropertyName(input, options);
356
- }
17
+ import{ComponentBase}from"@cldmv/slothlet/factories/component-base";class Sanitize extends ComponentBase{static slothletProperty="sanitize";#compileGlobPattern(pattern,caseSensitive=true){if(pattern.startsWith("**")&&pattern.endsWith("**")&&pattern.length>4){const innerString=pattern.slice(2,-2);const escapedString=innerString.replace(/[.+^${}()|[\]\\*?]/g,"\\$&");const flags2=caseSensitive?"":"i";return new RegExp(`(?<=.)${escapedString}(?=.)`,flags2)}const regexPattern=pattern.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");const flags=caseSensitive?"":"i";return new RegExp(`^${regexPattern}$`,flags)}#matchesAnyPattern(input,patterns,caseSensitive=false){for(const pattern of patterns){if(pattern.includes("*")||pattern.includes("?")){const regex=this.#compileGlobPattern(pattern,caseSensitive);if(regex&&regex.test(input))return true}else{const match=caseSensitive?input===pattern:input.toLowerCase()===pattern.toLowerCase();if(match)return true}}return false}#extractPatternLiterals(pattern){return pattern.split(/[*?]+/).filter(Boolean)}#applySegmentRules(segment,index,originalString,config){const{preserveAllUpper,preserveAllLower,leaveRules,leaveInsensitiveRules,upperRules,lowerRules}=config;if(this.#matchesAnyPattern(segment,leaveRules,true)){return segment}if(this.#matchesAnyPattern(segment,leaveInsensitiveRules,false)){return segment}if(preserveAllUpper&&segment===segment.toUpperCase()&&segment!==segment.toLowerCase()&&/[A-Z]/.test(segment)){return segment}if(preserveAllLower&&segment===segment.toLowerCase()&&segment!==segment.toUpperCase()&&/[a-z]/.test(segment)){return segment}for(const pattern of[...upperRules,...lowerRules]){if(pattern.includes("*")||pattern.includes("?")){const regex=this.#compileGlobPattern(pattern,false);if(regex&&regex.test(originalString)){const literals=this.#extractPatternLiterals(pattern);for(const literal of literals){const cleanLiteral=literal.replace(/[^A-Za-z0-9_$]/g,"").replace(/^_+|_+$/g,"");if(cleanLiteral&&segment.toLowerCase()===cleanLiteral.toLowerCase()){return upperRules.includes(pattern)?segment.toUpperCase():segment.toLowerCase()}}}}else{if(segment.toLowerCase()===pattern.toLowerCase()){return upperRules.includes(pattern)?segment.toUpperCase():segment.toLowerCase()}}}let transformed=this.#applyWithinSegmentPatterns(segment,upperRules,lowerRules);if(transformed!==segment){return transformed}return segment}#applyWithinSegmentPatterns(segment,upperRules,lowerRules){let result=segment;const applyBoundaryPattern=(pattern,toUpper)=>{if(pattern.startsWith("**")&&pattern.endsWith("**")&&pattern.length>4){const innerString=pattern.slice(2,-2);const innerRegex=new RegExp(innerString.replace(/[.+^${}()|[\]\\*?]/g,"\\$&"),"gi");const matches=[...result.matchAll(innerRegex)];for(const match of matches){const startPos=match.index;const endPos=startPos+match[0].length;const hasCharBefore=startPos>0;const hasCharAfter=endPos<result.length;if(hasCharBefore&&hasCharAfter){const replacement=toUpper?innerString.toUpperCase():innerString.toLowerCase();result=result.substring(0,startPos)+replacement+result.substring(endPos);break}}}else if(pattern.includes("*")&&!pattern.startsWith("**")){const literalParts=pattern.split("*").filter(Boolean);for(const literal of literalParts){const literalRegex=new RegExp(literal.replace(/[.+^${}()|[\]\\]/g,"\\$&"),"gi");const replacement=toUpper?literal.toUpperCase():literal.toLowerCase();result=result.replace(literalRegex,replacement)}}};upperRules.forEach(pattern=>applyBoundaryPattern(pattern,true));lowerRules.forEach(pattern=>applyBoundaryPattern(pattern,false));return result}sanitizePropertyName(input,options={}){const{lowerFirst=true,preserveAllUpper=false,preserveAllLower=false,rules={}}=options;const leaveRules=(rules.leave||[]).map(s=>String(s));const leaveInsensitiveRules=(rules.leaveInsensitive||[]).map(s=>String(s));const upperRules=(rules.upper||[]).map(s=>String(s));const lowerRules=(rules.lower||[]).map(s=>String(s));const originalString=String(input).trim();const isAllUpper=originalString===originalString.toUpperCase()&&originalString!==originalString.toLowerCase()&&/[A-Z]/.test(originalString);const isAllLower=originalString===originalString.toLowerCase()&&originalString!==originalString.toUpperCase()&&/[a-z]/.test(originalString);if(preserveAllUpper&&isAllUpper){return originalString}if(preserveAllLower&&isAllLower&&!/-/.test(originalString)){return originalString}let primarySegments=originalString.split(/[-]+|[^A-Za-z0-9_$]+/).filter(Boolean);if(primarySegments.length===0)return"_";while(primarySegments.length&&!/^[A-Za-z_$]/.test(primarySegments[0][0])){primarySegments[0]=primarySegments[0].replace(/^[^A-Za-z_$]+/,"");if(!primarySegments[0])primarySegments.shift()}if(primarySegments.length===0)return"_";const lowerRuleApplied=[];const processedPrimarySegments=primarySegments.map((primarySeg,primaryIdx)=>{const parts=primarySeg.split(/(_+)/);const processedParts=parts.map((part,partIdx)=>{if(partIdx%2===1)return part;if(!part)return part;const cleanSeg=part.replace(/[^A-Za-z0-9_$]/g,"");const config={preserveAllUpper,preserveAllLower,leaveRules,leaveInsensitiveRules,upperRules,lowerRules};const result2=this.#applySegmentRules(cleanSeg,0,originalString,config);const matchesLower=lowerRules.some(pattern=>{if(pattern.includes("*")||pattern.includes("?")){const regex=this.#compileGlobPattern(pattern,false);if(regex&&regex.test(originalString)){const literals=this.#extractPatternLiterals(pattern);for(const literal of literals){const cleanLiteral=literal.replace(/[^A-Za-z0-9_$]/g,"").replace(/^_+|_+$/g,"");if(cleanLiteral&&cleanSeg.toLowerCase()===cleanLiteral.toLowerCase()){return true}}}}else{if(cleanSeg.toLowerCase()===pattern.toLowerCase()){return true}}return false});if(matchesLower&&result2===cleanSeg.toLowerCase()){lowerRuleApplied[primaryIdx]=true}return result2});return processedParts.join("")});const camelCasedSegments=processedPrimarySegments.map((seg,idx)=>{const matchesLeave=this.#matchesAnyPattern(seg,leaveRules,true);const matchesLeaveInsensitive=this.#matchesAnyPattern(seg,leaveInsensitiveRules,false);const matchesUpper=this.#matchesAnyPattern(seg,upperRules,false);const hasUnderscores=seg.includes("_");const isAllUpper2=!hasUnderscores&&preserveAllUpper&&seg===seg.toUpperCase()&&seg!==seg.toLowerCase()&&/[A-Z]/.test(seg);const isAllLower2=!hasUnderscores&&preserveAllLower&&seg===seg.toLowerCase()&&seg!==seg.toUpperCase()&&/[a-z]/.test(seg);if(matchesLeave||matchesLeaveInsensitive||matchesUpper||isAllUpper2||isAllLower2){return seg}let transformed;if(idx===0){transformed=lowerFirst?seg[0].toLowerCase()+seg.slice(1):seg}else{if(lowerRuleApplied[idx]){transformed=seg}else{transformed=seg[0].toUpperCase()+seg.slice(1)}}return transformed});let result=camelCasedSegments.join("");result=result.replace(/[^A-Za-z0-9_$]/g,"");return result}getModuleId(filePath,baseDir){let relative=filePath.replace(baseDir,"").replace(/\\/g,"/");relative=relative.replace(/^\//,"");relative=relative.replace(/\.(mjs|cjs|js)$/,"");return relative}shouldPreserveFunctionCase(name){const preservePatterns=[/^[A-Z]{2,}$/,/[A-Z]{2,}/];return preservePatterns.some(pattern=>pattern.test(name))}}function sanitizePropertyName(input,options={}){const sanitizer=new Sanitize(null);return sanitizer.sanitizePropertyName(input,options)}export{Sanitize,sanitizePropertyName};
@@ -14,73 +14,4 @@
14
14
  limitations under the License.
15
15
  */
16
16
 
17
-
18
-
19
-
20
-
21
- import { ComponentBase } from "@cldmv/slothlet/factories/component-base";
22
-
23
-
24
- export class Utilities extends ComponentBase {
25
- static slothletProperty = "utilities";
26
-
27
-
28
- isPlainObject(obj) {
29
- if (typeof obj !== "object" || obj === null) return false;
30
- const proto = Object.getPrototypeOf(obj);
31
- return proto === null || proto === Object.prototype;
32
- }
33
-
34
-
35
- deepMerge(target, source) {
36
- if (!this.isPlainObject(target) || !this.isPlainObject(source)) {
37
- return source;
38
- }
39
-
40
- const result = { ...target };
41
-
42
- for (const key in source) {
43
- if (Object.prototype.hasOwnProperty.call(source, key)) {
44
- if (this.isPlainObject(source[key])) {
45
-
46
-
47
- result[key] = this.deepMerge(this.isPlainObject(target[key]) ? target[key] : {}, source[key]);
48
- } else {
49
- result[key] = source[key];
50
- }
51
- }
52
- }
53
-
54
- return result;
55
- }
56
-
57
-
58
- deepClone(obj) {
59
- try {
60
- return structuredClone(obj);
61
- } catch {
62
-
63
-
64
- const objType = obj?.__type || typeof obj;
65
- if (obj === null || (objType !== "object" && objType !== "function")) return obj;
66
- if (obj instanceof Date) return new Date(obj.getTime());
67
- if (Array.isArray(obj)) return obj.map((item) => this.deepClone(item));
68
-
69
- const cloned = {};
70
- for (const key in obj) {
71
- try {
72
- cloned[key] = this.deepClone(obj[key]);
73
- } catch {
74
-
75
- cloned[key] = obj[key];
76
- }
77
- }
78
- return cloned;
79
- }
80
- }
81
-
82
-
83
- generateId() {
84
- return `slothlet_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
85
- }
86
- }
17
+ import{ComponentBase}from"@cldmv/slothlet/factories/component-base";class Utilities extends ComponentBase{static slothletProperty="utilities";isPlainObject(obj){if(typeof obj!=="object"||obj===null)return false;const proto=Object.getPrototypeOf(obj);return proto===null||proto===Object.prototype}deepMerge(target,source){if(!this.isPlainObject(target)||!this.isPlainObject(source)){return source}const result={...target};for(const key in source){if(Object.prototype.hasOwnProperty.call(source,key)){if(this.isPlainObject(source[key])){result[key]=this.deepMerge(this.isPlainObject(target[key])?target[key]:{},source[key])}else{result[key]=source[key]}}}return result}deepClone(obj){try{return structuredClone(obj)}catch{const objType=obj?.__type||typeof obj;if(obj===null||objType!=="object"&&objType!=="function")return obj;if(obj instanceof Date)return new Date(obj.getTime());if(Array.isArray(obj))return obj.map(item=>this.deepClone(item));const cloned={};for(const key in obj){try{cloned[key]=this.deepClone(obj[key])}catch{cloned[key]=obj[key]}}return cloned}}generateId(){return`slothlet_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}}export{Utilities};
@@ -381,7 +381,27 @@
381
381
  "DEBUG_VERSION_RESOLVED": "Version aufgelöst: {version} für Pfad {apiPath} (Aufrufer: {callerModule})",
382
382
  "DEBUG_VERSION_DEFAULT_USED": "Keine Discriminator-Übereinstimmung für Pfad {apiPath}; Standardversion {version} wird verwendet.",
383
383
  "DEBUG_VERSION_REGISTERED": "Version {version} unter {logicalPath} registriert (moduleID: {moduleID})",
384
- "DEBUG_VERSION_UNREGISTERED": "Version {version} von {logicalPath} abgemeldet"
384
+ "DEBUG_VERSION_UNREGISTERED": "Version {version} von {logicalPath} abgemeldet",
385
+
386
+ "PERMISSION_DENIED": "Zugriff verweigert: Aufrufer '{caller}' darf nicht auf '{target}' zugreifen",
387
+ "HINT_PERMISSION_DENIED": "Prüfen Sie die Berechtigungsregeln für dieses Aufrufer/Ziel-Paar. Verwenden Sie api.slothlet.permissions.global.rulesForPath('{target}'), um die aktiven Regeln einzusehen.",
388
+ "PERMISSION_SELF_MODIFY": "Modul '{moduleID}' kann seine eigene Berechtigungsregel '{ruleId}' nicht entfernen",
389
+ "HINT_PERMISSION_SELF_MODIFY": "Berechtigungsregeln sind für das besitzende Modul unveränderlich. Ein anderes Modul muss diese Regel entfernen.",
390
+ "INVALID_PERMISSION_RULE": "Ungültige Berechtigungsregel: {reason} (erhalten: {received})",
391
+ "HINT_INVALID_PERMISSION_RULE": "Berechtigungsregeln erfordern: caller (String-Glob), target (String-Glob) und effect ('allow' oder 'deny').",
392
+ "DEBUG_PERMISSION_DENIED": "Berechtigung verweigert: Aufrufer '{caller}' -> Ziel '{target}'",
393
+ "DEBUG_PERMISSION_ALLOWED": "Berechtigung erteilt: Aufrufer '{caller}' -> Ziel '{target}'",
394
+ "DEBUG_PERMISSION_SELF_BYPASS": "Berechtigungs-Self-Bypass: Aufrufer und Ziel teilen sich moduleID '{moduleID}'",
395
+ "DEBUG_PERMISSION_DEFAULT": "Standard-Berechtigungsrichtlinie angewendet: Aufrufer '{caller}' -> Ziel '{target}' -> {effect}",
396
+ "DEBUG_PERMISSION_RULE_ADDED": "Berechtigungsregel hinzugefügt: {ruleId} ({caller} -> {target}: {effect}, Besitzer: {ownerModuleID})",
397
+ "DEBUG_PERMISSION_RULE_REMOVED": "Berechtigungsregel entfernt: {ruleId} ({caller} -> {target}: {effect})",
398
+ "PERM_RULE_NOT_OBJECT": "Regel muss ein nicht-leeres Objekt sein",
399
+ "PERM_RULE_CALLER_REQUIRED": "rule.caller muss eine nicht-leere Zeichenkette sein",
400
+ "PERM_RULE_TARGET_REQUIRED": "rule.target muss eine nicht-leere Zeichenkette sein",
401
+ "PERM_RULE_EFFECT_INVALID": "rule.effect muss 'allow' oder 'deny' sein",
402
+ "BRACE_EXPANSION_MAX_DEPTH": "Klammerauflösung hat die maximale Tiefe von {maxDepth} überschritten",
403
+ "HINT_BRACE_EXPANSION_MAX_DEPTH": "Verringern Sie die Verschachtelung in Ihren Klammermustern oder erhöhen Sie die maxDepth-Option.",
404
+ "PERMISSION_MANAGER_NOT_AVAILABLE": "Berechtigungsmanager ist nicht in dieser Slothlet-Instanz verfügbar"
385
405
  },
386
406
  "metadata": {
387
407
  "code": "de-de",
@@ -381,7 +381,27 @@
381
381
  "DEBUG_VERSION_RESOLVED": "Version resolved: {version} for path {apiPath} (caller: {callerModule})",
382
382
  "DEBUG_VERSION_DEFAULT_USED": "No discriminator match for path {apiPath}; using default version {version}",
383
383
  "DEBUG_VERSION_REGISTERED": "Version {version} registered at {logicalPath} (moduleID: {moduleID})",
384
- "DEBUG_VERSION_UNREGISTERED": "Version {version} unregistered from {logicalPath}"
384
+ "DEBUG_VERSION_UNREGISTERED": "Version {version} unregistered from {logicalPath}",
385
+
386
+ "PERMISSION_DENIED": "Access denied: caller '{caller}' is not permitted to access '{target}'",
387
+ "HINT_PERMISSION_DENIED": "Check permission rules for this caller/target pair. Use api.slothlet.permissions.global.rulesForPath('{target}') to inspect active rules.",
388
+ "PERMISSION_SELF_MODIFY": "Module '{moduleID}' cannot remove its own permission rule '{ruleId}'",
389
+ "HINT_PERMISSION_SELF_MODIFY": "Permission rules are immutable for the owning module. Another module must remove this rule.",
390
+ "INVALID_PERMISSION_RULE": "Invalid permission rule: {reason} (received: {received})",
391
+ "HINT_INVALID_PERMISSION_RULE": "Permission rules require: caller (string glob), target (string glob), and effect ('allow' or 'deny').",
392
+ "DEBUG_PERMISSION_DENIED": "Permission denied: caller '{caller}' -> target '{target}'",
393
+ "DEBUG_PERMISSION_ALLOWED": "Permission allowed: caller '{caller}' -> target '{target}'",
394
+ "DEBUG_PERMISSION_SELF_BYPASS": "Permission self-bypass: caller and target share moduleID '{moduleID}'",
395
+ "DEBUG_PERMISSION_DEFAULT": "Permission default policy applied: caller '{caller}' -> target '{target}' -> {effect}",
396
+ "DEBUG_PERMISSION_RULE_ADDED": "Permission rule added: {ruleId} ({caller} -> {target}: {effect}, owner: {ownerModuleID})",
397
+ "DEBUG_PERMISSION_RULE_REMOVED": "Permission rule removed: {ruleId} ({caller} -> {target}: {effect})",
398
+ "PERM_RULE_NOT_OBJECT": "rule must be a non-null object",
399
+ "PERM_RULE_CALLER_REQUIRED": "rule.caller must be a non-empty string",
400
+ "PERM_RULE_TARGET_REQUIRED": "rule.target must be a non-empty string",
401
+ "PERM_RULE_EFFECT_INVALID": "rule.effect must be 'allow' or 'deny'",
402
+ "BRACE_EXPANSION_MAX_DEPTH": "Brace expansion exceeded maximum depth of {maxDepth}",
403
+ "HINT_BRACE_EXPANSION_MAX_DEPTH": "Reduce nesting in your brace patterns or increase the maxDepth option.",
404
+ "PERMISSION_MANAGER_NOT_AVAILABLE": "Permission manager is not available in this Slothlet instance"
385
405
  },
386
406
  "metadata": {
387
407
  "code": "en-gb",
@@ -381,7 +381,27 @@
381
381
  "DEBUG_VERSION_RESOLVED": "Version resolved: {version} for path {apiPath} (caller: {callerModule})",
382
382
  "DEBUG_VERSION_DEFAULT_USED": "No discriminator match for path {apiPath}; using default version {version}",
383
383
  "DEBUG_VERSION_REGISTERED": "Version {version} registered at {logicalPath} (moduleID: {moduleID})",
384
- "DEBUG_VERSION_UNREGISTERED": "Version {version} unregistered from {logicalPath}"
384
+ "DEBUG_VERSION_UNREGISTERED": "Version {version} unregistered from {logicalPath}",
385
+
386
+ "PERMISSION_DENIED": "Access denied: caller '{caller}' is not permitted to access '{target}'",
387
+ "HINT_PERMISSION_DENIED": "Check permission rules for this caller/target pair. Use api.slothlet.permissions.global.rulesForPath('{target}') to inspect active rules.",
388
+ "PERMISSION_SELF_MODIFY": "Module '{moduleID}' cannot remove its own permission rule '{ruleId}'",
389
+ "HINT_PERMISSION_SELF_MODIFY": "Permission rules are immutable for the owning module. Another module must remove this rule.",
390
+ "INVALID_PERMISSION_RULE": "Invalid permission rule: {reason} (received: {received})",
391
+ "HINT_INVALID_PERMISSION_RULE": "Permission rules require: caller (string glob), target (string glob), and effect ('allow' or 'deny').",
392
+ "DEBUG_PERMISSION_DENIED": "Permission denied: caller '{caller}' -> target '{target}'",
393
+ "DEBUG_PERMISSION_ALLOWED": "Permission allowed: caller '{caller}' -> target '{target}'",
394
+ "DEBUG_PERMISSION_SELF_BYPASS": "Permission self-bypass: caller and target share moduleID '{moduleID}'",
395
+ "DEBUG_PERMISSION_DEFAULT": "Permission default policy applied: caller '{caller}' -> target '{target}' -> {effect}",
396
+ "DEBUG_PERMISSION_RULE_ADDED": "Permission rule added: {ruleId} ({caller} -> {target}: {effect}, owner: {ownerModuleID})",
397
+ "DEBUG_PERMISSION_RULE_REMOVED": "Permission rule removed: {ruleId} ({caller} -> {target}: {effect})",
398
+ "PERM_RULE_NOT_OBJECT": "rule must be a non-null object",
399
+ "PERM_RULE_CALLER_REQUIRED": "rule.caller must be a non-empty string",
400
+ "PERM_RULE_TARGET_REQUIRED": "rule.target must be a non-empty string",
401
+ "PERM_RULE_EFFECT_INVALID": "rule.effect must be 'allow' or 'deny'",
402
+ "BRACE_EXPANSION_MAX_DEPTH": "Brace expansion exceeded maximum depth of {maxDepth}",
403
+ "HINT_BRACE_EXPANSION_MAX_DEPTH": "Reduce nesting in your brace patterns or increase the maxDepth option.",
404
+ "PERMISSION_MANAGER_NOT_AVAILABLE": "Permission manager is not available in this Slothlet instance"
385
405
  },
386
406
  "metadata": {
387
407
  "code": "en-us",
@@ -381,7 +381,27 @@
381
381
  "DEBUG_VERSION_RESOLVED": "Versión resuelta: {version} para la ruta {apiPath} (llamador: {callerModule})",
382
382
  "DEBUG_VERSION_DEFAULT_USED": "Sin coincidencia del discriminador para la ruta {apiPath}; se usa la versión predeterminada {version}.",
383
383
  "DEBUG_VERSION_REGISTERED": "Versión {version} registrada en {logicalPath} (moduleID: {moduleID})",
384
- "DEBUG_VERSION_UNREGISTERED": "Versión {version} dada de baja de {logicalPath}"
384
+ "DEBUG_VERSION_UNREGISTERED": "Versión {version} dada de baja de {logicalPath}",
385
+
386
+ "PERMISSION_DENIED": "Acceso denegado: el llamador '{caller}' no tiene permiso para acceder a '{target}'",
387
+ "HINT_PERMISSION_DENIED": "Verifique las reglas de permisos para este par llamador/objetivo. Use api.slothlet.permissions.global.rulesForPath('{target}') para inspeccionar las reglas activas.",
388
+ "PERMISSION_SELF_MODIFY": "El módulo '{moduleID}' no puede eliminar su propia regla de permiso '{ruleId}'",
389
+ "HINT_PERMISSION_SELF_MODIFY": "Las reglas de permisos son inmutables para el módulo propietario. Otro módulo debe eliminar esta regla.",
390
+ "INVALID_PERMISSION_RULE": "Regla de permiso inválida: {reason} (recibido: {received})",
391
+ "HINT_INVALID_PERMISSION_RULE": "Las reglas de permisos requieren: caller (string glob), target (string glob) y effect ('allow' o 'deny').",
392
+ "DEBUG_PERMISSION_DENIED": "Permiso denegado: llamador '{caller}' -> objetivo '{target}'",
393
+ "DEBUG_PERMISSION_ALLOWED": "Permiso concedido: llamador '{caller}' -> objetivo '{target}'",
394
+ "DEBUG_PERMISSION_SELF_BYPASS": "Auto-bypass de permisos: llamador y objetivo comparten moduleID '{moduleID}'",
395
+ "DEBUG_PERMISSION_DEFAULT": "Política de permisos predeterminada aplicada: llamador '{caller}' -> objetivo '{target}' -> {effect}",
396
+ "DEBUG_PERMISSION_RULE_ADDED": "Regla de permiso agregada: {ruleId} ({caller} -> {target}: {effect}, propietario: {ownerModuleID})",
397
+ "DEBUG_PERMISSION_RULE_REMOVED": "Regla de permiso eliminada: {ruleId} ({caller} -> {target}: {effect})",
398
+ "PERM_RULE_NOT_OBJECT": "la regla debe ser un objeto no nulo",
399
+ "PERM_RULE_CALLER_REQUIRED": "rule.caller debe ser una cadena no vacía",
400
+ "PERM_RULE_TARGET_REQUIRED": "rule.target debe ser una cadena no vacía",
401
+ "PERM_RULE_EFFECT_INVALID": "rule.effect debe ser 'allow' o 'deny'",
402
+ "BRACE_EXPANSION_MAX_DEPTH": "La expansión de llaves superó la profundidad máxima de {maxDepth}",
403
+ "HINT_BRACE_EXPANSION_MAX_DEPTH": "Reduce el anidamiento en tus patrones de llaves o aumenta la opción maxDepth.",
404
+ "PERMISSION_MANAGER_NOT_AVAILABLE": "El administrador de permisos no está disponible en esta instancia de Slothlet"
385
405
  },
386
406
  "metadata": {
387
407
  "code": "es-mx",
@@ -381,7 +381,27 @@
381
381
  "DEBUG_VERSION_RESOLVED": "Version résolue : {version} pour le chemin {apiPath} (appelant : {callerModule})",
382
382
  "DEBUG_VERSION_DEFAULT_USED": "Aucune correspondance de discriminateur pour le chemin {apiPath} ; utilisation de la version par défaut {version}.",
383
383
  "DEBUG_VERSION_REGISTERED": "Version {version} enregistrée à {logicalPath} (moduleID : {moduleID})",
384
- "DEBUG_VERSION_UNREGISTERED": "Version {version} désinscrite de {logicalPath}"
384
+ "DEBUG_VERSION_UNREGISTERED": "Version {version} désinscrite de {logicalPath}",
385
+
386
+ "PERMISSION_DENIED": "Accès refusé : l'appelant '{caller}' n'est pas autorisé à accéder à '{target}'",
387
+ "HINT_PERMISSION_DENIED": "Vérifiez les règles d'autorisation pour ce couple appelant/cible. Utilisez api.slothlet.permissions.global.rulesForPath('{target}') pour inspecter les règles actives.",
388
+ "PERMISSION_SELF_MODIFY": "Le module '{moduleID}' ne peut pas supprimer sa propre règle d'autorisation '{ruleId}'",
389
+ "HINT_PERMISSION_SELF_MODIFY": "Les règles d'autorisation sont immuables pour le module propriétaire. Un autre module doit supprimer cette règle.",
390
+ "INVALID_PERMISSION_RULE": "Règle d'autorisation invalide : {reason} (reçu : {received})",
391
+ "HINT_INVALID_PERMISSION_RULE": "Les règles d'autorisation nécessitent : caller (string glob), target (string glob) et effect ('allow' ou 'deny').",
392
+ "DEBUG_PERMISSION_DENIED": "Autorisation refusée : appelant '{caller}' -> cible '{target}'",
393
+ "DEBUG_PERMISSION_ALLOWED": "Autorisation accordée : appelant '{caller}' -> cible '{target}'",
394
+ "DEBUG_PERMISSION_SELF_BYPASS": "Auto-bypass d'autorisation : l'appelant et la cible partagent le moduleID '{moduleID}'",
395
+ "DEBUG_PERMISSION_DEFAULT": "Politique d'autorisation par défaut appliquée : appelant '{caller}' -> cible '{target}' -> {effect}",
396
+ "DEBUG_PERMISSION_RULE_ADDED": "Règle d'autorisation ajoutée : {ruleId} ({caller} -> {target} : {effect}, propriétaire : {ownerModuleID})",
397
+ "DEBUG_PERMISSION_RULE_REMOVED": "Règle d'autorisation supprimée : {ruleId} ({caller} -> {target} : {effect})",
398
+ "PERM_RULE_NOT_OBJECT": "la règle doit être un objet non nul",
399
+ "PERM_RULE_CALLER_REQUIRED": "rule.caller doit être une chaîne non vide",
400
+ "PERM_RULE_TARGET_REQUIRED": "rule.target doit être une chaîne non vide",
401
+ "PERM_RULE_EFFECT_INVALID": "rule.effect doit être 'allow' ou 'deny'",
402
+ "BRACE_EXPANSION_MAX_DEPTH": "L'expansion des accolades a dépassé la profondeur maximale de {maxDepth}",
403
+ "HINT_BRACE_EXPANSION_MAX_DEPTH": "Réduisez le niveau d'imbrication dans vos motifs d'accolades ou augmentez l'option maxDepth.",
404
+ "PERMISSION_MANAGER_NOT_AVAILABLE": "Le gestionnaire de permissions n'est pas disponible dans cette instance Slothlet"
385
405
  },
386
406
  "metadata": {
387
407
  "code": "fr-fr",
@@ -381,7 +381,27 @@
381
381
  "DEBUG_VERSION_RESOLVED": "संस्करण हल किया गया: {version}, पथ: {apiPath} (कॉलर: {callerModule})",
382
382
  "DEBUG_VERSION_DEFAULT_USED": "पथ {apiPath} के लिए कोई Discriminator मिलान नहीं; डिफ़ॉल्ट संस्करण {version} का उपयोग किया जा रहा है।",
383
383
  "DEBUG_VERSION_REGISTERED": "संस्करण {version} को {logicalPath} पर पंजीकृत किया गया (moduleID: {moduleID})",
384
- "DEBUG_VERSION_UNREGISTERED": "संस्करण {version} को {logicalPath} से हटाया गया"
384
+ "DEBUG_VERSION_UNREGISTERED": "संस्करण {version} को {logicalPath} से हटाया गया",
385
+
386
+ "PERMISSION_DENIED": "पहुँच अस्वीकृत: कॉलर '{caller}' को '{target}' तक पहुँचने की अनुमति नहीं है",
387
+ "HINT_PERMISSION_DENIED": "इस कॉलर/लक्ष्य जोड़ी के लिए अनुमति नियम जाँचें। सक्रिय नियमों का निरीक्षण करने के लिए api.slothlet.permissions.global.rulesForPath('{target}') का उपयोग करें।",
388
+ "PERMISSION_SELF_MODIFY": "मॉड्यूल '{moduleID}' अपना स्वयं का अनुमति नियम '{ruleId}' नहीं हटा सकता",
389
+ "HINT_PERMISSION_SELF_MODIFY": "अनुमति नियम स्वामी मॉड्यूल के लिए अपरिवर्तनीय हैं। किसी अन्य मॉड्यूल को यह नियम हटाना होगा।",
390
+ "INVALID_PERMISSION_RULE": "अमान्य अनुमति नियम: {reason} (प्राप्त: {received})",
391
+ "HINT_INVALID_PERMISSION_RULE": "अनुमति नियमों के लिए आवश्यक: caller (string glob), target (string glob) और effect ('allow' या 'deny')।",
392
+ "DEBUG_PERMISSION_DENIED": "अनुमति अस्वीकृत: कॉलर '{caller}' -> लक्ष्य '{target}'",
393
+ "DEBUG_PERMISSION_ALLOWED": "अनुमति स्वीकृत: कॉलर '{caller}' -> लक्ष्य '{target}'",
394
+ "DEBUG_PERMISSION_SELF_BYPASS": "अनुमति सेल्फ-बाइपास: कॉलर और लक्ष्य moduleID '{moduleID}' साझा करते हैं",
395
+ "DEBUG_PERMISSION_DEFAULT": "डिफ़ॉल्ट अनुमति नीति लागू: कॉलर '{caller}' -> लक्ष्य '{target}' -> {effect}",
396
+ "DEBUG_PERMISSION_RULE_ADDED": "अनुमति नियम जोड़ा गया: {ruleId} ({caller} -> {target}: {effect}, स्वामी: {ownerModuleID})",
397
+ "DEBUG_PERMISSION_RULE_REMOVED": "अनुमति नियम हटाया गया: {ruleId} ({caller} -> {target}: {effect})",
398
+ "PERM_RULE_NOT_OBJECT": "नियम एक गैर-शून्य ऑब्जेक्ट होना चाहिए",
399
+ "PERM_RULE_CALLER_REQUIRED": "rule.caller एक गैर-रिक्त स्ट्रिंग होना चाहिए",
400
+ "PERM_RULE_TARGET_REQUIRED": "rule.target एक गैर-रिक्त स्ट्रिंग होना चाहिए",
401
+ "PERM_RULE_EFFECT_INVALID": "rule.effect 'allow' या 'deny' होना चाहिए",
402
+ "BRACE_EXPANSION_MAX_DEPTH": "ब्रेस विस्तार ने {maxDepth} की अधिकतम गहराई पार कर दी",
403
+ "HINT_BRACE_EXPANSION_MAX_DEPTH": "अपने ब्रेस पैटर्न में नेस्टिंग कम करें या maxDepth विकल्प बढ़ाएं।",
404
+ "PERMISSION_MANAGER_NOT_AVAILABLE": "अनुमति प्रबंधक इस Slothlet इंस्टेंस में उपलब्ध नहीं है"
385
405
  },
386
406
  "metadata": {
387
407
  "code": "hi-in",
@@ -381,7 +381,27 @@
381
381
  "DEBUG_VERSION_RESOLVED": "バージョン解決済み: {version}、パス: {apiPath}(呼び出し元: {callerModule})",
382
382
  "DEBUG_VERSION_DEFAULT_USED": "パス {apiPath} の Discriminator に一致なし。デフォルトバージョン {version} を使用します。",
383
383
  "DEBUG_VERSION_REGISTERED": "バージョン {version} が {logicalPath} に登録されました(moduleID: {moduleID})",
384
- "DEBUG_VERSION_UNREGISTERED": "バージョン {version} が {logicalPath} から登録解除されました"
384
+ "DEBUG_VERSION_UNREGISTERED": "バージョン {version} が {logicalPath} から登録解除されました",
385
+
386
+ "PERMISSION_DENIED": "アクセス拒否: 呼び出し元 '{caller}' は '{target}' へのアクセスが許可されていません",
387
+ "HINT_PERMISSION_DENIED": "この呼び出し元/ターゲットのペアのパーミッションルールを確認してください。api.slothlet.permissions.global.rulesForPath('{target}') を使用してアクティブなルールを検査できます。",
388
+ "PERMISSION_SELF_MODIFY": "モジュール '{moduleID}' は自身のパーミッションルール '{ruleId}' を削除できません",
389
+ "HINT_PERMISSION_SELF_MODIFY": "パーミッションルールは所有モジュールに対して不変です。別のモジュールがこのルールを削除する必要があります。",
390
+ "INVALID_PERMISSION_RULE": "無効なパーミッションルール: {reason}(受信値: {received})",
391
+ "HINT_INVALID_PERMISSION_RULE": "パーミッションルールには caller(string glob)、target(string glob)、および effect('allow' または 'deny')が必要です。",
392
+ "DEBUG_PERMISSION_DENIED": "パーミッション拒否: 呼び出し元 '{caller}' -> ターゲット '{target}'",
393
+ "DEBUG_PERMISSION_ALLOWED": "パーミッション許可: 呼び出し元 '{caller}' -> ターゲット '{target}'",
394
+ "DEBUG_PERMISSION_SELF_BYPASS": "パーミッション・セルフバイパス: 呼び出し元とターゲットが moduleID '{moduleID}' を共有しています",
395
+ "DEBUG_PERMISSION_DEFAULT": "デフォルトパーミッションポリシー適用: 呼び出し元 '{caller}' -> ターゲット '{target}' -> {effect}",
396
+ "DEBUG_PERMISSION_RULE_ADDED": "パーミッションルール追加: {ruleId}({caller} -> {target}: {effect}、所有者: {ownerModuleID})",
397
+ "DEBUG_PERMISSION_RULE_REMOVED": "パーミッションルール削除: {ruleId}({caller} -> {target}: {effect})",
398
+ "PERM_RULE_NOT_OBJECT": "ルールは非ヌルのオブジェクトである必要があります",
399
+ "PERM_RULE_CALLER_REQUIRED": "rule.callerは空でない文字列である必要があります",
400
+ "PERM_RULE_TARGET_REQUIRED": "rule.targetは空でない文字列である必要があります",
401
+ "PERM_RULE_EFFECT_INVALID": "rule.effectは'allow'または'deny'である必要があります",
402
+ "BRACE_EXPANSION_MAX_DEPTH": "ブレース展開が最大深度 {maxDepth} を超えました",
403
+ "HINT_BRACE_EXPANSION_MAX_DEPTH": "波括弧パターンのネストを減らすか、maxDepthオプションを増やしてください。",
404
+ "PERMISSION_MANAGER_NOT_AVAILABLE": "権限マネージャーはこのSlothletインスタンスで利用できません"
385
405
  },
386
406
  "metadata": {
387
407
  "code": "ja-jp",