@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,327 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import pc from 'picocolors';
5
- import prompts from 'prompts';
6
- import { writeProjectConfig, readProjectConfig } from '../config/index.js';
7
- import { isLoggedIn } from '../auth/index.js';
8
- import { promptForProject } from '../prompts/index.js';
9
- import * as stdout from '../stdout.js';
10
- const __filename = fileURLToPath(import.meta.url);
11
- const __dirname = path.dirname(__filename);
12
- /** Recursively copy a directory, creating target dirs as needed. */
13
- function copyDirSync(src, dest) {
14
- fs.mkdirSync(dest, { recursive: true });
15
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
16
- const srcPath = path.join(src, entry.name);
17
- const destPath = path.join(dest, entry.name);
18
- if (entry.isDirectory()) {
19
- copyDirSync(srcPath, destPath);
20
- }
21
- else {
22
- fs.copyFileSync(srcPath, destPath);
23
- }
24
- }
25
- }
26
- /**
27
- * Generate type declaration stubs in .types/ (project root) so the editor
28
- * can resolve imports in generated TSX files without npm install.
29
- */
30
- function writeTypeStubs(cwd) {
31
- const typesDir = path.join(cwd, '.types');
32
- fs.mkdirSync(typesDir, { recursive: true });
33
- // Copy compiled types-builder.d.ts → .types/types.d.ts
34
- // (named types-builder in this codebase because it's copied from another repo,
35
- // but exposed as simply "types" in consumer projects)
36
- // When running from compiled JS: __dirname is dist/commands/, so ../types-builder.d.ts works.
37
- // When running via tsx in dev: __dirname is src/commands/, so we fall back to dist/.
38
- const candidates = [
39
- path.join(__dirname, '..', 'types-builder.d.ts'),
40
- path.join(__dirname, '..', '..', 'dist', 'types-builder.d.ts'),
41
- ];
42
- const typesBuilderDts = candidates.find((p) => fs.existsSync(p));
43
- if (typesBuilderDts) {
44
- fs.copyFileSync(typesBuilderDts, path.join(typesDir, 'types.d.ts'));
45
- }
46
- else {
47
- stdout.warn(pc.yellow(' ⚠ Could not find types-builder.d.ts — run `npm run build` first'));
48
- }
49
- // React JSX runtime types (needed for "jsx": "react-jsx" in tsconfig)
50
- fs.writeFileSync(path.join(typesDir, 'react-jsx-runtime.d.ts'), `export namespace JSX {
51
- type Element = any
52
- interface IntrinsicElements {
53
- [elemName: string]: any
54
- }
55
- }
56
- export function jsx(type: any, props: any, key?: string): JSX.Element
57
- export function jsxs(type: any, props: any, key?: string): JSX.Element
58
- export const Fragment: unique symbol
59
- `, 'utf8');
60
- // Component primitives — import real prop types from types-builder,
61
- // omitting JSON-structural properties that aren't valid React props
62
- const componentsWithOwnType = [
63
- 'BookMeeting',
64
- 'Chart',
65
- 'Container',
66
- 'CustomButton',
67
- 'CustomHTML',
68
- 'FileUpload',
69
- 'InputBox',
70
- 'Lottie',
71
- 'MediaEmbed',
72
- 'MediaImage',
73
- 'OptionSelector',
74
- 'PaypalCheckout',
75
- 'ProgressBar',
76
- 'Rive',
77
- 'StripeCheckout',
78
- 'StripeCheckout2',
79
- ];
80
- const baseOnlyComponents = ['PlainText', 'RichText', 'RichTextMarkdown'];
81
- const importAliases = componentsWithOwnType.map((name) => `${name} as ${name}JSON`).join(', ');
82
- const importLine = `import type { Base, ${importAliases} } from './types'`;
83
- // Properties from the JSON format that are structural/derived in React
84
- const omitLine = `type JSONOnly = 'type' | 'parent_id' | 'parent_key' | '_location' | 'components' | '__hide_initially' | '__is_child_already_inserted' | 'clearable' | 'central_play_button'`;
85
- // In React, child components are passed via JSX nesting (children), not via a components array
86
- const propsTypeLine = `type Props<T> = Omit<T, JSONOnly> & { children?: any }`;
87
- const typedExports = componentsWithOwnType
88
- .map((name) => `export function ${name}(props: Props<${name}JSON>): any`)
89
- .join('\n');
90
- const baseExports = baseOnlyComponents
91
- .map((name) => `export function ${name}(props: Props<Base>): any`)
92
- .join('\n');
93
- fs.writeFileSync(path.join(typesDir, 'components.d.ts'), importLine +
94
- '\n\n' +
95
- omitLine +
96
- '\n' +
97
- propsTypeLine +
98
- '\n\n' +
99
- typedExports +
100
- '\n' +
101
- baseExports +
102
- '\n', 'utf8');
103
- }
104
- export async function runInit(opts) {
105
- const cwd = process.cwd();
106
- const gitignorePath = path.join(cwd, '.gitignore');
107
- const embeddablesDir = path.join(cwd, 'embeddables');
108
- stdout.print('');
109
- stdout.print(pc.bold(pc.cyan(' Embeddables Project Setup')));
110
- stdout.print('');
111
- const existingConfig = readProjectConfig();
112
- // Step 1: Get Embeddables project
113
- let projectId = opts.projectId;
114
- let selectedProjectTitle;
115
- let selectedOrgId;
116
- let selectedOrgTitle;
117
- if (!projectId && !opts.yes) {
118
- if (existingConfig?.project_id) {
119
- stdout.print(pc.gray(` Using existing project ID: ${existingConfig.project_id}`));
120
- projectId = existingConfig.project_id;
121
- selectedProjectTitle = existingConfig.project_name || undefined;
122
- selectedOrgId = existingConfig.org_id || undefined;
123
- selectedOrgTitle = existingConfig.org_title || undefined;
124
- }
125
- else if (isLoggedIn()) {
126
- // Fetch and show project list
127
- stdout.print(pc.gray(' Fetching projects...'));
128
- const selectedProject = await promptForProject({
129
- allowSkip: true,
130
- message: 'Select your Embeddables project:',
131
- });
132
- if (selectedProject) {
133
- projectId = selectedProject.id;
134
- selectedProjectTitle = selectedProject.title || undefined;
135
- selectedOrgId = selectedProject.org_id || undefined;
136
- selectedOrgTitle = selectedProject.org_title || undefined;
137
- }
138
- }
139
- else {
140
- // Not logged in - offer manual entry or skip
141
- stdout.print(pc.gray(' (Login with "embeddables login" to select from your projects)'));
142
- const response = await prompts({
143
- type: 'text',
144
- name: 'projectId',
145
- message: 'Embeddables project ID (optional):',
146
- hint: 'e.g., proj_abc123 - leave empty to skip',
147
- }, {
148
- onCancel: () => {
149
- stdout.print(pc.gray('\n Cancelled.'));
150
- process.exit(0);
151
- },
152
- });
153
- projectId = response.projectId || undefined;
154
- }
155
- }
156
- // Write embeddables.json config
157
- if (projectId) {
158
- writeProjectConfig({
159
- org_id: selectedOrgId,
160
- org_title: selectedOrgTitle,
161
- project_id: projectId,
162
- project_name: selectedProjectTitle,
163
- });
164
- stdout.print(pc.green(' ✓ Created embeddables.json'));
165
- }
166
- // Create or update .gitignore
167
- const gitignoreEntries = ['**/.generated/', '**/.types/', '.DS_Store'];
168
- let existingGitignore = '';
169
- if (fs.existsSync(gitignorePath)) {
170
- existingGitignore = fs.readFileSync(gitignorePath, 'utf8');
171
- }
172
- const newEntries = gitignoreEntries.filter((entry) => !existingGitignore.includes(entry.replace('/', '')));
173
- if (newEntries.length > 0) {
174
- const separator = existingGitignore && !existingGitignore.endsWith('\n') ? '\n' : '';
175
- const embeddablesSection = existingGitignore
176
- ? `${separator}\n# Embeddables\n${newEntries.join('\n')}\n`
177
- : `# Embeddables\n${gitignoreEntries.join('\n')}\n`;
178
- fs.writeFileSync(gitignorePath, existingGitignore + embeddablesSection, 'utf8');
179
- if (existingGitignore) {
180
- stdout.print(pc.green(' ✓ Updated .gitignore'));
181
- }
182
- else {
183
- stdout.print(pc.green(' ✓ Created .gitignore'));
184
- }
185
- }
186
- else {
187
- stdout.print(pc.gray(' ✓ .gitignore already configured'));
188
- }
189
- // Create embeddables directory
190
- if (!fs.existsSync(embeddablesDir)) {
191
- fs.mkdirSync(embeddablesDir, { recursive: true });
192
- stdout.print(pc.green(' ✓ Created embeddables/ directory'));
193
- }
194
- else {
195
- stdout.print(pc.gray(' ✓ embeddables/ directory exists'));
196
- }
197
- // Remove old .claudefiles folder (replaced by .cursor/ and .claude/)
198
- const claudefilesDir = path.join(cwd, '.claudefiles');
199
- if (fs.existsSync(claudefilesDir)) {
200
- fs.rmSync(claudefilesDir, { recursive: true });
201
- stdout.print(pc.green(' ✓ Removed old .claudefiles/'));
202
- }
203
- // Inject .cursor/ and .claude/ from source .prompts/embeddables-cli.md (or copy if pre-built dirs exist)
204
- const packageRoot = path.resolve(__dirname, '..', '..');
205
- const promptsSource = path.join(packageRoot, '.prompts', 'embeddables-cli.md');
206
- const sourceCursorDir = path.join(packageRoot, '.cursor');
207
- const sourceClaudeDir = path.join(packageRoot, '.claude');
208
- if (fs.existsSync(promptsSource)) {
209
- const content = fs.readFileSync(promptsSource, 'utf8');
210
- const cursorFrontmatter = `---
211
- globs:
212
- alwaysApply: true
213
- ---
214
-
215
- `;
216
- const claudeIntro = `# Embeddables project (Claude Code)
217
-
218
- This is an Embeddables project managed by the Embeddables CLI. The CLI transforms Embeddable JSON into a local file structure for development, then compiles it back to JSON for saving.
219
-
220
- For full context when editing embeddables (pages, components, styles, actions, computed fields), see:
221
-
222
- - **.claude/embeddables-cli.md** — Embeddables CLI structure, types, file layout, and conventions.
223
-
224
- All TypeScript types are in \`.types/\` (generated by \`embeddables init\`). Use \`embeddables dev\` to run the dev server and \`embeddables pull\` / \`embeddables save\` to sync with the project.
225
- `;
226
- const cursorRulesDir = path.join(cwd, '.cursor', 'rules');
227
- const claudeDir = path.join(cwd, '.claude');
228
- fs.mkdirSync(cursorRulesDir, { recursive: true });
229
- fs.mkdirSync(claudeDir, { recursive: true });
230
- fs.writeFileSync(path.join(cursorRulesDir, 'embeddables-cli.md'), cursorFrontmatter + content, 'utf8');
231
- fs.writeFileSync(path.join(claudeDir, 'CLAUDE.md'), claudeIntro, 'utf8');
232
- fs.writeFileSync(path.join(claudeDir, 'embeddables-cli.md'), content, 'utf8');
233
- stdout.print(pc.green(' ✓ Injected .cursor/ rules'));
234
- stdout.print(pc.green(' ✓ Injected .claude/'));
235
- }
236
- else if (fs.existsSync(sourceCursorDir) || fs.existsSync(sourceClaudeDir)) {
237
- if (fs.existsSync(sourceCursorDir)) {
238
- copyDirSync(sourceCursorDir, path.join(cwd, '.cursor'));
239
- stdout.print(pc.green(' ✓ Injected .cursor/ rules'));
240
- }
241
- if (fs.existsSync(sourceClaudeDir)) {
242
- copyDirSync(sourceClaudeDir, path.join(cwd, '.claude'));
243
- stdout.print(pc.green(' ✓ Injected .claude/'));
244
- }
245
- }
246
- // Create tsconfig.json for editor support (JSX, type checking)
247
- const tsconfigPath = path.join(cwd, 'tsconfig.json');
248
- if (!fs.existsSync(tsconfigPath)) {
249
- const tsconfig = {
250
- compilerOptions: {
251
- target: 'esnext',
252
- module: 'esnext',
253
- moduleResolution: 'bundler',
254
- jsx: 'react-jsx',
255
- noEmit: true,
256
- strict: false,
257
- skipLibCheck: true,
258
- esModuleInterop: true,
259
- baseUrl: '.',
260
- paths: {
261
- 'react/jsx-runtime': ['./.types/react-jsx-runtime'],
262
- '@embeddables/cli/components': ['./.types/components'],
263
- '@embeddables/cli/types': ['./.types/types'],
264
- },
265
- },
266
- include: ['embeddables'],
267
- };
268
- fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + '\n', 'utf8');
269
- stdout.print(pc.green(' ✓ Created tsconfig.json'));
270
- }
271
- else {
272
- stdout.print(pc.gray(' ✓ tsconfig.json already exists'));
273
- }
274
- // Migrate .types from old location (embeddables/.types/) to project root (.types/)
275
- const oldTypesDir = path.join(embeddablesDir, '.types');
276
- if (fs.existsSync(oldTypesDir)) {
277
- fs.rmSync(oldTypesDir, { recursive: true });
278
- stdout.print(pc.green(' ✓ Removed old embeddables/.types/'));
279
- }
280
- // Fix tsconfig paths from older versions
281
- if (fs.existsSync(tsconfigPath)) {
282
- let tsconfigContent = fs.readFileSync(tsconfigPath, 'utf8');
283
- let updated = false;
284
- // Migrate old embeddables/.types/ location → .types/
285
- if (tsconfigContent.includes('./embeddables/.types/')) {
286
- tsconfigContent = tsconfigContent.replaceAll('./embeddables/.types/', './.types/');
287
- updated = true;
288
- }
289
- // Migrate old .types/types-builder → .types/types
290
- if (tsconfigContent.includes('./.types/types-builder"')) {
291
- tsconfigContent = tsconfigContent.replace('./.types/types-builder"', './.types/types"');
292
- updated = true;
293
- }
294
- if (updated) {
295
- fs.writeFileSync(tsconfigPath, tsconfigContent, 'utf8');
296
- stdout.print(pc.green(' ✓ Updated tsconfig.json paths'));
297
- }
298
- }
299
- // Remove old .types/types-builder.d.ts (now named .types/types.d.ts)
300
- const legacyTypesBuilderDts = path.join(cwd, '.types', 'types-builder.d.ts');
301
- if (fs.existsSync(legacyTypesBuilderDts)) {
302
- fs.rmSync(legacyTypesBuilderDts);
303
- }
304
- // Generate type declaration stubs for editor support (no npm install needed)
305
- writeTypeStubs(cwd);
306
- stdout.print(pc.green(' ✓ Generated type declarations'));
307
- // Print next steps
308
- stdout.print('');
309
- stdout.print(pc.bold(' Next steps:'));
310
- stdout.print('');
311
- stdout.print(pc.cyan(' 1. Login to Embeddables:'));
312
- stdout.print(pc.white(' embeddables login'));
313
- stdout.print('');
314
- if (projectId) {
315
- stdout.print(pc.cyan(' 2. Pull an embeddable:'));
316
- stdout.print(pc.white(' embeddables pull'));
317
- stdout.print(pc.gray(' (will show a list of embeddables in your project)'));
318
- }
319
- else {
320
- stdout.print(pc.cyan(' 2. Pull an existing embeddable:'));
321
- stdout.print(pc.white(' embeddables pull --id <embeddable-id>'));
322
- }
323
- stdout.print('');
324
- stdout.print(pc.cyan(' 3. Start developing:'));
325
- stdout.print(pc.white(' embeddables dev'));
326
- stdout.print('');
327
- }
@@ -1,2 +0,0 @@
1
- export declare function runLogin(): Promise<void>;
2
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAYA,wBAAsB,QAAQ,kBAiI7B"}
@@ -1,122 +0,0 @@
1
- import prompts from 'prompts';
2
- import pc from 'picocolors';
3
- import { getSupabaseClient, writeAuthConfig, readAuthConfig, SUPABASE_URL, SUPABASE_ANON_KEY, } from '../auth/index.js';
4
- import { captureException, createLogger, exit } from '../logger.js';
5
- import * as stdout from '../stdout.js';
6
- export async function runLogin() {
7
- const logger = createLogger('runLogin');
8
- try {
9
- const supabase = getSupabaseClient();
10
- // Check if already logged in
11
- const existingConfig = readAuthConfig();
12
- if (existingConfig?.access_token) {
13
- const { overwrite } = await prompts({
14
- type: 'confirm',
15
- name: 'overwrite',
16
- message: 'You are already logged in. Do you want to log in again?',
17
- initial: false,
18
- });
19
- if (!overwrite) {
20
- stdout.print(pc.green('Login cancelled.'));
21
- return;
22
- }
23
- }
24
- // Prompt for email
25
- const { email } = await prompts({
26
- type: 'text',
27
- name: 'email',
28
- message: 'Enter your email address:',
29
- validate: (value) => {
30
- if (!value)
31
- return 'Email is required';
32
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
33
- return 'Please enter a valid email address';
34
- }
35
- return true;
36
- },
37
- });
38
- if (!email) {
39
- stdout.print(pc.red('Login cancelled.'));
40
- return;
41
- }
42
- stdout.print('');
43
- stdout.print(pc.cyan('Sending verification code to your email...'));
44
- // Send OTP code
45
- const { error: sendError } = await supabase.auth.signInWithOtp({
46
- email,
47
- });
48
- if (sendError) {
49
- stdout.error(pc.red(`Error sending verification code: ${sendError.message}`));
50
- logger.error('failed to send OTP', { message: sendError.message });
51
- await exit(1);
52
- }
53
- stdout.print('');
54
- stdout.print(pc.green('✓ Verification code sent!'));
55
- stdout.print(pc.dim('Please check your email for the code.'));
56
- stdout.print('');
57
- // Prompt for OTP code
58
- const { code } = await prompts({
59
- type: 'text',
60
- name: 'code',
61
- message: 'Enter the verification code from your email:',
62
- validate: (value) => {
63
- if (!value)
64
- return 'Verification code is required';
65
- if (!/^\d{6}$/.test(value.trim())) {
66
- return 'Please enter a valid 6-digit code';
67
- }
68
- return true;
69
- },
70
- });
71
- if (!code) {
72
- stdout.print(pc.red('Login cancelled.'));
73
- return;
74
- }
75
- stdout.print('');
76
- stdout.print(pc.cyan('Verifying code...'));
77
- // Verify OTP code
78
- const { data, error: verifyError } = await supabase.auth.verifyOtp({
79
- email,
80
- token: code.trim(),
81
- type: 'email',
82
- });
83
- if (verifyError) {
84
- stdout.error(pc.red(`Error verifying code: ${verifyError.message}`));
85
- logger.error('failed to verify OTP', { message: verifyError.message });
86
- await exit(1);
87
- }
88
- if (!data.session) {
89
- stdout.error(pc.red('No session returned from verification'));
90
- logger.error('no session returned from verification');
91
- await exit(1);
92
- return;
93
- }
94
- // Store auth config
95
- const config = {
96
- access_token: data.session.access_token,
97
- refresh_token: data.session.refresh_token,
98
- expires_at: data.session.expires_at || Math.floor(Date.now() / 1000) + 3600, // Default 1 hour if not provided
99
- supabase_url: SUPABASE_URL,
100
- supabase_anon_key: SUPABASE_ANON_KEY,
101
- };
102
- writeAuthConfig(config);
103
- stdout.print('');
104
- stdout.print(pc.green('✓ Successfully logged in!'));
105
- logger.info('login complete');
106
- stdout.print('');
107
- }
108
- catch (error) {
109
- if (error.name === 'ExitPrompt') {
110
- // User cancelled prompt (Ctrl+C)
111
- stdout.print('');
112
- stdout.print(pc.red('Login cancelled.'));
113
- await exit(0);
114
- }
115
- else {
116
- captureException(error);
117
- stdout.error(pc.red(`Error during login: ${error.message}`));
118
- logger.error('login failed', { message: error.message });
119
- await exit(1);
120
- }
121
- }
122
- }
@@ -1,2 +0,0 @@
1
- export declare function runLogout(): Promise<void>;
2
- //# sourceMappingURL=logout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,kBAiB9B"}
@@ -1,22 +0,0 @@
1
- import pc from 'picocolors';
2
- import { deleteAuthConfig, isLoggedIn } from '../auth/index.js';
3
- import { createLogger, exit } from '../logger.js';
4
- import * as stdout from '../stdout.js';
5
- export async function runLogout() {
6
- const logger = createLogger('runLogout');
7
- try {
8
- if (!isLoggedIn()) {
9
- stdout.print(pc.yellow('You are not currently logged in.'));
10
- return;
11
- }
12
- deleteAuthConfig();
13
- stdout.print('');
14
- stdout.print(pc.green('✓ Successfully logged out!'));
15
- stdout.print('');
16
- }
17
- catch (error) {
18
- stdout.error(pc.red(`Error during logout: ${error.message}`));
19
- logger.error('logout failed', { message: error.message });
20
- await exit(1);
21
- }
22
- }
@@ -1,14 +0,0 @@
1
- export type RunPullOptions = {
2
- id?: string;
3
- out?: string;
4
- branch?: string;
5
- branchName?: string;
6
- /** Version to pull (number or "latest"). If omitted and embeddable is known, prompt from 100 most recent. */
7
- version?: string | number;
8
- /** When true, pull main and clear saved branch (e.g. when user explicitly selects "main" in branch switcher). */
9
- useMain?: boolean;
10
- fix?: boolean;
11
- preserve?: boolean;
12
- };
13
- export declare function runPull(opts: RunPullOptions): Promise<void>;
14
- //# sourceMappingURL=pull.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AA6HA,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6GAA6G;IAC7G,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,iHAAiH;IACjH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,iBAgTjD"}