@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.
- package/dist/doctor.d.ts +21 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +218 -0
- package/dist/doctor.js.map +1 -0
- package/dist/generateApp.d.ts +33 -0
- package/dist/generateApp.d.ts.map +1 -0
- package/dist/generateApp.js +632 -0
- package/dist/generateApp.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +19 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +109 -0
- package/dist/interactive.js.map +1 -0
- package/dist/platformRoot.d.ts +3 -0
- package/dist/platformRoot.d.ts.map +1 -0
- package/dist/platformRoot.js +37 -0
- package/dist/platformRoot.js.map +1 -0
- package/dist/smoke.d.ts +2 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +96 -0
- package/dist/smoke.js.map +1 -0
- package/package.json +31 -0
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|