@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.
- package/.prompts/custom/build-funnel.md +1 -1
- package/.prompts/embeddables-cli.md +9 -2
- package/package.json +1 -1
- package/dist/auth/index.d.ts +0 -43
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -102
- package/dist/cli.d.ts +0 -2
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -174
- package/dist/commands/branch.d.ts +0 -4
- package/dist/commands/branch.d.ts.map +0 -1
- package/dist/commands/branch.js +0 -68
- package/dist/commands/build-workbench.d.ts +0 -5
- package/dist/commands/build-workbench.d.ts.map +0 -1
- package/dist/commands/build-workbench.js +0 -128
- package/dist/commands/build.d.ts +0 -8
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -55
- package/dist/commands/dev.d.ts +0 -12
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -221
- package/dist/commands/experiments-connect.d.ts +0 -6
- package/dist/commands/experiments-connect.d.ts.map +0 -1
- package/dist/commands/experiments-connect.js +0 -140
- package/dist/commands/init.d.ts +0 -5
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -327
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -122
- package/dist/commands/logout.d.ts +0 -2
- package/dist/commands/logout.d.ts.map +0 -1
- package/dist/commands/logout.js +0 -22
- package/dist/commands/pull.d.ts +0 -14
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js +0 -383
- package/dist/commands/save.d.ts +0 -30
- package/dist/commands/save.d.ts.map +0 -1
- package/dist/commands/save.js +0 -591
- package/dist/commands/upgrade.d.ts +0 -2
- package/dist/commands/upgrade.d.ts.map +0 -1
- package/dist/commands/upgrade.js +0 -51
- package/dist/compiler/errors.d.ts +0 -20
- package/dist/compiler/errors.d.ts.map +0 -1
- package/dist/compiler/errors.js +0 -35
- package/dist/compiler/evalStatic.d.ts +0 -3
- package/dist/compiler/evalStatic.d.ts.map +0 -1
- package/dist/compiler/evalStatic.js +0 -57
- package/dist/compiler/flatten.js +0 -1
- package/dist/compiler/helpers/duplicateIds.d.ts +0 -9
- package/dist/compiler/helpers/duplicateIds.d.ts.map +0 -1
- package/dist/compiler/helpers/duplicateIds.js +0 -71
- package/dist/compiler/helpers/numericLeadingKeys.d.ts +0 -8
- package/dist/compiler/helpers/numericLeadingKeys.d.ts.map +0 -1
- package/dist/compiler/helpers/numericLeadingKeys.js +0 -17
- package/dist/compiler/index.d.ts +0 -18
- package/dist/compiler/index.d.ts.map +0 -1
- package/dist/compiler/index.js +0 -1245
- package/dist/compiler/parsePage.d.ts +0 -15
- package/dist/compiler/parsePage.d.ts.map +0 -1
- package/dist/compiler/parsePage.js +0 -631
- package/dist/compiler/registry.d.ts +0 -4
- package/dist/compiler/registry.d.ts.map +0 -1
- package/dist/compiler/registry.js +0 -44
- package/dist/compiler/reverse.d.ts +0 -23
- package/dist/compiler/reverse.d.ts.map +0 -1
- package/dist/compiler/reverse.js +0 -1875
- package/dist/compiler/types.d.ts +0 -21
- package/dist/compiler/types.d.ts.map +0 -1
- package/dist/compiler/types.js +0 -1
- package/dist/components/index.d.ts +0 -21
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -21
- package/dist/components/primitives/BaseComponent.d.ts +0 -32
- package/dist/components/primitives/BaseComponent.d.ts.map +0 -1
- package/dist/components/primitives/BaseComponent.js +0 -26
- package/dist/components/primitives/BookMeeting.d.ts +0 -18
- package/dist/components/primitives/BookMeeting.d.ts.map +0 -1
- package/dist/components/primitives/BookMeeting.js +0 -5
- package/dist/components/primitives/Chart.d.ts +0 -41
- package/dist/components/primitives/Chart.d.ts.map +0 -1
- package/dist/components/primitives/Chart.js +0 -5
- package/dist/components/primitives/Container.d.ts +0 -8
- package/dist/components/primitives/Container.d.ts.map +0 -1
- package/dist/components/primitives/Container.js +0 -5
- package/dist/components/primitives/CustomButton.d.ts +0 -37
- package/dist/components/primitives/CustomButton.d.ts.map +0 -1
- package/dist/components/primitives/CustomButton.js +0 -10
- package/dist/components/primitives/CustomHTML.d.ts +0 -8
- package/dist/components/primitives/CustomHTML.d.ts.map +0 -1
- package/dist/components/primitives/CustomHTML.js +0 -5
- package/dist/components/primitives/FileUpload.d.ts +0 -18
- package/dist/components/primitives/FileUpload.d.ts.map +0 -1
- package/dist/components/primitives/FileUpload.js +0 -16
- package/dist/components/primitives/InputBox.d.ts +0 -34
- package/dist/components/primitives/InputBox.d.ts.map +0 -1
- package/dist/components/primitives/InputBox.js +0 -25
- package/dist/components/primitives/Lottie.d.ts +0 -11
- package/dist/components/primitives/Lottie.d.ts.map +0 -1
- package/dist/components/primitives/Lottie.js +0 -5
- package/dist/components/primitives/MediaEmbed.d.ts +0 -13
- package/dist/components/primitives/MediaEmbed.d.ts.map +0 -1
- package/dist/components/primitives/MediaEmbed.js +0 -6
- package/dist/components/primitives/MediaImage.d.ts +0 -8
- package/dist/components/primitives/MediaImage.d.ts.map +0 -1
- package/dist/components/primitives/MediaImage.js +0 -5
- package/dist/components/primitives/OptionSelector.d.ts +0 -35
- package/dist/components/primitives/OptionSelector.d.ts.map +0 -1
- package/dist/components/primitives/OptionSelector.js +0 -8
- package/dist/components/primitives/PaypalCheckout.d.ts +0 -25
- package/dist/components/primitives/PaypalCheckout.d.ts.map +0 -1
- package/dist/components/primitives/PaypalCheckout.js +0 -5
- package/dist/components/primitives/PlainText.d.ts +0 -6
- package/dist/components/primitives/PlainText.d.ts.map +0 -1
- package/dist/components/primitives/PlainText.js +0 -5
- package/dist/components/primitives/ProgressBar.d.ts +0 -15
- package/dist/components/primitives/ProgressBar.d.ts.map +0 -1
- package/dist/components/primitives/ProgressBar.js +0 -5
- package/dist/components/primitives/RichText.d.ts +0 -6
- package/dist/components/primitives/RichText.d.ts.map +0 -1
- package/dist/components/primitives/RichText.js +0 -5
- package/dist/components/primitives/RichTextMarkdown.d.ts +0 -6
- package/dist/components/primitives/RichTextMarkdown.d.ts.map +0 -1
- package/dist/components/primitives/RichTextMarkdown.js +0 -5
- package/dist/components/primitives/Rive.d.ts +0 -16
- package/dist/components/primitives/Rive.d.ts.map +0 -1
- package/dist/components/primitives/Rive.js +0 -8
- package/dist/components/primitives/StripeCheckout.d.ts +0 -52
- package/dist/components/primitives/StripeCheckout.d.ts.map +0 -1
- package/dist/components/primitives/StripeCheckout.js +0 -5
- package/dist/components/primitives/StripeCheckout2.d.ts +0 -30
- package/dist/components/primitives/StripeCheckout2.d.ts.map +0 -1
- package/dist/components/primitives/StripeCheckout2.js +0 -7
- package/dist/config/index.d.ts +0 -23
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -42
- package/dist/constants.d.ts +0 -9
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -9
- package/dist/helpers/TEMP helpers file.d.ts +0 -1
- package/dist/helpers/TEMP helpers file.d.ts.map +0 -1
- package/dist/helpers/TEMP helpers file.js +0 -1
- package/dist/helpers/dates.d.ts +0 -5
- package/dist/helpers/dates.d.ts.map +0 -1
- package/dist/helpers/dates.js +0 -7
- package/dist/helpers/json.d.ts +0 -47
- package/dist/helpers/json.d.ts.map +0 -1
- package/dist/helpers/json.js +0 -622
- package/dist/helpers/utils.d.ts +0 -13
- package/dist/helpers/utils.d.ts.map +0 -1
- package/dist/helpers/utils.js +0 -28
- package/dist/logger.d.ts +0 -11
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -21
- package/dist/prompts/branches.d.ts +0 -20
- package/dist/prompts/branches.d.ts.map +0 -1
- package/dist/prompts/branches.js +0 -90
- package/dist/prompts/embeddables.d.ts +0 -43
- package/dist/prompts/embeddables.d.ts.map +0 -1
- package/dist/prompts/embeddables.js +0 -198
- package/dist/prompts/experiments.d.ts +0 -28
- package/dist/prompts/experiments.d.ts.map +0 -1
- package/dist/prompts/experiments.js +0 -87
- package/dist/prompts/index.d.ts +0 -11
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -6
- package/dist/prompts/projects.d.ts +0 -22
- package/dist/prompts/projects.d.ts.map +0 -1
- package/dist/prompts/projects.js +0 -86
- package/dist/prompts/versions.d.ts +0 -18
- package/dist/prompts/versions.d.ts.map +0 -1
- package/dist/prompts/versions.js +0 -99
- package/dist/proxy/injectApiInterceptor.d.ts +0 -6
- package/dist/proxy/injectApiInterceptor.d.ts.map +0 -1
- package/dist/proxy/injectApiInterceptor.js +0 -66
- package/dist/proxy/injectReload.d.ts +0 -2
- package/dist/proxy/injectReload.d.ts.map +0 -1
- package/dist/proxy/injectReload.js +0 -14
- package/dist/proxy/injectWorkbench.d.ts +0 -5
- package/dist/proxy/injectWorkbench.d.ts.map +0 -1
- package/dist/proxy/injectWorkbench.js +0 -22
- package/dist/proxy/server.d.ts +0 -11
- package/dist/proxy/server.d.ts.map +0 -1
- package/dist/proxy/server.js +0 -316
- package/dist/proxy/sse.d.ts +0 -5
- package/dist/proxy/sse.d.ts.map +0 -1
- package/dist/proxy/sse.js +0 -17
- package/dist/sentry-context.d.ts +0 -48
- package/dist/sentry-context.d.ts.map +0 -1
- package/dist/sentry-context.js +0 -156
- package/dist/stdout.d.ts +0 -17
- package/dist/stdout.d.ts.map +0 -1
- package/dist/stdout.js +0 -23
- package/dist/types-builder.d.ts +0 -800
- package/dist/types-builder.d.ts.map +0 -1
- package/dist/types-builder.js +0 -20
- package/dist/workbench/ActionsPanel.d.ts +0 -6
- package/dist/workbench/ActionsPanel.d.ts.map +0 -1
- package/dist/workbench/ActionsPanel.js +0 -47
- package/dist/workbench/AutofillPanel.d.ts +0 -6
- package/dist/workbench/AutofillPanel.d.ts.map +0 -1
- package/dist/workbench/AutofillPanel.js +0 -543
- package/dist/workbench/ComputedFieldsPanel.d.ts +0 -6
- package/dist/workbench/ComputedFieldsPanel.d.ts.map +0 -1
- package/dist/workbench/ComputedFieldsPanel.js +0 -31
- package/dist/workbench/ExperimentsPanel.d.ts +0 -6
- package/dist/workbench/ExperimentsPanel.d.ts.map +0 -1
- package/dist/workbench/ExperimentsPanel.js +0 -182
- package/dist/workbench/FieldEditorPanel.d.ts +0 -9
- package/dist/workbench/FieldEditorPanel.d.ts.map +0 -1
- package/dist/workbench/FieldEditorPanel.js +0 -650
- package/dist/workbench/InspectorPanel.d.ts +0 -6
- package/dist/workbench/InspectorPanel.d.ts.map +0 -1
- package/dist/workbench/InspectorPanel.js +0 -341
- package/dist/workbench/PageNavigator.d.ts +0 -6
- package/dist/workbench/PageNavigator.d.ts.map +0 -1
- package/dist/workbench/PageNavigator.js +0 -123
- package/dist/workbench/SchemaPanel.d.ts +0 -6
- package/dist/workbench/SchemaPanel.d.ts.map +0 -1
- package/dist/workbench/SchemaPanel.js +0 -222
- package/dist/workbench/UserDataPanel.d.ts +0 -6
- package/dist/workbench/UserDataPanel.d.ts.map +0 -1
- package/dist/workbench/UserDataPanel.js +0 -350
- package/dist/workbench/WorkbenchApp.d.ts +0 -7
- package/dist/workbench/WorkbenchApp.d.ts.map +0 -1
- package/dist/workbench/WorkbenchApp.js +0 -193
- package/dist/workbench/cloudflare-worker/README.md +0 -31
- package/dist/workbench/cloudflare-worker/public/workbench.css +0 -1614
- package/dist/workbench/cloudflare-worker/public/workbench.js +0 -77
- package/dist/workbench/cloudflare-worker/worker.js +0 -40
- package/dist/workbench/cloudflare-worker/wrangler.toml +0 -10
- package/dist/workbench/index.d.ts +0 -10
- package/dist/workbench/index.d.ts.map +0 -1
- package/dist/workbench/index.js +0 -44
- package/dist/workbench/workbench.css +0 -1614
- package/dist/workbench/workbench.js +0 -77
package/dist/commands/init.js
DELETED
|
@@ -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
|
-
}
|
package/dist/commands/login.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAYA,wBAAsB,QAAQ,kBAiI7B"}
|
package/dist/commands/login.js
DELETED
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,kBAiB9B"}
|
package/dist/commands/logout.js
DELETED
|
@@ -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
|
-
}
|
package/dist/commands/pull.d.ts
DELETED
|
@@ -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"}
|