@spartan-ng/cli 1.8.3-beta.2 → 1.9.0-beta.1

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 (26) hide show
  1. package/generators.json +10 -0
  2. package/package.json +1 -1
  3. package/src/generators/healthcheck/generator.js +2 -0
  4. package/src/generators/healthcheck/generator.js.map +1 -1
  5. package/src/generators/healthcheck/healthchecks/brn-input-otp-max-length-rename.js +2 -2
  6. package/src/generators/healthcheck/healthchecks/brn-input-otp-max-length-rename.js.map +1 -1
  7. package/src/generators/healthcheck/healthchecks/hlm-input-otp.d.ts +2 -0
  8. package/src/generators/healthcheck/healthchecks/hlm-input-otp.js +48 -0
  9. package/src/generators/healthcheck/healthchecks/hlm-input-otp.js.map +1 -0
  10. package/src/generators/migrate-brn-input-otp-max-length/generator.js +1 -1
  11. package/src/generators/migrate-brn-input-otp-max-length/generator.js.map +1 -1
  12. package/src/generators/migrate-input-otp/compat.d.ts +2 -0
  13. package/src/generators/migrate-input-otp/compat.js +6 -0
  14. package/src/generators/migrate-input-otp/compat.js.map +1 -0
  15. package/src/generators/migrate-input-otp/generator.d.ts +4 -0
  16. package/src/generators/migrate-input-otp/generator.js +281 -0
  17. package/src/generators/migrate-input-otp/generator.js.map +1 -0
  18. package/src/generators/migrate-input-otp/schema.d.ts +3 -0
  19. package/src/generators/migrate-input-otp/schema.json +14 -0
  20. package/src/generators/migrate-input-otp/utils.d.ts +35 -0
  21. package/src/generators/migrate-input-otp/utils.js +265 -0
  22. package/src/generators/migrate-input-otp/utils.js.map +1 -0
  23. package/src/generators/ui/libs/avatar/files/lib/hlm-avatar-image.ts.template +1 -1
  24. package/src/generators/ui/libs/avatar/files/lib/hlm-avatar.ts.template +5 -14
  25. package/src/generators/ui/libs/input-otp/files/lib/hlm-input-otp.ts.template +50 -4
  26. package/src/generators/ui/supported-ui-libraries.json +46 -44
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findInputOtpElements = findInputOtpElements;
4
+ exports.findOpeningTags = findOpeningTags;
5
+ exports.parseAttributes = parseAttributes;
6
+ exports.attributeName = attributeName;
7
+ exports.serializeAttributes = serializeAttributes;
8
+ exports.isHelmAttribute = isHelmAttribute;
9
+ exports.hasHelmAttribute = hasHelmAttribute;
10
+ exports.hasContainerStyles = hasContainerStyles;
11
+ exports.splitInputAttributes = splitInputAttributes;
12
+ exports.renameAttribute = renameAttribute;
13
+ exports.addAttributesToExistingInput = addAttributesToExistingInput;
14
+ exports.hasInputOtpInputDirective = hasInputOtpInputDirective;
15
+ const INPUT_OTP_TAG = 'brn-input-otp';
16
+ const INPUT_OTP_CLOSE_TAG = `</${INPUT_OTP_TAG}>`;
17
+ function findInputOtpElements(content) {
18
+ const elements = [];
19
+ let index = 0;
20
+ while (index < content.length) {
21
+ const openStart = content.indexOf(`<${INPUT_OTP_TAG}`, index);
22
+ if (openStart === -1) {
23
+ break;
24
+ }
25
+ const nameEnd = openStart + INPUT_OTP_TAG.length + 1;
26
+ const nextChar = content[nameEnd];
27
+ if (nextChar && /[\w-]/.test(nextChar)) {
28
+ index = nameEnd;
29
+ continue;
30
+ }
31
+ const openTagEnd = findTagEnd(content, nameEnd);
32
+ if (openTagEnd === -1) {
33
+ break;
34
+ }
35
+ const rawAttrs = content.slice(nameEnd, openTagEnd - 1);
36
+ const selfClosing = /\/\s*$/.test(rawAttrs);
37
+ const attrs = selfClosing ? rawAttrs.replace(/\/\s*$/, '') : rawAttrs;
38
+ if (selfClosing) {
39
+ elements.push({
40
+ start: openStart,
41
+ end: openTagEnd,
42
+ openTagEnd,
43
+ closeTagStart: null,
44
+ attrs,
45
+ inner: '',
46
+ selfClosing: true,
47
+ });
48
+ index = openTagEnd;
49
+ continue;
50
+ }
51
+ const closeTagStart = content.indexOf(INPUT_OTP_CLOSE_TAG, openTagEnd);
52
+ if (closeTagStart === -1) {
53
+ index = openTagEnd;
54
+ continue;
55
+ }
56
+ const closeTagEnd = closeTagStart + INPUT_OTP_CLOSE_TAG.length;
57
+ elements.push({
58
+ start: openStart,
59
+ end: closeTagEnd,
60
+ openTagEnd,
61
+ closeTagStart,
62
+ attrs,
63
+ inner: content.slice(openTagEnd, closeTagStart),
64
+ selfClosing: false,
65
+ });
66
+ index = closeTagEnd;
67
+ }
68
+ return elements;
69
+ }
70
+ function findOpeningTags(content, tagName) {
71
+ const tags = [];
72
+ const prefix = `<${tagName}`;
73
+ let index = 0;
74
+ while (index < content.length) {
75
+ const tagStart = content.indexOf(prefix, index);
76
+ if (tagStart === -1) {
77
+ break;
78
+ }
79
+ const nameEnd = tagStart + prefix.length;
80
+ const nextChar = content[nameEnd];
81
+ if (nextChar && /[\w-]/.test(nextChar)) {
82
+ index = nameEnd;
83
+ continue;
84
+ }
85
+ const tagEnd = findTagEnd(content, nameEnd);
86
+ if (tagEnd === -1) {
87
+ break;
88
+ }
89
+ const rawAttrs = content.slice(nameEnd, tagEnd - 1);
90
+ const selfClosing = /\/\s*$/.test(rawAttrs);
91
+ tags.push({
92
+ start: tagStart,
93
+ end: tagEnd,
94
+ attrs: selfClosing ? rawAttrs.replace(/\/\s*$/, '') : rawAttrs,
95
+ selfClosing,
96
+ });
97
+ index = tagEnd;
98
+ }
99
+ return tags;
100
+ }
101
+ function parseAttributes(attrs) {
102
+ const attributes = [];
103
+ let index = 0;
104
+ while (index < attrs.length) {
105
+ while (index < attrs.length && /\s/.test(attrs[index])) {
106
+ index++;
107
+ }
108
+ if (index >= attrs.length) {
109
+ break;
110
+ }
111
+ const start = index;
112
+ while (index < attrs.length && !/[\s=]/.test(attrs[index])) {
113
+ index++;
114
+ }
115
+ const name = attrs.slice(start, index);
116
+ if (!name) {
117
+ break;
118
+ }
119
+ while (index < attrs.length && /\s/.test(attrs[index])) {
120
+ index++;
121
+ }
122
+ let value = null;
123
+ if (attrs[index] === '=') {
124
+ index++;
125
+ while (index < attrs.length && /\s/.test(attrs[index])) {
126
+ index++;
127
+ }
128
+ if (attrs[index] === '"' || attrs[index] === "'") {
129
+ const quote = attrs[index];
130
+ index++;
131
+ const valueStart = index;
132
+ while (index < attrs.length && attrs[index] !== quote) {
133
+ index++;
134
+ }
135
+ value = attrs.slice(valueStart, index);
136
+ if (attrs[index] === quote) {
137
+ index++;
138
+ }
139
+ }
140
+ else {
141
+ const valueStart = index;
142
+ while (index < attrs.length && !/\s/.test(attrs[index])) {
143
+ index++;
144
+ }
145
+ value = attrs.slice(valueStart, index);
146
+ }
147
+ }
148
+ attributes.push({
149
+ name,
150
+ raw: attrs.slice(start, index),
151
+ value,
152
+ });
153
+ }
154
+ return attributes;
155
+ }
156
+ function attributeName(attribute) {
157
+ return attribute.name.replace(/^\[\(?/, '').replace(/\)?\]$/, '');
158
+ }
159
+ function serializeAttributes(attributes) {
160
+ return attributes.length ? ` ${attributes.map((attribute) => attribute.raw).join(' ')}` : '';
161
+ }
162
+ function isHelmAttribute(attribute) {
163
+ const name = attributeName(attribute);
164
+ return name === 'hlmInputOtp' || name === 'hlm';
165
+ }
166
+ function hasHelmAttribute(attributes) {
167
+ return attributes.some(isHelmAttribute);
168
+ }
169
+ function hasContainerStyles(attributes) {
170
+ return attributes.some((attribute) => attributeName(attribute) === 'containerStyles');
171
+ }
172
+ const INPUT_ATTRIBUTE_RENAMES = {
173
+ inputClass: 'class',
174
+ inputAutocomplete: 'autocomplete',
175
+ };
176
+ function splitInputAttributes(attributes) {
177
+ const rootAttrs = [];
178
+ const inputAttrs = [];
179
+ for (const attribute of attributes) {
180
+ const name = attributeName(attribute);
181
+ const renamed = INPUT_ATTRIBUTE_RENAMES[name];
182
+ if (renamed) {
183
+ inputAttrs.push(renameAttribute(attribute, name, renamed));
184
+ continue;
185
+ }
186
+ if (name === 'inputStyles' || name === 'inputMode') {
187
+ inputAttrs.push(attribute);
188
+ continue;
189
+ }
190
+ rootAttrs.push(attribute);
191
+ }
192
+ return { rootAttrs, inputAttrs };
193
+ }
194
+ function renameAttribute(attribute, from, to) {
195
+ const name = attribute.name.replace(from, to);
196
+ return {
197
+ ...attribute,
198
+ name,
199
+ raw: attribute.raw.replace(attribute.name, name),
200
+ };
201
+ }
202
+ function addAttributesToExistingInput(content, inputAttrs) {
203
+ if (inputAttrs.length === 0) {
204
+ return content;
205
+ }
206
+ for (const tag of findOpeningTags(content, 'input')) {
207
+ const attrs = parseAttributes(tag.attrs);
208
+ if (!attrs.some((attribute) => attributeName(attribute) === 'brnInputOtpInput')) {
209
+ continue;
210
+ }
211
+ const merged = mergeAttributes(attrs, inputAttrs);
212
+ const replacement = `<input${serializeAttributes(merged)} />`;
213
+ return content.slice(0, tag.start) + replacement + content.slice(tag.end);
214
+ }
215
+ return content;
216
+ }
217
+ function hasInputOtpInputDirective(content) {
218
+ return findOpeningTags(content, 'input').some((tag) => parseAttributes(tag.attrs).some((attribute) => attributeName(attribute) === 'brnInputOtpInput'));
219
+ }
220
+ function mergeAttributes(existing, added) {
221
+ const merged = [...existing];
222
+ const isClassBindingPair = (current, incoming) => (current.name === 'class' && incoming.name === '[class]') ||
223
+ (current.name === '[class]' && incoming.name === 'class');
224
+ for (const attribute of added) {
225
+ const name = attributeName(attribute);
226
+ const index = merged.findIndex((current) => attributeName(current) === name && !isClassBindingPair(current, attribute));
227
+ if (index === -1) {
228
+ merged.push(attribute);
229
+ continue;
230
+ }
231
+ if (name === 'class' && !attribute.name.startsWith('[') && !merged[index].name.startsWith('[')) {
232
+ const values = [merged[index].value, attribute.value]
233
+ .filter((value) => !!value)
234
+ .join(' ')
235
+ .split(/\s+/)
236
+ .filter(Boolean);
237
+ const value = Array.from(new Set(values)).join(' ');
238
+ merged[index] = { name: 'class', raw: `class="${value}"`, value };
239
+ continue;
240
+ }
241
+ merged[index] = attribute;
242
+ }
243
+ return merged;
244
+ }
245
+ function findTagEnd(content, from) {
246
+ let quote = null;
247
+ for (let index = from; index < content.length; index++) {
248
+ const char = content[index];
249
+ if (quote) {
250
+ if (char === quote) {
251
+ quote = null;
252
+ }
253
+ continue;
254
+ }
255
+ if (char === '"' || char === "'") {
256
+ quote = char;
257
+ continue;
258
+ }
259
+ if (char === '>') {
260
+ return index + 1;
261
+ }
262
+ }
263
+ return -1;
264
+ }
265
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/generators/migrate-input-otp/utils.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { classes } from '<%- importAlias %>/utils';
5
5
  @Directive({
6
6
  selector: 'img[hlmAvatarImage]',
7
7
  exportAs: 'hlmAvatarImage',
8
- hostDirectives: [BrnAvatarImage],
8
+ hostDirectives: [{ directive: BrnAvatarImage, inputs: ['hostStyles'] }],
9
9
  host: {
10
10
  'data-slot': 'avatar-image',
11
11
  },
@@ -1,29 +1,20 @@
1
- import { ChangeDetectionStrategy, Component, input } from '@angular/core';
1
+ import { Directive, input } from '@angular/core';
2
2
  import { BrnAvatar } from '@spartan-ng/brain/avatar';
3
3
  import { classes } from '<%- importAlias %>/utils';
4
4
 
5
- @Component({
6
- selector: 'hlm-avatar',
5
+ @Directive({
6
+ selector: '[hlmAvatar],hlm-avatar',
7
7
  exportAs: 'hlmAvatar',
8
- changeDetection: ChangeDetectionStrategy.OnPush,
8
+ hostDirectives: [BrnAvatar],
9
9
  host: {
10
10
  'data-slot': 'avatar',
11
11
  '[attr.data-size]': 'size()',
12
12
  },
13
- template: `
14
- @if (_image()?.canShow()) {
15
- <ng-content select="[hlmAvatarImage],[brnAvatarImage]" />
16
- } @else {
17
- <ng-content select="[hlmAvatarFallback],[brnAvatarFallback]" />
18
- }
19
- <ng-content />
20
- `,
21
13
  })
22
- export class HlmAvatar extends BrnAvatar {
14
+ export class HlmAvatar {
23
15
  public readonly size = input<'default' | 'sm' | 'lg'>('default');
24
16
 
25
17
  constructor() {
26
- super();
27
18
  classes(
28
19
  () =>
29
20
  'spartan-avatar group/avatar after:border-border relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten',
@@ -1,12 +1,58 @@
1
- import { Directive } from '@angular/core';
2
- import { classes } from '<%- importAlias %>/utils';
1
+ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
+ import { BrnInputOtp, BrnInputOtpInput, type InputMode } from '@spartan-ng/brain/input-otp';
3
+ import { classes, hlm } from '<%- importAlias %>/utils';
4
+ import type { ClassValue } from 'clsx';
3
5
 
4
- @Directive({
5
- selector: 'brn-input-otp[hlmInputOtp], brn-input-otp[hlm]',
6
+ @Component({
7
+ selector: 'hlm-input-otp',
6
8
  exportAs: 'hlmInputOtp',
9
+ imports: [BrnInputOtpInput],
10
+ changeDetection: ChangeDetectionStrategy.OnPush,
11
+ hostDirectives: [
12
+ {
13
+ directive: BrnInputOtp,
14
+ inputs: [
15
+ 'length',
16
+ 'value',
17
+ 'disabled',
18
+ 'inputId',
19
+ 'hostStyles',
20
+ 'autofocus',
21
+ 'transformPaste',
22
+ 'mask',
23
+ 'maskChar',
24
+ 'slotPattern',
25
+ ],
26
+ outputs: ['valueChange', 'completed'],
27
+ },
28
+ ],
7
29
  host: { 'data-slot': 'input-otp' },
30
+ template: `
31
+ <ng-content />
32
+ <input
33
+ brnInputOtpInput
34
+ [autocomplete]="inputAutocomplete()"
35
+ [inputMode]="inputMode()"
36
+ [class]="_inputClass()"
37
+ [inputStyles]="inputStyles()"
38
+ />
39
+ `,
8
40
  })
9
41
  export class HlmInputOtp {
42
+ /** Custom autocomplete attribute applied to the input element */
43
+ public readonly inputAutocomplete = input<'one-time-code' | 'off'>('one-time-code');
44
+
45
+ /** Virtual keyboard appearance on mobile */
46
+ public readonly inputMode = input<InputMode>('numeric');
47
+
48
+ /** Classes applied to the input element. */
49
+ public readonly inputClass = input<ClassValue>('');
50
+
51
+ /** Overrides the default styles applied to the input element. */
52
+ public readonly inputStyles = input<string | undefined>(undefined);
53
+
54
+ protected readonly _inputClass = computed(() => hlm('disabled:cursor-not-allowed', this.inputClass()));
55
+
10
56
  constructor() {
11
57
  classes(() => 'spartan-input-otp flex items-center has-disabled:opacity-50');
12
58
  }