clivly 0.9.0 → 0.9.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.
Files changed (98) hide show
  1. package/README.md +19 -7
  2. package/core-drizzle.d.cts +1 -1
  3. package/core-drizzle.d.mts +1 -1
  4. package/core-entity-config.cjs +3 -1
  5. package/core-entity-config.d.cts +2 -2
  6. package/core-entity-config.d.mts +2 -2
  7. package/core-entity-config.mjs +2 -2
  8. package/core-entity-heuristics.d.cts +1 -1
  9. package/core-entity-heuristics.d.mts +1 -1
  10. package/core-mapping-form.d.cts +1 -1
  11. package/core-mapping-form.d.mts +1 -1
  12. package/core-mappings-config.cjs +2 -1
  13. package/core-mappings-config.d.cts +2 -2
  14. package/core-mappings-config.d.mts +2 -2
  15. package/core-mappings-config.mjs +2 -2
  16. package/core-sync-engine.cjs +1 -1
  17. package/core-sync-engine.d.cts +1 -1
  18. package/core-sync-engine.d.mts +1 -1
  19. package/core-sync-engine.mjs +1 -1
  20. package/core-view-compiler.cjs +2 -1
  21. package/core-view-compiler.d.cts +2 -2
  22. package/core-view-compiler.d.mts +2 -2
  23. package/core-view-compiler.mjs +2 -2
  24. package/core.cjs +5 -5
  25. package/core.d.cts +6 -6
  26. package/core.d.mts +6 -6
  27. package/core.mjs +5 -5
  28. package/{drizzle-BhN5M9zt.d.cts → drizzle-CiK8MMEZ.d.mts} +1 -1
  29. package/{drizzle-kBULBAOa.d.mts → drizzle-DEtRrqtc.d.cts} +1 -1
  30. package/drizzle.d.cts +2 -2
  31. package/drizzle.d.mts +2 -2
  32. package/{entity-config-C4Yf_fPj.d.cts → entity-config-B2RA53nw.d.cts} +168 -2
  33. package/{entity-config-C4Yf_fPj.d.mts → entity-config-B2RA53nw.d.mts} +168 -2
  34. package/{entity-config-CsLl-ftC.cjs → entity-config-DtBsl2MQ.cjs} +88 -13
  35. package/{entity-config-D3LmzgLb.mjs → entity-config-kUHri9yA.mjs} +77 -14
  36. package/index.cjs +375 -29
  37. package/index.d.cts +1 -0
  38. package/index.d.mts +1 -0
  39. package/index.mjs +375 -29
  40. package/{internal-MBkNo3bw.d.mts → internal-CDY8g9Ic.d.mts} +1 -2
  41. package/{internal-BARjyN4n.cjs → internal-CwnEG6Wl.cjs} +1 -1
  42. package/{internal-B8ydhsKd.d.cts → internal-Da_dlcQ_.d.cts} +1 -2
  43. package/{internal-DMySVbM0.mjs → internal-Df-PtOH_.mjs} +1 -1
  44. package/internal-drizzle.d.cts +1 -1
  45. package/internal-drizzle.d.mts +1 -1
  46. package/internal-entity-config.cjs +3 -1
  47. package/internal-entity-config.d.cts +2 -2
  48. package/internal-entity-config.d.mts +2 -2
  49. package/internal-entity-config.mjs +2 -2
  50. package/internal-entity-heuristics.cjs +1 -1
  51. package/internal-entity-heuristics.d.cts +1 -1
  52. package/internal-entity-heuristics.d.mts +1 -1
  53. package/internal-entity-heuristics.mjs +1 -1
  54. package/internal-mapping-form.d.cts +1 -1
  55. package/internal-mapping-form.d.mts +1 -1
  56. package/internal-mappings-config.cjs +2 -1
  57. package/internal-mappings-config.d.cts +2 -2
  58. package/internal-mappings-config.d.mts +2 -2
  59. package/internal-mappings-config.mjs +2 -2
  60. package/internal-sync-engine.cjs +1 -1
  61. package/internal-sync-engine.d.cts +1 -1
  62. package/internal-sync-engine.d.mts +1 -1
  63. package/internal-sync-engine.mjs +1 -1
  64. package/internal-view-compiler.cjs +2 -1
  65. package/internal-view-compiler.d.cts +2 -2
  66. package/internal-view-compiler.d.mts +2 -2
  67. package/internal-view-compiler.mjs +2 -2
  68. package/internal.cjs +5 -5
  69. package/internal.d.cts +6 -6
  70. package/internal.d.mts +6 -6
  71. package/internal.mjs +5 -5
  72. package/{mapping-form-43bwOTat.d.cts → mapping-form-DH77BXLv.d.mts} +1 -1
  73. package/{mapping-form-DUvWUYCo.d.mts → mapping-form-J0aU6O7l.d.cts} +1 -1
  74. package/{mappings-config-BSSwdHiq.cjs → mappings-config-B0RqFLxu.cjs} +30 -1
  75. package/{mappings-config-bJQT_gSa.mjs → mappings-config-B1b1HVBg.mjs} +25 -2
  76. package/mappings-config-D9dsonoi.d.mts +85 -0
  77. package/mappings-config-RQLGx8ub.d.cts +85 -0
  78. package/{namespace-probe-BSH_p9TK.d.cts → namespace-probe-C6aHjedO.d.cts} +65 -3
  79. package/{namespace-probe-Dsp5uNkS.d.mts → namespace-probe-Dj-0Q3Hb.d.mts} +65 -3
  80. package/package.json +1 -1
  81. package/{sdk-Bj-ZDf4u.cjs → sdk-D4Wp_uxb.cjs} +754 -44
  82. package/{sdk-BvRD2jAp.mjs → sdk-DXV8M_Io.mjs} +754 -44
  83. package/sdk.cjs +4 -2
  84. package/sdk.d.cts +3 -3
  85. package/sdk.d.mts +3 -3
  86. package/sdk.mjs +3 -3
  87. package/{sync-engine-GNqRB8eS.d.cts → sync-engine-BG2O1an2.d.cts} +2 -2
  88. package/{sync-engine-ZsusW-q_.d.mts → sync-engine-DgQbrJON.d.mts} +2 -2
  89. package/{sync-engine-Bg6-SznL.mjs → sync-engine-SuxSzbZ4.mjs} +1 -1
  90. package/{sync-engine-DEJvKw6E.cjs → sync-engine-abE94g6X.cjs} +1 -1
  91. package/{view-compiler-DplczSjF.cjs → view-compiler-Blu4OXJ7.cjs} +22 -0
  92. package/{view-compiler-Cin0neDO.d.mts → view-compiler-Bo7pqXW3.d.mts} +12 -2
  93. package/{view-compiler-DlTpOfZi.mjs → view-compiler-CQx8TRrW.mjs} +17 -1
  94. package/{view-compiler-Ll9cbIJz.d.cts → view-compiler-CmEdAMwj.d.cts} +12 -2
  95. package/vite.d.cts +1 -1
  96. package/vite.d.mts +1 -1
  97. package/mappings-config-BpcR8bBo.d.mts +0 -167
  98. package/mappings-config-xsLMn3I-.d.cts +0 -167
package/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { t as CANONICAL_FIELDS } from "./entity-config-D3LmzgLb.mjs";
2
+ import { t as CANONICAL_FIELDS } from "./entity-config-kUHri9yA.mjs";
3
3
  import "./mapping-score-C68uAqGB.mjs";
4
4
  import { matchesConcept, requiredFieldsFor, scoreFieldMap, scoreRelationships, suggestCursorField, toFieldMap } from "./internal-entity-heuristics.mjs";
5
- import { t as createClivlySDK } from "./sdk-BvRD2jAp.mjs";
5
+ import { t as createClivlySDK } from "./sdk-DXV8M_Io.mjs";
6
6
  import { createRequire } from "node:module";
7
7
  import { spawn } from "node:child_process";
8
8
  import { accessSync, constants, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, watch, writeFileSync } from "node:fs";
@@ -477,7 +477,7 @@ async function probeModule(opts) {
477
477
  }
478
478
  //#endregion
479
479
  //#region src/workspace-graph.ts
480
- const WINDOWS_SEP$2 = /\\/g;
480
+ const WINDOWS_SEP$3 = /\\/g;
481
481
  const MODULE_EXT$1 = /\.(ts|tsx|js|jsx|mjs|cjs|cts|mts)$/;
482
482
  const BRACE_GROUP = /\{([^{}]*)\}/;
483
483
  const MAX_GLOB_DEPTH = 8;
@@ -708,13 +708,13 @@ function exportsAllowSubpath(packageDir, subpath) {
708
708
  function toPackageSpecifier(pkg, absPath) {
709
709
  const target = resolve(absPath);
710
710
  if (resolvePackageEntry(pkg.dir) === target) return pkg.name;
711
- const subpath = relative(pkg.dir, target).replace(WINDOWS_SEP$2, "/").replace(MODULE_EXT$1, "");
711
+ const subpath = relative(pkg.dir, target).replace(WINDOWS_SEP$3, "/").replace(MODULE_EXT$1, "");
712
712
  if (subpath.length === 0) return pkg.name;
713
713
  return exportsAllowSubpath(pkg.dir, subpath) ? `${pkg.name}/${subpath}` : null;
714
714
  }
715
715
  //#endregion
716
716
  //#region src/discover-schema.ts
717
- const WINDOWS_SEP$1 = /\\/g;
717
+ const WINDOWS_SEP$2 = /\\/g;
718
718
  const MODULE_EXT = /\.(ts|js|mjs|cts|mts)$/;
719
719
  /**
720
720
  * Turn an absolute module path into the specifier the generated config imports
@@ -739,7 +739,7 @@ function toImportPath(schemaPath, cwd, graph) {
739
739
  const specifier = toPackageSpecifier(owner, schemaPath);
740
740
  if (specifier) return specifier;
741
741
  }
742
- const rel = relative(cwd, schemaPath).replace(WINDOWS_SEP$1, "/").replace(MODULE_EXT, "");
742
+ const rel = relative(cwd, schemaPath).replace(WINDOWS_SEP$2, "/").replace(MODULE_EXT, "");
743
743
  return rel.startsWith(".") ? rel : `./${rel}`;
744
744
  }
745
745
  function isDirectory(path) {
@@ -1153,6 +1153,46 @@ async function installPackages(options) {
1153
1153
  }
1154
1154
  }
1155
1155
  //#endregion
1156
+ //#region src/install-needed.ts
1157
+ /** Exact `name@version` only. Anything else is left for the package manager. */
1158
+ const EXACT_VERSION = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
1159
+ /**
1160
+ * Split `name@version`, tolerating scoped names where the leading `@` is part
1161
+ * of the name rather than a separator. Returns a null version for a bare name.
1162
+ */
1163
+ function parseSpec(spec) {
1164
+ const at = spec.lastIndexOf("@");
1165
+ if (at <= 0) return {
1166
+ name: spec,
1167
+ version: null
1168
+ };
1169
+ return {
1170
+ name: spec.slice(0, at),
1171
+ version: spec.slice(at + 1)
1172
+ };
1173
+ }
1174
+ /**
1175
+ * Which of `packages` still need installing.
1176
+ *
1177
+ * Deliberately conservative — a spec is only dropped when it is provably
1178
+ * satisfied. Tarball paths, `file:` specs and semver ranges are always kept:
1179
+ * the first two name no version to compare, and resolving the third needs a
1180
+ * semver implementation the CLI does not ship. Erring toward installing costs
1181
+ * a redundant install; erring the other way silently skips one the developer
1182
+ * asked for.
1183
+ */
1184
+ function packagesNeedingInstall(packages, installedVersion) {
1185
+ return packages.filter((spec) => {
1186
+ if (spec.startsWith(".") || spec.startsWith("/") || spec.includes(":") || spec.includes("/") && !spec.startsWith("@")) return true;
1187
+ const { name, version } = parseSpec(spec);
1188
+ const present = installedVersion(name);
1189
+ if (present === null) return true;
1190
+ if (version === null) return false;
1191
+ if (!EXACT_VERSION.test(version)) return true;
1192
+ return present !== version;
1193
+ });
1194
+ }
1195
+ //#endregion
1156
1196
  //#region src/is-entry.ts
1157
1197
  function isEntrypoint(argv1, moduleUrl, realpath = realpathSync) {
1158
1198
  if (!argv1) return false;
@@ -1502,8 +1542,10 @@ function planInit(schema, overrides = {}) {
1502
1542
  if (built && !contact) todos.push(`"${built.tableName}" was chosen as the contact entity but none of its columns could be mapped to name/email.`);
1503
1543
  let company = null;
1504
1544
  if (companyTable) {
1505
- const candidate = buildEntity(companyTable, "company", todos);
1545
+ const candidateTodos = [];
1546
+ const candidate = buildEntity(companyTable, "company", candidateTodos);
1506
1547
  if (hasMappedFields(candidate)) {
1548
+ todos.push(...candidateTodos);
1507
1549
  company = candidate;
1508
1550
  if (matchesConcept(companyTable.tableName, "contact")) todos.push(`"${companyTable.tableName}" matches both contact and company naming — assigned to company. Swap it to your contact entity if that's wrong.`);
1509
1551
  } else todos.push(`"${companyTable.tableName}" looked like a company but no fields could be mapped — left it out. Add it to \`entities\` once you know which columns map to name/domain.`);
@@ -1612,6 +1654,106 @@ function rankContactCandidates(tables) {
1612
1654
  }));
1613
1655
  }
1614
1656
  //#endregion
1657
+ //#region src/config-import.ts
1658
+ const WINDOWS_SEP$1 = /\\/g;
1659
+ function configImport(generatedFilePath) {
1660
+ const rel = relative(dirname(generatedFilePath), "clivly.config").replace(WINDOWS_SEP$1, "/");
1661
+ return rel.startsWith(".") ? rel : `./${rel}`;
1662
+ }
1663
+ //#endregion
1664
+ //#region src/boot-hook.ts
1665
+ const BOOT_HOOK_PATHS = {
1666
+ nextjs: "instrumentation.ts",
1667
+ nuxt: "server/plugins/clivly.ts",
1668
+ sveltekit: "src/hooks.server.ts",
1669
+ "tanstack-start": null,
1670
+ remix: null,
1671
+ unknown: null
1672
+ };
1673
+ function bootHookPath(framework, layout) {
1674
+ const path = BOOT_HOOK_PATHS[framework];
1675
+ if (path === null) return null;
1676
+ if (framework === "nextjs" && layout === "src/app") return `src/${path}`;
1677
+ return path;
1678
+ }
1679
+ const FAILURE_NOTE = "Clivly never blocks your app from starting: a failed check-in is logged and retried on the next tick.";
1680
+ function nextjsHook(importPath) {
1681
+ return `// Clivly boot hook. Next.js calls register() once when the server starts.
1682
+ // ${FAILURE_NOTE}
1683
+ export async function register() {
1684
+ // The keep-alive loop is a setInterval, which does not survive on the edge
1685
+ // runtime — it would stop ticking after the first response and the dashboard
1686
+ // would show an app that checked in once and then went stale forever.
1687
+ if (process.env.NEXT_RUNTIME !== "nodejs") {
1688
+ return;
1689
+ }
1690
+ try {
1691
+ const { default: clivly } = await import("${importPath}");
1692
+ await clivly.start();
1693
+ } catch (error) {
1694
+ console.warn("[clivly] could not check in:", error);
1695
+ }
1696
+ }
1697
+ `;
1698
+ }
1699
+ function nuxtHook(importPath) {
1700
+ return `import clivly from "${importPath}";
1701
+
1702
+ // Clivly boot hook. Nitro runs this once when the server starts.
1703
+ // ${FAILURE_NOTE}
1704
+ export default defineNitroPlugin(() => {
1705
+ clivly.start().catch((error: unknown) => {
1706
+ console.warn("[clivly] could not check in:", error);
1707
+ });
1708
+ });
1709
+ `;
1710
+ }
1711
+ function sveltekitHook(importPath) {
1712
+ return `import clivly from "${importPath}";
1713
+
1714
+ // Clivly boot hook. This module is evaluated once when the server starts.
1715
+ // ${FAILURE_NOTE}
1716
+ clivly.start().catch((error: unknown) => {
1717
+ console.warn("[clivly] could not check in:", error);
1718
+ });
1719
+ `;
1720
+ }
1721
+ const RENDERERS = {
1722
+ nextjs: nextjsHook,
1723
+ nuxt: nuxtHook,
1724
+ sveltekit: sveltekitHook
1725
+ };
1726
+ function renderBootHook(framework, layout) {
1727
+ const path = bootHookPath(framework, layout);
1728
+ const render = RENDERERS[framework];
1729
+ if (!(path && render)) throw new Error(`No standalone boot hook for framework: ${framework}`);
1730
+ return render(configImport(path));
1731
+ }
1732
+ const NEXT_INSTRUMENTATION_STABLE_MAJOR = 15;
1733
+ const LEADING_MAJOR = /(\d+)/;
1734
+ /** Does this Next.js version range need the experimental flag to run our hook? */
1735
+ function nextNeedsInstrumentationFlag(versionRange) {
1736
+ if (!versionRange) return false;
1737
+ const major = LEADING_MAJOR.exec(versionRange);
1738
+ if (!major?.[1]) return false;
1739
+ return Number(major[1]) < NEXT_INSTRUMENTATION_STABLE_MAJOR;
1740
+ }
1741
+ const NEXT_INSTRUMENTATION_FLAG_STEP = `Your Next.js version reads instrumentation.ts only when it is switched on. Add this to next.config, or Clivly will never be told your app started:
1742
+ experimental: { instrumentationHook: true }`;
1743
+ const REMIX_BOOT_STEP = `Start Clivly when your app boots. Add this near the top of app/entry.server.tsx:
1744
+ import clivly from "./clivly.config";
1745
+ clivly.start().catch((error) => console.warn("[clivly] could not check in:", error));`;
1746
+ /** The boot hook as a scaffold entry, or null when this framework is patched. */
1747
+ function planBootHook(framework, layout) {
1748
+ const path = bootHookPath(framework, layout);
1749
+ if (!path) return null;
1750
+ return {
1751
+ path,
1752
+ description: "Clivly boot hook — starts check-in when your app runs",
1753
+ owned: true
1754
+ };
1755
+ }
1756
+ //#endregion
1615
1757
  //#region src/render-config.ts
1616
1758
  const CLIVLY_ENV_KEYS = [
1617
1759
  {
@@ -1922,10 +2064,6 @@ function routePath(framework, kind, layout = "app") {
1922
2064
  }
1923
2065
  const WINDOWS_SEP = /\\/g;
1924
2066
  const LEADING_DOT_SLASH = /^\.\//;
1925
- function configImport(routeFilePath) {
1926
- const rel = relative(dirname(routeFilePath), "clivly.config").replace(WINDOWS_SEP, "/");
1927
- return rel.startsWith(".") ? rel : `./${rel}`;
1928
- }
1929
2067
  function hostImportPath(routeFilePath, appRelative, paths) {
1930
2068
  const fromRoot = appRelative.replace(LEADING_DOT_SLASH, "");
1931
2069
  const alias = aliasFor({
@@ -2013,6 +2151,7 @@ const COMMON_FILES = [{
2013
2151
  function planScaffold(framework, layout = "app") {
2014
2152
  const paths = ROUTE_PATHS[framework];
2015
2153
  if (!paths) return [];
2154
+ const boot = planBootHook(framework, layout);
2016
2155
  return [
2017
2156
  {
2018
2157
  path: applyLayout(framework, paths.tick, layout),
@@ -2024,6 +2163,7 @@ function planScaffold(framework, layout = "app") {
2024
2163
  description: "Clivly auth-verify route (createAuthVerifyHandler) — finish resolveUser",
2025
2164
  owned: true
2026
2165
  },
2166
+ ...boot ? [boot] : [],
2027
2167
  ...COMMON_FILES
2028
2168
  ];
2029
2169
  }
@@ -2037,6 +2177,45 @@ function planWidgetScaffold(framework, layout = "app") {
2037
2177
  }];
2038
2178
  }
2039
2179
  //#endregion
2180
+ //#region src/vite-boot-patch.ts
2181
+ /** Config filenames to look for, in precedence order. */
2182
+ const VITE_CONFIG_CANDIDATES = [
2183
+ "vite.config.ts",
2184
+ "vite.config.mts",
2185
+ "vite.config.js",
2186
+ "vite.config.mjs"
2187
+ ];
2188
+ const PLUGIN_IMPORT = "import { clivlyVite } from \"clivly/vite\";";
2189
+ const CONFIG_IMPORT = "import clivly from \"./clivly.config\";";
2190
+ const PLUGIN_CALL = "clivlyVite(clivly)";
2191
+ const PLUGINS_ARRAY = /(^|[\s{,])plugins\s*:\s*\[/g;
2192
+ /** The last import line's end offset, so new imports land after the existing ones. */
2193
+ const IMPORT_LINE = /^\s*import\s.+?from\s+["'].+?["'];?\s*$/gm;
2194
+ function insertImports(source) {
2195
+ const last = [...source.matchAll(IMPORT_LINE)].at(-1);
2196
+ const block = `${PLUGIN_IMPORT}\n${CONFIG_IMPORT}`;
2197
+ if (!last) return `${block}\n\n${source}`;
2198
+ const at = (last.index ?? 0) + last[0].length;
2199
+ return `${source.slice(0, at)}\n${block}${source.slice(at)}`;
2200
+ }
2201
+ /**
2202
+ * Add the Clivly Vite plugin to an existing config.
2203
+ *
2204
+ * Returns the patched source, or `null` when the config is already patched or
2205
+ * is not a shape we can edit safely.
2206
+ */
2207
+ function patchViteConfig(source) {
2208
+ if (source.includes(PLUGIN_CALL)) return null;
2209
+ const matches = [...source.matchAll(PLUGINS_ARRAY)];
2210
+ if (matches.length !== 1) return null;
2211
+ const match = matches[0];
2212
+ if (!match) return null;
2213
+ const openBracketEnd = (match.index ?? 0) + match[0].length;
2214
+ const rest = source.slice(openBracketEnd);
2215
+ const separator = rest.startsWith("\n") ? "" : " ";
2216
+ return insertImports(`${source.slice(0, openBracketEnd)}${PLUGIN_CALL},${separator}${rest}`);
2217
+ }
2218
+ //#endregion
2040
2219
  //#region src/plan-mutations.ts
2041
2220
  function fileAction(existing, next, force) {
2042
2221
  if (existing === null) return "create";
@@ -2048,8 +2227,10 @@ function hasKey(content, key) {
2048
2227
  }
2049
2228
  function planFiles(args) {
2050
2229
  const mutations = [];
2230
+ const bootPath = bootHookPath(args.framework, args.layout);
2051
2231
  const render = (path) => {
2052
2232
  if (path === "clivly.config.ts") return renderInitConfig(args.plan);
2233
+ if (bootPath !== null && path === bootPath) return renderBootHook(args.framework, args.layout);
2053
2234
  const kind = path.includes("verify") ? "verify" : "tick";
2054
2235
  return renderRouteFile(args.framework, kind, args.authWiring, args.layout, parseTsconfig(args.readFile(join(args.cwd, "tsconfig.json")) ?? "")?.paths);
2055
2236
  };
@@ -2077,10 +2258,67 @@ function planEnv(args) {
2077
2258
  action: envAction(addedKeys.length, existing.length)
2078
2259
  };
2079
2260
  }
2261
+ function declaredNextVersion(args) {
2262
+ const raw = args.readFile(join(args.cwd, "package.json"));
2263
+ if (!raw) return;
2264
+ let pkg = {};
2265
+ try {
2266
+ pkg = JSON.parse(raw);
2267
+ } catch {
2268
+ pkg = {};
2269
+ }
2270
+ return pkg.dependencies?.next ?? pkg.devDependencies?.next;
2271
+ }
2272
+ function planBootPatch(args) {
2273
+ if (bootHookPath(args.framework, args.layout) !== null) return {
2274
+ file: null,
2275
+ manual: args.framework === "nextjs" && nextNeedsInstrumentationFlag(declaredNextVersion(args)) ? NEXT_INSTRUMENTATION_FLAG_STEP : null
2276
+ };
2277
+ if (args.framework === "remix") return {
2278
+ file: null,
2279
+ manual: REMIX_BOOT_STEP
2280
+ };
2281
+ if (args.framework !== "tanstack-start") return {
2282
+ file: null,
2283
+ manual: null
2284
+ };
2285
+ for (const candidate of VITE_CONFIG_CANDIDATES) {
2286
+ const existing = args.readFile(join(args.cwd, candidate));
2287
+ if (existing === null) continue;
2288
+ const patched = patchViteConfig(existing);
2289
+ if (patched === null) return existing.includes("clivlyVite(clivly)") ? {
2290
+ file: {
2291
+ path: candidate,
2292
+ contents: existing,
2293
+ action: "unchanged"
2294
+ },
2295
+ manual: null
2296
+ } : {
2297
+ file: null,
2298
+ manual: `Add the Clivly plugin to ${candidate} so your app checks in when it runs:\n import { clivlyVite } from "clivly/vite";\n import clivly from "./clivly.config";\n // then, inside defineConfig: plugins: [clivlyVite(clivly), …]`
2299
+ };
2300
+ return {
2301
+ file: {
2302
+ path: candidate,
2303
+ contents: patched,
2304
+ action: "patch"
2305
+ },
2306
+ manual: null
2307
+ };
2308
+ }
2309
+ return {
2310
+ file: null,
2311
+ manual: null
2312
+ };
2313
+ }
2080
2314
  function planMutations(args) {
2315
+ const files = planFiles(args);
2316
+ const boot = planBootPatch(args);
2317
+ if (boot.file) files.push(boot.file);
2081
2318
  return {
2082
- files: planFiles(args),
2083
- env: planEnv(args)
2319
+ files,
2320
+ env: planEnv(args),
2321
+ manualSteps: boot.manual ? [boot.manual] : []
2084
2322
  };
2085
2323
  }
2086
2324
  function planWidgetMutations(args) {
@@ -2094,6 +2332,49 @@ function planWidgetMutations(args) {
2094
2332
  });
2095
2333
  }
2096
2334
  //#endregion
2335
+ //#region src/quiet-host-output.ts
2336
+ /**
2337
+ * Run `fn` with the process's stdout/stderr captured. Always restores the
2338
+ * original writers, including when `fn` throws — a leaked patch would silence
2339
+ * the whole CLI for the rest of the run.
2340
+ */
2341
+ async function captureHostOutput(fn) {
2342
+ const originals = {
2343
+ stdout: process.stdout.write,
2344
+ stderr: process.stderr.write
2345
+ };
2346
+ let output = "";
2347
+ const capture = (chunk, encoding, callback) => {
2348
+ output += typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8");
2349
+ const done = typeof encoding === "function" ? encoding : callback;
2350
+ if (typeof done === "function") done();
2351
+ return true;
2352
+ };
2353
+ process.stdout.write = capture;
2354
+ process.stderr.write = capture;
2355
+ try {
2356
+ return {
2357
+ result: await fn(),
2358
+ output
2359
+ };
2360
+ } catch (error) {
2361
+ if (output.trim().length > 0 && error instanceof Error) error.message = `${error.message}\n${output.trim()}`;
2362
+ throw error;
2363
+ } finally {
2364
+ process.stdout.write = originals.stdout;
2365
+ process.stderr.write = originals.stderr;
2366
+ }
2367
+ }
2368
+ /**
2369
+ * Run `fn` quietly, discarding whatever the host printed on success. On failure
2370
+ * the captured output is attached to the error's message, so the host's own
2371
+ * explanation is not lost.
2372
+ */
2373
+ async function quietly(fn) {
2374
+ const { result } = await captureHostOutput(fn);
2375
+ return result;
2376
+ }
2377
+ //#endregion
2097
2378
  //#region src/probe-auth.ts
2098
2379
  const AUTH_MODULE_PATHS = [
2099
2380
  "auth",
@@ -2116,15 +2397,32 @@ function defaultLoader(cwd) {
2116
2397
  return (specifier) => jiti.import(specifier);
2117
2398
  }
2118
2399
  function probeAuthInstance(cwd, load) {
2119
- return probeModule({
2400
+ return quietly(() => probeModule({
2120
2401
  candidates: authInstanceCandidates(cwd),
2121
2402
  cwd,
2122
2403
  load: load ?? defaultLoader(cwd),
2123
2404
  match: isBetterAuthInstance
2124
- });
2405
+ }));
2125
2406
  }
2126
2407
  //#endregion
2127
2408
  //#region src/push-schema.ts
2409
+ /**
2410
+ * "1 mapping" / "3 mappings" — a count nobody has to decode. The plural is
2411
+ * explicit because appending "s" turns "entity" into "entitys".
2412
+ */
2413
+ function countOf(n, singular, plural = `${singular}s`) {
2414
+ return `${n} ${n === 1 ? singular : plural}`;
2415
+ }
2416
+ function reportSchema(report, out) {
2417
+ const createdObjects = report.objectTypes.filter((o) => o.created);
2418
+ if (createdObjects.length > 0) out(` ✅ Created ${countOf(createdObjects.length, "custom object")}: ${createdObjects.map((o) => o.slug).join(", ")}.\n`);
2419
+ else if (report.objectTypes.length > 0) out(` ✅ ${countOf(report.objectTypes.length, "custom object")} already present.\n`);
2420
+ const created = report.mappings.filter((m) => m.created);
2421
+ const updated = report.mappings.filter((m) => m.updated);
2422
+ if (created.length > 0) out(` ✅ Mapped ${countOf(created.length, "entity", "entities")}: ${created.map((m) => m.entityKey).join(", ")}.\n`);
2423
+ if (updated.length > 0) out(` ✅ Updated ${countOf(updated.length, "mapping")}: ${updated.map((m) => m.entityKey).join(", ")}.\n`);
2424
+ if (report.mappings.length > 0 && created.length === 0 && updated.length === 0) out(` ✅ ${countOf(report.mappings.length, "mapping")} already match your config.\n`);
2425
+ }
2128
2426
  async function runPushSchema(options) {
2129
2427
  const out = options.out ?? ((line) => process.stdout.write(line));
2130
2428
  const path = resolveConfigPath(options.cwd, options.configPath);
@@ -2152,6 +2450,29 @@ async function runPushSchema(options) {
2152
2450
  }
2153
2451
  out(" ✅ Schema reported to Clivly.\n");
2154
2452
  out(" Integration liveness and trigger URL were refreshed too.\n");
2453
+ if (sdk.ensureSchema) {
2454
+ let report;
2455
+ try {
2456
+ report = await sdk.ensureSchema();
2457
+ } catch (error) {
2458
+ out(` ❌ Clivly refused your schema — ${error.message}\n`);
2459
+ return 1;
2460
+ }
2461
+ if (report === null) {
2462
+ out(" ⚠️ Could not declare the objects and mappings in your config.\n");
2463
+ out(" Run `clivly status`, then `clivly push-schema` again.\n");
2464
+ } else reportSchema(report, out);
2465
+ out(" Open Integrations → Mapping to review them.\n");
2466
+ return 0;
2467
+ }
2468
+ const ensured = await sdk.ensureCustomObjects?.();
2469
+ if (ensured === null) {
2470
+ out(" ⚠️ Could not create the custom objects your config declares.\n");
2471
+ out(" Run `clivly status`, then `clivly push-schema` again.\n");
2472
+ } else if (ensured && ensured.length > 0) {
2473
+ const created = ensured.filter((o) => o.created);
2474
+ out(created.length > 0 ? ` ✅ Created ${created.length} custom object(s): ${created.map((o) => o.slug).join(", ")}.\n` : ` ✅ ${ensured.length} custom object(s) already present.\n`);
2475
+ }
2155
2476
  out(" Open Integrations → Mapping to map your tables.\n");
2156
2477
  return 0;
2157
2478
  }
@@ -2732,8 +3053,19 @@ const defaultConnect = (apiKey, apiUrl) => createClivlySDK({
2732
3053
  apiUrl,
2733
3054
  retry: { maxAttempts: 1 }
2734
3055
  }).ping();
3056
+ /**
3057
+ * Exported for tests only — the rule it encodes is the point.
3058
+ *
3059
+ * A skipped check was never evaluated (nothing to check yet), which is not the
3060
+ * same as a warning: a warning is a working setup carrying real risk. Marking
3061
+ * "not applicable" with ⚠️ put a warning on every fresh install for something
3062
+ * the developer had not done wrong, which is exactly how people are trained to
3063
+ * stop reading warnings — the same reasoning `status-stages.ts` gives for
3064
+ * refusing to turn a stage red on a setup that works.
3065
+ */
2735
3066
  function subMark(sub) {
2736
- if (sub.skipped || sub.warn) return "⚠️ ";
3067
+ if (sub.skipped) return "⏭️ ";
3068
+ if (sub.warn) return "⚠️ ";
2737
3069
  return sub.ok ? "✅" : "❌";
2738
3070
  }
2739
3071
  function renderStage(result, verbose, out) {
@@ -2896,6 +3228,14 @@ function runAdd(argv, cwd, deps = defaultAddDeps) {
2896
3228
  }
2897
3229
  return 0;
2898
3230
  }
3231
+ function readInstalledVersion(cwd, name) {
3232
+ try {
3233
+ const manifest = join(cwd, "node_modules", ...name.split("/"), "package.json");
3234
+ return JSON.parse(readFileSync(manifest, "utf8")).version ?? null;
3235
+ } catch {
3236
+ return null;
3237
+ }
3238
+ }
2899
3239
  function readOwnVersion() {
2900
3240
  const req = createRequire(import.meta.url);
2901
3241
  for (const rel of ["./package.json", "../package.json"]) try {
@@ -2993,6 +3333,7 @@ function resolveInitDeps(options) {
2993
3333
  install: options.installPackages ?? installPackages,
2994
3334
  probeAuth: options.probeAuthInstance ?? probeAuthInstance,
2995
3335
  readEnv: options.readEnv ?? defaultReadEnv,
3336
+ readInstalledVersion: options.readInstalledVersion ?? readInstalledVersion,
2996
3337
  readOwnVersion: options.readOwnVersion ?? readOwnVersion,
2997
3338
  writeEnv: options.writeEnv ?? defaultWriteEnv,
2998
3339
  isInteractive: options.yes ? () => false : options.isInteractive ?? defaultIsInteractive,
@@ -3022,8 +3363,8 @@ async function acquireSchema(options, deps) {
3022
3363
  deps.framework = framework;
3023
3364
  const layout = deps.resolveAppLayout(options.cwd, deps.fileExists);
3024
3365
  deps.layout = layout;
3025
- deps.authWiring = renderAuthWiring(auth, auth === "better-auth" ? authInstanceFromFlag(options.authImportFlag) ?? await deps.probeAuth(options.cwd) : null);
3026
3366
  out("\nClivly init\n");
3367
+ deps.authWiring = renderAuthWiring(auth, auth === "better-auth" ? authInstanceFromFlag(options.authImportFlag) ?? await deps.probeAuth(options.cwd) : null);
3027
3368
  out(` Framework: ${FRAMEWORK_LABELS[framework]}\n`);
3028
3369
  out(` ORM: ${orm}\n`);
3029
3370
  out(` Auth: ${auth}${deps.authWiring.complete ? " (wired)" : ""}\n`);
@@ -3092,12 +3433,12 @@ function applyMutations(options, deps, mutations) {
3092
3433
  deps.writeConfig(join(options.cwd, file.path), file.contents);
3093
3434
  deps.out(` ✓ ${file.path}\n`);
3094
3435
  }
3095
- if (mutations.env.action === "skip") {
3096
- deps.out(" • .env already has every CLIVLY_* key — skipped\n");
3097
- return;
3436
+ if (mutations.env.action === "skip") deps.out(" • .env already has every CLIVLY_* key — skipped\n");
3437
+ else {
3438
+ deps.writeEnv(options.cwd, mutations.env.contents);
3439
+ deps.out(" ✓ .env placeholders\n");
3098
3440
  }
3099
- deps.writeEnv(options.cwd, mutations.env.contents);
3100
- deps.out(" ✓ .env placeholders\n");
3441
+ for (const step of mutations.manualSteps) deps.out(`\n ! ${step}\n`);
3101
3442
  }
3102
3443
  const DIFF_CONTEXT_LIMIT = 40;
3103
3444
  function renderDiff(existing, next) {
@@ -3117,6 +3458,7 @@ function previewMutations(deps, mutations, options) {
3117
3458
  conflict: " (differs — --diff to see, --force to overwrite)",
3118
3459
  create: ` (${lines} lines)`,
3119
3460
  overwrite: ` (${lines} lines)`,
3461
+ patch: " (your file, plus the Clivly plugin)",
3120
3462
  unchanged: " (already up to date)"
3121
3463
  }[file.action];
3122
3464
  out(` ${file.action.padEnd(9)} ${file.path}${suffix}\n`);
@@ -3174,13 +3516,17 @@ async function scaffold(options, deps, plan) {
3174
3516
  });
3175
3517
  return 0;
3176
3518
  }
3177
- const result = await deps.install({
3178
- cwd: options.cwd,
3179
- pm,
3180
- packages
3181
- });
3182
- if (result.ok) out(`Installed clivly (${pm})\n`);
3183
- else out(`Could not install automatically — run:\n ${result.command}\n`);
3519
+ const missing = packagesNeedingInstall(packages, (name) => deps.readInstalledVersion(options.cwd, name));
3520
+ if (missing.length === 0) out(`Already installed (${pm}) — nothing to fetch\n`);
3521
+ else {
3522
+ const result = await deps.install({
3523
+ cwd: options.cwd,
3524
+ pm,
3525
+ packages: missing
3526
+ });
3527
+ if (result.ok) out(`Installed clivly (${pm})\n`);
3528
+ else out(`Could not install automatically — run:\n ${result.command}\n`);
3529
+ }
3184
3530
  applyMutations(options, deps, mutations);
3185
3531
  let loginRan = false;
3186
3532
  if (credentialsMissing(mutations.env.contents)) {
@@ -1,5 +1,4 @@
1
- import { d as DiscoveredSchemaTable, s as ConfigValidationError, u as DiscoveredColumnMeta } from "./entity-config-C4Yf_fPj.mjs";
2
- import { a as ProjectionIdentity, i as ProjectionFieldBinding, o as ProjectionJoin, s as ProjectionMapping } from "./mappings-config-BpcR8bBo.mjs";
1
+ import { M as ProjectionIdentity, N as ProjectionJoin, P as ProjectionMapping, j as ProjectionFieldBinding, l as ConfigValidationError, m as DiscoveredSchemaTable, p as DiscoveredColumnMeta } from "./entity-config-B2RA53nw.mjs";
3
2
  //#region ../core/src/projection-cardinality.d.ts
4
3
  declare function joinFansOut(join: ProjectionJoin, joinTable: DiscoveredSchemaTable): boolean;
5
4
  /** Every join in the projection that can multiply rows. */
@@ -1,5 +1,5 @@
1
1
  const require_projection = require("./projection-C5244vGa.cjs");
2
- const require_entity_config = require("./entity-config-CsLl-ftC.cjs");
2
+ const require_entity_config = require("./entity-config-DtBsl2MQ.cjs");
3
3
  //#region ../core/src/projection-draft.ts
4
4
  function emptyProjectionDraft(baseTable) {
5
5
  return {
@@ -1,5 +1,4 @@
1
- import { d as DiscoveredSchemaTable, s as ConfigValidationError, u as DiscoveredColumnMeta } from "./entity-config-C4Yf_fPj.cjs";
2
- import { a as ProjectionIdentity, i as ProjectionFieldBinding, o as ProjectionJoin, s as ProjectionMapping } from "./mappings-config-xsLMn3I-.cjs";
1
+ import { M as ProjectionIdentity, N as ProjectionJoin, P as ProjectionMapping, j as ProjectionFieldBinding, l as ConfigValidationError, m as DiscoveredSchemaTable, p as DiscoveredColumnMeta } from "./entity-config-B2RA53nw.cjs";
3
2
  //#region ../core/src/projection-cardinality.d.ts
4
3
  declare function joinFansOut(join: ProjectionJoin, joinTable: DiscoveredSchemaTable): boolean;
5
4
  /** Every join in the projection that can multiply rows. */
@@ -1,5 +1,5 @@
1
1
  import { n as PROJECTION_KEY_PATTERN, t as BASE_REF } from "./projection-D7xmQP4S.mjs";
2
- import { f as validateProjection, p as fanOutJoins } from "./entity-config-D3LmzgLb.mjs";
2
+ import { h as fanOutJoins, m as validateProjection } from "./entity-config-kUHri9yA.mjs";
3
3
  //#region ../core/src/projection-draft.ts
4
4
  function emptyProjectionDraft(baseTable) {
5
5
  return {
@@ -1,2 +1,2 @@
1
- import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-BhN5M9zt.cjs";
1
+ import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-DEtRrqtc.cjs";
2
2
  export { buildColumnsMeta, buildUniqueConstraints, discoverFromDrizzle };
@@ -1,2 +1,2 @@
1
- import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-kBULBAOa.mjs";
1
+ import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-CiK8MMEZ.mjs";
2
2
  export { buildColumnsMeta, buildUniqueConstraints, discoverFromDrizzle };
@@ -1,13 +1,15 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_entity_config = require("./entity-config-CsLl-ftC.cjs");
2
+ const require_entity_config = require("./entity-config-DtBsl2MQ.cjs");
3
3
  exports.CANONICAL_FIELDS = require_entity_config.CANONICAL_FIELDS;
4
4
  exports.CRM_CONCEPTS = require_entity_config.CRM_CONCEPTS;
5
5
  exports.CUSTOM_CONCEPT = require_entity_config.CUSTOM_CONCEPT;
6
6
  exports.ClivlyConfigError = require_entity_config.ClivlyConfigError;
7
7
  exports.MATERIALIZING_CONCEPTS = require_entity_config.MATERIALIZING_CONCEPTS;
8
+ exports.customObjectDeclarations = require_entity_config.customObjectDeclarations;
8
9
  exports.defineClivlyConfig = require_entity_config.defineClivlyConfig;
9
10
  exports.entitiesConfigSchema = require_entity_config.entitiesConfigSchema;
10
11
  exports.filterSchema = require_entity_config.filterSchema;
12
+ exports.projectionFields = require_entity_config.projectionFields;
11
13
  exports.relationshipSchema = require_entity_config.relationshipSchema;
12
14
  exports.relationshipsSchema = require_entity_config.relationshipsSchema;
13
15
  exports.validateEntitiesConfig = require_entity_config.validateEntitiesConfig;
@@ -1,2 +1,2 @@
1
- import { C as relationshipsSchema, S as relationshipSchema, _ as RelationshipVia, a as ClivlyEntitiesConfig, b as entitiesConfigSchema, c as ConfigValidationResult, d as DiscoveredSchemaTable, f as FilterExpr, g as RelationshipSpec, h as MaterializingConcept, i as ClivlyConfigError, l as CrmConcept, m as MATERIALIZING_CONCEPTS, n as CRM_CONCEPTS, o as ClivlyEntityConfig, p as FilterValue, r as CUSTOM_CONCEPT, s as ConfigValidationError, t as CANONICAL_FIELDS, u as DiscoveredColumnMeta, v as RelationshipsMap, w as validateEntitiesConfig, x as filterSchema, y as defineClivlyConfig } from "./entity-config-C4Yf_fPj.cjs";
2
- export { CANONICAL_FIELDS, CRM_CONCEPTS, CUSTOM_CONCEPT, ClivlyConfigError, ClivlyEntitiesConfig, ClivlyEntityConfig, ConfigValidationError, ConfigValidationResult, CrmConcept, DiscoveredColumnMeta, DiscoveredSchemaTable, FilterExpr, FilterValue, MATERIALIZING_CONCEPTS, MaterializingConcept, RelationshipSpec, RelationshipVia, RelationshipsMap, defineClivlyConfig, entitiesConfigSchema, filterSchema, relationshipSchema, relationshipsSchema, validateEntitiesConfig };
1
+ import { C as defineClivlyConfig, D as relationshipSchema, E as projectionFields, O as relationshipsSchema, S as customObjectDeclarations, T as filterSchema, _ as MATERIALIZING_CONCEPTS, a as ClivlyEntitiesConfig, b as RelationshipVia, c as ClivlyEntityConfigInput, d as CrmConcept, f as CustomObjectDeclaration, g as FilterValue, h as FilterExpr, i as ClivlyConfigError, k as validateEntitiesConfig, l as ConfigValidationError, m as DiscoveredSchemaTable, n as CRM_CONCEPTS, o as ClivlyEntitiesConfigInput, p as DiscoveredColumnMeta, r as CUSTOM_CONCEPT, s as ClivlyEntityConfig, t as CANONICAL_FIELDS, u as ConfigValidationResult, v as MaterializingConcept, w as entitiesConfigSchema, x as RelationshipsMap, y as RelationshipSpec } from "./entity-config-B2RA53nw.cjs";
2
+ export { CANONICAL_FIELDS, CRM_CONCEPTS, CUSTOM_CONCEPT, ClivlyConfigError, ClivlyEntitiesConfig, ClivlyEntitiesConfigInput, ClivlyEntityConfig, ClivlyEntityConfigInput, ConfigValidationError, ConfigValidationResult, CrmConcept, CustomObjectDeclaration, DiscoveredColumnMeta, DiscoveredSchemaTable, FilterExpr, FilterValue, MATERIALIZING_CONCEPTS, MaterializingConcept, RelationshipSpec, RelationshipVia, RelationshipsMap, customObjectDeclarations, defineClivlyConfig, entitiesConfigSchema, filterSchema, projectionFields, relationshipSchema, relationshipsSchema, validateEntitiesConfig };
@@ -1,2 +1,2 @@
1
- import { C as relationshipsSchema, S as relationshipSchema, _ as RelationshipVia, a as ClivlyEntitiesConfig, b as entitiesConfigSchema, c as ConfigValidationResult, d as DiscoveredSchemaTable, f as FilterExpr, g as RelationshipSpec, h as MaterializingConcept, i as ClivlyConfigError, l as CrmConcept, m as MATERIALIZING_CONCEPTS, n as CRM_CONCEPTS, o as ClivlyEntityConfig, p as FilterValue, r as CUSTOM_CONCEPT, s as ConfigValidationError, t as CANONICAL_FIELDS, u as DiscoveredColumnMeta, v as RelationshipsMap, w as validateEntitiesConfig, x as filterSchema, y as defineClivlyConfig } from "./entity-config-C4Yf_fPj.mjs";
2
- export { CANONICAL_FIELDS, CRM_CONCEPTS, CUSTOM_CONCEPT, ClivlyConfigError, ClivlyEntitiesConfig, ClivlyEntityConfig, ConfigValidationError, ConfigValidationResult, CrmConcept, DiscoveredColumnMeta, DiscoveredSchemaTable, FilterExpr, FilterValue, MATERIALIZING_CONCEPTS, MaterializingConcept, RelationshipSpec, RelationshipVia, RelationshipsMap, defineClivlyConfig, entitiesConfigSchema, filterSchema, relationshipSchema, relationshipsSchema, validateEntitiesConfig };
1
+ import { C as defineClivlyConfig, D as relationshipSchema, E as projectionFields, O as relationshipsSchema, S as customObjectDeclarations, T as filterSchema, _ as MATERIALIZING_CONCEPTS, a as ClivlyEntitiesConfig, b as RelationshipVia, c as ClivlyEntityConfigInput, d as CrmConcept, f as CustomObjectDeclaration, g as FilterValue, h as FilterExpr, i as ClivlyConfigError, k as validateEntitiesConfig, l as ConfigValidationError, m as DiscoveredSchemaTable, n as CRM_CONCEPTS, o as ClivlyEntitiesConfigInput, p as DiscoveredColumnMeta, r as CUSTOM_CONCEPT, s as ClivlyEntityConfig, t as CANONICAL_FIELDS, u as ConfigValidationResult, v as MaterializingConcept, w as entitiesConfigSchema, x as RelationshipsMap, y as RelationshipSpec } from "./entity-config-B2RA53nw.mjs";
2
+ export { CANONICAL_FIELDS, CRM_CONCEPTS, CUSTOM_CONCEPT, ClivlyConfigError, ClivlyEntitiesConfig, ClivlyEntitiesConfigInput, ClivlyEntityConfig, ClivlyEntityConfigInput, ConfigValidationError, ConfigValidationResult, CrmConcept, CustomObjectDeclaration, DiscoveredColumnMeta, DiscoveredSchemaTable, FilterExpr, FilterValue, MATERIALIZING_CONCEPTS, MaterializingConcept, RelationshipSpec, RelationshipVia, RelationshipsMap, customObjectDeclarations, defineClivlyConfig, entitiesConfigSchema, filterSchema, projectionFields, relationshipSchema, relationshipsSchema, validateEntitiesConfig };
@@ -1,2 +1,2 @@
1
- import { a as MATERIALIZING_CONCEPTS, c as filterSchema, d as validateEntitiesConfig, i as ClivlyConfigError, l as relationshipSchema, n as CRM_CONCEPTS, o as defineClivlyConfig, r as CUSTOM_CONCEPT, s as entitiesConfigSchema, t as CANONICAL_FIELDS, u as relationshipsSchema } from "./entity-config-D3LmzgLb.mjs";
2
- export { CANONICAL_FIELDS, CRM_CONCEPTS, CUSTOM_CONCEPT, ClivlyConfigError, MATERIALIZING_CONCEPTS, defineClivlyConfig, entitiesConfigSchema, filterSchema, relationshipSchema, relationshipsSchema, validateEntitiesConfig };
1
+ import { a as MATERIALIZING_CONCEPTS, c as entitiesConfigSchema, d as relationshipSchema, f as relationshipsSchema, i as ClivlyConfigError, l as filterSchema, n as CRM_CONCEPTS, o as customObjectDeclarations, p as validateEntitiesConfig, r as CUSTOM_CONCEPT, s as defineClivlyConfig, t as CANONICAL_FIELDS, u as projectionFields } from "./entity-config-kUHri9yA.mjs";
2
+ export { CANONICAL_FIELDS, CRM_CONCEPTS, CUSTOM_CONCEPT, ClivlyConfigError, MATERIALIZING_CONCEPTS, customObjectDeclarations, defineClivlyConfig, entitiesConfigSchema, filterSchema, projectionFields, relationshipSchema, relationshipsSchema, validateEntitiesConfig };