helix-lang 11.0.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 +168 -0
- package/dist/architect.d.ts +14 -0
- package/dist/architect.d.ts.map +1 -0
- package/dist/architect.js +127 -0
- package/dist/architect.js.map +1 -0
- package/dist/bin/helix.d.ts +20 -0
- package/dist/bin/helix.d.ts.map +1 -0
- package/dist/bin/helix.js +921 -0
- package/dist/bin/helix.js.map +1 -0
- package/dist/commands/collaborate/index.d.ts +2 -0
- package/dist/commands/collaborate/index.d.ts.map +1 -0
- package/dist/commands/collaborate/index.js +129 -0
- package/dist/commands/collaborate/index.js.map +1 -0
- package/dist/commands/collaborate/server.d.ts +31 -0
- package/dist/commands/collaborate/server.d.ts.map +1 -0
- package/dist/commands/collaborate/server.js +159 -0
- package/dist/commands/collaborate/server.js.map +1 -0
- package/dist/commands/deploy/index.d.ts +25 -0
- package/dist/commands/deploy/index.d.ts.map +1 -0
- package/dist/commands/deploy/index.js +130 -0
- package/dist/commands/deploy/index.js.map +1 -0
- package/dist/commands/deploy/platforms/fly.d.ts +9 -0
- package/dist/commands/deploy/platforms/fly.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/fly.js +68 -0
- package/dist/commands/deploy/platforms/fly.js.map +1 -0
- package/dist/commands/deploy/platforms/railway.d.ts +9 -0
- package/dist/commands/deploy/platforms/railway.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/railway.js +115 -0
- package/dist/commands/deploy/platforms/railway.js.map +1 -0
- package/dist/commands/deploy/platforms/vercel.d.ts +10 -0
- package/dist/commands/deploy/platforms/vercel.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/vercel.js +126 -0
- package/dist/commands/deploy/platforms/vercel.js.map +1 -0
- package/dist/commands/deploy.d.ts +6 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +56 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/evolve/analyzers/performance.d.ts +13 -0
- package/dist/commands/evolve/analyzers/performance.d.ts.map +1 -0
- package/dist/commands/evolve/analyzers/performance.js +591 -0
- package/dist/commands/evolve/analyzers/performance.js.map +1 -0
- package/dist/commands/evolve/analyzers/security.d.ts +21 -0
- package/dist/commands/evolve/analyzers/security.d.ts.map +1 -0
- package/dist/commands/evolve/analyzers/security.js +280 -0
- package/dist/commands/evolve/analyzers/security.js.map +1 -0
- package/dist/commands/evolve/index.d.ts +2 -0
- package/dist/commands/evolve/index.d.ts.map +1 -0
- package/dist/commands/evolve/index.js +122 -0
- package/dist/commands/evolve/index.js.map +1 -0
- package/dist/commands/generate.d.ts +6 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +277 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +176 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/library/index.d.ts +27 -0
- package/dist/commands/library/index.d.ts.map +1 -0
- package/dist/commands/library/index.js +126 -0
- package/dist/commands/library/index.js.map +1 -0
- package/dist/commands/migrate.d.ts +5 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +258 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +6 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +195 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/preflight.d.ts +20 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +182 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/preview.d.ts +13 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +260 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +96 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/spawn.d.ts +11 -0
- package/dist/commands/spawn.d.ts.map +1 -0
- package/dist/commands/spawn.js +916 -0
- package/dist/commands/spawn.js.map +1 -0
- package/dist/compiler.d.ts +12 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +92 -0
- package/dist/compiler.js.map +1 -0
- package/dist/core/file-writer.d.ts +36 -0
- package/dist/core/file-writer.d.ts.map +1 -0
- package/dist/core/file-writer.js +268 -0
- package/dist/core/file-writer.js.map +1 -0
- package/dist/core/registry.d.ts +57 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +222 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/self-healing.d.ts +47 -0
- package/dist/core/self-healing.d.ts.map +1 -0
- package/dist/core/self-healing.js +250 -0
- package/dist/core/self-healing.js.map +1 -0
- package/dist/core/types.d.ts +126 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generators/databases/mongodb.d.ts +10 -0
- package/dist/generators/databases/mongodb.d.ts.map +1 -0
- package/dist/generators/databases/mongodb.js +83 -0
- package/dist/generators/databases/mongodb.js.map +1 -0
- package/dist/generators/databases/redis.d.ts +2 -0
- package/dist/generators/databases/redis.d.ts.map +1 -0
- package/dist/generators/databases/redis.js +140 -0
- package/dist/generators/databases/redis.js.map +1 -0
- package/dist/generators/flutter.d.ts +32 -0
- package/dist/generators/flutter.d.ts.map +1 -0
- package/dist/generators/flutter.js +628 -0
- package/dist/generators/flutter.js.map +1 -0
- package/dist/openrouter.d.ts +68 -0
- package/dist/openrouter.d.ts.map +1 -0
- package/dist/openrouter.js +241 -0
- package/dist/openrouter.js.map +1 -0
- package/dist/page-generator.d.ts +22 -0
- package/dist/page-generator.d.ts.map +1 -0
- package/dist/page-generator.js +192 -0
- package/dist/page-generator.js.map +1 -0
- package/dist/parser.d.ts +76 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +691 -0
- package/dist/parser.js.map +1 -0
- package/dist/prompts/master-architect.d.ts +9 -0
- package/dist/prompts/master-architect.d.ts.map +1 -0
- package/dist/prompts/master-architect.js +150 -0
- package/dist/prompts/master-architect.js.map +1 -0
- package/dist/researcher.d.ts +12 -0
- package/dist/researcher.d.ts.map +1 -0
- package/dist/researcher.js +85 -0
- package/dist/researcher.js.map +1 -0
- package/dist/self-heal.d.ts +29 -0
- package/dist/self-heal.d.ts.map +1 -0
- package/dist/self-heal.js +260 -0
- package/dist/self-heal.js.map +1 -0
- package/dist/services/SupabaseDeployer.d.ts +9 -0
- package/dist/services/SupabaseDeployer.d.ts.map +1 -0
- package/dist/services/SupabaseDeployer.js +50 -0
- package/dist/services/SupabaseDeployer.js.map +1 -0
- package/dist/test-generator.d.ts +18 -0
- package/dist/test-generator.d.ts.map +1 -0
- package/dist/test-generator.js +180 -0
- package/dist/test-generator.js.map +1 -0
- package/dist/themes/index.d.ts +52 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +273 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +81 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/constitutional-validator.d.ts +73 -0
- package/dist/utils/constitutional-validator.d.ts.map +1 -0
- package/dist/utils/constitutional-validator.js +249 -0
- package/dist/utils/constitutional-validator.js.map +1 -0
- package/library/auth-flow/app/api/auth/[...nextauth]/route.ts +31 -0
- package/library/auth-flow/app/api/auth/login/route.ts +90 -0
- package/library/auth-flow/app/api/auth/register/route.ts +91 -0
- package/library/auth-flow/components/auth/AuthMiddleware.tsx +139 -0
- package/library/auth-flow/components/auth/LoginForm.tsx +125 -0
- package/library/auth-flow/components/auth/RegisterForm.tsx +168 -0
- package/library/auth-flow/components/auth/nextauth-config.ts +99 -0
- package/library/auth-flow/manifest.json +29 -0
- package/library/auth-flow/schema.prisma +45 -0
- package/library/dashboard-analytics/components/dashboard/ActivityFeed.tsx +109 -0
- package/library/dashboard-analytics/components/dashboard/LineChart.tsx +180 -0
- package/library/dashboard-analytics/components/dashboard/StatsCard.tsx +47 -0
- package/library/dashboard-analytics/components/dashboard/SummaryGrid.tsx +39 -0
- package/library/dashboard-analytics/manifest.json +19 -0
- package/library/data-table/components/table/BulkActions.tsx +59 -0
- package/library/data-table/components/table/ColumnToggle.tsx +65 -0
- package/library/data-table/components/table/DataTable.tsx +318 -0
- package/library/data-table/components/table/ExportCSV.tsx +52 -0
- package/library/data-table/components/table/SearchFilter.tsx +48 -0
- package/library/data-table/manifest.json +20 -0
- package/library/file-upload/app/api/upload/route.ts +107 -0
- package/library/file-upload/components/upload/DropZone.tsx +268 -0
- package/library/file-upload/components/upload/FilePreview.tsx +82 -0
- package/library/file-upload/components/upload/UploadProgress.tsx +92 -0
- package/library/file-upload/components/upload/fileStorage.ts +142 -0
- package/library/file-upload/manifest.json +21 -0
- package/library/notification-system/app/api/notifications/route.ts +121 -0
- package/library/notification-system/components/notifications/NotificationBell.tsx +154 -0
- package/library/notification-system/components/notifications/NotificationProvider.tsx +161 -0
- package/library/notification-system/components/notifications/Toast.tsx +112 -0
- package/library/notification-system/manifest.json +20 -0
- package/package.json +66 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SupabaseDeployer = void 0;
|
|
7
|
+
const pg_1 = require("pg");
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
class SupabaseDeployer {
|
|
11
|
+
/**
|
|
12
|
+
* Deploys the content of a SQL file to the configured Supabase database.
|
|
13
|
+
* @param connectionString The Postgres connection string (postgres://user:pass@host:port/db)
|
|
14
|
+
* @param sqlFilePath Path to the SQL file to execute
|
|
15
|
+
*/
|
|
16
|
+
static async deploySchema(connectionString, sqlFilePath) {
|
|
17
|
+
console.log(chalk_1.default.blue(`\n⚡ [Supabase Autopilot] Connecting to database...`));
|
|
18
|
+
const client = new pg_1.Client({
|
|
19
|
+
connectionString: connectionString,
|
|
20
|
+
ssl: { rejectUnauthorized: false }, // Required for Supabase in many envs
|
|
21
|
+
});
|
|
22
|
+
try {
|
|
23
|
+
await client.connect();
|
|
24
|
+
console.log(chalk_1.default.green(`✔ Connected.`));
|
|
25
|
+
console.log(chalk_1.default.blue(`Reading schema from: ${sqlFilePath}`));
|
|
26
|
+
const sqlContent = await fs_extra_1.default.readFile(sqlFilePath, 'utf-8');
|
|
27
|
+
console.log(chalk_1.default.yellow(`Executing SQL migration...`));
|
|
28
|
+
await client.query(sqlContent);
|
|
29
|
+
console.log(chalk_1.default.green(`✔ Schema deployed successfully.`));
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.error(chalk_1.default.red(`\n❌ Deployment Failed:`));
|
|
33
|
+
if (err.message.includes('password authentication failed')) {
|
|
34
|
+
console.error(chalk_1.default.red(` -> Invalid Password in Connection String.`));
|
|
35
|
+
}
|
|
36
|
+
else if (err.message.includes('addr not available')) {
|
|
37
|
+
console.error(chalk_1.default.red(` -> Host unreachable. Check your internet connection.`));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.error(chalk_1.default.red(` -> ${err.message}`));
|
|
41
|
+
}
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await client.end();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.SupabaseDeployer = SupabaseDeployer;
|
|
50
|
+
//# sourceMappingURL=SupabaseDeployer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseDeployer.js","sourceRoot":"","sources":["../../src/services/SupabaseDeployer.ts"],"names":[],"mappings":";;;;;;AAAA,2BAA4B;AAC5B,wDAA0B;AAC1B,kDAA0B;AAE1B,MAAa,gBAAgB;IACzB;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAwB,EAAE,WAAmB;QACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,IAAI,WAAM,CAAC;YACtB,gBAAgB,EAAE,gBAAgB;YAClC,GAAG,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,qCAAqC;SAC5E,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YAEzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAE3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACxD,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAE/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACnD,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;YAC7E,CAAC;iBAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,GAAG,CAAC;QACd,CAAC;gBAAS,CAAC;YACP,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;CACJ;AAvCD,4CAuCC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helix Auto Test Generator
|
|
3
|
+
* Generates Vitest test files for spawned API routes and React components
|
|
4
|
+
*/
|
|
5
|
+
import { HelixStrand } from './parser';
|
|
6
|
+
/**
|
|
7
|
+
* Generate Vitest test file for an API route
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateAPITests(strand: HelixStrand): string;
|
|
10
|
+
/**
|
|
11
|
+
* Generate React Testing Library test for a component page
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateComponentTests(strand: HelixStrand): string;
|
|
14
|
+
/**
|
|
15
|
+
* Generate vitest.config.ts for a Next.js project
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateTestConfig(): string;
|
|
18
|
+
//# sourceMappingURL=test-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../src/test-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAc,MAAM,UAAU,CAAC;AAEnD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAgF5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAuClE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAqB3C"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helix Auto Test Generator
|
|
4
|
+
* Generates Vitest test files for spawned API routes and React components
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateAPITests = generateAPITests;
|
|
8
|
+
exports.generateComponentTests = generateComponentTests;
|
|
9
|
+
exports.generateTestConfig = generateTestConfig;
|
|
10
|
+
/**
|
|
11
|
+
* Generate Vitest test file for an API route
|
|
12
|
+
*/
|
|
13
|
+
function generateAPITests(strand) {
|
|
14
|
+
const name = strand.name;
|
|
15
|
+
const lower = name.toLowerCase();
|
|
16
|
+
const requiredFields = strand.fields.filter(f => !f.constraints?.includes('optional'));
|
|
17
|
+
const sampleData = {};
|
|
18
|
+
const invalidData = {};
|
|
19
|
+
for (const field of requiredFields) {
|
|
20
|
+
sampleData[field.name] = getSampleValue(field);
|
|
21
|
+
invalidData[field.name] = '';
|
|
22
|
+
}
|
|
23
|
+
const sampleJson = JSON.stringify(sampleData, null, 4);
|
|
24
|
+
return `// Auto-generated by Helix Test Generator
|
|
25
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
26
|
+
|
|
27
|
+
const BASE_URL = process.env.TEST_URL || 'http://localhost:3000';
|
|
28
|
+
|
|
29
|
+
describe('${name} API', () => {
|
|
30
|
+
let createdId: string | null = null;
|
|
31
|
+
|
|
32
|
+
it('GET /api/${lower} — should return paginated list', async () => {
|
|
33
|
+
const res = await fetch(\`\${BASE_URL}/api/${lower}\`);
|
|
34
|
+
expect(res.status).toBe(200);
|
|
35
|
+
|
|
36
|
+
const json = await res.json();
|
|
37
|
+
// Helix APIs return { data: [...], pagination: {...} }
|
|
38
|
+
expect(json).toHaveProperty('data');
|
|
39
|
+
expect(json).toHaveProperty('pagination');
|
|
40
|
+
expect(Array.isArray(json.data)).toBe(true);
|
|
41
|
+
expect(json.pagination).toHaveProperty('page');
|
|
42
|
+
expect(json.pagination).toHaveProperty('total');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('POST /api/${lower} — should create a new ${lower}', async () => {
|
|
46
|
+
const res = await fetch(\`\${BASE_URL}/api/${lower}\`, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: { 'Content-Type': 'application/json' },
|
|
49
|
+
body: JSON.stringify(${sampleJson}),
|
|
50
|
+
});
|
|
51
|
+
expect(res.status).toBe(201);
|
|
52
|
+
|
|
53
|
+
const json = await res.json();
|
|
54
|
+
expect(json).toHaveProperty('id');
|
|
55
|
+
${requiredFields.map(f => ` expect(json).toHaveProperty('${f.name}');`).join('\n')}
|
|
56
|
+
createdId = json.id;
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('POST /api/${lower} — should reject empty body', async () => {
|
|
60
|
+
const res = await fetch(\`\${BASE_URL}/api/${lower}\`, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers: { 'Content-Type': 'application/json' },
|
|
63
|
+
body: JSON.stringify({}),
|
|
64
|
+
});
|
|
65
|
+
// Should return 400 for missing required fields
|
|
66
|
+
expect(res.status).toBe(400);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('GET /api/${lower} — should include created item', async () => {
|
|
70
|
+
const res = await fetch(\`\${BASE_URL}/api/${lower}\`);
|
|
71
|
+
const json = await res.json();
|
|
72
|
+
const items = json.data || json;
|
|
73
|
+
|
|
74
|
+
if (createdId) {
|
|
75
|
+
const found = items.find((item: any) => item.id === createdId);
|
|
76
|
+
expect(found).toBeDefined();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('GET /api/${lower}?page=1&limit=5 — should respect pagination', async () => {
|
|
81
|
+
const res = await fetch(\`\${BASE_URL}/api/${lower}?page=1&limit=5\`);
|
|
82
|
+
expect(res.status).toBe(200);
|
|
83
|
+
|
|
84
|
+
const json = await res.json();
|
|
85
|
+
expect(json.data.length).toBeLessThanOrEqual(5);
|
|
86
|
+
expect(json.pagination.limit).toBe(5);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generate React Testing Library test for a component page
|
|
93
|
+
*/
|
|
94
|
+
function generateComponentTests(strand) {
|
|
95
|
+
const name = strand.name;
|
|
96
|
+
const lower = name.toLowerCase();
|
|
97
|
+
return `// Auto-generated by Helix Test Generator
|
|
98
|
+
import { describe, it, expect } from 'vitest';
|
|
99
|
+
import { render, screen } from '@testing-library/react';
|
|
100
|
+
import '@testing-library/jest-dom';
|
|
101
|
+
|
|
102
|
+
// Note: Import the actual page component when running
|
|
103
|
+
// import ${name}Page from '@/app/${lower}/page';
|
|
104
|
+
|
|
105
|
+
describe('${name} Page', () => {
|
|
106
|
+
it('should be importable', () => {
|
|
107
|
+
// Verify the module exists
|
|
108
|
+
expect(true).toBe(true);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Uncomment when running with Next.js test setup:
|
|
112
|
+
/*
|
|
113
|
+
it('should render the page heading', () => {
|
|
114
|
+
render(<${name}Page />);
|
|
115
|
+
expect(screen.getByRole('heading')).toBeInTheDocument();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should have form elements for ${name} fields', () => {
|
|
119
|
+
render(<${name}Page />);
|
|
120
|
+
${strand.fields.map(f => ` // Check for ${f.name} field
|
|
121
|
+
// expect(screen.getByLabelText(/${f.name}/i)).toBeInTheDocument();`).join('\n')}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('should display loading state initially', () => {
|
|
125
|
+
render(<${name}Page />);
|
|
126
|
+
// Check for loading indicator
|
|
127
|
+
expect(screen.getByText(/loading/i)).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
*/
|
|
130
|
+
});
|
|
131
|
+
`;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Generate vitest.config.ts for a Next.js project
|
|
135
|
+
*/
|
|
136
|
+
function generateTestConfig() {
|
|
137
|
+
return `import { defineConfig } from 'vitest/config';
|
|
138
|
+
import react from '@vitejs/plugin-react';
|
|
139
|
+
import path from 'path';
|
|
140
|
+
|
|
141
|
+
export default defineConfig({
|
|
142
|
+
plugins: [react()],
|
|
143
|
+
test: {
|
|
144
|
+
environment: 'jsdom',
|
|
145
|
+
globals: true,
|
|
146
|
+
setupFiles: [],
|
|
147
|
+
include: ['__tests__/**/*.{test,spec}.{ts,tsx}'],
|
|
148
|
+
exclude: ['node_modules', '.next'],
|
|
149
|
+
},
|
|
150
|
+
resolve: {
|
|
151
|
+
alias: {
|
|
152
|
+
'@': path.resolve(__dirname, './src'),
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
`;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get a sample value for a field type (for test data)
|
|
160
|
+
*/
|
|
161
|
+
function getSampleValue(field) {
|
|
162
|
+
switch (field.type) {
|
|
163
|
+
case 'String':
|
|
164
|
+
return `Test ${field.name}`;
|
|
165
|
+
case 'Int':
|
|
166
|
+
return '42';
|
|
167
|
+
case 'Float':
|
|
168
|
+
case 'Decimal':
|
|
169
|
+
return '3.14';
|
|
170
|
+
case 'Boolean':
|
|
171
|
+
return 'true';
|
|
172
|
+
case 'DateTime':
|
|
173
|
+
return new Date().toISOString();
|
|
174
|
+
case 'Json':
|
|
175
|
+
return '{}';
|
|
176
|
+
default:
|
|
177
|
+
return `test-${field.name}`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=test-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-generator.js","sourceRoot":"","sources":["../src/test-generator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,4CAgFC;AAKD,wDAuCC;AAKD,gDAqBC;AAzJD;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAmB;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACvF,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvD,OAAO;;;;;YAKG,IAAI;;;iBAGC,KAAK;iDAC2B,KAAK;;;;;;;;;;;;kBAYpC,KAAK,0BAA0B,KAAK;iDACL,KAAK;;;6BAGzB,UAAU;;;;;;EAMrC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,oCAAoC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;kBAInE,KAAK;iDAC0B,KAAK;;;;;;;;;iBASrC,KAAK;iDAC2B,KAAK;;;;;;;;;;iBAUrC,KAAK;iDAC2B,KAAK;;;;;;;;CAQrD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,MAAmB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjC,OAAO;;;;;;YAMG,IAAI,oBAAoB,KAAK;;YAE7B,IAAI;;;;;;;;;cASF,IAAI;;;;sCAIoB,IAAI;cAC5B,IAAI;EAChB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,IAAI;uCACZ,CAAC,CAAC,IAAI,2BAA2B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;cAItE,IAAI;;;;;;CAMjB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;CAmBR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAiB;IACvC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd;YACE,OAAO,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helix Theme Engine - Data-driven theme definitions
|
|
3
|
+
* V2.0 - Replaces hardcoded Deep Void CSS with selectable themes
|
|
4
|
+
*/
|
|
5
|
+
export interface HelixTheme {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
css: {
|
|
9
|
+
themeVars: string;
|
|
10
|
+
body: string;
|
|
11
|
+
glass: string;
|
|
12
|
+
inputs: string;
|
|
13
|
+
inputFocus: string;
|
|
14
|
+
inputPlaceholder: string;
|
|
15
|
+
};
|
|
16
|
+
/** Tailwind class hints for generated UI components */
|
|
17
|
+
componentClasses: {
|
|
18
|
+
primaryButton: string;
|
|
19
|
+
secondaryButton: string;
|
|
20
|
+
card: string;
|
|
21
|
+
text: string;
|
|
22
|
+
textMuted: string;
|
|
23
|
+
heading: string;
|
|
24
|
+
badge: string;
|
|
25
|
+
statusColors: {
|
|
26
|
+
success: string;
|
|
27
|
+
warning: string;
|
|
28
|
+
info: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare const THEMES: Record<string, HelixTheme>;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve a theme name from a .helix AST view property.
|
|
35
|
+
* Handles case-insensitive matching and common aliases.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveTheme(themeName?: string): HelixTheme;
|
|
38
|
+
/**
|
|
39
|
+
* Generate the full globals.css content for a given theme.
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateThemeCSS(theme: HelixTheme): string;
|
|
42
|
+
/**
|
|
43
|
+
* Get complete CSS variables string for a theme by name.
|
|
44
|
+
* Resolves aliases (e.g. "dark" -> glassmorphism, "pro" -> professional).
|
|
45
|
+
*/
|
|
46
|
+
export declare function getThemeCSS(themeName?: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Get Tailwind class mappings for UI components by theme name.
|
|
49
|
+
* Returns classes for cards, buttons, inputs, text, and backgrounds.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getThemeClasses(themeName?: string): HelixTheme['componentClasses'];
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/themes/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE;QACH,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,uDAAuD;IACvD,gBAAgB,EAAE;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KAClE,CAAC;CACH;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAoM7C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CA4B3D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAgB1D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAGlF"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helix Theme Engine - Data-driven theme definitions
|
|
4
|
+
* V2.0 - Replaces hardcoded Deep Void CSS with selectable themes
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.THEMES = void 0;
|
|
8
|
+
exports.resolveTheme = resolveTheme;
|
|
9
|
+
exports.generateThemeCSS = generateThemeCSS;
|
|
10
|
+
exports.getThemeCSS = getThemeCSS;
|
|
11
|
+
exports.getThemeClasses = getThemeClasses;
|
|
12
|
+
exports.THEMES = {
|
|
13
|
+
glassmorphism: {
|
|
14
|
+
name: 'Glassmorphism',
|
|
15
|
+
description: 'Dark gradient, gold accent — the Deep Void default',
|
|
16
|
+
css: {
|
|
17
|
+
themeVars: `@theme {
|
|
18
|
+
--color-deep-void: #0f0f1a;
|
|
19
|
+
--color-helix-gold: #FFD700;
|
|
20
|
+
}`,
|
|
21
|
+
body: `body {
|
|
22
|
+
background: linear-gradient(135deg, #0f0f1a 0%, #1a0a2e 50%, #0d1117 100%);
|
|
23
|
+
color: white;
|
|
24
|
+
min-height: 100vh;
|
|
25
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
26
|
+
}`,
|
|
27
|
+
glass: `.glass {
|
|
28
|
+
background: rgba(255, 255, 255, 0.05);
|
|
29
|
+
backdrop-filter: blur(10px);
|
|
30
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
31
|
+
border-radius: 0.75rem;
|
|
32
|
+
}`,
|
|
33
|
+
inputs: `input, select, textarea {
|
|
34
|
+
background: rgba(255, 255, 255, 0.05) !important;
|
|
35
|
+
border: 1px solid rgba(255, 255, 255, 0.1) !important;
|
|
36
|
+
color: white !important;
|
|
37
|
+
border-radius: 0.375rem;
|
|
38
|
+
padding: 0.75rem;
|
|
39
|
+
}`,
|
|
40
|
+
inputFocus: `input:focus, select:focus, textarea:focus {
|
|
41
|
+
outline: none !important;
|
|
42
|
+
border-color: #f59e0b !important;
|
|
43
|
+
box-shadow: 0 0 0 1px #f59e0b !important;
|
|
44
|
+
}`,
|
|
45
|
+
inputPlaceholder: `input::placeholder, textarea::placeholder {
|
|
46
|
+
color: rgba(255, 255, 255, 0.5);
|
|
47
|
+
}`,
|
|
48
|
+
},
|
|
49
|
+
componentClasses: {
|
|
50
|
+
primaryButton: 'bg-indigo-600 hover:bg-indigo-500 text-white',
|
|
51
|
+
secondaryButton: 'bg-white/5 hover:bg-white/10 border border-white/10 text-gray-300',
|
|
52
|
+
card: 'glass',
|
|
53
|
+
text: 'text-white',
|
|
54
|
+
textMuted: 'text-gray-400',
|
|
55
|
+
heading: 'text-white',
|
|
56
|
+
badge: 'bg-amber-500/20 text-amber-300 border border-amber-500/30',
|
|
57
|
+
statusColors: { success: '#10b981', warning: '#f59e0b', info: '#6366f1' },
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
professional: {
|
|
61
|
+
name: 'Professional',
|
|
62
|
+
description: 'Clean white, indigo accent — SaaS / business apps',
|
|
63
|
+
css: {
|
|
64
|
+
themeVars: `@theme {
|
|
65
|
+
--color-primary: #4f46e5;
|
|
66
|
+
--color-primary-light: #6366f1;
|
|
67
|
+
--color-surface: #ffffff;
|
|
68
|
+
--color-surface-alt: #f8fafc;
|
|
69
|
+
}`,
|
|
70
|
+
body: `body {
|
|
71
|
+
background: #f8fafc;
|
|
72
|
+
color: #1e293b;
|
|
73
|
+
min-height: 100vh;
|
|
74
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
75
|
+
}`,
|
|
76
|
+
glass: `.glass {
|
|
77
|
+
background: #ffffff;
|
|
78
|
+
border: 1px solid #e2e8f0;
|
|
79
|
+
border-radius: 0.75rem;
|
|
80
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
81
|
+
}`,
|
|
82
|
+
inputs: `input, select, textarea {
|
|
83
|
+
background: #ffffff !important;
|
|
84
|
+
border: 1px solid #d1d5db !important;
|
|
85
|
+
color: #1e293b !important;
|
|
86
|
+
border-radius: 0.375rem;
|
|
87
|
+
padding: 0.75rem;
|
|
88
|
+
}`,
|
|
89
|
+
inputFocus: `input:focus, select:focus, textarea:focus {
|
|
90
|
+
outline: none !important;
|
|
91
|
+
border-color: #4f46e5 !important;
|
|
92
|
+
box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.2) !important;
|
|
93
|
+
}`,
|
|
94
|
+
inputPlaceholder: `input::placeholder, textarea::placeholder {
|
|
95
|
+
color: #9ca3af;
|
|
96
|
+
}`,
|
|
97
|
+
},
|
|
98
|
+
componentClasses: {
|
|
99
|
+
primaryButton: 'bg-indigo-600 hover:bg-indigo-700 text-white',
|
|
100
|
+
secondaryButton: 'bg-white hover:bg-gray-50 border border-gray-300 text-gray-700',
|
|
101
|
+
card: 'glass',
|
|
102
|
+
text: 'text-slate-800',
|
|
103
|
+
textMuted: 'text-slate-500',
|
|
104
|
+
heading: 'text-slate-900',
|
|
105
|
+
badge: 'bg-indigo-50 text-indigo-700 border border-indigo-200',
|
|
106
|
+
statusColors: { success: '#059669', warning: '#d97706', info: '#4f46e5' },
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
minimal: {
|
|
110
|
+
name: 'Minimal',
|
|
111
|
+
description: 'Pure white, black accent — productivity / tools',
|
|
112
|
+
css: {
|
|
113
|
+
themeVars: `@theme {
|
|
114
|
+
--color-primary: #000000;
|
|
115
|
+
--color-surface: #ffffff;
|
|
116
|
+
--color-border: #e5e5e5;
|
|
117
|
+
}`,
|
|
118
|
+
body: `body {
|
|
119
|
+
background: #ffffff;
|
|
120
|
+
color: #171717;
|
|
121
|
+
min-height: 100vh;
|
|
122
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
123
|
+
}`,
|
|
124
|
+
glass: `.glass {
|
|
125
|
+
background: #ffffff;
|
|
126
|
+
border: 1px solid #e5e5e5;
|
|
127
|
+
border-radius: 0.5rem;
|
|
128
|
+
}`,
|
|
129
|
+
inputs: `input, select, textarea {
|
|
130
|
+
background: #fafafa !important;
|
|
131
|
+
border: 1px solid #e5e5e5 !important;
|
|
132
|
+
color: #171717 !important;
|
|
133
|
+
border-radius: 0.375rem;
|
|
134
|
+
padding: 0.75rem;
|
|
135
|
+
}`,
|
|
136
|
+
inputFocus: `input:focus, select:focus, textarea:focus {
|
|
137
|
+
outline: none !important;
|
|
138
|
+
border-color: #000000 !important;
|
|
139
|
+
box-shadow: 0 0 0 1px #000000 !important;
|
|
140
|
+
}`,
|
|
141
|
+
inputPlaceholder: `input::placeholder, textarea::placeholder {
|
|
142
|
+
color: #a3a3a3;
|
|
143
|
+
}`,
|
|
144
|
+
},
|
|
145
|
+
componentClasses: {
|
|
146
|
+
primaryButton: 'bg-black hover:bg-neutral-800 text-white',
|
|
147
|
+
secondaryButton: 'bg-white hover:bg-neutral-50 border border-neutral-300 text-neutral-700',
|
|
148
|
+
card: 'glass',
|
|
149
|
+
text: 'text-neutral-900',
|
|
150
|
+
textMuted: 'text-neutral-500',
|
|
151
|
+
heading: 'text-black',
|
|
152
|
+
badge: 'bg-neutral-100 text-neutral-700 border border-neutral-200',
|
|
153
|
+
statusColors: { success: '#16a34a', warning: '#ca8a04', info: '#171717' },
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
vibrant: {
|
|
157
|
+
name: 'Vibrant',
|
|
158
|
+
description: 'Gradient UI, pink accent — social / consumer apps',
|
|
159
|
+
css: {
|
|
160
|
+
themeVars: `@theme {
|
|
161
|
+
--color-primary: #ec4899;
|
|
162
|
+
--color-primary-light: #f472b6;
|
|
163
|
+
--color-accent: #8b5cf6;
|
|
164
|
+
}`,
|
|
165
|
+
body: `body {
|
|
166
|
+
background: linear-gradient(135deg, #fdf2f8 0%, #ede9fe 50%, #f0f9ff 100%);
|
|
167
|
+
color: #1e1b4b;
|
|
168
|
+
min-height: 100vh;
|
|
169
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
170
|
+
}`,
|
|
171
|
+
glass: `.glass {
|
|
172
|
+
background: rgba(255, 255, 255, 0.7);
|
|
173
|
+
backdrop-filter: blur(12px);
|
|
174
|
+
border: 1px solid rgba(236, 72, 153, 0.15);
|
|
175
|
+
border-radius: 1rem;
|
|
176
|
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.04);
|
|
177
|
+
}`,
|
|
178
|
+
inputs: `input, select, textarea {
|
|
179
|
+
background: rgba(255, 255, 255, 0.8) !important;
|
|
180
|
+
border: 1px solid rgba(236, 72, 153, 0.2) !important;
|
|
181
|
+
color: #1e1b4b !important;
|
|
182
|
+
border-radius: 0.5rem;
|
|
183
|
+
padding: 0.75rem;
|
|
184
|
+
}`,
|
|
185
|
+
inputFocus: `input:focus, select:focus, textarea:focus {
|
|
186
|
+
outline: none !important;
|
|
187
|
+
border-color: #ec4899 !important;
|
|
188
|
+
box-shadow: 0 0 0 2px rgba(236, 72, 153, 0.2) !important;
|
|
189
|
+
}`,
|
|
190
|
+
inputPlaceholder: `input::placeholder, textarea::placeholder {
|
|
191
|
+
color: #a78bfa;
|
|
192
|
+
}`,
|
|
193
|
+
},
|
|
194
|
+
componentClasses: {
|
|
195
|
+
primaryButton: 'bg-gradient-to-r from-pink-500 to-violet-500 hover:from-pink-600 hover:to-violet-600 text-white',
|
|
196
|
+
secondaryButton: 'bg-white/70 hover:bg-white border border-pink-200 text-pink-700',
|
|
197
|
+
card: 'glass',
|
|
198
|
+
text: 'text-indigo-950',
|
|
199
|
+
textMuted: 'text-indigo-400',
|
|
200
|
+
heading: 'text-indigo-900',
|
|
201
|
+
badge: 'bg-pink-100 text-pink-700 border border-pink-200',
|
|
202
|
+
statusColors: { success: '#10b981', warning: '#f59e0b', info: '#8b5cf6' },
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* Resolve a theme name from a .helix AST view property.
|
|
208
|
+
* Handles case-insensitive matching and common aliases.
|
|
209
|
+
*/
|
|
210
|
+
function resolveTheme(themeName) {
|
|
211
|
+
if (!themeName)
|
|
212
|
+
return exports.THEMES.glassmorphism;
|
|
213
|
+
const normalized = themeName.toLowerCase().replace(/[\s-_]/g, '');
|
|
214
|
+
const aliases = {
|
|
215
|
+
'glassmorphism': 'glassmorphism',
|
|
216
|
+
'glass': 'glassmorphism',
|
|
217
|
+
'deepvoid': 'glassmorphism',
|
|
218
|
+
'dark': 'glassmorphism',
|
|
219
|
+
'professional': 'professional',
|
|
220
|
+
'pro': 'professional',
|
|
221
|
+
'saas': 'professional',
|
|
222
|
+
'business': 'professional',
|
|
223
|
+
'clean': 'professional',
|
|
224
|
+
'minimal': 'minimal',
|
|
225
|
+
'minimalist': 'minimal',
|
|
226
|
+
'simple': 'minimal',
|
|
227
|
+
'productivity': 'minimal',
|
|
228
|
+
'vibrant': 'vibrant',
|
|
229
|
+
'colorful': 'vibrant',
|
|
230
|
+
'social': 'vibrant',
|
|
231
|
+
'gradient': 'vibrant',
|
|
232
|
+
'fun': 'vibrant',
|
|
233
|
+
};
|
|
234
|
+
const resolved = aliases[normalized];
|
|
235
|
+
return resolved ? exports.THEMES[resolved] : exports.THEMES.glassmorphism;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Generate the full globals.css content for a given theme.
|
|
239
|
+
*/
|
|
240
|
+
function generateThemeCSS(theme) {
|
|
241
|
+
return `@import "tailwindcss";
|
|
242
|
+
@source "../**/*.tsx";
|
|
243
|
+
|
|
244
|
+
${theme.css.themeVars}
|
|
245
|
+
|
|
246
|
+
${theme.css.body}
|
|
247
|
+
|
|
248
|
+
${theme.css.glass}
|
|
249
|
+
|
|
250
|
+
${theme.css.inputs}
|
|
251
|
+
|
|
252
|
+
${theme.css.inputFocus}
|
|
253
|
+
|
|
254
|
+
${theme.css.inputPlaceholder}
|
|
255
|
+
`;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get complete CSS variables string for a theme by name.
|
|
259
|
+
* Resolves aliases (e.g. "dark" -> glassmorphism, "pro" -> professional).
|
|
260
|
+
*/
|
|
261
|
+
function getThemeCSS(themeName) {
|
|
262
|
+
const theme = resolveTheme(themeName);
|
|
263
|
+
return generateThemeCSS(theme);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get Tailwind class mappings for UI components by theme name.
|
|
267
|
+
* Returns classes for cards, buttons, inputs, text, and backgrounds.
|
|
268
|
+
*/
|
|
269
|
+
function getThemeClasses(themeName) {
|
|
270
|
+
const theme = resolveTheme(themeName);
|
|
271
|
+
return theme.componentClasses;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/themes/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helix Language - Type Definitions and System Prompts
|
|
3
|
+
* v11.0 - With Deep Research Capabilities
|
|
4
|
+
*/
|
|
5
|
+
export declare const HELIX_SYNTAX_GUIDE = "\nHELIX SYNTAX RULES:\n1. 'strand Name {}' defines a stateful entity.\n2. 'field name: Type' defines data structure. Types: String, Int, Float, Boolean, DateTime.\n3. 'relation name: OtherStrand' defines a belongs-to relationship (foreign key).\n4. 'relation name: OtherStrand[]' defines a has-many relationship.\n5. 'strategy Name: Action -> Fallback' defines error handling.\n6. 'view Name {}' defines UI layout.\n7. 'theme: ThemeName' in a view selects the visual theme.\n Available themes: Glassmorphism (default), Professional, Minimal, Vibrant.\n Example: theme: Professional\n\nEXAMPLE:\nstrand Customer {\n field name: String\n field email: String\n relation orders: Order[]\n}\n\nstrand Order {\n field total: Float\n field status: String\n relation customer: Customer\n}\n\nview OrderBoard {\n list: Order.all()\n theme: Professional\n}\n";
|
|
6
|
+
export declare const RESEARCHER_SYSTEM_PROMPT = "\nYou are the Helix Lead Researcher.\nGoal: Analyze the requested domain deeply.\nOutput: A structured Markdown report containing:\n- Key Data Entities & Fields (e.g., specific schemas).\n- Critical Features (e.g., standard industry requirements).\n- \"Gotchas\" & Constraints (e.g., specific regulatory or physical limits).\n- User Interface trends for this domain.\nDO NOT write code. Write a System Analysis Report.\n";
|
|
7
|
+
export declare const ARCHITECT_SYSTEM_PROMPT = "\nYou are the Helix Architect.\nGoal: Convert vague user requests into valid 'Helix' syntax blueprints.\nOutput: ONLY the .helix code. No markdown fences.\n\nWhen Context is provided:\n- Use the research to inform the fields and logic of the Helix Blueprint.\n- If the research mentions specific constraints (e.g., service intervals, regulatory limits), include them in the 'strand'.\n- Reference specific data models and entities from the research.\n\n\nHELIX SYNTAX RULES:\n1. 'strand Name {}' defines a stateful entity.\n2. 'field name: Type' defines data structure. Types: String, Int, Float, Boolean, DateTime.\n3. 'relation name: OtherStrand' defines a belongs-to relationship (foreign key).\n4. 'relation name: OtherStrand[]' defines a has-many relationship.\n5. 'strategy Name: Action -> Fallback' defines error handling.\n6. 'view Name {}' defines UI layout.\n7. 'theme: ThemeName' in a view selects the visual theme.\n Available themes: Glassmorphism (default), Professional, Minimal, Vibrant.\n Example: theme: Professional\n\nEXAMPLE:\nstrand Customer {\n field name: String\n field email: String\n relation orders: Order[]\n}\n\nstrand Order {\n field total: Float\n field status: String\n relation customer: Customer\n}\n\nview OrderBoard {\n list: Order.all()\n theme: Professional\n}\n\n";
|
|
8
|
+
export declare const COMPILER_SYSTEM_PROMPT = "\nYou are the Helix Compiler.\nGoal: Transpile 'Helix' blueprints into a single React (Next.js) + TypeScript + Tailwind file.\nRules:\n- Implement 'strand' as React Hooks (swr/tanstack).\n- Implement 'strategy' as explicit try/catch/retry logic.\n- Implement 'view' as Tailwind JSX.\nOutput: ONLY the .tsx code. No markdown fences.\n";
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,eAAO,MAAM,kBAAkB,i2BA6B9B,CAAC;AAMF,eAAO,MAAM,wBAAwB,yaASpC,CAAC;AAMF,eAAO,MAAM,uBAAuB,wyCAWnC,CAAC;AAMF,eAAO,MAAM,sBAAsB,kVAQlC,CAAC"}
|