@ketrics/ketrics-cli 0.1.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 +326 -0
- package/dist/bin/ketrics.d.ts +8 -0
- package/dist/bin/ketrics.d.ts.map +1 -0
- package/dist/bin/ketrics.js +12 -0
- package/dist/bin/ketrics.js.map +1 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +77 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/build.d.ts +10 -0
- package/dist/src/commands/build.d.ts.map +1 -0
- package/dist/src/commands/build.js +35 -0
- package/dist/src/commands/build.js.map +1 -0
- package/dist/src/commands/create.d.ts +11 -0
- package/dist/src/commands/create.d.ts.map +1 -0
- package/dist/src/commands/create.js +170 -0
- package/dist/src/commands/create.js.map +1 -0
- package/dist/src/commands/deploy.d.ts +11 -0
- package/dist/src/commands/deploy.d.ts.map +1 -0
- package/dist/src/commands/deploy.js +105 -0
- package/dist/src/commands/deploy.js.map +1 -0
- package/dist/src/commands/run.d.ts +11 -0
- package/dist/src/commands/run.d.ts.map +1 -0
- package/dist/src/commands/run.js +236 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/commands/validate.d.ts +10 -0
- package/dist/src/commands/validate.d.ts.map +1 -0
- package/dist/src/commands/validate.js +46 -0
- package/dist/src/commands/validate.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +29 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/api-client.d.ts +14 -0
- package/dist/src/services/api-client.d.ts.map +1 -0
- package/dist/src/services/api-client.js +57 -0
- package/dist/src/services/api-client.js.map +1 -0
- package/dist/src/services/build-service.d.ts +40 -0
- package/dist/src/services/build-service.d.ts.map +1 -0
- package/dist/src/services/build-service.js +130 -0
- package/dist/src/services/build-service.js.map +1 -0
- package/dist/src/services/config-service.d.ts +35 -0
- package/dist/src/services/config-service.d.ts.map +1 -0
- package/dist/src/services/config-service.js +204 -0
- package/dist/src/services/config-service.js.map +1 -0
- package/dist/src/services/template-service.d.ts +51 -0
- package/dist/src/services/template-service.d.ts.map +1 -0
- package/dist/src/services/template-service.js +214 -0
- package/dist/src/services/template-service.js.map +1 -0
- package/dist/src/services/upload-service.d.ts +13 -0
- package/dist/src/services/upload-service.d.ts.map +1 -0
- package/dist/src/services/upload-service.js +54 -0
- package/dist/src/services/upload-service.js.map +1 -0
- package/dist/src/services/zip-service.d.ts +55 -0
- package/dist/src/services/zip-service.d.ts.map +1 -0
- package/dist/src/services/zip-service.js +219 -0
- package/dist/src/services/zip-service.js.map +1 -0
- package/dist/src/types/index.d.ts +188 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +50 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +52 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +95 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/spinner.d.ts +15 -0
- package/dist/src/utils/spinner.d.ts.map +1 -0
- package/dist/src/utils/spinner.js +38 -0
- package/dist/src/utils/spinner.js.map +1 -0
- package/package.json +47 -0
- package/templates/ketrics-app-v1/.env.example +17 -0
- package/templates/ketrics-app-v1/README.md +134 -0
- package/templates/ketrics-app-v1/backend/package-lock.json +716 -0
- package/templates/ketrics-app-v1/backend/package.json +18 -0
- package/templates/ketrics-app-v1/backend/src/index.ts +41 -0
- package/templates/ketrics-app-v1/backend/src/volume.ts +48 -0
- package/templates/ketrics-app-v1/backend/tsconfig.json +16 -0
- package/templates/ketrics-app-v1/frontend/index.html +13 -0
- package/templates/ketrics-app-v1/frontend/package-lock.json +1981 -0
- package/templates/ketrics-app-v1/frontend/package.json +24 -0
- package/templates/ketrics-app-v1/frontend/src/App.css +121 -0
- package/templates/ketrics-app-v1/frontend/src/App.tsx +109 -0
- package/templates/ketrics-app-v1/frontend/src/main.tsx +10 -0
- package/templates/ketrics-app-v1/frontend/src/services/index.ts +55 -0
- package/templates/ketrics-app-v1/frontend/tsconfig.json +21 -0
- package/templates/ketrics-app-v1/frontend/tsconfig.node.json +11 -0
- package/templates/ketrics-app-v1/frontend/vite.config.ts +11 -0
- package/templates/ketrics-app-v1/ketrics.config.json +10 -0
- package/templates/ketrics-app-v1/tests/test.echo.json +13 -0
- package/templates/ketrics-app-v1/tests/test.greet.json +11 -0
- package/templates/ketrics-app-v1/tests/test.info.json +9 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "app3",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "vite",
|
|
7
|
+
"build": "tsc && vite build",
|
|
8
|
+
"preview": "vite preview"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@ketrics/sdk-frontend": "^0.1.1",
|
|
12
|
+
"axios": "^1.13.2",
|
|
13
|
+
"react": "^18.2.0",
|
|
14
|
+
"react-dom": "^18.2.0",
|
|
15
|
+
"zod": "^3.22.4"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/react": "^18.2.0",
|
|
19
|
+
"@types/react-dom": "^18.2.0",
|
|
20
|
+
"@vitejs/plugin-react": "^4.2.0",
|
|
21
|
+
"typescript": "^5.3.3",
|
|
22
|
+
"vite": "^5.0.0"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
* {
|
|
2
|
+
box-sizing: border-box;
|
|
3
|
+
margin: 0;
|
|
4
|
+
padding: 0;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
body {
|
|
8
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
|
|
9
|
+
Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
10
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
11
|
+
min-height: 100vh;
|
|
12
|
+
display: flex;
|
|
13
|
+
justify-content: center;
|
|
14
|
+
align-items: center;
|
|
15
|
+
padding: 20px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.app {
|
|
19
|
+
background: white;
|
|
20
|
+
border-radius: 12px;
|
|
21
|
+
padding: 40px;
|
|
22
|
+
max-width: 500px;
|
|
23
|
+
width: 100%;
|
|
24
|
+
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
h1 {
|
|
28
|
+
color: #333;
|
|
29
|
+
margin-bottom: 8px;
|
|
30
|
+
font-size: 28px;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.subtitle {
|
|
34
|
+
color: #666;
|
|
35
|
+
margin-bottom: 24px;
|
|
36
|
+
font-size: 14px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.form {
|
|
40
|
+
display: flex;
|
|
41
|
+
gap: 12px;
|
|
42
|
+
margin-bottom: 16px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.input {
|
|
46
|
+
flex: 1;
|
|
47
|
+
padding: 12px 16px;
|
|
48
|
+
border: 2px solid #e0e0e0;
|
|
49
|
+
border-radius: 8px;
|
|
50
|
+
font-size: 16px;
|
|
51
|
+
transition: border-color 0.2s;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.input:focus {
|
|
55
|
+
outline: none;
|
|
56
|
+
border-color: #667eea;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.button {
|
|
60
|
+
padding: 12px 24px;
|
|
61
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
62
|
+
color: white;
|
|
63
|
+
border: none;
|
|
64
|
+
border-radius: 8px;
|
|
65
|
+
font-size: 16px;
|
|
66
|
+
font-weight: 600;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.button:hover {
|
|
72
|
+
transform: translateY(-2px);
|
|
73
|
+
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.button:active {
|
|
77
|
+
transform: translateY(0);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.error {
|
|
81
|
+
color: #e53e3e;
|
|
82
|
+
background: #fed7d7;
|
|
83
|
+
padding: 12px;
|
|
84
|
+
border-radius: 8px;
|
|
85
|
+
margin-bottom: 16px;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.result {
|
|
89
|
+
color: #38a169;
|
|
90
|
+
background: #c6f6d5;
|
|
91
|
+
padding: 12px;
|
|
92
|
+
border-radius: 8px;
|
|
93
|
+
margin-bottom: 16px;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.info {
|
|
97
|
+
margin-top: 32px;
|
|
98
|
+
padding-top: 24px;
|
|
99
|
+
border-top: 1px solid #e0e0e0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.info h2 {
|
|
103
|
+
font-size: 18px;
|
|
104
|
+
color: #333;
|
|
105
|
+
margin-bottom: 12px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.info p {
|
|
109
|
+
color: #666;
|
|
110
|
+
margin-bottom: 12px;
|
|
111
|
+
line-height: 1.5;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.info ul {
|
|
115
|
+
color: #666;
|
|
116
|
+
padding-left: 20px;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.info li {
|
|
120
|
+
margin-bottom: 6px;
|
|
121
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { apiClient } from "./services";
|
|
4
|
+
|
|
5
|
+
const inputSchema = z.string().min(1, "Input is required").max(100, "Max 100 characters");
|
|
6
|
+
|
|
7
|
+
function App() {
|
|
8
|
+
const [input, setInput] = useState("");
|
|
9
|
+
const [result, setResult] = useState<string | null>(null);
|
|
10
|
+
const [error, setError] = useState<string | null>(null);
|
|
11
|
+
|
|
12
|
+
const handleSubmit = () => {
|
|
13
|
+
const validation = inputSchema.safeParse(input);
|
|
14
|
+
if (!validation.success) {
|
|
15
|
+
setError(validation.error.errors[0].message);
|
|
16
|
+
setResult(null);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
setError(null);
|
|
20
|
+
setResult(`You submitted: ${validation.data}`);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const handleRunEcho = async () => {
|
|
24
|
+
try {
|
|
25
|
+
const data = await apiClient.run("echo");
|
|
26
|
+
console.log("API Data:", data);
|
|
27
|
+
} catch (err) {
|
|
28
|
+
console.error("API Error:", err);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const handleRunSaveFile = async () => {
|
|
33
|
+
try {
|
|
34
|
+
const data = await apiClient.run("saveFile");
|
|
35
|
+
console.log("API Data:", data);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
console.error("API Error:", err);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const handleRunReadFile = async () => {
|
|
42
|
+
try {
|
|
43
|
+
const data = await apiClient.run("readFile");
|
|
44
|
+
console.log("API Data:", data);
|
|
45
|
+
} catch (err) {
|
|
46
|
+
console.error("API Error:", err);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const handleRunGenerateDownloadUrl = async () => {
|
|
51
|
+
try {
|
|
52
|
+
const data = await apiClient.run("generateDownloadUrl");
|
|
53
|
+
// Trigger download of the file in the url data.result.url
|
|
54
|
+
const downloadUrl = data.result.url;
|
|
55
|
+
const link = document.createElement("a");
|
|
56
|
+
link.href = downloadUrl;
|
|
57
|
+
link.target = "_blank";
|
|
58
|
+
link.download = "data.json";
|
|
59
|
+
document.body.appendChild(link);
|
|
60
|
+
link.click();
|
|
61
|
+
document.body.removeChild(link);
|
|
62
|
+
console.log("downloadUrl:", downloadUrl);
|
|
63
|
+
} catch (err) {
|
|
64
|
+
console.error("API Error:", err);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<div className="app">
|
|
70
|
+
<h1>Ketrics Test Application</h1>
|
|
71
|
+
<p className="subtitle">Frontend Demo with Zod Validation</p>
|
|
72
|
+
|
|
73
|
+
<div className="form">
|
|
74
|
+
<input type="text" value={input} onChange={(e) => setInput(e.target.value)} placeholder="Enter something..." className="input" />
|
|
75
|
+
<button onClick={handleSubmit} className="button">
|
|
76
|
+
Submit
|
|
77
|
+
</button>
|
|
78
|
+
|
|
79
|
+
<button onClick={handleRunEcho} className="button">
|
|
80
|
+
Test Echo API
|
|
81
|
+
</button>
|
|
82
|
+
<button onClick={handleRunSaveFile} className="button">
|
|
83
|
+
Test Save File API
|
|
84
|
+
</button>
|
|
85
|
+
<button onClick={handleRunReadFile} className="button">
|
|
86
|
+
Test Read File API
|
|
87
|
+
</button>
|
|
88
|
+
<button onClick={handleRunGenerateDownloadUrl} className="button">
|
|
89
|
+
Test Generate Download URL API
|
|
90
|
+
</button>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
{error && <p className="error">{error}</p>}
|
|
94
|
+
{result && <p className="result">{result}</p>}
|
|
95
|
+
|
|
96
|
+
<div className="info">
|
|
97
|
+
<h2>About</h2>
|
|
98
|
+
<p>This is a test application for the Ketrics platform. It demonstrates:</p>
|
|
99
|
+
<ul>
|
|
100
|
+
<li>React + TypeScript + Vite setup</li>
|
|
101
|
+
<li>Zod schema validation</li>
|
|
102
|
+
<li>Deployment via Ketrics CLI</li>
|
|
103
|
+
</ul>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export default App;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createAuthManager } from "@ketrics/sdk-frontend";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
|
|
4
|
+
const auth = createAuthManager();
|
|
5
|
+
|
|
6
|
+
// Initialize auto-refresh
|
|
7
|
+
auth.initAutoRefresh({
|
|
8
|
+
refreshBuffer: 60,
|
|
9
|
+
onTokenUpdated: (token) => {
|
|
10
|
+
// Update your HTTP client headers
|
|
11
|
+
axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
class APIClient {
|
|
16
|
+
private auth;
|
|
17
|
+
|
|
18
|
+
constructor(authManager: typeof auth) {
|
|
19
|
+
this.auth = authManager;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private async makeRequest(fnName: string) {
|
|
23
|
+
const runtimeApiUrl = this.auth.getRuntimeApiUrl();
|
|
24
|
+
const tenantId = this.auth.getTenantId();
|
|
25
|
+
const applicationId = this.auth.getApplicationId();
|
|
26
|
+
const accessToken = this.auth.getAccessToken();
|
|
27
|
+
|
|
28
|
+
if (!runtimeApiUrl || !tenantId || !accessToken) {
|
|
29
|
+
throw new Error("Missing authentication context");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const response = await fetch(`${runtimeApiUrl}/tenants/${tenantId}/applications/${applicationId}/functions/${fnName}`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${accessToken}`,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
throw new Error(`API request failed with status ${response.status}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return response.json();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async run(fnName: string) {
|
|
47
|
+
const response = await this.makeRequest(fnName);
|
|
48
|
+
|
|
49
|
+
return response;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const apiClient = new APIClient(auth);
|
|
54
|
+
|
|
55
|
+
export { apiClient };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"moduleResolution": "bundler",
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"isolatedModules": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"jsx": "react-jsx",
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true
|
|
18
|
+
},
|
|
19
|
+
"include": ["src"],
|
|
20
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
21
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "my-application",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "My Ketrics application",
|
|
5
|
+
"runtime": "nodejs18",
|
|
6
|
+
"actions": ["read", "write"],
|
|
7
|
+
"entry": "dist/index.js",
|
|
8
|
+
"include": ["dist/**/*"],
|
|
9
|
+
"exclude": ["node_modules", "*.test.js", "*.spec.js"]
|
|
10
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"endpoint": "/tenants/{{tenantId}}/applications/{{applicationId}}/functions/echo",
|
|
3
|
+
"method": "POST",
|
|
4
|
+
"headers": {
|
|
5
|
+
"Authorization": "Bearer {{token}}",
|
|
6
|
+
"Content-Type": "application/json"
|
|
7
|
+
},
|
|
8
|
+
"body": {
|
|
9
|
+
"data": {
|
|
10
|
+
"hello": "world"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|