blokctl 0.6.2 → 0.6.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.
@@ -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.2";
20
+ const GITHUB_REPO_RELEASE_TAG = "v0.6.3";
21
21
  fsExtra.ensureDirSync(HOME_DIR);
22
22
  const options = {
23
23
  baseDir: HOME_DIR,
@@ -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 templateDir = `${repoSource}/triggers/${triggerKind}/template/src`;
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 (fsExtra.existsSync(`${triggerSrcDir}/runner`)) {
329
- fsExtra.copySync(`${triggerSrcDir}/runner`, `${triggerDestDir}/runner`);
330
- }
331
- if (fsExtra.existsSync(`${triggerSrcDir}/AppRoutes.ts`)) {
332
- fsExtra.copySync(`${triggerSrcDir}/AppRoutes.ts`, `${triggerDestDir}/AppRoutes.ts`);
333
- }
334
- if (fsExtra.existsSync(`${triggerSrcDir}/workflows`)) {
335
- fsExtra.copySync(`${triggerSrcDir}/workflows`, `${dirPath}/src/workflows/${triggerKind}`);
336
- }
337
- if (triggerKind === "sse" && fsExtra.existsSync(`${triggerSrcDir}/SSETrigger.ts`)) {
338
- fsExtra.copySync(`${triggerSrcDir}/SSETrigger.ts`, `${triggerDestDir}/SSETrigger.ts`);
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
- if (fsExtra.existsSync(`${triggerSrcDir}/lib.ts`)) {
341
- fsExtra.copySync(`${triggerSrcDir}/lib.ts`, `${triggerDestDir}/lib.ts`);
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-queue": "triggers/queue",
437
+ "@blokjs/trigger-worker": "triggers/worker",
419
438
  };
420
- const BLOKJS_DEP_RANGE = "^0.6.2";
439
+ const BLOKJS_DEP_RANGE = "^0.6.3";
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-queue"] = localRepoPath
491
- ? `file:${path.resolve(repoSource, "triggers/queue")}`
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("// Import HTTP workflows here");
651
+ imports.push("// HTTP workflows are auto-discovered from workflows/json/");
639
652
  }
640
653
  else if (trigger === "sse") {
641
- imports.push('import OnConnect from "./workflows/sse/notifications/on-connect";');
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 OnQueueMessage from "./workflows/queue/messages/on-message";');
652
- workflowEntries.push('\t"on-queue-message": OnQueueMessage,');
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 QueueServer from "./runner/QueueServer";
817
+ import WorkerServer from "./runner/WorkerServer";
808
818
 
809
819
  export default class App {
810
- private queueServer: QueueServer = <QueueServer>{};
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.queueServer = new QueueServer();
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.queueServer.listen();
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/QueueServer.ts`, up: "../../../" });
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/QueueServer.ts`;
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: "RedisAdapter",
953
- init: `new RedisAdapter({
954
- host: process.env.REDIS_HOST || "localhost",
955
- port: Number(process.env.REDIS_PORT) || 6379,
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: "NATSAdapter",
960
- init: `new NATSAdapter({
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-queue["'];/, `import { ${config.importName}, QueueTrigger } from "@blokjs/trigger-queue";`);
969
- content = content.replace(/(export default class \w+ extends QueueTrigger \{[\s\S]*?)\n\tprotected adapter = new \w+\(\{[\s\S]*?\}\);/, `$1\n\tprotected adapter = ${config.init};`);
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.2",
3
+ "version": "0.6.3",
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.2",
33
+ "@blokjs/runner": "^0.6.3",
34
34
  "@clack/prompts": "^1.0.0",
35
35
  "ai": "^4.3.16",
36
36
  "better-sqlite3": "^12.6.2",