Skip to content

Commit 4dd532d

Browse files
authored
common-cli: generic main.ts + example recipe (commontoolsinc#481)
* rewrote main.ts as a general debug tool that launches a recipe * example recipes
1 parent 556d139 commit 4dd532d

File tree

2 files changed

+101
-23
lines changed

2 files changed

+101
-23
lines changed
Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,57 @@
11
// Load .env file
2-
import { CharmManager, createStorage } from "@commontools/charm";
3-
import { fetchInboxEmails } from "./gmail.ts";
2+
import { parse } from "https://deno.land/std/flags/mod.ts";
3+
import { CharmManager, storage, compileRecipe } from "@commontools/charm";
4+
import { getEntityId, isStream } from "@commontools/runner";
5+
6+
const { space, charmId, recipeFile, cause } = parse(Deno.args);
7+
8+
storage.setRemoteStorage(
9+
new URL(process?.env?.TOOLSHED_API_URL ?? "https://toolshed.saga-castor.ts.net/"),
10+
);
411

5-
const replica = "anotherjesse-test5";
6-
const charmId = "baedreihwuw4dbkvcel76siqztlxvloddfahgu535yupgxvkh5ml3wtqgqu";
712
async function main() {
8-
const storage = createStorage({
9-
type: "remote",
10-
replica,
11-
url: new URL("https://toolshed.saga-castor.ts.net/"),
12-
});
13-
const manager = new CharmManager(storage);
13+
const manager = new CharmManager(space ?? "common-cli");
1414
const charms = await manager.getCharms();
1515

16-
await new Promise((resolve) => {
17-
charms.sink((charms) => {
18-
if (charms.length > 0) {
19-
charms.forEach((charm) => {
20-
manager.get(charm.cell.entityId["/"]);
21-
});
22-
resolve(undefined);
23-
}
24-
});
16+
charms.sink((charms) => {
17+
console.log(
18+
"charms:",
19+
charms.map((c) => c.toJSON().cell["/"]),
20+
);
2521
});
2622

27-
const charm = await charms.get(charmId);
28-
console.log({ charm });
23+
if (charmId) {
24+
const charm = await manager.get(charmId);
25+
charm?.sink((value) => {
26+
console.log("charm:", charmId, value);
27+
});
28+
}
29+
30+
if (recipeFile) {
31+
try {
32+
const recipeSrc = await Deno.readTextFile(recipeFile);
33+
const recipe = await compileRecipe(recipeSrc, "recipe", []);
34+
const charm = await manager.runPersistent(recipe, undefined, cause);
35+
await manager.syncRecipe(charm);
36+
manager.add([charm]);
37+
const charmWithSchema = await manager.get(charm);
38+
charmWithSchema.sink((value) => {
39+
console.log("running charm:", getEntityId(charm), value);
40+
});
41+
const updater = charmWithSchema.get()?.updater;
42+
if (isStream(updater)) {
43+
console.log("running updater");
44+
updater.send({ newValues: ["test"] });
45+
}
46+
} catch (error) {
47+
console.error("Error loading and compiling recipe:", error);
48+
}
49+
}
2950

30-
const emails = await fetchInboxEmails();
31-
console.log({ emails });
51+
return new Promise(() => {
52+
// This promise never resolves, keeping the program alive
53+
console.log("Program running. Press Ctrl+C to exit.");
54+
});
3255
}
3356

3457
main();
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { h } from "@commontools/html";
2+
import { recipe, handler, UI, NAME, cell, derive, JSONSchema } from "@commontools/builder";
3+
4+
const inputSchema: JSONSchema = {
5+
type: "object",
6+
properties: {
7+
values: { type: "array", items: { type: "string" } },
8+
},
9+
};
10+
11+
const outputSchema: JSONSchema = {
12+
type: "object",
13+
properties: {
14+
values: { type: "array", items: { type: "string" } },
15+
updater: { asCell: true, type: "action" },
16+
},
17+
};
18+
19+
const updater = handler<{ newValues: string[] }, { values: string[] }>((event, state) => {
20+
if (!state.values) state.values = [];
21+
console.log("updating values", event);
22+
event?.newValues?.forEach((value) => {
23+
console.log("adding value", value);
24+
state.values.push(value);
25+
});
26+
});
27+
28+
const adder = handler<{}, { values: string[] }>((_, state) => {
29+
console.log("adding a value");
30+
if (!state.values) state.values = [];
31+
state.values.push(Math.random().toString(36).substring(2, 15));
32+
});
33+
34+
export default recipe(inputSchema, outputSchema, ({ values }) => {
35+
/*derive(values, (values) => {
36+
console.log("values#", values.length);
37+
});*/
38+
return {
39+
[NAME]: "Simple Value",
40+
[UI]: (
41+
<div>
42+
<button onclick={adder({ values })}>Add Value</button>
43+
<div>
44+
{values.map((value, index) => (
45+
<div>
46+
{index}: {value}
47+
</div>
48+
))}
49+
</div>
50+
</div>
51+
),
52+
updater: updater({ values }),
53+
values,
54+
};
55+
});

0 commit comments

Comments
 (0)