ngx-opalbytes-components 1.20.0 → 1.22.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 +75 -0
- package/cli/cao-comp.cjs +272 -2
- package/fesm2022/ngx-opalbytes-components.mjs +291 -19
- package/fesm2022/ngx-opalbytes-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/shared/components/autocomplete/autocomplete.stories.ts +133 -0
- package/src/lib/shared/components/base-button/base-button.stories.ts +102 -0
- package/src/lib/shared/components/base-icon/base-icon.stories.ts +56 -0
- package/src/lib/shared/components/base-input/base-input.stories.ts +137 -0
- package/src/lib/shared/components/base-time-range/base-time-range.stories.ts +54 -0
- package/src/lib/shared/components/base-toggle/base-toggle.stories.ts +63 -0
- package/src/lib/shared/components/card/card.stories.ts +114 -0
- package/src/lib/shared/components/date-picker/date-picker.stories.ts +91 -0
- package/src/lib/shared/components/drop-down/drop-down.stories.ts +90 -0
- package/src/lib/shared/components/footer/footer.stories.ts +51 -0
- package/src/lib/shared/components/index.ts +6 -1
- package/src/lib/shared/components/kpi/kpi.stories.ts +65 -0
- package/src/lib/shared/components/links-button/links-button.stories.ts +75 -0
- package/src/lib/shared/components/paginator/paginator.stories.ts +56 -0
- package/src/lib/shared/components/skeleton/skeleton.css +92 -0
- package/src/lib/shared/components/skeleton/skeleton.html +3 -0
- package/src/lib/shared/components/skeleton/skeleton.spec.ts +22 -0
- package/src/lib/shared/components/skeleton/skeleton.stories.ts +131 -0
- package/src/lib/shared/components/skeleton/skeleton.ts +46 -0
- package/src/lib/shared/components/stepper/stepper.stories.ts +77 -0
- package/src/lib/shared/components/tab-group/tab-group.stories.ts +102 -0
- package/src/lib/shared/components/tab-panel/tab-panel.stories.ts +54 -0
- package/src/lib/shared/components/time-picker/time-picker.stories.ts +66 -0
- package/types/ngx-opalbytes-components.d.ts +110 -2
package/README.md
CHANGED
|
@@ -145,6 +145,7 @@ src/
|
|
|
145
145
|
| ├── kpi/
|
|
146
146
|
| ├── links-button/
|
|
147
147
|
| ├── paginator/
|
|
148
|
+
| ├── skeleton/
|
|
148
149
|
| ├── stepper/
|
|
149
150
|
| ├── tab-group/
|
|
150
151
|
| ├── tab-panel/
|
|
@@ -955,6 +956,80 @@ Controle de paginação para tabelas ou listas.
|
|
|
955
956
|
|
|
956
957
|
---
|
|
957
958
|
|
|
959
|
+
### `CaoSkeleton`
|
|
960
|
+
Um componente de esqueleto de carregamento (skeleton/placeholder) com variantes de retângulo, círculo e texto, animação shimmer customizável e cor configurável.
|
|
961
|
+
|
|
962
|
+
**Seletor:** `<cao-skeleton>`
|
|
963
|
+
|
|
964
|
+
**Tipo `CaoSkeletonVariant`**
|
|
965
|
+
|
|
966
|
+
| Valor | Descrição |
|
|
967
|
+
| --- | --- |
|
|
968
|
+
| `'rect'` | Retângulo (padrão). |
|
|
969
|
+
| `'circle'` | Círculo (largura/altura devem ser iguais, mas é garantido via `aspect-ratio`). |
|
|
970
|
+
| `'text'` | Linha de texto (altura `1em`, raio `4px`). |
|
|
971
|
+
|
|
972
|
+
**Atributos (Inputs)**
|
|
973
|
+
|
|
974
|
+
| Atributo | Tipo | Padrão | Descrição |
|
|
975
|
+
| --- | --- | --- | --- |
|
|
976
|
+
| `borderRadius` | `string` | `'14px'` | Raio da borda do retângulo (ignorado nas variantes `circle` e `text`). |
|
|
977
|
+
| `width` | `string` | `'100%'` | Largura do esqueleto (usada quando `size` não é informado). |
|
|
978
|
+
| `height` | `string` | `'100%'` | Altura do esqueleto (usada quando `size` não é informado). |
|
|
979
|
+
| `bgColor` | `string` | `'#e2e8f0'` | Cor de fundo do esqueleto. |
|
|
980
|
+
| `shine` | `string` | `'#f8fafc'` | Cor do reflexo (shimmer). |
|
|
981
|
+
| `variant` | `CaoSkeletonVariant` | `'rect'` | Formato do esqueleto (`'rect'`, `'circle'` ou `'text'`). |
|
|
982
|
+
| `speed` | `string` | `'2s'` | Duração da animação shimmer. |
|
|
983
|
+
| `size` | `string` | `undefined` | Quando definido, sobrescreve `width` e `height` simultaneamente (ex.: `'48px'`). |
|
|
984
|
+
| `animationDeg` | `string` | `'90deg'` | Ângulo do gradiente da animação shimmer. |
|
|
985
|
+
|
|
986
|
+
**CSS Custom Properties**
|
|
987
|
+
|
|
988
|
+
O componente expõe todas as suas propriedades visuais via CSS custom properties, que cascateiam naturalmente e podem ser sobrescritas por um elemento pai ou globalmente:
|
|
989
|
+
|
|
990
|
+
| Propriedade | Padrão | Descrição |
|
|
991
|
+
| --- | --- | --- |
|
|
992
|
+
| `--skeleton-width` | `100%` | Largura do esqueleto. |
|
|
993
|
+
| `--skeleton-height` | `100%` | Altura do esqueleto. |
|
|
994
|
+
| `--skeleton-bg` | `#e2e8f0` | Cor de fundo do esqueleto. |
|
|
995
|
+
| `--skeleton-shine` | `#f8fafc` | Cor do reflexo (shimmer). |
|
|
996
|
+
| `--skeleton-radius` | `14px` | Raio da borda. |
|
|
997
|
+
| `--skeleton-speed` | `2s` | Duração da animação shimmer. |
|
|
998
|
+
| `--skeleton-animation-deg` | `90deg` | Ângulo do gradiente do shimmer. |
|
|
999
|
+
|
|
1000
|
+
```css
|
|
1001
|
+
.my-card {
|
|
1002
|
+
--skeleton-bg: #d1d5db;
|
|
1003
|
+
--skeleton-shine: #f3f4f6;
|
|
1004
|
+
--skeleton-radius: 8px;
|
|
1005
|
+
--skeleton-speed: 2s;
|
|
1006
|
+
}
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
**Exemplo de uso:**
|
|
1010
|
+
|
|
1011
|
+
```html
|
|
1012
|
+
<!-- Retângulo -->
|
|
1013
|
+
<cao-skeleton width="200px" height="40px"></cao-skeleton>
|
|
1014
|
+
|
|
1015
|
+
<!-- Círculo -->
|
|
1016
|
+
<cao-skeleton variant="circle" size="48px"></cao-skeleton>
|
|
1017
|
+
|
|
1018
|
+
<!-- Linha de texto -->
|
|
1019
|
+
<cao-skeleton variant="text" width="120px"></cao-skeleton>
|
|
1020
|
+
|
|
1021
|
+
<!-- Cores customizadas e duração da animação -->
|
|
1022
|
+
<cao-skeleton
|
|
1023
|
+
width="100%"
|
|
1024
|
+
height="24px"
|
|
1025
|
+
bgColor="#e0e7ff"
|
|
1026
|
+
shine="#ffffff"
|
|
1027
|
+
speed="1.5s"
|
|
1028
|
+
></cao-skeleton>
|
|
1029
|
+
```
|
|
1030
|
+
|
|
1031
|
+
---
|
|
1032
|
+
|
|
958
1033
|
### `TimePicker`
|
|
959
1034
|
Um seletor de horário.
|
|
960
1035
|
|
package/cli/cao-comp.cjs
CHANGED
|
@@ -5,9 +5,11 @@ const fs = require('fs');
|
|
|
5
5
|
const path = require('path');
|
|
6
6
|
|
|
7
7
|
const USAGE = `cao-comp — Copia um componente da lib ngx-opalbytes-components para qualquer projeto
|
|
8
|
+
e gera o setup de Storybook para visualizar os componentes
|
|
8
9
|
|
|
9
10
|
Uso:
|
|
10
11
|
cao-comp <componente> <destino> [opcoes]
|
|
12
|
+
cao-comp storybook <destino> [opcoes]
|
|
11
13
|
|
|
12
14
|
Argumentos:
|
|
13
15
|
<componente> Nome da pasta do componente em shared/components (ex: base-button)
|
|
@@ -19,10 +21,214 @@ Opcoes:
|
|
|
19
21
|
-f, --force Sobrescreve arquivos existentes no destino
|
|
20
22
|
-v, --version Exibe a versao
|
|
21
23
|
|
|
24
|
+
Subcomando storybook:
|
|
25
|
+
Gera o setup minimo do Storybook (.storybook/, exemplo de story e STORYBOOK-SETUP.md)
|
|
26
|
+
em <destino>, pronto para visualizar os componentes copiados.
|
|
27
|
+
|
|
22
28
|
Exemplos:
|
|
23
29
|
cao-comp base-button ./src/app/components
|
|
24
30
|
cao-comp stepper ./src/app/components --force
|
|
25
31
|
cao-comp --list
|
|
32
|
+
cao-comp storybook ./meu-projeto
|
|
33
|
+
cao-comp base-button ./meu-projeto/src/app/components && cao-comp storybook ./meu-projeto
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
const STORYBOOK_FILES = {
|
|
37
|
+
'.storybook/main.ts': `import type { StorybookConfig } from '@storybook/angular-vite';
|
|
38
|
+
|
|
39
|
+
const config: StorybookConfig = {
|
|
40
|
+
"stories": [
|
|
41
|
+
"../src/**/*.mdx",
|
|
42
|
+
"../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"
|
|
43
|
+
],
|
|
44
|
+
"addons": [
|
|
45
|
+
"@storybook/addon-essentials",
|
|
46
|
+
"@storybook/addon-a11y",
|
|
47
|
+
"@storybook/addon-docs",
|
|
48
|
+
"@storybook/addon-onboarding"
|
|
49
|
+
],
|
|
50
|
+
"framework": {
|
|
51
|
+
"name": "@storybook/angular-vite",
|
|
52
|
+
"options": {
|
|
53
|
+
"compodoc": false,
|
|
54
|
+
"compodocArgs": [
|
|
55
|
+
"-e",
|
|
56
|
+
"json",
|
|
57
|
+
"-d",
|
|
58
|
+
"."
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
export default config;
|
|
64
|
+
`,
|
|
65
|
+
'.storybook/preview.ts': `import type { Preview } from '@storybook/angular-vite';
|
|
66
|
+
|
|
67
|
+
// Para habilitar as docs automaticas (argTypes) com Compodoc:
|
|
68
|
+
// 1. Gere o documentation.json: npx @compodoc/compodoc -p tsconfig.json -e json -d .
|
|
69
|
+
// 2. Coloque "compodoc": true no framework options do .storybook/main.ts
|
|
70
|
+
// 3. Descomente as linhas abaixo:
|
|
71
|
+
// import { setCompodocJson } from '@storybook/addon-docs/angular';
|
|
72
|
+
// import docJson from '../documentation.json';
|
|
73
|
+
// setCompodocJson(docJson);
|
|
74
|
+
|
|
75
|
+
const preview: Preview = {
|
|
76
|
+
parameters: {
|
|
77
|
+
controls: {
|
|
78
|
+
matchers: {
|
|
79
|
+
color: /(background|color)$/i,
|
|
80
|
+
date: /Date$/i,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export default preview;
|
|
87
|
+
`,
|
|
88
|
+
'.storybook/tsconfig.json': `{
|
|
89
|
+
"extends": "../tsconfig.json",
|
|
90
|
+
"compilerOptions": {
|
|
91
|
+
"allowSyntheticDefaultImports": true,
|
|
92
|
+
"esModuleInterop": true,
|
|
93
|
+
"resolveJsonModule": true,
|
|
94
|
+
"skipLibCheck": true,
|
|
95
|
+
"types": ["node"]
|
|
96
|
+
},
|
|
97
|
+
"include": ["../src/**/*.stories.*", "./preview.ts", "./main.ts", "./typings.d.ts"]
|
|
98
|
+
}
|
|
99
|
+
`,
|
|
100
|
+
'.storybook/typings.d.ts': `declare module '*.md';
|
|
101
|
+
`,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const EXAMPLE_STORY_LINES = [
|
|
105
|
+
`import { Component, EventEmitter, Input, Output } from '@angular/core';`,
|
|
106
|
+
`import type { Meta, StoryObj } from '@storybook/angular-vite';`,
|
|
107
|
+
`import { fn } from 'storybook/test';`,
|
|
108
|
+
``,
|
|
109
|
+
`@Component({`,
|
|
110
|
+
` standalone: true,`,
|
|
111
|
+
` selector: 'storybook-example-button',`,
|
|
112
|
+
` template: \``,
|
|
113
|
+
` <button`,
|
|
114
|
+
` type="button"`,
|
|
115
|
+
` (click)="onClick.emit()"`,
|
|
116
|
+
` [disabled]="isDisabled"`,
|
|
117
|
+
` style="padding:10px 18px;font-size:14px;cursor:pointer;border-radius:6px;border:1px solid #4f46e5;background:#4f46e5;color:#fff;">`,
|
|
118
|
+
` {{ label }}`,
|
|
119
|
+
` </button>`,
|
|
120
|
+
` \`,`,
|
|
121
|
+
`})`,
|
|
122
|
+
`export class StorybookExampleButtonComponent {`,
|
|
123
|
+
` @Input() label = 'Clique!';`,
|
|
124
|
+
` @Input() isDisabled = false;`,
|
|
125
|
+
` @Output() readonly onClick = new EventEmitter<void>();`,
|
|
126
|
+
`}`,
|
|
127
|
+
``,
|
|
128
|
+
`const meta: Meta<StorybookExampleButtonComponent> = {`,
|
|
129
|
+
` title: 'Exemplo/Cao Button',`,
|
|
130
|
+
` component: StorybookExampleButtonComponent,`,
|
|
131
|
+
` tags: ['autodocs'],`,
|
|
132
|
+
` args: { onClick: fn() },`,
|
|
133
|
+
`};`,
|
|
134
|
+
``,
|
|
135
|
+
`export default meta;`,
|
|
136
|
+
`type Story = StoryObj<StorybookExampleButtonComponent>;`,
|
|
137
|
+
``,
|
|
138
|
+
`export const Default: Story = {`,
|
|
139
|
+
` args: { label: 'Clique!' },`,
|
|
140
|
+
`};`,
|
|
141
|
+
``,
|
|
142
|
+
`export const ComIconeTexto: Story = {`,
|
|
143
|
+
` args: { label: 'Salvar' },`,
|
|
144
|
+
`};`,
|
|
145
|
+
``,
|
|
146
|
+
`export const Desabilitado: Story = {`,
|
|
147
|
+
` args: { label: 'Bloqueado', isDisabled: true },`,
|
|
148
|
+
`};`,
|
|
149
|
+
``,
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
const STORYBOOK_SETUP_DOC = `# Storybook — Setup gerado pelo cao-comp
|
|
153
|
+
|
|
154
|
+
Este diretorio contem o setup minimo do Storybook para visualizar os
|
|
155
|
+
componentes da lib ngx-opalbytes-components em um projeto externo.
|
|
156
|
+
|
|
157
|
+
## 1. Instalar as dependencias (no destino)
|
|
158
|
+
|
|
159
|
+
Adicione as dependencias de desenvolvimento:
|
|
160
|
+
|
|
161
|
+
\`\`\`bash
|
|
162
|
+
npm i -D storybook @storybook/angular-vite @storybook/addon-essentials @storybook/addon-a11y @storybook/addon-docs @storybook/addon-onboarding @compodoc/compodoc
|
|
163
|
+
\`\`\`
|
|
164
|
+
|
|
165
|
+
Certifique-se de que as peer dependencies dos componentes estao instaladas:
|
|
166
|
+
\`@angular/core\`, \`@angular/common\`, \`@angular/material\`, \`@angular/cdk\`,
|
|
167
|
+
\`@lucide/angular\` e \`ngx-mask\`.
|
|
168
|
+
|
|
169
|
+
## 2. Copiar os componentes que deseja visualizar
|
|
170
|
+
|
|
171
|
+
\`\`\`bash
|
|
172
|
+
cao-comp base-button ./src/app/components
|
|
173
|
+
cao-comp base-input ./src/app/components
|
|
174
|
+
cao-comp --list # lista todos os componentes disponiveis
|
|
175
|
+
\`\`\`
|
|
176
|
+
|
|
177
|
+
## 3. Criar stories para os componentes copiados
|
|
178
|
+
|
|
179
|
+
Abra \`src/stories/CaoButton.stories.ts\` (exemplo gerado) ou crie arquivos
|
|
180
|
+
\`*.stories.ts\` junto dos componentes. Exemplo:
|
|
181
|
+
|
|
182
|
+
\`\`\`ts
|
|
183
|
+
import type { Meta, StoryObj } from '@storybook/angular-vite';
|
|
184
|
+
import { fn } from 'storybook/test';
|
|
185
|
+
import { CaoBaseButtonComponent } from '../../app/components/base-button/base-button.component';
|
|
186
|
+
|
|
187
|
+
const meta: Meta<CaoBaseButtonComponent> = {
|
|
188
|
+
title: 'Components/Base Button',
|
|
189
|
+
component: CaoBaseButtonComponent,
|
|
190
|
+
tags: ['autodocs'],
|
|
191
|
+
args: { buttonClick: fn() },
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
export default meta;
|
|
195
|
+
type Story = StoryObj<CaoBaseButtonComponent>;
|
|
196
|
+
|
|
197
|
+
export const Default: Story = { args: { buttonText: 'Clique!' } };
|
|
198
|
+
export const ComIcone: Story = { args: { buttonText: 'Salvar', leadingIcon: 'Save', isLucideIcon: true } };
|
|
199
|
+
\`\`\`
|
|
200
|
+
|
|
201
|
+
## 4. Rodar
|
|
202
|
+
|
|
203
|
+
\`\`\`bash
|
|
204
|
+
# Servidor de desenvolvimento (porta 6006)
|
|
205
|
+
npx storybook dev -c .storybook -p 6006
|
|
206
|
+
|
|
207
|
+
# Build estatico
|
|
208
|
+
npx storybook build -c .storybook -o storybook-static
|
|
209
|
+
\`\`\`
|
|
210
|
+
|
|
211
|
+
Dica: adicione ao package.json do projeto de destino:
|
|
212
|
+
|
|
213
|
+
\`\`\`json
|
|
214
|
+
{
|
|
215
|
+
"scripts": {
|
|
216
|
+
"storybook": "storybook dev -c .storybook -p 6006",
|
|
217
|
+
"build-storybook": "storybook build -c .storybook -o storybook-static"
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
\`\`\`
|
|
221
|
+
|
|
222
|
+
## Opcional: Compodoc (docs automaticas)
|
|
223
|
+
|
|
224
|
+
1. Gere o JSON de documentacao na raiz do destino:
|
|
225
|
+
\`\`\`bash
|
|
226
|
+
npx @compodoc/compodoc -p tsconfig.json -e json -d .
|
|
227
|
+
\`\`\`
|
|
228
|
+
2. No \`.storybook/main.ts\`, altere \`"compodoc": false\` para \`"compodoc": true\`.
|
|
229
|
+
3. No \`.storybook/preview.ts\`, descomente o bloco do Compodoc.
|
|
230
|
+
|
|
231
|
+
> O \`--force\` sobrescreve os arquivos gerados pelo cao-comp no destino.
|
|
26
232
|
`;
|
|
27
233
|
|
|
28
234
|
function resolveTemplatesDir() {
|
|
@@ -86,6 +292,57 @@ function copyRecursive(src, dest, force, conflicts) {
|
|
|
86
292
|
}
|
|
87
293
|
}
|
|
88
294
|
|
|
295
|
+
function writeFileIfAllowed(filePath, content, force, conflicts) {
|
|
296
|
+
if (fs.existsSync(filePath) && !force) {
|
|
297
|
+
conflicts.push(filePath);
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
301
|
+
fs.writeFileSync(filePath, content);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function setupStorybook(destination, force) {
|
|
306
|
+
const root = path.resolve(destination);
|
|
307
|
+
const conflicts = [];
|
|
308
|
+
const created = [];
|
|
309
|
+
|
|
310
|
+
for (const [rel, content] of Object.entries(STORYBOOK_FILES)) {
|
|
311
|
+
const file = path.join(root, rel);
|
|
312
|
+
if (writeFileIfAllowed(file, content, force, conflicts)) {
|
|
313
|
+
created.push(path.relative(root, file));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const storyFile = path.join(root, 'src', 'stories', 'CaoButton.stories.ts');
|
|
318
|
+
if (writeFileIfAllowed(storyFile, EXAMPLE_STORY_LINES.join('\n'), force, conflicts)) {
|
|
319
|
+
created.push(path.relative(root, storyFile));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const docFile = path.join(root, 'STORYBOOK-SETUP.md');
|
|
323
|
+
if (writeFileIfAllowed(docFile, STORYBOOK_SETUP_DOC, force, conflicts)) {
|
|
324
|
+
created.push(path.relative(root, docFile));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (conflicts.length) {
|
|
328
|
+
process.stderr.write(
|
|
329
|
+
`Erro: os seguintes arquivos ja existem no destino (use --force para sobrescrever):\n` +
|
|
330
|
+
conflicts.map((c) => ` - ${c}`).join('\n') +
|
|
331
|
+
'\n'
|
|
332
|
+
);
|
|
333
|
+
return 1;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
process.stdout.write(
|
|
337
|
+
`Setup de Storybook gerado em "${root}".\n` +
|
|
338
|
+
`Arquivos criados:\n` +
|
|
339
|
+
created.map((c) => ` - ${c}`).join('\n') +
|
|
340
|
+
'\n' +
|
|
341
|
+
`Leia ${path.join(root, 'STORYBOOK-SETUP.md')} para instalar as dependencias e rodar.\n`
|
|
342
|
+
);
|
|
343
|
+
return 0;
|
|
344
|
+
}
|
|
345
|
+
|
|
89
346
|
function parseArgs(argv) {
|
|
90
347
|
const positionals = [];
|
|
91
348
|
const flags = { help: false, list: false, force: false, version: false };
|
|
@@ -146,7 +403,20 @@ function main() {
|
|
|
146
403
|
return 0;
|
|
147
404
|
}
|
|
148
405
|
|
|
149
|
-
const [
|
|
406
|
+
const [first, second] = positionals;
|
|
407
|
+
|
|
408
|
+
if (first === 'storybook') {
|
|
409
|
+
if (!second) {
|
|
410
|
+
process.stderr.write(
|
|
411
|
+
'Erro: informe o destino do Storybook.\n\n' + USAGE + '\n'
|
|
412
|
+
);
|
|
413
|
+
return 1;
|
|
414
|
+
}
|
|
415
|
+
return setupStorybook(second, flags.force);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
const component = first;
|
|
419
|
+
const destination = second;
|
|
150
420
|
if (!component || !destination) {
|
|
151
421
|
process.stderr.write(
|
|
152
422
|
'Erro: informe o componente e o destino.\n\n' + USAGE + '\n'
|
|
@@ -183,4 +453,4 @@ function main() {
|
|
|
183
453
|
return 0;
|
|
184
454
|
}
|
|
185
455
|
|
|
186
|
-
process.exit(main());
|
|
456
|
+
process.exit(main());
|