@embeddables/cli 0.8.0 → 0.8.1
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/dist/auth/index.d.ts +43 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +102 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +210 -0
- package/dist/command-history.d.ts +13 -0
- package/dist/command-history.d.ts.map +1 -0
- package/dist/command-history.js +34 -0
- package/dist/commands/branch.d.ts +4 -0
- package/dist/commands/branch.d.ts.map +1 -0
- package/dist/commands/branch.js +67 -0
- package/dist/commands/build-workbench.d.ts +5 -0
- package/dist/commands/build-workbench.d.ts.map +1 -0
- package/dist/commands/build-workbench.js +116 -0
- package/dist/commands/build.d.ts +8 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +60 -0
- package/dist/commands/builder-open.d.ts +4 -0
- package/dist/commands/builder-open.d.ts.map +1 -0
- package/dist/commands/builder-open.js +74 -0
- package/dist/commands/dev.d.ts +12 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +226 -0
- package/dist/commands/diff.d.ts +76 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +653 -0
- package/dist/commands/experiments-connect.d.ts +6 -0
- package/dist/commands/experiments-connect.d.ts.map +1 -0
- package/dist/commands/experiments-connect.js +140 -0
- package/dist/commands/feedback.d.ts +29 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +267 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +384 -0
- package/dist/commands/inspect.d.ts +9 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +293 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +117 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +19 -0
- package/dist/commands/pull.d.ts +16 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +395 -0
- package/dist/commands/save.d.ts +30 -0
- package/dist/commands/save.d.ts.map +1 -0
- package/dist/commands/save.js +597 -0
- package/dist/commands/upgrade.d.ts +2 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +50 -0
- package/dist/compiler/errors.d.ts +20 -0
- package/dist/compiler/errors.d.ts.map +1 -0
- package/dist/compiler/errors.js +35 -0
- package/dist/compiler/evalStatic.d.ts +3 -0
- package/dist/compiler/evalStatic.d.ts.map +1 -0
- package/dist/compiler/evalStatic.js +57 -0
- package/dist/compiler/flatten.js +1 -0
- package/dist/compiler/helpers/duplicateIds.d.ts +9 -0
- package/dist/compiler/helpers/duplicateIds.d.ts.map +1 -0
- package/dist/compiler/helpers/duplicateIds.js +71 -0
- package/dist/compiler/helpers/numericLeadingKeys.d.ts +8 -0
- package/dist/compiler/helpers/numericLeadingKeys.d.ts.map +1 -0
- package/dist/compiler/helpers/numericLeadingKeys.js +17 -0
- package/dist/compiler/index.d.ts +18 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +1272 -0
- package/dist/compiler/parsePage.d.ts +15 -0
- package/dist/compiler/parsePage.d.ts.map +1 -0
- package/dist/compiler/parsePage.js +654 -0
- package/dist/compiler/registry.d.ts +4 -0
- package/dist/compiler/registry.d.ts.map +1 -0
- package/dist/compiler/registry.js +44 -0
- package/dist/compiler/reverse.d.ts +23 -0
- package/dist/compiler/reverse.d.ts.map +1 -0
- package/dist/compiler/reverse.js +1920 -0
- package/dist/compiler/types.d.ts +21 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/types.js +1 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +21 -0
- package/dist/components/primitives/BaseComponent.d.ts +33 -0
- package/dist/components/primitives/BaseComponent.d.ts.map +1 -0
- package/dist/components/primitives/BaseComponent.js +26 -0
- package/dist/components/primitives/BookMeeting.d.ts +18 -0
- package/dist/components/primitives/BookMeeting.d.ts.map +1 -0
- package/dist/components/primitives/BookMeeting.js +5 -0
- package/dist/components/primitives/Chart.d.ts +41 -0
- package/dist/components/primitives/Chart.d.ts.map +1 -0
- package/dist/components/primitives/Chart.js +5 -0
- package/dist/components/primitives/Container.d.ts +8 -0
- package/dist/components/primitives/Container.d.ts.map +1 -0
- package/dist/components/primitives/Container.js +5 -0
- package/dist/components/primitives/CustomButton.d.ts +37 -0
- package/dist/components/primitives/CustomButton.d.ts.map +1 -0
- package/dist/components/primitives/CustomButton.js +10 -0
- package/dist/components/primitives/CustomHTML.d.ts +8 -0
- package/dist/components/primitives/CustomHTML.d.ts.map +1 -0
- package/dist/components/primitives/CustomHTML.js +5 -0
- package/dist/components/primitives/FileUpload.d.ts +18 -0
- package/dist/components/primitives/FileUpload.d.ts.map +1 -0
- package/dist/components/primitives/FileUpload.js +16 -0
- package/dist/components/primitives/InputBox.d.ts +34 -0
- package/dist/components/primitives/InputBox.d.ts.map +1 -0
- package/dist/components/primitives/InputBox.js +25 -0
- package/dist/components/primitives/Lottie.d.ts +11 -0
- package/dist/components/primitives/Lottie.d.ts.map +1 -0
- package/dist/components/primitives/Lottie.js +5 -0
- package/dist/components/primitives/MediaEmbed.d.ts +13 -0
- package/dist/components/primitives/MediaEmbed.d.ts.map +1 -0
- package/dist/components/primitives/MediaEmbed.js +6 -0
- package/dist/components/primitives/MediaImage.d.ts +8 -0
- package/dist/components/primitives/MediaImage.d.ts.map +1 -0
- package/dist/components/primitives/MediaImage.js +5 -0
- package/dist/components/primitives/OptionSelector.d.ts +38 -0
- package/dist/components/primitives/OptionSelector.d.ts.map +1 -0
- package/dist/components/primitives/OptionSelector.js +8 -0
- package/dist/components/primitives/PaypalCheckout.d.ts +25 -0
- package/dist/components/primitives/PaypalCheckout.d.ts.map +1 -0
- package/dist/components/primitives/PaypalCheckout.js +5 -0
- package/dist/components/primitives/PlainText.d.ts +6 -0
- package/dist/components/primitives/PlainText.d.ts.map +1 -0
- package/dist/components/primitives/PlainText.js +5 -0
- package/dist/components/primitives/ProgressBar.d.ts +15 -0
- package/dist/components/primitives/ProgressBar.d.ts.map +1 -0
- package/dist/components/primitives/ProgressBar.js +5 -0
- package/dist/components/primitives/RichText.d.ts +6 -0
- package/dist/components/primitives/RichText.d.ts.map +1 -0
- package/dist/components/primitives/RichText.js +5 -0
- package/dist/components/primitives/RichTextMarkdown.d.ts +6 -0
- package/dist/components/primitives/RichTextMarkdown.d.ts.map +1 -0
- package/dist/components/primitives/RichTextMarkdown.js +5 -0
- package/dist/components/primitives/Rive.d.ts +16 -0
- package/dist/components/primitives/Rive.d.ts.map +1 -0
- package/dist/components/primitives/Rive.js +8 -0
- package/dist/components/primitives/StripeCheckout.d.ts +52 -0
- package/dist/components/primitives/StripeCheckout.d.ts.map +1 -0
- package/dist/components/primitives/StripeCheckout.js +5 -0
- package/dist/components/primitives/StripeCheckout2.d.ts +30 -0
- package/dist/components/primitives/StripeCheckout2.d.ts.map +1 -0
- package/dist/components/primitives/StripeCheckout2.js +7 -0
- package/dist/config/index.d.ts +23 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +42 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +9 -0
- package/dist/helpers/TEMP helpers file.d.ts +1 -0
- package/dist/helpers/TEMP helpers file.d.ts.map +1 -0
- package/dist/helpers/TEMP helpers file.js +1 -0
- package/dist/helpers/dates.d.ts +5 -0
- package/dist/helpers/dates.d.ts.map +1 -0
- package/dist/helpers/dates.js +7 -0
- package/dist/helpers/json.d.ts +47 -0
- package/dist/helpers/json.d.ts.map +1 -0
- package/dist/helpers/json.js +622 -0
- package/dist/helpers/prompt.d.ts +15 -0
- package/dist/helpers/prompt.d.ts.map +1 -0
- package/dist/helpers/prompt.js +35 -0
- package/dist/helpers/utils.d.ts +13 -0
- package/dist/helpers/utils.d.ts.map +1 -0
- package/dist/helpers/utils.js +28 -0
- package/dist/logger.d.ts +11 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +21 -0
- package/dist/patches/prompts-escape.d.ts +14 -0
- package/dist/patches/prompts-escape.d.ts.map +1 -0
- package/dist/patches/prompts-escape.js +23 -0
- package/dist/prompts/branches.d.ts +20 -0
- package/dist/prompts/branches.d.ts.map +1 -0
- package/dist/prompts/branches.js +86 -0
- package/dist/prompts/embeddables.d.ts +43 -0
- package/dist/prompts/embeddables.d.ts.map +1 -0
- package/dist/prompts/embeddables.js +200 -0
- package/dist/prompts/experiments.d.ts +28 -0
- package/dist/prompts/experiments.d.ts.map +1 -0
- package/dist/prompts/experiments.js +89 -0
- package/dist/prompts/index.d.ts +11 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +6 -0
- package/dist/prompts/projects.d.ts +22 -0
- package/dist/prompts/projects.d.ts.map +1 -0
- package/dist/prompts/projects.js +92 -0
- package/dist/prompts/versions.d.ts +18 -0
- package/dist/prompts/versions.d.ts.map +1 -0
- package/dist/prompts/versions.js +95 -0
- package/dist/proxy/injectApiInterceptor.d.ts +6 -0
- package/dist/proxy/injectApiInterceptor.d.ts.map +1 -0
- package/dist/proxy/injectApiInterceptor.js +66 -0
- package/dist/proxy/injectReload.d.ts +2 -0
- package/dist/proxy/injectReload.d.ts.map +1 -0
- package/dist/proxy/injectReload.js +14 -0
- package/dist/proxy/injectWorkbench.d.ts +5 -0
- package/dist/proxy/injectWorkbench.d.ts.map +1 -0
- package/dist/proxy/injectWorkbench.js +22 -0
- package/dist/proxy/server.d.ts +11 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +304 -0
- package/dist/proxy/sse.d.ts +5 -0
- package/dist/proxy/sse.d.ts.map +1 -0
- package/dist/proxy/sse.js +17 -0
- package/dist/sentry-context.d.ts +48 -0
- package/dist/sentry-context.d.ts.map +1 -0
- package/dist/sentry-context.js +156 -0
- package/dist/stdout.d.ts +61 -0
- package/dist/stdout.d.ts.map +1 -0
- package/dist/stdout.js +163 -0
- package/dist/types-builder.d.ts +800 -0
- package/dist/types-builder.d.ts.map +1 -0
- package/dist/types-builder.js +20 -0
- package/dist/workbench/ActionsPanel.d.ts +6 -0
- package/dist/workbench/ActionsPanel.d.ts.map +1 -0
- package/dist/workbench/ActionsPanel.js +47 -0
- package/dist/workbench/AutofillPanel.d.ts +6 -0
- package/dist/workbench/AutofillPanel.d.ts.map +1 -0
- package/dist/workbench/AutofillPanel.js +543 -0
- package/dist/workbench/ComputedFieldsPanel.d.ts +6 -0
- package/dist/workbench/ComputedFieldsPanel.d.ts.map +1 -0
- package/dist/workbench/ComputedFieldsPanel.js +31 -0
- package/dist/workbench/ExperimentsPanel.d.ts +6 -0
- package/dist/workbench/ExperimentsPanel.d.ts.map +1 -0
- package/dist/workbench/ExperimentsPanel.js +182 -0
- package/dist/workbench/FieldEditorPanel.d.ts +9 -0
- package/dist/workbench/FieldEditorPanel.d.ts.map +1 -0
- package/dist/workbench/FieldEditorPanel.js +650 -0
- package/dist/workbench/InspectorPanel.d.ts +6 -0
- package/dist/workbench/InspectorPanel.d.ts.map +1 -0
- package/dist/workbench/InspectorPanel.js +341 -0
- package/dist/workbench/PageNavigator.d.ts +6 -0
- package/dist/workbench/PageNavigator.d.ts.map +1 -0
- package/dist/workbench/PageNavigator.js +123 -0
- package/dist/workbench/SchemaPanel.d.ts +6 -0
- package/dist/workbench/SchemaPanel.d.ts.map +1 -0
- package/dist/workbench/SchemaPanel.js +222 -0
- package/dist/workbench/UserDataPanel.d.ts +6 -0
- package/dist/workbench/UserDataPanel.d.ts.map +1 -0
- package/dist/workbench/UserDataPanel.js +350 -0
- package/dist/workbench/WorkbenchApp.d.ts +7 -0
- package/dist/workbench/WorkbenchApp.d.ts.map +1 -0
- package/dist/workbench/WorkbenchApp.js +193 -0
- package/dist/workbench/cloudflare-worker/README.md +31 -0
- package/dist/workbench/cloudflare-worker/public/workbench.css +1614 -0
- package/dist/workbench/cloudflare-worker/public/workbench.js +77 -0
- package/dist/workbench/cloudflare-worker/worker.js +40 -0
- package/dist/workbench/cloudflare-worker/wrangler.toml +10 -0
- package/dist/workbench/index.d.ts +10 -0
- package/dist/workbench/index.d.ts.map +1 -0
- package/dist/workbench/index.js +44 -0
- package/dist/workbench/workbench.css +1614 -0
- package/dist/workbench/workbench.js +77 -0
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { compileAllPages } from '../compiler/index.js';
|
|
3
|
+
import { formatError } from '../compiler/errors.js';
|
|
4
|
+
import { promptForLocalEmbeddable } from '../prompts/index.js';
|
|
5
|
+
import { captureException, createLogger, exit } from '../logger.js';
|
|
6
|
+
import { getSentryContextFromEmbeddableConfig, getSentryContextFromProjectConfig, setSentryContext, } from '../sentry-context.js';
|
|
7
|
+
import * as stdout from '../stdout.js';
|
|
8
|
+
import { inferEmbeddableFromCwd } from '../helpers/utils.js';
|
|
9
|
+
export async function runBuild(opts) {
|
|
10
|
+
const logger = createLogger('runBuild');
|
|
11
|
+
const inferred = inferEmbeddableFromCwd();
|
|
12
|
+
let embeddableId = opts.id ?? inferred?.embeddableId;
|
|
13
|
+
if (inferred && !opts.id && embeddableId) {
|
|
14
|
+
process.chdir(inferred.projectRoot);
|
|
15
|
+
}
|
|
16
|
+
setSentryContext(getSentryContextFromProjectConfig());
|
|
17
|
+
if (!embeddableId) {
|
|
18
|
+
const selected = await promptForLocalEmbeddable({
|
|
19
|
+
message: 'Select an embeddable to build:',
|
|
20
|
+
});
|
|
21
|
+
if (!selected) {
|
|
22
|
+
logger.error('no embeddable selected');
|
|
23
|
+
await exit(1);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
embeddableId = selected;
|
|
27
|
+
}
|
|
28
|
+
if (embeddableId) {
|
|
29
|
+
setSentryContext({
|
|
30
|
+
embeddable: { id: embeddableId },
|
|
31
|
+
...getSentryContextFromEmbeddableConfig(embeddableId),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
logger.info('build started');
|
|
35
|
+
const pagesGlob = opts.pages || `embeddables/${embeddableId}/pages/**/*.page.tsx`;
|
|
36
|
+
const outPath = opts.out || path.join('embeddables', embeddableId, '.generated', 'embeddable.json');
|
|
37
|
+
const stylesDir = path.join('embeddables', embeddableId, 'styles');
|
|
38
|
+
const elapsed = stdout.timer();
|
|
39
|
+
try {
|
|
40
|
+
await stdout.withSpinner('Building…', async () => {
|
|
41
|
+
await compileAllPages({
|
|
42
|
+
pagesGlob,
|
|
43
|
+
outPath,
|
|
44
|
+
pageKeyFrom: opts.pageKeyFrom,
|
|
45
|
+
stylesDir,
|
|
46
|
+
embeddableId: embeddableId,
|
|
47
|
+
fixLint: opts.fix ? true : 'prompt',
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
stdout.gap();
|
|
51
|
+
stdout.successBox(`Built in ${elapsed()} ${stdout.symbols.bolt} ${stdout.randomMessage('build')}`);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
captureException(e);
|
|
55
|
+
stdout.error(formatError(e));
|
|
56
|
+
logger.error('build failed');
|
|
57
|
+
await exit(1);
|
|
58
|
+
}
|
|
59
|
+
logger.info('build complete');
|
|
60
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-open.d.ts","sourceRoot":"","sources":["../../src/commands/builder-open.ts"],"names":[],"mappings":"AA0BA,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,iBAgEzD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import { isLoggedIn } from '../auth/index.js';
|
|
4
|
+
import { getProjectId, writeProjectConfig } from '../config/index.js';
|
|
5
|
+
import { promptForProject, promptForLocalEmbeddable } from '../prompts/index.js';
|
|
6
|
+
import { createLogger, exit } from '../logger.js';
|
|
7
|
+
import { getSentryContextFromEmbeddableConfig, getSentryContextFromProjectConfig, setSentryContext, } from '../sentry-context.js';
|
|
8
|
+
import * as stdout from '../stdout.js';
|
|
9
|
+
import { inferEmbeddableFromCwd } from '../helpers/utils.js';
|
|
10
|
+
function openUrl(url) {
|
|
11
|
+
const platform = process.platform;
|
|
12
|
+
const cmd = platform === 'darwin' ? 'open' : platform === 'win32' ? 'start' : 'xdg-open';
|
|
13
|
+
exec(`${cmd} ${JSON.stringify(url)}`, (err) => {
|
|
14
|
+
if (err) {
|
|
15
|
+
stdout.warn('Could not open browser automatically. Please open the URL manually.');
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export async function runBuilderOpen(opts) {
|
|
20
|
+
const logger = createLogger('runBuilderOpen');
|
|
21
|
+
const inferred = inferEmbeddableFromCwd();
|
|
22
|
+
let embeddableId = opts.id ?? inferred?.embeddableId;
|
|
23
|
+
if (inferred && !opts.id && embeddableId) {
|
|
24
|
+
process.chdir(inferred.projectRoot);
|
|
25
|
+
}
|
|
26
|
+
setSentryContext(getSentryContextFromProjectConfig());
|
|
27
|
+
let projectId = getProjectId();
|
|
28
|
+
if (!projectId) {
|
|
29
|
+
if (!isLoggedIn()) {
|
|
30
|
+
stdout.warn('No project configured and not logged in.');
|
|
31
|
+
stdout.dim('Run "embeddables login" first, or add a project_id to embeddables.json.');
|
|
32
|
+
logger.error('no project id and not logged in');
|
|
33
|
+
await exit(1);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
stdout.step('No project configured. Fetching projects…');
|
|
37
|
+
const selectedProject = await promptForProject();
|
|
38
|
+
if (!selectedProject) {
|
|
39
|
+
logger.error('project selection failed');
|
|
40
|
+
await exit(1);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
projectId = selectedProject.id;
|
|
44
|
+
writeProjectConfig({
|
|
45
|
+
org_id: selectedProject.org_id || undefined,
|
|
46
|
+
org_title: selectedProject.org_title || undefined,
|
|
47
|
+
project_id: projectId,
|
|
48
|
+
project_name: selectedProject.title || undefined,
|
|
49
|
+
});
|
|
50
|
+
stdout.success('Saved project to embeddables.json');
|
|
51
|
+
stdout.gap();
|
|
52
|
+
}
|
|
53
|
+
if (!embeddableId) {
|
|
54
|
+
const selected = await promptForLocalEmbeddable({
|
|
55
|
+
message: 'Select an embeddable to open in the Builder:',
|
|
56
|
+
});
|
|
57
|
+
if (!selected) {
|
|
58
|
+
logger.error('no embeddable selected');
|
|
59
|
+
await exit(1);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
embeddableId = selected;
|
|
63
|
+
stdout.gap();
|
|
64
|
+
}
|
|
65
|
+
if (embeddableId) {
|
|
66
|
+
setSentryContext({
|
|
67
|
+
embeddable: { id: embeddableId },
|
|
68
|
+
...getSentryContextFromEmbeddableConfig(embeddableId),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const url = `https://app.embeddables.com/project/${projectId}/embeddables/${embeddableId}/edit`;
|
|
72
|
+
stdout.success(`Opening Builder: ${pc.underline(url)}`);
|
|
73
|
+
openUrl(url);
|
|
74
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function runDev(opts: {
|
|
2
|
+
id?: string;
|
|
3
|
+
pages?: string;
|
|
4
|
+
out?: string;
|
|
5
|
+
fix?: boolean;
|
|
6
|
+
local?: boolean;
|
|
7
|
+
engine: string;
|
|
8
|
+
port: string;
|
|
9
|
+
overrideRoute: string;
|
|
10
|
+
pageKeyFrom: 'filename' | 'export';
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAoHA,wBAAsB,MAAM,CAAC,IAAI,EAAE;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,UAAU,GAAG,QAAQ,CAAA;CACnC,iBAwJA"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import net from 'node:net';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import chokidar from 'chokidar';
|
|
5
|
+
import pc from 'picocolors';
|
|
6
|
+
import { compileAllPages } from '../compiler/index.js';
|
|
7
|
+
import { startProxyServer } from '../proxy/server.js';
|
|
8
|
+
import { formatError } from '../compiler/errors.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
|
+
* Check whether a port is available by attempting to listen on it.
|
|
15
|
+
*/
|
|
16
|
+
function isPortAvailable(port) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const server = net.createServer();
|
|
19
|
+
server.once('error', () => resolve(false));
|
|
20
|
+
server.once('listening', () => {
|
|
21
|
+
server.close(() => resolve(true));
|
|
22
|
+
});
|
|
23
|
+
server.listen(port);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Starting from `startPort`, find the first available port.
|
|
28
|
+
* Tries up to `maxAttempts` consecutive ports.
|
|
29
|
+
*/
|
|
30
|
+
async function getAvailablePort(startPort, maxAttempts = 20) {
|
|
31
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
32
|
+
const port = startPort + i;
|
|
33
|
+
if (await isPortAvailable(port)) {
|
|
34
|
+
return port;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Could not find an available port (tried ${startPort}–${startPort + maxAttempts - 1})`);
|
|
38
|
+
}
|
|
39
|
+
async function discoverEmbeddables() {
|
|
40
|
+
const embeddablesDir = 'embeddables';
|
|
41
|
+
if (!fs.existsSync(embeddablesDir)) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const entries = fs.readdirSync(embeddablesDir, { withFileTypes: true });
|
|
45
|
+
const embeddables = [];
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
if (!entry.isDirectory())
|
|
48
|
+
continue;
|
|
49
|
+
const id = entry.name;
|
|
50
|
+
const metadataPath = path.join(embeddablesDir, id, 'metadata.json');
|
|
51
|
+
let title = null;
|
|
52
|
+
if (fs.existsSync(metadataPath)) {
|
|
53
|
+
try {
|
|
54
|
+
const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
|
|
55
|
+
title = metadata.title || null;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Ignore JSON parse errors
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
embeddables.push({ id, title });
|
|
62
|
+
}
|
|
63
|
+
// Sort by title (with title) first, then by id
|
|
64
|
+
return embeddables.sort((a, b) => {
|
|
65
|
+
if (a.title && !b.title)
|
|
66
|
+
return -1;
|
|
67
|
+
if (!a.title && b.title)
|
|
68
|
+
return 1;
|
|
69
|
+
const aLabel = a.title || a.id;
|
|
70
|
+
const bLabel = b.title || b.id;
|
|
71
|
+
return aLabel.localeCompare(bLabel, undefined, { sensitivity: 'base' });
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async function promptForEmbeddable() {
|
|
75
|
+
const embeddables = await discoverEmbeddables();
|
|
76
|
+
if (embeddables.length === 0) {
|
|
77
|
+
stdout.error('No embeddables found in the embeddables/ directory.');
|
|
78
|
+
stdout.dim('Run `embeddables pull --id <id>` to pull an embeddable first.');
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const choices = embeddables.map((e) => ({
|
|
82
|
+
title: e.title ? `${e.title} (${e.id})` : e.id,
|
|
83
|
+
value: e.id,
|
|
84
|
+
}));
|
|
85
|
+
const { prompt: promptWithCancel } = await import('../helpers/prompt.js');
|
|
86
|
+
const response = await promptWithCancel({
|
|
87
|
+
type: 'select',
|
|
88
|
+
name: 'id',
|
|
89
|
+
message: 'Select an embeddable to run:',
|
|
90
|
+
choices,
|
|
91
|
+
});
|
|
92
|
+
return response.id || null;
|
|
93
|
+
}
|
|
94
|
+
export async function runDev(opts) {
|
|
95
|
+
const logger = createLogger('runDev');
|
|
96
|
+
const inferred = inferEmbeddableFromCwd();
|
|
97
|
+
let embeddableId = opts.id ?? inferred?.embeddableId;
|
|
98
|
+
if (inferred && !opts.id && embeddableId) {
|
|
99
|
+
process.chdir(inferred.projectRoot);
|
|
100
|
+
}
|
|
101
|
+
setSentryContext(getSentryContextFromProjectConfig());
|
|
102
|
+
if (!embeddableId) {
|
|
103
|
+
const selected = await promptForEmbeddable();
|
|
104
|
+
if (!selected) {
|
|
105
|
+
logger.error('no embeddable selected');
|
|
106
|
+
await exit(1);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
embeddableId = selected;
|
|
110
|
+
}
|
|
111
|
+
if (embeddableId) {
|
|
112
|
+
setSentryContext({
|
|
113
|
+
embeddable: { id: embeddableId },
|
|
114
|
+
...getSentryContextFromEmbeddableConfig(embeddableId),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
logger.info('dev started', { engine: opts.engine, port: opts.port });
|
|
118
|
+
const pagesGlob = opts.pages || `embeddables/${embeddableId}/pages/**/*.page.tsx`;
|
|
119
|
+
const outPath = opts.out || path.join('embeddables', embeddableId, '.generated', 'embeddable.json');
|
|
120
|
+
const stylesDir = path.join('embeddables', embeddableId, 'styles');
|
|
121
|
+
const stylesGlob = `embeddables/${embeddableId}/styles/**/*.css`;
|
|
122
|
+
const configPath = path.join('embeddables', embeddableId, 'config.json');
|
|
123
|
+
const globalComponentsGlob = `embeddables/${embeddableId}/global-components/**/*.location.tsx`;
|
|
124
|
+
const computedFieldsGlob = `embeddables/${embeddableId}/computed-fields/**/*.js`;
|
|
125
|
+
const actionsGlob = `embeddables/${embeddableId}/actions/**/*.js`;
|
|
126
|
+
const fixLint = opts.fix ? true : 'prompt';
|
|
127
|
+
// Initial build with spinner
|
|
128
|
+
try {
|
|
129
|
+
await stdout.withSpinner('Building…', async () => {
|
|
130
|
+
await compileAllPages({
|
|
131
|
+
pagesGlob,
|
|
132
|
+
outPath,
|
|
133
|
+
pageKeyFrom: opts.pageKeyFrom,
|
|
134
|
+
stylesDir,
|
|
135
|
+
embeddableId: embeddableId,
|
|
136
|
+
configPath,
|
|
137
|
+
fixLint,
|
|
138
|
+
});
|
|
139
|
+
}, {
|
|
140
|
+
successText: 'Initial build complete',
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
captureException(e);
|
|
145
|
+
stdout.error(formatError(e));
|
|
146
|
+
logger.error('initial build failed');
|
|
147
|
+
await exit(1);
|
|
148
|
+
}
|
|
149
|
+
// Start proxy — find an available port if the requested one is taken
|
|
150
|
+
const requestedPort = Number(opts.port);
|
|
151
|
+
let port;
|
|
152
|
+
try {
|
|
153
|
+
port = await getAvailablePort(requestedPort);
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
captureException(e);
|
|
157
|
+
stdout.error(e.message);
|
|
158
|
+
logger.error('no available port', { requestedPort });
|
|
159
|
+
await exit(1);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (port !== requestedPort) {
|
|
163
|
+
stdout.warn(`Port ${requestedPort} is in use, using ${port} instead.`);
|
|
164
|
+
}
|
|
165
|
+
// Mute proxy startup logs (workbench, routes, etc.) — the Dev Server box has all the info
|
|
166
|
+
stdout.mute();
|
|
167
|
+
const proxy = await startProxyServer({
|
|
168
|
+
port,
|
|
169
|
+
engineOrigin: opts.engine,
|
|
170
|
+
overrideRoute: opts.overrideRoute,
|
|
171
|
+
generatedJsonPath: outPath,
|
|
172
|
+
embeddableId,
|
|
173
|
+
watchWorkbench: true,
|
|
174
|
+
});
|
|
175
|
+
stdout.unmute();
|
|
176
|
+
logger.info('dev server running', { port });
|
|
177
|
+
// Watch all source files: pages, styles, config, global components, computed fields, and actions
|
|
178
|
+
const watcher = chokidar.watch([pagesGlob, stylesGlob, configPath, globalComponentsGlob, computedFieldsGlob, actionsGlob], {
|
|
179
|
+
ignoreInitial: true,
|
|
180
|
+
});
|
|
181
|
+
const rebuild = async () => {
|
|
182
|
+
const elapsed = stdout.timer();
|
|
183
|
+
const s = stdout.spinner('Rebuilding…');
|
|
184
|
+
try {
|
|
185
|
+
await compileAllPages({
|
|
186
|
+
pagesGlob,
|
|
187
|
+
outPath,
|
|
188
|
+
pageKeyFrom: opts.pageKeyFrom,
|
|
189
|
+
stylesDir,
|
|
190
|
+
embeddableId: embeddableId,
|
|
191
|
+
configPath,
|
|
192
|
+
fixLint,
|
|
193
|
+
});
|
|
194
|
+
proxy.broadcastReload();
|
|
195
|
+
s.succeed(`Rebuilt in ${elapsed()}`);
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
// Keep dev server running; compiler errors show in console.
|
|
199
|
+
// (Proxy will still serve the last good JSON.)
|
|
200
|
+
captureException(e);
|
|
201
|
+
s.fail('Rebuild failed');
|
|
202
|
+
stdout.error(formatError(e));
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
let t;
|
|
206
|
+
watcher.on('all', () => {
|
|
207
|
+
clearTimeout(t);
|
|
208
|
+
t = setTimeout(rebuild, 80);
|
|
209
|
+
});
|
|
210
|
+
// Embeddable context
|
|
211
|
+
stdout.infoBox(`ID: ${embeddableId} · Engine: ${opts.engine}`);
|
|
212
|
+
// Dev server ready box
|
|
213
|
+
const previewUrl = `http://localhost:${port}?id=${embeddableId}&version=latest`;
|
|
214
|
+
const modeLabel = opts.local
|
|
215
|
+
? `${pc.blue('Local')} (${opts.engine})`
|
|
216
|
+
: `${pc.yellow('Remote')} (${opts.engine})`;
|
|
217
|
+
const boxContent = [
|
|
218
|
+
`${pc.gray('Mode:')} ${modeLabel}`,
|
|
219
|
+
`${pc.gray('Preview:')} ${pc.underline(pc.cyan(previewUrl))}`,
|
|
220
|
+
'',
|
|
221
|
+
`${pc.gray(`Watching embeddables/${embeddableId}/ for changes…`)}`,
|
|
222
|
+
].join('\n');
|
|
223
|
+
stdout.gap();
|
|
224
|
+
stdout.box(boxContent, { title: 'Dev Server', borderColor: 'green' });
|
|
225
|
+
stdout.gap();
|
|
226
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export type DiffDepth = 'pages' | 'components' | 'props';
|
|
2
|
+
export type RunDiffOptions = {
|
|
3
|
+
id?: string;
|
|
4
|
+
from?: string;
|
|
5
|
+
to?: string;
|
|
6
|
+
depth?: DiffDepth;
|
|
7
|
+
color?: boolean;
|
|
8
|
+
engine?: string;
|
|
9
|
+
branch?: string;
|
|
10
|
+
};
|
|
11
|
+
export interface PageDiff {
|
|
12
|
+
key: string;
|
|
13
|
+
title?: string;
|
|
14
|
+
status: 'added' | 'removed' | 'modified';
|
|
15
|
+
components?: ComponentDiff[];
|
|
16
|
+
}
|
|
17
|
+
export interface ComponentDiff {
|
|
18
|
+
id: string;
|
|
19
|
+
key?: string;
|
|
20
|
+
type?: string;
|
|
21
|
+
status: 'added' | 'removed' | 'modified';
|
|
22
|
+
props?: PropDiff[];
|
|
23
|
+
}
|
|
24
|
+
export interface PropDiff {
|
|
25
|
+
name: string;
|
|
26
|
+
status: 'added' | 'removed' | 'changed';
|
|
27
|
+
from?: unknown;
|
|
28
|
+
to?: unknown;
|
|
29
|
+
}
|
|
30
|
+
export interface SectionDiff {
|
|
31
|
+
name: string;
|
|
32
|
+
status: 'added' | 'removed' | 'modified';
|
|
33
|
+
}
|
|
34
|
+
export interface DiffSummary {
|
|
35
|
+
pagesAdded: number;
|
|
36
|
+
pagesRemoved: number;
|
|
37
|
+
pagesModified: number;
|
|
38
|
+
componentsAdded: number;
|
|
39
|
+
componentsRemoved: number;
|
|
40
|
+
componentsModified: number;
|
|
41
|
+
propsAdded: number;
|
|
42
|
+
propsRemoved: number;
|
|
43
|
+
propsChanged: number;
|
|
44
|
+
}
|
|
45
|
+
export interface DiffResult {
|
|
46
|
+
pages: PageDiff[];
|
|
47
|
+
globalComponents: ComponentDiff[];
|
|
48
|
+
sections: SectionDiff[];
|
|
49
|
+
summary: DiffSummary;
|
|
50
|
+
}
|
|
51
|
+
type Colorizer = {
|
|
52
|
+
red: (s: string) => string;
|
|
53
|
+
green: (s: string) => string;
|
|
54
|
+
yellow: (s: string) => string;
|
|
55
|
+
gray: (s: string) => string;
|
|
56
|
+
bold: (s: string) => string;
|
|
57
|
+
cyan: (s: string) => string;
|
|
58
|
+
dim: (s: string) => string;
|
|
59
|
+
white: (s: string) => string;
|
|
60
|
+
};
|
|
61
|
+
export interface ParsedVersionSpec {
|
|
62
|
+
version: string;
|
|
63
|
+
branch?: string;
|
|
64
|
+
}
|
|
65
|
+
export declare function parseVersionSpecifier(spec: string): ParsedVersionSpec;
|
|
66
|
+
export declare function versionLabel(spec: ParsedVersionSpec): string;
|
|
67
|
+
export declare function resolveLocalVersion(embeddableId: string): Promise<Record<string, unknown>>;
|
|
68
|
+
export declare function fetchCloudVersion(embeddableId: string, version: string, opts: {
|
|
69
|
+
engine?: string;
|
|
70
|
+
branch?: string;
|
|
71
|
+
}): Promise<Record<string, unknown>>;
|
|
72
|
+
export declare function computeDiff(from: Record<string, unknown>, to: Record<string, unknown>, depth: DiffDepth): DiffResult;
|
|
73
|
+
export declare function renderDiff(diff: DiffResult, depth: DiffDepth, c: Colorizer): string[];
|
|
74
|
+
export declare function runDiff(opts: RunDiffOptions): Promise<void>;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|