blokctl 0.6.2 → 0.6.4
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/commands/create/project.js +59 -47
- package/package.json +2 -2
|
@@ -17,7 +17,7 @@ const exec = util.promisify(child_process.exec);
|
|
|
17
17
|
const HOME_DIR = `${os.homedir()}/.blok`;
|
|
18
18
|
const GITHUB_REPO_LOCAL = `${HOME_DIR}/blok`;
|
|
19
19
|
const GITHUB_REPO_REMOTE = "https://github.com/well-prado/blok.git";
|
|
20
|
-
const GITHUB_REPO_RELEASE_TAG = "v0.6.
|
|
20
|
+
const GITHUB_REPO_RELEASE_TAG = "v0.6.4";
|
|
21
21
|
fsExtra.ensureDirSync(HOME_DIR);
|
|
22
22
|
const options = {
|
|
23
23
|
baseDir: HOME_DIR,
|
|
@@ -259,7 +259,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
259
259
|
const triggerConfigs = selectedTriggers.map((kind) => createTriggerConfig(kind));
|
|
260
260
|
const primaryTrigger = selectedTriggers[0];
|
|
261
261
|
const primaryTriggerDir = primaryTrigger === "pubsub" || primaryTrigger === "queue"
|
|
262
|
-
? `${repoSource}/triggers/${primaryTrigger}/template`
|
|
262
|
+
? `${repoSource}/triggers/${primaryTrigger === "queue" ? "worker" : primaryTrigger}/template`
|
|
263
263
|
: `${repoSource}/triggers/${primaryTrigger}`;
|
|
264
264
|
const baseFiles = ["package.json", "tsconfig.json", ".env.example", ".gitignore", "vitest.config.ts"];
|
|
265
265
|
for (const file of baseFiles) {
|
|
@@ -306,7 +306,8 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
306
306
|
const triggerDestDir = `${dirPath}/src/triggers/${triggerKind}`;
|
|
307
307
|
fsExtra.ensureDirSync(triggerDestDir);
|
|
308
308
|
if (triggerKind === "pubsub" || triggerKind === "queue") {
|
|
309
|
-
const
|
|
309
|
+
const templatePkgDir = triggerKind === "queue" ? "worker" : triggerKind;
|
|
310
|
+
const templateDir = `${repoSource}/triggers/${templatePkgDir}/template/src`;
|
|
310
311
|
if (fsExtra.existsSync(templateDir)) {
|
|
311
312
|
fsExtra.copySync(templateDir, triggerDestDir);
|
|
312
313
|
if (fsExtra.existsSync(`${templateDir}/workflows`)) {
|
|
@@ -325,20 +326,38 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
325
326
|
}
|
|
326
327
|
else {
|
|
327
328
|
const triggerSrcDir = `${repoSource}/triggers/${triggerKind}/src`;
|
|
328
|
-
if (
|
|
329
|
-
fsExtra.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
329
|
+
if (triggerKind === "sse") {
|
|
330
|
+
const entries = fsExtra.readdirSync(triggerSrcDir, { withFileTypes: true });
|
|
331
|
+
for (const entry of entries) {
|
|
332
|
+
const src = `${triggerSrcDir}/${entry.name}`;
|
|
333
|
+
if (entry.isFile()) {
|
|
334
|
+
if (entry.name.endsWith(".test.ts") || entry.name.endsWith(".integration.test.ts")) {
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
fsExtra.copySync(src, `${triggerDestDir}/${entry.name}`);
|
|
338
|
+
}
|
|
339
|
+
else if (entry.isDirectory()) {
|
|
340
|
+
if (entry.name === "__tests__")
|
|
341
|
+
continue;
|
|
342
|
+
if (entry.name === "workflows") {
|
|
343
|
+
fsExtra.copySync(src, `${dirPath}/src/workflows/${triggerKind}`);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
fsExtra.copySync(src, `${triggerDestDir}/${entry.name}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
339
350
|
}
|
|
340
|
-
|
|
341
|
-
fsExtra.
|
|
351
|
+
else {
|
|
352
|
+
if (fsExtra.existsSync(`${triggerSrcDir}/runner`)) {
|
|
353
|
+
fsExtra.copySync(`${triggerSrcDir}/runner`, `${triggerDestDir}/runner`);
|
|
354
|
+
}
|
|
355
|
+
if (fsExtra.existsSync(`${triggerSrcDir}/AppRoutes.ts`)) {
|
|
356
|
+
fsExtra.copySync(`${triggerSrcDir}/AppRoutes.ts`, `${triggerDestDir}/AppRoutes.ts`);
|
|
357
|
+
}
|
|
358
|
+
if (fsExtra.existsSync(`${triggerSrcDir}/workflows`)) {
|
|
359
|
+
fsExtra.copySync(`${triggerSrcDir}/workflows`, `${dirPath}/src/workflows/${triggerKind}`);
|
|
360
|
+
}
|
|
342
361
|
}
|
|
343
362
|
}
|
|
344
363
|
}
|
|
@@ -415,9 +434,9 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
415
434
|
"@blokjs/runner": "core/runner",
|
|
416
435
|
"@blokjs/shared": "core/shared",
|
|
417
436
|
"@blokjs/trigger-pubsub": "triggers/pubsub",
|
|
418
|
-
"@blokjs/trigger-
|
|
437
|
+
"@blokjs/trigger-worker": "triggers/worker",
|
|
419
438
|
};
|
|
420
|
-
const BLOKJS_DEP_RANGE = "^0.6.
|
|
439
|
+
const BLOKJS_DEP_RANGE = "^0.6.4";
|
|
421
440
|
for (const depGroup of ["dependencies", "devDependencies", "peerDependencies"]) {
|
|
422
441
|
const deps = packageJsonContent[depGroup];
|
|
423
442
|
if (!deps)
|
|
@@ -487,8 +506,8 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
487
506
|
: BLOKJS_DEP_RANGE;
|
|
488
507
|
}
|
|
489
508
|
if (selectedTriggers.includes("queue")) {
|
|
490
|
-
triggerPackageDeps["@blokjs/trigger-
|
|
491
|
-
? `file:${path.resolve(repoSource, "triggers/
|
|
509
|
+
triggerPackageDeps["@blokjs/trigger-worker"] = localRepoPath
|
|
510
|
+
? `file:${path.resolve(repoSource, "triggers/worker")}`
|
|
492
511
|
: BLOKJS_DEP_RANGE;
|
|
493
512
|
}
|
|
494
513
|
if (Object.keys(triggerPackageDeps).length > 0) {
|
|
@@ -611,12 +630,6 @@ function generateSharedNodesFile(triggers, _repoSource) {
|
|
|
611
630
|
nodeImports.add('import type { BlokService } from "@blokjs/runner";');
|
|
612
631
|
nodeExports.set("@blokjs/api-call", "ApiCall");
|
|
613
632
|
nodeExports.set("@blokjs/if-else", "IfElse");
|
|
614
|
-
for (const trigger of triggers) {
|
|
615
|
-
if (trigger === "sse") {
|
|
616
|
-
nodeImports.add('import WelcomeMessage from "./nodes/welcome-message/index";');
|
|
617
|
-
nodeExports.set("welcome-message", "WelcomeMessage");
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
633
|
const importLines = Array.from(nodeImports).join("\n");
|
|
621
634
|
const exportEntries = Array.from(nodeExports.entries())
|
|
622
635
|
.map(([key, value]) => `\t"${key}": ${value},`)
|
|
@@ -635,21 +648,18 @@ function generateSharedWorkflowsFile(triggers) {
|
|
|
635
648
|
const workflowEntries = [];
|
|
636
649
|
for (const trigger of triggers) {
|
|
637
650
|
if (trigger === "http") {
|
|
638
|
-
imports.push("//
|
|
651
|
+
imports.push("// HTTP workflows are auto-discovered from workflows/json/");
|
|
639
652
|
}
|
|
640
653
|
else if (trigger === "sse") {
|
|
641
|
-
imports.push(
|
|
642
|
-
imports.push('import OnSubscribe from "./workflows/sse/notifications/on-subscribe";');
|
|
643
|
-
workflowEntries.push('\t"on-connect": OnConnect,');
|
|
644
|
-
workflowEntries.push('\t"on-subscribe": OnSubscribe,');
|
|
654
|
+
imports.push("// SSE workflows: register in this Workflows record manually");
|
|
645
655
|
}
|
|
646
656
|
else if (trigger === "pubsub") {
|
|
647
657
|
imports.push('import OnPubSubMessage from "./workflows/pubsub/messages/on-message";');
|
|
648
658
|
workflowEntries.push('\t"on-pubsub-message": OnPubSubMessage,');
|
|
649
659
|
}
|
|
650
660
|
else if (trigger === "queue") {
|
|
651
|
-
imports.push('import
|
|
652
|
-
workflowEntries.push('\t"
|
|
661
|
+
imports.push('import ProcessJob from "./workflows/queue/jobs/process-job";');
|
|
662
|
+
workflowEntries.push('\t"process-job": ProcessJob,');
|
|
653
663
|
}
|
|
654
664
|
}
|
|
655
665
|
const importSection = imports.length > 0 ? `${imports.join("\n")}\n` : "";
|
|
@@ -804,10 +814,10 @@ if (process.env.DISABLE_TRIGGER_RUN !== "true") {
|
|
|
804
814
|
if (triggerKind === "queue") {
|
|
805
815
|
return `import { DefaultLogger } from "@blokjs/runner";
|
|
806
816
|
import { type Span, metrics, trace } from "@opentelemetry/api";
|
|
807
|
-
import
|
|
817
|
+
import WorkerServer from "./runner/WorkerServer";
|
|
808
818
|
|
|
809
819
|
export default class App {
|
|
810
|
-
private
|
|
820
|
+
private workerServer: WorkerServer = <WorkerServer>{};
|
|
811
821
|
protected trigger_initializer = 0;
|
|
812
822
|
protected initializer = 0;
|
|
813
823
|
protected tracer = trace.getTracer(
|
|
@@ -821,12 +831,12 @@ export default class App {
|
|
|
821
831
|
|
|
822
832
|
constructor() {
|
|
823
833
|
this.initializer = performance.now();
|
|
824
|
-
this.
|
|
834
|
+
this.workerServer = new WorkerServer();
|
|
825
835
|
}
|
|
826
836
|
|
|
827
837
|
async run() {
|
|
828
838
|
this.tracer.startActiveSpan("initialization", async (span: Span) => {
|
|
829
|
-
await this.
|
|
839
|
+
await this.workerServer.listen();
|
|
830
840
|
this.initializer = performance.now() - this.initializer;
|
|
831
841
|
|
|
832
842
|
this.logger.log(\`Queue trigger initialized in \${(this.initializer).toFixed(2)}ms\`);
|
|
@@ -880,7 +890,7 @@ function fixRunnerImportPaths(triggerDestDir, triggerKind) {
|
|
|
880
890
|
fileFixes.push({ file: `${triggerDestDir}/runner/PubSubServer.ts`, up: "../../../" });
|
|
881
891
|
}
|
|
882
892
|
else if (triggerKind === "queue") {
|
|
883
|
-
fileFixes.push({ file: `${triggerDestDir}/runner/
|
|
893
|
+
fileFixes.push({ file: `${triggerDestDir}/runner/WorkerServer.ts`, up: "../../../" });
|
|
884
894
|
}
|
|
885
895
|
for (const { file, up } of fileFixes) {
|
|
886
896
|
if (!fsExtra.existsSync(file))
|
|
@@ -924,7 +934,7 @@ function updatePubSubProvider(triggerDestDir, provider) {
|
|
|
924
934
|
fsExtra.writeFileSync(serverPath, content);
|
|
925
935
|
}
|
|
926
936
|
function updateQueueProvider(triggerDestDir, provider) {
|
|
927
|
-
const serverPath = `${triggerDestDir}/runner/
|
|
937
|
+
const serverPath = `${triggerDestDir}/runner/WorkerServer.ts`;
|
|
928
938
|
if (!fsExtra.existsSync(serverPath))
|
|
929
939
|
return;
|
|
930
940
|
let content = fsExtra.readFileSync(serverPath, "utf8");
|
|
@@ -949,15 +959,17 @@ function updateQueueProvider(triggerDestDir, provider) {
|
|
|
949
959
|
})`,
|
|
950
960
|
},
|
|
951
961
|
redis: {
|
|
952
|
-
importName: "
|
|
953
|
-
init: `new
|
|
954
|
-
|
|
955
|
-
|
|
962
|
+
importName: "BullMQAdapter",
|
|
963
|
+
init: `new BullMQAdapter({
|
|
964
|
+
connection: {
|
|
965
|
+
host: process.env.REDIS_HOST || "localhost",
|
|
966
|
+
port: Number(process.env.REDIS_PORT) || 6379,
|
|
967
|
+
},
|
|
956
968
|
})`,
|
|
957
969
|
},
|
|
958
970
|
nats: {
|
|
959
|
-
importName: "
|
|
960
|
-
init: `new
|
|
971
|
+
importName: "NATSWorkerAdapter",
|
|
972
|
+
init: `new NATSWorkerAdapter({
|
|
961
973
|
servers: (process.env.NATS_SERVERS || "localhost:4222").split(","),
|
|
962
974
|
})`,
|
|
963
975
|
},
|
|
@@ -965,8 +977,8 @@ function updateQueueProvider(triggerDestDir, provider) {
|
|
|
965
977
|
const config = adapterConfigs[provider];
|
|
966
978
|
if (!config)
|
|
967
979
|
return;
|
|
968
|
-
content = content.replace(/import \{ (\w+), (\w+) \} from ["']@blokjs\/trigger-
|
|
969
|
-
content = content.replace(/(export default class \w+ extends
|
|
980
|
+
content = content.replace(/import \{ (\w+), (\w+) \} from ["']@blokjs\/trigger-worker["'];/, `import { ${config.importName}, WorkerTrigger } from "@blokjs/trigger-worker";`);
|
|
981
|
+
content = content.replace(/(export default class \w+ extends WorkerTrigger \{[\s\S]*?)\n\tprotected adapter = new \w+\(\{[\s\S]*?\}\);/, `$1\n\tprotected adapter = ${config.init};`);
|
|
970
982
|
fsExtra.writeFileSync(serverPath, content);
|
|
971
983
|
const workflowPath = `${triggerDestDir}/workflows/messages/on-message.ts`;
|
|
972
984
|
if (fsExtra.existsSync(workflowPath)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blokctl",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"author": "Deskree Technologies Inc.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"description": "cli for blok",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"keywords": ["blokctl", "cli", "blok", "blok"],
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@ai-sdk/openai": "^1.3.22",
|
|
33
|
-
"@blokjs/runner": "^0.6.
|
|
33
|
+
"@blokjs/runner": "^0.6.4",
|
|
34
34
|
"@clack/prompts": "^1.0.0",
|
|
35
35
|
"ai": "^4.3.16",
|
|
36
36
|
"better-sqlite3": "^12.6.2",
|