@wix/cli
Version:
CLI tool for building Wix sites and applications
1,599 lines (1,543 loc) • 83.4 kB
JavaScript
import { createRequire as _createRequire } from 'node:module';
const require = _createRequire(import.meta.url);
import {
useTunnel
} from "./chunk-MG5MUFY3.js";
import {
useWixCliAppBi
} from "./chunk-CKNVM7JY.js";
import {
LifecycleState,
LinkClickTip,
OverrideType,
RedirectLink,
looseComponentSchema,
parseLooseAppManifest,
useDevCenterOverridesClient,
useUpdateDeploymentTopologyForApp,
useUpdateDeploymentTopologyForSite
} from "./chunk-EA4ZV7ZO.js";
import {
PlatformLink
} from "./chunk-BUPV3T3K.js";
import {
OnboardingState,
useVeloClient
} from "./chunk-ZJ4HTMFG.js";
import "./chunk-DGC6KEUB.js";
import "./chunk-QRGKMYDD.js";
import "./chunk-CKNI3TGO.js";
import "./chunk-YLCFL3QA.js";
import {
ComponentType,
useDevCenterClient
} from "./chunk-BHWSM372.js";
import {
createPackageManager,
getRepoType
} from "./chunk-7QJUAJW3.js";
import {
execa
} from "./chunk-NMCF7XG5.js";
import "./chunk-MHV22UIU.js";
import {
createAstroLogger
} from "./chunk-7BABMGCW.js";
import {
useProjectModel,
useSiteConfig
} from "./chunk-OQJA5FSX.js";
import {
ASTRO_APP_CONFIG_PATH,
astroAppConfigSchema,
devMetadataSchema,
getAstroAppConfigPath,
getDebugLogPath
} from "./chunk-KCDAY54L.js";
import {
useHttpClient
} from "./chunk-FYLO6WOU.js";
import {
usePanoramaMethodLogger
} from "./chunk-3B6VL2WO.js";
import "./chunk-7QTVQZAE.js";
import {
BiProvider,
ErrorViewer,
TimeoutError,
getHttpErrorInfo,
isHttpValidationError,
openBrowser,
pRetry,
pWaitFor,
resolveUrl,
serializer,
toURLSearchParams,
useBiLogger,
useDebugLog,
useErrorReporter
} from "./chunk-CCWE4DS6.js";
import {
createEnv,
extractHttpError,
wixCliAction,
wixCliAppFlowStepsAnswers
} from "./chunk-U5H3SP3I.js";
import {
I18nProvider,
Trans,
useTranslation
} from "./chunk-TIVTYCB2.js";
import "./chunk-RPTAJN5Y.js";
import {
Alert,
Badge,
Box_default,
ConfirmInput,
Key,
PointerIcon,
SelectInput,
SelectOptionAvailability,
Spinner,
Text,
useAsync,
useAsyncCallback,
useExit,
use_input_default
} from "./chunk-UC5LTXTA.js";
import "./chunk-5VIJC5EU.js";
import "./chunk-MZDJNQLB.js";
import {
require_react
} from "./chunk-QNHANFRW.js";
import {
stripAnsi
} from "./chunk-AFPDHQYI.js";
import "./chunk-HYKBBZLS.js";
import "./chunk-C5RTKQVL.js";
import {
readUserConfig,
updateUserConfig
} from "./chunk-4EJ5VQTT.js";
import "./chunk-4UTFAKA5.js";
import "./chunk-LU3R3EBR.js";
import {
getTestOverrides
} from "./chunk-XZUGLEBK.js";
import {
outputDir,
pathExists,
readJson,
writeJson
} from "./chunk-TLLAD5LU.js";
import {
external_exports
} from "./chunk-SDLCFZRL.js";
import {
CliError,
CliErrorCode,
normalizeError,
require_lib
} from "./chunk-CO5A7CZG.js";
import {
__toESM,
init_esm_shims
} from "./chunk-EXLZF52D.js";
// ../cli-astro-commands/src/components/DevCommand/index.ts
init_esm_shims();
// ../cli-astro-commands/src/components/DevCommand/DevCommand.tsx
init_esm_shims();
var import_react32 = __toESM(require_react(), 1);
var import_variant14 = __toESM(require_lib(), 1);
// ../cli-astro-commands/src/components/DevCommand/utils/runAstroDev.ts
init_esm_shims();
var EVENT_LINE = "line";
var EVENT_SERVER_ADDRESS = "server_address";
function runAstroDev({
packageManager,
projectFolder,
port,
allowedHosts
}) {
const binaryArgs = ["astro", "dev"];
if (port) {
binaryArgs.push("--port", `${port}`);
}
if (allowedHosts) {
binaryArgs.push("--allowed-hosts", allowedHosts);
}
const { file, args } = packageManager.getRunBinaryCmd(binaryArgs);
const result = execa(file, args, {
cwd: projectFolder,
stdio: "pipe",
env: { FORCE_COLOR: "1" },
cleanup: true,
windowsHide: false
});
let stdoutBuffer = "";
result.stdout?.on("data", (chunk) => {
stdoutBuffer += chunk.toString();
const lines = stdoutBuffer.split("\n");
stdoutBuffer = lines.pop() ?? "";
for (const line of lines) {
result.stdout?.emit(EVENT_LINE, line);
if (line.includes("http://")) {
const match11 = /(http:\/\/[^\s]+)/.exec(line);
if (match11?.[1]) {
const address = stripAnsi(match11[1]).trim();
result.stdout?.emit(EVENT_SERVER_ADDRESS, address);
}
}
}
});
let stdErrBuffer = "";
result.stderr?.on("data", (chunk) => {
stdErrBuffer += chunk.toString();
const lines = stdErrBuffer.split("\n");
stdErrBuffer = lines.pop() ?? "";
for (const line of lines) {
result.stderr?.emit(EVENT_LINE, line);
}
});
return result;
}
// ../cli-astro-commands/src/components/DevCommand/utils/useAstroLogger.tsx
init_esm_shims();
var import_react = __toESM(require_react(), 1);
// ../cli-astro-commands/src/components/DevCommand/utils/devLogStream.tsx
init_esm_shims();
import { EOL } from "node:os";
import { createWriteStream } from "node:fs";
import { PassThrough } from "node:stream";
import { pipeline } from "node:stream/promises";
import { dirname } from "node:path";
var streamCache = /* @__PURE__ */ new Map();
var createNoopStream = () => ({
write: () => {
},
close: () => {
},
isClosed: () => true
});
var getDevLogStream = async (options) => {
const { filePath } = options;
const entry = streamCache.get(filePath);
if (entry && !entry.stream.isClosed()) {
entry.refCount++;
return {
write: (msg) => entry.stream.write(msg),
release: () => {
entry.refCount--;
if (entry.refCount === 0) {
entry.stream.close();
streamCache.delete(filePath);
}
}
};
}
let stream;
try {
stream = await createDevLogStream(options);
} catch {
stream = createNoopStream();
}
const newEntry = { stream, refCount: 1 };
streamCache.set(filePath, newEntry);
return {
write: (msg) => newEntry.stream.write(msg),
release: () => {
newEntry.refCount--;
if (newEntry.refCount === 0) {
newEntry.stream.close();
streamCache.delete(filePath);
}
}
};
};
var createDevLogStream = async ({ filePath }) => {
await outputDir(dirname(filePath));
const source = new PassThrough();
const fileStream = createWriteStream(filePath, { flags: "w" });
let closed = false;
const isClosed = () => closed;
pipeline(source, fileStream).catch(() => {
if (!closed) {
closed = true;
}
});
const write = (msg) => {
if (closed) {
return;
}
source.write(stripAnsi(msg).concat(EOL));
};
const close = () => {
if (closed) {
return;
}
closed = true;
source.end();
};
return {
write,
close,
isClosed
};
};
// ../cli-astro-commands/src/components/DevCommand/utils/useAstroLogger.tsx
var FORMAT_REGEXP = /^\d{1,2}:\d{1,2}:\d{1,2}\s*/;
var formatMessage = (msg, type = "info") => `[${(/* @__PURE__ */ new Date()).toISOString()}] [cli] [${type}] ${stripAnsi(msg).replace(FORMAT_REGEXP, "")}`;
var useAstroLogger = ({
isPrefixed = true
} = {}) => {
const {
model: { projectFolder }
} = useProjectModel();
const streamRef = (0, import_react.useRef)();
const logger = (0, import_react.useMemo)(
() => createAstroLogger({
isPrefixed,
onLog: (msg) => {
streamRef.current?.write(formatMessage(msg));
},
onError: (msg) => {
streamRef.current?.write(formatMessage(msg, "error"));
}
}),
[isPrefixed]
);
(0, import_react.useEffect)(() => {
let shouldCleanStream = false;
void getDevLogStream({
filePath: getDebugLogPath(projectFolder)
}).then((devLogStream) => {
if (shouldCleanStream) {
devLogStream.release();
return;
}
streamRef.current = devLogStream;
});
return () => {
shouldCleanStream = true;
streamRef.current?.release();
};
}, [projectFolder]);
return logger;
};
// ../cli-astro-commands/src/components/DevCommand/hooks/useFetchDevMetadata.ts
init_esm_shims();
function useFetchDevMetadata() {
const http = useHttpClient({ type: "standalone" });
return useAsyncCallback(async (_, serverLocalUrl) => {
const url = new URL("/_wix/dev-metadata.json", serverLocalUrl);
try {
const { data } = await http.get(url.toString());
return {
devMetadata: devMetadataSchema.parse(data),
serverLocalUrl
};
} catch {
return {
devMetadata: null,
serverLocalUrl
};
}
});
}
// ../cli-astro-commands/src/components/DevCommand/DevScreenBorder.tsx
init_esm_shims();
var import_react2 = __toESM(require_react(), 1);
var DevScreenBorder = ({ children }) => {
return /* @__PURE__ */ import_react2.default.createElement(
Box_default,
{
flexDirection: "column",
borderTop: true,
borderLeft: false,
borderBottom: false,
borderRight: false,
borderStyle: "round",
borderColor: "blueBright",
width: "95%"
},
children
);
};
// ../cli-astro-commands/src/components/DevCommand/SiteDevFlow.tsx
init_esm_shims();
var import_react9 = __toESM(require_react(), 1);
// ../cli-astro-commands/src/components/DevCommand/DevEnvironment.tsx
init_esm_shims();
var import_react6 = __toESM(require_react(), 1);
// ../cli-astro-commands/src/components/DevCommand/hooks/useDevCenterUpdater.tsx
init_esm_shims();
var import_react4 = __toESM(require_react(), 1);
var import_variant2 = __toESM(require_lib(), 1);
// ../cli-astro-commands/src/files/app.config.ts
init_esm_shims();
async function readAppConfig(projectFolder, writeDebugLog) {
const configPath = getAstroAppConfigPath(projectFolder);
const isConfigExist = await pathExists(configPath);
if (!isConfigExist) {
return null;
}
try {
const json = await readJson(configPath);
const appConfig = await astroAppConfigSchema.safeParseAsync(json);
if (!appConfig.success) {
return null;
}
return appConfig.data;
} catch (e) {
writeDebugLog?.(e);
return null;
}
}
async function saveAppConfig(projectFolder, config) {
const currentConfig = await readAppConfig(projectFolder) ?? {};
const newConfig = {
...currentConfig,
...config
};
await writeJson(getAstroAppConfigPath(projectFolder), newConfig);
}
// ../cli-astro-commands/src/components/DevCommand/hooks/useFetchAppManifest.ts
init_esm_shims();
var import_react3 = __toESM(require_react(), 1);
// ../cli-astro-commands/src/components/DevCommand/utils/isTunnelRequired.ts
init_esm_shims();
function isTunnelRequired(appManifest) {
for (const extension of appManifest.components) {
const knownAppManifest = parseKnownExtensionManifest(extension);
if (knownAppManifest != null && knownAppManifest.compType === ComponentType.WEBHOOK) {
return !URL.canParse(knownAppManifest.compData.webhook.callbackUrl);
}
}
return false;
}
function parseKnownExtensionManifest(extensionManifest) {
const appManifestResult = looseComponentSchema.safeParse(extensionManifest);
if (appManifestResult.error) {
return null;
}
return appManifestResult.data;
}
// ../cli-astro-commands/src/components/DevCommand/hooks/useFetchAppManifest.ts
function useFetchAppManifest() {
const http = useHttpClient({ type: "standalone" });
return (0, import_react3.useCallback)(
async (serverLocalUrl, devMetadata, baseUrl, tunnelUrl) => {
const url = new URL("/_wix/app-manifest.json", serverLocalUrl);
const { data: text } = await http.get(url.toString(), {
responseType: "text",
transitional: {
silentJSONParsing: true,
forcedJSONParsing: false,
clarifyTimeoutError: false
},
disableWixHeaders: true
});
if (devMetadata != null) {
const { staticsUrlPlaceholder, serverUrlPlaceholder } = devMetadata;
const placeholders = /* @__PURE__ */ new Map();
placeholders.set(staticsUrlPlaceholder, baseUrl);
placeholders.set(serverUrlPlaceholder, tunnelUrl);
return {
manifest: parseLooseAppManifest(text, placeholders),
isTunnelRequired: text.includes(serverUrlPlaceholder)
};
}
const manifestV1 = parseLooseAppManifest(text);
return {
manifest: manifestV1,
isTunnelRequired: isTunnelRequired(manifestV1)
};
},
[http]
);
}
// ../cli-astro-commands/src/components/DevCommand/utils/DevCenterWatcher.ts
init_esm_shims();
import EventEmitter from "node:events";
var DevCenterWatcher = class extends EventEmitter {
onManifestUpdated(listener) {
this.on("manifestUpdated", listener);
return () => {
this.off("manifestUpdated", listener);
};
}
};
// ../cli-astro-commands/src/components/DevCommand/hooks/checkManifestForChanges.ts
init_esm_shims();
var import_variant = __toESM(require_lib(), 1);
import { isDeepStrictEqual } from "node:util";
var ManifestUpdateResult = (0, import_variant.variant)({
Changed: (0, import_variant.fields)(),
Unchanged: {}
});
function checkManifestForChanges(previous, latest) {
if (previous == null) {
return ManifestUpdateResult.Changed({ updatedComponents: [] });
}
if (isDeepStrictEqual(previous, latest)) {
return ManifestUpdateResult.Unchanged();
}
const oldComponentsMap = new Map(
previous.components.map((comp) => [comp.compId, comp])
);
const changedComponents = latest.components.filter((newComp) => {
const oldComp = oldComponentsMap.get(newComp.compId);
return !isDeepStrictEqual(newComp, oldComp);
});
return ManifestUpdateResult.Changed({ updatedComponents: changedComponents });
}
// ../cli-astro-commands/src/components/DevCommand/hooks/useDevCenterUpdater.tsx
var { pollInterval } = getTestOverrides();
var { devCenterDraftOverrides } = createEnv();
var overrideLifecycleState = devCenterDraftOverrides ? LifecycleState.DRAFT : void 0;
var useDevCenterUpdater = ({
siteId,
serverLocalUrl,
serverExposedUrl,
devMetadata
}) => {
const devCenterWatcher = (0, import_react4.useMemo)(() => new DevCenterWatcher(), []);
const [versionOverrideId, setVersionOverrideId] = (0, import_react4.useState)();
const [manifest, setManifest] = (0, import_react4.useState)(null);
const { reportError } = useErrorReporter();
const writeToDebugLog = useDebugLog();
const exit = useExit();
const {
model: { projectFolder, releaseAppId }
} = useProjectModel();
const logger = useAstroLogger({ isPrefixed: true });
const devCenterOverrides = useDevCenterOverridesClient({ siteId });
const openTunnel = useTunnel();
const tunnelUrl = (0, import_react4.useRef)();
const [tunnelRequired, setTunnelRequired] = (0, import_react4.useState)(false);
const fetchAppManifest = useFetchAppManifest();
const baseUrl = serverExposedUrl ?? serverLocalUrl;
const updateDevCenter = (0, import_react4.useCallback)(
async (latestManifest, isTunnelRequired2) => {
const manifestUpdateResult = checkManifestForChanges(
manifest,
latestManifest
);
if ((0, import_variant2.isType)(manifestUpdateResult, "Unchanged")) {
return manifestUpdateResult;
}
if (!serverExposedUrl && !tunnelUrl.current && isTunnelRequired2) {
const config = await readUserConfig();
if (!config.tunneling) {
setTunnelRequired(true);
return ManifestUpdateResult.Unchanged();
}
const serverLocalPort = parseInt(new URL(serverLocalUrl).port, 10);
const tunnel = await openTunnel(serverLocalPort);
tunnelUrl.current = tunnel.url;
return ManifestUpdateResult.Unchanged();
}
const appConfig = await readAppConfig(projectFolder, writeToDebugLog);
let updatedVersionOverrideId = appConfig?.devArmTag;
if (!updatedVersionOverrideId) {
updatedVersionOverrideId = await devCenterOverrides.createComponentsOverride({
type: OverrideType.DEV,
appManifest: latestManifest,
projectId: releaseAppId,
lifecycleState: overrideLifecycleState
});
} else {
const updateState = await devCenterOverrides.updateComponentsOverrides({
id: updatedVersionOverrideId,
type: OverrideType.DEV,
appManifest: latestManifest,
projectId: releaseAppId
});
if (!(0, import_variant2.isType)(updateState, "Updated")) {
updatedVersionOverrideId = await devCenterOverrides.createComponentsOverride({
type: OverrideType.DEV,
appManifest: latestManifest,
projectId: releaseAppId,
lifecycleState: overrideLifecycleState
});
}
}
if (updatedVersionOverrideId !== appConfig?.devArmTag) {
await saveAppConfig(projectFolder, {
devArmTag: updatedVersionOverrideId
});
}
setManifest(latestManifest);
setVersionOverrideId(updatedVersionOverrideId);
devCenterWatcher.emit("manifestUpdated", {
versionOverrideId: updatedVersionOverrideId,
updatedComponents: manifestUpdateResult.updatedComponents
});
return manifestUpdateResult;
},
[
releaseAppId,
manifest,
serverLocalUrl,
serverExposedUrl,
devCenterOverrides,
projectFolder,
openTunnel,
devCenterWatcher,
writeToDebugLog
]
);
const [timer, setTimer] = (0, import_react4.useState)(Date.now());
(0, import_react4.useEffect)(() => {
let disposed = false;
async function fetchAndUpdate() {
const { manifest: manifest2, isTunnelRequired: isTunnelRequired2 } = await fetchAppManifest(
serverLocalUrl,
devMetadata,
baseUrl,
tunnelUrl.current ?? baseUrl
);
try {
const result = await updateDevCenter(manifest2, isTunnelRequired2);
if ((0, import_variant2.isType)(result, "Changed")) {
logger.log(
"App manifest updated. Refresh existing browser tabs to view the latest changes."
);
if (process.env.REMOTE_MACHINE_TASK_EVENTS_URL) {
const eventData = {
type: "manifest_update",
appId: manifest2.appId,
overrideId: versionOverrideId,
result: "SUCCESS"
};
void fetch(process.env.REMOTE_MACHINE_TASK_EVENTS_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
eventName: "manifest-update",
taskId: process.env.REMOTE_MACHINE_TASK_ID,
executionId: process.env.REMOTE_MACHINE_EXECUTION_ID,
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
eventData
})
});
}
}
} catch (error) {
setManifest(manifest2);
logger.error(/* @__PURE__ */ import_react4.default.createElement(ErrorViewer, { error }));
writeToDebugLog(error);
reportError(error);
if (process.env.REMOTE_MACHINE_TASK_EVENTS_URL) {
const normalizedError = normalizeError(error);
const httpError = extractHttpError(normalizedError);
if (httpError) {
const errorInfo = getHttpErrorInfo(httpError);
let validationViolations;
try {
if (isHttpValidationError(httpError)) {
validationViolations = httpError.response?.data.details.validationError.fieldViolations.map(
(violation) => `${violation.field}: ${violation.description}`
).join("\n");
}
} catch {
}
const eventData = {
type: "manifest_update",
appId: manifest2.appId,
overrideId: versionOverrideId ?? "",
result: "FAILURE",
code: errorInfo.response.status,
message: errorInfo.response.data.message,
validationViolations
};
void fetch(process.env.REMOTE_MACHINE_TASK_EVENTS_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
eventName: "manifest-update",
taskId: process.env.REMOTE_MACHINE_TASK_ID,
executionId: process.env.REMOTE_MACHINE_EXECUTION_ID,
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
eventData
})
});
}
}
throw error;
}
}
void fetchAndUpdate().catch((error) => {
if (error instanceof Error && error.name === "TrustedAppIsNotMarkedAsInternal") {
exit(error);
}
}).finally(() => {
if (!disposed) {
setTimeout(() => setTimer(Date.now()), pollInterval ?? 1e3);
}
});
return () => {
disposed = true;
};
}, [timer]);
return { baseUrl, tunnelRequired, versionOverrideId, devCenterWatcher };
};
// ../cli-astro-commands/src/components/DevCommand/TunnelingConsent.tsx
init_esm_shims();
var import_react5 = __toESM(require_react(), 1);
var import_variant3 = __toESM(require_lib(), 1);
var TunnelingConsent = ({ required, children }) => {
const exit = useExit();
const [approved, setApproved] = (0, import_react5.useState)();
const { status } = useAsync(async () => {
const config = await readUserConfig();
if (config.tunneling) {
setApproved(true);
}
return config;
}, []);
if (!required || approved) {
return children;
}
return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, (0, import_variant3.match)(status, {
Success: () => /* @__PURE__ */ import_react5.default.createElement(
ConfirmInput,
{
label: "To continue, a secure tunnel will be set up from your machine for development purposes.",
initialValue: true,
onSubmit: async (approved2) => {
setApproved(approved2);
await updateUserConfig({ tunneling: approved2 });
if (!approved2) {
exit();
}
}
}
),
Error: () => null,
Loading: () => null
}), approved === false && /* @__PURE__ */ import_react5.default.createElement(Text, { skin: "error" }, "Operation aborted. Tunneling is necessary to run your application."));
};
// ../cli-astro-commands/src/components/DevCommand/DevEnvironment.tsx
var DevEnvironmentContext = (0, import_react6.createContext)(null);
var DevEnvironmentProvider = ({
siteId,
serverLocalUrl,
serverExposedUrl,
devMetadata,
children
}) => {
const { baseUrl, tunnelRequired, versionOverrideId, devCenterWatcher } = useDevCenterUpdater({
siteId,
serverLocalUrl,
serverExposedUrl,
devMetadata
});
return /* @__PURE__ */ import_react6.default.createElement(TunnelingConsent, { required: tunnelRequired }, versionOverrideId == null ? /* @__PURE__ */ import_react6.default.createElement(Spinner, { text: "Preparing your dashboard..." }) : /* @__PURE__ */ import_react6.default.createElement(
DevEnvironmentContext.Provider,
{
value: { baseUrl, versionOverrideId, devCenterWatcher }
},
children
));
};
var useDevEnvironment = () => {
const ctx = (0, import_react6.useContext)(DevEnvironmentContext);
if (!ctx) {
throw new Error(
"useDevEnvironment must be used inside DevEnvironmentProvider"
);
}
return ctx;
};
// ../cli-astro-commands/src/components/DevCommand/site-flow/SiteDev.tsx
init_esm_shims();
var import_react8 = __toESM(require_react(), 1);
var import_variant4 = __toESM(require_lib(), 1);
// ../cli-astro-commands/src/components/DevCommand/site-flow/useSiteDeploymentTopologyUpdater.tsx
init_esm_shims();
var import_react7 = __toESM(require_react(), 1);
function useSiteDeploymentTopologyUpdater() {
const { baseUrl, versionOverrideId } = useDevEnvironment();
const { siteId } = useSiteConfig();
const updateTopology = useUpdateDeploymentTopologyForSite(siteId);
const exit = useExit();
(0, import_react7.useEffect)(() => {
updateTopology({
versionOverrideId,
siteUrl: baseUrl,
environment: "development"
}).catch(exit);
}, [versionOverrideId, baseUrl, updateTopology, exit]);
}
// ../cli-astro-commands/src/components/DevCommand/site-flow/SiteDev.tsx
var SiteDev = () => {
const { appId, siteId } = useSiteConfig();
const { baseUrl, versionOverrideId } = useDevEnvironment();
const veloClient = useVeloClient();
const { status: gitHubOnboardingStatus } = useAsync(
() => veloClient.getGitHubOnboardingStatus(appId),
[appId]
);
useSiteDeploymentTopologyUpdater();
return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement(Text, null, "Development environment ready"), /* @__PURE__ */ import_react8.default.createElement(Box_default, { marginY: 1, flexDirection: "column", gap: 1 }, /* @__PURE__ */ import_react8.default.createElement(Text, null, "Open the preview on:"), /* @__PURE__ */ import_react8.default.createElement(Box_default, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ import_react8.default.createElement(PlatformLink, { url: baseUrl, platform: "site" }), /* @__PURE__ */ import_react8.default.createElement(
PlatformLink,
{
url: `https://manage.wix.com/dashboard/${siteId}?apps-override=${versionOverrideId}`,
platform: "dashboard"
}
), (0, import_variant4.match)(gitHubOnboardingStatus, {
Success: ({ result }) => result?.status === OnboardingState.GITHUB_ENABLED && /* @__PURE__ */ import_react8.default.createElement(
PlatformLink,
{
url: `https://vibe.wix.com/projects/${siteId}`,
platform: "editor"
}
),
Error: () => null,
Loading: () => null
})), /* @__PURE__ */ import_react8.default.createElement(LinkClickTip, null)));
};
// ../cli-astro-commands/src/components/DevCommand/SiteDevFlow.tsx
var SiteDevFlow = (props) => {
const { siteId } = useSiteConfig();
return /* @__PURE__ */ import_react9.default.createElement(DevEnvironmentProvider, { ...props, siteId }, /* @__PURE__ */ import_react9.default.createElement(SiteDev, null));
};
// ../cli-astro-commands/src/components/DevCommand/AppDevFlow.tsx
init_esm_shims();
var import_react31 = __toESM(require_react(), 1);
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/index.ts
init_esm_shims();
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/SiteProvider.tsx
init_esm_shims();
var import_react21 = __toESM(require_react(), 1);
var import_variant11 = __toESM(require_lib(), 1);
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/ResolveSite.tsx
init_esm_shims();
var import_react19 = __toESM(require_react(), 1);
// ../cli-site-selector/src/index.ts
init_esm_shims();
// ../cli-site-selector/src/SiteSelector.tsx
init_esm_shims();
var import_react18 = __toESM(require_react(), 1);
var import_variant9 = __toESM(require_lib(), 1);
// ../site-list-client/src/index.ts
init_esm_shims();
// ../site-list-client/src/site-list-client.ts
init_esm_shims();
// ../../node_modules/@wix/ambassador-site-list-v2-site/build/es/http.impl.js
init_esm_shims();
var _querySitesRequest = {};
var _querySitesResponse = { sites: "_site" };
var _site = {
createdDate: "google.protobuf.Timestamp",
updatedDate: "google.protobuf.Timestamp",
trashedDate: "google.protobuf.Timestamp"
};
function resolveComWixpressSitelistApiSiteListServiceV2Url(opts) {
var domainToMappings = {
"www._base_domain_": [
{
srcPath: "/_api/sites-list",
destPath: "/api"
},
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"feedback._base_domain_": [
{
srcPath: "/_api/sites-list",
destPath: "/api"
}
],
"manage._base_domain_": [
{
srcPath: "/_api/sites-list",
destPath: "/api"
},
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
},
{
srcPath: "/_api/sites-list-data",
destPath: "/api/sites-list-data"
}
],
"www.wixapis.com": [
{
srcPath: "/site-list/v2/sites",
destPath: "/v2/sites"
}
],
"api._api_base_domain_": [
{
srcPath: "/sites-list",
destPath: ""
}
],
"bo._base_domain_": [
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"wixbo.ai": [
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"wix-bo.com": [
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"dev._base_domain_": [
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"editor._base_domain_": [
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"blocks._base_domain_": [
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"create.editorx": [
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"online.codux.com": [
{
srcPath: "/_api/sites-list",
destPath: ""
},
{
srcPath: "/_api/sites-list/v2/sites",
destPath: "/v2/sites"
}
],
"*.dev.wix-code.com": [
{
srcPath: "/site-list/v2/sites",
destPath: "/v2/sites"
}
],
"vibe._base_domain_": [
{
srcPath: "/_api/sites-list",
destPath: ""
}
]
};
return resolveUrl(Object.assign(opts, { domainToMappings }));
}
function querySites(payload) {
var _a = serializer(_querySitesRequest, {}), toReq = _a.toJSON, fromReq = _a.fromJSON;
var fromRes = serializer(_querySitesResponse, { _site }).fromJSON;
function __querySites(_a2) {
var host = _a2.host;
var serializedData = toReq(payload);
var metadata = {
entityFqdn: "wix.site_list.v2.site",
method: "POST",
methodFqn: "com.wixpress.sitelist.api.SiteListServiceV2.QuerySites",
migrationOptions: {
optInTransformResponse: true
},
url: resolveComWixpressSitelistApiSiteListServiceV2Url({
protoPath: "/v2/sites/query",
data: serializedData,
host
}),
data: serializedData,
transformResponse: fromRes
};
return metadata;
}
__querySites.fromReq = fromReq;
__querySites.__isAmbassador = true;
return __querySites;
}
// ../site-list-client/src/schemas.ts
init_esm_shims();
var siteSchema = external_exports.object({
id: external_exports.string(),
displayName: external_exports.string(),
viewUrl: external_exports.union([external_exports.string().url(), external_exports.literal("")]).optional()
});
var querySitesSchema = external_exports.object({
sites: external_exports.array(siteSchema)
});
// ../site-list-client/src/site-list-client.ts
var SiteListClient = class {
constructor(httpClient) {
this.httpClient = httpClient;
const { minRetryTimeout } = getTestOverrides();
this.retryOptions = {
retries: 3,
minTimeout: minRetryTimeout,
maxTimeout: 3 * 1e3
};
}
retryOptions;
querySites = async (opts = {}) => {
try {
const { data } = await pRetry(
() => this.httpClient.request(querySites(opts)),
this.retryOptions
);
return querySitesSchema.parse(data).sites;
} catch (e) {
throw new CliError({
code: CliErrorCode.FailedToQuerySites(),
cause: e,
info: { ...opts }
});
}
};
getSite = async (id, inclHeadless) => {
const queryPayload = {
query: {
filter: {
id: { $in: [id] },
...inclHeadless ? {
namespace: { $in: ["WIX", "HEADLESS"] }
} : {}
}
}
};
try {
const { data } = await pRetry(
() => this.httpClient.request(querySites(queryPayload)),
this.retryOptions
);
const { sites } = querySitesSchema.parse(data);
return sites.at(0) ?? null;
} catch (e) {
throw new CliError({
code: CliErrorCode.FailedToGetSite(),
cause: e,
info: { id }
});
}
};
};
// ../site-list-client/src/useSiteListClient.ts
init_esm_shims();
var import_react10 = __toESM(require_react(), 1);
function useSiteListClient() {
const httpClient = useHttpClient({ type: "backoffice" });
const client = (0, import_react10.useMemo)(() => new SiteListClient(httpClient), [httpClient]);
return usePanoramaMethodLogger(client);
}
// ../cli-site-selector/src/SiteTypeSelect.tsx
init_esm_shims();
var import_react12 = __toESM(require_react(), 1);
var import_variant5 = __toESM(require_lib(), 1);
// ../cli-site-selector/src/bi.ts
init_esm_shims();
var import_react11 = __toESM(require_react(), 1);
function siteSelectorBiEvents(biLogger) {
return {
cliAction: ({
question,
action,
key,
additionalInfo
}) => {
void biLogger.report(
wixCliAction({
question,
action,
key,
additionalInfo: JSON.stringify(additionalInfo)
})
);
},
cliFlowStepAnswered: ({
question,
answer,
additionalInfo
}) => {
void biLogger.report(
wixCliAppFlowStepsAnswers({
question,
answer,
additionalInfo: JSON.stringify(additionalInfo)
})
);
}
};
}
function useSiteSelectorBi() {
const biLogger = useBiLogger();
return (0, import_react11.useMemo)(() => siteSelectorBiEvents(biLogger), [biLogger]);
}
// ../cli-site-selector/src/SiteTypeSelect.tsx
var SiteTypeSelect = ({ onSubmit, onError, sites }) => {
const bi = useSiteSelectorBi();
const { t } = useTranslation();
const { getDevSitesCount, getDevSitesLimit } = useDevCenterClient();
const { status } = useAsync(
() => Promise.all([getDevSitesCount(), getDevSitesLimit()]),
[],
{ onError }
);
const handleSubmit = (option) => {
void bi.cliFlowStepAnswered({
question: t("site_type_select.label"),
answer: option.title
});
onSubmit(option.value);
};
return (0, import_variant5.match)(status, {
Error: () => null,
Loading: () => /* @__PURE__ */ import_react12.default.createElement(Spinner, { text: t("general.loading") }),
Success: ({ result: [devSitesCount, devSitesLimit] }) => {
const isDevSitesLimitReached = devSitesCount >= devSitesLimit;
const userHasNoSites = sites.length === 0;
return /* @__PURE__ */ import_react12.default.createElement(
SelectInput,
{
label: t("site_type_select.label"),
options: [
{
availability: userHasNoSites ? SelectOptionAvailability.Disabled({
reason: t("site_type_select.no_sites")
}) : SelectOptionAvailability.Enabled(),
title: t("site_type_select.pick_existing_site"),
value: "select-existing-site"
},
{
title: t("site_type_select.create_new_dev_site"),
value: "create-dev-site",
availability: isDevSitesLimitReached ? SelectOptionAvailability.Disabled({
reason: t("site_type_select.create_new_dev_site.disabled", {
limit: devSitesLimit
})
}) : SelectOptionAvailability.Enabled()
},
{
title: t("site_type_select.create_new_harmony_site"),
value: "create-harmony-site",
availability: isDevSitesLimitReached ? SelectOptionAvailability.Disabled({
reason: t("site_type_select.create_new_dev_site.disabled", {
limit: devSitesLimit
})
}) : SelectOptionAvailability.Enabled()
}
],
onSubmit: handleSubmit
}
);
}
});
};
// ../cli-site-selector/src/CreateDevSite.tsx
init_esm_shims();
var import_react15 = __toESM(require_react(), 1);
var import_variant7 = __toESM(require_lib(), 1);
// ../cli-site-selector/src/WaitForAppToBeInstalled.tsx
init_esm_shims();
var import_react14 = __toESM(require_react(), 1);
var import_variant6 = __toESM(require_lib(), 1);
// ../cli-site-selector/src/OpenBrowser.tsx
init_esm_shims();
var import_react13 = __toESM(require_react(), 1);
var OpenBrowser = ({ siteId, appId }) => {
const { t } = useTranslation();
const bi = useSiteSelectorBi();
use_input_default(async (input, key) => {
if (key.return) {
bi.cliAction({
question: t("install_app_on_site.warning.instructions"),
key: "enter",
action: "install_app_on_site"
});
await openBrowser(
`https://manage.wix.com/installer/install?metaSiteId=${siteId}&appId=${appId}&platform=cli&version=latest`
);
}
});
return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, /* @__PURE__ */ import_react13.default.createElement(Trans, { i18nKey: "install_app_on_site.warning" }), /* @__PURE__ */ import_react13.default.createElement(
Trans,
{
i18nKey: "install_app_on_site.warning.instructions",
components: [/* @__PURE__ */ import_react13.default.createElement(Key, { value: "Enter" })]
}
));
};
// ../cli-site-selector/src/WaitForAppToBeInstalled.tsx
var AppInstallData = (0, import_variant6.variant)({
Success: {},
Canceled: {}
});
function isAbortError(error) {
return error && typeof error === "object" && "name" in error && error.name === "AbortError";
}
var WaitForAppToBeInstalled = ({
appId,
site,
onSubmit,
onError
}) => {
const { isAppInstalled } = useDevCenterClient({ siteId: site.id });
const { status } = useAsync(
async ({ signal }) => {
const { pollInterval: pollInterval2 } = getTestOverrides();
try {
await pWaitFor(() => isAppInstalled(appId), {
// Polling interval is set to 6.5 seconds to avoid rate limiting (429)
interval: pollInterval2 ?? 6500,
timeout: {
milliseconds: 60 * 1e3 * 2,
signal
}
});
return AppInstallData.Success();
} catch (error) {
if (error instanceof TimeoutError) {
throw new CliError({
code: CliErrorCode.SiteSelectorTimedout(),
cause: error
});
}
if (isAbortError(error)) {
return AppInstallData.Canceled();
}
throw error;
}
},
[],
{
onError,
onSuccess: (result) => {
if ((0, import_variant6.isType)(result, AppInstallData.Success)) {
onSubmit();
}
}
}
);
return (0, import_variant6.match)(status, {
Error: () => null,
Loading: () => /* @__PURE__ */ import_react14.default.createElement(OpenBrowser, { siteId: site.id, appId }),
Success: () => /* @__PURE__ */ import_react14.default.createElement(Alert, { type: "success" }, /* @__PURE__ */ import_react14.default.createElement(Badge, { skin: "success" }, /* @__PURE__ */ import_react14.default.createElement(Trans, { i18nKey: "general.success" })), " ", /* @__PURE__ */ import_react14.default.createElement(Trans, { i18nKey: "install_app_on_site.finished_successfully" }))
});
};
// ../cli-site-selector/src/CreateDevSite.tsx
var CreateDevSite = ({
status,
appId,
onSubmit,
onError
}) => {
const { t } = useTranslation();
return (0, import_variant7.match)(status, {
NotRequested: () => null,
Error: () => null,
Loading: () => /* @__PURE__ */ import_react15.default.createElement(Spinner, { text: t("create_dev_site.loading") }),
Success: ({ result }) => /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, /* @__PURE__ */ import_react15.default.createElement(
Trans,
{
i18nKey: "create_dev_site.success",
components: [/* @__PURE__ */ import_react15.default.createElement(Text, { skin: "success", bold: true })],
values: { name: result.displayName }
}
), /* @__PURE__ */ import_react15.default.createElement(
WaitForAppToBeInstalled,
{
appId,
site: result,
onSubmit: () => onSubmit(result),
onError
}
))
});
};
// ../cli-site-selector/src/SelectExistingSite.tsx
init_esm_shims();
var import_react17 = __toESM(require_react(), 1);
var import_variant8 = __toESM(require_lib(), 1);
// ../cli-site-selector/src/SiteListSelect.tsx
init_esm_shims();
var import_react16 = __toESM(require_react(), 1);
var SiteListSelect = ({ onSubmit, sites }) => {
const { t } = useTranslation();
const bi = useSiteSelectorBi();
const handleSubmit = (0, import_react16.useCallback)(
(option) => {
bi.cliFlowStepAnswered({
question: t("site_list_select.label"),
answer: option.title
});
onSubmit(option.value);
},
[bi, onSubmit, t]
);
return /* @__PURE__ */ import_react16.default.createElement(
SelectInput,
{
label: t("site_list_select.label"),
options: sites.map((site) => ({
key: site.id,
title: site.displayName,
description: site.viewUrl,
value: site
})),
onSubmit: handleSubmit
}
);
};
// ../cli-site-selector/src/SelectExistingSite.tsx
var CheckAppInstalledOnSite = ({ appId, site, onSubmit, onError }) => {
const { t } = useTranslation();
const { isAppInstalled } = useDevCenterClient({ siteId: site.id });
const { status } = useAsync(async () => isAppInstalled(appId), [], {
onError,
onSuccess: (isInstalled) => {
if (isInstalled) {
onSubmit(site);
}
}
});
return (0, import_variant8.match)(status, {
Error: () => null,
Loading: () => /* @__PURE__ */ import_react17.default.createElement(Spinner, { text: t("general.loading") }),
Success: ({ result: isInstalled }) => {
if (isInstalled) {
return null;
}
return /* @__PURE__ */ import_react17.default.createElement(
WaitForAppToBeInstalled,
{
appId,
site,
onSubmit: () => onSubmit(site),
onError
}
);
}
});
};
var SelectExistingSite = ({
sites,
appId,
onSubmit,
onError
}) => {
const [siteToInstallAppOn, setSiteToInstallAppOn] = (0, import_react17.useState)(
null
);
return /* @__PURE__ */ import_react17.default.createElement(import_react17.default.Fragment, null, /* @__PURE__ */ import_react17.default.createElement(
SiteListSelect,
{
onSubmit: (site) => setSiteToInstallAppOn(site),
sites
}
), siteToInstallAppOn && /* @__PURE__ */ import_react17.default.createElement(
CheckAppInstalledOnSite,
{
appId,
site: siteToInstallAppOn,
onSubmit: () => onSubmit(siteToInstallAppOn),
onError
}
));
};
// ../cli-site-selector/src/messages.json
var messages_default = {
"general.loading": "Loading...",
"general.success": "Done",
"site_type_select.label": "Select development site:",
"site_type_select.pick_existing_site": "Select an existing site:",
"site_type_select.create_new_dev_site": "Create a new development site",
"site_type_select.create_new_dev_site.disabled": "You have reached the maximum number of {limit} development sites.",
"site_type_select.create_new_harmony_site": "Create a new Harmony Development Site",
"site_type_select.no_sites": "No sites found.",
"create_dev_site.loading": "Creating your new development site...",
"create_dev_site.success": "Development site <0>{name}</0> created.",
"site_list_select.label": "Select Site:",
"install_app_on_site.warning": "Your new app needs to be installed on the selected development site.",
"install_app_on_site.warning.instructions": "Press <0/> to install the app in your browser.",
"install_app_on_site.finished_successfully": "App installed."
};
// ../cli-site-selector/src/SiteSelector.tsx
var HARMONY_SITE_TEMPLATE = "91532250-8835-46ac-9666-e4db8770b275";
var SiteSelector = ({
appId,
biLogger,
onSubmit,
onError
}) => {
const [siteType, setSiteType] = (0, import_react18.useState)(null);
const { createDevSite } = useDevCenterClient();
const siteListClient = useSiteListClient();
const { status } = useAsync(
() => siteListClient.querySites({
query: {
cursorPaging: {
limit: 100
}
}
}),
[],
{
onError
}
);
const createSite = useAsyncCallback(
(_, siteType2) => siteType2 === "create-harmony-site" ? createDevSite({ templateId: HARMONY_SITE_TEMPLATE }) : createDevSite(),
{
onError
}
);
function handleSelectSiteType(siteType2) {
setSiteType(siteType2);
if (siteType2 !== "select-existing-site") {
void createSite.execute(siteType2);
}
}
return /* @__PURE__ */ import_react18.default.createElement(BiProvider, { value: biLogger }, /* @__PURE__ */ import_react18.default.createElement(I18nProvider, { messages: messages_default }, (0, import_variant9.match)(status, {
Error: () => null,
Loading: () => /* @__PURE__ */ import_react18.default.createElement(Spinner, { text: /* @__PURE__ */ import_react18.default.createElement(Trans, { i18nKey: "general.loading" }) }),
Success: ({ result: sites }) => /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement(
SiteTypeSelect,
{
onSubmit: handleSelectSiteType,
onError,
sites
}
), siteType === "select-existing-site" ? /* @__PURE__ */ import_react18.default.createElement(
SelectExistingSite,
{
sites,
appId,
onSubmit,
onError
}
) : /* @__PURE__ */ import_react18.default.createElement(
CreateDevSite,
{
status: createSite.status,
appId,
onSubmit,
onError
}
))
})));
};
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/ResolveSite.tsx
var ResolveSite = ({ onSubmit }) => {
const exit = useExit();
const { model } = useProjectModel();
const biLogger = useBiLogger();
return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(Alert, { type: "insight" }, "You don't have a development site currently configured."), /* @__PURE__ */ import_react19.default.createElement(
SiteSelector,
{
appId: model.config.appId,
biLogger,
onSubmit: (site) => onSubmit(site.id),
onError: exit
}
));
};
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/context.ts
init_esm_shims();
var import_react20 = __toESM(require_react(), 1);
var SiteContext = (0, import_react20.createContext)(null);
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/site-value.ts
init_esm_shims();
var import_variant10 = __toESM(require_lib(), 1);
var SiteValue = (0, import_variant10.variant)({
NotConfigured: {},
Resolved: (0, import_variant10.fields)()
});
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/SiteProvider.tsx
var SiteProvider = ({
children
}) => {
const exit = useExit();
const { model } = useProjectModel();
const { projectFolder, env } = model;
const userDefinedSiteId = env.WIX_SITE_ID;
const writeDebugLog = useDebugLog();
const { status, merge } = useAsync(async () => {
if (userDefinedSiteId) {
return SiteValue.Resolved({ siteId: userDefinedSiteId });
}
const siteId = (await readAppConfig(projectFolder, writeDebugLog))?.siteId;
return siteId ? SiteValue.Resolved({ siteId }) : SiteValue.NotConfigured();
}, []);
const setSiteId = (0, import_react21.useCallback)(
async (siteId) => {
if (userDefinedSiteId) {
throw new Error("Cannot change site: siteId is user-defined");
}
try {
await saveAppConfig(projectFolder, { siteId });
merge({ result: SiteValue.Resolved({ siteId }) });
} catch (e) {
throw new CliError({
code: CliErrorCode.FailedToSaveDevelopmentSite({
path: ASTRO_APP_CONFIG_PATH
}),
cause: e
});
}
},
[merge, projectFolder, userDefinedSiteId]
);
const handleResolveSite = (0, import_react21.useCallback)(
(siteId) => setSiteId(siteId).catch(exit),
[exit, setSiteId]
);
return (0, import_variant11.match)(status, {
Error: () => null,
Loading: () => /* @__PURE__ */ import_react21.default.createElement(Spinner, { text: "Resolving development site..." }),
Success: ({ result: state }) => {
return (0, import_variant11.match)(state, {
NotConfigured: () => /* @__PURE__ */ import_react21.default.createElement(ResolveSite, { onSubmit: handleResolveSite }),
Resolved: ({ siteId }) => /* @__PURE__ */ import_react21.default.createElement(
SiteContext.Provider,
{
value: {
siteId,
setSiteId,
canChangeSite: !userDefinedSiteId
}
},
children(siteId)
)
});
}
});
};
// ../cli-astro-commands/src/components/DevCommand/app-flow/site/useSite.ts
init_esm_shims();
var import_react22 = __toESM(require_react(), 1);
function useSite() {
const context = (0, import_react22.useContext)(SiteContext);
if (context == null) {
throw new Error("useSite() cannot be used without an <SiteProvider>");
}
return context;
}
// ../cli-astro-commands/src/components/DevCommand/app-flow/AppDev.tsx
init_esm_shims();
var import_react30 = __toESM(require_react(), 1);
var import_variant13 = __toESM(require_lib(), 1);
// ../cli-astro-commands/src/components/DevC