@quantica-apps/create-quantica-app 0.1.3

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.
@@ -0,0 +1,632 @@
1
+ import { mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { buildAppSlug, buildRepositoryNameFromSlug, iconNames, validateRepositoryName, } from '@quantica-apps/platform-app-core';
4
+ const normalizeRoutePath = (value) => (value.startsWith('/') ? value : `/${value}`);
5
+ const toForwardSlashes = (value) => value.replace(/\\/g, '/');
6
+ const toPascalCase = (value) => value
7
+ .split(/[^a-zA-Z0-9]/)
8
+ .filter(Boolean)
9
+ .map((segment) => `${segment.charAt(0).toUpperCase()}${segment.slice(1)}`)
10
+ .join('');
11
+ const escapeTemplateString = (value) => value.replace(/`/g, '\\`');
12
+ const createDir = (targetPath) => {
13
+ mkdirSync(targetPath, {
14
+ recursive: true,
15
+ });
16
+ };
17
+ const ensureEmptyTargetDirectory = (targetPath) => {
18
+ if (!readdirSync(targetPath, { withFileTypes: false }).length) {
19
+ return;
20
+ }
21
+ throw new Error(`Target directory "${targetPath}" already exists and is not empty.`);
22
+ };
23
+ const safeWriteFile = (targetPath, contents, generatedFiles) => {
24
+ createDir(path.dirname(targetPath));
25
+ writeFileSync(targetPath, contents, 'utf8');
26
+ generatedFiles.push(targetPath);
27
+ };
28
+ const getPlatformDependencyPath = (appFrontendRoot, platformRoot, packageName) => {
29
+ const absolutePackagePath = path.join(platformRoot, 'packages', packageName);
30
+ const relativePackagePath = path.relative(appFrontendRoot, absolutePackagePath);
31
+ return `file:${toForwardSlashes(relativePackagePath)}`;
32
+ };
33
+ const getPlatformDependencyVersion = (appFrontendRoot, platformRoot, packageName, dependencyMode, platformPackageVersion) => {
34
+ if (dependencyMode === 'registry') {
35
+ return platformPackageVersion;
36
+ }
37
+ return getPlatformDependencyPath(appFrontendRoot, platformRoot, packageName);
38
+ };
39
+ const createRootPackageJson = (appId) => JSON.stringify({
40
+ name: appId,
41
+ private: true,
42
+ workspaces: ['frontend'],
43
+ scripts: {
44
+ build: 'npm run build --workspace=frontend',
45
+ dev: 'npm run dev --workspace=frontend',
46
+ 'type-check': 'npm run type-check --workspace=frontend',
47
+ preview: 'npm run preview --workspace=frontend',
48
+ },
49
+ }, null, 2);
50
+ const createFrontendPackageJson = (appId, appFrontendRoot, platformRoot, dependencyMode, platformPackageVersion) => JSON.stringify({
51
+ name: `${appId}-frontend`,
52
+ private: true,
53
+ version: '0.0.0',
54
+ type: 'module',
55
+ scripts: {
56
+ dev: 'vite',
57
+ build: 'tsc && vite build',
58
+ preview: 'vite preview',
59
+ 'type-check': 'tsc --noEmit',
60
+ },
61
+ dependencies: {
62
+ '@quantica-apps/platform-app-core': getPlatformDependencyVersion(appFrontendRoot, platformRoot, 'platform-app-core', dependencyMode, platformPackageVersion),
63
+ '@quantica-apps/platform-auth': getPlatformDependencyVersion(appFrontendRoot, platformRoot, 'platform-auth', dependencyMode, platformPackageVersion),
64
+ '@quantica-apps/platform-i18n': getPlatformDependencyVersion(appFrontendRoot, platformRoot, 'platform-i18n', dependencyMode, platformPackageVersion),
65
+ '@quantica-apps/platform-shell': getPlatformDependencyVersion(appFrontendRoot, platformRoot, 'platform-shell', dependencyMode, platformPackageVersion),
66
+ '@quantica-apps/platform-theme': getPlatformDependencyVersion(appFrontendRoot, platformRoot, 'platform-theme', dependencyMode, platformPackageVersion),
67
+ 'i18next': '^25.8.17',
68
+ 'i18next-browser-languagedetector': '^8.2.1',
69
+ 'keycloak-js': '^26.2.1',
70
+ 'react': '^19.2.0',
71
+ 'react-dom': '^19.2.0',
72
+ 'react-i18next': '^16.5.6',
73
+ 'react-router-dom': '^7.13.0',
74
+ },
75
+ devDependencies: {
76
+ '@tailwindcss/postcss': '^4.1.18',
77
+ '@types/react': '^19.2.7',
78
+ '@types/react-dom': '^19.2.3',
79
+ '@vitejs/plugin-react': '^5.1.1',
80
+ 'postcss': '^8.5.6',
81
+ 'typescript': '^5.9.3',
82
+ 'vite': '^7.3.1',
83
+ },
84
+ }, null, 2);
85
+ const createTsconfigJson = () => JSON.stringify({
86
+ compilerOptions: {
87
+ target: 'ES2020',
88
+ useDefineForClassFields: true,
89
+ lib: ['ES2020', 'DOM', 'DOM.Iterable'],
90
+ module: 'ESNext',
91
+ skipLibCheck: true,
92
+ esModuleInterop: true,
93
+ allowSyntheticDefaultImports: true,
94
+ moduleResolution: 'bundler',
95
+ allowImportingTsExtensions: true,
96
+ resolveJsonModule: true,
97
+ isolatedModules: true,
98
+ noEmit: true,
99
+ jsx: 'react-jsx',
100
+ strict: true,
101
+ noUnusedLocals: true,
102
+ noUnusedParameters: true,
103
+ noFallthroughCasesInSwitch: true,
104
+ forceConsistentCasingInFileNames: true,
105
+ baseUrl: '.',
106
+ paths: {
107
+ '@/*': ['./src/*'],
108
+ '@/pages': ['./src/pages'],
109
+ '@/config': ['./src/config'],
110
+ },
111
+ },
112
+ include: ['src'],
113
+ references: [{ path: './tsconfig.node.json' }],
114
+ }, null, 2);
115
+ const createTsconfigNodeJson = () => JSON.stringify({
116
+ compilerOptions: {
117
+ composite: true,
118
+ module: 'ESNext',
119
+ moduleResolution: 'bundler',
120
+ allowSyntheticDefaultImports: true,
121
+ },
122
+ include: ['vite.config.ts'],
123
+ }, null, 2);
124
+ const createViteConfig = (frontendPort) => `import { defineConfig } from 'vite';
125
+ import react from '@vitejs/plugin-react';
126
+ import path from 'path';
127
+ import { fileURLToPath } from 'url';
128
+
129
+ const __filename = fileURLToPath(import.meta.url);
130
+ const __dirname = path.dirname(__filename);
131
+
132
+ export default defineConfig({
133
+ plugins: [react()],
134
+ resolve: {
135
+ dedupe: ['react', 'react-dom', 'react-i18next', 'react-router', 'react-router-dom'],
136
+ alias: {
137
+ '@': path.resolve(__dirname, './src'),
138
+ '@pages': path.resolve(__dirname, './src/pages'),
139
+ '@config': path.resolve(__dirname, './src/config'),
140
+ },
141
+ },
142
+ server: {
143
+ port: ${frontendPort},
144
+ open: true,
145
+ },
146
+ build: {
147
+ target: 'es2020',
148
+ reportCompressedSize: false,
149
+ },
150
+ });
151
+ `;
152
+ const createPostCssConfig = () => `export default {
153
+ plugins: {
154
+ '@tailwindcss/postcss': {},
155
+ },
156
+ };
157
+ `;
158
+ const createIndexHtml = (appDisplayName) => `<!doctype html>
159
+ <html lang="pt-BR">
160
+ <head>
161
+ <meta charset="UTF-8" />
162
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
163
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
164
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
165
+ <link
166
+ href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@300;400;500;600;700;800&display=swap"
167
+ rel="stylesheet"
168
+ />
169
+ <title>${escapeTemplateString(appDisplayName)}</title>
170
+ </head>
171
+ <body>
172
+ <div id="root"></div>
173
+ <script type="module" src="/src/main.tsx"></script>
174
+ </body>
175
+ </html>
176
+ `;
177
+ const createEnvExample = (appDisplayName, appId, hubOrigin) => `VITE_APP_DISPLAY_NAME=${appDisplayName}
178
+ VITE_APP_ID=${appId}
179
+ VITE_HUB_URL=${hubOrigin}
180
+ VITE_KEYCLOAK_URL=http://localhost:8080
181
+ VITE_KEYCLOAK_REALM=quantica
182
+ VITE_KEYCLOAK_CLIENT_ID=${appId}
183
+ VITE_KEYCLOAK_PERMISSIONS_CLIENT_ID=${appId}
184
+ VITE_SKIP_AUTH=false
185
+ `;
186
+ const createGitIgnore = () => `node_modules
187
+ dist
188
+ .vite
189
+ .env
190
+ .env.local
191
+ `;
192
+ const createAppCiWorkflow = (dependencyMode) => `name: CI
193
+
194
+ on:
195
+ pull_request:
196
+ branches:
197
+ - main
198
+ - master
199
+ - develop
200
+ push:
201
+ branches:
202
+ - main
203
+ - master
204
+ - develop
205
+
206
+ jobs:
207
+ validate:
208
+ name: Validate app
209
+ runs-on: ubuntu-latest
210
+
211
+ steps:
212
+ - name: Checkout
213
+ uses: actions/checkout@v4
214
+
215
+ - name: Setup Node
216
+ uses: actions/setup-node@v4
217
+ with:
218
+ node-version: 22
219
+ cache: npm
220
+ cache-dependency-path: package-lock.json
221
+
222
+ ${dependencyMode === 'local' ? ` - name: Validate local platform dependency
223
+ shell: bash
224
+ run: |
225
+ if grep -q '"file:' frontend/package.json && [ ! -d "../quantica-app-platform" ]; then
226
+ echo "::error::This app was generated in local dependency mode. CI should use registry mode, or the sibling ../quantica-app-platform repository must exist on the runner."
227
+ exit 1
228
+ fi
229
+
230
+ ` : ''} - name: Install dependencies
231
+ run: npm ci
232
+
233
+ - name: Type-check
234
+ run: npm run type-check
235
+
236
+ - name: Build
237
+ run: npm run build
238
+ `;
239
+ const createSilentCheckHtml = () => `<!doctype html>
240
+ <html>
241
+ <body>
242
+ <script>
243
+ parent.postMessage(location.href, location.origin);
244
+ </script>
245
+ </body>
246
+ </html>
247
+ `;
248
+ const createIndexCss = () => `@import "tailwindcss";
249
+ @import "@quantica-apps/platform-theme/theme.css";
250
+ @source "../../node_modules/@quantica-apps/platform-shell/dist/**/*.js";
251
+ `;
252
+ const createEnvironmentModule = (appId, appDisplayName, hubOrigin) => `const trimEnv = (value: string | undefined) => (value ?? '').trim();
253
+
254
+ export const appEnvironment = {
255
+ appDisplayName: trimEnv(import.meta.env.VITE_APP_DISPLAY_NAME) || '${escapeTemplateString(appDisplayName)}',
256
+ appId: trimEnv(import.meta.env.VITE_APP_ID) || '${appId}',
257
+ hubOrigin: trimEnv(import.meta.env.VITE_HUB_URL) || '${hubOrigin}',
258
+ keycloak: {
259
+ clientId: trimEnv(import.meta.env.VITE_KEYCLOAK_CLIENT_ID),
260
+ realm: trimEnv(import.meta.env.VITE_KEYCLOAK_REALM),
261
+ url: trimEnv(import.meta.env.VITE_KEYCLOAK_URL).replace(/\\/+$/, ''),
262
+ },
263
+ permissionsClientId:
264
+ trimEnv(import.meta.env.VITE_KEYCLOAK_PERMISSIONS_CLIENT_ID) || '${appId}',
265
+ skipAuth:
266
+ import.meta.env.VITE_SKIP_AUTH === 'true' ||
267
+ import.meta.env.VITE_SKIP_AUTH === '1',
268
+ } as const;
269
+ `;
270
+ const createViteEnvDeclaration = () => `/// <reference types="vite/client" />
271
+
272
+ interface ImportMetaEnv {
273
+ readonly VITE_APP_DISPLAY_NAME: string;
274
+ readonly VITE_APP_ID: string;
275
+ readonly VITE_HUB_URL: string;
276
+ readonly VITE_KEYCLOAK_CLIENT_ID: string;
277
+ readonly VITE_KEYCLOAK_REALM: string;
278
+ readonly VITE_KEYCLOAK_URL: string;
279
+ readonly VITE_KEYCLOAK_PERMISSIONS_CLIENT_ID: string;
280
+ readonly VITE_SKIP_AUTH: string;
281
+ }
282
+
283
+ interface ImportMeta {
284
+ readonly env: ImportMetaEnv;
285
+ }
286
+ `;
287
+ const createPageModule = (title, includeExamplePages) => {
288
+ const body = includeExamplePages
289
+ ? ` <p className="max-w-2xl text-paragraph-14 text-content-neutral-secondary">
290
+ Esta tela foi criada pelo gerador interno da Quantica. Ela ja esta encaixada na shell
291
+ compartilhada da plataforma e pronta para receber componentes, providers e integracoes
292
+ de dominio.
293
+ </p>`
294
+ : ` <div className="h-24 rounded-xl border border-dashed border-border-neutral-tertiary bg-bg-neutral-secondary" />`;
295
+ return `export default function ${toPascalCase(title)}Page() {
296
+ return (
297
+ <section className="space-y-4 p-6">
298
+ <div className="space-y-2">
299
+ <p className="text-caption-12 font-medium uppercase text-content-neutral-secondary">
300
+ Quantica App Generator
301
+ </p>
302
+ <h1 className="text-title-sb-26 text-content-neutral-primary">${escapeTemplateString(title)}</h1>
303
+ ${body}
304
+ </div>
305
+ </section>
306
+ );
307
+ }
308
+ `;
309
+ };
310
+ const createI18nResourcesModule = (appDisplayName) => `export const appResources = {
311
+ en: {
312
+ translation: {
313
+ app_custom: {
314
+ title: '${escapeTemplateString(appDisplayName)}',
315
+ },
316
+ sidebar: {
317
+ evoke_app_title: '${escapeTemplateString(appDisplayName)}',
318
+ },
319
+ },
320
+ },
321
+ pt: {
322
+ translation: {
323
+ app_custom: {
324
+ title: '${escapeTemplateString(appDisplayName)}',
325
+ },
326
+ sidebar: {
327
+ evoke_app_title: '${escapeTemplateString(appDisplayName)}',
328
+ },
329
+ },
330
+ },
331
+ } as const;
332
+ `;
333
+ const createMainModule = () => `import ReactDOM from 'react-dom/client';
334
+ import { setupPlatformI18n } from '@quantica-apps/platform-i18n';
335
+ import App from './App';
336
+ import { appResources } from './i18n/resources';
337
+ import './index.css';
338
+
339
+ setupPlatformI18n({
340
+ resources: appResources,
341
+ });
342
+
343
+ ReactDOM.createRoot(document.getElementById('root')!).render(<App />);
344
+ `;
345
+ const createManifestModule = (appId, appSlug, appDisplayName, defaultRoute, sidebarItems) => {
346
+ const pageImports = sidebarItems
347
+ .map((item) => {
348
+ const componentName = `${toPascalCase(item.key)}Page`;
349
+ return `import ${componentName} from './pages/${componentName}';`;
350
+ })
351
+ .join('\n');
352
+ const sidebarLiteral = sidebarItems
353
+ .map((item) => ` {
354
+ key: '${item.key}',
355
+ label: '${escapeTemplateString(item.label)}',
356
+ path: '${normalizeRoutePath(item.path)}',
357
+ icon: '${item.icon}',
358
+ ${item.requiredClientRoles.length ? ` requiredClientRoles: ${JSON.stringify(item.requiredClientRoles)},\n` : ''} }`)
359
+ .join(',\n');
360
+ const routesLiteral = sidebarItems
361
+ .map((item) => {
362
+ const componentName = `${toPascalCase(item.key)}Page`;
363
+ return ` {
364
+ key: '${item.key}',
365
+ path: '${normalizeRoutePath(item.path)}',
366
+ title: '${escapeTemplateString(item.label)}',
367
+ component: ${componentName},
368
+ }`;
369
+ })
370
+ .join(',\n');
371
+ return `import { createAppManifest, createSidebarConfig } from '@quantica-apps/platform-app-core';
372
+ ${pageImports}
373
+ import { appEnvironment } from './config/env';
374
+
375
+ export const appManifest = createAppManifest({
376
+ appId: '${appId}',
377
+ appSlug: '${appSlug}',
378
+ appDisplayName: '${escapeTemplateString(appDisplayName)}',
379
+ hubOrigin: appEnvironment.hubOrigin,
380
+ defaultRoute: '${normalizeRoutePath(defaultRoute)}',
381
+ envContract: {
382
+ required: ['VITE_KEYCLOAK_URL', 'VITE_KEYCLOAK_REALM', 'VITE_KEYCLOAK_CLIENT_ID'],
383
+ optional: ['VITE_SKIP_AUTH', 'VITE_KEYCLOAK_PERMISSIONS_CLIENT_ID', 'VITE_HUB_URL'],
384
+ },
385
+ sidebarItems: createSidebarConfig([
386
+ ${sidebarLiteral}
387
+ ]),
388
+ routeDefinitions: [
389
+ ${routesLiteral}
390
+ ],
391
+ });
392
+ `;
393
+ };
394
+ const createAppModule = () => `import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom';
395
+ import { PlatformAuthProvider, usePlatformAuth } from '@quantica-apps/platform-auth';
396
+ import {
397
+ PlatformAccessBlockedState,
398
+ PlatformAppShell,
399
+ PlatformErrorBoundary,
400
+ PlatformLoadingScreen,
401
+ } from '@quantica-apps/platform-shell';
402
+ import { appManifest } from './app.manifest';
403
+ import { appEnvironment } from './config/env';
404
+
405
+ function AppRoutes() {
406
+ const {
407
+ hasClientRole,
408
+ isAccessBlocked,
409
+ isAuthenticated,
410
+ isLoading,
411
+ login,
412
+ logout,
413
+ retryAccess,
414
+ user,
415
+ } = usePlatformAuth();
416
+ const visibleItems = appManifest.sidebarItems.filter((item) => {
417
+ if (!item.requiredClientRoles?.length) {
418
+ return true;
419
+ }
420
+
421
+ return item.requiredClientRoles.every((role) => hasClientRole(role));
422
+ });
423
+ const visibleKeys = new Set(visibleItems.map((item) => item.key));
424
+ const routes = appManifest.routeDefinitions.filter((route) => visibleKeys.has(route.key));
425
+ const fallbackRoute = routes.find((route) => route.path === appManifest.defaultRoute) ?? routes[0];
426
+ const shouldRedirectIndex = !!fallbackRoute && fallbackRoute.path !== '/';
427
+ const fullName =
428
+ [user?.firstName, user?.lastName].filter(Boolean).join(' ') || user?.username || 'Quantica user';
429
+
430
+ if (isLoading) {
431
+ return <PlatformLoadingScreen />;
432
+ }
433
+
434
+ if (!isAuthenticated) {
435
+ return (
436
+ <div className="flex min-h-screen items-center justify-center bg-bg-neutral-secondary px-6">
437
+ <div className="w-full max-w-md rounded-xl bg-bg-neutral-primary p-8 text-center shadow-elevation-2">
438
+ <p className="mb-6 text-paragraph-14 text-content-neutral-secondary">
439
+ Sessao nao iniciada. Se o redirecionamento para o Keycloak nao abriu, clique abaixo.
440
+ </p>
441
+ <button
442
+ type="button"
443
+ onClick={() => {
444
+ void login();
445
+ }}
446
+ className="rounded-lg bg-bg-brand-secondary px-4 py-2 text-paragraph-14 font-medium text-content-neutral-inverse"
447
+ >
448
+ Abrir login
449
+ </button>
450
+ </div>
451
+ </div>
452
+ );
453
+ }
454
+
455
+ if (isAccessBlocked) {
456
+ return <PlatformAccessBlockedState onRetry={retryAccess} />;
457
+ }
458
+
459
+ return (
460
+ <PlatformAppShell
461
+ manifest={appManifest}
462
+ onLogout={logout}
463
+ canAccessItem={(item) =>
464
+ !item.requiredClientRoles?.length ||
465
+ item.requiredClientRoles.every((role) => hasClientRole(role))
466
+ }
467
+ user={{
468
+ email: user?.email,
469
+ name: fullName,
470
+ }}
471
+ >
472
+ <Routes>
473
+ {shouldRedirectIndex ? <Route index element={<Navigate to={fallbackRoute.path} replace />} /> : null}
474
+ {routes.map((route) => (
475
+ <Route key={route.key} path={route.path} element={<route.component />} />
476
+ ))}
477
+ {fallbackRoute ? <Route path="*" element={<Navigate to={fallbackRoute.path} replace />} /> : null}
478
+ </Routes>
479
+ </PlatformAppShell>
480
+ );
481
+ }
482
+
483
+ export default function App() {
484
+ return (
485
+ <PlatformErrorBoundary>
486
+ <PlatformAuthProvider
487
+ config={{
488
+ keycloak: appEnvironment.keycloak,
489
+ permissionsClientId: appEnvironment.permissionsClientId,
490
+ skipAuth: appEnvironment.skipAuth,
491
+ storageNamespace: appEnvironment.appId,
492
+ }}
493
+ >
494
+ <BrowserRouter>
495
+ <AppRoutes />
496
+ </BrowserRouter>
497
+ </PlatformAuthProvider>
498
+ </PlatformErrorBoundary>
499
+ );
500
+ }
501
+ `;
502
+ const createBackendReadme = () => `# Backend Placeholder
503
+
504
+ Esta fase do gerador entrega a arquitetura completa do frontend.
505
+ Use esta pasta para adicionar o backend da aplicacao quando o arquetipo de API estiver definido.
506
+ `;
507
+ const createDocsSetup = (appId, dependencyMode, platformPackageVersion) => `# Setup
508
+
509
+ ## 1. Instale dependencias
510
+
511
+ \`\`\`bash
512
+ npm install
513
+ \`\`\`
514
+
515
+ ## 2. Configure ambiente
516
+
517
+ Copie \`frontend/.env.example\` para \`frontend/.env.local\` e ajuste Keycloak e hub.
518
+
519
+ Os valores reais de Keycloak, client id, realm, URLs privadas e tokens nao sao gerados pelo scaffold. A integracao ja existe no codigo; as chaves reais devem ser preenchidas manualmente em cada ambiente.
520
+
521
+ ## 3. Rode o app
522
+
523
+ \`\`\`bash
524
+ npm run dev
525
+ \`\`\`
526
+
527
+ ## 4. Defaults alinhados a workspace
528
+
529
+ - Hub padrao da empresa: \`https://apps.evokenet.org\`
530
+ - Porta default de apps novos: \`${5174}\`
531
+ - Backend/API local esperado: \`http://localhost:3000\`
532
+
533
+ ## 5. Consumo da plataforma
534
+
535
+ - Modo de dependencia deste app: \`${dependencyMode}\`
536
+ - Versao da plataforma esperada: \`${platformPackageVersion}\`
537
+ - Em producao, o recomendado e consumir os pacotes publicos \`@quantica-apps/platform-*\` por versao publicada no npm
538
+ - Em desenvolvimento local, o modo \`local\` aponta para o repositorio \`quantica-app-platform\` por \`file:\`
539
+ - Para CI/producao, gere o app com \`--dependency-mode registry --platform-version <versao>\` ou ajuste as dependencias antes do deploy
540
+
541
+ ## 6. Tema e cores
542
+
543
+ - As cores e tokens visuais vêm de \`@quantica-apps/platform-theme\`
544
+ - Para mudar a base compartilhada de todos os apps, altere a plataforma e publique nova versao
545
+
546
+ ## 7. Checklist de Keycloak
547
+
548
+ - Client id padrao sugerido: \`${appId}\`
549
+ - Ajuste web origins e redirect URIs para a porta configurada do frontend
550
+ - Preencha \`VITE_KEYCLOAK_URL\`, \`VITE_KEYCLOAK_REALM\`, \`VITE_KEYCLOAK_CLIENT_ID\` e \`VITE_KEYCLOAK_PERMISSIONS_CLIENT_ID\` manualmente por ambiente
551
+ `;
552
+ const createReadme = (appId, appDisplayName, dependencyMode, platformPackageVersion) => `# ${appDisplayName}
553
+
554
+ Repo gerado pelo \`create-quantica-app\`.
555
+
556
+ - Nome do repo: \`${appId}\`
557
+ - Estrutura: monorepo fino com frontend Vite
558
+ - Shell, auth e i18n consumidos da plataforma compartilhada Quantica
559
+ - Modo de dependencia da plataforma: \`${dependencyMode}\`
560
+ - Versao alvo da plataforma: \`${platformPackageVersion}\`
561
+ - O codigo de Keycloak ja nasce integrado, mas secrets e URLs reais devem ser configurados manualmente por ambiente
562
+ - O CI do app nasce em \`.github/workflows/ci.yml\`; para producao, prefira dependencias da plataforma em modo \`registry\`
563
+ `;
564
+ const createSidebarPreview = (sidebarItems) => sidebarItems.map((item) => `- ${item.label} (${normalizeRoutePath(item.path)}) [${item.icon}]`).join('\n');
565
+ export function printGenerationPreview(options) {
566
+ const appId = buildRepositoryNameFromSlug(options.appSlug);
567
+ console.log('\nQuantica App Generator Preview');
568
+ console.log(`- repo: ${appId}`);
569
+ console.log(`- output: ${options.outDir}`);
570
+ console.log(`- frontend port: ${options.frontendPort}`);
571
+ console.log(`- hub origin: ${options.hubOrigin}`);
572
+ console.log(`- platform dependency mode: ${options.dependencyMode}`);
573
+ console.log(`- platform version: ${options.platformPackageVersion}`);
574
+ console.log(`- default route: ${normalizeRoutePath(options.defaultRoute)}`);
575
+ console.log(createSidebarPreview(options.sidebarItems));
576
+ console.log('');
577
+ }
578
+ export function generateApp(options) {
579
+ const appSlug = buildAppSlug(options.appSlug);
580
+ const appId = buildRepositoryNameFromSlug(appSlug);
581
+ const validatedAppId = validateRepositoryName(appId);
582
+ const appRoot = path.resolve(options.outDir);
583
+ const frontendRoot = path.join(appRoot, 'frontend');
584
+ const generatedFiles = [];
585
+ createDir(appRoot);
586
+ ensureEmptyTargetDirectory(appRoot);
587
+ const sidebarItems = options.sidebarItems.map((item) => ({
588
+ ...item,
589
+ key: buildAppSlug(item.key),
590
+ path: normalizeRoutePath(item.path),
591
+ requiredClientRoles: item.requiredClientRoles,
592
+ }));
593
+ safeWriteFile(path.join(appRoot, 'package.json'), createRootPackageJson(validatedAppId), generatedFiles);
594
+ safeWriteFile(path.join(appRoot, '.gitignore'), createGitIgnore(), generatedFiles);
595
+ safeWriteFile(path.join(appRoot, '.github', 'workflows', 'ci.yml'), createAppCiWorkflow(options.dependencyMode), generatedFiles);
596
+ safeWriteFile(path.join(appRoot, 'README.md'), createReadme(validatedAppId, options.appDisplayName, options.dependencyMode, options.platformPackageVersion), generatedFiles);
597
+ safeWriteFile(path.join(appRoot, 'backend', 'README.md'), createBackendReadme(), generatedFiles);
598
+ safeWriteFile(path.join(appRoot, 'docs', 'SETUP.md'), createDocsSetup(validatedAppId, options.dependencyMode, options.platformPackageVersion), generatedFiles);
599
+ safeWriteFile(path.join(frontendRoot, 'package.json'), createFrontendPackageJson(validatedAppId, frontendRoot, options.platformRoot, options.dependencyMode, options.platformPackageVersion), generatedFiles);
600
+ safeWriteFile(path.join(frontendRoot, 'tsconfig.json'), createTsconfigJson(), generatedFiles);
601
+ safeWriteFile(path.join(frontendRoot, 'tsconfig.node.json'), createTsconfigNodeJson(), generatedFiles);
602
+ safeWriteFile(path.join(frontendRoot, 'vite.config.ts'), createViteConfig(options.frontendPort), generatedFiles);
603
+ safeWriteFile(path.join(frontendRoot, 'postcss.config.js'), createPostCssConfig(), generatedFiles);
604
+ safeWriteFile(path.join(frontendRoot, 'index.html'), createIndexHtml(options.appDisplayName), generatedFiles);
605
+ safeWriteFile(path.join(frontendRoot, '.env.example'), createEnvExample(options.appDisplayName, validatedAppId, options.hubOrigin), generatedFiles);
606
+ safeWriteFile(path.join(frontendRoot, 'public', 'silent-check-sso.html'), createSilentCheckHtml(), generatedFiles);
607
+ safeWriteFile(path.join(frontendRoot, 'src', 'index.css'), createIndexCss(), generatedFiles);
608
+ safeWriteFile(path.join(frontendRoot, 'src', 'config', 'env.ts'), createEnvironmentModule(validatedAppId, options.appDisplayName, options.hubOrigin), generatedFiles);
609
+ safeWriteFile(path.join(frontendRoot, 'src', 'vite-env.d.ts'), createViteEnvDeclaration(), generatedFiles);
610
+ safeWriteFile(path.join(frontendRoot, 'src', 'i18n', 'resources.ts'), createI18nResourcesModule(options.appDisplayName), generatedFiles);
611
+ safeWriteFile(path.join(frontendRoot, 'src', 'main.tsx'), createMainModule(), generatedFiles);
612
+ safeWriteFile(path.join(frontendRoot, 'src', 'App.tsx'), createAppModule(), generatedFiles);
613
+ safeWriteFile(path.join(frontendRoot, 'src', 'app.manifest.ts'), createManifestModule(validatedAppId, appSlug, options.appDisplayName, options.defaultRoute, sidebarItems), generatedFiles);
614
+ for (const item of sidebarItems) {
615
+ const pageModuleName = `${toPascalCase(item.key)}Page.tsx`;
616
+ safeWriteFile(path.join(frontendRoot, 'src', 'pages', pageModuleName), createPageModule(item.label, options.includeExamplePages), generatedFiles);
617
+ }
618
+ return {
619
+ appId: validatedAppId,
620
+ appRoot,
621
+ frontendRoot,
622
+ generatedFiles,
623
+ };
624
+ }
625
+ export function cleanupGeneratedApp(appRoot) {
626
+ rmSync(appRoot, {
627
+ force: true,
628
+ recursive: true,
629
+ });
630
+ }
631
+ export const supportedIcons = [...iconNames];
632
+ //# sourceMappingURL=generateApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateApp.js","sourceRoot":"","sources":["../src/generateApp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}