@ketrics/ketrics-cli 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/src/cli.d.ts.map +1 -1
  2. package/dist/src/cli.js +2 -2
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/version.d.ts +2 -0
  5. package/dist/src/version.d.ts.map +1 -0
  6. package/dist/src/version.js +6 -0
  7. package/dist/src/version.js.map +1 -0
  8. package/package.json +3 -2
  9. package/templates/{ketrics-app-v1 → HelloWorld}/README.md +2 -2
  10. package/templates/HelloWorld/backend/package-lock.json +374 -0
  11. package/templates/{ketrics-app-v1 → HelloWorld}/backend/package.json +4 -4
  12. package/templates/HelloWorld/backend/src/index.ts +57 -0
  13. package/templates/HelloWorld/backend/src/secrets.ts +17 -0
  14. package/templates/{ketrics-app-v1 → HelloWorld}/backend/src/volume.ts +9 -2
  15. package/templates/{ketrics-app-v1 → HelloWorld}/frontend/src/App.tsx +36 -0
  16. package/templates/HelloWorld/ketrics.config.json +19 -0
  17. package/templates/HelloWorld/tests/test.echo2.json +13 -0
  18. package/templates/HelloWorld/tests/test.getSecret.json +9 -0
  19. package/templates/HelloWorld/tests/test.getSecretWithoutGrant.json +9 -0
  20. package/templates/HelloWorld/tests/test.testWriteFileWithoutVolumeGrant.json +9 -0
  21. package/templates/ketrics-app-v1/.env.example +0 -17
  22. package/templates/ketrics-app-v1/backend/package-lock.json +0 -716
  23. package/templates/ketrics-app-v1/backend/src/index.ts +0 -41
  24. package/templates/ketrics-app-v1/ketrics.config.json +0 -10
  25. /package/templates/{ketrics-app-v1 → HelloWorld}/backend/tsconfig.json +0 -0
  26. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/index.html +0 -0
  27. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/package-lock.json +0 -0
  28. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/package.json +0 -0
  29. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/src/App.css +0 -0
  30. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/src/main.tsx +0 -0
  31. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/src/services/index.ts +0 -0
  32. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/tsconfig.json +0 -0
  33. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/tsconfig.node.json +0 -0
  34. /package/templates/{ketrics-app-v1 → HelloWorld}/frontend/vite.config.ts +0 -0
  35. /package/templates/{ketrics-app-v1 → HelloWorld}/tests/test.echo.json +0 -0
  36. /package/templates/{ketrics-app-v1 → HelloWorld}/tests/test.greet.json +0 -0
  37. /package/templates/{ketrics-app-v1 → HelloWorld}/tests/test.info.json +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAgEnC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAgEnC"}
package/dist/src/cli.js CHANGED
@@ -12,7 +12,7 @@ const build_1 = require("./commands/build");
12
12
  const deploy_1 = require("./commands/deploy");
13
13
  const validate_1 = require("./commands/validate");
14
14
  const run_1 = require("./commands/run");
15
- const VERSION = "0.1.1";
15
+ const version_1 = require("./version");
16
16
  /**
17
17
  * Create and configure CLI program
18
18
  */
@@ -21,7 +21,7 @@ function createCLI() {
21
21
  program
22
22
  .name("ketrics")
23
23
  .description("CLI tool for deploying applications to Ketrics platform")
24
- .version(VERSION, "-v, --version", "Show CLI version");
24
+ .version(version_1.VERSION, "-v, --version", "Show CLI version");
25
25
  // Create command
26
26
  program
27
27
  .command("create <app-name>")
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAcH,8BAgEC;AA5ED,yCAAoC;AACpC,8CAAkD;AAClD,4CAAgD;AAChD,8CAAkD;AAClD,kDAAsD;AACtD,wCAA4C;AAE5C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB;;GAEG;AACH,SAAgB,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAEzD,iBAAiB;IACjB,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,uBAAuB,EAAE,oDAAoD,CAAC;SACrF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QACjC,MAAM,IAAA,sBAAa,EAAC,OAAO,EAAE;YAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,gBAAgB;IAChB,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,oBAAY,GAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,iBAAiB;IACjB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAA,sBAAa,EAAC;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAA,0BAAe,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEL,cAAc;IACd,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,IAAA,gBAAU,EAAC,QAAQ,EAAE;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAaH,8BAgEC;AA3ED,yCAAoC;AACpC,8CAAkD;AAClD,4CAAgD;AAChD,8CAAkD;AAClD,kDAAsD;AACtD,wCAA4C;AAC5C,uCAAoC;AAEpC;;GAEG;AACH,SAAgB,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,OAAO,CAAC,iBAAO,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAEzD,iBAAiB;IACjB,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,uBAAuB,EAAE,oDAAoD,CAAC;SACrF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QACjC,MAAM,IAAA,sBAAa,EAAC,OAAO,EAAE;YAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,gBAAgB;IAChB,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,oBAAY,GAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,iBAAiB;IACjB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAA,sBAAa,EAAC;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAA,0BAAe,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEL,cAAc;IACd,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,IAAA,gBAAU,EAAC,QAAQ,EAAE;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "0.2.3";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ // Auto-generated - do not edit
5
+ exports.VERSION = "0.2.3";
6
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,+BAA+B;AAClB,QAAA,OAAO,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@ketrics/ketrics-cli",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "CLI tool for deploying applications to Ketrics platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
7
7
  "ketrics": "./dist/bin/ketrics.js"
8
8
  },
9
9
  "scripts": {
10
- "build": "tsc",
10
+ "prebuild": "node scripts/generate-version.js",
11
+ "build": "npm run prebuild && tsc",
11
12
  "dev": "ts-node bin/ketrics.ts",
12
13
  "clean": "rm -rf dist",
13
14
  "prepublishOnly": "npm run build"
@@ -10,7 +10,7 @@ test-application/
10
10
  │ ├── src/
11
11
  │ ├── ketrics.config.json
12
12
  │ └── .env.example
13
- └── backend/ # TypeScript handlers for runtime-api
13
+ └── backend/ # TypeScript handlers for data-plane
14
14
  ├── src/
15
15
  ├── ketrics.config.json
16
16
  └── .env.example
@@ -47,7 +47,7 @@ npm run build
47
47
 
48
48
  ## Backend
49
49
 
50
- TypeScript handlers compatible with Ketrics runtime-api-api.
50
+ TypeScript handlers compatible with Ketrics data-plane-api.
51
51
 
52
52
  ### Available Actions
53
53
 
@@ -0,0 +1,374 @@
1
+ {
2
+ "name": "app3",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "app3",
9
+ "version": "1.0.0",
10
+ "devDependencies": {
11
+ "@ketrics/sdk-backend": "0.7.1",
12
+ "@types/node": ">=24.0.0",
13
+ "esbuild": "^0.27.2",
14
+ "ts-node": "^1.7.1",
15
+ "typescript": "^5.3.3"
16
+ }
17
+ },
18
+ "node_modules/@esbuild/darwin-arm64": {
19
+ "version": "0.27.2",
20
+ "cpu": [
21
+ "arm64"
22
+ ],
23
+ "dev": true,
24
+ "license": "MIT",
25
+ "optional": true,
26
+ "os": [
27
+ "darwin"
28
+ ],
29
+ "engines": {
30
+ "node": ">=18"
31
+ }
32
+ },
33
+ "node_modules/@ketrics/sdk-backend": {
34
+ "version": "0.7.1",
35
+ "resolved": "https://registry.npmjs.org/@ketrics/sdk-backend/-/sdk-backend-0.7.1.tgz",
36
+ "integrity": "sha512-cMKOditcGh0cB5kLfrP2IGQ7gvCffeOAMhhkgdiGiGmmBnMJKwcBjfBMZtLHzFQ+F/+oR1QoMnZOsaxd8BMQZw==",
37
+ "dev": true,
38
+ "license": "MIT",
39
+ "engines": {
40
+ "node": ">=24.0.0"
41
+ },
42
+ "peerDependencies": {
43
+ "@types/node": ">=24.0.0"
44
+ }
45
+ },
46
+ "node_modules/@types/node": {
47
+ "version": "25.1.0",
48
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz",
49
+ "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==",
50
+ "dev": true,
51
+ "license": "MIT",
52
+ "dependencies": {
53
+ "undici-types": "~7.16.0"
54
+ }
55
+ },
56
+ "node_modules/ansi-regex": {
57
+ "version": "2.1.1",
58
+ "dev": true,
59
+ "license": "MIT",
60
+ "engines": {
61
+ "node": ">=0.10.0"
62
+ }
63
+ },
64
+ "node_modules/ansi-styles": {
65
+ "version": "2.2.1",
66
+ "dev": true,
67
+ "license": "MIT",
68
+ "engines": {
69
+ "node": ">=0.10.0"
70
+ }
71
+ },
72
+ "node_modules/any-promise": {
73
+ "version": "1.3.0",
74
+ "dev": true,
75
+ "license": "MIT"
76
+ },
77
+ "node_modules/arrify": {
78
+ "version": "1.0.1",
79
+ "dev": true,
80
+ "license": "MIT",
81
+ "engines": {
82
+ "node": ">=0.10.0"
83
+ }
84
+ },
85
+ "node_modules/chalk": {
86
+ "version": "1.1.3",
87
+ "dev": true,
88
+ "license": "MIT",
89
+ "dependencies": {
90
+ "ansi-styles": "^2.2.1",
91
+ "escape-string-regexp": "^1.0.2",
92
+ "has-ansi": "^2.0.0",
93
+ "strip-ansi": "^3.0.0",
94
+ "supports-color": "^2.0.0"
95
+ },
96
+ "engines": {
97
+ "node": ">=0.10.0"
98
+ }
99
+ },
100
+ "node_modules/error-ex": {
101
+ "version": "1.3.4",
102
+ "dev": true,
103
+ "license": "MIT",
104
+ "dependencies": {
105
+ "is-arrayish": "^0.2.1"
106
+ }
107
+ },
108
+ "node_modules/esbuild": {
109
+ "version": "0.27.2",
110
+ "dev": true,
111
+ "hasInstallScript": true,
112
+ "license": "MIT",
113
+ "bin": {
114
+ "esbuild": "bin/esbuild"
115
+ },
116
+ "engines": {
117
+ "node": ">=18"
118
+ },
119
+ "optionalDependencies": {
120
+ "@esbuild/aix-ppc64": "0.27.2",
121
+ "@esbuild/android-arm": "0.27.2",
122
+ "@esbuild/android-arm64": "0.27.2",
123
+ "@esbuild/android-x64": "0.27.2",
124
+ "@esbuild/darwin-arm64": "0.27.2",
125
+ "@esbuild/darwin-x64": "0.27.2",
126
+ "@esbuild/freebsd-arm64": "0.27.2",
127
+ "@esbuild/freebsd-x64": "0.27.2",
128
+ "@esbuild/linux-arm": "0.27.2",
129
+ "@esbuild/linux-arm64": "0.27.2",
130
+ "@esbuild/linux-ia32": "0.27.2",
131
+ "@esbuild/linux-loong64": "0.27.2",
132
+ "@esbuild/linux-mips64el": "0.27.2",
133
+ "@esbuild/linux-ppc64": "0.27.2",
134
+ "@esbuild/linux-riscv64": "0.27.2",
135
+ "@esbuild/linux-s390x": "0.27.2",
136
+ "@esbuild/linux-x64": "0.27.2",
137
+ "@esbuild/netbsd-arm64": "0.27.2",
138
+ "@esbuild/netbsd-x64": "0.27.2",
139
+ "@esbuild/openbsd-arm64": "0.27.2",
140
+ "@esbuild/openbsd-x64": "0.27.2",
141
+ "@esbuild/openharmony-arm64": "0.27.2",
142
+ "@esbuild/sunos-x64": "0.27.2",
143
+ "@esbuild/win32-arm64": "0.27.2",
144
+ "@esbuild/win32-ia32": "0.27.2",
145
+ "@esbuild/win32-x64": "0.27.2"
146
+ }
147
+ },
148
+ "node_modules/escape-string-regexp": {
149
+ "version": "1.0.5",
150
+ "dev": true,
151
+ "license": "MIT",
152
+ "engines": {
153
+ "node": ">=0.8.0"
154
+ }
155
+ },
156
+ "node_modules/has-ansi": {
157
+ "version": "2.0.0",
158
+ "dev": true,
159
+ "license": "MIT",
160
+ "dependencies": {
161
+ "ansi-regex": "^2.0.0"
162
+ },
163
+ "engines": {
164
+ "node": ">=0.10.0"
165
+ }
166
+ },
167
+ "node_modules/is-arrayish": {
168
+ "version": "0.2.1",
169
+ "dev": true,
170
+ "license": "MIT"
171
+ },
172
+ "node_modules/is-utf8": {
173
+ "version": "0.2.1",
174
+ "dev": true,
175
+ "license": "MIT"
176
+ },
177
+ "node_modules/make-error": {
178
+ "version": "1.3.6",
179
+ "dev": true,
180
+ "license": "ISC"
181
+ },
182
+ "node_modules/minimist": {
183
+ "version": "1.2.8",
184
+ "dev": true,
185
+ "license": "MIT",
186
+ "funding": {
187
+ "url": "https://github.com/sponsors/ljharb"
188
+ }
189
+ },
190
+ "node_modules/mkdirp": {
191
+ "version": "0.5.6",
192
+ "dev": true,
193
+ "license": "MIT",
194
+ "dependencies": {
195
+ "minimist": "^1.2.6"
196
+ },
197
+ "bin": {
198
+ "mkdirp": "bin/cmd.js"
199
+ }
200
+ },
201
+ "node_modules/object-assign": {
202
+ "version": "4.1.1",
203
+ "dev": true,
204
+ "license": "MIT",
205
+ "engines": {
206
+ "node": ">=0.10.0"
207
+ }
208
+ },
209
+ "node_modules/parse-json": {
210
+ "version": "2.2.0",
211
+ "dev": true,
212
+ "license": "MIT",
213
+ "dependencies": {
214
+ "error-ex": "^1.2.0"
215
+ },
216
+ "engines": {
217
+ "node": ">=0.10.0"
218
+ }
219
+ },
220
+ "node_modules/pinkie": {
221
+ "version": "2.0.4",
222
+ "dev": true,
223
+ "license": "MIT",
224
+ "engines": {
225
+ "node": ">=0.10.0"
226
+ }
227
+ },
228
+ "node_modules/source-map": {
229
+ "version": "0.5.7",
230
+ "dev": true,
231
+ "license": "BSD-3-Clause",
232
+ "engines": {
233
+ "node": ">=0.10.0"
234
+ }
235
+ },
236
+ "node_modules/source-map-support": {
237
+ "version": "0.4.18",
238
+ "dev": true,
239
+ "license": "MIT",
240
+ "dependencies": {
241
+ "source-map": "^0.5.6"
242
+ }
243
+ },
244
+ "node_modules/strip-ansi": {
245
+ "version": "3.0.1",
246
+ "dev": true,
247
+ "license": "MIT",
248
+ "dependencies": {
249
+ "ansi-regex": "^2.0.0"
250
+ },
251
+ "engines": {
252
+ "node": ">=0.10.0"
253
+ }
254
+ },
255
+ "node_modules/strip-bom": {
256
+ "version": "2.0.0",
257
+ "dev": true,
258
+ "license": "MIT",
259
+ "dependencies": {
260
+ "is-utf8": "^0.2.0"
261
+ },
262
+ "engines": {
263
+ "node": ">=0.10.0"
264
+ }
265
+ },
266
+ "node_modules/strip-json-comments": {
267
+ "version": "2.0.1",
268
+ "dev": true,
269
+ "license": "MIT",
270
+ "engines": {
271
+ "node": ">=0.10.0"
272
+ }
273
+ },
274
+ "node_modules/supports-color": {
275
+ "version": "2.0.0",
276
+ "dev": true,
277
+ "license": "MIT",
278
+ "engines": {
279
+ "node": ">=0.8.0"
280
+ }
281
+ },
282
+ "node_modules/ts-node": {
283
+ "version": "1.7.1",
284
+ "dev": true,
285
+ "license": "MIT",
286
+ "dependencies": {
287
+ "arrify": "^1.0.0",
288
+ "chalk": "^1.1.1",
289
+ "make-error": "^1.1.1",
290
+ "minimist": "^1.2.0",
291
+ "mkdirp": "^0.5.1",
292
+ "pinkie": "^2.0.4",
293
+ "source-map-support": "^0.4.0",
294
+ "tsconfig": "^5.0.2",
295
+ "v8flags": "^2.0.11",
296
+ "xtend": "^4.0.0",
297
+ "yn": "^1.2.0"
298
+ },
299
+ "bin": {
300
+ "ts-node": "dist/bin.js"
301
+ }
302
+ },
303
+ "node_modules/tsconfig": {
304
+ "version": "5.0.3",
305
+ "dev": true,
306
+ "license": "MIT",
307
+ "dependencies": {
308
+ "any-promise": "^1.3.0",
309
+ "parse-json": "^2.2.0",
310
+ "strip-bom": "^2.0.0",
311
+ "strip-json-comments": "^2.0.0"
312
+ }
313
+ },
314
+ "node_modules/typescript": {
315
+ "version": "5.9.3",
316
+ "dev": true,
317
+ "license": "Apache-2.0",
318
+ "bin": {
319
+ "tsc": "bin/tsc",
320
+ "tsserver": "bin/tsserver"
321
+ },
322
+ "engines": {
323
+ "node": ">=14.17"
324
+ }
325
+ },
326
+ "node_modules/undici-types": {
327
+ "version": "7.16.0",
328
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
329
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
330
+ "dev": true,
331
+ "license": "MIT"
332
+ },
333
+ "node_modules/user-home": {
334
+ "version": "1.1.1",
335
+ "dev": true,
336
+ "license": "MIT",
337
+ "bin": {
338
+ "user-home": "cli.js"
339
+ },
340
+ "engines": {
341
+ "node": ">=0.10.0"
342
+ }
343
+ },
344
+ "node_modules/v8flags": {
345
+ "version": "2.1.1",
346
+ "dev": true,
347
+ "dependencies": {
348
+ "user-home": "^1.1.1"
349
+ },
350
+ "engines": {
351
+ "node": ">= 0.10.0"
352
+ }
353
+ },
354
+ "node_modules/xtend": {
355
+ "version": "4.0.2",
356
+ "dev": true,
357
+ "license": "MIT",
358
+ "engines": {
359
+ "node": ">=0.4"
360
+ }
361
+ },
362
+ "node_modules/yn": {
363
+ "version": "1.3.0",
364
+ "dev": true,
365
+ "license": "MIT",
366
+ "dependencies": {
367
+ "object-assign": "^4.1.1"
368
+ },
369
+ "engines": {
370
+ "node": ">=0.10.0"
371
+ }
372
+ }
373
+ }
374
+ }
@@ -9,10 +9,10 @@
9
9
  "clean": "rm -rf dist"
10
10
  },
11
11
  "devDependencies": {
12
- "@ketrics/sdk-backend": "^0.3.0",
13
- "@types/node": "^20.10.0",
14
- "esbuild": "^0.24.0",
15
- "ts-node": "^10.9.2",
12
+ "@ketrics/sdk-backend": "0.7.1",
13
+ "@types/node": ">=24.0.0",
14
+ "esbuild": "^0.27.2",
15
+ "ts-node": "^1.7.1",
16
16
  "typescript": "^5.3.3"
17
17
  }
18
18
  }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Ketrics Application Backend
3
+ *
4
+ * Exports handler functions compatible with Ketrics data-plane-api.
5
+ *
6
+ * The `ketrics` global object is automatically typed via @ketrics/sdk.
7
+ * No imports needed - just use `ketrics.*` directly.
8
+ *
9
+ * Available SDK features:
10
+ * - ketrics.tenant, ketrics.application, ketrics.requestor, ketrics.env (context)
11
+ * - ketrics.console (logging to CloudWatch)
12
+ * - ketrics.http (HTTP client for external APIs)
13
+ * - ketrics.Volume.connect(code) (S3-backed storage)
14
+ * - ketrics.DatabaseConnection.connect(code) (external databases)
15
+ * - ketrics.Secret.get(code) (encrypted secrets)
16
+ */
17
+
18
+ // ============================================================================
19
+ // Basic Handlers
20
+ // ============================================================================
21
+
22
+ import { saveFile, readFile, generateDownloadUrl, testWriteFileWithoutVolumeGrant } from "./volume";
23
+ import { getSecret, getSecretWithoutGrant } from "./secrets";
24
+
25
+ /**
26
+ * Echo handler - returns payload with context info
27
+ *
28
+ * @param payload - Any payload to echo back
29
+ * @returns Payload with additional context information
30
+ */
31
+
32
+ const echo = async (payload: unknown) => {
33
+ ketrics.console.log(
34
+ `Echo was called by ${ketrics.requestor.type}:${ketrics.requestor.userId || ketrics.requestor.serviceAccountCode} in tenant ${ketrics.tenant.id}`,
35
+ );
36
+
37
+ // Only send message if requestor is a user
38
+
39
+ if (ketrics.requestor.type === "USER") {
40
+ await ketrics.Messages.send({
41
+ userId: ketrics.requestor.userId!,
42
+ type: "notification",
43
+ subject: "Echo called",
44
+ body: `Echo was called by ${ketrics.requestor.type}:${ketrics.requestor.email} in tenant ${ketrics.tenant.id}`,
45
+ });
46
+ }
47
+
48
+ return {
49
+ tenant: ketrics.tenant,
50
+ requestor: ketrics.requestor,
51
+ application: ketrics.application,
52
+ environment: ketrics.environment,
53
+ runtime: ketrics.runtime,
54
+ };
55
+ };
56
+
57
+ export { echo, saveFile, readFile, generateDownloadUrl, testWriteFileWithoutVolumeGrant, getSecret, getSecretWithoutGrant };
@@ -0,0 +1,17 @@
1
+ const getSecret = async (key: string): Promise<{ value: string }> => {
2
+ const value = await ketrics.Secret.get("apikey");
3
+ if (!value) {
4
+ throw new Error(`Secret with key "${key}" not found`);
5
+ }
6
+ return { value };
7
+ };
8
+
9
+ const getSecretWithoutGrant = async (key: string): Promise<{ value: string }> => {
10
+ const value = await ketrics.Secret.get("missing-grant-secret");
11
+ if (!value) {
12
+ throw new Error(`Secret with key "${key}" not found`);
13
+ }
14
+ return { value };
15
+ };
16
+
17
+ export { getSecret, getSecretWithoutGrant };
@@ -1,10 +1,17 @@
1
+ const testWriteFileWithoutVolumeGrant = async () => {
2
+ const volume = await ketrics.Volume.connect("test2");
3
+ const buffer = Buffer.from("This should fail");
4
+ const putResults = await volume.put("files/fail.txt", buffer);
5
+ return { putResults };
6
+ };
7
+
1
8
  const saveFile = async () => {
2
9
  const volume = await ketrics.Volume.connect("test-volume");
3
10
 
4
11
  const data = {
5
12
  id: ketrics.application.id,
6
13
  code: ketrics.application.code,
7
- applicationName: ketrics.application.applicationName,
14
+ name: ketrics.application.name,
8
15
  version: ketrics.application.version,
9
16
  deploymentId: ketrics.application.deploymentId,
10
17
  };
@@ -45,4 +52,4 @@ const generateDownloadUrl = async () => {
45
52
  return { url: results.url };
46
53
  };
47
54
 
48
- export { saveFile, readFile, generateDownloadUrl };
55
+ export { saveFile, readFile, generateDownloadUrl, testWriteFileWithoutVolumeGrant };
@@ -65,6 +65,33 @@ function App() {
65
65
  }
66
66
  };
67
67
 
68
+ const handleRunTestWriteFileWithoutVolumeGrant = async () => {
69
+ try {
70
+ const data = await apiClient.run("testWriteFileWithoutVolumeGrant");
71
+ console.log("API Data:", data);
72
+ } catch (err) {
73
+ console.error("API Error:", err);
74
+ }
75
+ };
76
+
77
+ const handleGetSecret = async () => {
78
+ try {
79
+ const data = await apiClient.run("getSecret");
80
+ console.log("Secret Data:", data);
81
+ } catch (err) {
82
+ console.error("Secret Error:", err);
83
+ }
84
+ };
85
+
86
+ const handleGetSecretWithoutGrant = async () => {
87
+ try {
88
+ const data = await apiClient.run("getSecretWithoutGrant");
89
+ console.log("Secret Data:", data);
90
+ } catch (err) {
91
+ console.error("Secret Error:", err);
92
+ }
93
+ };
94
+
68
95
  return (
69
96
  <div className="app">
70
97
  <h1>Ketrics Test Application</h1>
@@ -88,6 +115,15 @@ function App() {
88
115
  <button onClick={handleRunGenerateDownloadUrl} className="button">
89
116
  Test Generate Download URL API
90
117
  </button>
118
+ <button onClick={handleRunTestWriteFileWithoutVolumeGrant} className="button">
119
+ Test Write File Without Volume Grant API
120
+ </button>
121
+ <button onClick={handleGetSecret} className="button">
122
+ Get Secret with Grant
123
+ </button>
124
+ <button onClick={handleGetSecretWithoutGrant} className="button">
125
+ Get Secret without Grant
126
+ </button>
91
127
  </div>
92
128
 
93
129
  {error && <p className="error">{error}</p>}
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "app3",
3
+ "version": "1.0.0",
4
+ "description": "My Ketrics application",
5
+ "runtime": "nodejs18",
6
+ "actions": [
7
+ "read",
8
+ "write"
9
+ ],
10
+ "entry": "dist/index.js",
11
+ "include": [
12
+ "dist/**/*"
13
+ ],
14
+ "exclude": [
15
+ "node_modules",
16
+ "*.test.js",
17
+ "*.spec.js"
18
+ ]
19
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "endpoint": "/tenants/{{tenantId}}/applications/{{applicationId}}/functions/echo2",
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
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "endpoint": "/tenants/{{tenantId}}/applications/{{applicationId}}/functions/getSecret",
3
+ "method": "POST",
4
+ "headers": {
5
+ "Authorization": "Bearer {{token}}",
6
+ "Content-Type": "application/json"
7
+ },
8
+ "body": {}
9
+ }