@mimi-ng/cli 0.2.0 → 0.3.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 +15 -1
- package/dist/registry.json +274 -14
- package/dist/templates/components/calendar/calendar-texts.ts +72 -0
- package/dist/templates/components/calendar/calendar.ts +588 -0
- package/dist/templates/components/calendar/dates.ts +181 -0
- package/dist/templates/components/calendar/index.ts +3 -0
- package/dist/templates/components/chip/chip-texts.ts +40 -0
- package/dist/templates/components/chip/chip.ts +116 -0
- package/dist/templates/components/chip/index.ts +2 -0
- package/dist/templates/components/color-picker/color-picker-texts.ts +57 -0
- package/dist/templates/components/color-picker/color-picker.ts +718 -0
- package/dist/templates/components/color-picker/color.ts +157 -0
- package/dist/templates/components/color-picker/index.ts +3 -0
- package/dist/templates/components/combobox/combobox-texts.ts +70 -0
- package/dist/templates/components/combobox/combobox.ts +798 -0
- package/dist/templates/components/combobox/index.ts +2 -0
- package/dist/templates/components/date-picker/date-picker.ts +240 -0
- package/dist/templates/components/date-picker/index.ts +3 -0
- package/dist/templates/components/date-range/date-range.ts +308 -0
- package/dist/templates/components/date-range/index.ts +1 -0
- package/dist/templates/components/file-upload/file-upload-texts.ts +77 -0
- package/dist/templates/components/file-upload/file-upload.ts +698 -0
- package/dist/templates/components/file-upload/index.ts +2 -0
- package/dist/templates/components/input-mask/index.ts +1 -0
- package/dist/templates/components/input-mask/input-mask.ts +319 -0
- package/dist/templates/components/input-otp/index.ts +1 -0
- package/dist/templates/components/input-otp/input-otp.ts +212 -0
- package/dist/templates/components/number-input/index.ts +2 -0
- package/dist/templates/components/number-input/number-input-texts.ts +46 -0
- package/dist/templates/components/number-input/number-input.ts +450 -0
- package/dist/templates/components/option-list/index.ts +11 -0
- package/dist/templates/components/option-list/option-list.ts +518 -0
- package/dist/templates/components/password/index.ts +2 -0
- package/dist/templates/components/password/password-texts.ts +68 -0
- package/dist/templates/components/password/password.ts +363 -0
- package/dist/templates/components/popover/popover.ts +12 -4
- package/dist/templates/components/progress/index.ts +1 -0
- package/dist/templates/components/progress/progress.ts +217 -0
- package/dist/templates/components/select/select.ts +3 -2
- package/dist/templates/components/slider/index.ts +2 -0
- package/dist/templates/components/slider/slider-texts.ts +26 -0
- package/dist/templates/components/slider/slider.ts +425 -0
- package/dist/templates/components/tags-input/index.ts +2 -0
- package/dist/templates/components/tags-input/tags-input-texts.ts +44 -0
- package/dist/templates/components/tags-input/tags-input.ts +303 -0
- package/dist/templates/components/toggle-group/index.ts +1 -0
- package/dist/templates/components/toggle-group/toggle-group.ts +406 -0
- package/dist/templates/theme/provider.ts +13 -0
- package/dist/templates/theme/theme-base.css +103 -0
- package/dist/templates/theme/types.ts +216 -0
- package/dist/templates/utils/overlay.ts +17 -4
- package/dist/ui/index.js +105 -1
- package/dist/ui/schema.json +56 -0
- package/dist/utils/write-files.js +12 -2
- package/package.json +1 -1
|
@@ -352,6 +352,209 @@ export interface MimiPaginationTokens {
|
|
|
352
352
|
blur?: string;
|
|
353
353
|
}
|
|
354
354
|
|
|
355
|
+
/**
|
|
356
|
+
* Toggle Group. Fondo, textos, indicador y su sombra van en el CSS (`--mimi-toggle-group-bg`,
|
|
357
|
+
* `-fg`, `-active-fg`, `-indicator`, `-indicator-shadow`).
|
|
358
|
+
*/
|
|
359
|
+
export interface MimiToggleGroupTokens {
|
|
360
|
+
/** Radio de cada ítem y del indicador (el global `radius`); el del grupo es radio + relleno. */
|
|
361
|
+
radius?: string;
|
|
362
|
+
/** Relleno del grupo (3px). */
|
|
363
|
+
padding?: string;
|
|
364
|
+
/** Separación entre ítems (2px). */
|
|
365
|
+
gap?: string;
|
|
366
|
+
/** Alto de cada ítem (32px). */
|
|
367
|
+
itemHeight?: string;
|
|
368
|
+
/** Relleno horizontal de cada ítem (12px). */
|
|
369
|
+
itemPx?: string;
|
|
370
|
+
/** Ancho mínimo de un ítem (el de uno solo con ícono, 44px). */
|
|
371
|
+
iconWidth?: string;
|
|
372
|
+
/** Tamaño de texto (13.5px). */
|
|
373
|
+
fontSize?: string;
|
|
374
|
+
/** Curva del indicador (`cubic-bezier(.3, 1.35, .5, 1)`, la de Tabs). */
|
|
375
|
+
spring?: string;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Progress. La pista y la parte llena van en el CSS (`--mimi-progress-track`, `-fill`).
|
|
380
|
+
*/
|
|
381
|
+
export interface MimiProgressTokens {
|
|
382
|
+
/** Grosor de la barra (8px). */
|
|
383
|
+
height?: string;
|
|
384
|
+
/** Tamaño del círculo `default` (76px). */
|
|
385
|
+
circleSize?: string;
|
|
386
|
+
/** Grosor del trazo del círculo `default`, en unidades del viewBox de 36 (3). */
|
|
387
|
+
circleWidth?: string | number;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Number Input. El fondo del botón en hover va en el CSS (`--mimi-number-button-hover`); el
|
|
392
|
+
* borde, el fondo y los anillos son los de Input (globales).
|
|
393
|
+
*/
|
|
394
|
+
export interface MimiNumberInputTokens {
|
|
395
|
+
/** Altura (el alto de control). */
|
|
396
|
+
height?: string;
|
|
397
|
+
/** Radio de la caja (el global `radius`). */
|
|
398
|
+
radius?: string;
|
|
399
|
+
/** Relleno horizontal de la caja (4px). */
|
|
400
|
+
px?: string;
|
|
401
|
+
/** Tamaño de los botones − y + (30px). */
|
|
402
|
+
buttonSize?: string;
|
|
403
|
+
/** Radio de los botones (el global `radius-sm`). */
|
|
404
|
+
buttonRadius?: string;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Password. El hover del botón y la pista del medidor van en el CSS
|
|
409
|
+
* (`--mimi-password-toggle-hover`, `-meter-track`); los colores de los niveles son los globales
|
|
410
|
+
* `--mimi-strength-*`.
|
|
411
|
+
*/
|
|
412
|
+
export interface MimiPasswordTokens {
|
|
413
|
+
/** Botón de mostrar u ocultar (32px). */
|
|
414
|
+
toggleSize?: string;
|
|
415
|
+
/** Radio del botón (el global `radius-sm`). */
|
|
416
|
+
toggleRadius?: string;
|
|
417
|
+
/** Alto de cada barra del medidor (6px). */
|
|
418
|
+
meterHeight?: string;
|
|
419
|
+
/** Separación entre barras (4px). */
|
|
420
|
+
meterGap?: string;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Input Mask. El color del marcador y el fondo del prefijo van en el CSS
|
|
425
|
+
* (`--mimi-mask-placeholder`, `-prefix-bg`); la caja usa los tokens de Input.
|
|
426
|
+
*/
|
|
427
|
+
export interface MimiInputMaskTokens {
|
|
428
|
+
/** Separación entre el prefijo, el ícono y el texto (8px). */
|
|
429
|
+
gap?: string;
|
|
430
|
+
/** Alto del prefijo (26px). */
|
|
431
|
+
prefixHeight?: string;
|
|
432
|
+
/** Radio del prefijo (el global `radius-sm`). */
|
|
433
|
+
prefixRadius?: string;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Input OTP. Fondo, borde, separador y cursor van en el CSS (`--mimi-otp-bg`, `-border`,
|
|
438
|
+
* `-separator`, `-caret`).
|
|
439
|
+
*/
|
|
440
|
+
export interface MimiInputOtpTokens {
|
|
441
|
+
/** Ancho de la casilla (46px). */
|
|
442
|
+
width?: string;
|
|
443
|
+
/** Alto de la casilla (54px). */
|
|
444
|
+
height?: string;
|
|
445
|
+
/** Separación entre casillas (8px). */
|
|
446
|
+
gap?: string;
|
|
447
|
+
/** Radio (el global `radius`). */
|
|
448
|
+
radius?: string;
|
|
449
|
+
/** Tamaño del carácter (22px). */
|
|
450
|
+
fontSize?: string;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/** Chip (Tags Input y Combobox). Los colores van en el CSS (`--mimi-chip-bg`, `-fg`). */
|
|
454
|
+
export interface MimiChipTokens {
|
|
455
|
+
/** Alto (26px). */
|
|
456
|
+
height?: string;
|
|
457
|
+
/** Radio (el global `badge-radius`). */
|
|
458
|
+
radius?: string;
|
|
459
|
+
/** Tamaño de texto (13px). */
|
|
460
|
+
fontSize?: string;
|
|
461
|
+
/** Botón de quitar (18px). */
|
|
462
|
+
removeSize?: string;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/** Tags Input. El borde con el límite alcanzado va en el CSS (`--mimi-tags-full-border`). */
|
|
466
|
+
export interface MimiTagsInputTokens {
|
|
467
|
+
/** Separación entre chips (6px). */
|
|
468
|
+
gap?: string;
|
|
469
|
+
/** Relleno de la caja (`5px 10px 5px 6px`). */
|
|
470
|
+
padding?: string;
|
|
471
|
+
/** Ancho mínimo del campo de texto (120px). */
|
|
472
|
+
inputMinWidth?: string;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Slider. Pista, relleno, pulgar y su sombra van en el CSS (`--mimi-slider-track`, `-fill`,
|
|
477
|
+
* `-thumb`, `-thumb-shadow`); la burbuja usa los colores de Tooltip.
|
|
478
|
+
*/
|
|
479
|
+
export interface MimiSliderTokens {
|
|
480
|
+
/** Grosor de la pista (6px). */
|
|
481
|
+
height?: string;
|
|
482
|
+
/** Tamaño del pulgar (20px). */
|
|
483
|
+
thumbSize?: string;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Combobox. El fondo y la sombra del panel y la opción activa van en el CSS
|
|
488
|
+
* (`--mimi-combobox-menu-bg`, `-menu-shadow`, `-option-hover`).
|
|
489
|
+
*/
|
|
490
|
+
export interface MimiComboboxTokens {
|
|
491
|
+
/** Alto del campo (el global `control-height`). */
|
|
492
|
+
height?: string;
|
|
493
|
+
/** Radio del campo y del panel (el global `radius`). */
|
|
494
|
+
radius?: string;
|
|
495
|
+
/** Alto máximo del panel (228px). */
|
|
496
|
+
menuMaxHeight?: string;
|
|
497
|
+
/** Alto mínimo de cada opción (34px). */
|
|
498
|
+
optionHeight?: string;
|
|
499
|
+
/** Radio de cada opción (el global `radius-sm`). */
|
|
500
|
+
optionRadius?: string;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Calendario, Date Picker y Date Range (una tabla, decidido por defecto en la G2.9). Los colores
|
|
505
|
+
* van en el CSS (`--mimi-date-cell-hover`, `-selected-bg`, `-selected-fg`, `-range`,
|
|
506
|
+
* `-today-ring`, `-menu-bg`, `-menu-shadow`).
|
|
507
|
+
*/
|
|
508
|
+
export interface MimiDateTokens {
|
|
509
|
+
/** Tamaño de cada día (36px). */
|
|
510
|
+
cellSize?: string;
|
|
511
|
+
/** Radio de cada día (el global `radius-sm`). */
|
|
512
|
+
cellRadius?: string;
|
|
513
|
+
/** Relleno del panel (12px). */
|
|
514
|
+
padding?: string;
|
|
515
|
+
/** Ancho de la columna de atajos del rango (130px). */
|
|
516
|
+
presetsWidth?: string;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* File Upload. Fondos y bordes de la zona van en el CSS (`--mimi-upload-bg`, `-border`,
|
|
521
|
+
* `-active-bg`, `-active-border`).
|
|
522
|
+
*/
|
|
523
|
+
export interface MimiFileUploadTokens {
|
|
524
|
+
/** Radio de la zona (el global `radius-card`). */
|
|
525
|
+
radius?: string;
|
|
526
|
+
/** Alto mínimo de la zona (176px). */
|
|
527
|
+
height?: string;
|
|
528
|
+
/** Círculo del ícono (44px). */
|
|
529
|
+
iconSize?: string;
|
|
530
|
+
/** Radio de cada fila (el global `radius`). */
|
|
531
|
+
itemRadius?: string;
|
|
532
|
+
/** Miniatura de cada fila (44px). */
|
|
533
|
+
thumbSize?: string;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Color Picker. Fondo, sombra, el borde y la sombra de los pulgares y el borde de las muestras
|
|
538
|
+
* van en el CSS (`--mimi-color-picker-bg`, `-shadow`, `-thumb-border`, `-thumb-shadow`,
|
|
539
|
+
* `-swatch-border`).
|
|
540
|
+
*/
|
|
541
|
+
export interface MimiColorPickerTokens {
|
|
542
|
+
/** Radio del panel (el global `radius`). */
|
|
543
|
+
radius?: string;
|
|
544
|
+
/** Ancho del panel (280px). */
|
|
545
|
+
width?: string;
|
|
546
|
+
/** Relleno y separación (12px). */
|
|
547
|
+
padding?: string;
|
|
548
|
+
/** Alto del área de saturación (150px). */
|
|
549
|
+
areaHeight?: string;
|
|
550
|
+
/** Radio del área (el global `radius-sm`). */
|
|
551
|
+
areaRadius?: string;
|
|
552
|
+
/** Alto de la barra de tono (12px). */
|
|
553
|
+
hueHeight?: string;
|
|
554
|
+
/** Separación de las muestras (6px). */
|
|
555
|
+
swatchGap?: string;
|
|
556
|
+
}
|
|
557
|
+
|
|
355
558
|
/**
|
|
356
559
|
* Tokens por componente (spec 13). Solo los que no dependen del modo: los colores de los
|
|
357
560
|
* componentes (`--mimi-<prefijo>-bg`, `-fg`, `-border`…) se cambian en el CSS (spec 6.2).
|
|
@@ -378,6 +581,19 @@ export interface MimiComponentTokens {
|
|
|
378
581
|
tabs?: MimiTabsTokens;
|
|
379
582
|
toolbar?: MimiToolbarTokens;
|
|
380
583
|
pagination?: MimiPaginationTokens;
|
|
584
|
+
toggleGroup?: MimiToggleGroupTokens;
|
|
585
|
+
progress?: MimiProgressTokens;
|
|
586
|
+
numberInput?: MimiNumberInputTokens;
|
|
587
|
+
password?: MimiPasswordTokens;
|
|
588
|
+
inputMask?: MimiInputMaskTokens;
|
|
589
|
+
inputOtp?: MimiInputOtpTokens;
|
|
590
|
+
chip?: MimiChipTokens;
|
|
591
|
+
tagsInput?: MimiTagsInputTokens;
|
|
592
|
+
slider?: MimiSliderTokens;
|
|
593
|
+
combobox?: MimiComboboxTokens;
|
|
594
|
+
date?: MimiDateTokens;
|
|
595
|
+
fileUpload?: MimiFileUploadTokens;
|
|
596
|
+
colorPicker?: MimiColorPickerTokens;
|
|
381
597
|
}
|
|
382
598
|
|
|
383
599
|
export interface MimiThemePreset {
|
|
@@ -36,9 +36,21 @@ function connectedPosition(
|
|
|
36
36
|
: { originX: 'start', originY: y, overlayX: 'end', overlayY: y, offsetX: -offset };
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/** Las otras alineaciones, en orden de preferencia (la opuesta antes que el centro). */
|
|
40
|
+
const FALLBACK_ALIGNS: Record<MimiOverlayAlign, MimiOverlayAlign[]> = {
|
|
41
|
+
start: ['end', 'center'],
|
|
42
|
+
end: ['start', 'center'],
|
|
43
|
+
center: ['start', 'end'],
|
|
44
|
+
};
|
|
45
|
+
|
|
39
46
|
/**
|
|
40
|
-
* Posiciones para el CDK, en orden de preferencia: el lado
|
|
41
|
-
* opuesto y, por último, los otros dos lados
|
|
47
|
+
* Posiciones para el CDK, en orden de preferencia: el lado pedido con la alineación pedida y
|
|
48
|
+
* después con las otras dos; el lado opuesto, igual; y, por último, los otros dos lados
|
|
49
|
+
* centrados. `offset` es la separación con el trigger.
|
|
50
|
+
*
|
|
51
|
+
* Las otras alineaciones del mismo lado (5.17a) evitan que en una pantalla chica el panel se
|
|
52
|
+
* salga por un costado: en 360px, un menú de 240px alineado al inicio de un trigger cercano al
|
|
53
|
+
* borde derecho no cabía en ninguna de las cuatro posiciones de antes y el CDK lo dejaba fuera.
|
|
42
54
|
*/
|
|
43
55
|
export function mimiConnectedPositions(
|
|
44
56
|
side: MimiOverlaySide,
|
|
@@ -47,9 +59,10 @@ export function mimiConnectedPositions(
|
|
|
47
59
|
): ConnectedPosition[] {
|
|
48
60
|
const others: MimiOverlaySide[] =
|
|
49
61
|
side === 'top' || side === 'bottom' ? ['right', 'left'] : ['bottom', 'top'];
|
|
62
|
+
const aligns = [align, ...FALLBACK_ALIGNS[align]];
|
|
50
63
|
return [
|
|
51
|
-
connectedPosition(side,
|
|
52
|
-
connectedPosition(OPPOSITE[side],
|
|
64
|
+
...aligns.map((a) => connectedPosition(side, a, offset)),
|
|
65
|
+
...aligns.map((a) => connectedPosition(OPPOSITE[side], a, offset)),
|
|
53
66
|
...others.map((other) => connectedPosition(other, 'center', offset)),
|
|
54
67
|
];
|
|
55
68
|
}
|
package/dist/ui/index.js
CHANGED
|
@@ -103,7 +103,104 @@ function inspect(tree, options) {
|
|
|
103
103
|
}
|
|
104
104
|
const implicit = [...new Set(items_1.INIT_ITEMS.flatMap((item) => (0, registry_1.resolveItems)(item)))].filter((item) => !items.includes(item));
|
|
105
105
|
const componentsDir = (0, paths_1.normalizePath)(config.aliases?.components ?? 'src/app/components/ui');
|
|
106
|
-
|
|
106
|
+
const outdated = outdatedPeers(tree, items, installed, newPackages);
|
|
107
|
+
const updatable = PEERS_WITH_MINIMUM.filter((name) => installed[name] || newPackages[name]);
|
|
108
|
+
return { componentsDir, config, items, implicit, newPackages, outdated, updatable };
|
|
109
|
+
}
|
|
110
|
+
// ── Versiones mínimas de cdk y aria (M.4) ─────────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Paquetes cuya versión mínima se vigila. La CLI no los cambia si el proyecto ya los tiene (se
|
|
113
|
+
* actualizan con `ng update`, junto con el resto de Angular), pero avisa si quedan por debajo de
|
|
114
|
+
* lo que pide el registro: con aria y cdk 22.2.3, Combobox y Select lanzan NG0950 (spec 4,
|
|
115
|
+
* «#33974»).
|
|
116
|
+
*/
|
|
117
|
+
const PEERS_WITH_MINIMUM = ['@angular/cdk', '@angular/aria'];
|
|
118
|
+
const RANGE = /^\s*(\^|~|>=|=)?\s*v?(\d+)\.(\d+)\.(\d+)\s*$/;
|
|
119
|
+
function parseRange(range) {
|
|
120
|
+
const match = RANGE.exec(range);
|
|
121
|
+
if (!match)
|
|
122
|
+
return null;
|
|
123
|
+
return { op: match[1] ?? '=', version: [+match[2], +match[3], +match[4]] };
|
|
124
|
+
}
|
|
125
|
+
function compare(a, b) {
|
|
126
|
+
return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Si un rango puede instalar `required` o una posterior. Lo que no se entiende (`*`, `latest`,
|
|
130
|
+
* `22.2.x`, `workspace:`…) cuenta como que sí: el aviso no da falsas alarmas.
|
|
131
|
+
*/
|
|
132
|
+
function canReach(range, required) {
|
|
133
|
+
const parsed = parseRange(range);
|
|
134
|
+
if (!parsed)
|
|
135
|
+
return true;
|
|
136
|
+
if (parsed.op === '>=' || compare(parsed.version, required) >= 0)
|
|
137
|
+
return true;
|
|
138
|
+
// Por debajo del mínimo: llega solo si el tope del rango (exclusivo) queda por encima.
|
|
139
|
+
const [major, minor, patch] = parsed.version;
|
|
140
|
+
const upper = parsed.op === '^'
|
|
141
|
+
? major > 0
|
|
142
|
+
? [major + 1, 0, 0]
|
|
143
|
+
: minor > 0
|
|
144
|
+
? [0, minor + 1, 0]
|
|
145
|
+
: [0, 0, patch + 1]
|
|
146
|
+
: parsed.op === '~'
|
|
147
|
+
? [major, minor + 1, 0]
|
|
148
|
+
: null;
|
|
149
|
+
return upper !== null && compare(required, upper) < 0;
|
|
150
|
+
}
|
|
151
|
+
/** El mínimo que piden los ítems para cada paquete vigilado (aria implica el mismo cdk). */
|
|
152
|
+
function requiredMinimums(items) {
|
|
153
|
+
const minimums = new Map();
|
|
154
|
+
for (const item of items) {
|
|
155
|
+
const { dependencies = {}, peerDependencies = {} } = registry_1.registry.items[item];
|
|
156
|
+
for (const [name, range] of Object.entries({ ...dependencies, ...peerDependencies })) {
|
|
157
|
+
if (!PEERS_WITH_MINIMUM.includes(name))
|
|
158
|
+
continue;
|
|
159
|
+
const version = parseRange(range)?.version;
|
|
160
|
+
if (!version)
|
|
161
|
+
continue;
|
|
162
|
+
const names = name === '@angular/aria' ? [name, '@angular/cdk'] : [name];
|
|
163
|
+
for (const target of names) {
|
|
164
|
+
const known = minimums.get(target);
|
|
165
|
+
if (!known || compare(version, known) > 0)
|
|
166
|
+
minimums.set(target, version);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return minimums;
|
|
171
|
+
}
|
|
172
|
+
function outdatedPeers(tree, items, installed, newPackages) {
|
|
173
|
+
const outdated = [];
|
|
174
|
+
for (const [name, required] of requiredMinimums(items)) {
|
|
175
|
+
const declared = installed[name] ?? newPackages[name];
|
|
176
|
+
if (!declared)
|
|
177
|
+
continue;
|
|
178
|
+
// Si ya está instalado, manda la versión de node_modules (la que corre de verdad).
|
|
179
|
+
const onDisk = installed[name] ? installedVersion(tree, name) : null;
|
|
180
|
+
const version = onDisk ? parseRange(onDisk)?.version : null;
|
|
181
|
+
const ok = version ? compare(version, required) >= 0 : canReach(declared, required);
|
|
182
|
+
if (!ok) {
|
|
183
|
+
outdated.push({
|
|
184
|
+
name,
|
|
185
|
+
current: onDisk ?? declared,
|
|
186
|
+
source: onDisk ? 'installed' : installed[name] ? 'declared' : 'added',
|
|
187
|
+
required: required.join('.'),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return outdated.sort((a, b) => a.name.localeCompare(b.name));
|
|
192
|
+
}
|
|
193
|
+
const SOURCE_TEXT = {
|
|
194
|
+
installed: (current) => `${current} instalada`,
|
|
195
|
+
declared: (current) => `"${current}" en package.json`,
|
|
196
|
+
added: (current) => `"${current}", que se agrega ahora`,
|
|
197
|
+
};
|
|
198
|
+
function installedVersion(tree, name) {
|
|
199
|
+
const file = tree.read(`node_modules/${name}/package.json`);
|
|
200
|
+
if (!file)
|
|
201
|
+
return null;
|
|
202
|
+
const { version } = JSON.parse(file.toString('utf-8'));
|
|
203
|
+
return version ?? null;
|
|
107
204
|
}
|
|
108
205
|
/**
|
|
109
206
|
* @angular/aria pide como peer la versión exacta de @angular/cdk (22.1.7 → cdk 22.1.7). Si el cdk
|
|
@@ -236,6 +333,13 @@ function summary(plan, report) {
|
|
|
236
333
|
for (const [name, version] of packages)
|
|
237
334
|
log.info(` ${name}@${version}`);
|
|
238
335
|
}
|
|
336
|
+
if (plan.outdated.length > 0) {
|
|
337
|
+
const required = [...new Set(plan.outdated.map((peer) => peer.required))].join(', ');
|
|
338
|
+
const lines = plan.outdated.map((peer) => ` ${peer.name}: ${SOURCE_TEXT[peer.source](peer.current)}`);
|
|
339
|
+
log.warn(`Mimi necesita @angular/cdk y @angular/aria ${required} o posterior (las anteriores ` +
|
|
340
|
+
`tienen errores conocidos con sus componentes) y tu proyecto tiene:\n${lines.join('\n')}\n` +
|
|
341
|
+
`Actualízalos con:\n ng update ${plan.updatable.join(' ')}`);
|
|
342
|
+
}
|
|
239
343
|
if ((0, write_files_1.hasFileChanges)(report)) {
|
|
240
344
|
log.info(`Guarda la carpeta ${write_files_1.BASE_DIR.split('/')[0]}/ en git: Mimi la usa para actualizar tus ` +
|
|
241
345
|
'componentes sin perder tus cambios.');
|
package/dist/ui/schema.json
CHANGED
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
"value": "button",
|
|
32
32
|
"label": "button"
|
|
33
33
|
},
|
|
34
|
+
{
|
|
35
|
+
"value": "calendar",
|
|
36
|
+
"label": "calendar"
|
|
37
|
+
},
|
|
34
38
|
{
|
|
35
39
|
"value": "card",
|
|
36
40
|
"label": "card"
|
|
@@ -39,6 +43,14 @@
|
|
|
39
43
|
"value": "checkbox",
|
|
40
44
|
"label": "checkbox"
|
|
41
45
|
},
|
|
46
|
+
{
|
|
47
|
+
"value": "color-picker",
|
|
48
|
+
"label": "color-picker"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"value": "combobox",
|
|
52
|
+
"label": "combobox"
|
|
53
|
+
},
|
|
42
54
|
{
|
|
43
55
|
"value": "confirm",
|
|
44
56
|
"label": "confirm"
|
|
@@ -47,6 +59,14 @@
|
|
|
47
59
|
"value": "context-menu",
|
|
48
60
|
"label": "context-menu"
|
|
49
61
|
},
|
|
62
|
+
{
|
|
63
|
+
"value": "date-picker",
|
|
64
|
+
"label": "date-picker"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"value": "date-range",
|
|
68
|
+
"label": "date-range"
|
|
69
|
+
},
|
|
50
70
|
{
|
|
51
71
|
"value": "dialog",
|
|
52
72
|
"label": "dialog"
|
|
@@ -55,6 +75,10 @@
|
|
|
55
75
|
"value": "dropdown-menu",
|
|
56
76
|
"label": "dropdown-menu"
|
|
57
77
|
},
|
|
78
|
+
{
|
|
79
|
+
"value": "file-upload",
|
|
80
|
+
"label": "file-upload"
|
|
81
|
+
},
|
|
58
82
|
{
|
|
59
83
|
"value": "form-field",
|
|
60
84
|
"label": "form-field"
|
|
@@ -63,14 +87,34 @@
|
|
|
63
87
|
"value": "input",
|
|
64
88
|
"label": "input"
|
|
65
89
|
},
|
|
90
|
+
{
|
|
91
|
+
"value": "input-mask",
|
|
92
|
+
"label": "input-mask"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"value": "input-otp",
|
|
96
|
+
"label": "input-otp"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"value": "number-input",
|
|
100
|
+
"label": "number-input"
|
|
101
|
+
},
|
|
66
102
|
{
|
|
67
103
|
"value": "pagination",
|
|
68
104
|
"label": "pagination"
|
|
69
105
|
},
|
|
106
|
+
{
|
|
107
|
+
"value": "password",
|
|
108
|
+
"label": "password"
|
|
109
|
+
},
|
|
70
110
|
{
|
|
71
111
|
"value": "popover",
|
|
72
112
|
"label": "popover"
|
|
73
113
|
},
|
|
114
|
+
{
|
|
115
|
+
"value": "progress",
|
|
116
|
+
"label": "progress"
|
|
117
|
+
},
|
|
74
118
|
{
|
|
75
119
|
"value": "select",
|
|
76
120
|
"label": "select"
|
|
@@ -83,6 +127,10 @@
|
|
|
83
127
|
"value": "skeleton",
|
|
84
128
|
"label": "skeleton"
|
|
85
129
|
},
|
|
130
|
+
{
|
|
131
|
+
"value": "slider",
|
|
132
|
+
"label": "slider"
|
|
133
|
+
},
|
|
86
134
|
{
|
|
87
135
|
"value": "switch",
|
|
88
136
|
"label": "switch"
|
|
@@ -91,6 +139,10 @@
|
|
|
91
139
|
"value": "tabs",
|
|
92
140
|
"label": "tabs"
|
|
93
141
|
},
|
|
142
|
+
{
|
|
143
|
+
"value": "tags-input",
|
|
144
|
+
"label": "tags-input"
|
|
145
|
+
},
|
|
94
146
|
{
|
|
95
147
|
"value": "textarea",
|
|
96
148
|
"label": "textarea"
|
|
@@ -99,6 +151,10 @@
|
|
|
99
151
|
"value": "toast",
|
|
100
152
|
"label": "toast"
|
|
101
153
|
},
|
|
154
|
+
{
|
|
155
|
+
"value": "toggle-group",
|
|
156
|
+
"label": "toggle-group"
|
|
157
|
+
},
|
|
102
158
|
{
|
|
103
159
|
"value": "toolbar",
|
|
104
160
|
"label": "toolbar"
|
|
@@ -61,7 +61,8 @@ function readManifest(tree) {
|
|
|
61
61
|
* - si no, se crean los que faltan y se actualizan los que el usuario no tocó. Los modificados
|
|
62
62
|
* sobre esta versión se conservan (`skipped`).
|
|
63
63
|
*
|
|
64
|
-
* Con `overwrite`, todo se reemplaza y nada se bloquea
|
|
64
|
+
* Con `overwrite`, todo se reemplaza y nada se bloquea, también un archivo igual a su base de la
|
|
65
|
+
* misma versión (`formatted`; M.11). Los ítems `implicit` (el tema y lo que
|
|
65
66
|
* copia init, que `ng g mimi` revisa aunque no se pidan) solo se escriben si hay que
|
|
66
67
|
* actualizarlos: un cambio del usuario sobre la versión actual se respeta en silencio, también
|
|
67
68
|
* con `overwrite`, y no bloquean a otros ítems.
|
|
@@ -172,7 +173,16 @@ function writeTemplates(options) {
|
|
|
172
173
|
writeBase(file, content);
|
|
173
174
|
break;
|
|
174
175
|
case 'formatted':
|
|
175
|
-
|
|
176
|
+
// Con --overwrite se reemplaza siempre, también con la misma versión (M.11): sin él,
|
|
177
|
+
// un archivo distinto de la plantilla con la misma versión no se podía reponer.
|
|
178
|
+
if (options.overwrite && !implicit.has(item)) {
|
|
179
|
+
tree.overwrite(target, content);
|
|
180
|
+
options.report.overwritten.push(file);
|
|
181
|
+
writeBase(file, content);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
options.report.unchanged.push(file);
|
|
185
|
+
}
|
|
176
186
|
break;
|
|
177
187
|
case 'old':
|
|
178
188
|
tree.overwrite(target, content);
|
package/package.json
CHANGED