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