@fayz-ai/sdk 0.10.1 → 0.11.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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/automations.d.ts +94 -0
  3. package/dist/automations.d.ts.map +1 -0
  4. package/dist/automations.js +61 -0
  5. package/dist/automations.js.map +1 -0
  6. package/dist/{chunk-7UXTYT6I.js → chunk-5D2B7R3U.js} +473 -31
  7. package/dist/chunk-5D2B7R3U.js.map +1 -0
  8. package/dist/chunk-U7SC2YFQ.js +135 -0
  9. package/dist/chunk-U7SC2YFQ.js.map +1 -0
  10. package/dist/events.d.ts +48 -0
  11. package/dist/events.d.ts.map +1 -0
  12. package/dist/events.js +101 -0
  13. package/dist/events.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +307 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/boot-skeleton.d.ts +20 -0
  19. package/dist/lib/boot-skeleton.d.ts.map +1 -0
  20. package/dist/lib/connector-oauth.d.ts +118 -0
  21. package/dist/lib/connector-oauth.d.ts.map +1 -0
  22. package/dist/lib/credentials.d.ts +98 -0
  23. package/dist/lib/credentials.d.ts.map +1 -0
  24. package/dist/lib/dedupe-fetch.d.ts +26 -0
  25. package/dist/lib/dedupe-fetch.d.ts.map +1 -0
  26. package/dist/lib/platform-url.d.ts +15 -0
  27. package/dist/lib/platform-url.d.ts.map +1 -0
  28. package/dist/lib/runtime-token.d.ts +104 -0
  29. package/dist/lib/runtime-token.d.ts.map +1 -0
  30. package/dist/release-channels.js +1 -1
  31. package/dist/release-channels.json +93 -93
  32. package/dist/shop.d.ts +377 -11
  33. package/dist/shop.d.ts.map +1 -1
  34. package/dist/shop.js +1 -1
  35. package/dist/vite.d.ts +9 -0
  36. package/dist/vite.d.ts.map +1 -1
  37. package/dist/vite.js +104 -47
  38. package/dist/vite.js.map +1 -1
  39. package/package.json +9 -1
  40. package/dist/chunk-7UXTYT6I.js.map +0 -1
  41. package/dist/chunk-KVMRRT3O.js +0 -135
  42. package/dist/chunk-KVMRRT3O.js.map +0 -1
package/dist/vite.js CHANGED
@@ -1,45 +1,96 @@
1
- import { existsSync } from 'fs';
1
+ import { existsSync, readdirSync, readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
3
 
4
4
  // src/vite.ts
5
- var SDK_PACKAGES = [
6
- // 'saas' is the deprecated compat shim for 'admin' — kept so an app that has
7
- // not migrated its imports still resolves in source mode (removed in 0.12.0).
8
- "sdk",
9
- "core",
10
- "auth",
11
- "ui",
12
- "admin",
13
- "saas",
14
- "shop",
15
- "storefront",
16
- "portal",
17
- "courses",
18
- "db"
19
- ];
20
- var SDK_PLUGINS = [
21
- "agenda",
22
- "auth",
23
- "automations",
24
- "blog",
25
- "conversations",
26
- "courses",
27
- "crm",
28
- "dashboard",
29
- "financial",
30
- "forms",
31
- "inventory",
32
- "marketing",
33
- "menu",
34
- "orders",
35
- "payments",
36
- "reports",
37
- "reputation",
38
- "shop",
39
- "sites",
40
- "tables",
41
- "tasks"
42
- ];
5
+ var BOOT_THEME_STORAGE_KEY = "fayz:boot-theme";
6
+ function adminMarkup() {
7
+ return `<div id="fayz-boot" role="status" aria-live="polite" aria-label="Carregando"><span class="fb-spin"></span></div>`;
8
+ }
9
+ function adminStyle(sidebar) {
10
+ return `<style id="fayz-boot-style">
11
+ #fayz-boot{--fb-rail:${sidebar};--fb-ring:rgba(255,255,255,.18);--fb-ring-lit:rgba(255,255,255,.7);position:fixed;inset:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;background:var(--fb-rail);opacity:1;transition:opacity .2s ease}
12
+ #fayz-boot[data-leaving]{opacity:0;pointer-events:none}
13
+ #fayz-boot .fb-spin{display:block;width:1.75rem;height:1.75rem;border-radius:9999px;border:2px solid var(--fb-ring);border-top-color:var(--fb-ring-lit);animation:fb-spin .7s linear infinite}
14
+ @keyframes fb-spin{to{transform:rotate(360deg)}}
15
+ @media (prefers-reduced-motion:reduce){#fayz-boot .fb-spin{animation:none;border-top-color:var(--fb-ring)}}
16
+ </style>`;
17
+ }
18
+ var DISMISS_SCRIPT = `<script>(function(){
19
+ var boot=document.getElementById('fayz-boot'),root=document.getElementById('root');
20
+ if(!boot)return;
21
+ try{
22
+ var t=JSON.parse(localStorage.getItem('${BOOT_THEME_STORAGE_KEY}')||'null');
23
+ if(t&&t.sidebar){
24
+ boot.style.setProperty('--fb-rail','hsl('+t.sidebar+')');
25
+ // A light rail (some palettes ship one) would swallow a white ring, so
26
+ // the ring follows the rail's lightness instead of assuming a dark one.
27
+ var l=parseFloat((String(t.sidebar).trim().split(/\\s+/)[2]||'0').replace('%',''));
28
+ if(l>55){
29
+ boot.style.setProperty('--fb-ring','rgba(0,0,0,.15)');
30
+ boot.style.setProperty('--fb-ring-lit','rgba(0,0,0,.55)');
31
+ }
32
+ }
33
+ }catch(e){}
34
+ var gone=false,drop=function(){
35
+ if(gone)return;gone=true;boot.setAttribute('data-leaving','');
36
+ setTimeout(function(){boot.parentNode&&boot.parentNode.removeChild(boot)},250);
37
+ };
38
+ if(!root){drop();return}
39
+ if(root.childNodes.length){drop();return}
40
+ var mo=new MutationObserver(function(){
41
+ if(!root.childNodes.length)return;
42
+ mo.disconnect();
43
+ (window.requestAnimationFrame||setTimeout)(drop);
44
+ });
45
+ mo.observe(root,{childList:true});
46
+ setTimeout(function(){mo.disconnect();drop()},15000);
47
+ })();</script>`;
48
+ function looksLikeAdminApp(root) {
49
+ const pkgPath = resolve(root, "package.json");
50
+ if (!existsSync(pkgPath)) return false;
51
+ try {
52
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
53
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
54
+ if (deps["@fayz-ai/storefront"]) return false;
55
+ return Boolean(deps["@fayz-ai/admin"] || deps["@fayz-ai/saas"]);
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+ function fayzBootSkeleton(root, opts = {}) {
61
+ const surface = opts.surface ?? (looksLikeAdminApp(root) ? "admin" : "none");
62
+ const sidebar = opts.sidebar ?? "#131c26";
63
+ return {
64
+ name: "fayz:boot-skeleton",
65
+ transformIndexHtml: {
66
+ order: "post",
67
+ handler(html) {
68
+ if (surface === "none") return html;
69
+ if (!html.includes('id="root"')) return html;
70
+ const injected = `${adminStyle(sidebar)}
71
+ ${adminMarkup()}
72
+ ${DISMISS_SCRIPT}`;
73
+ return html.includes("</body>") ? html.replace("</body>", `${injected}
74
+ </body>`) : `${html}
75
+ ${injected}`;
76
+ }
77
+ }
78
+ };
79
+ }
80
+
81
+ // src/vite.ts
82
+ function sdkAliases(sdkDir) {
83
+ const out = {};
84
+ for (const group of ["packages", "plugins"]) {
85
+ const dir = resolve(sdkDir, group);
86
+ if (!existsSync(dir)) continue;
87
+ for (const name of readdirSync(dir)) {
88
+ const src = resolve(dir, name, "src");
89
+ if (existsSync(resolve(src, "index.ts"))) out[`@fayz-ai/${name}`] = src;
90
+ }
91
+ }
92
+ return out;
93
+ }
43
94
  var FAYZ_SDK_DIR_ENV = "FAYZ_SDK_DIR";
44
95
  function resolveSdkDir(root, sdkDir, env = process.env) {
45
96
  const fromEnv = env[FAYZ_SDK_DIR_ENV]?.trim();
@@ -51,14 +102,10 @@ function fayzVite(opts = {}) {
51
102
  const wantLocal = process.env.FAYZ_SDK_SOURCE !== "published";
52
103
  const localPresent = existsSync(resolve(fayzSdk, "packages/core/src/index.ts"));
53
104
  const useLocal = wantLocal && localPresent;
54
- const localAliases = {};
55
- if (useLocal) {
56
- for (const p of SDK_PACKAGES) localAliases[`@fayz-ai/${p}`] = resolve(fayzSdk, `packages/${p}/src`);
57
- for (const p of SDK_PLUGINS) localAliases[`@fayz-ai/plugin-${p}`] = resolve(fayzSdk, `plugins/plugin-${p}/src`);
58
- }
105
+ const localAliases = useLocal ? sdkAliases(fayzSdk) : {};
59
106
  const { alias: userAlias, dedupe: userDedupe, conditions: _ignore, ...restResolve } = opts.resolve ?? {};
60
107
  return {
61
- plugins: [...opts.plugins ?? []],
108
+ plugins: [...opts.plugins ?? [], fayzBootSkeleton(root, opts.bootSkeleton)],
62
109
  envPrefix: ["VITE_", "PUBLIC_"],
63
110
  resolve: {
64
111
  ...restResolve,
@@ -79,7 +126,17 @@ function fayzVite(opts = {}) {
79
126
  dedupe: userDedupe ?? ["react", "react-dom", "zustand", "lucide-react", "react-router-dom", "@supabase/supabase-js", "sonner"],
80
127
  conditions: useLocal ? ["source", "browser", "module", "jsnext:main", "jsnext"] : void 0
81
128
  },
82
- optimizeDeps: { exclude: useLocal ? Object.keys(localAliases) : [] },
129
+ optimizeDeps: {
130
+ exclude: useLocal ? Object.keys(localAliases) : [],
131
+ // Excluding @fayz-ai/* also hides THEIR bare deps from Vite's initial
132
+ // scan. A dep that first appears behind a React.lazy() is then discovered
133
+ // at click time, and the re-optimize that follows kills the very imports
134
+ // that triggered it — every chart on the page fails at once with "Failed
135
+ // to fetch dynamically imported module". recharts is the only such dep
136
+ // (ChartWidget lazies it so it ships as an async chunk), so it is named
137
+ // here rather than dropping the exclude that keeps SDK source hot.
138
+ include: useLocal ? ["recharts"] : void 0
139
+ },
83
140
  // The preview-container runtime contract: Vite's host-check 403s any
84
141
  // non-local Host (browser iframe via Caddy, health probe via
85
142
  // host.docker.internal) unless allowedHosts is set. host/cors/headers keep
@@ -102,6 +159,6 @@ function fayzVite(opts = {}) {
102
159
  };
103
160
  }
104
161
 
105
- export { FAYZ_SDK_DIR_ENV, fayzVite, resolveSdkDir };
162
+ export { BOOT_THEME_STORAGE_KEY, FAYZ_SDK_DIR_ENV, fayzVite, resolveSdkDir };
106
163
  //# sourceMappingURL=vite.js.map
107
164
  //# sourceMappingURL=vite.js.map
package/dist/vite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vite.ts"],"names":[],"mappings":"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","file":"vite.js","sourcesContent":["import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { UserConfig, PluginOption, AliasOptions } from 'vite'\n\n// All publishable @fayz-ai/* packages (root src). Subpaths (e.g.\n// @fayz-ai/admin/ui, @fayz-ai/storefront/catalog) resolve automatically via\n// Vite's prefix alias matching — the shim files mirror the subpath under src/.\nconst SDK_PACKAGES = [\n // 'saas' is the deprecated compat shim for 'admin' — kept so an app that has\n // not migrated its imports still resolves in source mode (removed in 0.12.0).\n 'sdk', 'core', 'auth', 'ui', 'admin', 'saas', 'shop', 'storefront', 'portal', 'courses', 'db',\n] as const\n\nconst SDK_PLUGINS = [\n 'agenda', 'auth', 'automations', 'blog', 'conversations', 'courses', 'crm', 'dashboard',\n 'financial', 'forms', 'inventory', 'marketing', 'menu', 'orders', 'payments', 'reports',\n 'reputation', 'shop', 'sites', 'tables', 'tasks',\n] as const\n\nexport interface FayzViteOptions {\n /** Dev server port. */\n port?: number\n /** Fail instead of incrementing if the port is taken. */\n strictPort?: boolean\n /** Extra app-specific aliases, merged after the SDK aliases. */\n aliases?: Record<string, string>\n /** Extra Vite plugins, appended after @vitejs/plugin-react. */\n plugins?: PluginOption[]\n /**\n * SDK source location, absolute or relative to the app root\n * (default `../../fayz-sdk`).\n *\n * The `FAYZ_SDK_DIR` environment variable OVERRIDES this — see\n * {@link resolveSdkDir}.\n */\n sdkDir?: string\n /** App root directory (default process.cwd()). */\n root?: string\n /**\n * Extra Vite `server` config, merged over the SDK server defaults. The\n * preview-container contract (host/cors/allowedHosts/headers) is applied\n * first, so an override can add e.g. `proxy` without dropping it.\n */\n server?: UserConfig['server']\n /**\n * Extra Vite `resolve` config, merged over the SDK resolve defaults. The SDK\n * alias map / dedupe / conditions win for `@fayz-ai/*` local-source\n * resolution; any other resolve keys (and extra aliases) are merged in.\n */\n resolve?: UserConfig['resolve']\n}\n\n/**\n * Shared Vite config for Fayz dogfood apps. Resolves `@fayz-ai/*` from the local\n * SDK source when it is checked out next to the app AND `FAYZ_SDK_SOURCE` is not\n * `published`; otherwise from node_modules (the Fayz editor sandbox / published\n * npm). Apps no longer hand-maintain alias maps or the local-vs-npm guard.\n *\n * import { defineConfig } from 'vite'\n * import react from '@vitejs/plugin-react'\n * import { fayzVite } from '@fayz-ai/sdk/vite'\n * export default defineConfig(fayzVite({ port: 5185, plugins: [react()] }))\n *\n * Where that local source is read from is {@link resolveSdkDir}: `FAYZ_SDK_DIR`\n * beats the `sdkDir` option beats `../../fayz-sdk`.\n *\n * The app passes its own `@vitejs/plugin-react` so `@fayz-ai/sdk` carries no\n * build-tool peer deps (which otherwise choke npm's peer resolution, since sdk\n * sits in every dependency path).\n */\n/** Env var that redirects local-source resolution to another SDK checkout. */\nexport const FAYZ_SDK_DIR_ENV = 'FAYZ_SDK_DIR'\n\n/**\n * Where the local SDK source is, as an absolute path. Resolution order:\n *\n * 1. `FAYZ_SDK_DIR` (env) — wins, absolute or root-relative\n * 2. `sdkDir` (option) — what the app's vite config declares\n * 3. `../../fayz-sdk` — the sibling-checkout convention\n *\n * Env wins deliberately. `sdkDir` lives in the app's COMMITTED vite config, so\n * without an override there was no way to build, dev or `fayz validate` a\n * store against a different SDK tree (a worktree, a release branch) short of\n * editing that committed file or dropping an untracked config shim next to it\n * — which is exactly what the fleet ended up doing. An env var is the one\n * knob a CLI flag and a container can both set without touching the repo.\n *\n * Exported so the CLI and the tests agree on the precedence by construction\n * rather than by comment.\n */\nexport function resolveSdkDir(\n root: string,\n sdkDir?: string,\n env: Record<string, string | undefined> = process.env,\n): string {\n const fromEnv = env[FAYZ_SDK_DIR_ENV]?.trim()\n return resolve(root, fromEnv || sdkDir || '../../fayz-sdk')\n}\n\nexport function fayzVite(opts: FayzViteOptions = {}): UserConfig {\n const root = opts.root ?? process.cwd()\n const fayzSdk = resolveSdkDir(root, opts.sdkDir)\n const wantLocal = process.env.FAYZ_SDK_SOURCE !== 'published'\n const localPresent = existsSync(resolve(fayzSdk, 'packages/core/src/index.ts'))\n const useLocal = wantLocal && localPresent\n\n const localAliases: Record<string, string> = {}\n if (useLocal) {\n for (const p of SDK_PACKAGES) localAliases[`@fayz-ai/${p}`] = resolve(fayzSdk, `packages/${p}/src`)\n for (const p of SDK_PLUGINS) localAliases[`@fayz-ai/plugin-${p}`] = resolve(fayzSdk, `plugins/plugin-${p}/src`)\n }\n\n // Pull SDK-owned resolve keys out of any caller override so they can't clobber\n // local-source @fayz-ai/* resolution; the rest of `resolve` is merged in.\n const { alias: userAlias, dedupe: userDedupe, conditions: _ignore, ...restResolve } =\n (opts.resolve ?? {}) as Exclude<UserConfig['resolve'], undefined>\n\n return {\n plugins: [...(opts.plugins ?? [])],\n envPrefix: ['VITE_', 'PUBLIC_'],\n resolve: {\n ...restResolve,\n alias: {\n '@': resolve(root, 'src'),\n ...localAliases,\n ...(opts.aliases ?? {}),\n ...((userAlias as Record<string, string> | undefined) ?? {}),\n } as AliasOptions,\n // lucide-react is a direct dep of both the app and every @fayz-ai/*\n // package; without dedupe a version skew installs two copies and esbuild\n // pre-bundles each barrel separately (~1,500 icon modules each).\n // Collapsing to one copy is the single biggest cut to the editor-container\n // optimize RAM/CPU spike. Only dedupe deps the *app* directly depends on\n // (so they're hoisted to its root node_modules) — deduping a transitive\n // like @tanstack/react-table makes Vite resolve it from the app root,\n // which fails in local-source mode and 500s the aliased UI source.\n dedupe: userDedupe ?? ['react', 'react-dom', 'zustand', 'lucide-react', 'react-router-dom', '@supabase/supabase-js', 'sonner'],\n conditions: useLocal ? ['source', 'browser', 'module', 'jsnext:main', 'jsnext'] : undefined,\n },\n optimizeDeps: { exclude: useLocal ? Object.keys(localAliases) : [] },\n // The preview-container runtime contract: Vite's host-check 403s any\n // non-local Host (browser iframe via Caddy, health probe via\n // host.docker.internal) unless allowedHosts is set. host/cors/headers keep\n // the proxied iframe + cross-origin asset fetches working. Owned here\n // because the app's vite.config has no literal `server: {` for the\n // container's text patchers to anchor on. Caller `server` merges last.\n server: {\n host: true,\n port: opts.port,\n strictPort: opts.strictPort,\n cors: true,\n allowedHosts: true,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Cross-Origin-Resource-Policy': 'cross-origin',\n },\n fs: { allow: [root, fayzSdk] },\n ...(opts.server ?? {}),\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/boot-skeleton.ts","../src/vite.ts"],"names":["resolve","existsSync"],"mappings":"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","file":"vite.js","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Plugin } from 'vite'\n\n// ---------------------------------------------------------------------------\n// Boot screen — the first thing painted, from the HTML itself.\n//\n// The React boot screen only exists once React exists, and the wait BEFORE that\n// (fetch the entry chunk, parse it, run it) is the long part of a cold load:\n// the page sat blank for most of the wait. Anything that fills that window has\n// to be in the document the server already sent — markup and CSS the browser\n// can paint on its own, with no module graph behind it.\n//\n// What it paints is the rail's color and a spinner in the middle. It used to\n// draw the whole shell in outline — rail, header, tiles, table — which promised\n// a screen the app then contradicted, and read as content that had failed\n// rather than content on its way. It is deliberately the SAME image as\n// AppShellSkeleton in @fayz-ai/ui, so the handoff HTML → React → app never\n// swaps anything the eye can catch.\n//\n// It dismisses itself the moment React puts anything in #root.\n// ---------------------------------------------------------------------------\n\nexport interface BootSkeletonOptions {\n /**\n * Which shape to draw. 'admin' is the sidebar shell; 'none' injects nothing.\n * Default: 'admin' when the app depends on @fayz-ai/admin or @fayz-ai/saas\n * and not on @fayz-ai/storefront (a storefront's first paint is a page, not\n * a console, and an admin rail would be a lie).\n */\n surface?: 'admin' | 'none'\n /** Rail color as CSS, when the app has not booted once yet. */\n sidebar?: string\n /** @deprecated The boot screen paints the rail color edge to edge; there is\n * no page background on it any more. Accepted and ignored. */\n background?: string\n}\n\n/** localStorage key the admin writes its resolved palette to, so the NEXT boot\n * paints in the app's own colors instead of the neutral default. */\nexport const BOOT_THEME_STORAGE_KEY = 'fayz:boot-theme'\n\nfunction adminMarkup(): string {\n return `<div id=\"fayz-boot\" role=\"status\" aria-live=\"polite\" aria-label=\"Carregando\"><span class=\"fb-spin\"></span></div>`\n}\n\nfunction adminStyle(sidebar: string): string {\n // The ring is drawn in rgba white, not a theme token: the rail is dark in\n // every palette the apps ship, and the stored theme (below) only overrides\n // the background. A token that had to be guessed here could land invisible.\n return `<style id=\"fayz-boot-style\">\n#fayz-boot{--fb-rail:${sidebar};--fb-ring:rgba(255,255,255,.18);--fb-ring-lit:rgba(255,255,255,.7);position:fixed;inset:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;background:var(--fb-rail);opacity:1;transition:opacity .2s ease}\n#fayz-boot[data-leaving]{opacity:0;pointer-events:none}\n#fayz-boot .fb-spin{display:block;width:1.75rem;height:1.75rem;border-radius:9999px;border:2px solid var(--fb-ring);border-top-color:var(--fb-ring-lit);animation:fb-spin .7s linear infinite}\n@keyframes fb-spin{to{transform:rotate(360deg)}}\n@media (prefers-reduced-motion:reduce){#fayz-boot .fb-spin{animation:none;border-top-color:var(--fb-ring)}}\n</style>`\n}\n\n/**\n * Reads the palette the app stored on its last boot and repaints the skeleton\n * in it, then removes the whole thing as soon as React fills #root.\n *\n * The MutationObserver is the handoff: no import, no callback the app has to\n * remember to call, and it works for any scaffold. The timeout is the safety\n * net — a boot that never mounts must not leave a fixed overlay on top of\n * whatever error the page is trying to show.\n */\nconst DISMISS_SCRIPT = `<script>(function(){\n var boot=document.getElementById('fayz-boot'),root=document.getElementById('root');\n if(!boot)return;\n try{\n var t=JSON.parse(localStorage.getItem('${BOOT_THEME_STORAGE_KEY}')||'null');\n if(t&&t.sidebar){\n boot.style.setProperty('--fb-rail','hsl('+t.sidebar+')');\n // A light rail (some palettes ship one) would swallow a white ring, so\n // the ring follows the rail's lightness instead of assuming a dark one.\n var l=parseFloat((String(t.sidebar).trim().split(/\\\\s+/)[2]||'0').replace('%',''));\n if(l>55){\n boot.style.setProperty('--fb-ring','rgba(0,0,0,.15)');\n boot.style.setProperty('--fb-ring-lit','rgba(0,0,0,.55)');\n }\n }\n }catch(e){}\n var gone=false,drop=function(){\n if(gone)return;gone=true;boot.setAttribute('data-leaving','');\n setTimeout(function(){boot.parentNode&&boot.parentNode.removeChild(boot)},250);\n };\n if(!root){drop();return}\n if(root.childNodes.length){drop();return}\n var mo=new MutationObserver(function(){\n if(!root.childNodes.length)return;\n mo.disconnect();\n (window.requestAnimationFrame||setTimeout)(drop);\n });\n mo.observe(root,{childList:true});\n setTimeout(function(){mo.disconnect();drop()},15000);\n})();</script>`\n\n/** True when the app on disk renders an admin console. */\nfunction looksLikeAdminApp(root: string): boolean {\n const pkgPath = resolve(root, 'package.json')\n if (!existsSync(pkgPath)) return false\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n if (deps['@fayz-ai/storefront']) return false\n return Boolean(deps['@fayz-ai/admin'] || deps['@fayz-ai/saas'])\n } catch {\n return false\n }\n}\n\nexport function fayzBootSkeleton(root: string, opts: BootSkeletonOptions = {}): Plugin {\n const surface = opts.surface ?? (looksLikeAdminApp(root) ? 'admin' : 'none')\n // Neutral slate, not a guess at the brand: the stored palette from the last\n // boot replaces it, and a first-ever visit is the only time it shows.\n const sidebar = opts.sidebar ?? '#131c26'\n\n return {\n name: 'fayz:boot-skeleton',\n transformIndexHtml: {\n order: 'post',\n handler(html: string) {\n if (surface === 'none') return html\n if (!html.includes('id=\"root\"')) return html\n const injected = `${adminStyle(sidebar)}\\n${adminMarkup()}\\n${DISMISS_SCRIPT}`\n return html.includes('</body>')\n ? html.replace('</body>', `${injected}\\n</body>`)\n : `${html}\\n${injected}`\n },\n },\n }\n}\n","import { existsSync, readdirSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { UserConfig, PluginOption, AliasOptions } from 'vite'\nimport { fayzBootSkeleton, type BootSkeletonOptions } from './lib/boot-skeleton'\n\nexport { BOOT_THEME_STORAGE_KEY, type BootSkeletonOptions } from './lib/boot-skeleton'\n\n/**\n * Every `@fayz-ai/*` package in the checkout, as a Vite alias map (root src).\n * Subpaths (e.g. `@fayz-ai/admin/ui`, `@fayz-ai/storefront/catalog`) resolve\n * automatically via Vite's prefix alias matching — the shim files mirror the\n * subpath under `src/`.\n *\n * Read from disk rather than listed, because a hardcoded list is only correct\n * for the version it shipped in and apps run the INSTALLED `fayzVite`, not this\n * one. That is how the `saas` → `admin` rename half-broke the fleet: `admin`\n * was not in 0.9.0's list, so every app resolved it through the workspace to\n * `packages/admin/dist` — a stale build in the middle of an otherwise\n * source-resolved app, which reads as a bug in the code rather than in the\n * setup. A directory listing cannot go stale.\n */\nfunction sdkAliases(sdkDir: string): Record<string, string> {\n const out: Record<string, string> = {}\n for (const group of ['packages', 'plugins']) {\n const dir = resolve(sdkDir, group)\n if (!existsSync(dir)) continue\n for (const name of readdirSync(dir)) {\n const src = resolve(dir, name, 'src')\n // The directory name is the package name minus the scope, for both groups\n // (packages/admin → @fayz-ai/admin, plugins/plugin-crm → …/plugin-crm).\n if (existsSync(resolve(src, 'index.ts'))) out[`@fayz-ai/${name}`] = src\n }\n }\n return out\n}\n\nexport interface FayzViteOptions {\n /** Dev server port. */\n port?: number\n /** Fail instead of incrementing if the port is taken. */\n strictPort?: boolean\n /** Extra app-specific aliases, merged after the SDK aliases. */\n aliases?: Record<string, string>\n /** Extra Vite plugins, appended after @vitejs/plugin-react. */\n plugins?: PluginOption[]\n /**\n * SDK source location, absolute or relative to the app root\n * (default `../../fayz-sdk`).\n *\n * The `FAYZ_SDK_DIR` environment variable OVERRIDES this — see\n * {@link resolveSdkDir}.\n */\n sdkDir?: string\n /** App root directory (default process.cwd()). */\n root?: string\n /**\n * Extra Vite `server` config, merged over the SDK server defaults. The\n * preview-container contract (host/cors/allowedHosts/headers) is applied\n * first, so an override can add e.g. `proxy` without dropping it.\n */\n server?: UserConfig['server']\n /**\n * Extra Vite `resolve` config, merged over the SDK resolve defaults. The SDK\n * alias map / dedupe / conditions win for `@fayz-ai/*` local-source\n * resolution; any other resolve keys (and extra aliases) are merged in.\n */\n resolve?: UserConfig['resolve']\n /**\n * The shell outline painted into index.html, so the wait for the entry chunk\n * is not a blank page. Auto-detected from the app's dependencies; pass\n * `{ surface: 'none' }` to opt out, or colors to match the app's palette on a\n * first-ever visit (later visits reuse the palette the app itself stored).\n */\n bootSkeleton?: BootSkeletonOptions\n}\n\n/**\n * Shared Vite config for Fayz dogfood apps. Resolves `@fayz-ai/*` from the local\n * SDK source when it is checked out next to the app AND `FAYZ_SDK_SOURCE` is not\n * `published`; otherwise from node_modules (the Fayz editor sandbox / published\n * npm). Apps no longer hand-maintain alias maps or the local-vs-npm guard.\n *\n * import { defineConfig } from 'vite'\n * import react from '@vitejs/plugin-react'\n * import { fayzVite } from '@fayz-ai/sdk/vite'\n * export default defineConfig(fayzVite({ port: 5185, plugins: [react()] }))\n *\n * Where that local source is read from is {@link resolveSdkDir}: `FAYZ_SDK_DIR`\n * beats the `sdkDir` option beats `../../fayz-sdk`.\n *\n * The app passes its own `@vitejs/plugin-react` so `@fayz-ai/sdk` carries no\n * build-tool peer deps (which otherwise choke npm's peer resolution, since sdk\n * sits in every dependency path).\n */\n/** Env var that redirects local-source resolution to another SDK checkout. */\nexport const FAYZ_SDK_DIR_ENV = 'FAYZ_SDK_DIR'\n\n/**\n * Where the local SDK source is, as an absolute path. Resolution order:\n *\n * 1. `FAYZ_SDK_DIR` (env) — wins, absolute or root-relative\n * 2. `sdkDir` (option) — what the app's vite config declares\n * 3. `../../fayz-sdk` — the sibling-checkout convention\n *\n * Env wins deliberately. `sdkDir` lives in the app's COMMITTED vite config, so\n * without an override there was no way to build, dev or `fayz validate` a\n * store against a different SDK tree (a worktree, a release branch) short of\n * editing that committed file or dropping an untracked config shim next to it\n * — which is exactly what the fleet ended up doing. An env var is the one\n * knob a CLI flag and a container can both set without touching the repo.\n *\n * Exported so the CLI and the tests agree on the precedence by construction\n * rather than by comment.\n */\nexport function resolveSdkDir(\n root: string,\n sdkDir?: string,\n env: Record<string, string | undefined> = process.env,\n): string {\n const fromEnv = env[FAYZ_SDK_DIR_ENV]?.trim()\n return resolve(root, fromEnv || sdkDir || '../../fayz-sdk')\n}\n\nexport function fayzVite(opts: FayzViteOptions = {}): UserConfig {\n const root = opts.root ?? process.cwd()\n const fayzSdk = resolveSdkDir(root, opts.sdkDir)\n const wantLocal = process.env.FAYZ_SDK_SOURCE !== 'published'\n const localPresent = existsSync(resolve(fayzSdk, 'packages/core/src/index.ts'))\n const useLocal = wantLocal && localPresent\n\n const localAliases = useLocal ? sdkAliases(fayzSdk) : {}\n\n // Pull SDK-owned resolve keys out of any caller override so they can't clobber\n // local-source @fayz-ai/* resolution; the rest of `resolve` is merged in.\n const { alias: userAlias, dedupe: userDedupe, conditions: _ignore, ...restResolve } =\n (opts.resolve ?? {}) as Exclude<UserConfig['resolve'], undefined>\n\n return {\n plugins: [...(opts.plugins ?? []), fayzBootSkeleton(root, opts.bootSkeleton)],\n envPrefix: ['VITE_', 'PUBLIC_'],\n resolve: {\n ...restResolve,\n alias: {\n '@': resolve(root, 'src'),\n ...localAliases,\n ...(opts.aliases ?? {}),\n ...((userAlias as Record<string, string> | undefined) ?? {}),\n } as AliasOptions,\n // lucide-react is a direct dep of both the app and every @fayz-ai/*\n // package; without dedupe a version skew installs two copies and esbuild\n // pre-bundles each barrel separately (~1,500 icon modules each).\n // Collapsing to one copy is the single biggest cut to the editor-container\n // optimize RAM/CPU spike. Only dedupe deps the *app* directly depends on\n // (so they're hoisted to its root node_modules) — deduping a transitive\n // like @tanstack/react-table makes Vite resolve it from the app root,\n // which fails in local-source mode and 500s the aliased UI source.\n dedupe: userDedupe ?? ['react', 'react-dom', 'zustand', 'lucide-react', 'react-router-dom', '@supabase/supabase-js', 'sonner'],\n conditions: useLocal ? ['source', 'browser', 'module', 'jsnext:main', 'jsnext'] : undefined,\n },\n optimizeDeps: {\n exclude: useLocal ? Object.keys(localAliases) : [],\n // Excluding @fayz-ai/* also hides THEIR bare deps from Vite's initial\n // scan. A dep that first appears behind a React.lazy() is then discovered\n // at click time, and the re-optimize that follows kills the very imports\n // that triggered it — every chart on the page fails at once with \"Failed\n // to fetch dynamically imported module\". recharts is the only such dep\n // (ChartWidget lazies it so it ships as an async chunk), so it is named\n // here rather than dropping the exclude that keeps SDK source hot.\n include: useLocal ? ['recharts'] : undefined,\n },\n // The preview-container runtime contract: Vite's host-check 403s any\n // non-local Host (browser iframe via Caddy, health probe via\n // host.docker.internal) unless allowedHosts is set. host/cors/headers keep\n // the proxied iframe + cross-origin asset fetches working. Owned here\n // because the app's vite.config has no literal `server: {` for the\n // container's text patchers to anchor on. Caller `server` merges last.\n server: {\n host: true,\n port: opts.port,\n strictPort: opts.strictPort,\n cors: true,\n allowedHosts: true,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Cross-Origin-Resource-Policy': 'cross-origin',\n },\n fs: { allow: [root, fayzSdk] },\n ...(opts.server ?? {}),\n },\n }\n}\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "fayz": {
4
4
  "status": "beta"
5
5
  },
6
- "version": "0.10.1",
6
+ "version": "0.11.0",
7
7
  "description": "Fayz SDK — API client, app params, runtime broker helpers, and shared types for generated Fayz projects",
8
8
  "type": "module",
9
9
  "sideEffects": false,
@@ -27,6 +27,14 @@
27
27
  "types": "./dist/agent.d.ts",
28
28
  "import": "./dist/agent.js"
29
29
  },
30
+ "./automations": {
31
+ "types": "./dist/automations.d.ts",
32
+ "import": "./dist/automations.js"
33
+ },
34
+ "./events": {
35
+ "types": "./dist/events.d.ts",
36
+ "import": "./dist/events.js"
37
+ },
30
38
  "./shop": {
31
39
  "types": "./dist/shop.d.ts",
32
40
  "import": "./dist/shop.js"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shop.ts"],"names":["options","row"],"mappings":"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","file":"chunk-7UXTYT6I.js","sourcesContent":["import { resetDeprecationWarnings, warnDeprecated } from './deprecations'\n\nexport interface FayzShopProviderOptions {\n supabaseUrl?: string\n publishableKey?: string\n storeId?: string\n apiBaseUrl?: string\n projectId?: string\n mode?: 'broker' | 'supabase'\n productMetadata?: FayzShopProductMetadataOverlay[]\n fetcher?: typeof fetch\n}\n\n/**\n * The signed-in shopper's access token, when there is one.\n *\n * PostgREST decides who you are from the Authorization bearer, and this client\n * used to send the publishable key unconditionally — so every request arrived\n * as `anon` even with a customer logged in. auth.uid() was therefore always\n * null, which is why shop_resolve_customer never linked auth_user_id (0 of 519\n * customers in the pool) and why the self-read policy on public.addresses could\n * never match a row.\n *\n * A module-level resolver rather than a per-app option on purpose: the wiring\n * is done once by initStorefrontRuntime, so a storefront cannot forget it and\n * silently fall back to anonymous. Mirrors setShopTenantResolver in plugin-shop.\n */\ntype AccessTokenResolver = () => string | null | undefined\n\nlet _accessTokenResolver: AccessTokenResolver | null = null\n\nexport function setShopAccessTokenResolver(resolver: AccessTokenResolver | null): void {\n _accessTokenResolver = resolver\n}\n\nexport interface FayzShopProductMetadataOverlay {\n sku?: string | null\n slug?: string | null\n metadata: Record<string, unknown>\n}\n\nexport type FayzShopProductStatus = 'draft' | 'active' | 'archived'\nexport type FayzShopOrderStatus = 'open' | 'archived' | 'cancelled'\nexport type FayzShopFinancialStatus = 'pending' | 'paid' | 'partially_paid' | 'refunded' | 'partially_refunded' | 'voided'\nexport type FayzShopFulfillmentStatus = 'unfulfilled' | 'partially_fulfilled' | 'fulfilled'\n\nexport interface FayzShopListProductsOptions {\n status?: FayzShopProductStatus\n categoryId?: string\n search?: string\n slug?: string\n limit?: number\n offset?: number\n orderBy?: 'name' | 'price' | 'created_at' | 'sort_order'\n order?: 'asc' | 'desc'\n}\n\nexport interface FayzShopListOrdersOptions {\n status?: FayzShopOrderStatus\n financialStatus?: FayzShopFinancialStatus\n fulfillmentStatus?: FayzShopFulfillmentStatus\n customerId?: string\n customerEmail?: string\n search?: string\n limit?: number\n offset?: number\n}\n\nexport interface FayzShopListCustomersOptions {\n search?: string\n limit?: number\n offset?: number\n}\n\nexport interface FayzShopListDiscountsOptions {\n status?: string\n type?: string\n search?: string\n limit?: number\n offset?: number\n}\n\ninterface ProductImageRow {\n id: string\n product_id: string\n url: string\n alt_text?: string | null\n sort_order?: number | null\n is_primary?: boolean | null\n created_at?: string | null\n}\n\ninterface ProductRow {\n id: string\n tenant_id: string\n name: string\n slug?: string | null\n description?: string | null\n price?: number | null\n compare_at_price?: number | null\n currency?: string | null\n status?: FayzShopProductStatus | null\n inventory_count?: number | null\n sku?: string | null\n sort_order?: number | null\n metadata?: Record<string, unknown> | null\n images?: ProductImageRow[] | null\n category_id?: string | null\n category?: { name?: string | null } | null\n is_physical?: boolean | null\n weight?: number | null\n weight_unit?: string | null\n created_at?: string | null\n updated_at?: string | null\n}\n\ninterface StoreCategoryMetadata {\n id?: string | null\n name?: string | null\n slug?: string | null\n description?: string | null\n imageUrl?: string | null\n sortOrder?: number | null\n}\n\ninterface CategoryRow {\n id: string\n tenant_id?: string | null\n name: string\n slug?: string | null\n description?: string | null\n parent_id?: string | null\n sort_order?: number | null\n image_url?: string | null\n created_at?: string | null\n}\n\ninterface OrderItemRow {\n id: string\n order_id: string\n product_id?: string | null\n name: string\n sku?: string | null\n quantity?: number | null\n unit_price?: number | null\n total?: number | null\n image_url?: string | null\n}\n\ninterface OrderRow {\n id: string\n tenant_id: string\n order_number?: number | null\n status?: FayzShopOrderStatus | null\n financial_status?: FayzShopFinancialStatus | null\n fulfillment_status?: FayzShopFulfillmentStatus | null\n currency?: string | null\n subtotal?: number | null\n tax_total?: number | null\n discount_total?: number | null\n shipping_total?: number | null\n total?: number | null\n customer_id?: string | null\n customer_name?: string | null\n customer_email?: string | null\n discount_code?: string | null\n notes?: string | null\n shipping_address?: Record<string, string | undefined> | null\n payment_method_kind?: string | null\n paid_at?: string | null\n items?: OrderItemRow[] | null\n created_at?: string | null\n updated_at?: string | null\n}\n\n/** One row of shop_quote_shipping's result set. */\ninterface ShippingQuoteRow {\n zone_id: string\n name: string\n carrier: string | null\n rate: number | string | null\n base_rate: number | string | null\n free_above: number | string | null\n eta_min_days: number | null\n eta_max_days: number | null\n free: boolean | null\n}\n\n/** public.addresses, as PostgREST returns it. */\ninterface AddressRow {\n id: string\n label: string | null\n recipient: string | null\n phone: string | null\n postal_code: string | null\n street: string | null\n number: string | null\n complement: string | null\n district: string | null\n city: string | null\n state: string | null\n country: string | null\n is_default: boolean | null\n}\n\ninterface CustomerRow {\n id: string\n tenant_id: string\n first_name: string\n last_name?: string | null\n email?: string | null\n phone?: string | null\n notes?: string | null\n orders_count?: number | null\n total_spent?: number | null\n created_at?: string | null\n updated_at?: string | null\n}\n\ninterface DiscountRow {\n id: string\n tenant_id: string\n title: string\n code?: string | null\n type: string\n method?: string | null\n value?: number | null\n usage_limit?: number | null\n once_per_customer?: boolean | null\n starts_at?: string | null\n ends_at?: string | null\n status?: string | null\n times_used?: number | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nexport class FayzShopError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly responseBody?: unknown,\n ) {\n super(message)\n this.name = 'FayzShopError'\n }\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/+$/, '')\n}\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction present<T>(value: T | null | undefined, fallback: T): T {\n return value == null ? fallback : value\n}\n\nfunction productMetadataKey(kind: 'sku' | 'slug', value: string): string {\n return `${kind}:${value.toLowerCase()}`\n}\n\n/** The registry id this shim answers to. */\nexport const PRODUCT_METADATA_OVERLAY_DEPRECATION = 'shop.provider.productMetadata'\n\n/** Test seam — re-arms the once-per-session overlay deprecation warning. */\nexport function resetProductMetadataOverlayDeprecationWarning(): void {\n resetDeprecationWarnings()\n}\n\nfunction buildProductMetadataOverlay(overlays: FayzShopProductMetadataOverlay[] | undefined) {\n const map = new Map<string, Record<string, unknown>>()\n for (const overlay of overlays ?? []) {\n if (overlay.sku) map.set(productMetadataKey('sku', overlay.sku), overlay.metadata)\n if (overlay.slug) map.set(productMetadataKey('slug', overlay.slug), overlay.metadata)\n }\n // I10 deprecation shim (spine M5/M10): the overlay still renders, but it is\n // no longer the source of product options — the variant tables are (0028;\n // read through getProductVariants / products.bySlug). The message is BUILT\n // FROM the registry row, so the warning and the row it documents cannot\n // drift, and the replacement is named by construction (I2). Logged once, not\n // per request, so the signal survives without burying everything else.\n if (map.size > 0) {\n warnDeprecated(\n PRODUCT_METADATA_OVERLAY_DEPRECATION,\n `${map.size} product(s) overlaid —`,\n )\n }\n return map\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\nfunction rowToImage(row: ProductImageRow) {\n return {\n id: row.id,\n productId: row.product_id,\n url: row.url,\n altText: row.alt_text ?? null,\n sortOrder: row.sort_order ?? 0,\n isPrimary: row.is_primary ?? false,\n createdAt: row.created_at ?? nowIso(),\n }\n}\n\nfunction getProductMetadata(row: ProductRow, overlay?: Map<string, Record<string, unknown>>): Record<string, unknown> {\n const metadata = row.metadata ?? {}\n const bySlug = overlay?.get(productMetadataKey('slug', row.slug ?? slugify(row.name)))\n const bySku = row.sku ? overlay?.get(productMetadataKey('sku', row.sku)) : undefined\n return { ...(bySlug ?? {}), ...(bySku ?? {}), ...metadata }\n}\n\nfunction getStoreCategory(row: ProductRow, overlay?: Map<string, Record<string, unknown>>): StoreCategoryMetadata | null {\n const raw = getProductMetadata(row, overlay).fayzStoreCategory\n return raw && typeof raw === 'object' ? raw as StoreCategoryMetadata : null\n}\n\nfunction rowToProduct(row: ProductRow, overlay?: Map<string, Record<string, unknown>>) {\n const metadata = getProductMetadata(row, overlay)\n const storeCategory = getStoreCategory(row, overlay)\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description ?? null,\n price: row.price ?? 0,\n compareAtPrice: row.compare_at_price ?? null,\n currency: row.currency ?? 'BRL',\n status: row.status ?? 'active',\n inventoryCount: row.inventory_count ?? 0,\n sku: row.sku ?? null,\n sortOrder: row.sort_order ?? 0,\n metadata,\n images: Array.isArray(row.images) ? row.images.map(rowToImage) : [],\n categoryId: storeCategory?.id ?? row.category_id ?? null,\n categoryName: storeCategory?.name ?? row.category?.name ?? null,\n isPhysical: row.is_physical ?? true,\n weight: row.weight ?? null,\n weightUnit: row.weight_unit ?? 'kg',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToCategory(row: CategoryRow) {\n return {\n id: row.id,\n tenantId: row.tenant_id ?? 'global',\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description ?? null,\n parentId: row.parent_id ?? null,\n sortOrder: row.sort_order ?? 0,\n imageUrl: row.image_url ?? null,\n createdAt: row.created_at ?? nowIso(),\n }\n}\n\nfunction storeCategoryToCategory(category: StoreCategoryMetadata, tenantId: string) {\n const name = category.name ?? 'Category'\n return {\n id: category.id ?? slugify(name),\n tenantId,\n name,\n slug: category.slug ?? slugify(name),\n description: category.description ?? null,\n parentId: null,\n sortOrder: category.sortOrder ?? 0,\n imageUrl: category.imageUrl ?? null,\n createdAt: nowIso(),\n }\n}\n\nfunction deriveStoreCategories(products: ProductRow[], tenantId: string) {\n const categories = new Map<string, ReturnType<typeof storeCategoryToCategory>>()\n for (const product of products) {\n const category = getStoreCategory(product)\n if (!category?.name && !category?.id) continue\n const mapped = storeCategoryToCategory(category, tenantId)\n categories.set(mapped.id, mapped)\n }\n return [...categories.values()].sort((a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name))\n}\n\nfunction rowToOrder(row: OrderRow) {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n orderNumber: row.order_number ?? 0,\n status: row.status ?? 'open',\n financialStatus: row.financial_status ?? 'pending',\n fulfillmentStatus: row.fulfillment_status ?? 'unfulfilled',\n currency: row.currency ?? 'BRL',\n subtotal: row.subtotal ?? 0,\n taxTotal: row.tax_total ?? 0,\n discountTotal: row.discount_total ?? 0,\n shippingTotal: row.shipping_total ?? 0,\n total: row.total ?? 0,\n customerId: row.customer_id ?? null,\n customerName: row.customer_name ?? null,\n customerEmail: row.customer_email ?? null,\n discountCode: row.discount_code ?? null,\n notes: row.notes ?? null,\n shippingAddress: row.shipping_address ?? null,\n paymentMethodKind: row.payment_method_kind ?? null,\n paidAt: row.paid_at ?? null,\n items: Array.isArray(row.items) ? row.items.map(rowToOrderItem) : [],\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToOrderItem(row: OrderItemRow) {\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? null,\n name: row.name,\n sku: row.sku ?? null,\n quantity: row.quantity ?? 0,\n unitPrice: row.unit_price ?? 0,\n total: row.total ?? 0,\n imageUrl: row.image_url ?? null,\n }\n}\n\nfunction rowToCustomer(row: CustomerRow) {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n firstName: row.first_name,\n lastName: row.last_name ?? '',\n email: row.email ?? null,\n phone: row.phone ?? null,\n notes: row.notes ?? null,\n ordersCount: row.orders_count ?? 0,\n totalSpent: row.total_spent ?? 0,\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToDiscount(row: DiscountRow) {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n code: row.code ?? null,\n type: row.type,\n method: row.method ?? 'code',\n value: row.value ?? 0,\n usageLimit: row.usage_limit ?? null,\n oncePerCustomer: row.once_per_customer ?? false,\n startsAt: row.starts_at ?? nowIso(),\n endsAt: row.ends_at ?? null,\n status: row.status ?? 'active',\n timesUsed: row.times_used ?? 0,\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction updateOrderPayload(input: {\n status?: FayzShopOrderStatus\n financialStatus?: FayzShopFinancialStatus\n fulfillmentStatus?: FayzShopFulfillmentStatus\n notes?: string\n}) {\n const updates: Record<string, unknown> = {}\n if (input.status !== undefined) updates.status = input.status\n if (input.financialStatus !== undefined) updates.financial_status = input.financialStatus\n if (input.fulfillmentStatus !== undefined) updates.fulfillment_status = input.fulfillmentStatus\n if (input.notes !== undefined) updates.notes = input.notes\n return updates\n}\n\nexport function createFayzShopProvider(options: FayzShopProviderOptions) {\n if (options.mode === 'broker' || options.apiBaseUrl || options.projectId) {\n return createBrokerShopProvider(options)\n }\n\n if (!options.supabaseUrl || !options.publishableKey || !options.storeId) {\n throw new FayzShopError('Fayz Shop provider requires either broker apiBaseUrl/projectId or legacy supabaseUrl/publishableKey/storeId.', 400)\n }\n\n const baseUrl = `${normalizeBaseUrl(options.supabaseUrl)}/rest/v1`\n const fetcher = options.fetcher ?? fetch\n const key = options.publishableKey\n const storeId = options.storeId\n const productMetadataOverlay = buildProductMetadataOverlay(options.productMetadata)\n\n async function request<T>(table: string, init: RequestInit & { query?: URLSearchParams } = {}): Promise<T> {\n const query = init.query?.toString()\n const response = await fetcher(`${baseUrl}/${table}${query ? `?${query}` : ''}`, {\n ...init,\n headers: {\n apikey: key,\n // Declares which store this read is for. Until 0020 tenant isolation was\n // a client-side convention (a tenant_id filter the caller could simply\n // omit, returning every merchant's catalogue); the RLS policy now reads\n // this header, so the scope is enforced server-side.\n 'x-fayz-store': storeId,\n // The shopper's JWT when signed in, the publishable key otherwise. The\n // apikey header stays the publishable key either way — Supabase uses it\n // to route the project, not to authenticate.\n Authorization: `Bearer ${_accessTokenResolver?.() || key}`,\n ...(init.body ? { 'Content-Type': 'application/json', Prefer: 'return=representation' } : {}),\n ...init.headers,\n },\n })\n const text = await response.text()\n let body: unknown\n try {\n body = text ? JSON.parse(text) : undefined\n } catch {\n body = text\n }\n if (!response.ok) {\n const message = typeof body === 'object' && body\n ? String((body as { message?: unknown; error?: unknown }).message ?? (body as { error?: unknown }).error ?? `Fayz Shop request failed with status ${response.status}`)\n : `Fayz Shop request failed with status ${response.status}`\n throw new FayzShopError(message, response.status, body)\n }\n return body as T\n }\n\n const tenantQuery = () => {\n const query = new URLSearchParams()\n query.set('tenant_id', `eq.${storeId}`)\n return query\n }\n\n const singleById = (id: string) => {\n const query = tenantQuery()\n query.set('id', `eq.${id}`)\n query.set('limit', '1')\n return query\n }\n\n return {\n async listProducts(options?: FayzShopListProductsOptions) {\n const query = tenantQuery()\n query.set('select', '*,images:plg_shop_product_images(*),category:plg_shop_categories(name)')\n if (options?.status) query.set('status', `eq.${options.status}`)\n if (options?.slug) query.set('slug', `eq.${options.slug}`)\n if (options?.search) query.set('name', `ilike.*${options.search}*`)\n query.set('order', `${options?.orderBy ?? 'sort_order'}.${options?.order ?? 'asc'}`)\n if (options?.limit) query.set('limit', String(options.limit))\n if (options?.offset) query.set('offset', String(options.offset))\n const products = (await request<ProductRow[]>('plg_shop_products', { query })).map((row) => rowToProduct(row, productMetadataOverlay))\n return options?.categoryId ? products.filter((product) => product.categoryId === options.categoryId) : products\n },\n async getProduct(id: string) {\n // Cart lines can carry non-uuid ids (mock catalog, or a cart persisted in\n // an earlier mock-mode session). PostgREST would 400 on `id=eq.p-05`\n // (invalid uuid), so treat any non-uuid id as \"not found\" instead.\n if (!asUuid(id)) return null\n const query = singleById(id)\n query.set('select', '*,images:plg_shop_product_images(*),category:plg_shop_categories(name)')\n const rows = await request<ProductRow[]>('plg_shop_products', { query })\n return rows[0] ? rowToProduct(rows[0], productMetadataOverlay) : null\n },\n async createProduct() {\n throw new FayzShopError('Product writes require the Fayz admin/broker API.', 501)\n },\n async updateProduct() {\n throw new FayzShopError('Product writes require the Fayz admin/broker API.', 501)\n },\n async deleteProduct() {\n throw new FayzShopError('Product writes require the Fayz admin/broker API.', 501)\n },\n async uploadProductImage() {\n throw new FayzShopError('Product image uploads require the Fayz admin/broker API.', 501)\n },\n async deleteProductImage() {\n throw new FayzShopError('Product image deletes require the Fayz admin/broker API.', 501)\n },\n /**\n * Option axes + variants from the 0028 tables (spine M5) — the read that\n * replaces the productMetadata overlay as the source of product options.\n * Anon reads are already scoped by the storefront RLS (active variants of\n * publicly readable products only).\n */\n async getProductVariants(productId: string) {\n if (!asUuid(productId)) return { options: [], variants: [] }\n const optionsQuery = new URLSearchParams()\n optionsQuery.set('product_id', `eq.${productId}`)\n optionsQuery.set('order', 'position.asc')\n const variantsQuery = new URLSearchParams()\n variantsQuery.set('product_id', `eq.${productId}`)\n variantsQuery.set('status', 'eq.active')\n variantsQuery.set('order', 'position.asc')\n const [optionRows, variantRows] = await Promise.all([\n request<Array<{ id: string; name: string; values?: unknown; position?: number | null }>>(\n 'plg_shop_product_options',\n { query: optionsQuery },\n ),\n request<Array<{\n id: string\n product_id: string\n options?: Record<string, string> | null\n sku?: string | null\n price?: number | string | null\n compare_at_price?: number | string | null\n inventory_count?: number | null\n position?: number | null\n status?: string | null\n image_id?: string | null\n }>>('plg_shop_product_variants', { query: variantsQuery }),\n ])\n return {\n options: (optionRows ?? []).map((row) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n })),\n variants: (variantRows ?? []).map((row) => ({\n id: row.id,\n productId: row.product_id,\n options: row.options && typeof row.options === 'object' ? row.options : {},\n sku: row.sku ?? null,\n price: row.price == null ? null : Number(row.price),\n compareAtPrice: row.compare_at_price == null ? null : Number(row.compare_at_price),\n inventoryCount: row.inventory_count ?? 0,\n position: row.position ?? 0,\n status: (row.status ?? 'active') as 'active' | 'archived',\n imageId: row.image_id ?? null,\n })),\n }\n },\n async listCategories() {\n const productQuery = tenantQuery()\n productQuery.set('select', 'metadata')\n productQuery.set('order', 'sort_order.asc')\n const products = await request<ProductRow[]>('plg_shop_products', { query: productQuery })\n const storeCategories = deriveStoreCategories(products, storeId)\n if (storeCategories.length > 0) return storeCategories\n\n const query = new URLSearchParams()\n query.set('select', '*')\n query.set('order', 'sort_order.asc')\n return (await request<CategoryRow[]>('plg_shop_categories', { query })).map(rowToCategory)\n },\n async createCategory() {\n throw new FayzShopError('Category writes require the Fayz admin/broker API.', 501)\n },\n async updateCategory() {\n throw new FayzShopError('Category writes require the Fayz admin/broker API.', 501)\n },\n async deleteCategory() {\n throw new FayzShopError('Category deletes require the Fayz admin/broker API.', 501)\n },\n async listOrders(options?: FayzShopListOrdersOptions) {\n const query = tenantQuery()\n query.set('select', '*,items:plg_shop_order_items(*)')\n if (options?.status) query.set('status', `eq.${options.status}`)\n if (options?.financialStatus) query.set('financial_status', `eq.${options.financialStatus}`)\n if (options?.fulfillmentStatus) query.set('fulfillment_status', `eq.${options.fulfillmentStatus}`)\n if (options?.customerId) query.set('customer_id', `eq.${options.customerId}`)\n if (options?.customerEmail) query.set('customer_email', `eq.${options.customerEmail}`)\n if (options?.search) query.set('or', `(customer_name.ilike.*${options.search}*,customer_email.ilike.*${options.search}*)`)\n query.set('order', 'created_at.desc')\n if (options?.limit) query.set('limit', String(options.limit))\n if (options?.offset) query.set('offset', String(options.offset))\n // Anon storefronts have no table grant (RLS restricts plg_shop_orders reads to\n // `authenticated` users linked via auth.uid) — direct read 401s. RLS can also\n // just filter every row out silently (200 OK + []) instead of 401ing, so an\n // empty result here doesn't mean \"no orders\" either — both cases must fall\n // back to the customer-uuid-capability RPC, same pattern as getOrder's\n // shop_get_order. This is what made \"Minhas compras\" empty after a guest\n // checkout — the order was there, the read just wasn't allowed (or silently\n // filtered), and only the throw case used to be handled.\n let rows: OrderRow[] = []\n try {\n rows = await request<OrderRow[]>('plg_shop_orders', { query })\n } catch (error) {\n if (!options?.customerId) throw error\n }\n if (rows.length || !options?.customerId) return rows.map(rowToOrder)\n // Only the customer-scoped query has an RPC counterpart: shop_list_orders\n // treats the customer uuid as the read capability, exactly like\n // shop_get_order treats the order uuid. Any other filter combination has\n // no anon-safe equivalent, so the original error (if any) stands.\n const rpcRows = await request<OrderRow[]>('rpc/shop_list_orders', {\n method: 'POST',\n body: JSON.stringify({ p_customer_id: options.customerId, p_limit: options.limit ?? 50 }),\n })\n return (rpcRows ?? []).map(rowToOrder)\n },\n async getOrder(id: string) {\n const query = singleById(id)\n query.set('select', '*,items:plg_shop_order_items(*)')\n // Anon storefronts have no table grant at all — the direct read throws\n // (401) rather than returning empty, so it must not short-circuit the\n // RPC fallback below.\n let rows: OrderRow[] = []\n try {\n rows = await request<OrderRow[]>('plg_shop_orders', { query })\n } catch {\n /* fall through to shop_get_order */\n }\n if (rows[0]) return rowToOrder(rows[0])\n // Anon storefronts can't SELECT plg_shop_orders (RLS); the order uuid acts\n // as the read capability through the whitelisted RPC.\n try {\n const row = await request<OrderRow | null>('rpc/shop_get_order', {\n method: 'POST',\n body: JSON.stringify({ p_order_id: id }),\n })\n return row ? rowToOrder(row) : null\n } catch {\n return null\n }\n },\n async confirmPayment(id: string, reference?: string) {\n // Mock/dev payment seam: anon has no UPDATE grant on plg_shop_orders,\n // so the pending->paid transition goes through the whitelisted RPC\n // (order uuid = capability, same contract as shop_get_order).\n const row = await request<OrderRow | null>('rpc/shop_confirm_payment', {\n method: 'POST',\n body: JSON.stringify({ p_order_id: id, p_reference: reference ?? null }),\n })\n return row ? rowToOrder(row) : null\n },\n async createOrder(input: {\n customerId?: string\n customerName?: string\n customerEmail?: string\n currency?: string\n notes?: string\n discountCode?: string\n discountTotal?: number\n shippingTotal?: number\n items: Array<{ productId?: string; name: string; sku?: string; quantity: number; unitPrice: number; imageUrl?: string }>\n }) {\n const subtotal = input.items.reduce((sum, item) => sum + item.quantity * item.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const [order] = await request<OrderRow[]>('plg_shop_orders', {\n method: 'POST',\n body: JSON.stringify({\n tenant_id: storeId,\n customer_id: input.customerId ?? null,\n customer_name: input.customerName ?? null,\n customer_email: input.customerEmail ?? null,\n currency: input.currency ?? 'BRL',\n notes: input.notes ?? null,\n subtotal,\n discount_total: discountTotal,\n shipping_total: shippingTotal,\n discount_code: input.discountCode ?? null,\n total,\n status: 'open',\n financial_status: 'pending',\n fulfillment_status: 'unfulfilled',\n }),\n })\n if (!order) throw new FayzShopError('Order insert did not return a row.', 500)\n if (input.items.length) {\n await request<OrderItemRow[]>('plg_shop_order_items', {\n method: 'POST',\n body: JSON.stringify(input.items.map((item) => ({\n order_id: order.id,\n product_id: asUuid(item.productId),\n name: item.name,\n sku: item.sku ?? null,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n total: item.quantity * item.unitPrice,\n image_url: item.imageUrl ?? null,\n }))),\n })\n }\n return this.getOrder(order.id)\n },\n async updateOrder(id: string, input: Parameters<typeof updateOrderPayload>[0]) {\n await request<OrderRow[]>('plg_shop_orders', {\n method: 'PATCH',\n query: singleById(id),\n body: JSON.stringify(updateOrderPayload(input)),\n })\n return this.getOrder(id)\n },\n async placeOrder(input: {\n tenantId?: string\n customerId?: string\n customer?: { name?: string; email?: string }\n currency?: string\n notes?: string\n discountCode?: string\n shippingTotal?: number\n /** Structured delivery address; frozen on the order and saved to the\n * customer's address book by the RPC. */\n shippingAddress?: {\n postalCode: string\n street: string\n number?: string\n complement?: string\n district?: string\n city: string\n state: string\n country?: string\n recipient?: string\n phone?: string\n label?: string\n }\n paymentMethod?: 'pix' | 'credit_card' | 'debit_card' | 'boleto' | 'cash' | 'other'\n metadata?: Record<string, unknown>\n items: Array<{ productId: string; variantId?: string; quantity: number; optionsLabel?: string }>\n }) {\n // Trusted placement: the shop_place_order SECURITY DEFINER RPC re-reads\n // prices, validates discount/stock and writes order+items atomically.\n // Direct INSERTs are blocked for anon by RLS on the shared FayzApi.\n const orderId = await request<string>('rpc/shop_place_order', {\n method: 'POST',\n body: JSON.stringify({\n p_tenant_id: input.tenantId ?? storeId,\n // variant_id per line (0029): the RPC prices + decrements the variant\n // when present. Pre-0029 servers ignore unknown jsonb keys, so lines\n // stay compatible; p_metadata is a NAMED argument and is only sent\n // when something contributed (unknown named args are rejected).\n p_items: input.items.map((line) => ({\n product_id: line.productId,\n variant_id: asUuid(line.variantId) ?? undefined,\n quantity: line.quantity,\n options_label: line.optionsLabel ?? null,\n })),\n p_customer_id: asUuid(input.customerId ?? undefined),\n p_customer_name: input.customer?.name ?? null,\n p_customer_email: input.customer?.email ?? null,\n p_currency: input.currency ?? 'BRL',\n p_discount_code: input.discountCode ?? null,\n p_shipping_total: input.shippingTotal ?? 0,\n // snake_case keys on purpose: the RPC freezes this jsonb onto the\n // order and public.addresses uses these exact column names.\n p_shipping_address: input.shippingAddress\n ? {\n postal_code: input.shippingAddress.postalCode,\n street: input.shippingAddress.street,\n number: input.shippingAddress.number ?? null,\n complement: input.shippingAddress.complement ?? null,\n district: input.shippingAddress.district ?? null,\n city: input.shippingAddress.city,\n state: input.shippingAddress.state,\n country: input.shippingAddress.country ?? 'BR',\n recipient: input.shippingAddress.recipient ?? null,\n phone: input.shippingAddress.phone ?? null,\n label: input.shippingAddress.label ?? null,\n }\n : null,\n p_payment_method: input.paymentMethod ?? null,\n p_notes: input.notes ?? null,\n ...(input.metadata !== undefined ? { p_metadata: input.metadata } : {}),\n }),\n })\n const order = await this.getOrder(orderId)\n if (!order) throw new FayzShopError('Order was placed but could not be read back.', 500)\n return order\n },\n async listCustomers(options?: FayzShopListCustomersOptions) {\n const query = tenantQuery()\n query.set('select', '*')\n query.set('order', 'first_name.asc')\n if (options?.search) query.set('or', `(first_name.ilike.*${options.search}*,last_name.ilike.*${options.search}*,email.ilike.*${options.search}*)`)\n if (options?.limit) query.set('limit', String(options.limit))\n if (options?.offset) query.set('offset', String(options.offset))\n return (await request<CustomerRow[]>('plg_shop_customers', { query })).map(rowToCustomer)\n },\n async getCustomer(id: string) {\n const rows = await request<CustomerRow[]>('plg_shop_customers', { query: singleById(id) })\n return rows[0] ? rowToCustomer(rows[0]) : null\n },\n async resolveCustomer(input: { email: string; name?: string }) {\n const row = await request<CustomerRow | CustomerRow[]>('rpc/shop_resolve_customer', {\n method: 'POST',\n body: JSON.stringify({\n p_tenant_id: storeId,\n p_email: input.email,\n p_name: input.name ?? null,\n }),\n })\n const customer = Array.isArray(row) ? row[0] : row\n if (!customer) throw new FayzShopError('shop_resolve_customer returned no row.', 500)\n return rowToCustomer(customer)\n },\n async quoteShipping(postalCode: string, subtotal: number) {\n const digits = (postalCode || '').replace(/\\D/g, '')\n if (digits.length !== 8) return []\n const rows = await request<ShippingQuoteRow[]>('rpc/shop_quote_shipping', {\n method: 'POST',\n body: JSON.stringify({\n p_tenant_id: storeId,\n p_postal_code: digits,\n p_subtotal: subtotal,\n }),\n })\n return (rows ?? []).map((row) => ({\n zoneId: row.zone_id,\n name: row.name,\n carrier: row.carrier ?? undefined,\n rate: Number(row.rate ?? 0),\n baseRate: Number(row.base_rate ?? row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? undefined,\n etaMaxDays: row.eta_max_days ?? undefined,\n free: Boolean(row.free),\n }))\n },\n async listCustomerAddresses(customerId: string) {\n if (!asUuid(customerId)) return []\n const query = new URLSearchParams()\n query.set('select', 'id,label,recipient,phone,postal_code,street,number,complement,district,city,state,country,is_default')\n query.set('owner_type', 'eq.shop_customer')\n query.set('owner_id', `eq.${customerId}`)\n query.set('order', 'is_default.desc,created_at.desc')\n // RLS (addresses_self_read) is the real filter — it matches only rows\n // whose customer is linked to auth.uid(). An anonymous or mismatched\n // caller gets [] rather than an error, so guest checkout just sees an\n // empty address book instead of a failure it cannot act on.\n const rows = await request<AddressRow[]>('addresses', { query }).catch(() => [] as AddressRow[])\n return rows.map((row) => ({\n id: row.id,\n label: row.label ?? undefined,\n recipient: row.recipient ?? undefined,\n phone: row.phone ?? undefined,\n postalCode: row.postal_code ?? '',\n street: row.street ?? '',\n number: row.number ?? undefined,\n complement: row.complement ?? undefined,\n district: row.district ?? undefined,\n city: row.city ?? '',\n state: row.state ?? '',\n country: row.country ?? undefined,\n isDefault: row.is_default ?? false,\n }))\n },\n async createCustomer(input: { firstName: string; lastName?: string; email?: string; phone?: string; notes?: string }) {\n const [customer] = await request<CustomerRow[]>('plg_shop_customers', {\n method: 'POST',\n body: JSON.stringify({\n tenant_id: storeId,\n first_name: input.firstName,\n last_name: input.lastName ?? '',\n email: input.email ?? null,\n phone: input.phone ?? null,\n notes: input.notes ?? null,\n }),\n })\n if (!customer) throw new FayzShopError('Customer insert did not return a row.', 500)\n return rowToCustomer(customer)\n },\n async updateCustomer(id: string, input: { firstName?: string; lastName?: string; email?: string | null; phone?: string | null; notes?: string | null }) {\n const updates: Record<string, unknown> = {}\n if (input.firstName !== undefined) updates.first_name = input.firstName\n if (input.lastName !== undefined) updates.last_name = input.lastName\n if (input.email !== undefined) updates.email = input.email\n if (input.phone !== undefined) updates.phone = input.phone\n if (input.notes !== undefined) updates.notes = input.notes\n const [customer] = await request<CustomerRow[]>('plg_shop_customers', {\n method: 'PATCH',\n query: singleById(id),\n body: JSON.stringify(updates),\n })\n if (!customer) throw new FayzShopError('Customer update did not return a row.', 500)\n return rowToCustomer(customer)\n },\n async deleteCustomer(id: string) {\n await request<unknown>('plg_shop_customers', { method: 'DELETE', query: singleById(id) })\n },\n async listDiscounts(options?: FayzShopListDiscountsOptions) {\n const query = tenantQuery()\n query.set('select', '*')\n query.set('order', 'created_at.desc')\n if (options?.status) query.set('status', `eq.${options.status}`)\n if (options?.type) query.set('type', `eq.${options.type}`)\n if (options?.search) query.set('title', `ilike.*${options.search}*`)\n if (options?.limit) query.set('limit', String(options.limit))\n if (options?.offset) query.set('offset', String(options.offset))\n return (await request<DiscountRow[]>('plg_shop_discounts', { query })).map(rowToDiscount)\n },\n async getDiscount(id: string) {\n const rows = await request<DiscountRow[]>('plg_shop_discounts', { query: singleById(id) })\n return rows[0] ? rowToDiscount(rows[0]) : null\n },\n async createDiscount() {\n throw new FayzShopError('Discount writes require the Fayz admin/broker API.', 501)\n },\n async updateDiscount() {\n throw new FayzShopError('Discount writes require the Fayz admin/broker API.', 501)\n },\n async deleteDiscount() {\n throw new FayzShopError('Discount deletes require the Fayz admin/broker API.', 501)\n },\n }\n}\n\nfunction appendQuery(url: string, values: Record<string, string | number | undefined>): string {\n const query = new URLSearchParams()\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) query.set(key, String(value))\n }\n const serialized = query.toString()\n return serialized ? `${url}?${serialized}` : url\n}\n\nfunction normalizeBrokerProduct(product: Record<string, unknown>, overlay?: Map<string, Record<string, unknown>>) {\n const category = product.category && typeof product.category === 'object'\n ? product.category as Record<string, unknown>\n : null\n const row = {\n id: product.id as string,\n tenant_id: product.tenantId as string,\n name: product.name as string,\n slug: product.slug as string | undefined,\n description: product.description as string | null | undefined,\n price: product.price as number | null | undefined,\n compare_at_price: product.compareAtPrice as number | null | undefined,\n currency: product.currency as string | null | undefined,\n status: product.status as FayzShopProductStatus | null | undefined,\n inventory_count: product.inventoryCount as number | null | undefined,\n sku: product.sku as string | null | undefined,\n sort_order: product.sortOrder as number | null | undefined,\n metadata: product.metadata as Record<string, unknown> | null | undefined,\n images: Array.isArray(product.images)\n ? product.images.map((image): ProductImageRow => {\n const row = image as Record<string, unknown>\n return {\n id: String(row.id ?? ''),\n product_id: String(row.productId ?? product.id ?? ''),\n url: String(row.url ?? ''),\n alt_text: (row.altText as string | null | undefined) ?? null,\n sort_order: (row.sortOrder as number | null | undefined) ?? 0,\n is_primary: (row.isPrimary as boolean | null | undefined) ?? false,\n created_at: (row.createdAt as string | null | undefined) ?? null,\n }\n })\n : [],\n category_id: (product.categoryId ?? category?.id) as string | null | undefined,\n category: category ? { name: category.name as string | null | undefined } : null,\n is_physical: product.isPhysical as boolean | null | undefined,\n weight: product.weight as number | null | undefined,\n weight_unit: product.weightUnit as string | null | undefined,\n created_at: product.createdAt as string | null | undefined,\n updated_at: product.updatedAt as string | null | undefined,\n } satisfies ProductRow\n return rowToProduct(row, overlay)\n}\n\nfunction normalizeBrokerCategory(category: Record<string, unknown>) {\n return {\n id: category.id as string,\n tenantId: (category.tenantId as string | undefined) ?? 'global',\n name: category.name as string,\n slug: (category.slug as string | undefined) ?? slugify(category.name as string),\n description: (category.description as string | null | undefined) ?? null,\n parentId: (category.parentId as string | null | undefined) ?? null,\n sortOrder: (category.sortOrder as number | null | undefined) ?? 0,\n imageUrl: (category.imageUrl as string | null | undefined) ?? null,\n createdAt: (category.createdAt as string | null | undefined) ?? nowIso(),\n }\n}\n\nfunction createBrokerShopProvider(options: FayzShopProviderOptions) {\n if (!options.apiBaseUrl || !options.projectId) {\n throw new FayzShopError('Fayz Shop broker mode requires apiBaseUrl and projectId.', 400)\n }\n\n const fetcher = options.fetcher ?? fetch\n const apiBaseUrl = normalizeBaseUrl(options.apiBaseUrl)\n const projectId = encodeURIComponent(options.projectId)\n const productMetadataOverlay = buildProductMetadataOverlay(options.productMetadata)\n\n async function request<T>(path: string, init: RequestInit = {}): Promise<T> {\n const response = await fetcher(`${apiBaseUrl}/public/projects/${projectId}/shop${path}`, init)\n const text = await response.text()\n let body: unknown\n try {\n body = text ? JSON.parse(text) : undefined\n } catch {\n body = text\n }\n if (!response.ok) {\n const message = typeof body === 'object' && body\n ? String((body as { message?: unknown; error?: unknown }).message ?? (body as { error?: unknown }).error ?? `Fayz Shop broker request failed with status ${response.status}`)\n : `Fayz Shop broker request failed with status ${response.status}`\n throw new FayzShopError(message, response.status, body)\n }\n return body as T\n }\n\n return {\n async listProducts(options?: FayzShopListProductsOptions) {\n if (options?.slug) {\n const product = await this.getProduct(options.slug)\n return product ? [product] : []\n }\n\n const response = await request<{ products?: Array<Record<string, unknown>> }>(appendQuery('/products', {\n status: options?.status,\n categoryId: options?.categoryId,\n search: options?.search,\n limit: options?.limit,\n offset: options?.offset,\n orderBy: options?.orderBy,\n order: options?.order,\n }))\n return (response.products ?? []).map((product) => normalizeBrokerProduct(product, productMetadataOverlay))\n },\n async getProduct(id: string) {\n const response = await request<{ product?: Record<string, unknown> | null }>(`/products/${encodeURIComponent(id)}`)\n return response.product ? normalizeBrokerProduct(response.product, productMetadataOverlay) : null\n },\n async createProduct() {\n throw new FayzShopError('Product writes require the Fayz admin/broker API.', 501)\n },\n async updateProduct() {\n throw new FayzShopError('Product writes require the Fayz admin/broker API.', 501)\n },\n async deleteProduct() {\n throw new FayzShopError('Product writes require the Fayz admin/broker API.', 501)\n },\n async uploadProductImage() {\n throw new FayzShopError('Product image uploads require the Fayz admin/broker API.', 501)\n },\n async deleteProductImage() {\n throw new FayzShopError('Product image deletes require the Fayz admin/broker API.', 501)\n },\n async listCategories() {\n const response = await request<{ categories?: Array<Record<string, unknown>> }>('/categories')\n return (response.categories ?? []).map(normalizeBrokerCategory)\n },\n async createCategory() {\n throw new FayzShopError('Category writes require the Fayz admin/broker API.', 501)\n },\n async updateCategory() {\n throw new FayzShopError('Category writes require the Fayz admin/broker API.', 501)\n },\n async deleteCategory() {\n throw new FayzShopError('Category deletes require the Fayz admin/broker API.', 501)\n },\n async listOrders() {\n throw new FayzShopError('Order reads require the Fayz admin/broker API.', 501)\n },\n async getOrder() {\n throw new FayzShopError('Order reads require the Fayz admin/broker API.', 501)\n },\n async createOrder() {\n throw new FayzShopError('Order writes require the Fayz admin/broker API.', 501)\n },\n async updateOrder() {\n throw new FayzShopError('Order writes require the Fayz admin/broker API.', 501)\n },\n async placeOrder() {\n throw new FayzShopError('Order placement requires the Fayz admin/broker API.', 501)\n },\n async listCustomers() {\n throw new FayzShopError('Customer reads require the Fayz admin/broker API.', 501)\n },\n async getCustomer() {\n throw new FayzShopError('Customer reads require the Fayz admin/broker API.', 501)\n },\n async createCustomer() {\n throw new FayzShopError('Customer writes require the Fayz admin/broker API.', 501)\n },\n async updateCustomer() {\n throw new FayzShopError('Customer writes require the Fayz admin/broker API.', 501)\n },\n async deleteCustomer() {\n throw new FayzShopError('Customer writes require the Fayz admin/broker API.', 501)\n },\n async listDiscounts() {\n throw new FayzShopError('Discount reads require the Fayz admin/broker API.', 501)\n },\n async getDiscount() {\n throw new FayzShopError('Discount reads require the Fayz admin/broker API.', 501)\n },\n async createDiscount() {\n throw new FayzShopError('Discount writes require the Fayz admin/broker API.', 501)\n },\n async updateDiscount() {\n throw new FayzShopError('Discount writes require the Fayz admin/broker API.', 501)\n },\n async deleteDiscount() {\n throw new FayzShopError('Discount deletes require the Fayz admin/broker API.', 501)\n },\n }\n}\n"]}
@@ -1,135 +0,0 @@
1
- // src/release-channels.json
2
- var release_channels_default = {
3
- channels: {
4
- stable: {
5
- "@fayz-ai/sdk": "^0.10.1",
6
- "@fayz-ai/admin": "^0.10.0",
7
- "@fayz-ai/core": "^0.10.0",
8
- "@fayz-ai/auth": "^0.10.0",
9
- "@fayz-ai/ui": "^0.10.1",
10
- "@fayz-ai/shop": "^0.10.0",
11
- "@fayz-ai/storefront": "^0.10.0",
12
- "@fayz-ai/portal": "^0.10.0",
13
- "@fayz-ai/courses": "^0.10.0",
14
- "@fayz-ai/db": "^0.10.0",
15
- "@fayz-ai/plugin-agenda": "^0.9.1",
16
- "@fayz-ai/plugin-auth": "^0.9.1",
17
- "@fayz-ai/plugin-automations": "^0.9.1",
18
- "@fayz-ai/plugin-blog": "^0.10.0",
19
- "@fayz-ai/plugin-conversations": "^0.9.1",
20
- "@fayz-ai/plugin-courses": "^0.9.1",
21
- "@fayz-ai/plugin-crm": "^0.9.1",
22
- "@fayz-ai/plugin-dashboard": "^0.9.1",
23
- "@fayz-ai/plugin-financial": "^0.9.1",
24
- "@fayz-ai/plugin-forms": "^0.9.1",
25
- "@fayz-ai/plugin-inventory": "^0.9.1",
26
- "@fayz-ai/plugin-marketing": "^0.9.1",
27
- "@fayz-ai/plugin-menu": "^0.9.1",
28
- "@fayz-ai/plugin-orders": "^0.9.1",
29
- "@fayz-ai/plugin-payments": "^0.9.1",
30
- "@fayz-ai/plugin-reports": "^0.9.1",
31
- "@fayz-ai/plugin-reputation": "^0.9.1",
32
- "@fayz-ai/plugin-shop": "^0.9.1",
33
- "@fayz-ai/plugin-sites": "^0.9.1",
34
- "@fayz-ai/plugin-tables": "^0.9.1",
35
- "@fayz-ai/plugin-tasks": "^0.9.1"
36
- },
37
- latest: {
38
- "@fayz-ai/sdk": "^0.10.1",
39
- "@fayz-ai/admin": "^0.10.0",
40
- "@fayz-ai/core": "^0.10.0",
41
- "@fayz-ai/auth": "^0.10.0",
42
- "@fayz-ai/ui": "^0.10.1",
43
- "@fayz-ai/shop": "^0.10.0",
44
- "@fayz-ai/storefront": "^0.10.0",
45
- "@fayz-ai/portal": "^0.10.0",
46
- "@fayz-ai/courses": "^0.10.0",
47
- "@fayz-ai/db": "^0.10.0",
48
- "@fayz-ai/plugin-agenda": "^0.9.1",
49
- "@fayz-ai/plugin-auth": "^0.9.1",
50
- "@fayz-ai/plugin-automations": "^0.9.1",
51
- "@fayz-ai/plugin-blog": "^0.10.0",
52
- "@fayz-ai/plugin-conversations": "^0.9.1",
53
- "@fayz-ai/plugin-courses": "^0.9.1",
54
- "@fayz-ai/plugin-crm": "^0.9.1",
55
- "@fayz-ai/plugin-dashboard": "^0.9.1",
56
- "@fayz-ai/plugin-financial": "^0.9.1",
57
- "@fayz-ai/plugin-forms": "^0.9.1",
58
- "@fayz-ai/plugin-inventory": "^0.9.1",
59
- "@fayz-ai/plugin-marketing": "^0.9.1",
60
- "@fayz-ai/plugin-menu": "^0.9.1",
61
- "@fayz-ai/plugin-orders": "^0.9.1",
62
- "@fayz-ai/plugin-payments": "^0.9.1",
63
- "@fayz-ai/plugin-reports": "^0.9.1",
64
- "@fayz-ai/plugin-reputation": "^0.9.1",
65
- "@fayz-ai/plugin-shop": "^0.9.1",
66
- "@fayz-ai/plugin-sites": "^0.9.1",
67
- "@fayz-ai/plugin-tables": "^0.9.1",
68
- "@fayz-ai/plugin-tasks": "^0.9.1"
69
- },
70
- preview: {
71
- "@fayz-ai/sdk": "^0.10.1",
72
- "@fayz-ai/admin": "^0.10.0",
73
- "@fayz-ai/core": "^0.10.0",
74
- "@fayz-ai/auth": "^0.10.0",
75
- "@fayz-ai/ui": "^0.10.1",
76
- "@fayz-ai/shop": "^0.10.0",
77
- "@fayz-ai/storefront": "^0.10.0",
78
- "@fayz-ai/portal": "^0.10.0",
79
- "@fayz-ai/courses": "^0.10.0",
80
- "@fayz-ai/db": "^0.10.0",
81
- "@fayz-ai/plugin-agenda": "^0.9.1",
82
- "@fayz-ai/plugin-auth": "^0.9.1",
83
- "@fayz-ai/plugin-automations": "^0.9.1",
84
- "@fayz-ai/plugin-blog": "^0.10.0",
85
- "@fayz-ai/plugin-conversations": "^0.9.1",
86
- "@fayz-ai/plugin-courses": "^0.9.1",
87
- "@fayz-ai/plugin-crm": "^0.9.1",
88
- "@fayz-ai/plugin-dashboard": "^0.9.1",
89
- "@fayz-ai/plugin-financial": "^0.9.1",
90
- "@fayz-ai/plugin-forms": "^0.9.1",
91
- "@fayz-ai/plugin-inventory": "^0.9.1",
92
- "@fayz-ai/plugin-marketing": "^0.9.1",
93
- "@fayz-ai/plugin-menu": "^0.9.1",
94
- "@fayz-ai/plugin-orders": "^0.9.1",
95
- "@fayz-ai/plugin-payments": "^0.9.1",
96
- "@fayz-ai/plugin-reports": "^0.9.1",
97
- "@fayz-ai/plugin-reputation": "^0.9.1",
98
- "@fayz-ai/plugin-shop": "^0.9.1",
99
- "@fayz-ai/plugin-sites": "^0.9.1",
100
- "@fayz-ai/plugin-tables": "^0.9.1",
101
- "@fayz-ai/plugin-tasks": "^0.9.1"
102
- }
103
- }
104
- };
105
-
106
- // src/release-channels.ts
107
- var releaseChannelPackages = release_channels_default.channels;
108
- function buildVersionSet(channel) {
109
- return {
110
- channel,
111
- packages: { ...releaseChannelPackages[channel] }
112
- };
113
- }
114
- var fayzPackageVersionSets = {
115
- stable: buildVersionSet("stable"),
116
- latest: buildVersionSet("latest"),
117
- preview: buildVersionSet("preview")
118
- };
119
- function resolveFayzPackageVersions(channel = "stable") {
120
- return fayzPackageVersionSets[channel];
121
- }
122
- function resolveFayzPackageDependencies(channel = "stable") {
123
- return { ...resolveFayzPackageVersions(channel).packages };
124
- }
125
- function resolveFayzPackageVersion(packageName, channel = "stable") {
126
- const version = resolveFayzPackageVersions(channel).packages[packageName];
127
- if (!version) {
128
- throw new Error(`No Fayz package version configured for ${packageName} in ${channel} channel`);
129
- }
130
- return version;
131
- }
132
-
133
- export { fayzPackageVersionSets, resolveFayzPackageDependencies, resolveFayzPackageVersion, resolveFayzPackageVersions };
134
- //# sourceMappingURL=chunk-KVMRRT3O.js.map
135
- //# sourceMappingURL=chunk-KVMRRT3O.js.map