@takyonic/cli 1.0.2
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 +37 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +107 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +98 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +2 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +77 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +100 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +3 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +135 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/dsl-to-json.d.ts +28 -0
- package/dist/dsl-to-json.d.ts.map +1 -0
- package/dist/dsl-to-json.js +69 -0
- package/dist/dsl-to-json.js.map +1 -0
- package/dist/generator.d.ts +19 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +161 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +36 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +234 -0
- package/dist/parser.js.map +1 -0
- package/dist/type-mapper.d.ts +17 -0
- package/dist/type-mapper.d.ts.map +1 -0
- package/dist/type-mapper.js +90 -0
- package/dist/type-mapper.js.map +1 -0
- package/generated/index.ts +89 -0
- package/package.json +33 -0
- package/src/commands/generate.ts +78 -0
- package/src/commands/init.ts +63 -0
- package/src/commands/inspect.ts +98 -0
- package/src/commands/pull.ts +68 -0
- package/src/commands/push.ts +106 -0
- package/src/dsl-to-json.ts +99 -0
- package/src/generator.ts +178 -0
- package/src/index.ts +32 -0
- package/src/parser.ts +285 -0
- package/src/test-bulk.ts +38 -0
- package/src/test-load.ts +28 -0
- package/src/type-mapper.ts +90 -0
- package/tsconfig.json +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Takyonic CLI
|
|
2
|
+
|
|
3
|
+
Developer tools for Takyonic Smart Cache Proxy.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Set the `DATABASE_URL` environment variable:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
export DATABASE_URL=postgres://takyonic:secret@localhost:5432/takyonic_db
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or create a `.env` file:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cp .env.example .env
|
|
23
|
+
# Edit .env with your database URL
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Commands
|
|
27
|
+
|
|
28
|
+
### Inspect Database Schema
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm run start inspect
|
|
32
|
+
# or
|
|
33
|
+
ts-node src/index.ts inspect
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This command connects to PostgreSQL and displays the database schema, including all tables, columns, and data types.
|
|
37
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,SAoExB,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.generateCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const generator_1 = require("../generator");
|
|
45
|
+
const parser_1 = require("../parser");
|
|
46
|
+
const dsl_to_json_1 = require("../dsl-to-json");
|
|
47
|
+
exports.generateCommand = new commander_1.Command('generate')
|
|
48
|
+
.description('Generate TypeScript client code from .takyonic schema file')
|
|
49
|
+
.action(async () => {
|
|
50
|
+
// Determine input file (.takyonic in project root)
|
|
51
|
+
const inputFile = path.join(process.cwd(), '.takyonic');
|
|
52
|
+
if (!fs.existsSync(inputFile)) {
|
|
53
|
+
console.error(chalk_1.default.red(`Error: ${inputFile} not found`));
|
|
54
|
+
console.error(chalk_1.default.yellow('Please run "takyonic init" to create a .takyonic file'));
|
|
55
|
+
console.error(chalk_1.default.yellow('Or run "takyonic pull" to fetch schema from server'));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
console.log(chalk_1.default.blue('⚡ Takyonic: Reading schema from .takyonic file...\n'));
|
|
60
|
+
// Read and parse DSL file
|
|
61
|
+
const fileContent = fs.readFileSync(inputFile, 'utf-8');
|
|
62
|
+
const dslSchema = (0, parser_1.parseTakyonicSchema)(fileContent);
|
|
63
|
+
if (!dslSchema.tables || dslSchema.tables.length === 0) {
|
|
64
|
+
console.log(chalk_1.default.yellow('No tables found in schema'));
|
|
65
|
+
console.log(chalk_1.default.yellow('Cannot generate code without tables.'));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
// Convert DSL to JSON format for generator
|
|
69
|
+
const schema = (0, dsl_to_json_1.dslToJson)(dslSchema);
|
|
70
|
+
console.log(chalk_1.default.blue('⚡ Takyonic: Generating TypeScript code...\n'));
|
|
71
|
+
// Generate TypeScript code
|
|
72
|
+
const generatedCode = (0, generator_1.generateTypeScript)(schema);
|
|
73
|
+
// Determine output directory (cli/generated)
|
|
74
|
+
const outputDir = path.join(process.cwd(), 'generated');
|
|
75
|
+
const outputFile = path.join(outputDir, 'index.ts');
|
|
76
|
+
// Create directory if it doesn't exist
|
|
77
|
+
if (!fs.existsSync(outputDir)) {
|
|
78
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
79
|
+
console.log(chalk_1.default.green(`Created directory: ${outputDir}`));
|
|
80
|
+
}
|
|
81
|
+
// Write file
|
|
82
|
+
fs.writeFileSync(outputFile, generatedCode, 'utf-8');
|
|
83
|
+
console.log(chalk_1.default.green(`✓ Generated TypeScript client code`));
|
|
84
|
+
console.log(chalk_1.default.gray(` Output: ${outputFile}`));
|
|
85
|
+
console.log(chalk_1.default.gray(` Tables: ${schema.length}`));
|
|
86
|
+
const totalColumns = schema.reduce((sum, table) => sum + table.columns.length, 0);
|
|
87
|
+
console.log(chalk_1.default.gray(` Columns: ${totalColumns}\n`));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error(chalk_1.default.red('⚡ Takyonic: Error generating code:'));
|
|
91
|
+
if (error instanceof parser_1.ParseError) {
|
|
92
|
+
console.error(chalk_1.default.red(`Parse error: ${error.message}`));
|
|
93
|
+
if (error.line) {
|
|
94
|
+
console.error(chalk_1.default.yellow(` Line: ${error.line}`));
|
|
95
|
+
}
|
|
96
|
+
console.error(chalk_1.default.yellow('Please check your .takyonic file syntax'));
|
|
97
|
+
}
|
|
98
|
+
else if (error instanceof Error) {
|
|
99
|
+
console.error(chalk_1.default.red(error.message));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.error(chalk_1.default.red(String(error)));
|
|
103
|
+
}
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,eAAO,MAAM,WAAW,SAiCpB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.initCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const DEFAULT_TAKYONIC_FILE = `// Takyonic Core Configuration
|
|
45
|
+
engine {
|
|
46
|
+
provider = "takyonic"
|
|
47
|
+
db = env("DATABASE_URL")
|
|
48
|
+
cache = "in-memory"
|
|
49
|
+
port = 8080
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Takyonic Data Definitions
|
|
53
|
+
table products {
|
|
54
|
+
id string @primary
|
|
55
|
+
name string
|
|
56
|
+
price int @default(0)
|
|
57
|
+
data json
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
table orders {
|
|
61
|
+
id string @primary
|
|
62
|
+
amount float
|
|
63
|
+
status string @default("pending")
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
exports.initCommand = new commander_1.Command('init')
|
|
67
|
+
.description('Initialize a new Takyonic project with a .takyonic schema file')
|
|
68
|
+
.action(async () => {
|
|
69
|
+
const takyonicFile = path.join(process.cwd(), '.takyonic');
|
|
70
|
+
// Check if .takyonic file already exists
|
|
71
|
+
if (fs.existsSync(takyonicFile)) {
|
|
72
|
+
console.error(chalk_1.default.red('Error: .takyonic file already exists'));
|
|
73
|
+
console.error(chalk_1.default.yellow(` File: ${takyonicFile}`));
|
|
74
|
+
console.error(chalk_1.default.yellow(' Remove it first or use a different directory\n'));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
// Write default .takyonic file
|
|
79
|
+
fs.writeFileSync(takyonicFile, DEFAULT_TAKYONIC_FILE, 'utf-8');
|
|
80
|
+
console.log(chalk_1.default.green('✓ Takyonic project initialized'));
|
|
81
|
+
console.log(chalk_1.default.gray(` Created: ${takyonicFile}\n`));
|
|
82
|
+
console.log(chalk_1.default.blue('⚡ Next steps:'));
|
|
83
|
+
console.log(chalk_1.default.gray(' 1. Edit .takyonic to define your tables'));
|
|
84
|
+
console.log(chalk_1.default.gray(' 2. Run "takyonic push" to sync schema to server'));
|
|
85
|
+
console.log(chalk_1.default.gray(' 3. Run "takyonic generate" to create TypeScript client\n'));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error(chalk_1.default.red('⚡ Takyonic: Error initializing project:'));
|
|
89
|
+
if (error instanceof Error) {
|
|
90
|
+
console.error(chalk_1.default.red(error.message));
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.error(chalk_1.default.red(String(error)));
|
|
94
|
+
}
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB7B,CAAC;AAEW,QAAA,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE3D,yCAAyC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,WAAW,YAAY,EAAE,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,+BAA+B;QAC/B,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;QAE/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,YAAY,IAAI,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;IAExF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACpE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAaA,wBAAsB,cAAc,kBAoFnC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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.inspectCommand = inspectCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
async function inspectCommand() {
|
|
9
|
+
const takyonicUrl = process.env.TAKYONIC_URL || 'http://localhost:8080';
|
|
10
|
+
const apiKey = process.env.TAKYONIC_API_KEY;
|
|
11
|
+
if (!apiKey) {
|
|
12
|
+
console.error(chalk_1.default.red('Error: TAKYONIC_API_KEY environment variable is not set'));
|
|
13
|
+
console.error(chalk_1.default.yellow('Please set TAKYONIC_API_KEY to your API key'));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
console.log(chalk_1.default.blue('⚡ Takyonic: Fetching schema from server...\n'));
|
|
18
|
+
const response = await fetch(`${takyonicUrl}/v1/schema`, {
|
|
19
|
+
headers: {
|
|
20
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
if (response.status === 404) {
|
|
25
|
+
console.error(chalk_1.default.red('Error: Server endpoint not found'));
|
|
26
|
+
console.error(chalk_1.default.yellow('Please ensure Takyonic server is running and accessible'));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const errorText = await response.text();
|
|
30
|
+
console.error(chalk_1.default.red(`Error: Server returned status ${response.status}`));
|
|
31
|
+
console.error(chalk_1.default.red(errorText));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const schema = (await response.json());
|
|
35
|
+
if (schema.length === 0) {
|
|
36
|
+
console.log(chalk_1.default.yellow('No tables found in the database'));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Display schema
|
|
40
|
+
console.log(chalk_1.default.bold.cyan('Database Schema:\n'));
|
|
41
|
+
for (const table of schema) {
|
|
42
|
+
console.log(chalk_1.default.bold.magenta(`Table: ${table.name}`));
|
|
43
|
+
console.log(chalk_1.default.gray('─'.repeat(80)));
|
|
44
|
+
// Table header
|
|
45
|
+
console.log(chalk_1.default.bold(`${'Column Name'.padEnd(30)} ${'Data Type'.padEnd(20)} ${'Nullable'.padEnd(10)}`));
|
|
46
|
+
console.log(chalk_1.default.gray('─'.repeat(80)));
|
|
47
|
+
// Columns
|
|
48
|
+
for (const col of table.columns) {
|
|
49
|
+
const nullable = col.nullable
|
|
50
|
+
? chalk_1.default.yellow('YES')
|
|
51
|
+
: chalk_1.default.green('NO');
|
|
52
|
+
console.log(`${col.name.padEnd(30)} ${col.data_type.padEnd(20)} ${nullable}`);
|
|
53
|
+
}
|
|
54
|
+
console.log('');
|
|
55
|
+
}
|
|
56
|
+
const totalColumns = schema.reduce((sum, table) => sum + table.columns.length, 0);
|
|
57
|
+
console.log(chalk_1.default.gray(`Total: ${schema.length} table(s), ${totalColumns} column(s)\n`));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error(chalk_1.default.red('⚡ Takyonic: Error fetching schema:'));
|
|
61
|
+
if (error instanceof Error) {
|
|
62
|
+
if (error.message.includes('fetch')) {
|
|
63
|
+
console.error(chalk_1.default.red('Failed to connect to Takyonic server'));
|
|
64
|
+
console.error(chalk_1.default.yellow(`Please ensure the server is running at ${takyonicUrl}`));
|
|
65
|
+
console.error(chalk_1.default.yellow('You can set TAKYONIC_URL environment variable to specify a different URL'));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
console.error(chalk_1.default.red(error.message));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.error(chalk_1.default.red(String(error)));
|
|
73
|
+
}
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SA6DpB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.pullCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const sdk_1 = require("@takyonic/sdk");
|
|
45
|
+
exports.pullCommand = new commander_1.Command('pull')
|
|
46
|
+
.description('Pull schema from Takyonic server and save to .takyonic file')
|
|
47
|
+
.action(async () => {
|
|
48
|
+
const takyonicUrl = process.env.TAKYONIC_URL || 'http://localhost:8080';
|
|
49
|
+
const apiKey = process.env.TAKYONIC_API_KEY;
|
|
50
|
+
if (!apiKey) {
|
|
51
|
+
console.error(chalk_1.default.red('Error: TAKYONIC_API_KEY environment variable is not set'));
|
|
52
|
+
console.error(chalk_1.default.yellow('Please set TAKYONIC_API_KEY to your API key'));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
console.log(chalk_1.default.blue('⚡ Takyonic: Pulling schema from server...\n'));
|
|
57
|
+
// Use SDK to fetch pre-formatted DSL from server
|
|
58
|
+
const client = new sdk_1.TakyonicClient({
|
|
59
|
+
endpoint: takyonicUrl,
|
|
60
|
+
token: apiKey,
|
|
61
|
+
});
|
|
62
|
+
// Fetch the DSL string directly from the Rust backend
|
|
63
|
+
// This is the authoritative, pre-formatted schema
|
|
64
|
+
const dslContent = await client.schemaDsl();
|
|
65
|
+
if (!dslContent || dslContent.trim().length === 0) {
|
|
66
|
+
console.log(chalk_1.default.yellow('No schema found on the server'));
|
|
67
|
+
console.log(chalk_1.default.yellow('Cannot save empty schema.'));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
// Determine output file (.takyonic in project root)
|
|
71
|
+
const outputFile = path.join(process.cwd(), '.takyonic');
|
|
72
|
+
// Write the pre-formatted DSL directly to file
|
|
73
|
+
fs.writeFileSync(outputFile, dslContent, 'utf-8');
|
|
74
|
+
// Count tables for display
|
|
75
|
+
const tableCount = (dslContent.match(/^table\s+\w+\s*\{/gm) || []).length;
|
|
76
|
+
console.log(chalk_1.default.green(`✓ Schema pulled successfully`));
|
|
77
|
+
console.log(chalk_1.default.gray(` Output: ${outputFile}`));
|
|
78
|
+
console.log(chalk_1.default.gray(` Tables: ${tableCount}\n`));
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error(chalk_1.default.red('⚡ Takyonic: Error pulling schema:'));
|
|
82
|
+
if (error instanceof sdk_1.AuthenticationError) {
|
|
83
|
+
console.error(chalk_1.default.red('Error: Unauthorized'));
|
|
84
|
+
console.error(chalk_1.default.yellow('Please check your TAKYONIC_API_KEY'));
|
|
85
|
+
}
|
|
86
|
+
else if (error instanceof sdk_1.NetworkError) {
|
|
87
|
+
console.error(chalk_1.default.red('Failed to connect to Takyonic server'));
|
|
88
|
+
console.error(chalk_1.default.yellow(`Please ensure the server is running at ${takyonicUrl}`));
|
|
89
|
+
console.error(chalk_1.default.yellow('You can set TAKYONIC_URL environment variable to specify a different URL'));
|
|
90
|
+
}
|
|
91
|
+
else if (error instanceof Error) {
|
|
92
|
+
console.error(chalk_1.default.red(error.message));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.error(chalk_1.default.red(String(error)));
|
|
96
|
+
}
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,WAAW,SAiGpB,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.pushCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const sdk_1 = require("@takyonic/sdk");
|
|
45
|
+
const parser_1 = require("../parser");
|
|
46
|
+
const dsl_to_json_1 = require("../dsl-to-json");
|
|
47
|
+
exports.pushCommand = new commander_1.Command('push')
|
|
48
|
+
.description('Push schema from .takyonic file to Takyonic server')
|
|
49
|
+
.action(async () => {
|
|
50
|
+
const takyonicUrl = process.env.TAKYONIC_URL || 'http://localhost:8080';
|
|
51
|
+
const adminSecret = process.env.TAKYONIC_ADMIN_SECRET;
|
|
52
|
+
if (!adminSecret) {
|
|
53
|
+
console.error(chalk_1.default.red('Error: TAKYONIC_ADMIN_SECRET environment variable is not set'));
|
|
54
|
+
console.error(chalk_1.default.yellow('Please set TAKYONIC_ADMIN_SECRET to your admin secret'));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
// Determine input file (.takyonic in project root)
|
|
58
|
+
const inputFile = path.join(process.cwd(), '.takyonic');
|
|
59
|
+
if (!fs.existsSync(inputFile)) {
|
|
60
|
+
console.error(chalk_1.default.red(`Error: ${inputFile} not found`));
|
|
61
|
+
console.error(chalk_1.default.yellow('Please run "takyonic init" to create a .takyonic file'));
|
|
62
|
+
console.error(chalk_1.default.yellow('Or run "takyonic pull" to fetch schema from server'));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
console.log(chalk_1.default.blue('⚡ Takyonic: Reading schema from .takyonic file...\n'));
|
|
67
|
+
// Read and parse DSL file
|
|
68
|
+
const fileContent = fs.readFileSync(inputFile, 'utf-8');
|
|
69
|
+
const dslSchema = (0, parser_1.parseTakyonicSchema)(fileContent);
|
|
70
|
+
if (!dslSchema.tables || dslSchema.tables.length === 0) {
|
|
71
|
+
console.error(chalk_1.default.red('Error: No tables found in schema'));
|
|
72
|
+
console.error(chalk_1.default.yellow('Please define at least one table in your .takyonic file'));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
// Convert DSL to JSON format for server
|
|
76
|
+
const schema = (0, dsl_to_json_1.dslToJson)(dslSchema);
|
|
77
|
+
console.log(chalk_1.default.blue('⚡ Takyonic Engine: Synchronizing schema...\n'));
|
|
78
|
+
console.log(chalk_1.default.gray(` Tables: ${schema.length}\n`));
|
|
79
|
+
// Use AdminClient from SDK to push schema
|
|
80
|
+
const admin = new sdk_1.AdminClient({
|
|
81
|
+
endpoint: takyonicUrl,
|
|
82
|
+
adminSecret: adminSecret,
|
|
83
|
+
});
|
|
84
|
+
const result = await admin.migrate(schema);
|
|
85
|
+
console.log(chalk_1.default.green(`✓ Migration completed successfully`));
|
|
86
|
+
console.log(chalk_1.default.gray(` Server: ${takyonicUrl}`));
|
|
87
|
+
if (result.tables_created && result.tables_created.length > 0) {
|
|
88
|
+
console.log(chalk_1.default.green(` Tables created: ${result.tables_created.join(', ')}`));
|
|
89
|
+
}
|
|
90
|
+
if (result.columns_added && Object.keys(result.columns_added).length > 0) {
|
|
91
|
+
for (const [table, columns] of Object.entries(result.columns_added)) {
|
|
92
|
+
console.log(chalk_1.default.yellow(` Columns added to ${table}: ${columns.join(', ')}`));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (result.tables_updated && result.tables_updated.length > 0) {
|
|
96
|
+
console.log(chalk_1.default.gray(` Tables updated: ${result.tables_updated.join(', ')}`));
|
|
97
|
+
}
|
|
98
|
+
if (result.message) {
|
|
99
|
+
console.log(chalk_1.default.gray(` ${result.message}\n`));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log(); // New line
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error(chalk_1.default.red('⚡ Takyonic: Error pushing schema:'));
|
|
107
|
+
if (error instanceof parser_1.ParseError) {
|
|
108
|
+
console.error(chalk_1.default.red(`Parse error: ${error.message}`));
|
|
109
|
+
if (error.line) {
|
|
110
|
+
console.error(chalk_1.default.yellow(` Line: ${error.line}`));
|
|
111
|
+
}
|
|
112
|
+
console.error(chalk_1.default.yellow('Please check your .takyonic file syntax'));
|
|
113
|
+
}
|
|
114
|
+
else if (error instanceof sdk_1.AuthenticationError) {
|
|
115
|
+
console.error(chalk_1.default.red('Error: Unauthorized'));
|
|
116
|
+
console.error(chalk_1.default.yellow('Please check your TAKYONIC_ADMIN_SECRET'));
|
|
117
|
+
}
|
|
118
|
+
else if (error instanceof sdk_1.ValidationError) {
|
|
119
|
+
console.error(chalk_1.default.red(`Validation error: ${error.message}`));
|
|
120
|
+
}
|
|
121
|
+
else if (error instanceof sdk_1.NetworkError) {
|
|
122
|
+
console.error(chalk_1.default.red('Failed to connect to Takyonic server'));
|
|
123
|
+
console.error(chalk_1.default.yellow(`Please ensure the server is running at ${takyonicUrl}`));
|
|
124
|
+
console.error(chalk_1.default.yellow('You can set TAKYONIC_URL environment variable to specify a different URL'));
|
|
125
|
+
}
|
|
126
|
+
else if (error instanceof Error) {
|
|
127
|
+
console.error(chalk_1.default.red(error.message));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.error(chalk_1.default.red(String(error)));
|
|
131
|
+
}
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
|