create-relkit 0.0.5 → 0.2.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/dist/generate-files.d.ts.map +1 -1
- package/dist/generate-files.js +32 -2
- package/dist/generate-files.js.map +1 -1
- package/dist/options.d.ts +1 -1
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +3 -3
- package/dist/options.js.map +1 -1
- package/dist/templates/default/README.md +1 -1
- package/dist/templates/default/v1/agent/README.md +4 -5
- package/dist/templates/default/v1/agent/package.json +5 -7
- package/dist/templates/default/v1/agent/relkit.config.ts +18 -16
- package/dist/templates/default/v1/agent/src/hello/agents/assistant.agent.ts +8 -1
- package/dist/templates/default/v1/agent/src/hello/functions/ask-assistant.function.ts +16 -0
- package/dist/templates/default/v1/agent/src/hello/functions/hello.function.ts +3 -0
- package/dist/templates/default/v1/agent/src/hello/tools/lookup.tool.ts +2 -0
- package/dist/templates/default/v1/agent/tests/fixtures/lookup.tool.ts +12 -0
- package/dist/templates/default/v1/agent/tests/fixtures/mcp-options.ts +26 -0
- package/dist/templates/default/v1/agent/tests/integration/hello.route.test.ts +6 -1
- package/dist/templates/default/v1/agent/tests/unit/assistant.agent.test.ts +17 -4
- package/dist/templates/default/v1/agent/tests/unit/lookup.tool.test.ts +20 -0
- package/dist/templates/default/v1/agent/tsconfig.json +0 -1
- package/dist/templates/default/v1/api/.env.example +0 -3
- package/dist/templates/default/v1/api/README.md +2 -4
- package/dist/templates/default/v1/api/package.json +4 -8
- package/dist/templates/default/v1/api/relkit.config.ts +5 -13
- package/dist/templates/default/v1/api/src/orders/functions/create-order.function.ts +9 -5
- package/dist/templates/default/v1/api/src/orders/service.ts +0 -2
- package/dist/templates/default/v1/api/src/platform/env.ts +0 -3
- package/dist/templates/default/v1/api/tests/integration/orders.route.test.ts +0 -3
- package/dist/templates/default/v1/api/tests/unit/orders.function.test.ts +6 -19
- package/dist/templates/default/v1/api/tsconfig.json +0 -1
- package/dist/templates/default/v1/minimal/README.md +2 -3
- package/dist/templates/default/v1/minimal/package.json +4 -7
- package/dist/templates/default/v1/minimal/relkit.config.ts +5 -4
- package/dist/templates/default/v1/minimal/tsconfig.json +0 -1
- package/package.json +1 -1
- package/dist/templates/default/v1/api/src/orders/events/order-audit.event.ts +0 -15
- package/dist/templates/default/v1/api/src/orders/events/order-confirmation.event.ts +0 -11
- package/dist/templates/default/v1/api/src/orders/events/order-created.event.ts +0 -15
- package/dist/templates/default/v1/api/tests/integration/order-events.test.ts +0 -71
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-files.d.ts","sourceRoot":"","sources":["../src/generate-files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"generate-files.d.ts","sourceRoot":"","sources":["../src/generate-files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1F;AAyCD,6FAA6F;AAC7F,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmB7B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASjE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxF;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5F;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUtF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C"}
|
package/dist/generate-files.js
CHANGED
|
@@ -23,10 +23,40 @@ export async function copyTemplate(source, target) {
|
|
|
23
23
|
export async function customizeProject(root, options) {
|
|
24
24
|
await replaceOnce(join(root, "package.json"), '"name": "my-app"', `"name": ${JSON.stringify(options.name)}`);
|
|
25
25
|
await replaceOnce(join(root, "README.md"), "# my-app", `# ${options.name}`);
|
|
26
|
-
await replaceOnce(join(root, "relkit.config.ts"), "export default
|
|
26
|
+
await replaceOnce(join(root, "relkit.config.ts"), "export default defineApp({", `export default defineApp({\n id: ${JSON.stringify(projectId(options.name))},`);
|
|
27
|
+
await customizeDeployment(root, options);
|
|
27
28
|
if (!options.examples)
|
|
28
29
|
await removeExamples(root);
|
|
29
30
|
}
|
|
31
|
+
async function customizeDeployment(root, options) {
|
|
32
|
+
const configPath = join(root, "relkit.config.ts");
|
|
33
|
+
const imports = [
|
|
34
|
+
...(options.cloud === "aws" ? ['import "@relkit/aws";'] : []),
|
|
35
|
+
...(options.deploy === "pulumi" ? ['import "@relkit/pulumi";'] : []),
|
|
36
|
+
].join("\n");
|
|
37
|
+
await replaceOnce(configPath, "// relkit:create:deployment-imports", imports);
|
|
38
|
+
await replaceOnce(configPath, " // relkit:create:deployment", options.cloud === "aws" && options.deploy === "pulumi"
|
|
39
|
+
? ' deployment: { engine: "pulumi", host: "aws" },'
|
|
40
|
+
: "");
|
|
41
|
+
const manifestPath = join(root, "package.json");
|
|
42
|
+
const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
43
|
+
const version = manifest.dependencies["@relkit/app"];
|
|
44
|
+
if (options.cloud === "aws")
|
|
45
|
+
manifest.dependencies["@relkit/aws"] = version;
|
|
46
|
+
if (options.deploy === "pulumi")
|
|
47
|
+
manifest.dependencies["@relkit/pulumi"] = version;
|
|
48
|
+
if (options.cloud === "aws" && options.deploy === "pulumi") {
|
|
49
|
+
manifest.scripts["deploy:preview"] = "relkit deploy preview";
|
|
50
|
+
manifest.scripts.deploy = "relkit deploy up";
|
|
51
|
+
}
|
|
52
|
+
manifest.scripts = sorted(manifest.scripts);
|
|
53
|
+
manifest.dependencies = sorted(manifest.dependencies);
|
|
54
|
+
await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
55
|
+
await chmod(manifestPath, FILE_MODE);
|
|
56
|
+
}
|
|
57
|
+
function sorted(values) {
|
|
58
|
+
return Object.fromEntries(Object.entries(values).sort(([left], [right]) => left.localeCompare(right)));
|
|
59
|
+
}
|
|
30
60
|
/** Removes only a verified mkdtemp sibling; broad or unresolved paths are never recursed. */
|
|
31
61
|
export async function cleanupStagedProject(stage, destination) {
|
|
32
62
|
if (stage === undefined)
|
|
@@ -107,7 +137,7 @@ export function projectId(name) {
|
|
|
107
137
|
.replace(/^@/, "")
|
|
108
138
|
.replace("/", "-")
|
|
109
139
|
.replace(/[^A-Za-z0-9._-]+/g, "-");
|
|
110
|
-
return value.replace(/^[._-]
|
|
140
|
+
return value.replace(/^[._-]+/, "").replace(/(?<![._-])[._-]+$/, "") || "app";
|
|
111
141
|
}
|
|
112
142
|
function compareNames(left, right) {
|
|
113
143
|
return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-files.js","sourceRoot":"","sources":["../src/generate-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,MAAM,cAAc,GAAG,KAAK,CAAC;AAO7B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,MAAc;IAC/D,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChF,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aACjD,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,MAAM,SAAS,CAAC,EAAE,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/D,MAAM,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC7B,CAAC;;YACC,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,EAChC,yCAAyC,CAC1C,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAsB;IACzE,MAAM,WAAW,CACf,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAC1B,kBAAkB,EAClB,WAAW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAC1C,CAAC;IACF,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,WAAW,CACf,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAC9B,+BAA+B,EAC/B,
|
|
1
|
+
{"version":3,"file":"generate-files.js","sourceRoot":"","sources":["../src/generate-files.ts"],"names":[],"mappings":"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"}
|
package/dist/options.d.ts
CHANGED
|
@@ -33,6 +33,6 @@ export declare class CreateOptionsError extends Error {
|
|
|
33
33
|
readonly code: "RELKIT_CREATE_USAGE";
|
|
34
34
|
constructor(message: string);
|
|
35
35
|
}
|
|
36
|
-
/** Parses
|
|
36
|
+
/** Parses non-interactive create flags and applies the cloud-free defaults. */
|
|
37
37
|
export declare function normalizeCreateOptions(args: readonly string[], context?: CreateOptionsContext): CreateOptions;
|
|
38
38
|
//# sourceMappingURL=options.d.ts.map
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,sCAAuC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,eAAO,MAAM,aAAa,0BAA2B,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,kBAAkB,6BAA8B,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,eAAO,MAAM,sBAAsB;cACV,cAAc;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,sCAAuC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,eAAO,MAAM,aAAa,0BAA2B,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,kBAAkB,6BAA8B,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,eAAO,MAAM,sBAAsB;cACV,cAAc;WACpB,WAAW;YACV,gBAAgB;aACjB,OAAO;SACX,OAAO;cACF,OAAO;yBACK,OAAO;UACtB,OAAO;EACtB,CAAC;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAU;gBAEnC,OAAO,EAAE,MAAM;CAI5B;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,oBAAyB,GACjC,aAAa,CAyDf"}
|
package/dist/options.js
CHANGED
|
@@ -3,8 +3,8 @@ export const CREATE_CLOUDS = ["aws", "none"];
|
|
|
3
3
|
export const CREATE_DEPLOYMENTS = ["pulumi", "none"];
|
|
4
4
|
export const CREATE_OPTION_DEFAULTS = Object.freeze({
|
|
5
5
|
template: "minimal",
|
|
6
|
-
cloud: "
|
|
7
|
-
deploy: "
|
|
6
|
+
cloud: "none",
|
|
7
|
+
deploy: "none",
|
|
8
8
|
install: true,
|
|
9
9
|
git: true,
|
|
10
10
|
examples: true,
|
|
@@ -18,7 +18,7 @@ export class CreateOptionsError extends Error {
|
|
|
18
18
|
this.name = "CreateOptionsError";
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
/** Parses
|
|
21
|
+
/** Parses non-interactive create flags and applies the cloud-free defaults. */
|
|
22
22
|
export function normalizeCreateOptions(args, context = {}) {
|
|
23
23
|
let name;
|
|
24
24
|
let directory;
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAU,CAAC;AAGrE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;AAGtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAU,CAAC;AAG9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC;IAClD,QAAQ,EAAE,SAA2B;IACrC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,6 @@ scaffolder:
|
|
|
8
8
|
- `agent` — the minimal example plus a read-only tool and agent descriptor.
|
|
9
9
|
|
|
10
10
|
Each variant is self-contained and can be copied as a project root. It uses
|
|
11
|
-
the current checked-in RelKit package version (`0.0
|
|
11
|
+
the current checked-in RelKit package version (`0.2.0`), Bun `1.3.10`, and
|
|
12
12
|
TypeScript `5.9.3`. The generator owns project-name substitution and later
|
|
13
13
|
installation/Git behavior.
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
# my-app
|
|
2
2
|
|
|
3
3
|
A RelKit TypeScript/Bun project with the minimal HTTP example and a bounded
|
|
4
|
-
agent backed by a function-derived read-only tool. Tests use deterministic
|
|
5
|
-
|
|
4
|
+
agent backed by a function-derived read-only tool. Tests use a deterministic
|
|
5
|
+
scripted model, while production resolves the selected AI SDK profile.
|
|
6
6
|
|
|
7
|
-
The agent may omit `model` to use the configured
|
|
8
|
-
|
|
9
|
-
environment references in `modelProviders`.
|
|
7
|
+
The agent may omit `model` to use the configured default profile. OpenAI and
|
|
8
|
+
Anthropic credentials remain named binding-local values.
|
|
10
9
|
|
|
11
10
|
## Commands
|
|
12
11
|
|
|
@@ -12,18 +12,16 @@
|
|
|
12
12
|
"test:integration": "bun test tests/integration",
|
|
13
13
|
"build": "relkit build",
|
|
14
14
|
"start": "relkit start",
|
|
15
|
-
"graph": "relkit graph print"
|
|
16
|
-
"deploy:preview": "relkit deploy preview",
|
|
17
|
-
"deploy": "relkit deploy up"
|
|
15
|
+
"graph": "relkit graph print"
|
|
18
16
|
},
|
|
19
17
|
"dependencies": {
|
|
20
|
-
"@relkit/
|
|
21
|
-
"@relkit/
|
|
18
|
+
"@relkit/ai-sdk": "0.2.0",
|
|
19
|
+
"@relkit/app": "0.2.0"
|
|
22
20
|
},
|
|
23
21
|
"devDependencies": {
|
|
24
22
|
"@types/bun": "1.3.10",
|
|
25
|
-
"@relkit/cli": "0.0
|
|
26
|
-
"@relkit/testing": "0.0
|
|
23
|
+
"@relkit/cli": "0.2.0",
|
|
24
|
+
"@relkit/testing": "0.2.0",
|
|
27
25
|
"typescript": "5.9.3"
|
|
28
26
|
}
|
|
29
27
|
}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import { aiSdk
|
|
1
|
+
import { aiSdk } from "@relkit/ai-sdk";
|
|
2
|
+
import { defineApp, env as binding } from "@relkit/app/config";
|
|
2
3
|
import env from "@app/platform/env.js";
|
|
4
|
+
// relkit:create:deployment-imports
|
|
3
5
|
|
|
4
|
-
export default
|
|
6
|
+
export default defineApp({
|
|
5
7
|
env,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
),
|
|
8
|
+
model: {
|
|
9
|
+
openai: aiSdk({
|
|
10
|
+
provider: "openai",
|
|
11
|
+
defaultModel: "gpt-5-mini",
|
|
12
|
+
apiKey: binding.secret("OPENAI_API_KEY"),
|
|
13
|
+
}),
|
|
14
|
+
anthropic: aiSdk({
|
|
15
|
+
provider: "anthropic",
|
|
16
|
+
defaultModel: "claude-sonnet-4-5",
|
|
17
|
+
apiKey: binding.secret("ANTHROPIC_API_KEY"),
|
|
18
|
+
}),
|
|
18
19
|
},
|
|
19
|
-
|
|
20
|
+
defaults: { model: "openai" },
|
|
21
|
+
telemetry: { redaction: { mode: "development-redacted", maxBytes: 65_536 } },
|
|
20
22
|
server: { port: 3000, maxBodyBytes: 1_048_576 },
|
|
21
23
|
inspector: { port: 3210 },
|
|
22
|
-
|
|
24
|
+
// relkit:create:deployment
|
|
23
25
|
});
|
|
@@ -4,10 +4,17 @@ import lookup from "@app/hello/tools/lookup.tool.js";
|
|
|
4
4
|
|
|
5
5
|
export default defineAgent({
|
|
6
6
|
id: "hello.assistant",
|
|
7
|
+
|
|
7
8
|
input: z.object({ question: z.string().min(1) }),
|
|
8
9
|
output: z.object({ answer: z.string() }),
|
|
10
|
+
|
|
9
11
|
model: "openai:gpt-5-mini",
|
|
10
12
|
instructions: "Answer greeting questions with the read-only lookup tool.",
|
|
11
13
|
tools: [lookup],
|
|
12
|
-
|
|
14
|
+
|
|
15
|
+
limits: {
|
|
16
|
+
maxSteps: 4,
|
|
17
|
+
maxToolCalls: 4,
|
|
18
|
+
timeoutMs: 10_000,
|
|
19
|
+
},
|
|
13
20
|
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineFunction } from "@relkit/app/functions";
|
|
2
|
+
import { z } from "@relkit/app/schema";
|
|
3
|
+
import assistant from "@app/hello/agents/assistant.agent.js";
|
|
4
|
+
|
|
5
|
+
export default defineFunction({
|
|
6
|
+
id: "hello.ask-assistant",
|
|
7
|
+
|
|
8
|
+
input: z.object({ question: z.string().min(1) }),
|
|
9
|
+
output: z.object({ answer: z.string() }),
|
|
10
|
+
|
|
11
|
+
dependencies: { agents: { assistant } },
|
|
12
|
+
|
|
13
|
+
handler: async (input, context) => {
|
|
14
|
+
return context.agents.assistant(input);
|
|
15
|
+
},
|
|
16
|
+
});
|
|
@@ -3,10 +3,13 @@ import { z } from "@relkit/app/schema";
|
|
|
3
3
|
|
|
4
4
|
const hello = defineFunction({
|
|
5
5
|
id: "hello.greet",
|
|
6
|
+
|
|
6
7
|
input: z.object({ name: z.string().min(1).default("world") }),
|
|
7
8
|
output: z.object({ message: z.string() }),
|
|
9
|
+
|
|
8
10
|
handler: async ({ name }, context) => {
|
|
9
11
|
context.log.info("hello invoked", { name });
|
|
12
|
+
|
|
10
13
|
return { message: `Hello, ${name}!` };
|
|
11
14
|
},
|
|
12
15
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineTool } from "@relkit/app/tools";
|
|
2
|
+
import hello from "@app/hello/functions/hello.function.js";
|
|
3
|
+
|
|
4
|
+
export default defineTool({
|
|
5
|
+
id: "hello.lookup",
|
|
6
|
+
target: hello,
|
|
7
|
+
description: "Read a greeting for a supplied name",
|
|
8
|
+
|
|
9
|
+
sideEffect: "read",
|
|
10
|
+
approval: "never",
|
|
11
|
+
timeoutMs: 2_000,
|
|
12
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// #region private-tool
|
|
2
|
+
import hello from "@app/hello/functions/hello.function.js";
|
|
3
|
+
|
|
4
|
+
export const privateLookup = hello.asTool({
|
|
5
|
+
id: "hello.private-lookup",
|
|
6
|
+
description: "Read a greeting inside this app only",
|
|
7
|
+
|
|
8
|
+
sideEffect: "read",
|
|
9
|
+
approval: "never",
|
|
10
|
+
timeoutMs: 2_000,
|
|
11
|
+
mcp: false,
|
|
12
|
+
});
|
|
13
|
+
// #endregion private-tool
|
|
14
|
+
|
|
15
|
+
import { defineApp } from "@relkit/app/config";
|
|
16
|
+
import env from "@app/platform/env.js";
|
|
17
|
+
|
|
18
|
+
export const mcpDisabled = defineApp({
|
|
19
|
+
env,
|
|
20
|
+
// #region disable-mcp
|
|
21
|
+
server: {
|
|
22
|
+
port: 3000,
|
|
23
|
+
mcp: false,
|
|
24
|
+
},
|
|
25
|
+
// #endregion disable-mcp
|
|
26
|
+
});
|
|
@@ -2,7 +2,12 @@ import { afterAll, expect, test } from "bun:test";
|
|
|
2
2
|
import { createTestApplication } from "@relkit/testing";
|
|
3
3
|
import config from "../../relkit.config.js";
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const model = {
|
|
6
|
+
resolveModel: (selector = "test:model") => ({ id: selector, model: {} }),
|
|
7
|
+
};
|
|
8
|
+
const testApp = await createTestApplication(config, {
|
|
9
|
+
providers: { model: { openai: model, anthropic: model } },
|
|
10
|
+
});
|
|
6
11
|
|
|
7
12
|
test("GET /hello", async () => {
|
|
8
13
|
const response = await testApp.http.request("/hello?name=Mustafa");
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { expect, test } from "bun:test";
|
|
2
2
|
import { createTestAgent, invokeFunction } from "@relkit/testing";
|
|
3
3
|
import assistant from "@app/hello/agents/assistant.agent.js";
|
|
4
|
+
import askAssistant from "@app/hello/functions/ask-assistant.function.js";
|
|
4
5
|
import hello from "@app/hello/functions/hello.function.js";
|
|
5
6
|
import lookup from "@app/hello/tools/lookup.tool.js";
|
|
6
7
|
|
|
@@ -17,14 +18,26 @@ test("assistant uses a function-derived tool with an offline AI SDK model", asyn
|
|
|
17
18
|
invokeFunction(hello, request.input as Parameters<typeof hello.invoke>[0]),
|
|
18
19
|
},
|
|
19
20
|
model: { provider: "openai", modelId: "gpt-5-mini" },
|
|
21
|
+
// Script the model's choices while running the real greeting function.
|
|
20
22
|
script: [
|
|
21
|
-
{
|
|
23
|
+
{
|
|
24
|
+
type: "tool-call",
|
|
25
|
+
callId: "call-1",
|
|
26
|
+
toolId: "hello.lookup",
|
|
27
|
+
input: { name: "Ada" },
|
|
28
|
+
},
|
|
22
29
|
{ type: "final", output: { answer: "Hello, Ada!" } },
|
|
23
30
|
],
|
|
24
31
|
});
|
|
25
32
|
|
|
26
|
-
await expect(
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
await expect(
|
|
34
|
+
invokeFunction(
|
|
35
|
+
askAssistant,
|
|
36
|
+
{ question: "greet Ada" },
|
|
37
|
+
{
|
|
38
|
+
clients: { agents: { "hello.assistant": agent.invoke } },
|
|
39
|
+
},
|
|
40
|
+
),
|
|
41
|
+
).resolves.toEqual({ answer: "Hello, Ada!" });
|
|
29
42
|
expect(agent.model.calls).toHaveLength(2);
|
|
30
43
|
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { expect, test } from "bun:test";
|
|
2
|
+
import hello from "@app/hello/functions/hello.function.js";
|
|
3
|
+
import lookup from "../fixtures/lookup.tool.js";
|
|
4
|
+
import { mcpDisabled, privateLookup } from "../fixtures/mcp-options.js";
|
|
5
|
+
|
|
6
|
+
test("defineTool reuses the greeting function", async () => {
|
|
7
|
+
expect(lookup.target.ref).toEqual(hello.ref);
|
|
8
|
+
expect(lookup.mcp).toBe(true);
|
|
9
|
+
await expect(lookup.invoke({ name: "Ada" })).resolves.toEqual({
|
|
10
|
+
message: "Hello, Ada!",
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test("MCP visibility can be disabled without disabling ordinary tool invocation", async () => {
|
|
15
|
+
expect(privateLookup.mcp).toBe(false);
|
|
16
|
+
expect(mcpDisabled.server?.mcp).toBe(false);
|
|
17
|
+
await expect(privateLookup.invoke({ name: "Ada" })).resolves.toEqual({
|
|
18
|
+
message: "Hello, Ada!",
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -19,7 +19,5 @@ bun run build
|
|
|
19
19
|
The example routes are `GET /hello?name=RelKit`, `POST /echo` with a JSON
|
|
20
20
|
`message` field, and `POST /orders` with `{ orderId, sku, quantity }`.
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
fail without rolling back the other, and delivery is not a transaction or a
|
|
25
|
-
promise of simultaneous execution.
|
|
22
|
+
The default project needs no Docker daemon, cloud account, or deployment
|
|
23
|
+
credentials.
|
|
@@ -12,19 +12,15 @@
|
|
|
12
12
|
"test:integration": "bun test tests/integration",
|
|
13
13
|
"build": "relkit build",
|
|
14
14
|
"start": "relkit start",
|
|
15
|
-
"graph": "relkit graph print"
|
|
16
|
-
"deploy:preview": "relkit deploy preview",
|
|
17
|
-
"deploy": "relkit deploy up"
|
|
15
|
+
"graph": "relkit graph print"
|
|
18
16
|
},
|
|
19
17
|
"dependencies": {
|
|
20
|
-
"@relkit/app": "0.0
|
|
21
|
-
"@relkit/providers-standard": "0.0.5"
|
|
18
|
+
"@relkit/app": "0.2.0"
|
|
22
19
|
},
|
|
23
20
|
"devDependencies": {
|
|
24
21
|
"@types/bun": "1.3.10",
|
|
25
|
-
"@relkit/cli": "0.0
|
|
26
|
-
"@relkit/
|
|
27
|
-
"@relkit/testing": "0.0.5",
|
|
22
|
+
"@relkit/cli": "0.2.0",
|
|
23
|
+
"@relkit/testing": "0.2.0",
|
|
28
24
|
"typescript": "5.9.3"
|
|
29
25
|
}
|
|
30
26
|
}
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineApp } from "@relkit/app/config";
|
|
2
2
|
import env from "@app/platform/env.js";
|
|
3
|
+
// relkit:create:deployment-imports
|
|
3
4
|
|
|
4
|
-
export default
|
|
5
|
+
export default defineApp({
|
|
5
6
|
env,
|
|
6
|
-
|
|
7
|
-
default: managed(
|
|
8
|
-
eventBridge({
|
|
9
|
-
region: env.EVENT_REGION,
|
|
10
|
-
endpoint: env.EVENT_ENDPOINT,
|
|
11
|
-
busName: env.EVENT_BUS_NAME,
|
|
12
|
-
}),
|
|
13
|
-
),
|
|
14
|
-
},
|
|
15
|
-
telemetry: { bodyCapture: { mode: "off" } },
|
|
7
|
+
telemetry: { redaction: { mode: "development-redacted", maxBytes: 65_536 } },
|
|
16
8
|
server: { port: 3000, maxBodyBytes: 1_048_576 },
|
|
17
9
|
inspector: { port: 3210 },
|
|
18
|
-
|
|
10
|
+
// relkit:create:deployment
|
|
19
11
|
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { defineFunction } from "@relkit/app/functions";
|
|
2
2
|
import { z } from "@relkit/app/schema";
|
|
3
|
-
import orderCreated from "@app/orders/events/order-created.event.js";
|
|
4
3
|
import priceOrder from "@app/orders/functions/price-order.function.js";
|
|
5
4
|
|
|
6
5
|
const orderInput = z.object({
|
|
@@ -8,6 +7,7 @@ const orderInput = z.object({
|
|
|
8
7
|
sku: z.string().min(1),
|
|
9
8
|
quantity: z.number().int().positive(),
|
|
10
9
|
});
|
|
10
|
+
|
|
11
11
|
const orderOutput = z.object({
|
|
12
12
|
orderId: z.string(),
|
|
13
13
|
sku: z.string(),
|
|
@@ -17,11 +17,15 @@ const orderOutput = z.object({
|
|
|
17
17
|
const createOrder = defineFunction({
|
|
18
18
|
input: orderInput,
|
|
19
19
|
output: orderOutput,
|
|
20
|
-
|
|
21
|
-
handler: async (input
|
|
20
|
+
|
|
21
|
+
handler: async (input) => {
|
|
22
22
|
const { totalCents } = await priceOrder.invoke({ quantity: input.quantity });
|
|
23
|
-
const order = {
|
|
24
|
-
|
|
23
|
+
const order = {
|
|
24
|
+
orderId: input.orderId,
|
|
25
|
+
sku: input.sku,
|
|
26
|
+
totalCents,
|
|
27
|
+
};
|
|
28
|
+
|
|
25
29
|
return order;
|
|
26
30
|
},
|
|
27
31
|
});
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { defineService } from "@relkit/app/services";
|
|
2
2
|
import createOrder from "@app/orders/functions/create-order.function.js";
|
|
3
3
|
import priceOrder from "@app/orders/functions/price-order.function.js";
|
|
4
|
-
import orderCreated from "@app/orders/events/order-created.event.js";
|
|
5
4
|
|
|
6
5
|
export default defineService({
|
|
7
6
|
functions: { createOrder, priceOrder },
|
|
8
|
-
events: { orderCreated },
|
|
9
7
|
});
|
|
@@ -2,7 +2,4 @@ import { defineEnv, env } from "@relkit/app/config";
|
|
|
2
2
|
|
|
3
3
|
export default defineEnv({
|
|
4
4
|
LOG_LEVEL: env.literal("trace", "debug", "info", "warn", "error").default("info"),
|
|
5
|
-
EVENT_REGION: env.string().default("us-east-1"),
|
|
6
|
-
EVENT_ENDPOINT: env.url().requiredIn("development", "production"),
|
|
7
|
-
EVENT_BUS_NAME: env.string().requiredIn("development", "production"),
|
|
8
5
|
});
|
|
@@ -3,9 +3,6 @@ import { createTestApplication } from "@relkit/testing";
|
|
|
3
3
|
import config from "../../relkit.config.js";
|
|
4
4
|
|
|
5
5
|
const testApp = await createTestApplication(config);
|
|
6
|
-
testApp.fakes.setClient("events", "orderCreated", {
|
|
7
|
-
publish: async () => ({ accepted: true, instanceId: "event-1" }),
|
|
8
|
-
});
|
|
9
6
|
|
|
10
7
|
test("POST /orders", async () => {
|
|
11
8
|
const response = await testApp.http.request("/orders", {
|
|
@@ -2,25 +2,12 @@ import { expect, test } from "bun:test";
|
|
|
2
2
|
import { invokeFunction } from "@relkit/testing";
|
|
3
3
|
import orders from "@app/orders/service.js";
|
|
4
4
|
|
|
5
|
-
test("createOrder invokes pricing
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
clients: {
|
|
12
|
-
events: {
|
|
13
|
-
orderCreated: {
|
|
14
|
-
publish: async (payload: unknown) => {
|
|
15
|
-
published.push(payload);
|
|
16
|
-
return { accepted: true, instanceId: "event-1" };
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
);
|
|
5
|
+
test("createOrder invokes pricing", async () => {
|
|
6
|
+
const result = await invokeFunction(orders.createOrder, {
|
|
7
|
+
orderId: "order-1",
|
|
8
|
+
sku: "book",
|
|
9
|
+
quantity: 3,
|
|
10
|
+
});
|
|
23
11
|
|
|
24
12
|
expect(result).toEqual({ orderId: "order-1", sku: "book", totalCents: 300 });
|
|
25
|
-
expect(published).toEqual([{ orderId: "order-1", sku: "book", totalCents: 300 }]);
|
|
26
13
|
});
|
|
@@ -14,6 +14,5 @@ bun run typecheck
|
|
|
14
14
|
bun run build
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
The example route is `GET /hello?name=RelKit`.
|
|
18
|
-
|
|
19
|
-
the configured AWS provider set.
|
|
17
|
+
The example route is `GET /hello?name=RelKit`. The default project needs no
|
|
18
|
+
Docker daemon, cloud account, or deployment credentials.
|
|
@@ -12,18 +12,15 @@
|
|
|
12
12
|
"test:integration": "bun test tests/integration",
|
|
13
13
|
"build": "relkit build",
|
|
14
14
|
"start": "relkit start",
|
|
15
|
-
"graph": "relkit graph print"
|
|
16
|
-
"deploy:preview": "relkit deploy preview",
|
|
17
|
-
"deploy": "relkit deploy up"
|
|
15
|
+
"graph": "relkit graph print"
|
|
18
16
|
},
|
|
19
17
|
"dependencies": {
|
|
20
|
-
"@relkit/app": "0.0
|
|
21
|
-
"@relkit/providers-standard": "0.0.5"
|
|
18
|
+
"@relkit/app": "0.2.0"
|
|
22
19
|
},
|
|
23
20
|
"devDependencies": {
|
|
24
21
|
"@types/bun": "1.3.10",
|
|
25
|
-
"@relkit/cli": "0.0
|
|
26
|
-
"@relkit/testing": "0.0
|
|
22
|
+
"@relkit/cli": "0.2.0",
|
|
23
|
+
"@relkit/testing": "0.2.0",
|
|
27
24
|
"typescript": "5.9.3"
|
|
28
25
|
}
|
|
29
26
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineApp } from "@relkit/app/config";
|
|
2
2
|
import env from "@app/platform/env.js";
|
|
3
|
+
// relkit:create:deployment-imports
|
|
3
4
|
|
|
4
|
-
export default
|
|
5
|
+
export default defineApp({
|
|
5
6
|
env,
|
|
6
|
-
telemetry: {
|
|
7
|
+
telemetry: { redaction: { mode: "development-redacted", maxBytes: 65_536 } },
|
|
7
8
|
server: { port: 3000, maxBodyBytes: 1_048_576 },
|
|
8
9
|
inspector: { port: 3210 },
|
|
9
|
-
|
|
10
|
+
// relkit:create:deployment
|
|
10
11
|
});
|
package/package.json
CHANGED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { onEvent } from "@relkit/app/events";
|
|
2
|
-
|
|
3
|
-
const orderAudit = onEvent(
|
|
4
|
-
"orders.created",
|
|
5
|
-
async (payload, context) => {
|
|
6
|
-
context.log.info("order.audit.recorded", {
|
|
7
|
-
orderId: payload.orderId,
|
|
8
|
-
sku: payload.sku,
|
|
9
|
-
totalCents: payload.totalCents,
|
|
10
|
-
});
|
|
11
|
-
},
|
|
12
|
-
{ id: "orders.audit" },
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
export default orderAudit;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { onEvent } from "@relkit/app/events";
|
|
2
|
-
|
|
3
|
-
const orderConfirmation = onEvent(
|
|
4
|
-
"orders.created",
|
|
5
|
-
async (payload, context) => {
|
|
6
|
-
context.log.info("order.confirmation.requested", { orderId: payload.orderId });
|
|
7
|
-
},
|
|
8
|
-
{ id: "orders.confirmation" },
|
|
9
|
-
);
|
|
10
|
-
|
|
11
|
-
export default orderConfirmation;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { defineEvent } from "@relkit/app/events";
|
|
2
|
-
import { z } from "@relkit/app/schema";
|
|
3
|
-
|
|
4
|
-
const orderCreated = defineEvent({
|
|
5
|
-
id: "orders.created",
|
|
6
|
-
version: 1,
|
|
7
|
-
payload: z.object({
|
|
8
|
-
orderId: z.string().min(1),
|
|
9
|
-
sku: z.string().min(1),
|
|
10
|
-
totalCents: z.number().int().nonnegative(),
|
|
11
|
-
}),
|
|
12
|
-
title: "Order created",
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
export default orderCreated;
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "bun:test";
|
|
2
|
-
import { createEventListenerTarget, eventListenerFunctionId } from "@relkit/app/events";
|
|
3
|
-
import { createTestEvent, invokeFunction } from "@relkit/testing";
|
|
4
|
-
import orderCreated from "@app/orders/events/order-created.event.js";
|
|
5
|
-
import orderAudit from "@app/orders/events/order-audit.event.js";
|
|
6
|
-
import orderConfirmation from "@app/orders/events/order-confirmation.event.js";
|
|
7
|
-
import orders from "@app/orders/service.js";
|
|
8
|
-
|
|
9
|
-
const retry = {
|
|
10
|
-
maxAttempts: 1,
|
|
11
|
-
initialDelayMs: 0,
|
|
12
|
-
maxDelayMs: 0,
|
|
13
|
-
multiplier: 1,
|
|
14
|
-
jitter: "none" as const,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
test("order.created fans out deterministic independent deliveries", async () => {
|
|
18
|
-
const confirmationTarget = createEventListenerTarget(
|
|
19
|
-
orderConfirmation,
|
|
20
|
-
[orderCreated],
|
|
21
|
-
eventListenerFunctionId(orderConfirmation.id),
|
|
22
|
-
);
|
|
23
|
-
const auditTarget = createEventListenerTarget(
|
|
24
|
-
orderAudit,
|
|
25
|
-
[orderCreated],
|
|
26
|
-
eventListenerFunctionId(orderAudit.id),
|
|
27
|
-
);
|
|
28
|
-
const failingAuditTarget = {
|
|
29
|
-
...auditTarget,
|
|
30
|
-
handler: async (...args: Parameters<typeof auditTarget.handler>) => {
|
|
31
|
-
await auditTarget.handler(...args);
|
|
32
|
-
throw new Error("audit listener test failure");
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
const event = await createTestEvent({
|
|
36
|
-
event: orderCreated,
|
|
37
|
-
triggers: [
|
|
38
|
-
{ id: orderConfirmation.id, target: confirmationTarget, retry },
|
|
39
|
-
{ id: orderAudit.id, target: failingAuditTarget, retry },
|
|
40
|
-
],
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
await expect(
|
|
45
|
-
invokeFunction(
|
|
46
|
-
orders.createOrder,
|
|
47
|
-
{ orderId: "order-1", sku: "book", quantity: 3 },
|
|
48
|
-
{ clients: { events: { orderCreated: event.provider } } },
|
|
49
|
-
),
|
|
50
|
-
).resolves.toEqual({ orderId: "order-1", sku: "book", totalCents: 300 });
|
|
51
|
-
|
|
52
|
-
await expect(event.drain()).resolves.toMatchObject([
|
|
53
|
-
{
|
|
54
|
-
triggerId: "orders.audit",
|
|
55
|
-
status: "failed",
|
|
56
|
-
state: "dead-lettered",
|
|
57
|
-
attempt: 1,
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
triggerId: "orders.confirmation",
|
|
61
|
-
status: "completed",
|
|
62
|
-
state: "completed",
|
|
63
|
-
attempt: 1,
|
|
64
|
-
},
|
|
65
|
-
]);
|
|
66
|
-
expect(event.completed("orders.confirmation")).toBe(1);
|
|
67
|
-
expect(event.completed("orders.audit")).toBe(0);
|
|
68
|
-
} finally {
|
|
69
|
-
await event.close();
|
|
70
|
-
}
|
|
71
|
-
});
|