@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/pull.js
DELETED
|
@@ -1,383 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import pc from 'picocolors';
|
|
4
|
-
import prompts from 'prompts';
|
|
5
|
-
import { reverseCompile } from '../compiler/reverse.js';
|
|
6
|
-
import { getAccessToken, isLoggedIn } from '../auth/index.js';
|
|
7
|
-
import { getProjectId, writeProjectConfig } from '../config/index.js';
|
|
8
|
-
import { promptForProject, promptForEmbeddable, fetchEmbeddableMetadata, fetchRecentVersions, promptForVersion, } from '../prompts/index.js';
|
|
9
|
-
import { captureException, createLogger, exit } from '../logger.js';
|
|
10
|
-
import { getSentryContextFromEmbeddableConfig, getSentryContextFromProjectConfig, setSentryContext, } from '../sentry-context.js';
|
|
11
|
-
import * as stdout from '../stdout.js';
|
|
12
|
-
import { inferEmbeddableFromCwd } from '../helpers/utils.js';
|
|
13
|
-
/**
|
|
14
|
-
* Normalize custom_validation_function strings so literal "\\n" (backslash-n) becomes real newline.
|
|
15
|
-
* The API sometimes returns these double-escaped; dataOutputs/computedFields code is written
|
|
16
|
-
* as raw file content so they don't get double-escaped when written to embeddable.json.
|
|
17
|
-
*/
|
|
18
|
-
function normalizeCustomValidationFunctionsInFlow(flow) {
|
|
19
|
-
function walkComponent(comp) {
|
|
20
|
-
const v = comp.custom_validation_function;
|
|
21
|
-
if (typeof v === 'string') {
|
|
22
|
-
comp.custom_validation_function = v.replace(/\\n/g, '\n');
|
|
23
|
-
}
|
|
24
|
-
const children = comp.components ?? comp.buttons;
|
|
25
|
-
if (Array.isArray(children)) {
|
|
26
|
-
for (const c of children) {
|
|
27
|
-
if (c && typeof c === 'object')
|
|
28
|
-
walkComponent(c);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
const pages = flow.pages;
|
|
33
|
-
if (Array.isArray(pages)) {
|
|
34
|
-
for (const page of pages) {
|
|
35
|
-
if (page && typeof page === 'object' && Array.isArray(page.components)) {
|
|
36
|
-
for (const comp of page.components) {
|
|
37
|
-
if (comp && typeof comp === 'object')
|
|
38
|
-
walkComponent(comp);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const components = flow.components;
|
|
44
|
-
if (Array.isArray(components)) {
|
|
45
|
-
for (const comp of components) {
|
|
46
|
-
if (comp && typeof comp === 'object')
|
|
47
|
-
walkComponent(comp);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/** Slug for branch name/id for use in filenames (e.g. "my branch" -> "my_branch"). */
|
|
52
|
-
function slugForBranch(nameOrId) {
|
|
53
|
-
return String(nameOrId).replace(/[^a-zA-Z0-9_.-]/g, '_').replace(/_+/g, '_') || 'main';
|
|
54
|
-
}
|
|
55
|
-
/** Versioned embeddable filename: embeddable-{branchSlug}@{version}.json */
|
|
56
|
-
function getVersionedBasename(version, branchSlug) {
|
|
57
|
-
const v = typeof version === 'number' ? version : String(version);
|
|
58
|
-
return `embeddable-${branchSlug}@${v}.json`;
|
|
59
|
-
}
|
|
60
|
-
/** Read current _branch_id and _branch_name from config (set when on a branch via `embeddables branch`). */
|
|
61
|
-
function getCurrentBranchFromConfig(embeddableId) {
|
|
62
|
-
const configPath = path.join('embeddables', embeddableId, 'config.json');
|
|
63
|
-
if (!fs.existsSync(configPath))
|
|
64
|
-
return null;
|
|
65
|
-
try {
|
|
66
|
-
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
67
|
-
const branchId = config._branch_id;
|
|
68
|
-
if (typeof branchId !== 'string' || !branchId)
|
|
69
|
-
return null;
|
|
70
|
-
const branchName = config._branch_name;
|
|
71
|
-
return { branchId, branchName: typeof branchName === 'string' ? branchName : undefined };
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/** Write _version, _branch_id, _branch_name to config.json. Called early and in finally so it always runs. */
|
|
78
|
-
function writePullMetadataToConfig(embeddableId, version, branch, branchName) {
|
|
79
|
-
const configPath = path.join('embeddables', embeddableId, 'config.json');
|
|
80
|
-
let config = {};
|
|
81
|
-
try {
|
|
82
|
-
if (fs.existsSync(configPath)) {
|
|
83
|
-
try {
|
|
84
|
-
const content = fs.readFileSync(configPath, 'utf8');
|
|
85
|
-
config = JSON.parse(content);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
/* use empty config */
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (version != null) {
|
|
92
|
-
const n = typeof version === 'number' ? version : parseInt(String(version), 10);
|
|
93
|
-
if (!isNaN(n))
|
|
94
|
-
config._version = n;
|
|
95
|
-
}
|
|
96
|
-
if (branch) {
|
|
97
|
-
config._branch_id = branch;
|
|
98
|
-
if (branchName)
|
|
99
|
-
config._branch_name = branchName;
|
|
100
|
-
else
|
|
101
|
-
delete config._branch_name;
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
delete config._branch_id;
|
|
105
|
-
delete config._branch_name;
|
|
106
|
-
}
|
|
107
|
-
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
108
|
-
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
109
|
-
}
|
|
110
|
-
catch (err) {
|
|
111
|
-
stdout.warn(pc.yellow(`Could not write config.json: ${err instanceof Error ? err.message : err}`));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
export async function runPull(opts) {
|
|
115
|
-
const logger = createLogger('runPull');
|
|
116
|
-
const inferred = inferEmbeddableFromCwd();
|
|
117
|
-
let embeddableId = opts.id ?? inferred?.embeddableId;
|
|
118
|
-
if (inferred && !opts.id && embeddableId) {
|
|
119
|
-
process.chdir(inferred.projectRoot);
|
|
120
|
-
}
|
|
121
|
-
// Re-apply project/org from config after chdir so embeddables.json in project root is used
|
|
122
|
-
setSentryContext(getSentryContextFromProjectConfig());
|
|
123
|
-
// If no ID provided, try to get it interactively
|
|
124
|
-
if (!embeddableId) {
|
|
125
|
-
if (!isLoggedIn()) {
|
|
126
|
-
stdout.error(pc.red('No embeddable ID provided and not logged in.'));
|
|
127
|
-
stdout.print('');
|
|
128
|
-
stdout.print(pc.gray('Either:'));
|
|
129
|
-
stdout.print(pc.gray(' 1. Use --id <embeddable-id> to specify an embeddable'));
|
|
130
|
-
stdout.print(pc.gray(' 2. Run "embeddables login" first for interactive selection'));
|
|
131
|
-
logger.error('not logged in and no embeddable id');
|
|
132
|
-
await exit(1);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
let projectId = getProjectId();
|
|
136
|
-
// If no project ID configured, prompt for project selection
|
|
137
|
-
if (!projectId) {
|
|
138
|
-
stdout.print(pc.cyan('Fetching projects...'));
|
|
139
|
-
const selectedProject = await promptForProject();
|
|
140
|
-
if (!selectedProject) {
|
|
141
|
-
logger.error('project selection failed');
|
|
142
|
-
await exit(1);
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
projectId = selectedProject.id;
|
|
146
|
-
// Save the selected project to config
|
|
147
|
-
writeProjectConfig({
|
|
148
|
-
org_id: selectedProject.org_id || undefined,
|
|
149
|
-
org_title: selectedProject.org_title || undefined,
|
|
150
|
-
project_id: projectId,
|
|
151
|
-
project_name: selectedProject.title || undefined,
|
|
152
|
-
});
|
|
153
|
-
stdout.print(pc.green(`✓ Wrote project config to embeddables.json`));
|
|
154
|
-
stdout.print('');
|
|
155
|
-
}
|
|
156
|
-
stdout.print(pc.cyan('Fetching embeddables from project...'));
|
|
157
|
-
const selected = await promptForEmbeddable(projectId, {
|
|
158
|
-
message: 'Select an embeddable to pull:',
|
|
159
|
-
prioritizeLocal: true,
|
|
160
|
-
});
|
|
161
|
-
if (!selected) {
|
|
162
|
-
logger.error('embeddable selection failed');
|
|
163
|
-
await exit(1);
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
embeddableId = selected;
|
|
167
|
-
stdout.print('');
|
|
168
|
-
}
|
|
169
|
-
if (embeddableId) {
|
|
170
|
-
setSentryContext({
|
|
171
|
-
embeddable: { id: embeddableId },
|
|
172
|
-
...getSentryContextFromEmbeddableConfig(embeddableId),
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
// When useMain, pull main and ignore/clear saved branch. Otherwise stay on current branch when no --branch.
|
|
176
|
-
const currentFromConfig = opts.useMain || opts.branch != null ? null : getCurrentBranchFromConfig(embeddableId);
|
|
177
|
-
const effectiveBranch = opts.useMain ? undefined : (opts.branch ?? currentFromConfig?.branchId);
|
|
178
|
-
const effectiveBranchName = opts.useMain ? undefined : (opts.branchName ?? currentFromConfig?.branchName);
|
|
179
|
-
const outPath = opts.out || path.join('embeddables', embeddableId, '.generated', 'embeddable.json');
|
|
180
|
-
const branchLabel = effectiveBranch
|
|
181
|
-
? effectiveBranchName
|
|
182
|
-
? `${effectiveBranchName} (${effectiveBranch})`
|
|
183
|
-
: effectiveBranch
|
|
184
|
-
: 'main';
|
|
185
|
-
if (effectiveBranch) {
|
|
186
|
-
setSentryContext({ branch: { id: effectiveBranch, name: effectiveBranchName ?? null } });
|
|
187
|
-
}
|
|
188
|
-
// Resolve version: explicit --version, or interactive choice from 100 most recent
|
|
189
|
-
let versionParam;
|
|
190
|
-
if (opts.version !== undefined && opts.version !== '') {
|
|
191
|
-
const v = String(opts.version).toLowerCase();
|
|
192
|
-
versionParam = v === 'latest' ? 'latest' : v;
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
stdout.print(pc.cyan('Fetching recent versions...'));
|
|
196
|
-
const recentVersions = await fetchRecentVersions(embeddableId, effectiveBranch ?? null);
|
|
197
|
-
const selected = await promptForVersion(recentVersions, {
|
|
198
|
-
message: 'Select a version to pull:',
|
|
199
|
-
});
|
|
200
|
-
versionParam = selected === null ? 'latest' : String(selected);
|
|
201
|
-
stdout.print('');
|
|
202
|
-
}
|
|
203
|
-
let url = `https://engine.embeddables.com/${embeddableId}?version=${versionParam}`;
|
|
204
|
-
if (effectiveBranch)
|
|
205
|
-
url += `&embeddable_branch=${effectiveBranch}`;
|
|
206
|
-
logger.info('pull started');
|
|
207
|
-
stdout.print(pc.cyan(`Pulling branch: ${pc.bold(branchLabel)}`));
|
|
208
|
-
stdout.print(`Fetching embeddable from ${url}...`);
|
|
209
|
-
let pullVersion;
|
|
210
|
-
try {
|
|
211
|
-
// Add authentication header if available
|
|
212
|
-
const accessToken = getAccessToken();
|
|
213
|
-
const headers = {};
|
|
214
|
-
if (accessToken) {
|
|
215
|
-
headers['Authorization'] = `Bearer ${accessToken}`;
|
|
216
|
-
}
|
|
217
|
-
const response = await fetch(url, {
|
|
218
|
-
headers,
|
|
219
|
-
});
|
|
220
|
-
if (!response.ok) {
|
|
221
|
-
throw new Error(`Failed to fetch embeddable: ${response.status} ${response.statusText}`);
|
|
222
|
-
}
|
|
223
|
-
const data = await response.json();
|
|
224
|
-
const flow = data.flow;
|
|
225
|
-
if (!flow) {
|
|
226
|
-
throw new Error("Response does not contain a 'flow' property");
|
|
227
|
-
}
|
|
228
|
-
// Normalize custom_validation_function: literal \n (backslash-n) -> real newline (so embeddable.json is correct)
|
|
229
|
-
normalizeCustomValidationFunctionsInFlow(flow);
|
|
230
|
-
// Save to embeddables/<id>/.generated/embeddable.json
|
|
231
|
-
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
232
|
-
const flowJson = JSON.stringify(flow, null, 2);
|
|
233
|
-
fs.writeFileSync(outPath, flowJson, 'utf8');
|
|
234
|
-
stdout.print(pc.cyan(`✓ Wrote embeddable JSON to ${outPath}`));
|
|
235
|
-
// Also save version-specific file (e.g. embeddable-main@135.json or embeddable-my_branch@135.json)
|
|
236
|
-
pullVersion =
|
|
237
|
-
data.version ?? data.embeddable_version ?? flow.version;
|
|
238
|
-
const version = pullVersion;
|
|
239
|
-
const branchSlug = slugForBranch(effectiveBranchName ?? effectiveBranch ?? 'main');
|
|
240
|
-
if (version != null) {
|
|
241
|
-
const versionStr = typeof version === 'string' ? version : String(version);
|
|
242
|
-
const versionedBasename = getVersionedBasename(versionStr, branchSlug);
|
|
243
|
-
const versionedPath = path.join(path.dirname(outPath), versionedBasename);
|
|
244
|
-
fs.writeFileSync(versionedPath, flowJson, 'utf8');
|
|
245
|
-
stdout.print(pc.cyan(`✓ Wrote versioned embeddable JSON to ${versionedPath}`));
|
|
246
|
-
}
|
|
247
|
-
// Persist _version and _branch_id in config.json immediately so they survive reverseCompile
|
|
248
|
-
writePullMetadataToConfig(embeddableId, version, effectiveBranch, effectiveBranchName);
|
|
249
|
-
// Fetch and save flow metadata from DB (title, archived, created_at)
|
|
250
|
-
const metadata = await fetchEmbeddableMetadata(embeddableId);
|
|
251
|
-
if (metadata) {
|
|
252
|
-
const metadataPath = path.join('embeddables', embeddableId, 'metadata.json');
|
|
253
|
-
fs.mkdirSync(path.dirname(metadataPath), { recursive: true });
|
|
254
|
-
fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2) + '\n', 'utf8');
|
|
255
|
-
stdout.print(pc.cyan(`✓ Wrote flow metadata to ${metadataPath}`));
|
|
256
|
-
}
|
|
257
|
-
const versionForSentry = pullVersion != null && !isNaN(Number(pullVersion)) ? Number(pullVersion) : undefined;
|
|
258
|
-
setSentryContext({
|
|
259
|
-
embeddable: { id: embeddableId, title: metadata?.title ?? null },
|
|
260
|
-
versionNumber: versionForSentry,
|
|
261
|
-
});
|
|
262
|
-
// Clear existing pages, styles, computed-fields, actions, and global-components before generating new ones
|
|
263
|
-
const pagesDir = path.join('embeddables', embeddableId, 'pages');
|
|
264
|
-
const stylesDir = path.join('embeddables', embeddableId, 'styles');
|
|
265
|
-
const computedFieldsDir = path.join('embeddables', embeddableId, 'computed-fields');
|
|
266
|
-
const actionsDir = path.join('embeddables', embeddableId, 'actions');
|
|
267
|
-
const globalComponentsDir = path.join('embeddables', embeddableId, 'global-components');
|
|
268
|
-
if (fs.existsSync(pagesDir)) {
|
|
269
|
-
const existingPages = fs.readdirSync(pagesDir).filter((f) => f.endsWith('.page.tsx'));
|
|
270
|
-
for (const page of existingPages) {
|
|
271
|
-
fs.unlinkSync(path.join(pagesDir, page));
|
|
272
|
-
}
|
|
273
|
-
stdout.print(`${pc.gray(`Cleared ${existingPages.length} existing page(s)`)}`);
|
|
274
|
-
}
|
|
275
|
-
if (fs.existsSync(stylesDir)) {
|
|
276
|
-
const existingStyles = fs.readdirSync(stylesDir).filter((f) => f.endsWith('.css'));
|
|
277
|
-
for (const style of existingStyles) {
|
|
278
|
-
fs.unlinkSync(path.join(stylesDir, style));
|
|
279
|
-
}
|
|
280
|
-
stdout.print(`${pc.gray(`Cleared ${existingStyles.length} existing style file(s)`)}`);
|
|
281
|
-
}
|
|
282
|
-
if (fs.existsSync(computedFieldsDir)) {
|
|
283
|
-
const existingFields = fs.readdirSync(computedFieldsDir).filter((f) => f.endsWith('.js'));
|
|
284
|
-
for (const field of existingFields) {
|
|
285
|
-
fs.unlinkSync(path.join(computedFieldsDir, field));
|
|
286
|
-
}
|
|
287
|
-
stdout.print(`${pc.gray(`Cleared ${existingFields.length} existing computed field(s)`)}`);
|
|
288
|
-
}
|
|
289
|
-
if (fs.existsSync(actionsDir)) {
|
|
290
|
-
const existingActions = fs.readdirSync(actionsDir).filter((f) => f.endsWith('.js'));
|
|
291
|
-
for (const action of existingActions) {
|
|
292
|
-
fs.unlinkSync(path.join(actionsDir, action));
|
|
293
|
-
}
|
|
294
|
-
stdout.print(`${pc.gray(`Cleared ${existingActions.length} existing action(s)`)}`);
|
|
295
|
-
}
|
|
296
|
-
if (fs.existsSync(globalComponentsDir)) {
|
|
297
|
-
const existingGlobalComponents = fs
|
|
298
|
-
.readdirSync(globalComponentsDir)
|
|
299
|
-
.filter((f) => f.endsWith('.location.tsx'));
|
|
300
|
-
for (const component of existingGlobalComponents) {
|
|
301
|
-
fs.unlinkSync(path.join(globalComponentsDir, component));
|
|
302
|
-
}
|
|
303
|
-
stdout.print(`${pc.gray(`Cleared ${existingGlobalComponents.length} existing global component(s)`)}`);
|
|
304
|
-
}
|
|
305
|
-
// Run reverse compiler (pass pullMetadata so config.json gets _version and _branch_id even on fix retry)
|
|
306
|
-
const versionNum = version != null && !isNaN(Number(version)) ? Number(version) : undefined;
|
|
307
|
-
const pullMetadata = {
|
|
308
|
-
version: versionNum,
|
|
309
|
-
branchId: effectiveBranch,
|
|
310
|
-
branchName: effectiveBranchName,
|
|
311
|
-
};
|
|
312
|
-
let usedFix = opts.fix;
|
|
313
|
-
try {
|
|
314
|
-
await reverseCompile(flow, embeddableId, {
|
|
315
|
-
fix: opts.fix,
|
|
316
|
-
preserve: opts.preserve,
|
|
317
|
-
pullMetadata,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
catch (compileError) {
|
|
321
|
-
// If fix mode wasn't already enabled, offer to retry with fix mode
|
|
322
|
-
if (!opts.fix && compileError instanceof Error) {
|
|
323
|
-
stdout.print('');
|
|
324
|
-
stdout.error(pc.red('Error during reverse compile:'));
|
|
325
|
-
stdout.error(pc.yellow(` ${compileError.message}`));
|
|
326
|
-
stdout.print('');
|
|
327
|
-
const response = await prompts({
|
|
328
|
-
type: 'confirm',
|
|
329
|
-
name: 'fix',
|
|
330
|
-
message: 'Would you like to retry with auto-fix enabled? (removes problematic components)',
|
|
331
|
-
initial: true,
|
|
332
|
-
}, {
|
|
333
|
-
onCancel: () => {
|
|
334
|
-
process.exit(1);
|
|
335
|
-
},
|
|
336
|
-
});
|
|
337
|
-
if (response.fix) {
|
|
338
|
-
usedFix = true;
|
|
339
|
-
stdout.print('');
|
|
340
|
-
stdout.print(pc.cyan('Retrying with auto-fix enabled...'));
|
|
341
|
-
stdout.print('');
|
|
342
|
-
await reverseCompile(flow, embeddableId, {
|
|
343
|
-
fix: true,
|
|
344
|
-
preserve: opts.preserve,
|
|
345
|
-
pullMetadata,
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
await exit(1);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
throw compileError;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
// Persist mutated flow when fixes were applied (e.g. parent_key -> parent_id)
|
|
357
|
-
if (usedFix) {
|
|
358
|
-
const flowJson = JSON.stringify(flow, null, 2);
|
|
359
|
-
fs.writeFileSync(outPath, flowJson, 'utf8');
|
|
360
|
-
stdout.print(pc.cyan(`✓ Wrote embeddable JSON to ${outPath} (with fixes applied)`));
|
|
361
|
-
if (version != null) {
|
|
362
|
-
const versionStr = typeof version === 'string' ? version : String(version);
|
|
363
|
-
const versionedBasename = getVersionedBasename(versionStr, branchSlug);
|
|
364
|
-
const versionedPath = path.join(path.dirname(outPath), versionedBasename);
|
|
365
|
-
fs.writeFileSync(versionedPath, flowJson, 'utf8');
|
|
366
|
-
stdout.print(pc.cyan(`✓ Wrote versioned embeddable JSON to ${versionedPath} (with fixes applied)`));
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
logger.info('pull complete', { version: String(pullVersion ?? 'unknown') });
|
|
370
|
-
}
|
|
371
|
-
catch (error) {
|
|
372
|
-
captureException(error);
|
|
373
|
-
stdout.error(`Error pulling embeddable: ${error instanceof Error ? error.message : String(error)}`);
|
|
374
|
-
logger.error('pull failed', { message: error instanceof Error ? error.message : String(error) });
|
|
375
|
-
await exit(1);
|
|
376
|
-
}
|
|
377
|
-
finally {
|
|
378
|
-
// Always persist _version and _branch_id once we've fetched (so config is correct even if reverseCompile failed or was retried with fix)
|
|
379
|
-
if (embeddableId != null && pullVersion !== undefined) {
|
|
380
|
-
writePullMetadataToConfig(embeddableId, pullVersion, effectiveBranch, effectiveBranchName);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
package/dist/commands/save.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { HistoryCommand } from '../types-builder.js';
|
|
2
|
-
export type EditHistoryDescription = {
|
|
3
|
-
origin: string;
|
|
4
|
-
description: string;
|
|
5
|
-
} | {
|
|
6
|
-
overflowed: boolean;
|
|
7
|
-
};
|
|
8
|
-
export type SaveEmbeddableVersionParams = {
|
|
9
|
-
embeddableId: string;
|
|
10
|
-
jsonString: string;
|
|
11
|
-
userId: string;
|
|
12
|
-
projectId: string;
|
|
13
|
-
label?: string;
|
|
14
|
-
fromVersionNumber: number;
|
|
15
|
-
editHistoryLength?: number;
|
|
16
|
-
editHistoryDescriptions?: EditHistoryDescription[];
|
|
17
|
-
workingDraftId?: string;
|
|
18
|
-
editHistoryStorageKey?: string;
|
|
19
|
-
editHistory?: HistoryCommand[];
|
|
20
|
-
branchId?: string | null;
|
|
21
|
-
branchMergedId?: string | null;
|
|
22
|
-
};
|
|
23
|
-
export declare function runSave(opts: {
|
|
24
|
-
id?: string;
|
|
25
|
-
label?: string;
|
|
26
|
-
branch?: string;
|
|
27
|
-
skipBuild?: boolean;
|
|
28
|
-
fromVersion?: string;
|
|
29
|
-
}): Promise<void>;
|
|
30
|
-
//# sourceMappingURL=save.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/commands/save.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,cAAc,EACf,MAAM,qBAAqB,CAAA;AAuC5B,MAAM,MAAM,sBAAsB,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,CAAA;AAE3B,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,uBAAuB,CAAC,EAAE,sBAAsB,EAAE,CAAA;IAClD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,WAAW,CAAC,EAAE,cAAc,EAAE,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B,CAAA;AAkND,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,iBAqBA"}
|