everything-dev 1.17.0 → 1.20.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.
Files changed (52) hide show
  1. package/dist/cli/init.cjs +165 -84
  2. package/dist/cli/init.cjs.map +1 -1
  3. package/dist/cli/init.d.cts +14 -2
  4. package/dist/cli/init.d.cts.map +1 -1
  5. package/dist/cli/init.d.mts +14 -2
  6. package/dist/cli/init.d.mts.map +1 -1
  7. package/dist/cli/init.mjs +164 -85
  8. package/dist/cli/init.mjs.map +1 -1
  9. package/dist/cli/prompts.cjs +12 -14
  10. package/dist/cli/prompts.cjs.map +1 -1
  11. package/dist/cli/prompts.mjs +12 -14
  12. package/dist/cli/prompts.mjs.map +1 -1
  13. package/dist/cli/timing.cjs +21 -1
  14. package/dist/cli/timing.cjs.map +1 -1
  15. package/dist/cli/timing.mjs +21 -1
  16. package/dist/cli/timing.mjs.map +1 -1
  17. package/dist/cli/upgrade.cjs +114 -49
  18. package/dist/cli/upgrade.cjs.map +1 -1
  19. package/dist/cli/upgrade.mjs +114 -49
  20. package/dist/cli/upgrade.mjs.map +1 -1
  21. package/dist/contract.cjs +1 -4
  22. package/dist/contract.cjs.map +1 -1
  23. package/dist/contract.d.cts +4 -10
  24. package/dist/contract.d.cts.map +1 -1
  25. package/dist/contract.d.mts +4 -10
  26. package/dist/contract.d.mts.map +1 -1
  27. package/dist/contract.meta.cjs +5 -5
  28. package/dist/contract.meta.cjs.map +1 -1
  29. package/dist/contract.meta.d.cts +9 -9
  30. package/dist/contract.meta.d.mts +9 -9
  31. package/dist/contract.meta.mjs +5 -5
  32. package/dist/contract.meta.mjs.map +1 -1
  33. package/dist/contract.mjs +1 -4
  34. package/dist/contract.mjs.map +1 -1
  35. package/dist/plugin.cjs +83 -119
  36. package/dist/plugin.cjs.map +1 -1
  37. package/dist/plugin.d.cts +3 -6
  38. package/dist/plugin.d.cts.map +1 -1
  39. package/dist/plugin.d.mts +3 -6
  40. package/dist/plugin.d.mts.map +1 -1
  41. package/dist/plugin.mjs +84 -120
  42. package/dist/plugin.mjs.map +1 -1
  43. package/dist/types.d.cts +2 -2
  44. package/dist/types.d.mts +2 -2
  45. package/package.json +5 -5
  46. package/src/cli/init.ts +224 -162
  47. package/src/cli/prompts.ts +17 -22
  48. package/src/cli/timing.ts +27 -0
  49. package/src/cli/upgrade.ts +173 -56
  50. package/src/contract.meta.ts +6 -8
  51. package/src/contract.ts +1 -4
  52. package/src/plugin.ts +189 -209
package/dist/plugin.cjs CHANGED
@@ -409,58 +409,20 @@ var plugin_default = (0, every_plugin.createPlugin)({
409
409
  const integrity = publishedUrl ? await require_integrity.computeSriHashForUrl(publishedUrl) : null;
410
410
  const version = manifest?.plugin.version ?? pkgJson.version;
411
411
  if (publishedUrl) {
412
- const pluginConfigPath = (0, node_path.join)(localPath, "bos.config.json");
413
- if ((0, node_fs.existsSync)(pluginConfigPath)) try {
414
- const pluginConfig = JSON.parse((0, node_fs.readFileSync)(pluginConfigPath, "utf-8"));
415
- if (!pluginConfig.plugins || typeof pluginConfig.plugins !== "object") pluginConfig.plugins = {};
416
- const plugins = pluginConfig.plugins;
412
+ const rootConfigPath = (0, node_path.join)(deps.configDir, "bos.config.json");
413
+ try {
414
+ const rootConfig = JSON.parse((0, node_fs.readFileSync)(rootConfigPath, "utf-8"));
415
+ if (!rootConfig.plugins || typeof rootConfig.plugins !== "object") rootConfig.plugins = {};
416
+ const plugins = rootConfig.plugins;
417
417
  if (!plugins[input.key] || typeof plugins[input.key] !== "object") plugins[input.key] = {};
418
418
  const entry = plugins[input.key];
419
419
  entry.production = publishedUrl;
420
420
  if (integrity) entry.integrity = integrity;
421
421
  else delete entry.integrity;
422
- (0, node_fs.writeFileSync)(pluginConfigPath, `${JSON.stringify(pluginConfig, null, 2)}\n`);
423
- console.log(` ✅ Updated ${pluginConfigPath}: plugins.${input.key}.production`);
422
+ (0, node_fs.writeFileSync)(rootConfigPath, `${JSON.stringify(rootConfig, null, 2)}\n`);
423
+ console.log(` ✅ Updated bos.config.json: plugins.${input.key}.production`);
424
424
  } catch (err) {
425
- console.error(` ❌ Failed to update plugin bos.config.json:`, err instanceof Error ? err.message : err);
426
- }
427
- const account = deps.bosConfig.account;
428
- const network = require_network.getNetworkIdForAccount(account);
429
- let pluginDomain;
430
- if ((0, node_fs.existsSync)(pluginConfigPath)) try {
431
- const pluginConfig = JSON.parse((0, node_fs.readFileSync)(pluginConfigPath, "utf-8"));
432
- if (typeof pluginConfig.domain === "string") pluginDomain = pluginConfig.domain;
433
- } catch {}
434
- if (!pluginDomain) pluginDomain = `${input.key}.${deps.bosConfig.domain ?? "everything.dev"}`;
435
- try {
436
- const registryEntries = {};
437
- if ((0, node_fs.existsSync)(pluginConfigPath)) try {
438
- const publishedPluginConfig = JSON.parse((0, node_fs.readFileSync)(pluginConfigPath, "utf-8"));
439
- delete publishedPluginConfig.development;
440
- registryEntries[`apps/${account}/${pluginDomain}/bos.config.json`] = JSON.stringify(publishedPluginConfig);
441
- } catch {}
442
- if (Object.keys(registryEntries).length > 0) {
443
- const payload = JSON.stringify(registryEntries);
444
- const argsBase64 = Buffer.from(payload).toString("base64");
445
- const privateKey = process.env.NEAR_PRIVATE_KEY || process.env.BOS_NEAR_PRIVATE_KEY;
446
- await effect.Effect.runPromise(require_near_cli.ensureNearCli);
447
- try {
448
- await effect.Effect.runPromise(require_near_cli.executeTransaction({
449
- account,
450
- contract: require_fastkv.getRegistryNamespaceForNetwork(network),
451
- method: "__fastdata_kv",
452
- argsBase64,
453
- network,
454
- privateKey,
455
- gas: "50Tgas",
456
- deposit: "0NEAR"
457
- }));
458
- } catch (registryError) {
459
- if (!extractTransactionHash(registryError)) console.warn(`[publish] Plugin registry write failed: ${registryError instanceof Error ? registryError.message : registryError}`);
460
- }
461
- }
462
- } catch (registryError) {
463
- console.warn(`[publish] Plugin registry write skipped: ${registryError instanceof Error ? registryError.message : registryError}`);
425
+ console.error(` ❌ Failed to update bos.config.json:`, err instanceof Error ? err.message : err);
464
426
  }
465
427
  await generateCodeArtifacts(deps.configDir, deps.bosConfig);
466
428
  }
@@ -728,18 +690,6 @@ var plugin_default = (0, every_plugin.createPlugin)({
728
690
  }
729
691
  }
730
692
  const registryEntries = { [`apps/${account}/${gateway}/bos.config.json`]: JSON.stringify(publishConfig) };
731
- for (const [pluginKey, pluginEntry] of Object.entries(publishConfig.plugins ?? {})) {
732
- const pluginRef = getPluginRef(pluginEntry);
733
- if (!pluginRef?.development?.startsWith("local:")) continue;
734
- const pluginConfigPath = (0, node_path.join)((0, node_path.join)(deps.configDir, pluginRef.development.slice(6)), "bos.config.json");
735
- if (!(0, node_fs.existsSync)(pluginConfigPath)) continue;
736
- try {
737
- const pluginConfig = JSON.parse((0, node_fs.readFileSync)(pluginConfigPath, "utf-8"));
738
- const pluginDomain = typeof pluginConfig.domain === "string" ? pluginConfig.domain : `${pluginKey}.${gateway}`;
739
- delete pluginConfig.development;
740
- registryEntries[`apps/${account}/${pluginDomain}/bos.config.json`] = JSON.stringify(pluginConfig);
741
- } catch {}
742
- }
743
693
  const payload = JSON.stringify(registryEntries);
744
694
  const argsBase64 = Buffer.from(payload).toString("base64");
745
695
  const privateKey = input.privateKey || process.env.NEAR_PRIVATE_KEY || process.env.BOS_NEAR_PRIVATE_KEY;
@@ -829,33 +779,34 @@ var plugin_default = (0, every_plugin.createPlugin)({
829
779
  init: builder.init.handler(async ({ input }) => {
830
780
  try {
831
781
  const timings = [];
832
- let extendsAccount = input.extendsAccount;
833
- let extendsGateway = input.extendsGateway;
782
+ let extendsAccount = "";
783
+ let extendsGateway = "";
834
784
  let directory = input.directory;
835
785
  let account = input.account;
836
786
  let domain = input.domain;
837
787
  let withHost = input.withHost;
838
788
  let plugins = input.plugins;
839
789
  if (input.extends) {
840
- const match = input.extends.match(/^(?:bos:\/\/)?([^/]+)\/(.+)$/);
790
+ const match = (input.extends.startsWith("bos://") ? input.extends : `bos://${input.extends}`).match(/^bos:\/\/([^/]+)\/(.+)$/);
841
791
  if (match) {
842
- if (!extendsAccount) extendsAccount = match[1];
843
- if (!extendsGateway) extendsGateway = match[2];
792
+ extendsAccount = match[1];
793
+ extendsGateway = match[2];
844
794
  }
845
795
  }
846
796
  extendsAccount = extendsAccount || "dev.everything.near";
847
797
  extendsGateway = extendsGateway || "everything.dev";
798
+ const s = _clack_prompts.spinner();
799
+ s.start("Initializing project");
848
800
  let parentPluginKeys = [];
849
801
  let parentConfig = null;
850
802
  try {
851
- parentConfig = await require_timing.timePhase(timings, "parent config", () => require_cli_init.fetchParentConfig(extendsAccount, extendsGateway));
803
+ parentConfig = await require_timing.timePhase(timings, "parent config", () => require_cli_init.fetchParentConfig(extendsAccount, extendsGateway), s);
852
804
  if (parentConfig?.plugins && typeof parentConfig.plugins === "object") parentPluginKeys = Object.keys(parentConfig.plugins);
853
805
  } catch {}
854
806
  if (!input.noInteractive) {
807
+ s.stop("Config fetched");
855
808
  const prompted = await require_prompts.promptInitOptions({
856
- extendsAccount,
857
- extendsGateway,
858
- extends: input.extends,
809
+ extends: `bos://${extendsAccount}/${extendsGateway}`,
859
810
  directory,
860
811
  account,
861
812
  domain,
@@ -870,85 +821,99 @@ var plugin_default = (0, every_plugin.createPlugin)({
870
821
  domain = prompted.domain;
871
822
  withHost = prompted.withHost;
872
823
  plugins = prompted.plugins;
824
+ s.start("Setting up project");
873
825
  }
874
826
  directory = directory || domain || extendsGateway;
875
827
  const targetDir = (0, node_path.resolve)(directory);
876
828
  plugins = plugins ?? [];
829
+ const extendsRef = `bos://${extendsAccount}/${extendsGateway}`;
877
830
  if (!parentConfig) try {
878
- parentConfig = await require_timing.timePhase(timings, "parent config", () => require_cli_init.fetchParentConfig(extendsAccount, extendsGateway));
831
+ parentConfig = await require_timing.timePhase(timings, "parent config", () => require_cli_init.fetchParentConfig(extendsAccount, extendsGateway), s);
879
832
  } catch {
833
+ s.stop("Failed");
880
834
  return {
881
835
  status: "error",
882
836
  directory,
883
- extendsAccount,
884
- extendsGateway,
837
+ extendsRef,
885
838
  account,
886
839
  domain,
887
- extends: `bos://${extendsAccount}/${extendsGateway}`,
840
+ extends: extendsRef,
888
841
  plugins: plugins ?? [],
889
842
  filesCopied: 0,
890
843
  timings,
891
- error: `No config found at bos://${extendsAccount}/${extendsGateway} — are you sure this is the right parent?`
844
+ error: `No config found at ${extendsRef} — are you sure this is the right parent?`
892
845
  };
893
846
  }
894
847
  const { sourceDir, parentConfig: resolvedParentConfig, cleanup } = await require_timing.timePhase(timings, "template source", () => require_cli_init.resolveSourceDir({
895
848
  extendsAccount,
896
849
  extendsGateway,
897
850
  source: input.source
898
- }));
851
+ }), s);
899
852
  parentConfig = resolvedParentConfig;
853
+ const isMinimalScaffold = sourceDir === "";
900
854
  try {
901
- const patterns = await require_cli_init.readTemplatekeep(sourceDir);
902
- if (patterns.length === 0) return {
903
- status: "error",
904
- directory,
905
- extendsAccount,
906
- extendsGateway,
907
- account,
908
- domain,
909
- extends: `bos://${extendsAccount}/${extendsGateway}`,
910
- plugins: plugins ?? [],
911
- filesCopied: 0,
912
- error: "No .templatekeep found in template source"
913
- };
914
- const pluginRoutes = {};
915
- const parentRuntimePlugins = await require_config.buildRuntimePluginsForConfig(parentConfig, sourceDir, "production");
916
- for (const [key, plugin] of Object.entries(parentRuntimePlugins ?? {})) if (plugin.routes && plugin.routes.length > 0) pluginRoutes[key] = plugin.routes;
917
- const s = _clack_prompts.spinner();
918
- s.start("Setting up project");
919
- const filesCopied = await require_timing.timePhase(timings, "copy files", () => require_cli_init.copyFilteredFiles(sourceDir, targetDir, patterns, {
920
- withHost,
921
- plugins,
922
- pluginRoutes
923
- }));
924
- await require_timing.timePhase(timings, "personalize config", () => require_cli_init.personalizeConfig(targetDir, {
855
+ let filesCopied;
856
+ if (isMinimalScaffold) filesCopied = await require_timing.timePhase(timings, "scaffold project", () => require_cli_init.scaffoldMinimalProject(targetDir, parentConfig, {
925
857
  extendsAccount,
926
858
  extendsGateway,
927
859
  account: account || extendsAccount,
928
- domain: domain || extendsGateway,
860
+ domain,
929
861
  plugins,
930
- pluginRoutes,
931
- workspaceOpts: { sourceDir },
932
862
  withHost
933
- }));
934
- await require_timing.timePhase(timings, "write snapshot", () => require_cli_init.writeInitSnapshot(targetDir, extendsAccount, extendsGateway, sourceDir, patterns, {
935
- withHost,
936
- plugins,
937
- pluginRoutes
938
- }));
939
- const initConfig = await require_timing.timePhase(timings, "resolve config", () => require_config.loadConfig({ cwd: targetDir }));
863
+ }), s);
864
+ else {
865
+ const patterns = await require_cli_init.readTemplatekeep(sourceDir);
866
+ if (patterns.length === 0) {
867
+ s.stop("Failed");
868
+ return {
869
+ status: "error",
870
+ directory,
871
+ extendsRef,
872
+ account,
873
+ domain,
874
+ extends: extendsRef,
875
+ plugins: plugins ?? [],
876
+ filesCopied: 0,
877
+ error: "No .templatekeep found in template source"
878
+ };
879
+ }
880
+ const pluginRoutes = {};
881
+ const parentRuntimePlugins = await require_config.buildRuntimePluginsForConfig(parentConfig, sourceDir, "production");
882
+ for (const [key, plugin] of Object.entries(parentRuntimePlugins ?? {})) if (plugin.routes && plugin.routes.length > 0) pluginRoutes[key] = plugin.routes;
883
+ filesCopied = await require_timing.timePhase(timings, "copy files", () => require_cli_init.copyFilteredFiles(sourceDir, targetDir, patterns, {
884
+ withHost,
885
+ plugins,
886
+ pluginRoutes
887
+ }), s);
888
+ await require_timing.timePhase(timings, "personalize config", () => require_cli_init.personalizeConfig(targetDir, {
889
+ extendsAccount,
890
+ extendsGateway,
891
+ account: account || extendsAccount,
892
+ domain: domain || extendsGateway,
893
+ plugins,
894
+ pluginRoutes,
895
+ workspaceOpts: { sourceDir },
896
+ withHost
897
+ }), s);
898
+ await require_timing.timePhase(timings, "write snapshot", () => require_cli_init.writeInitSnapshot(targetDir, extendsAccount, extendsGateway, sourceDir, patterns, {
899
+ withHost,
900
+ plugins,
901
+ pluginRoutes
902
+ }), s);
903
+ }
904
+ const initConfig = await require_timing.timePhase(timings, "resolve config", () => require_config.loadConfig({ cwd: targetDir }), s);
940
905
  if (initConfig?.runtime) await require_timing.timePhase(timings, "generate env/docker", async () => {
941
906
  require_infra.writeGeneratedInfra(targetDir, initConfig.runtime);
942
- });
907
+ }, s);
943
908
  await require_timing.timePhase(timings, "create env file", async () => {
944
909
  require_infra.ensureEnvFile(targetDir);
945
- });
910
+ }, s);
946
911
  if (!input.noInstall) {
947
- await require_timing.timePhase(timings, "install dependencies", () => require_cli_init.runBunInstall(targetDir));
948
- await require_timing.timePhase(timings, "generate types", () => require_cli_init.runTypesGen(targetDir));
949
- await require_timing.timePhase(timings, "generate migrations", () => require_cli_init.generateDatabaseMigrations(targetDir));
912
+ await require_timing.timePhase(timings, "install dependencies", () => require_cli_init.runBunInstall(targetDir), s);
913
+ await require_timing.timePhase(timings, "generate types", () => require_cli_init.runTypesGen(targetDir), s);
914
+ await require_timing.timePhase(timings, "generate migrations", () => require_cli_init.generateDatabaseMigrations(targetDir), s);
950
915
  }
951
- if (input.noInstall && initConfig?.config) await require_timing.timePhase(timings, "generate code artifacts", () => generateCodeArtifacts(targetDir, initConfig.config));
916
+ if (input.noInstall && initConfig?.config) await require_timing.timePhase(timings, "generate code artifacts", () => generateCodeArtifacts(targetDir, initConfig.config), s);
952
917
  s.stop("Project initialized");
953
918
  if (!input.noInteractive) {
954
919
  if (await _clack_prompts.confirm({
@@ -969,11 +934,10 @@ var plugin_default = (0, every_plugin.createPlugin)({
969
934
  return {
970
935
  status: "initialized",
971
936
  directory,
972
- extendsAccount,
973
- extendsGateway,
937
+ extendsRef,
974
938
  account,
975
939
  domain,
976
- extends: `bos://${extendsAccount}/${extendsGateway}`,
940
+ extends: extendsRef,
977
941
  plugins,
978
942
  filesCopied,
979
943
  timings
@@ -982,14 +946,14 @@ var plugin_default = (0, every_plugin.createPlugin)({
982
946
  await cleanup();
983
947
  }
984
948
  } catch (error) {
949
+ const extendsRef = input.extends ? input.extends.startsWith("bos://") ? input.extends : `bos://${input.extends}` : "bos://dev.everything.near/everything.dev";
985
950
  return {
986
951
  status: "error",
987
952
  directory: input.directory ?? "",
988
- extendsAccount: input.extendsAccount ?? "",
989
- extendsGateway: input.extendsGateway ?? "",
953
+ extendsRef,
990
954
  account: input.account,
991
955
  domain: input.domain,
992
- extends: input.extendsAccount && input.extendsGateway ? `bos://${input.extendsAccount}/${input.extendsGateway}` : "",
956
+ extends: extendsRef,
993
957
  plugins: input.plugins ?? [],
994
958
  filesCopied: 0,
995
959
  timings: [],