@mochabug/adapt-builder 0.1.0 → 0.1.2

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/index.d.ts CHANGED
@@ -26,6 +26,16 @@ export interface PluginBuildOptions {
26
26
  }
27
27
  type OptionalPluginBuildOptions = DeepPartialExcept<PluginBuildOptions, BuildOptions>;
28
28
  export declare function build(opts?: OptionalPluginBuildOptions): Promise<void>;
29
+ export interface DevOptions {
30
+ port?: number;
31
+ src?: string;
32
+ browser?: {
33
+ build?: {
34
+ define?: Record<string, string>;
35
+ };
36
+ };
37
+ }
38
+ export declare function dev(opts?: DevOptions): Promise<void>;
29
39
  export declare function validateLoadServiceDefinition(basePath: string, srv: ServiceDefinition): Promise<void>;
30
40
  export declare function buildServer(manifest: Manifest, vpathLookup: Record<string, string>, opts: PluginBuildOptions): Promise<void>;
31
41
  export { CDN_URL_DEFAULT };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAC;AAKzD,OAAO,EACL,eAAe,EAchB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,QAAQ,EAET,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gEAAgE,CAAC;AAQnG,KAAK,iBAAiB,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,SAAS,QAAQ,GACpD,CAAC,GACD,CAAC,SAAS,QAAQ,GAClB,CAAC,GACD,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACxB,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GACrC,CAAC,SAAS,MAAM,GAChB;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;CAAE,GACtD,CAAC,CAAC;AAEN,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,mBAAmB,CAAC;IAC7B,GAAG,EAAE,YAAY,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,0BAA0B,GAAG,iBAAiB,CACjD,kBAAkB,EAClB,YAAY,CACb,CAAC;AAKF,wBAAsB,KAAK,CAAC,IAAI,CAAC,EAAE,0BAA0B,iBAwE5D;AAGD,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,iBAAiB,iBAgEvB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,IAAI,EAAE,kBAAkB,iBAuGzB;AAkTD,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAA6B,MAAM,SAAS,CAAC;AAKlE,OAAO,EACL,eAAe,EAchB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,QAAQ,EAET,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gEAAgE,CAAC;AAQnG,KAAK,iBAAiB,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,SAAS,QAAQ,GACpD,CAAC,GACD,CAAC,SAAS,QAAQ,GAClB,CAAC,GACD,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACxB,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GACrC,CAAC,SAAS,MAAM,GAChB;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;CAAE,GACtD,CAAC,CAAC;AAEN,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,mBAAmB,CAAC;IAC7B,GAAG,EAAE,YAAY,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,0BAA0B,GAAG,iBAAiB,CACjD,kBAAkB,EAClB,YAAY,CACb,CAAC;AAKF,wBAAsB,KAAK,CAAC,IAAI,CAAC,EAAE,0BAA0B,iBAwE5D;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE;YACN,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACjC,CAAC;KACH,CAAC;CACH;AAED,wBAAsB,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,iBAgN1C;AAGD,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,iBAAiB,iBAgEvB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,IAAI,EAAE,kBAAkB,iBAuGzB;AAkTD,OAAO,EAAE,eAAe,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  } from "@craftamap/esbuild-plugin-html";
8
8
  import Ajv from "ajv/dist/jtd.js";
9
9
  import chalk from "chalk";
10
- import { build as esbuild } from "esbuild";
10
+ import { context, build as esbuild } from "esbuild";
11
11
  import { sync as glob } from "glob";
12
12
  import fs4 from "node:fs";
13
13
  import path4 from "node:path";
@@ -517,6 +517,171 @@ async function build(opts) {
517
517
  await buildServer(manifest, pathLookup, initOpts);
518
518
  console.log(chalk.bold.green("\n\u2728 Build completed successfully!\n"));
519
519
  }
520
+ async function dev(opts) {
521
+ const port = opts?.port || 3e3;
522
+ const src = opts?.src || DEFAULT_SRC;
523
+ console.log(chalk.bold.cyan("\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"));
524
+ console.log(chalk.bold.cyan("\u2502 \u{1F525} Adapt Plugin Dev Server \u2502"));
525
+ console.log(chalk.bold.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"));
526
+ const manifest = fromJsonString(
527
+ ManifestSchema,
528
+ fs4.readFileSync(MANIFEST_PATH, "utf8")
529
+ );
530
+ console.log(
531
+ chalk.dim("\u2502 ") + `Plugin: ${chalk.bold(
532
+ `${manifest.organization}/${manifest.name}`
533
+ )} ${chalk.dim(`v${manifest.version}`)}`
534
+ );
535
+ const pathLookup = {};
536
+ manifest.vertices = glob(path4.join(src, "**/vertex.json")).map((file) => {
537
+ const res = fromJsonString(VertexSchema, fs4.readFileSync(file, "utf8"));
538
+ pathLookup[res.name] = path4.dirname(file);
539
+ return res;
540
+ });
541
+ if (manifest.vertices.length === 0) {
542
+ console.log(chalk.yellow("\n\u26A0 No vertices found. Nothing to serve.\n"));
543
+ return;
544
+ }
545
+ const hasUI = (v) => fs4.existsSync(path4.join(pathLookup[v.name], "ui"));
546
+ const configVertices = manifest.vertices.filter(
547
+ (v) => Boolean(v.capabilities.find((c) => c === 3 /* CONFIGURATOR */)) && hasUI(v)
548
+ );
549
+ const browserVertices = manifest.vertices.filter(
550
+ (v) => Boolean(v.capabilities.find((c) => c === 4 /* BROWSER */)) && hasUI(v)
551
+ );
552
+ const totalUI = configVertices.length + browserVertices.length;
553
+ if (totalUI === 0) {
554
+ console.log(
555
+ chalk.yellow("\n\u26A0 No UI components found. Nothing to serve.\n")
556
+ );
557
+ return;
558
+ }
559
+ console.log(
560
+ chalk.dim("\u2502 ") + `Found ${chalk.bold(totalUI)} UI component${totalUI === 1 ? "" : "s"}
561
+ `
562
+ );
563
+ const configs = Object.fromEntries(
564
+ configVertices.map((v) => [v.name, pathLookup[v.name]])
565
+ );
566
+ const browsers = Object.fromEntries(
567
+ browserVertices.map((v) => [v.name, pathLookup[v.name]])
568
+ );
569
+ const configEntrypoints = findConfigEntrypoints(configs);
570
+ const browserEntrypoints = findBrowserEntrypoints(browsers);
571
+ const entrypointMap = {};
572
+ const ssgEntryPoints = [...configEntrypoints, ...browserEntrypoints].filter((ep) => ep.ssg !== void 0).map((ep) => {
573
+ entrypointMap[ep.ssg] = {
574
+ vertex: ep.name,
575
+ config: configEntrypoints.includes(ep)
576
+ };
577
+ return ep.ssg;
578
+ });
579
+ const execDefines = {};
580
+ const configDefines = {};
581
+ if (ssgEntryPoints.length > 0) {
582
+ const ssgSpinner = ora({
583
+ text: "Running SSG...",
584
+ prefixText: chalk.dim("\u2502")
585
+ }).start();
586
+ const ssgOutdir = path4.join("dist", "ssg-dev");
587
+ removeDirIfExists(ssgOutdir);
588
+ try {
589
+ const ssgResult = await esbuild({
590
+ ...DEFAULT_SSG_OPTIONS,
591
+ outdir: ssgOutdir,
592
+ entryPoints: ssgEntryPoints
593
+ });
594
+ for (const [outputPath, outputMeta] of Object.entries(
595
+ ssgResult.metafile.outputs
596
+ )) {
597
+ if (!outputMeta.entryPoint) continue;
598
+ const mapInfo = entrypointMap[outputMeta.entryPoint];
599
+ if (!mapInfo) continue;
600
+ const { default: render } = await import(`file://${path4.resolve(outputPath)}`);
601
+ if (mapInfo.config) {
602
+ configDefines[mapInfo.vertex] = render.default();
603
+ } else {
604
+ execDefines[mapInfo.vertex] = render.default();
605
+ }
606
+ }
607
+ ssgSpinner.succeed("SSG completed");
608
+ } catch (err) {
609
+ ssgSpinner.warn("SSG failed, continuing without static content");
610
+ }
611
+ }
612
+ const outdir = path4.join(DEFAULT_CDN, "browser");
613
+ removeDirIfExists(outdir);
614
+ const publicPath = `http://localhost:${port}/`;
615
+ const htmlFiles = [
616
+ ...browserEntrypoints.map((b) => ({
617
+ entryPoints: [b.browser],
618
+ filename: path4.join(b.name, EXECUTOR_HTML),
619
+ htmlTemplate: fs4.readFileSync(b.html, "utf8"),
620
+ scriptLoading: "module",
621
+ define: {
622
+ ...execDefines[b.name] ? { content: execDefines[b.name] } : {},
623
+ baseCdn: publicPath
624
+ }
625
+ })),
626
+ ...configEntrypoints.map((c) => ({
627
+ entryPoints: [c.browser],
628
+ filename: path4.join(c.name, CONFIGURATOR_HTML),
629
+ htmlTemplate: fs4.readFileSync(c.html, "utf8"),
630
+ scriptLoading: "module",
631
+ define: {
632
+ ...configDefines[c.name] ? { content: configDefines[c.name] } : {},
633
+ baseCdn: publicPath
634
+ }
635
+ }))
636
+ ];
637
+ const buildSpinner = ora({
638
+ text: "Starting dev server...",
639
+ prefixText: chalk.dim("\u2502")
640
+ }).start();
641
+ const ctx = await context({
642
+ ...DEFAULT_BROWSER_OPTIONS,
643
+ outdir,
644
+ publicPath,
645
+ minify: false,
646
+ sourcemap: true,
647
+ entryPoints: [
648
+ ...configEntrypoints.map((c) => c.browser),
649
+ ...browserEntrypoints.map((b) => b.browser)
650
+ ],
651
+ define: {
652
+ ...DEFAULT_BROWSER_OPTIONS.define,
653
+ ...opts?.browser?.build?.define
654
+ },
655
+ banner: {
656
+ js: `new EventSource('/esbuild').addEventListener('change', () => location.reload());`
657
+ },
658
+ plugins: [htmlPlugin({ files: htmlFiles })]
659
+ });
660
+ await ctx.watch();
661
+ const { port: servePort } = await ctx.serve({
662
+ servedir: outdir,
663
+ port
664
+ });
665
+ buildSpinner.succeed("Dev server started");
666
+ console.log(chalk.bold.green("\n\u2728 Dev server running!\n"));
667
+ console.log(
668
+ chalk.dim("\u2502 ") + `Server: ${chalk.cyan(`http://localhost:${servePort}/`)}`
669
+ );
670
+ console.log(chalk.dim("\u2502"));
671
+ console.log(chalk.dim("\u2502 ") + chalk.bold("Available pages:"));
672
+ for (const b of browserEntrypoints) {
673
+ console.log(
674
+ chalk.dim("\u2502 ") + `${chalk.cyan(b.name)}: http://localhost:${servePort}/${b.name}/${EXECUTOR_HTML}`
675
+ );
676
+ }
677
+ for (const c of configEntrypoints) {
678
+ console.log(
679
+ chalk.dim("\u2502 ") + `${chalk.magenta(c.name)} (config): http://localhost:${servePort}/${c.name}/${CONFIGURATOR_HTML}`
680
+ );
681
+ }
682
+ console.log(chalk.dim("\u2502"));
683
+ console.log(chalk.dim("\u2502 ") + chalk.gray("Press Ctrl+C to stop\n"));
684
+ }
520
685
  async function validateLoadServiceDefinition(basePath, srv) {
521
686
  switch (srv.type.case) {
522
687
  case "variable": {
@@ -894,6 +1059,7 @@ export {
894
1059
  CDN_URL_DEFAULT,
895
1060
  build,
896
1061
  buildServer,
1062
+ dev,
897
1063
  validateLoadServiceDefinition
898
1064
  };
899
1065
  //# sourceMappingURL=index.js.map