@embeddables/cli 0.7.13 → 0.7.15

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 (236) hide show
  1. package/.prompts/custom/build-funnel.md +1 -1
  2. package/.prompts/embeddables-cli.md +9 -2
  3. package/package.json +1 -1
  4. package/dist/auth/index.d.ts +0 -43
  5. package/dist/auth/index.d.ts.map +0 -1
  6. package/dist/auth/index.js +0 -102
  7. package/dist/cli.d.ts +0 -2
  8. package/dist/cli.d.ts.map +0 -1
  9. package/dist/cli.js +0 -174
  10. package/dist/commands/branch.d.ts +0 -4
  11. package/dist/commands/branch.d.ts.map +0 -1
  12. package/dist/commands/branch.js +0 -68
  13. package/dist/commands/build-workbench.d.ts +0 -5
  14. package/dist/commands/build-workbench.d.ts.map +0 -1
  15. package/dist/commands/build-workbench.js +0 -128
  16. package/dist/commands/build.d.ts +0 -8
  17. package/dist/commands/build.d.ts.map +0 -1
  18. package/dist/commands/build.js +0 -55
  19. package/dist/commands/dev.d.ts +0 -12
  20. package/dist/commands/dev.d.ts.map +0 -1
  21. package/dist/commands/dev.js +0 -221
  22. package/dist/commands/experiments-connect.d.ts +0 -6
  23. package/dist/commands/experiments-connect.d.ts.map +0 -1
  24. package/dist/commands/experiments-connect.js +0 -140
  25. package/dist/commands/init.d.ts +0 -5
  26. package/dist/commands/init.d.ts.map +0 -1
  27. package/dist/commands/init.js +0 -327
  28. package/dist/commands/login.d.ts +0 -2
  29. package/dist/commands/login.d.ts.map +0 -1
  30. package/dist/commands/login.js +0 -122
  31. package/dist/commands/logout.d.ts +0 -2
  32. package/dist/commands/logout.d.ts.map +0 -1
  33. package/dist/commands/logout.js +0 -22
  34. package/dist/commands/pull.d.ts +0 -14
  35. package/dist/commands/pull.d.ts.map +0 -1
  36. package/dist/commands/pull.js +0 -383
  37. package/dist/commands/save.d.ts +0 -30
  38. package/dist/commands/save.d.ts.map +0 -1
  39. package/dist/commands/save.js +0 -591
  40. package/dist/commands/upgrade.d.ts +0 -2
  41. package/dist/commands/upgrade.d.ts.map +0 -1
  42. package/dist/commands/upgrade.js +0 -51
  43. package/dist/compiler/errors.d.ts +0 -20
  44. package/dist/compiler/errors.d.ts.map +0 -1
  45. package/dist/compiler/errors.js +0 -35
  46. package/dist/compiler/evalStatic.d.ts +0 -3
  47. package/dist/compiler/evalStatic.d.ts.map +0 -1
  48. package/dist/compiler/evalStatic.js +0 -57
  49. package/dist/compiler/flatten.js +0 -1
  50. package/dist/compiler/helpers/duplicateIds.d.ts +0 -9
  51. package/dist/compiler/helpers/duplicateIds.d.ts.map +0 -1
  52. package/dist/compiler/helpers/duplicateIds.js +0 -71
  53. package/dist/compiler/helpers/numericLeadingKeys.d.ts +0 -8
  54. package/dist/compiler/helpers/numericLeadingKeys.d.ts.map +0 -1
  55. package/dist/compiler/helpers/numericLeadingKeys.js +0 -17
  56. package/dist/compiler/index.d.ts +0 -18
  57. package/dist/compiler/index.d.ts.map +0 -1
  58. package/dist/compiler/index.js +0 -1245
  59. package/dist/compiler/parsePage.d.ts +0 -15
  60. package/dist/compiler/parsePage.d.ts.map +0 -1
  61. package/dist/compiler/parsePage.js +0 -631
  62. package/dist/compiler/registry.d.ts +0 -4
  63. package/dist/compiler/registry.d.ts.map +0 -1
  64. package/dist/compiler/registry.js +0 -44
  65. package/dist/compiler/reverse.d.ts +0 -23
  66. package/dist/compiler/reverse.d.ts.map +0 -1
  67. package/dist/compiler/reverse.js +0 -1875
  68. package/dist/compiler/types.d.ts +0 -21
  69. package/dist/compiler/types.d.ts.map +0 -1
  70. package/dist/compiler/types.js +0 -1
  71. package/dist/components/index.d.ts +0 -21
  72. package/dist/components/index.d.ts.map +0 -1
  73. package/dist/components/index.js +0 -21
  74. package/dist/components/primitives/BaseComponent.d.ts +0 -32
  75. package/dist/components/primitives/BaseComponent.d.ts.map +0 -1
  76. package/dist/components/primitives/BaseComponent.js +0 -26
  77. package/dist/components/primitives/BookMeeting.d.ts +0 -18
  78. package/dist/components/primitives/BookMeeting.d.ts.map +0 -1
  79. package/dist/components/primitives/BookMeeting.js +0 -5
  80. package/dist/components/primitives/Chart.d.ts +0 -41
  81. package/dist/components/primitives/Chart.d.ts.map +0 -1
  82. package/dist/components/primitives/Chart.js +0 -5
  83. package/dist/components/primitives/Container.d.ts +0 -8
  84. package/dist/components/primitives/Container.d.ts.map +0 -1
  85. package/dist/components/primitives/Container.js +0 -5
  86. package/dist/components/primitives/CustomButton.d.ts +0 -37
  87. package/dist/components/primitives/CustomButton.d.ts.map +0 -1
  88. package/dist/components/primitives/CustomButton.js +0 -10
  89. package/dist/components/primitives/CustomHTML.d.ts +0 -8
  90. package/dist/components/primitives/CustomHTML.d.ts.map +0 -1
  91. package/dist/components/primitives/CustomHTML.js +0 -5
  92. package/dist/components/primitives/FileUpload.d.ts +0 -18
  93. package/dist/components/primitives/FileUpload.d.ts.map +0 -1
  94. package/dist/components/primitives/FileUpload.js +0 -16
  95. package/dist/components/primitives/InputBox.d.ts +0 -34
  96. package/dist/components/primitives/InputBox.d.ts.map +0 -1
  97. package/dist/components/primitives/InputBox.js +0 -25
  98. package/dist/components/primitives/Lottie.d.ts +0 -11
  99. package/dist/components/primitives/Lottie.d.ts.map +0 -1
  100. package/dist/components/primitives/Lottie.js +0 -5
  101. package/dist/components/primitives/MediaEmbed.d.ts +0 -13
  102. package/dist/components/primitives/MediaEmbed.d.ts.map +0 -1
  103. package/dist/components/primitives/MediaEmbed.js +0 -6
  104. package/dist/components/primitives/MediaImage.d.ts +0 -8
  105. package/dist/components/primitives/MediaImage.d.ts.map +0 -1
  106. package/dist/components/primitives/MediaImage.js +0 -5
  107. package/dist/components/primitives/OptionSelector.d.ts +0 -35
  108. package/dist/components/primitives/OptionSelector.d.ts.map +0 -1
  109. package/dist/components/primitives/OptionSelector.js +0 -8
  110. package/dist/components/primitives/PaypalCheckout.d.ts +0 -25
  111. package/dist/components/primitives/PaypalCheckout.d.ts.map +0 -1
  112. package/dist/components/primitives/PaypalCheckout.js +0 -5
  113. package/dist/components/primitives/PlainText.d.ts +0 -6
  114. package/dist/components/primitives/PlainText.d.ts.map +0 -1
  115. package/dist/components/primitives/PlainText.js +0 -5
  116. package/dist/components/primitives/ProgressBar.d.ts +0 -15
  117. package/dist/components/primitives/ProgressBar.d.ts.map +0 -1
  118. package/dist/components/primitives/ProgressBar.js +0 -5
  119. package/dist/components/primitives/RichText.d.ts +0 -6
  120. package/dist/components/primitives/RichText.d.ts.map +0 -1
  121. package/dist/components/primitives/RichText.js +0 -5
  122. package/dist/components/primitives/RichTextMarkdown.d.ts +0 -6
  123. package/dist/components/primitives/RichTextMarkdown.d.ts.map +0 -1
  124. package/dist/components/primitives/RichTextMarkdown.js +0 -5
  125. package/dist/components/primitives/Rive.d.ts +0 -16
  126. package/dist/components/primitives/Rive.d.ts.map +0 -1
  127. package/dist/components/primitives/Rive.js +0 -8
  128. package/dist/components/primitives/StripeCheckout.d.ts +0 -52
  129. package/dist/components/primitives/StripeCheckout.d.ts.map +0 -1
  130. package/dist/components/primitives/StripeCheckout.js +0 -5
  131. package/dist/components/primitives/StripeCheckout2.d.ts +0 -30
  132. package/dist/components/primitives/StripeCheckout2.d.ts.map +0 -1
  133. package/dist/components/primitives/StripeCheckout2.js +0 -7
  134. package/dist/config/index.d.ts +0 -23
  135. package/dist/config/index.d.ts.map +0 -1
  136. package/dist/config/index.js +0 -42
  137. package/dist/constants.d.ts +0 -9
  138. package/dist/constants.d.ts.map +0 -1
  139. package/dist/constants.js +0 -9
  140. package/dist/helpers/TEMP helpers file.d.ts +0 -1
  141. package/dist/helpers/TEMP helpers file.d.ts.map +0 -1
  142. package/dist/helpers/TEMP helpers file.js +0 -1
  143. package/dist/helpers/dates.d.ts +0 -5
  144. package/dist/helpers/dates.d.ts.map +0 -1
  145. package/dist/helpers/dates.js +0 -7
  146. package/dist/helpers/json.d.ts +0 -47
  147. package/dist/helpers/json.d.ts.map +0 -1
  148. package/dist/helpers/json.js +0 -622
  149. package/dist/helpers/utils.d.ts +0 -13
  150. package/dist/helpers/utils.d.ts.map +0 -1
  151. package/dist/helpers/utils.js +0 -28
  152. package/dist/logger.d.ts +0 -11
  153. package/dist/logger.d.ts.map +0 -1
  154. package/dist/logger.js +0 -21
  155. package/dist/prompts/branches.d.ts +0 -20
  156. package/dist/prompts/branches.d.ts.map +0 -1
  157. package/dist/prompts/branches.js +0 -90
  158. package/dist/prompts/embeddables.d.ts +0 -43
  159. package/dist/prompts/embeddables.d.ts.map +0 -1
  160. package/dist/prompts/embeddables.js +0 -198
  161. package/dist/prompts/experiments.d.ts +0 -28
  162. package/dist/prompts/experiments.d.ts.map +0 -1
  163. package/dist/prompts/experiments.js +0 -87
  164. package/dist/prompts/index.d.ts +0 -11
  165. package/dist/prompts/index.d.ts.map +0 -1
  166. package/dist/prompts/index.js +0 -6
  167. package/dist/prompts/projects.d.ts +0 -22
  168. package/dist/prompts/projects.d.ts.map +0 -1
  169. package/dist/prompts/projects.js +0 -86
  170. package/dist/prompts/versions.d.ts +0 -18
  171. package/dist/prompts/versions.d.ts.map +0 -1
  172. package/dist/prompts/versions.js +0 -99
  173. package/dist/proxy/injectApiInterceptor.d.ts +0 -6
  174. package/dist/proxy/injectApiInterceptor.d.ts.map +0 -1
  175. package/dist/proxy/injectApiInterceptor.js +0 -66
  176. package/dist/proxy/injectReload.d.ts +0 -2
  177. package/dist/proxy/injectReload.d.ts.map +0 -1
  178. package/dist/proxy/injectReload.js +0 -14
  179. package/dist/proxy/injectWorkbench.d.ts +0 -5
  180. package/dist/proxy/injectWorkbench.d.ts.map +0 -1
  181. package/dist/proxy/injectWorkbench.js +0 -22
  182. package/dist/proxy/server.d.ts +0 -11
  183. package/dist/proxy/server.d.ts.map +0 -1
  184. package/dist/proxy/server.js +0 -316
  185. package/dist/proxy/sse.d.ts +0 -5
  186. package/dist/proxy/sse.d.ts.map +0 -1
  187. package/dist/proxy/sse.js +0 -17
  188. package/dist/sentry-context.d.ts +0 -48
  189. package/dist/sentry-context.d.ts.map +0 -1
  190. package/dist/sentry-context.js +0 -156
  191. package/dist/stdout.d.ts +0 -17
  192. package/dist/stdout.d.ts.map +0 -1
  193. package/dist/stdout.js +0 -23
  194. package/dist/types-builder.d.ts +0 -800
  195. package/dist/types-builder.d.ts.map +0 -1
  196. package/dist/types-builder.js +0 -20
  197. package/dist/workbench/ActionsPanel.d.ts +0 -6
  198. package/dist/workbench/ActionsPanel.d.ts.map +0 -1
  199. package/dist/workbench/ActionsPanel.js +0 -47
  200. package/dist/workbench/AutofillPanel.d.ts +0 -6
  201. package/dist/workbench/AutofillPanel.d.ts.map +0 -1
  202. package/dist/workbench/AutofillPanel.js +0 -543
  203. package/dist/workbench/ComputedFieldsPanel.d.ts +0 -6
  204. package/dist/workbench/ComputedFieldsPanel.d.ts.map +0 -1
  205. package/dist/workbench/ComputedFieldsPanel.js +0 -31
  206. package/dist/workbench/ExperimentsPanel.d.ts +0 -6
  207. package/dist/workbench/ExperimentsPanel.d.ts.map +0 -1
  208. package/dist/workbench/ExperimentsPanel.js +0 -182
  209. package/dist/workbench/FieldEditorPanel.d.ts +0 -9
  210. package/dist/workbench/FieldEditorPanel.d.ts.map +0 -1
  211. package/dist/workbench/FieldEditorPanel.js +0 -650
  212. package/dist/workbench/InspectorPanel.d.ts +0 -6
  213. package/dist/workbench/InspectorPanel.d.ts.map +0 -1
  214. package/dist/workbench/InspectorPanel.js +0 -341
  215. package/dist/workbench/PageNavigator.d.ts +0 -6
  216. package/dist/workbench/PageNavigator.d.ts.map +0 -1
  217. package/dist/workbench/PageNavigator.js +0 -123
  218. package/dist/workbench/SchemaPanel.d.ts +0 -6
  219. package/dist/workbench/SchemaPanel.d.ts.map +0 -1
  220. package/dist/workbench/SchemaPanel.js +0 -222
  221. package/dist/workbench/UserDataPanel.d.ts +0 -6
  222. package/dist/workbench/UserDataPanel.d.ts.map +0 -1
  223. package/dist/workbench/UserDataPanel.js +0 -350
  224. package/dist/workbench/WorkbenchApp.d.ts +0 -7
  225. package/dist/workbench/WorkbenchApp.d.ts.map +0 -1
  226. package/dist/workbench/WorkbenchApp.js +0 -193
  227. package/dist/workbench/cloudflare-worker/README.md +0 -31
  228. package/dist/workbench/cloudflare-worker/public/workbench.css +0 -1614
  229. package/dist/workbench/cloudflare-worker/public/workbench.js +0 -77
  230. package/dist/workbench/cloudflare-worker/worker.js +0 -40
  231. package/dist/workbench/cloudflare-worker/wrangler.toml +0 -10
  232. package/dist/workbench/index.d.ts +0 -10
  233. package/dist/workbench/index.d.ts.map +0 -1
  234. package/dist/workbench/index.js +0 -44
  235. package/dist/workbench/workbench.css +0 -1614
  236. package/dist/workbench/workbench.js +0 -77
@@ -1,55 +0,0 @@
1
- import path from 'node:path';
2
- import { compileAllPages } from '../compiler/index.js';
3
- import { formatError } from '../compiler/errors.js';
4
- import { promptForLocalEmbeddable } from '../prompts/index.js';
5
- import { captureException, createLogger, exit } from '../logger.js';
6
- import { getSentryContextFromEmbeddableConfig, getSentryContextFromProjectConfig, setSentryContext, } from '../sentry-context.js';
7
- import * as stdout from '../stdout.js';
8
- import { inferEmbeddableFromCwd } from '../helpers/utils.js';
9
- export async function runBuild(opts) {
10
- const logger = createLogger('runBuild');
11
- const inferred = inferEmbeddableFromCwd();
12
- let embeddableId = opts.id ?? inferred?.embeddableId;
13
- if (inferred && !opts.id && embeddableId) {
14
- process.chdir(inferred.projectRoot);
15
- }
16
- setSentryContext(getSentryContextFromProjectConfig());
17
- if (!embeddableId) {
18
- const selected = await promptForLocalEmbeddable({
19
- message: 'Select an embeddable to build:',
20
- });
21
- if (!selected) {
22
- logger.error('no embeddable selected');
23
- await exit(1);
24
- return;
25
- }
26
- embeddableId = selected;
27
- }
28
- if (embeddableId) {
29
- setSentryContext({
30
- embeddable: { id: embeddableId },
31
- ...getSentryContextFromEmbeddableConfig(embeddableId),
32
- });
33
- }
34
- logger.info('build started');
35
- const pagesGlob = opts.pages || `embeddables/${embeddableId}/pages/**/*.page.tsx`;
36
- const outPath = opts.out || path.join('embeddables', embeddableId, '.generated', 'embeddable.json');
37
- const stylesDir = path.join('embeddables', embeddableId, 'styles');
38
- try {
39
- await compileAllPages({
40
- pagesGlob,
41
- outPath,
42
- pageKeyFrom: opts.pageKeyFrom,
43
- stylesDir,
44
- embeddableId,
45
- fixLint: opts.fix ? true : 'prompt',
46
- });
47
- }
48
- catch (e) {
49
- captureException(e);
50
- stdout.error(formatError(e));
51
- logger.error('build failed');
52
- await exit(1);
53
- }
54
- logger.info('build complete');
55
- }
@@ -1,12 +0,0 @@
1
- export declare function runDev(opts: {
2
- id?: string;
3
- pages?: string;
4
- out?: string;
5
- fix?: boolean;
6
- local?: boolean;
7
- engine: string;
8
- port: string;
9
- overrideRoute: string;
10
- pageKeyFrom: 'filename' | 'export';
11
- }): Promise<void>;
12
- //# sourceMappingURL=dev.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AA2HA,wBAAsB,MAAM,CAAC,IAAI,EAAE;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,UAAU,GAAG,QAAQ,CAAA;CACnC,iBAyIA"}
@@ -1,221 +0,0 @@
1
- import fs from 'node:fs';
2
- import net from 'node:net';
3
- import path from 'node:path';
4
- import chokidar from 'chokidar';
5
- import pc from 'picocolors';
6
- import prompts from 'prompts';
7
- import { compileAllPages } from '../compiler/index.js';
8
- import { startProxyServer } from '../proxy/server.js';
9
- import { formatError } from '../compiler/errors.js';
10
- import { captureException, createLogger, exit } from '../logger.js';
11
- import { getSentryContextFromEmbeddableConfig, getSentryContextFromProjectConfig, setSentryContext, } from '../sentry-context.js';
12
- import * as stdout from '../stdout.js';
13
- import { inferEmbeddableFromCwd } from '../helpers/utils.js';
14
- /**
15
- * Check whether a port is available by attempting to listen on it.
16
- */
17
- function isPortAvailable(port) {
18
- return new Promise((resolve) => {
19
- const server = net.createServer();
20
- server.once('error', () => resolve(false));
21
- server.once('listening', () => {
22
- server.close(() => resolve(true));
23
- });
24
- server.listen(port);
25
- });
26
- }
27
- /**
28
- * Starting from `startPort`, find the first available port.
29
- * Tries up to `maxAttempts` consecutive ports.
30
- */
31
- async function getAvailablePort(startPort, maxAttempts = 20) {
32
- for (let i = 0; i < maxAttempts; i++) {
33
- const port = startPort + i;
34
- if (await isPortAvailable(port)) {
35
- return port;
36
- }
37
- }
38
- throw new Error(`Could not find an available port (tried ${startPort}–${startPort + maxAttempts - 1})`);
39
- }
40
- async function discoverEmbeddables() {
41
- const embeddablesDir = 'embeddables';
42
- if (!fs.existsSync(embeddablesDir)) {
43
- return [];
44
- }
45
- const entries = fs.readdirSync(embeddablesDir, { withFileTypes: true });
46
- const embeddables = [];
47
- for (const entry of entries) {
48
- if (!entry.isDirectory())
49
- continue;
50
- const id = entry.name;
51
- const metadataPath = path.join(embeddablesDir, id, 'metadata.json');
52
- let title = null;
53
- if (fs.existsSync(metadataPath)) {
54
- try {
55
- const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
56
- title = metadata.title || null;
57
- }
58
- catch {
59
- // Ignore JSON parse errors
60
- }
61
- }
62
- embeddables.push({ id, title });
63
- }
64
- // Sort by title (with title) first, then by id
65
- return embeddables.sort((a, b) => {
66
- if (a.title && !b.title)
67
- return -1;
68
- if (!a.title && b.title)
69
- return 1;
70
- const aLabel = a.title || a.id;
71
- const bLabel = b.title || b.id;
72
- return aLabel.localeCompare(bLabel);
73
- });
74
- }
75
- async function promptForEmbeddable() {
76
- const embeddables = await discoverEmbeddables();
77
- if (embeddables.length === 0) {
78
- stdout.error('No embeddables found in the embeddables/ directory.');
79
- stdout.error('Run `embeddables pull --id <id>` to pull an embeddable first.');
80
- return null;
81
- }
82
- const choices = embeddables.map((e) => ({
83
- title: e.title ? `${e.title} (${e.id})` : e.id,
84
- value: e.id,
85
- }));
86
- const response = await prompts({
87
- type: 'select',
88
- name: 'id',
89
- message: 'Select an embeddable to run:',
90
- choices,
91
- }, {
92
- onCancel: () => {
93
- process.exit(0);
94
- },
95
- });
96
- return response.id || null;
97
- }
98
- export async function runDev(opts) {
99
- const logger = createLogger('runDev');
100
- const inferred = inferEmbeddableFromCwd();
101
- let embeddableId = opts.id ?? inferred?.embeddableId;
102
- if (inferred && !opts.id && embeddableId) {
103
- process.chdir(inferred.projectRoot);
104
- }
105
- setSentryContext(getSentryContextFromProjectConfig());
106
- if (!embeddableId) {
107
- const selected = await promptForEmbeddable();
108
- if (!selected) {
109
- logger.error('no embeddable selected');
110
- await exit(1);
111
- return;
112
- }
113
- embeddableId = selected;
114
- }
115
- if (embeddableId) {
116
- setSentryContext({
117
- embeddable: { id: embeddableId },
118
- ...getSentryContextFromEmbeddableConfig(embeddableId),
119
- });
120
- }
121
- logger.info('dev started', { engine: opts.engine, port: opts.port });
122
- const pagesGlob = opts.pages || `embeddables/${embeddableId}/pages/**/*.page.tsx`;
123
- const outPath = opts.out || path.join('embeddables', embeddableId, '.generated', 'embeddable.json');
124
- const stylesDir = path.join('embeddables', embeddableId, 'styles');
125
- const stylesGlob = `embeddables/${embeddableId}/styles/**/*.css`;
126
- const configPath = path.join('embeddables', embeddableId, 'config.json');
127
- const globalComponentsGlob = `embeddables/${embeddableId}/global-components/**/*.location.tsx`;
128
- const computedFieldsGlob = `embeddables/${embeddableId}/computed-fields/**/*.js`;
129
- const actionsGlob = `embeddables/${embeddableId}/actions/**/*.js`;
130
- const fixLint = opts.fix ? true : 'prompt';
131
- // Initial build
132
- try {
133
- await compileAllPages({
134
- pagesGlob,
135
- outPath,
136
- pageKeyFrom: opts.pageKeyFrom,
137
- stylesDir,
138
- embeddableId,
139
- configPath,
140
- fixLint,
141
- });
142
- }
143
- catch (e) {
144
- captureException(e);
145
- stdout.error(formatError(e));
146
- logger.error('initial build failed');
147
- await exit(1);
148
- }
149
- // Start proxy — find an available port if the requested one is taken
150
- const requestedPort = Number(opts.port);
151
- let port;
152
- try {
153
- port = await getAvailablePort(requestedPort);
154
- }
155
- catch (e) {
156
- captureException(e);
157
- stdout.error(pc.red(e.message));
158
- logger.error('no available port', { requestedPort });
159
- await exit(1);
160
- return;
161
- }
162
- if (port !== requestedPort) {
163
- stdout.warn(`Port ${requestedPort} is in use, using ${port} instead.`);
164
- stdout.print('');
165
- }
166
- const proxy = await startProxyServer({
167
- port,
168
- engineOrigin: opts.engine,
169
- overrideRoute: opts.overrideRoute,
170
- generatedJsonPath: outPath,
171
- embeddableId,
172
- watchWorkbench: true,
173
- });
174
- logger.info('dev server running', { port });
175
- // Watch all source files: pages, styles, config, global components, computed fields, and actions
176
- const watcher = chokidar.watch([pagesGlob, stylesGlob, configPath, globalComponentsGlob, computedFieldsGlob, actionsGlob], {
177
- ignoreInitial: true,
178
- });
179
- const rebuild = async () => {
180
- try {
181
- await compileAllPages({
182
- pagesGlob,
183
- outPath,
184
- pageKeyFrom: opts.pageKeyFrom,
185
- stylesDir,
186
- embeddableId,
187
- configPath,
188
- fixLint,
189
- });
190
- proxy.broadcastReload();
191
- }
192
- catch (e) {
193
- // Keep dev server running; compiler errors show in console.
194
- // (Proxy will still serve the last good JSON.)
195
- captureException(e);
196
- stdout.error(formatError(e));
197
- }
198
- };
199
- let t;
200
- watcher.on('all', () => {
201
- clearTimeout(t);
202
- t = setTimeout(rebuild, 80);
203
- });
204
- stdout.print(`Watching embeddables/${embeddableId}/ for changes...`);
205
- stdout.print('');
206
- const terminalWidth = process.stdout.columns || 80;
207
- const separator = '━'.repeat(terminalWidth);
208
- stdout.print(`${pc.bold(pc.cyan(separator))}`);
209
- stdout.print('');
210
- if (opts.local) {
211
- stdout.print(`${pc.bold(pc.blue('Mode:'))} ${pc.blue('Local')} (using ${opts.engine})`);
212
- }
213
- else {
214
- stdout.print(`${pc.bold(pc.yellow('Mode:'))} ${pc.yellow('Remote')} (using ${opts.engine})`);
215
- }
216
- stdout.print('');
217
- stdout.print(`${pc.bold(pc.green('Preview URL:'))} ${pc.underline(pc.cyan(`http://localhost:${port}?id=${embeddableId}&version=latest`))}`);
218
- stdout.print('');
219
- stdout.print(`${pc.bold(pc.cyan(separator))}`);
220
- stdout.print('');
221
- }
@@ -1,6 +0,0 @@
1
- export declare function runExperimentsConnect(opts: {
2
- id?: string;
3
- experimentId?: string;
4
- experimentKey?: string;
5
- }): Promise<void>;
6
- //# sourceMappingURL=experiments-connect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"experiments-connect.d.ts","sourceRoot":"","sources":["../../src/commands/experiments-connect.ts"],"names":[],"mappings":"AAoBA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,iBAeA"}
@@ -1,140 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import pc from 'picocolors';
4
- import { isLoggedIn } from '../auth/index.js';
5
- import { getProjectId, writeProjectConfig } from '../config/index.js';
6
- import { promptForProject, promptForLocalEmbeddable, promptForExperiment, } from '../prompts/index.js';
7
- import { createLogger, exit } from '../logger.js';
8
- import { getSentryContextFromEmbeddableConfig, getSentryContextFromProjectConfig, setSentryContext, } from '../sentry-context.js';
9
- import * as stdout from '../stdout.js';
10
- import { inferEmbeddableFromCwd } from '../helpers/utils.js';
11
- export async function runExperimentsConnect(opts) {
12
- const logger = createLogger('runExperimentsConnect');
13
- try {
14
- await runExperimentsConnectInner(opts);
15
- }
16
- catch (error) {
17
- if (error instanceof Error) {
18
- stdout.error(pc.red(`Connect failed: ${error.message}`));
19
- }
20
- else {
21
- stdout.error(pc.red('Connect failed with an unexpected error.'));
22
- }
23
- logger.error('experiments connect failed', {
24
- message: error instanceof Error ? error.message : 'unexpected error',
25
- });
26
- await exit(1);
27
- }
28
- }
29
- async function runExperimentsConnectInner(opts) {
30
- const logger = createLogger('runExperimentsConnect');
31
- // 1. Check login (needed for fetching experiments from Supabase)
32
- if (!isLoggedIn()) {
33
- stdout.error(pc.red('Not logged in.'));
34
- stdout.print(pc.gray('Run "embeddables login" first.'));
35
- logger.error('not logged in');
36
- await exit(1);
37
- }
38
- // 2. Get project ID (needed for experiment list)
39
- let projectId = getProjectId();
40
- if (!projectId) {
41
- stdout.print(pc.cyan('No project configured. Fetching projects...'));
42
- const selectedProject = await promptForProject();
43
- if (!selectedProject) {
44
- await exit(1);
45
- return;
46
- }
47
- projectId = selectedProject.id;
48
- writeProjectConfig({
49
- org_id: selectedProject.org_id || undefined,
50
- org_title: selectedProject.org_title || undefined,
51
- project_id: projectId,
52
- project_name: selectedProject.title || undefined,
53
- });
54
- stdout.print(pc.green('✓ Saved project to embeddables.json'));
55
- stdout.print('');
56
- }
57
- // 4. Get embeddable ID (from option, cwd inference, or interactive prompt)
58
- const inferred = inferEmbeddableFromCwd();
59
- let embeddableId = opts.id ?? inferred?.embeddableId;
60
- if (inferred && !opts.id && embeddableId) {
61
- process.chdir(inferred.projectRoot);
62
- }
63
- setSentryContext(getSentryContextFromProjectConfig());
64
- if (!embeddableId) {
65
- const selected = await promptForLocalEmbeddable({
66
- message: 'Select an embeddable to connect the experiment to:',
67
- });
68
- if (!selected) {
69
- await exit(1);
70
- return;
71
- }
72
- embeddableId = selected;
73
- stdout.print('');
74
- }
75
- if (embeddableId) {
76
- setSentryContext({
77
- embeddable: { id: embeddableId },
78
- ...getSentryContextFromEmbeddableConfig(embeddableId),
79
- });
80
- }
81
- // 5. Get experiment_id and experiment_key (from opts or interactive prompt)
82
- let experimentId = opts.experimentId;
83
- let experimentKey = opts.experimentKey;
84
- if (experimentId && !experimentKey) {
85
- stdout.error(pc.red('When using --experiment-id, --experiment-key is also required.'));
86
- logger.error('missing experiment-key flag');
87
- await exit(1);
88
- }
89
- if (experimentKey && !experimentId) {
90
- stdout.error(pc.red('When using --experiment-key, --experiment-id is also required.'));
91
- logger.error('missing experiment-id flag');
92
- await exit(1);
93
- }
94
- if (!experimentId || !experimentKey) {
95
- stdout.print(pc.cyan('Fetching experiments from project...'));
96
- const selected = await promptForExperiment(projectId, {
97
- message: 'Select an experiment to connect:',
98
- excludeConnectedTo: embeddableId,
99
- });
100
- if (!selected) {
101
- await exit(1);
102
- return;
103
- }
104
- experimentId = selected.experiment_id;
105
- experimentKey = selected.experiment_key;
106
- stdout.print('');
107
- }
108
- // 6. Read config.json
109
- const configPath = path.join('embeddables', embeddableId, 'config.json');
110
- if (!fs.existsSync(configPath)) {
111
- stdout.error(pc.red(`No config.json found at ${configPath}`));
112
- stdout.print(pc.gray('Run "embeddables pull" or "embeddables init" first.'));
113
- logger.error('config not found', { configPath });
114
- await exit(1);
115
- }
116
- let config;
117
- try {
118
- const content = fs.readFileSync(configPath, 'utf8');
119
- config = JSON.parse(content);
120
- }
121
- catch {
122
- stdout.error(pc.red('Failed to parse config.json.'));
123
- logger.error('failed to parse config');
124
- await exit(1);
125
- return;
126
- }
127
- // 7. Append to connected_experiments
128
- const connectedExperiments = Array.isArray(config.connected_experiments) ? [...config.connected_experiments] : [];
129
- const alreadyConnected = connectedExperiments.some((e) => e.experiment_id === experimentId && e.experiment_key === experimentKey);
130
- if (alreadyConnected) {
131
- stdout.print(pc.yellow(`Experiment "${experimentKey}" is already connected to this embeddable.`));
132
- return;
133
- }
134
- connectedExperiments.push({ experiment_id: experimentId, experiment_key: experimentKey });
135
- config.connected_experiments = connectedExperiments;
136
- // 8. Write the modified config back
137
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');
138
- stdout.print(pc.green(`✓ Connected experiment "${experimentKey}" to embeddable (updated config.json)`));
139
- stdout.print(pc.gray('Run "embeddables save" to persist to the cloud.'));
140
- }
@@ -1,5 +0,0 @@
1
- export declare function runInit(opts: {
2
- projectId?: string;
3
- yes?: boolean;
4
- }): Promise<void>;
5
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAwHA,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,iBAgPxE"}