@sn4p.dev/mucv 0.5.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.
Files changed (110) hide show
  1. package/README.md +126 -0
  2. package/dist/core/elementor-parser.d.ts +22 -0
  3. package/dist/core/elementor-parser.d.ts.map +1 -0
  4. package/dist/core/elementor-parser.js +186 -0
  5. package/dist/core/elementor-parser.js.map +1 -0
  6. package/dist/core/html-parser.d.ts +27 -0
  7. package/dist/core/html-parser.d.ts.map +1 -0
  8. package/dist/core/html-parser.js +247 -0
  9. package/dist/core/html-parser.js.map +1 -0
  10. package/dist/core/jsx-parser.d.ts +22 -0
  11. package/dist/core/jsx-parser.d.ts.map +1 -0
  12. package/dist/core/jsx-parser.js +261 -0
  13. package/dist/core/jsx-parser.js.map +1 -0
  14. package/dist/core/mapper.d.ts +52 -0
  15. package/dist/core/mapper.d.ts.map +1 -0
  16. package/dist/core/mapper.js +141 -0
  17. package/dist/core/mapper.js.map +1 -0
  18. package/dist/core/normalizer.d.ts +57 -0
  19. package/dist/core/normalizer.d.ts.map +1 -0
  20. package/dist/core/normalizer.js +285 -0
  21. package/dist/core/normalizer.js.map +1 -0
  22. package/dist/core/optimizer.d.ts +21 -0
  23. package/dist/core/optimizer.d.ts.map +1 -0
  24. package/dist/core/optimizer.js +75 -0
  25. package/dist/core/optimizer.js.map +1 -0
  26. package/dist/core/parse-result.d.ts +10 -0
  27. package/dist/core/parse-result.d.ts.map +1 -0
  28. package/dist/core/parse-result.js +6 -0
  29. package/dist/core/parse-result.js.map +1 -0
  30. package/dist/core/vir.d.ts +136 -0
  31. package/dist/core/vir.d.ts.map +1 -0
  32. package/dist/core/vir.js +9 -0
  33. package/dist/core/vir.js.map +1 -0
  34. package/dist/generators/style-serializer.d.ts +25 -0
  35. package/dist/generators/style-serializer.d.ts.map +1 -0
  36. package/dist/generators/style-serializer.js +129 -0
  37. package/dist/generators/style-serializer.js.map +1 -0
  38. package/dist/generators/to-elementor.d.ts +13 -0
  39. package/dist/generators/to-elementor.d.ts.map +1 -0
  40. package/dist/generators/to-elementor.js +150 -0
  41. package/dist/generators/to-elementor.js.map +1 -0
  42. package/dist/generators/to-html-css.d.ts +22 -0
  43. package/dist/generators/to-html-css.d.ts.map +1 -0
  44. package/dist/generators/to-html-css.js +127 -0
  45. package/dist/generators/to-html-css.js.map +1 -0
  46. package/dist/generators/to-react.d.ts +22 -0
  47. package/dist/generators/to-react.d.ts.map +1 -0
  48. package/dist/generators/to-react.js +123 -0
  49. package/dist/generators/to-react.js.map +1 -0
  50. package/dist/generators/to-svelte.d.ts +15 -0
  51. package/dist/generators/to-svelte.d.ts.map +1 -0
  52. package/dist/generators/to-svelte.js +105 -0
  53. package/dist/generators/to-svelte.js.map +1 -0
  54. package/dist/generators/to-vue.d.ts +17 -0
  55. package/dist/generators/to-vue.d.ts.map +1 -0
  56. package/dist/generators/to-vue.js +108 -0
  57. package/dist/generators/to-vue.js.map +1 -0
  58. package/dist/index.d.ts +8 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +228 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/schemas/input.schema.d.ts +245 -0
  63. package/dist/schemas/input.schema.d.ts.map +1 -0
  64. package/dist/schemas/input.schema.js +66 -0
  65. package/dist/schemas/input.schema.js.map +1 -0
  66. package/dist/schemas/vir.schema.d.ts +1786 -0
  67. package/dist/schemas/vir.schema.d.ts.map +1 -0
  68. package/dist/schemas/vir.schema.js +201 -0
  69. package/dist/schemas/vir.schema.js.map +1 -0
  70. package/dist/tools/convert-design.d.ts +40 -0
  71. package/dist/tools/convert-design.d.ts.map +1 -0
  72. package/dist/tools/convert-design.js +106 -0
  73. package/dist/tools/convert-design.js.map +1 -0
  74. package/dist/tools/validate-vir.d.ts +18 -0
  75. package/dist/tools/validate-vir.d.ts.map +1 -0
  76. package/dist/tools/validate-vir.js +32 -0
  77. package/dist/tools/validate-vir.js.map +1 -0
  78. package/dist/tools/wp-connector.d.ts +55 -0
  79. package/dist/tools/wp-connector.d.ts.map +1 -0
  80. package/dist/tools/wp-connector.js +146 -0
  81. package/dist/tools/wp-connector.js.map +1 -0
  82. package/dist/tools/wp-tools.d.ts +51 -0
  83. package/dist/tools/wp-tools.d.ts.map +1 -0
  84. package/dist/tools/wp-tools.js +126 -0
  85. package/dist/tools/wp-tools.js.map +1 -0
  86. package/dist/utils/errors.d.ts +35 -0
  87. package/dist/utils/errors.d.ts.map +1 -0
  88. package/dist/utils/errors.js +67 -0
  89. package/dist/utils/errors.js.map +1 -0
  90. package/dist/utils/id-generator.d.ts +27 -0
  91. package/dist/utils/id-generator.d.ts.map +1 -0
  92. package/dist/utils/id-generator.js +43 -0
  93. package/dist/utils/id-generator.js.map +1 -0
  94. package/dist/utils/logger.d.ts +8 -0
  95. package/dist/utils/logger.d.ts.map +1 -0
  96. package/dist/utils/logger.js +19 -0
  97. package/dist/utils/logger.js.map +1 -0
  98. package/dist/utils/metrics.d.ts +30 -0
  99. package/dist/utils/metrics.d.ts.map +1 -0
  100. package/dist/utils/metrics.js +50 -0
  101. package/dist/utils/metrics.js.map +1 -0
  102. package/dist/utils/rate-limiter.d.ts +25 -0
  103. package/dist/utils/rate-limiter.d.ts.map +1 -0
  104. package/dist/utils/rate-limiter.js +41 -0
  105. package/dist/utils/rate-limiter.js.map +1 -0
  106. package/dist/utils/url-validator.d.ts +14 -0
  107. package/dist/utils/url-validator.d.ts.map +1 -0
  108. package/dist/utils/url-validator.js +37 -0
  109. package/dist/utils/url-validator.js.map +1 -0
  110. package/package.json +73 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wp-connector.js","sourceRoot":"","sources":["../../src/tools/wp-connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * MUCV — WordPress MCP Tools
3
+ * Herramientas get_page_design, publish_design, list_pages
4
+ * que usan el WordPressConnector para interactuar con WordPress.
5
+ */
6
+ import type { GetPageDesignInput, ListPagesInput, PublishDesignInput } from '../schemas/input.schema.js';
7
+ import type { VisualIR } from '../core/vir.js';
8
+ import type { WordPressConnector } from './wp-connector.js';
9
+ export interface GetPageDesignOutput {
10
+ postId: number;
11
+ postTitle: string;
12
+ postUrl: string;
13
+ vir: VisualIR;
14
+ converted?: unknown;
15
+ meta: {
16
+ requestId: string;
17
+ nodeCount: number;
18
+ durationMs: number;
19
+ virVersion: string;
20
+ warnings: string[];
21
+ };
22
+ }
23
+ export declare function getPageDesign(input: GetPageDesignInput, connector: WordPressConnector): Promise<GetPageDesignOutput>;
24
+ export interface PublishDesignOutput {
25
+ postId: number;
26
+ postUrl: string;
27
+ action: 'created' | 'updated';
28
+ meta: {
29
+ requestId: string;
30
+ durationMs: number;
31
+ warnings: string[];
32
+ };
33
+ }
34
+ export declare function publishDesign(input: PublishDesignInput, connector: WordPressConnector): Promise<PublishDesignOutput>;
35
+ export interface ListPagesOutput {
36
+ pages: Array<{
37
+ id: number;
38
+ title: string;
39
+ url: string;
40
+ status: string;
41
+ modifiedAt: string;
42
+ hasElementor: boolean;
43
+ }>;
44
+ total: number;
45
+ meta: {
46
+ requestId: string;
47
+ durationMs: number;
48
+ };
49
+ }
50
+ export declare function listPages(input: ListPagesInput, connector: WordPressConnector): Promise<ListPagesOutput>;
51
+ //# sourceMappingURL=wp-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wp-tools.d.ts","sourceRoot":"","sources":["../../src/tools/wp-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACxG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAK9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAK3D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,QAAQ,CAAA;IACb,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;KACnB,CAAA;CACF;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAiD9B;AAID,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;IAC7B,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;KACnB,CAAA;CACF;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA0D9B;AAID,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,YAAY,EAAE,OAAO,CAAA;KACtB,CAAC,CAAA;IACF,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAAC,eAAe,CAAC,CA8B1B"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * MUCV — WordPress MCP Tools
3
+ * Herramientas get_page_design, publish_design, list_pages
4
+ * que usan el WordPressConnector para interactuar con WordPress.
5
+ */
6
+ import { elementorParser } from '../core/elementor-parser.js';
7
+ import { WordPressError, ParseError } from '../utils/errors.js';
8
+ import { generateRequestId } from '../utils/id-generator.js';
9
+ import { logger } from '../utils/logger.js';
10
+ import { convertDesign } from './convert-design.js';
11
+ export async function getPageDesign(input, connector) {
12
+ const requestId = generateRequestId();
13
+ const start = performance.now();
14
+ const { pageId, postType = 'page', targetType = 'elementor' } = input;
15
+ logger.info({ requestId, pageId, postType }, 'Fetching page design from WordPress');
16
+ const entity = await connector.getEntity(postType, pageId);
17
+ const elementorData = entity.meta?.['_elementor_data'];
18
+ if (!elementorData || typeof elementorData !== 'string') {
19
+ throw new WordPressError(`No Elementor data found on ${postType} ${pageId}`, 404, { pageId, postType });
20
+ }
21
+ const parseResult = elementorParser.parse(elementorData);
22
+ const vir = parseResult.vir;
23
+ const warnings = [...parseResult.warnings];
24
+ let converted = undefined;
25
+ if (targetType !== 'elementor') {
26
+ const conversionResult = convertDesign({
27
+ sourceType: 'elementor',
28
+ targetType,
29
+ content: elementorData,
30
+ });
31
+ converted = conversionResult.result;
32
+ warnings.push(...conversionResult.meta.warnings);
33
+ }
34
+ const durationMs = Math.round(performance.now() - start);
35
+ return {
36
+ postId: entity.id,
37
+ postTitle: entity.title.rendered,
38
+ postUrl: entity.link,
39
+ vir,
40
+ ...(converted ? { converted } : {}),
41
+ meta: {
42
+ requestId,
43
+ nodeCount: vir.root.length,
44
+ durationMs,
45
+ virVersion: vir.virVersion,
46
+ warnings,
47
+ },
48
+ };
49
+ }
50
+ export async function publishDesign(input, connector) {
51
+ const requestId = generateRequestId();
52
+ const start = performance.now();
53
+ const { content, sourceType, postType = 'page', pageId, title, status } = input;
54
+ logger.info({ requestId, sourceType, postType, pageId }, 'Publishing design to WordPress');
55
+ // Convert content to Elementor JSON
56
+ let elementorJson;
57
+ const publishWarnings = [];
58
+ if (sourceType === 'elementor') {
59
+ // Validate by parsing, then pass through
60
+ const parseResult = elementorParser.parse(content);
61
+ publishWarnings.push(...parseResult.warnings);
62
+ elementorJson = content;
63
+ }
64
+ else {
65
+ // Parse from source → VIR → optimize → generate Elementor
66
+ const conversionResult = convertDesign({
67
+ sourceType,
68
+ targetType: 'elementor',
69
+ content,
70
+ });
71
+ if (conversionResult.result.type !== 'elementor') {
72
+ throw new ParseError('Failed to convert to Elementor format', { sourceType });
73
+ }
74
+ elementorJson = conversionResult.result.data;
75
+ }
76
+ const wpData = {
77
+ title: title ?? 'MUCV Design',
78
+ status,
79
+ meta: { _elementor_data: elementorJson },
80
+ };
81
+ let entity;
82
+ let action;
83
+ if (pageId) {
84
+ entity = await connector.updateEntity(postType, pageId, wpData);
85
+ action = 'updated';
86
+ }
87
+ else {
88
+ entity = await connector.createEntity(postType, wpData);
89
+ action = 'created';
90
+ }
91
+ const durationMs = Math.round(performance.now() - start);
92
+ logger.info({ requestId, postId: entity.id, action, durationMs }, 'Design published');
93
+ return {
94
+ postId: entity.id,
95
+ postUrl: entity.link,
96
+ action,
97
+ meta: { requestId, durationMs, warnings: publishWarnings },
98
+ };
99
+ }
100
+ export async function listPages(input, connector) {
101
+ const requestId = generateRequestId();
102
+ const start = performance.now();
103
+ const { postType = 'page', limit, offset, status, search } = input;
104
+ logger.info({ requestId, postType, limit, offset }, 'Listing pages from WordPress');
105
+ const entities = await connector.listEntities(postType, {
106
+ per_page: limit,
107
+ offset,
108
+ status: status === 'any' ? undefined : status,
109
+ search,
110
+ });
111
+ const pages = entities.map((e) => ({
112
+ id: e.id,
113
+ title: e.title.rendered,
114
+ url: e.link,
115
+ status: e.status,
116
+ modifiedAt: e.modified,
117
+ hasElementor: Boolean(e.meta?.['_elementor_data']),
118
+ }));
119
+ const durationMs = Math.round(performance.now() - start);
120
+ return {
121
+ pages,
122
+ total: pages.length,
123
+ meta: { requestId, durationMs },
124
+ };
125
+ }
126
+ //# sourceMappingURL=wp-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wp-tools.js","sourceRoot":"","sources":["../../src/tools/wp-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MUCV — Tipos de error del dominio
3
+ * Todos los errores extienden MUCVError para identificación uniforme.
4
+ */
5
+ import type { ZodError } from 'zod';
6
+ export declare class MUCVError extends Error {
7
+ readonly code: string;
8
+ readonly context: Record<string, unknown>;
9
+ constructor(message: string, code: string, context?: Record<string, unknown>);
10
+ }
11
+ export declare class ParseError extends MUCVError {
12
+ constructor(message: string, context?: Record<string, unknown>);
13
+ }
14
+ export declare class VIRValidationError extends MUCVError {
15
+ readonly zodError: ZodError;
16
+ constructor(zodError: ZodError, context?: Record<string, unknown>);
17
+ }
18
+ export declare class GenerateError extends MUCVError {
19
+ constructor(message: string, context?: Record<string, unknown>);
20
+ }
21
+ export declare class UnsupportedComboError extends MUCVError {
22
+ constructor(sourceType: string, targetType: string);
23
+ }
24
+ export declare class WordPressError extends MUCVError {
25
+ readonly statusCode: number;
26
+ constructor(message: string, statusCode: number, context?: Record<string, unknown>);
27
+ }
28
+ export declare class PayloadTooLargeError extends MUCVError {
29
+ constructor(message: string, context?: Record<string, unknown>);
30
+ }
31
+ export declare class RateLimitError extends MUCVError {
32
+ constructor(message: string, context?: Record<string, unknown>);
33
+ }
34
+ export declare function isMUCVError(error: unknown): error is MUCVError;
35
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAInC,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAGvC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAQxC;AAID,qBAAa,UAAW,SAAQ,SAAS;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAGnE;AAID,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;gBAEf,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAQtE;AAID,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAGnE;AAID,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAOnD;AAID,qBAAa,cAAe,SAAQ,SAAS;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;gBAEf,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAIvF;AAID,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAGnE;AAID,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAGnE;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * MUCV — Tipos de error del dominio
3
+ * Todos los errores extienden MUCVError para identificación uniforme.
4
+ */
5
+ // ─── Error base ──────────────────────────────────────────────────────────────
6
+ export class MUCVError extends Error {
7
+ code;
8
+ context;
9
+ constructor(message, code, context = {}) {
10
+ super(message);
11
+ this.name = this.constructor.name;
12
+ this.code = code;
13
+ this.context = context;
14
+ Error.captureStackTrace(this, this.constructor);
15
+ }
16
+ }
17
+ // ─── Errores de parsing ──────────────────────────────────────────────────────
18
+ export class ParseError extends MUCVError {
19
+ constructor(message, context = {}) {
20
+ super(message, 'PARSE_ERROR', context);
21
+ }
22
+ }
23
+ // ─── Errores de validación VIR ───────────────────────────────────────────────
24
+ export class VIRValidationError extends MUCVError {
25
+ zodError;
26
+ constructor(zodError, context = {}) {
27
+ super(`VIR validation failed: ${zodError.issues.map((i) => i.message).join(', ')}`, 'VALIDATION_ERROR', { ...context, issues: zodError.issues });
28
+ this.zodError = zodError;
29
+ }
30
+ }
31
+ // ─── Errores de generación ───────────────────────────────────────────────────
32
+ export class GenerateError extends MUCVError {
33
+ constructor(message, context = {}) {
34
+ super(message, 'GENERATE_ERROR', context);
35
+ }
36
+ }
37
+ // ─── Errores de combinación no soportada ─────────────────────────────────────
38
+ export class UnsupportedComboError extends MUCVError {
39
+ constructor(sourceType, targetType) {
40
+ super(`Unsupported conversion: ${sourceType} → ${targetType}`, 'UNSUPPORTED_COMBO', { sourceType, targetType });
41
+ }
42
+ }
43
+ // ─── Errores de WordPress / HTTP ─────────────────────────────────────────────
44
+ export class WordPressError extends MUCVError {
45
+ statusCode;
46
+ constructor(message, statusCode, context = {}) {
47
+ super(message, 'WORDPRESS_ERROR', { ...context, statusCode });
48
+ this.statusCode = statusCode;
49
+ }
50
+ }
51
+ // ─── Errores de payload ──────────────────────────────────────────────────────
52
+ export class PayloadTooLargeError extends MUCVError {
53
+ constructor(message, context = {}) {
54
+ super(message, 'PAYLOAD_TOO_LARGE', context);
55
+ }
56
+ }
57
+ // ─── Errores de rate limiting ────────────────────────────────────────────────
58
+ export class RateLimitError extends MUCVError {
59
+ constructor(message, context = {}) {
60
+ super(message, 'RATE_LIMIT_EXCEEDED', context);
61
+ }
62
+ }
63
+ // ─── Guard de tipo ───────────────────────────────────────────────────────────
64
+ export function isMUCVError(error) {
65
+ return error instanceof MUCVError;
66
+ }
67
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,gFAAgF;AAEhF,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAQ;IACZ,OAAO,CAAyB;IAEzC,YACE,OAAe,EACf,IAAY,EACZ,UAAmC,EAAE;QAErC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IACjD,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,OAAO,UAAW,SAAQ,SAAS;IACvC,YAAY,OAAe,EAAE,UAAmC,EAAE;QAChE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IACtC,QAAQ,CAAU;IAE3B,YAAY,QAAkB,EAAE,UAAmC,EAAE;QACnE,KAAK,CACH,0BAA0B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC5E,kBAAkB,EAClB,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CACxC,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,OAAO,aAAc,SAAQ,SAAS;IAC1C,YAAY,OAAe,EAAE,UAAmC,EAAE;QAChE,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IAClD,YAAY,UAAkB,EAAE,UAAkB;QAChD,KAAK,CACH,2BAA2B,UAAU,MAAM,UAAU,EAAE,EACvD,mBAAmB,EACnB,EAAE,UAAU,EAAE,UAAU,EAAE,CAC3B,CAAA;IACH,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,OAAO,cAAe,SAAQ,SAAS;IAClC,UAAU,CAAQ;IAE3B,YAAY,OAAe,EAAE,UAAkB,EAAE,UAAmC,EAAE;QACpF,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACjD,YAAY,OAAe,EAAE,UAAmC,EAAE;QAChE,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,OAAO,cAAe,SAAQ,SAAS;IAC3C,YAAY,OAAe,EAAE,UAAmC,EAAE;QAChE,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,SAAS,CAAA;AACnC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * MUCV — Generador de IDs deterministas
3
+ *
4
+ * Los IDs del VIR deben ser deterministas dado el mismo input para
5
+ * garantizar la idempotencia del pipeline (VIR-SPEC §6).
6
+ *
7
+ * Estrategia:
8
+ * - IDs de nodo: hash SHA-256 del contenido serializado del nodo (primeros 8 chars)
9
+ * - IDs de árbol VIR: hash SHA-256 del árbol completo (prefijo "vir_")
10
+ */
11
+ /**
12
+ * Genera un ID de nodo determinista a partir del contenido del nodo.
13
+ * @param content - Objeto serializable que representa el nodo
14
+ * @param index - Índice posicional dentro del árbol (para evitar colisiones)
15
+ */
16
+ export declare function generateNodeId(content: unknown, index: number): string;
17
+ /**
18
+ * Genera un ID de árbol VIR determinista a partir del contenido completo.
19
+ * @param content - El árbol completo (antes de asignar el id)
20
+ */
21
+ export declare function generateVIRId(content: unknown): string;
22
+ /**
23
+ * Genera un ID de request aleatorio para trazabilidad de operaciones.
24
+ * NO es determinista — se usa para request IDs de logging, no para VIR.
25
+ */
26
+ export declare function generateRequestId(): string;
27
+ //# sourceMappingURL=id-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../../src/utils/id-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAGtD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * MUCV — Generador de IDs deterministas
3
+ *
4
+ * Los IDs del VIR deben ser deterministas dado el mismo input para
5
+ * garantizar la idempotencia del pipeline (VIR-SPEC §6).
6
+ *
7
+ * Estrategia:
8
+ * - IDs de nodo: hash SHA-256 del contenido serializado del nodo (primeros 8 chars)
9
+ * - IDs de árbol VIR: hash SHA-256 del árbol completo (prefijo "vir_")
10
+ */
11
+ import { createHash } from 'node:crypto';
12
+ const NODE_PREFIX = 'node_';
13
+ const VIR_PREFIX = 'vir_';
14
+ const HASH_LENGTH = 8;
15
+ function sha256(input) {
16
+ return createHash('sha256').update(input, 'utf8').digest('hex');
17
+ }
18
+ /**
19
+ * Genera un ID de nodo determinista a partir del contenido del nodo.
20
+ * @param content - Objeto serializable que representa el nodo
21
+ * @param index - Índice posicional dentro del árbol (para evitar colisiones)
22
+ */
23
+ export function generateNodeId(content, index) {
24
+ const serialized = JSON.stringify({ content, index });
25
+ return `${NODE_PREFIX}${sha256(serialized).slice(0, HASH_LENGTH)}`;
26
+ }
27
+ /**
28
+ * Genera un ID de árbol VIR determinista a partir del contenido completo.
29
+ * @param content - El árbol completo (antes de asignar el id)
30
+ */
31
+ export function generateVIRId(content) {
32
+ const serialized = JSON.stringify(content);
33
+ return `${VIR_PREFIX}${sha256(serialized).slice(0, HASH_LENGTH)}`;
34
+ }
35
+ /**
36
+ * Genera un ID de request aleatorio para trazabilidad de operaciones.
37
+ * NO es determinista — se usa para request IDs de logging, no para VIR.
38
+ */
39
+ export function generateRequestId() {
40
+ const bytes = crypto.getRandomValues(new Uint8Array(8));
41
+ return `req_${Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('')}`;
42
+ }
43
+ //# sourceMappingURL=id-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-generator.js","sourceRoot":"","sources":["../../src/utils/id-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,WAAW,GAAG,OAAO,CAAA;AAC3B,MAAM,UAAU,GAAG,MAAM,CAAA;AACzB,MAAM,WAAW,GAAG,CAAC,CAAA;AAErB,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,KAAa;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IACrD,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAA;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAA;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;AACxF,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * MUCV — Logger estructurado
3
+ * Basado en pino. Nivel configurable via LOG_LEVEL env.
4
+ */
5
+ import pino from 'pino';
6
+ export declare const logger: pino.Logger<never, boolean>;
7
+ export type Logger = typeof logger;
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAA;AAIvB,eAAO,MAAM,MAAM,6BAWjB,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * MUCV — Logger estructurado
3
+ * Basado en pino. Nivel configurable via LOG_LEVEL env.
4
+ */
5
+ import pino from 'pino';
6
+ const LOG_LEVEL = process.env['LOG_LEVEL'] ?? 'info';
7
+ export const logger = pino({
8
+ level: LOG_LEVEL,
9
+ formatters: {
10
+ level(label) {
11
+ return { level: label };
12
+ },
13
+ },
14
+ base: {
15
+ service: 'mucv',
16
+ },
17
+ timestamp: pino.stdTimeFunctions.isoTime,
18
+ });
19
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM,CAAA;AAEpD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE;QACV,KAAK,CAAC,KAAK;YACT,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QACzB,CAAC;KACF;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM;KAChB;IACD,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;CACzC,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * MUCV — Metrics Collector
3
+ * Recolecta métricas de conversión para observabilidad.
4
+ */
5
+ export interface ConversionMetric {
6
+ sourceType: string;
7
+ targetType: string;
8
+ durationMs: number;
9
+ success: boolean;
10
+ timestamp: string;
11
+ }
12
+ export interface ConversionMetrics {
13
+ totalConversions: number;
14
+ successfulConversions: number;
15
+ failedConversions: number;
16
+ averageDurationMs: number;
17
+ bySource: Record<string, number>;
18
+ byTarget: Record<string, number>;
19
+ recentConversions: ConversionMetric[];
20
+ }
21
+ export declare class MetricsCollector {
22
+ private conversions;
23
+ private readonly maxRecent;
24
+ record(sourceType: string, targetType: string, durationMs: number, success: boolean): void;
25
+ getMetrics(): ConversionMetrics;
26
+ reset(): void;
27
+ }
28
+ /** Singleton global del collector de métricas */
29
+ export declare const metrics: MetricsCollector;
30
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;CACtC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAEhC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAiB1F,UAAU,IAAI,iBAAiB;IA2B/B,KAAK,IAAI,IAAI;CAGd;AAED,iDAAiD;AACjD,eAAO,MAAM,OAAO,kBAAyB,CAAA"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * MUCV — Metrics Collector
3
+ * Recolecta métricas de conversión para observabilidad.
4
+ */
5
+ export class MetricsCollector {
6
+ conversions = [];
7
+ maxRecent = 100;
8
+ record(sourceType, targetType, durationMs, success) {
9
+ const metric = {
10
+ sourceType,
11
+ targetType,
12
+ durationMs,
13
+ success,
14
+ timestamp: new Date().toISOString(),
15
+ };
16
+ this.conversions.push(metric);
17
+ // Mantener solo las últimas N conversiones
18
+ if (this.conversions.length > this.maxRecent) {
19
+ this.conversions = this.conversions.slice(-this.maxRecent);
20
+ }
21
+ }
22
+ getMetrics() {
23
+ const total = this.conversions.length;
24
+ const successful = this.conversions.filter((c) => c.success).length;
25
+ const failed = total - successful;
26
+ const totalDuration = this.conversions.reduce((sum, c) => sum + c.durationMs, 0);
27
+ const avgDuration = total > 0 ? Math.round(totalDuration / total) : 0;
28
+ const bySource = {};
29
+ const byTarget = {};
30
+ for (const c of this.conversions) {
31
+ bySource[c.sourceType] = (bySource[c.sourceType] ?? 0) + 1;
32
+ byTarget[c.targetType] = (byTarget[c.targetType] ?? 0) + 1;
33
+ }
34
+ return {
35
+ totalConversions: total,
36
+ successfulConversions: successful,
37
+ failedConversions: failed,
38
+ averageDurationMs: avgDuration,
39
+ bySource,
40
+ byTarget,
41
+ recentConversions: this.conversions.slice(-10),
42
+ };
43
+ }
44
+ reset() {
45
+ this.conversions = [];
46
+ }
47
+ }
48
+ /** Singleton global del collector de métricas */
49
+ export const metrics = new MetricsCollector();
50
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,MAAM,OAAO,gBAAgB;IACnB,WAAW,GAAuB,EAAE,CAAA;IAC3B,SAAS,GAAG,GAAG,CAAA;IAEhC,MAAM,CAAC,UAAkB,EAAE,UAAkB,EAAE,UAAkB,EAAE,OAAgB;QACjF,MAAM,MAAM,GAAqB;YAC/B,UAAU;YACV,UAAU;YACV,UAAU;YACV,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAA;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE7B,2CAA2C;QAC3C,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAED,UAAU;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QACnE,MAAM,MAAM,GAAG,KAAK,GAAG,UAAU,CAAA;QAEjC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QAChF,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAErE,MAAM,QAAQ,GAA2B,EAAE,CAAA;QAC3C,MAAM,QAAQ,GAA2B,EAAE,CAAA;QAE3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YAC1D,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QAC5D,CAAC;QAED,OAAO;YACL,gBAAgB,EAAE,KAAK;YACvB,qBAAqB,EAAE,UAAU;YACjC,iBAAiB,EAAE,MAAM;YACzB,iBAAiB,EAAE,WAAW;YAC9B,QAAQ;YACR,QAAQ;YACR,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAA;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;IACvB,CAAC;CACF;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * MUCV — Rate Limiter
3
+ * In-memory rate limiter con ventana deslizante.
4
+ */
5
+ export interface RateLimiterConfig {
6
+ maxRequestsPerMinute: number;
7
+ }
8
+ export declare class RateLimiter {
9
+ private readonly maxRequests;
10
+ private readonly windowMs;
11
+ private timestamps;
12
+ constructor(config: RateLimiterConfig);
13
+ /**
14
+ * Verifica si se puede procesar una solicitud.
15
+ * Lanza RateLimitError si se excede el límite.
16
+ */
17
+ check(): void;
18
+ getStats(): {
19
+ current: number;
20
+ limit: number;
21
+ windowMs: number;
22
+ };
23
+ reset(): void;
24
+ }
25
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,iBAAiB;IAChC,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAe;gBAErB,MAAM,EAAE,iBAAiB;IAIrC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAiBb,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAYhE,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * MUCV — Rate Limiter
3
+ * In-memory rate limiter con ventana deslizante.
4
+ */
5
+ import { RateLimitError } from './errors.js';
6
+ export class RateLimiter {
7
+ maxRequests;
8
+ windowMs = 60_000;
9
+ timestamps = [];
10
+ constructor(config) {
11
+ this.maxRequests = config.maxRequestsPerMinute;
12
+ }
13
+ /**
14
+ * Verifica si se puede procesar una solicitud.
15
+ * Lanza RateLimitError si se excede el límite.
16
+ */
17
+ check() {
18
+ const now = Date.now();
19
+ const windowStart = now - this.windowMs;
20
+ // Limpiar timestamps fuera de la ventana
21
+ this.timestamps = this.timestamps.filter((t) => t > windowStart);
22
+ if (this.timestamps.length >= this.maxRequests) {
23
+ throw new RateLimitError(`Rate limit exceeded: ${this.maxRequests} requests per minute`, { current: this.timestamps.length, limit: this.maxRequests });
24
+ }
25
+ this.timestamps.push(now);
26
+ }
27
+ getStats() {
28
+ const now = Date.now();
29
+ const windowStart = now - this.windowMs;
30
+ this.timestamps = this.timestamps.filter((t) => t > windowStart);
31
+ return {
32
+ current: this.timestamps.length,
33
+ limit: this.maxRequests,
34
+ windowMs: this.windowMs,
35
+ };
36
+ }
37
+ reset() {
38
+ this.timestamps = [];
39
+ }
40
+ }
41
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAM5C,MAAM,OAAO,WAAW;IACL,WAAW,CAAQ;IACnB,QAAQ,GAAG,MAAM,CAAA;IAC1B,UAAU,GAAa,EAAE,CAAA;IAEjC,YAAY,MAAyB;QACnC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAA;IAChD,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;QAEvC,yCAAyC;QACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAA;QAEhE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,IAAI,cAAc,CACtB,wBAAwB,IAAI,CAAC,WAAW,sBAAsB,EAC9D,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAC7D,CAAA;QACH,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,QAAQ;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAA;QAEhE,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YAC/B,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAA;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MUCV — Validación de URLs seguras
3
+ * Bloquea protocolos peligrosos: javascript:, data:, vbscript:
4
+ */
5
+ /**
6
+ * Verifica si una URL es segura (no usa protocolos peligrosos).
7
+ * Acepta URLs absolutas (https://, http://) y relativas (/page, #anchor, ./file).
8
+ */
9
+ export declare function isUrlSafe(url: string): boolean;
10
+ /**
11
+ * Sanitiza una URL: retorna '#' si es insegura, la URL original si es segura.
12
+ */
13
+ export declare function sanitizeUrl(url: string): string;
14
+ //# sourceMappingURL=url-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-validator.d.ts","sourceRoot":"","sources":["../../src/utils/url-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAmB9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}