@auto-engineer/frontend-generator-react-graphql 0.1.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 (63) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/LICENSE +10 -0
  3. package/README.md +362 -0
  4. package/dist/builder.d.ts +7 -0
  5. package/dist/builder.d.ts.map +1 -0
  6. package/dist/builder.js +189 -0
  7. package/dist/builder.js.map +1 -0
  8. package/dist/cli-manifest.d.ts +3 -0
  9. package/dist/cli-manifest.d.ts.map +1 -0
  10. package/dist/cli-manifest.js +10 -0
  11. package/dist/cli-manifest.js.map +1 -0
  12. package/dist/commands/copy-example.d.ts +59 -0
  13. package/dist/commands/copy-example.d.ts.map +1 -0
  14. package/dist/commands/copy-example.js +118 -0
  15. package/dist/commands/copy-example.js.map +1 -0
  16. package/dist/commands/generate-client.d.ts +60 -0
  17. package/dist/commands/generate-client.d.ts.map +1 -0
  18. package/dist/commands/generate-client.js +110 -0
  19. package/dist/commands/generate-client.js.map +1 -0
  20. package/dist/configure-starter.d.ts +2 -0
  21. package/dist/configure-starter.d.ts.map +1 -0
  22. package/dist/configure-starter.js +40 -0
  23. package/dist/configure-starter.js.map +1 -0
  24. package/dist/delete-directory.d.ts +2 -0
  25. package/dist/delete-directory.d.ts.map +1 -0
  26. package/dist/delete-directory.js +17 -0
  27. package/dist/delete-directory.js.map +1 -0
  28. package/dist/figma-helpers.d.ts +33 -0
  29. package/dist/figma-helpers.d.ts.map +1 -0
  30. package/dist/figma-helpers.js +99 -0
  31. package/dist/figma-helpers.js.map +1 -0
  32. package/dist/generator/generateComponents.d.ts +3 -0
  33. package/dist/generator/generateComponents.d.ts.map +1 -0
  34. package/dist/generator/generateComponents.js +111 -0
  35. package/dist/generator/generateComponents.js.map +1 -0
  36. package/dist/generator/templates/app.ejs +22 -0
  37. package/dist/generator/templates/component.ejs +18 -0
  38. package/dist/generator/templates/page.ejs +15 -0
  39. package/dist/index.d.ts +7 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +59 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/run-codegen.d.ts +2 -0
  44. package/dist/run-codegen.d.ts.map +1 -0
  45. package/dist/run-codegen.js +84 -0
  46. package/dist/run-codegen.js.map +1 -0
  47. package/dist/scaffold-gql-operations.d.ts +3 -0
  48. package/dist/scaffold-gql-operations.d.ts.map +1 -0
  49. package/dist/scaffold-gql-operations.js +77 -0
  50. package/dist/scaffold-gql-operations.js.map +1 -0
  51. package/dist/templates/createFile.d.ts +8 -0
  52. package/dist/templates/createFile.d.ts.map +1 -0
  53. package/dist/templates/createFile.js +66 -0
  54. package/dist/templates/createFile.js.map +1 -0
  55. package/dist/types.d.ts +62 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/write-graphql-schema.d.ts +2 -0
  60. package/dist/write-graphql-schema.d.ts.map +1 -0
  61. package/dist/write-graphql-schema.js +14 -0
  62. package/dist/write-graphql-schema.js.map +1 -0
  63. package/package.json +47 -0
@@ -0,0 +1,2 @@
1
+ export declare function deleteDirectory(targetPath: string): void;
2
+ //# sourceMappingURL=delete-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-directory.d.ts","sourceRoot":"","sources":["../src/delete-directory.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAcxD"}
@@ -0,0 +1,17 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ export function deleteDirectory(targetPath) {
4
+ const resolvedPath = path.resolve(targetPath);
5
+ if (!fs.existsSync(resolvedPath)) {
6
+ console.warn(`⚠️ Directory does not exist: ${resolvedPath}`);
7
+ return;
8
+ }
9
+ try {
10
+ fs.rmSync(resolvedPath, { recursive: true, force: true });
11
+ console.log(`✅ Deleted directory: ${resolvedPath}`);
12
+ }
13
+ catch (error) {
14
+ console.error(`❌ Failed to delete directory: ${resolvedPath}`, error);
15
+ }
16
+ }
17
+ //# sourceMappingURL=delete-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-directory.js","sourceRoot":"","sources":["../src/delete-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ interface RGBA {
2
+ r: number;
3
+ g: number;
4
+ b: number;
5
+ a: number;
6
+ }
7
+ type VariableValue = {
8
+ type: 'VARIABLE_ALIAS';
9
+ id: string;
10
+ } | RGBA | string | number | boolean;
11
+ interface Variable {
12
+ id: string;
13
+ name: string;
14
+ resolvedType: 'COLOR' | 'STRING' | 'FLOAT' | 'BOOLEAN' | string;
15
+ valuesByMode: Record<string, VariableValue>;
16
+ }
17
+ export interface VariableCollection {
18
+ name: string;
19
+ modes: {
20
+ modeId: string;
21
+ name: string;
22
+ }[];
23
+ variables: Variable[];
24
+ }
25
+ interface ResolveResult {
26
+ unresolved: true;
27
+ aliasId: string;
28
+ modeId?: string;
29
+ }
30
+ type ResolvedValue = string | number | boolean | ResolveResult;
31
+ export declare function flattenFigmaVariables(jsonData: VariableCollection[]): Record<string, ResolvedValue>;
32
+ export {};
33
+ //# sourceMappingURL=figma-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-helpers.d.ts","sourceRoot":"","sources":["../src/figma-helpers.ts"],"names":[],"mappings":"AAAA,UAAU,IAAI;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/F,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAChE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,UAAU,aAAa;IACrB,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;AAgF/D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAwCnG"}
@@ -0,0 +1,99 @@
1
+ // Guard
2
+ function isRgba(value) {
3
+ return typeof value === 'object' && value !== null && 'r' in value && 'g' in value && 'b' in value && 'a' in value;
4
+ }
5
+ // RGBA → HSLA
6
+ function rgbaToHsl(rgba) {
7
+ const { r, g, b } = rgba;
8
+ const max = Math.max(r, g, b);
9
+ const min = Math.min(r, g, b);
10
+ let h = 0;
11
+ let s = 0;
12
+ const l = (max + min) / 2;
13
+ if (max !== min) {
14
+ const d = max - min;
15
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
16
+ switch (max) {
17
+ case r:
18
+ h = (g - b) / d + (g < b ? 6 : 0);
19
+ break;
20
+ case g:
21
+ h = (b - r) / d + 2;
22
+ break;
23
+ case b:
24
+ h = (r - g) / d + 4;
25
+ break;
26
+ }
27
+ h /= 6;
28
+ }
29
+ const hDeg = Math.round(h * 360);
30
+ const sPercent = Math.round(s * 100);
31
+ const lPercent = Math.round(l * 100);
32
+ return `${hDeg} ${sPercent}% ${lPercent}%`;
33
+ }
34
+ /* eslint-disable complexity */
35
+ function resolveAlias(aliasId, variablesById, modeId, visited = new Set()) {
36
+ if (visited.has(aliasId)) {
37
+ return { unresolved: true, aliasId };
38
+ }
39
+ visited.add(aliasId);
40
+ const variable = variablesById[aliasId];
41
+ if (variable === undefined) {
42
+ return { unresolved: true, aliasId };
43
+ }
44
+ let value = variable.valuesByMode[modeId];
45
+ if (value === undefined) {
46
+ const availableModes = Object.keys(variable.valuesByMode);
47
+ if (availableModes.length > 0) {
48
+ const fallbackMode = availableModes[0];
49
+ value = variable.valuesByMode[fallbackMode];
50
+ }
51
+ else {
52
+ return { unresolved: true, aliasId, modeId };
53
+ }
54
+ }
55
+ if (typeof value === 'object' && 'type' in value && value.type === 'VARIABLE_ALIAS') {
56
+ return resolveAlias(value.id, variablesById, modeId, visited);
57
+ }
58
+ if (variable.resolvedType === 'COLOR' && isRgba(value)) {
59
+ return rgbaToHsl(value);
60
+ }
61
+ return value;
62
+ }
63
+ /* eslint-enable complexity */
64
+ export function flattenFigmaVariables(jsonData) {
65
+ const flattened = {};
66
+ const variablesById = {};
67
+ jsonData.forEach((collection) => {
68
+ collection.variables.forEach((variable) => {
69
+ variablesById[variable.id] = variable;
70
+ });
71
+ });
72
+ jsonData.forEach((collection) => {
73
+ const collectionName = collection.name;
74
+ const modeNames = {};
75
+ collection.modes.forEach((mode) => {
76
+ modeNames[mode.modeId] = mode.name;
77
+ });
78
+ collection.variables.forEach((variable) => {
79
+ const variableName = variable.name;
80
+ Object.entries(variable.valuesByMode).forEach(([modeId, value]) => {
81
+ const modeName = modeNames[modeId] || modeId;
82
+ const key = `${collectionName}/${variableName}/${modeName.toLowerCase().replace(/\s+/g, '-')}`;
83
+ let resolvedValue;
84
+ if (typeof value === 'object' && 'type' in value && value.type === 'VARIABLE_ALIAS') {
85
+ resolvedValue = resolveAlias(value.id, variablesById, modeId);
86
+ }
87
+ else if (variable.resolvedType === 'COLOR' && isRgba(value)) {
88
+ resolvedValue = rgbaToHsl(value);
89
+ }
90
+ else {
91
+ resolvedValue = value;
92
+ }
93
+ flattened[key] = resolvedValue;
94
+ });
95
+ });
96
+ });
97
+ return flattened;
98
+ }
99
+ //# sourceMappingURL=figma-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-helpers.js","sourceRoot":"","sources":["../src/figma-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { IAScheme } from '../types';
2
+ export declare function generateComponents(spec: IAScheme, basePath: string): void;
3
+ //# sourceMappingURL=generateComponents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateComponents.d.ts","sourceRoot":"","sources":["../../src/generator/generateComponents.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,QAAQ,EAAE,MAAM,UAAU,CAAC;AA+GnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAYlE"}
@@ -0,0 +1,111 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import ejs from 'ejs';
4
+ import { fileURLToPath } from 'url';
5
+ import createDebug from 'debug';
6
+ const debug = createDebug('frontend-generator-react-graphql:generateComponents');
7
+ const debugTemplates = createDebug('frontend-generator-react-graphql:generateComponents:templates');
8
+ const debugOutput = createDebug('frontend-generator-react-graphql:generateComponents:output');
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ function generate(spec) {
12
+ debug('Starting component generation');
13
+ const files = [];
14
+ debugTemplates('Loading templates from: %s/templates', __dirname);
15
+ const componentTemplate = fs.readFileSync(path.resolve(__dirname, 'templates/component.ejs'), 'utf-8');
16
+ const pageTemplate = fs.readFileSync(path.resolve(__dirname, 'templates/page.ejs'), 'utf-8');
17
+ const appTemplate = fs.readFileSync(path.resolve(__dirname, 'templates/app.ejs'), 'utf-8');
18
+ debugTemplates('Templates loaded successfully');
19
+ // Molecules
20
+ debug('Generating %d molecule components', Object.keys(spec.molecules.items).length);
21
+ for (const [name, def] of Object.entries(spec.molecules.items)) {
22
+ debugOutput('Generating molecule: %s', name);
23
+ const content = ejs.render(componentTemplate, {
24
+ name,
25
+ description: def.description,
26
+ atoms: def.composition.atoms,
27
+ molecules: [],
28
+ organisms: [],
29
+ specs: def.specs ?? [],
30
+ dataRequirements: [],
31
+ });
32
+ files.push({
33
+ path: `output/components/molecules/${name}.tsx`,
34
+ content,
35
+ });
36
+ }
37
+ // Organisms
38
+ debug('Generating %d organism components', Object.keys(spec.organisms.items).length);
39
+ for (const [name, def] of Object.entries(spec.organisms.items)) {
40
+ debugOutput('Generating organism: %s', name);
41
+ const content = ejs.render(componentTemplate, {
42
+ name,
43
+ description: def.description,
44
+ atoms: [],
45
+ molecules: def.composition.molecules,
46
+ organisms: [],
47
+ specs: def.specs ?? [],
48
+ dataRequirements: def.data_requirements ?? [],
49
+ });
50
+ files.push({
51
+ path: `output/components/organisms/${name}.tsx`,
52
+ content,
53
+ });
54
+ }
55
+ // Pages
56
+ debug('Generating %d page components', Object.keys(spec.pages.items).length);
57
+ for (const [name, def] of Object.entries(spec.pages.items)) {
58
+ debugOutput('Generating page: %s with route: %s', name, def.route);
59
+ const content = ejs.render(pageTemplate, {
60
+ name,
61
+ description: def.description,
62
+ organisms: def.layout.organisms,
63
+ route: def.route,
64
+ navigation: def.navigation ?? [],
65
+ specs: def.specs ?? [],
66
+ dataRequirements: def.data_requirements ?? [],
67
+ });
68
+ files.push({
69
+ path: `output/pages/${name}.tsx`,
70
+ content,
71
+ });
72
+ }
73
+ // App.tsx
74
+ debug('Generating App.tsx with %d pages', Object.keys(spec.pages.items).length);
75
+ const appContent = ejs.render(appTemplate, {
76
+ pages: Object.entries(spec.pages.items).map(([name, def]) => ({
77
+ name,
78
+ route: def.route,
79
+ })),
80
+ });
81
+ files.push({
82
+ path: 'output/App.tsx',
83
+ content: appContent,
84
+ });
85
+ debug('Generation complete - generated %d files', files.length);
86
+ return files;
87
+ }
88
+ function writeToDisk(files) {
89
+ debugOutput('Writing %d files to disk', files.length);
90
+ let filesWritten = 0;
91
+ for (const file of files) {
92
+ const fullPath = path.resolve(file.path);
93
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
94
+ fs.writeFileSync(fullPath, file.content);
95
+ filesWritten++;
96
+ debugOutput('Written file %d/%d: %s', filesWritten, files.length, file.path);
97
+ }
98
+ debugOutput('All files written successfully');
99
+ }
100
+ export function generateComponents(spec, basePath) {
101
+ debug('Starting generateComponents with basePath: %s', basePath);
102
+ const allFiles = generate(spec);
103
+ debug('Rewriting paths for %d files', allFiles.length);
104
+ const rewritten = allFiles.map((file) => ({
105
+ path: path.join(basePath, file.path.replace(/^output[\\/]/, '')),
106
+ content: file.content,
107
+ }));
108
+ writeToDisk(rewritten);
109
+ debug('Component generation complete');
110
+ }
111
+ //# sourceMappingURL=generateComponents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateComponents.js","sourceRoot":"","sources":["../../src/generator/generateComponents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { ApolloProvider } from '@apollo/client';
2
+ import { BrowserRouter, Route, Routes } from 'react-router-dom';
3
+ import { apolloClient } from '@/apolloClient';
4
+ import { Index } from '@/pages/Index';
5
+ import { NotFound } from '@/pages/NotFound';
6
+ <% pages.forEach(page => { -%>
7
+ import { <%= page.name %> } from '@/pages/<%= page.name %>';
8
+ <% }) -%>
9
+
10
+ export const App = () => (
11
+ <ApolloProvider client={apolloClient}>
12
+ <BrowserRouter>
13
+ <Routes>
14
+ <Route path="/" element={<Index />} />
15
+ <% pages.forEach(page => { -%>
16
+ <Route path="<%= page.route %>" element={<<%= page.name %> />} />
17
+ <% }) -%>
18
+ <Route path="*" element={<NotFound />} />
19
+ </Routes>
20
+ </BrowserRouter>
21
+ </ApolloProvider>
22
+ );
@@ -0,0 +1,18 @@
1
+ <% atoms.forEach(atom => { -%>
2
+ import { <%= atom %> } from "@/components/atoms/<%= atom.toLowerCase() %>";
3
+ <% }) -%>
4
+ <% molecules.forEach(mol => { -%>
5
+ import { <%= mol %> } from "@/components/molecules/<%= mol %>";
6
+ <% }) -%>
7
+
8
+ // <%= description %>
9
+ <% if (specs && specs.length) { -%>
10
+ // Specs:
11
+ <% specs.forEach(spec => { -%>
12
+ // - <%- spec %>
13
+ <% }) -%>
14
+ <% } -%>
15
+
16
+ export function <%= name %>() {
17
+ return <div />;
18
+ }
@@ -0,0 +1,15 @@
1
+ <% organisms.forEach(org => { -%>
2
+ import { <%= org %> } from "@/components/organisms/<%= org %>";
3
+ <% }) -%>
4
+
5
+ // <%= description %>
6
+ <% if (specs && specs.length) { -%>
7
+ // Specs:
8
+ <% specs.forEach(spec => { -%>
9
+ // - <%- spec %>
10
+ <% }) -%>
11
+ <% } -%>
12
+
13
+ export function <%= name %>() {
14
+ return <div />;
15
+ }
@@ -0,0 +1,7 @@
1
+ export declare function main(): Promise<string>;
2
+ export { CLI_MANIFEST } from './cli-manifest';
3
+ export * from './commands/generate-client';
4
+ export * from './commands/copy-example';
5
+ export * from './figma-helpers';
6
+ export * from './templates/createFile';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA,wBAAsB,IAAI,oBAiDzB;AASD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { FrontendScaffoldBuilder } from './builder.js';
5
+ import { configureStarter } from './configure-starter.js'; // New import
6
+ import { generateComponents } from './generator/generateComponents.js';
7
+ import { writeGqlOperationsToFolder } from './scaffold-gql-operations.js';
8
+ import { generateSchemaFile } from './write-graphql-schema.js';
9
+ import { runCodegen } from './run-codegen.js';
10
+ import createDebug from 'debug';
11
+ const debug = createDebug('frontend-generator-react-graphql');
12
+ const debugMain = createDebug('frontend-generator-react-graphql:main');
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ export async function main() {
16
+ const [, , starterDir, targetDir, iaSchemaPath, gqlSchemaPath, figmaVariablesPath] = process.argv;
17
+ debugMain('Starting main with args: starterDir=%s, targetDir=%s, iaSchemaPath=%s, gqlSchemaPath=%s, figmaVariablesPath=%s', starterDir, targetDir, iaSchemaPath, gqlSchemaPath, figmaVariablesPath);
18
+ if (!targetDir) {
19
+ debugMain('ERROR: Missing targetDir argument');
20
+ console.error('Usage: tsx src/index.ts <starter-dir> <target-dir> <ia-schema> <gql-schema> <figma-variables>');
21
+ process.exit(1);
22
+ }
23
+ debugMain('Creating FrontendScaffoldBuilder');
24
+ const builder = new FrontendScaffoldBuilder();
25
+ debugMain('Cloning starter from: %s', starterDir);
26
+ await builder.cloneStarter(starterDir);
27
+ debugMain('Building to target: %s', targetDir);
28
+ await builder.build(targetDir);
29
+ debugMain('Configuring starter with Figma variables: %s', figmaVariablesPath);
30
+ configureStarter(figmaVariablesPath, targetDir);
31
+ const filePath = path.resolve(__dirname, iaSchemaPath);
32
+ debugMain('Reading IA schema from: %s', filePath);
33
+ const iaSchemeJsonFile = fs.readFileSync(filePath, 'utf-8');
34
+ const iaSchemeJson = JSON.parse(iaSchemeJsonFile);
35
+ debugMain('IA schema loaded successfully');
36
+ debugMain('Generating components to: %s/src', targetDir);
37
+ generateComponents(iaSchemeJson, `${targetDir}/src`);
38
+ debugMain('Writing GraphQL operations to: %s/src', targetDir);
39
+ writeGqlOperationsToFolder(iaSchemeJson, `${targetDir}/src`);
40
+ debugMain('Generating GraphQL schema file from: %s', gqlSchemaPath);
41
+ generateSchemaFile(gqlSchemaPath, targetDir);
42
+ debugMain('Running codegen in: %s', targetDir);
43
+ runCodegen(targetDir);
44
+ debugMain('Frontend scaffold generation complete');
45
+ return 'Frontend Scaffold is running!';
46
+ }
47
+ if (import.meta.url === `file://${process.argv[1]}`) {
48
+ debug('Running as main module');
49
+ void main();
50
+ }
51
+ else {
52
+ debug('Module imported');
53
+ }
54
+ export { CLI_MANIFEST } from './cli-manifest.js';
55
+ export * from './commands/generate-client.js';
56
+ export * from './commands/copy-example.js';
57
+ export * from './figma-helpers.js';
58
+ export * from './templates/createFile.js';
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runCodegen(projectPath: string): void;
2
+ //# sourceMappingURL=run-codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-codegen.d.ts","sourceRoot":"","sources":["../src/run-codegen.ts"],"names":[],"mappings":"AA4BA,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CA0DpD"}
@@ -0,0 +1,84 @@
1
+ import { execSync } from 'child_process';
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import createDebug from 'debug';
5
+ const debug = createDebug('frontend-generator-react-graphql:codegen');
6
+ const debugCmd = createDebug('frontend-generator-react-graphql:codegen:cmd');
7
+ const QUERY_FILES = ['queries.ts', 'mutations.ts'];
8
+ const GRAPHQL_DIR = 'src/graphql';
9
+ function runCommand(cmd, cwd) {
10
+ debugCmd('Running command: %s in %s', cmd, cwd);
11
+ try {
12
+ const result = execSync(cmd, { cwd, encoding: 'utf-8', stdio: 'pipe' });
13
+ debugCmd('Command successful');
14
+ return result;
15
+ }
16
+ catch (e) {
17
+ debugCmd('Command failed: %s', cmd);
18
+ const error = e;
19
+ let output = '';
20
+ if (error.stdout)
21
+ output += error.stdout.toString();
22
+ if (error.stderr)
23
+ output += error.stderr.toString();
24
+ if (!output && error.message != null)
25
+ output = error.message;
26
+ return output;
27
+ }
28
+ }
29
+ export function runCodegen(projectPath) {
30
+ debug('Starting codegen for project: %s', projectPath);
31
+ const resolvedPath = path.resolve(projectPath);
32
+ debug('Resolved project path: %s', resolvedPath);
33
+ if (!fs.existsSync(resolvedPath)) {
34
+ debug('ERROR: Project path does not exist: %s', resolvedPath);
35
+ throw new Error(`❌ Project path does not exist: ${resolvedPath}`);
36
+ }
37
+ const schemaPath = path.join(resolvedPath, 'schema.graphql');
38
+ debug('Checking for schema at: %s', schemaPath);
39
+ if (!fs.existsSync(schemaPath)) {
40
+ debug('ERROR: Schema file not found at %s', schemaPath);
41
+ throw new Error(`❌ Schema file not found at ${schemaPath}`);
42
+ }
43
+ debug('Schema file found');
44
+ const filePaths = QUERY_FILES.map((file) => path.join(resolvedPath, GRAPHQL_DIR, file));
45
+ debug('Checking for GraphQL operation files: %o', QUERY_FILES);
46
+ for (const file of filePaths) {
47
+ if (!fs.existsSync(file)) {
48
+ debug('File not found: %s', file);
49
+ console.warn(`⚠️ File not found, skipping: ${file}`);
50
+ }
51
+ else {
52
+ debug('File found: %s', file);
53
+ }
54
+ }
55
+ debug('Installing dependencies');
56
+ console.log('▶ Installing dependencies via `npx pnpm` in', resolvedPath);
57
+ const installOutput = runCommand('npx pnpm install --include=dev', resolvedPath);
58
+ console.log(installOutput);
59
+ debug('Dependencies installed');
60
+ // Fix execute permissions for node_modules/.bin files
61
+ const binDir = path.join(resolvedPath, 'node_modules', '.bin');
62
+ debug('Checking bin directory: %s', binDir);
63
+ if (fs.existsSync(binDir)) {
64
+ try {
65
+ debug('Fixing execute permissions for bin files');
66
+ runCommand('chmod +x node_modules/.bin/*', resolvedPath);
67
+ debug('Permissions fixed');
68
+ }
69
+ catch (error) {
70
+ debug('Failed to fix permissions: %O', error);
71
+ console.warn('⚠️ Could not fix bin permissions:', error);
72
+ }
73
+ }
74
+ else {
75
+ debug('Bin directory does not exist, skipping permission fix');
76
+ }
77
+ debug('Running GraphQL codegen');
78
+ console.log('\n▶ Running codegen...');
79
+ const output = runCommand('npx pnpm codegen', resolvedPath);
80
+ console.log(output);
81
+ debug('Codegen completed successfully');
82
+ console.log('✅ Codegen completed.');
83
+ }
84
+ //# sourceMappingURL=run-codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-codegen.js","sourceRoot":"","sources":["../src/run-codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,0CAA0C,CAAC,CAAC;AACtE,MAAM,QAAQ,GAAG,WAAW,CAAC,8CAA8C,CAAC,CAAC;AAE7E,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AACnD,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,SAAS,UAAU,CAAC,GAAW,EAAE,GAAW;IAC1C,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACxE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,CAA2D,CAAC;QAC1E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI;YAAE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,KAAK,CAAC,kCAAkC,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,KAAK,CAAC,2BAA2B,EAAE,YAAY,CAAC,CAAC;IAEjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAC7D,KAAK,CAAC,4BAA4B,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,oCAAoC,EAAE,UAAU,CAAC,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE3B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IACxF,KAAK,CAAC,0CAA0C,EAAE,WAAW,CAAC,CAAC;IAE/D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,6CAA6C,EAAE,YAAY,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,UAAU,CAAC,gCAAgC,EAAE,YAAY,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAEhC,sDAAsD;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC/D,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAClD,UAAU,CAAC,8BAA8B,EAAE,YAAY,CAAC,CAAC;YACzD,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { IAScheme } from './types';
2
+ export declare function writeGqlOperationsToFolder(iaScheme: IAScheme, outputDir: string): void;
3
+ //# sourceMappingURL=scaffold-gql-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-gql-operations.d.ts","sourceRoot":"","sources":["../src/scaffold-gql-operations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAgFnC,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAyB/E"}
@@ -0,0 +1,77 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ function extractOperationName(gql) {
4
+ const match = gql.match(/(query|mutation)\s+(\w+)/);
5
+ return match ? match[2] : 'UnknownOperation';
6
+ }
7
+ function isValidDataRequirement(req) {
8
+ return (typeof req === 'object' &&
9
+ req !== null &&
10
+ 'type' in req &&
11
+ (req.type === 'query' || req.type === 'mutation') &&
12
+ 'details' in req &&
13
+ typeof req.details === 'object' &&
14
+ req.details !== null &&
15
+ 'gql' in req.details &&
16
+ typeof req.details.gql === 'string');
17
+ }
18
+ function processDataRequirements(record, operations) {
19
+ const dataReqs = record['data_requirements'];
20
+ if (!Array.isArray(dataReqs))
21
+ return;
22
+ for (const req of dataReqs) {
23
+ if (isValidDataRequirement(req)) {
24
+ operations.push({
25
+ operationType: req.type,
26
+ operationName: extractOperationName(req.details.gql),
27
+ raw: req.details.gql.trim(),
28
+ });
29
+ }
30
+ }
31
+ }
32
+ function walk(obj, operations) {
33
+ if (typeof obj !== 'object' || obj === null)
34
+ return;
35
+ if (Array.isArray(obj)) {
36
+ obj.forEach((item) => walk(item, operations));
37
+ return;
38
+ }
39
+ const record = obj;
40
+ processDataRequirements(record, operations);
41
+ for (const value of Object.values(record)) {
42
+ walk(value, operations);
43
+ }
44
+ }
45
+ function extractGqlOperationsFromIAScheme(schema) {
46
+ const operations = [];
47
+ walk(schema, operations);
48
+ return operations;
49
+ }
50
+ function buildFileContent(operations) {
51
+ const header = `import { graphql } from '../gql';\n`;
52
+ const entries = operations.map((op) => {
53
+ return `\nexport const ${op.operationName} = graphql(\`\n${op.raw}\n\`);`;
54
+ });
55
+ return header + entries.join('\n');
56
+ }
57
+ export function writeGqlOperationsToFolder(iaScheme, outputDir) {
58
+ const allOperations = extractGqlOperationsFromIAScheme(iaScheme);
59
+ const uniqueSet = new Set();
60
+ const uniqueOperations = [];
61
+ for (const op of allOperations) {
62
+ const key = `${op.operationType}:${op.operationName}:${op.raw}`;
63
+ if (!uniqueSet.has(key)) {
64
+ uniqueOperations.push(op);
65
+ uniqueSet.add(key);
66
+ }
67
+ }
68
+ const queries = uniqueOperations.filter((op) => op.operationType === 'query');
69
+ const mutations = uniqueOperations.filter((op) => op.operationType === 'mutation');
70
+ const graphqlDir = path.join(outputDir, 'graphql');
71
+ fs.mkdirSync(graphqlDir, { recursive: true });
72
+ const queriesPath = path.join(graphqlDir, 'queries.ts');
73
+ const mutationsPath = path.join(graphqlDir, 'mutations.ts');
74
+ fs.writeFileSync(queriesPath, buildFileContent(queries), 'utf-8');
75
+ fs.writeFileSync(mutationsPath, buildFileContent(mutations), 'utf-8');
76
+ }
77
+ //# sourceMappingURL=scaffold-gql-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-gql-operations.js","sourceRoot":"","sources":["../src/scaffold-gql-operations.ts"],"names":[],"mappings":"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"}