@wix/web50-cli 0.1.1 → 0.1.3
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/bin/web5.js +1 -2
- package/dist/cjs/auth/deviceFlow.js +96 -17
- package/dist/cjs/auth/deviceFlow.js.map +1 -1
- package/dist/cjs/auth/index.js +40 -10
- package/dist/cjs/auth/index.js.map +1 -1
- package/dist/cjs/cli.js +3 -3
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands/bundle.js +12 -4
- package/dist/cjs/commands/bundle.js.map +1 -1
- package/dist/cjs/commands/conversation.js.map +1 -1
- package/dist/cjs/commands/conversationWizard.js +36 -12
- package/dist/cjs/commands/conversationWizard.js.map +1 -1
- package/dist/cjs/commands/deploy.js +55 -10
- package/dist/cjs/commands/deploy.js.map +1 -1
- package/dist/cjs/commands/ecom.js +239 -0
- package/dist/cjs/commands/ecom.js.map +1 -0
- package/dist/cjs/commands/embed.js +41 -52
- package/dist/cjs/commands/embed.js.map +1 -1
- package/dist/cjs/commands/init.js +34 -3
- package/dist/cjs/commands/init.js.map +1 -1
- package/dist/cjs/commands/instructions.js +147 -51
- package/dist/cjs/commands/instructions.js.map +1 -1
- package/dist/cjs/commands/login.js +8 -4
- package/dist/cjs/commands/login.js.map +1 -1
- package/dist/cjs/commands/serve.js.map +1 -1
- package/dist/cjs/commands/validate.js +368 -16
- package/dist/cjs/commands/validate.js.map +1 -1
- package/dist/cjs/commands/whoami.js.map +1 -1
- package/dist/cjs/templates/aiInstructionsSchema.js +5 -1
- package/dist/cjs/templates/aiInstructionsSchema.js.map +1 -1
- package/dist/cjs/templates/cmsMappingSchema.js +132 -0
- package/dist/cjs/templates/cmsMappingSchema.js.map +1 -0
- package/dist/cjs/templates/embedDocs.js +488 -0
- package/dist/cjs/templates/embedDocs.js.map +1 -0
- package/dist/cjs/utils/project.js +13 -0
- package/dist/cjs/utils/project.js.map +1 -1
- package/dist/cjs/utils/wixApi.js +3 -1
- package/dist/cjs/utils/wixApi.js.map +1 -1
- package/dist/esm/auth/deviceFlow.js +95 -17
- package/dist/esm/auth/deviceFlow.js.map +1 -1
- package/dist/esm/auth/index.js +40 -11
- package/dist/esm/auth/index.js.map +1 -1
- package/dist/esm/cli.js +3 -3
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/bundle.js +12 -4
- package/dist/esm/commands/bundle.js.map +1 -1
- package/dist/esm/commands/conversation.js.map +1 -1
- package/dist/esm/commands/conversationWizard.js +36 -12
- package/dist/esm/commands/conversationWizard.js.map +1 -1
- package/dist/esm/commands/deploy.js +55 -10
- package/dist/esm/commands/deploy.js.map +1 -1
- package/dist/esm/commands/ecom.js +234 -0
- package/dist/esm/commands/ecom.js.map +1 -0
- package/dist/esm/commands/embed.js +42 -52
- package/dist/esm/commands/embed.js.map +1 -1
- package/dist/esm/commands/init.js +34 -3
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/instructions.js +152 -53
- package/dist/esm/commands/instructions.js.map +1 -1
- package/dist/esm/commands/login.js +8 -4
- package/dist/esm/commands/login.js.map +1 -1
- package/dist/esm/commands/serve.js.map +1 -1
- package/dist/esm/commands/validate.js +373 -19
- package/dist/esm/commands/validate.js.map +1 -1
- package/dist/esm/commands/whoami.js.map +1 -1
- package/dist/esm/templates/aiInstructionsSchema.js +5 -1
- package/dist/esm/templates/aiInstructionsSchema.js.map +1 -1
- package/dist/esm/templates/cmsMappingSchema.js +128 -0
- package/dist/esm/templates/cmsMappingSchema.js.map +1 -0
- package/dist/esm/templates/embedDocs.js +484 -0
- package/dist/esm/templates/embedDocs.js.map +1 -0
- package/dist/esm/utils/project.js +15 -0
- package/dist/esm/utils/project.js.map +1 -1
- package/dist/esm/utils/wixApi.js +4 -2
- package/dist/esm/utils/wixApi.js.map +1 -1
- package/dist/types/auth/deviceFlow.d.ts +1 -1
- package/dist/types/auth/deviceFlow.d.ts.map +1 -1
- package/dist/types/auth/index.d.ts +2 -1
- package/dist/types/auth/index.d.ts.map +1 -1
- package/dist/types/commands/bundle.d.ts.map +1 -1
- package/dist/types/commands/conversation.d.ts.map +1 -1
- package/dist/types/commands/conversationWizard.d.ts.map +1 -1
- package/dist/types/commands/deploy.d.ts.map +1 -1
- package/dist/types/commands/ecom.d.ts +3 -0
- package/dist/types/commands/ecom.d.ts.map +1 -0
- package/dist/types/commands/embed.d.ts.map +1 -1
- package/dist/types/commands/init.d.ts.map +1 -1
- package/dist/types/commands/instructions.d.ts.map +1 -1
- package/dist/types/commands/login.d.ts.map +1 -1
- package/dist/types/commands/serve.d.ts.map +1 -1
- package/dist/types/commands/validate.d.ts +4 -2
- package/dist/types/commands/validate.d.ts.map +1 -1
- package/dist/types/commands/whoami.d.ts.map +1 -1
- package/dist/types/templates/aiInstructionsSchema.d.ts.map +1 -1
- package/dist/types/templates/cmsMappingSchema.d.ts +2 -0
- package/dist/types/templates/cmsMappingSchema.d.ts.map +1 -0
- package/dist/types/templates/embedDocs.d.ts +2 -0
- package/dist/types/templates/embedDocs.d.ts.map +1 -0
- package/dist/types/utils/project.d.ts +3 -0
- package/dist/types/utils/project.d.ts.map +1 -1
- package/dist/types/utils/wixApi.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/commands/getClientId.js +0 -60
- package/dist/cjs/commands/getClientId.js.map +0 -1
- package/dist/esm/commands/getClientId.js +0 -56
- package/dist/esm/commands/getClientId.js.map +0 -1
- package/dist/types/commands/getClientId.d.ts +0 -3
- package/dist/types/commands/getClientId.d.ts.map +0 -1
package/bin/web5.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
|
-
exports.
|
|
4
|
+
exports.promptSiteSelection = promptSiteSelection;
|
|
5
5
|
exports.refreshAccessToken = refreshAccessToken;
|
|
6
6
|
exports.runDeviceFlow = runDeviceFlow;
|
|
7
|
-
var readline = _interopRequireWildcard(require("readline"));
|
|
8
7
|
var _print = require("../utils/print");
|
|
9
8
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
10
|
-
|
|
11
|
-
const CLIENT_ID = '6f95cec8-3e98-48b9-b4e5-1fb92fcd9973';
|
|
9
|
+
const CLIENT_ID = '602051c7-ec4b-4334-b90d-b029b076ba8f'; // web5 cli client id
|
|
10
|
+
// const CLIENT_ID = '6f95cec8-3e98-48b9-b4e5-1fb92fcd9973'; // Regular wix client id
|
|
12
11
|
const DEVICE_CODE_URL = 'https://www.wixapis.com/oauth2/device/code';
|
|
13
12
|
const TOKEN_URL = 'https://www.wixapis.com/oauth2/token';
|
|
14
13
|
const POLL_INTERVAL_MS = 3000;
|
|
@@ -23,7 +22,7 @@ async function sleep(ms) {
|
|
|
23
22
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
24
23
|
}
|
|
25
24
|
async function requestDeviceCode() {
|
|
26
|
-
const url = `${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=
|
|
25
|
+
const url = `${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=offline_access`;
|
|
27
26
|
log(`POST ${url}`);
|
|
28
27
|
const res = await fetch(url);
|
|
29
28
|
log(`Response: ${res.status} ${res.statusText}`);
|
|
@@ -77,19 +76,98 @@ async function pollToken(deviceCode) {
|
|
|
77
76
|
}
|
|
78
77
|
throw new Error('Verification failed — timed out after 60 seconds. Please run `web5 login` again.');
|
|
79
78
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const trimmed = answer.trim();
|
|
89
|
-
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
90
|
-
resolve(UUID_RE.test(trimmed) ? trimmed : null);
|
|
91
|
-
});
|
|
79
|
+
const WEB5_SITES_URL = 'https://www.wixapis.com/web5/_api/cli/web5-sites';
|
|
80
|
+
async function fetchWeb5Sites(accessToken) {
|
|
81
|
+
log(`GET ${WEB5_SITES_URL}`);
|
|
82
|
+
const res = await fetch(WEB5_SITES_URL, {
|
|
83
|
+
headers: {
|
|
84
|
+
Authorization: `Bearer ${accessToken}`,
|
|
85
|
+
Connection: 'close'
|
|
86
|
+
}
|
|
92
87
|
});
|
|
88
|
+
log(`Response: ${res.status} ${res.statusText}`);
|
|
89
|
+
if (!res.ok) {
|
|
90
|
+
const body = await res.text().catch(() => '');
|
|
91
|
+
log(`Error body: ${body}`);
|
|
92
|
+
throw new Error(`Failed to fetch sites: ${res.status} ${res.statusText} — ${body}`);
|
|
93
|
+
}
|
|
94
|
+
const data = await res.json();
|
|
95
|
+
log(`Sites response:`, JSON.stringify(data, null, 2));
|
|
96
|
+
return data.sites ?? [];
|
|
97
|
+
}
|
|
98
|
+
async function createWeb5Site(accessToken, name) {
|
|
99
|
+
const url = `${WEB5_SITES_URL}/create`;
|
|
100
|
+
log(`POST ${url}`);
|
|
101
|
+
const res = await fetch(url, {
|
|
102
|
+
method: 'POST',
|
|
103
|
+
headers: {
|
|
104
|
+
Authorization: `Bearer ${accessToken}`,
|
|
105
|
+
'Content-Type': 'application/json',
|
|
106
|
+
Connection: 'close'
|
|
107
|
+
},
|
|
108
|
+
body: JSON.stringify({
|
|
109
|
+
name
|
|
110
|
+
})
|
|
111
|
+
});
|
|
112
|
+
log(`Response: ${res.status} ${res.statusText}`);
|
|
113
|
+
if (!res.ok) {
|
|
114
|
+
const body = await res.text().catch(() => '');
|
|
115
|
+
log(`Error body: ${body}`);
|
|
116
|
+
throw new Error(`Failed to create site: ${res.status} ${res.statusText} — ${body}`);
|
|
117
|
+
}
|
|
118
|
+
const body = await res.json();
|
|
119
|
+
log(`Create site response:`, JSON.stringify(body, null, 2));
|
|
120
|
+
return body.site;
|
|
121
|
+
}
|
|
122
|
+
async function promptCreateSite(accessToken, inquirer) {
|
|
123
|
+
const {
|
|
124
|
+
siteName
|
|
125
|
+
} = await inquirer.prompt([{
|
|
126
|
+
type: 'input',
|
|
127
|
+
name: 'siteName',
|
|
128
|
+
message: 'Enter a name for your new web5 site:',
|
|
129
|
+
validate: v => {
|
|
130
|
+
const trimmed = v.trim();
|
|
131
|
+
if (trimmed.length === 0) return 'Name is required';
|
|
132
|
+
if (trimmed.length > 20) return 'Name must be 20 characters or less';
|
|
133
|
+
if (!/^[a-z0-9_]+$/.test(trimmed)) return 'Name must contain only lowercase letters, numbers, and underscores';
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
}]);
|
|
137
|
+
const spin = (0, _print.spinner)('Creating new site...');
|
|
138
|
+
const newSite = await createWeb5Site(accessToken, siteName.trim());
|
|
139
|
+
spin.succeed(`Created site "${newSite.name}" (${newSite.msid})`);
|
|
140
|
+
return newSite.msid;
|
|
141
|
+
}
|
|
142
|
+
async function promptSiteSelection(accessToken) {
|
|
143
|
+
const {
|
|
144
|
+
default: inquirer
|
|
145
|
+
} = await Promise.resolve().then(() => _interopRequireWildcard(require('inquirer')));
|
|
146
|
+
const sites = await fetchWeb5Sites(accessToken);
|
|
147
|
+
if (sites.length === 0) {
|
|
148
|
+
(0, _print.info)("No web5 sites found. Let's create one.");
|
|
149
|
+
return promptCreateSite(accessToken, inquirer);
|
|
150
|
+
}
|
|
151
|
+
const CREATE_NEW = '__create_new__';
|
|
152
|
+
const choices = [...sites.map(s => ({
|
|
153
|
+
name: `${s.name} (${s.msid})`,
|
|
154
|
+
value: s.msid
|
|
155
|
+
})), {
|
|
156
|
+
name: 'Create a new web5 site',
|
|
157
|
+
value: CREATE_NEW
|
|
158
|
+
}];
|
|
159
|
+
const {
|
|
160
|
+
chosen
|
|
161
|
+
} = await inquirer.prompt([{
|
|
162
|
+
type: 'list',
|
|
163
|
+
name: 'chosen',
|
|
164
|
+
message: 'Select a web5 site:',
|
|
165
|
+
choices
|
|
166
|
+
}]);
|
|
167
|
+
if (chosen === CREATE_NEW) {
|
|
168
|
+
return promptCreateSite(accessToken, inquirer);
|
|
169
|
+
}
|
|
170
|
+
return chosen;
|
|
93
171
|
}
|
|
94
172
|
async function refreshAccessToken(refreshToken, siteId) {
|
|
95
173
|
const body = {
|
|
@@ -123,6 +201,7 @@ async function refreshAccessToken(refreshToken, siteId) {
|
|
|
123
201
|
return token;
|
|
124
202
|
}
|
|
125
203
|
async function pressEnterToContinue() {
|
|
204
|
+
const readline = await Promise.resolve().then(() => _interopRequireWildcard(require('readline')));
|
|
126
205
|
return new Promise(resolve => {
|
|
127
206
|
const rl = readline.createInterface({
|
|
128
207
|
input: process.stdin,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["readline","_interopRequireWildcard","require","_print","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","CLIENT_ID","DEVICE_CODE_URL","TOKEN_URL","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","verboseMode","log","args","console","sleep","ms","Promise","resolve","setTimeout","requestDeviceCode","url","res","fetch","status","statusText","ok","body","text","catch","Error","data","json","JSON","stringify","pollToken","deviceCode","deadline","Date","now","grant_type","client_id","device_code","attempt","method","headers","token","access_token","refresh_token","errorBody","error","promptForSiteId","rl","createInterface","input","process","stdin","output","stdout","question","answer","close","trimmed","trim","UUID_RE","test","refreshAccessToken","refreshToken","siteId","site_id","pressEnterToContinue","runDeviceFlow","verbose","noBrowser","code","info","userCode","verificationUri","open","then","spin","spinner","succeed","err","fail"],"sources":["../../../src/auth/deviceFlow.ts"],"sourcesContent":["import * as readline from 'readline';\nimport { spinner, info } from '../utils/print';\n\n// const CLIENT_ID = '602051c7-ec4b-4334-b90d-b029b076ba8f';\nconst CLIENT_ID = '6f95cec8-3e98-48b9-b4e5-1fb92fcd9973';\nconst DEVICE_CODE_URL = 'https://www.wixapis.com/oauth2/device/code';\nconst TOKEN_URL = 'https://www.wixapis.com/oauth2/token';\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 60_000;\n\nlet verboseMode = false;\n\nfunction log(...args: unknown[]): void {\n if (verboseMode) {\n console.log('[auth]', ...args);\n }\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function requestDeviceCode(): Promise<DeviceCodeResponse> {\n const url = `${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=session_bound_access`;\n log(`POST ${url}`);\n\n const res = await fetch(url);\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Device code request failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const data = (await res.json()) as DeviceCodeResponse;\n log(`Device code response:`, JSON.stringify(data, null, 2));\n return data;\n}\n\nasync function pollToken(deviceCode: string): Promise<TokenResponse> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n const body = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n client_id: CLIENT_ID,\n device_code: deviceCode,\n };\n\n log(`Poll URL: POST ${TOKEN_URL}`);\n log(`Request body:`, JSON.stringify(body, null, 2));\n\n let attempt = 0;\n while (Date.now() < deadline) {\n attempt++;\n log(`Poll attempt #${attempt}`);\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (res.ok) {\n const token = (await res.json()) as TokenResponse;\n log(\n `Token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n }\n\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Poll error body:`, JSON.stringify(errorBody, null, 2));\n\n if (errorBody.error === 'access_denied') {\n throw new Error('Access denied');\n }\n\n // authorization_pending, slow_down, unknown_error, or any transient error → keep polling\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new Error(\n 'Verification failed — timed out after 60 seconds. Please run `web5 login` again.',\n );\n}\n\nexport async function promptForSiteId(): Promise<string | null> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(\n ' Enter your site ID (msid) or press Enter to skip: ',\n (answer) => {\n rl.close();\n const trimmed = answer.trim();\n const UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n resolve(UUID_RE.test(trimmed) ? trimmed : null);\n },\n );\n });\n}\n\nexport async function refreshAccessToken(\n refreshToken: string,\n siteId?: string,\n): Promise<TokenResponse> {\n const body: Record<string, string> = {\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n };\n\n if (siteId) {\n body.site_id = siteId;\n }\n\n log(`Refreshing access token: POST ${TOKEN_URL}`);\n\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n log(`Refresh response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Refresh error body:`, JSON.stringify(errorBody, null, 2));\n throw new Error(\n `Token refresh failed (${res.status}): ${\n errorBody.error ?? res.statusText\n }`,\n );\n }\n\n const token = (await res.json()) as TokenResponse;\n log(\n `Refresh token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n}\n\nasync function pressEnterToContinue(): Promise<void> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(' Press Enter to open in browser...', () => {\n rl.close();\n resolve();\n });\n });\n}\n\nexport async function runDeviceFlow(\n verbose = false,\n noBrowser = false,\n): Promise<TokenResponse> {\n verboseMode = verbose;\n const code = await requestDeviceCode();\n\n console.log('');\n info(`Verification code: ${code.userCode}`);\n console.log(` ${code.verificationUri}`);\n console.log('');\n\n if (noBrowser) {\n info('Open the URL above in your browser to authenticate.');\n } else {\n await pressEnterToContinue();\n const open = (await import('open')).default;\n await open(code.verificationUri);\n console.log('');\n }\n\n const spin = spinner('Waiting for approval...');\n\n try {\n const token = await pollToken(code.deviceCode);\n spin.succeed('Approved');\n return token;\n } catch (err) {\n spin.fail('Authentication failed');\n throw err;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_print","require","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","CLIENT_ID","DEVICE_CODE_URL","TOKEN_URL","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","verboseMode","log","args","console","sleep","ms","Promise","resolve","setTimeout","requestDeviceCode","url","res","fetch","status","statusText","ok","body","text","catch","Error","data","json","JSON","stringify","pollToken","deviceCode","deadline","Date","now","grant_type","client_id","device_code","attempt","method","headers","token","access_token","refresh_token","errorBody","error","WEB5_SITES_URL","fetchWeb5Sites","accessToken","Authorization","Connection","sites","createWeb5Site","name","site","promptCreateSite","inquirer","siteName","prompt","type","message","validate","v","trimmed","trim","length","test","spin","spinner","newSite","succeed","msid","promptSiteSelection","then","info","CREATE_NEW","choices","map","s","value","chosen","refreshAccessToken","refreshToken","siteId","site_id","pressEnterToContinue","readline","rl","createInterface","input","process","stdin","output","stdout","question","close","runDeviceFlow","verbose","noBrowser","code","userCode","verificationUri","open","err","fail"],"sources":["../../../src/auth/deviceFlow.ts"],"sourcesContent":["import { spinner, info } from '../utils/print';\n\nconst CLIENT_ID = '602051c7-ec4b-4334-b90d-b029b076ba8f'; // web5 cli client id\n// const CLIENT_ID = '6f95cec8-3e98-48b9-b4e5-1fb92fcd9973'; // Regular wix client id\nconst DEVICE_CODE_URL = 'https://www.wixapis.com/oauth2/device/code';\nconst TOKEN_URL = 'https://www.wixapis.com/oauth2/token';\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 60_000;\n\nlet verboseMode = false;\n\nfunction log(...args: unknown[]): void {\n if (verboseMode) {\n console.log('[auth]', ...args);\n }\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function requestDeviceCode(): Promise<DeviceCodeResponse> {\n const url = `${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=offline_access`;\n log(`POST ${url}`);\n\n const res = await fetch(url);\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Device code request failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const data = (await res.json()) as DeviceCodeResponse;\n log(`Device code response:`, JSON.stringify(data, null, 2));\n return data;\n}\n\nasync function pollToken(deviceCode: string): Promise<TokenResponse> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n const body = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n client_id: CLIENT_ID,\n device_code: deviceCode,\n };\n\n log(`Poll URL: POST ${TOKEN_URL}`);\n log(`Request body:`, JSON.stringify(body, null, 2));\n\n let attempt = 0;\n while (Date.now() < deadline) {\n attempt++;\n log(`Poll attempt #${attempt}`);\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (res.ok) {\n const token = (await res.json()) as TokenResponse;\n log(\n `Token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n }\n\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Poll error body:`, JSON.stringify(errorBody, null, 2));\n\n if (errorBody.error === 'access_denied') {\n throw new Error('Access denied');\n }\n\n // authorization_pending, slow_down, unknown_error, or any transient error → keep polling\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new Error(\n 'Verification failed — timed out after 60 seconds. Please run `web5 login` again.',\n );\n}\n\nconst WEB5_SITES_URL = 'https://www.wixapis.com/web5/_api/cli/web5-sites';\n\ninterface Site {\n msid: string;\n name: string;\n}\n\nasync function fetchWeb5Sites(accessToken: string): Promise<Site[]> {\n log(`GET ${WEB5_SITES_URL}`);\n const res = await fetch(WEB5_SITES_URL, {\n headers: { Authorization: `Bearer ${accessToken}`, Connection: 'close' },\n });\n log(`Response: ${res.status} ${res.statusText}`);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Failed to fetch sites: ${res.status} ${res.statusText} — ${body}`,\n );\n }\n const data = (await res.json()) as { sites?: Site[] };\n log(`Sites response:`, JSON.stringify(data, null, 2));\n return data.sites ?? [];\n}\n\nasync function createWeb5Site(\n accessToken: string,\n name: string,\n): Promise<Site> {\n const url = `${WEB5_SITES_URL}/create`;\n log(`POST ${url}`);\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n Connection: 'close',\n },\n body: JSON.stringify({ name }),\n });\n log(`Response: ${res.status} ${res.statusText}`);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Failed to create site: ${res.status} ${res.statusText} — ${body}`,\n );\n }\n const body = (await res.json()) as { site: Site };\n log(`Create site response:`, JSON.stringify(body, null, 2));\n return body.site;\n}\n\nasync function promptCreateSite(\n accessToken: string,\n inquirer: typeof import('inquirer'),\n): Promise<string> {\n const { siteName } = await inquirer.prompt<{ siteName: string }>([\n {\n type: 'input',\n name: 'siteName',\n message: 'Enter a name for your new web5 site:',\n validate: (v: string) => {\n const trimmed = v.trim();\n if (trimmed.length === 0) return 'Name is required';\n if (trimmed.length > 20) return 'Name must be 20 characters or less';\n if (!/^[a-z0-9_]+$/.test(trimmed)) return 'Name must contain only lowercase letters, numbers, and underscores';\n return true;\n },\n },\n ]);\n const spin = spinner('Creating new site...');\n const newSite = await createWeb5Site(accessToken, siteName.trim());\n spin.succeed(`Created site \"${newSite.name}\" (${newSite.msid})`);\n return newSite.msid;\n}\n\nexport async function promptSiteSelection(\n accessToken: string,\n): Promise<string> {\n const { default: inquirer } = await import('inquirer');\n const sites = await fetchWeb5Sites(accessToken);\n\n if (sites.length === 0) {\n info(\"No web5 sites found. Let's create one.\");\n return promptCreateSite(accessToken, inquirer);\n }\n\n const CREATE_NEW = '__create_new__';\n const choices = [\n ...sites.map((s) => ({ name: `${s.name} (${s.msid})`, value: s.msid })),\n { name: 'Create a new web5 site', value: CREATE_NEW },\n ];\n\n const { chosen } = await inquirer.prompt<{ chosen: string }>([\n {\n type: 'list',\n name: 'chosen',\n message: 'Select a web5 site:',\n choices,\n },\n ]);\n\n if (chosen === CREATE_NEW) {\n return promptCreateSite(accessToken, inquirer);\n }\n\n return chosen;\n}\n\nexport async function refreshAccessToken(\n refreshToken: string,\n siteId?: string,\n): Promise<TokenResponse> {\n const body: Record<string, string> = {\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n };\n\n if (siteId) {\n body.site_id = siteId;\n }\n\n log(`Refreshing access token: POST ${TOKEN_URL}`);\n\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n log(`Refresh response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Refresh error body:`, JSON.stringify(errorBody, null, 2));\n throw new Error(\n `Token refresh failed (${res.status}): ${\n errorBody.error ?? res.statusText\n }`,\n );\n }\n\n const token = (await res.json()) as TokenResponse;\n log(\n `Refresh token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n}\n\nasync function pressEnterToContinue(): Promise<void> {\n const readline = await import('readline');\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(' Press Enter to open in browser...', () => {\n rl.close();\n resolve();\n });\n });\n}\n\nexport async function runDeviceFlow(\n verbose = false,\n noBrowser = false,\n): Promise<TokenResponse> {\n verboseMode = verbose;\n const code = await requestDeviceCode();\n\n console.log('');\n info(`Verification code: ${code.userCode}`);\n console.log(` ${code.verificationUri}`);\n console.log('');\n\n if (noBrowser) {\n info('Open the URL above in your browser to authenticate.');\n } else {\n await pressEnterToContinue();\n const open = (await import('open')).default;\n await open(code.verificationUri);\n console.log('');\n }\n\n const spin = spinner('Waiting for approval...');\n\n try {\n const token = await pollToken(code.deviceCode);\n spin.succeed('Approved');\n return token;\n } catch (err) {\n spin.fail('Authentication failed');\n throw err;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/cjs/auth/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.getToken = getToken;
|
|
5
|
+
exports.getTokenForSite = getTokenForSite;
|
|
5
6
|
exports.isAuthenticated = isAuthenticated;
|
|
6
7
|
exports.login = login;
|
|
7
8
|
exports.logout = logout;
|
|
@@ -11,6 +12,9 @@ var _secretStore = require("./secretStore");
|
|
|
11
12
|
var _print = require("../utils/print");
|
|
12
13
|
// Refresh proactively if the access token expires within this window
|
|
13
14
|
const EXPIRY_BUFFER_MS = 60_000;
|
|
15
|
+
|
|
16
|
+
// Per-process in-memory cache for site-scoped tokens. Never persisted.
|
|
17
|
+
const siteTokenCache = new Map();
|
|
14
18
|
function credentialsFromToken(token, siteId) {
|
|
15
19
|
return {
|
|
16
20
|
access_token: token.access_token,
|
|
@@ -31,13 +35,9 @@ async function login(apiKey, verbose = false, opts = {}) {
|
|
|
31
35
|
}
|
|
32
36
|
const token = await (0, _deviceFlow.runDeviceFlow)(verbose, opts.noBrowser ?? false);
|
|
33
37
|
console.log('');
|
|
34
|
-
const siteId = opts.siteId ?? (await (0, _deviceFlow.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
await (0, _secretStore.writeCredentials)(credentialsFromToken(siteToken, siteId));
|
|
38
|
-
} else {
|
|
39
|
-
await (0, _secretStore.writeCredentials)(credentialsFromToken(token));
|
|
40
|
-
}
|
|
38
|
+
const siteId = opts.siteId ?? (await (0, _deviceFlow.promptSiteSelection)(token.access_token));
|
|
39
|
+
const siteToken = await (0, _deviceFlow.refreshAccessToken)(token.refresh_token, siteId);
|
|
40
|
+
await (0, _secretStore.writeCredentials)(credentialsFromToken(siteToken, siteId));
|
|
41
41
|
(0, _print.success)('Authenticated');
|
|
42
42
|
}
|
|
43
43
|
async function switchSite(siteId) {
|
|
@@ -51,9 +51,12 @@ async function switchSite(siteId) {
|
|
|
51
51
|
if (!creds.refresh_token) {
|
|
52
52
|
throw new Error('No refresh token available. Run `web5 login` first.');
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
await (0,
|
|
56
|
-
(0,
|
|
54
|
+
// Get an unscoped token to fetch the sites list, then let user pick
|
|
55
|
+
const baseToken = await (0, _deviceFlow.refreshAccessToken)(creds.refresh_token);
|
|
56
|
+
const resolvedSiteId = siteId ?? (await (0, _deviceFlow.promptSiteSelection)(baseToken.access_token));
|
|
57
|
+
const refreshed = await (0, _deviceFlow.refreshAccessToken)(creds.refresh_token, resolvedSiteId);
|
|
58
|
+
await (0, _secretStore.writeCredentials)(credentialsFromToken(refreshed, resolvedSiteId));
|
|
59
|
+
(0, _print.success)(`Switched to site ${resolvedSiteId}`);
|
|
57
60
|
}
|
|
58
61
|
async function logout() {
|
|
59
62
|
await (0, _secretStore.clearCredentials)();
|
|
@@ -90,6 +93,33 @@ async function getToken() {
|
|
|
90
93
|
}
|
|
91
94
|
return null;
|
|
92
95
|
}
|
|
96
|
+
async function getTokenForSite(msid) {
|
|
97
|
+
const cached = siteTokenCache.get(msid);
|
|
98
|
+
if (cached && cached.expires_at - Date.now() > EXPIRY_BUFFER_MS) {
|
|
99
|
+
return cached.access_token;
|
|
100
|
+
}
|
|
101
|
+
const creds = await (0, _secretStore.readCredentials)();
|
|
102
|
+
if (!creds) {
|
|
103
|
+
throw new Error('Not authenticated. Run `web5 login` first.');
|
|
104
|
+
}
|
|
105
|
+
if (creds.api_key) {
|
|
106
|
+
return creds.api_key;
|
|
107
|
+
}
|
|
108
|
+
if (!creds.refresh_token) {
|
|
109
|
+
throw new Error('Not authenticated. Run `web5 login` first.');
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const refreshed = await (0, _deviceFlow.refreshAccessToken)(creds.refresh_token, msid);
|
|
113
|
+
const entry = {
|
|
114
|
+
access_token: refreshed.access_token,
|
|
115
|
+
expires_at: Date.now() + refreshed.expires_in * 1000
|
|
116
|
+
};
|
|
117
|
+
siteTokenCache.set(msid, entry);
|
|
118
|
+
return entry.access_token;
|
|
119
|
+
} catch {
|
|
120
|
+
throw new Error(`Failed to get a token scoped to site ${msid}. ` + `Verify the msid in web5.config.json is correct and you have access to that site.`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
93
123
|
async function isAuthenticated() {
|
|
94
124
|
try {
|
|
95
125
|
return (await getToken()) !== null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_deviceFlow","require","_secretStore","_print","EXPIRY_BUFFER_MS","credentialsFromToken","token","siteId","access_token","refresh_token","expires_at","Date","now","expires_in","site_id","login","apiKey","verbose","opts","writeCredentials","api_key","success","runDeviceFlow","noBrowser","console","log","
|
|
1
|
+
{"version":3,"names":["_deviceFlow","require","_secretStore","_print","EXPIRY_BUFFER_MS","siteTokenCache","Map","credentialsFromToken","token","siteId","access_token","refresh_token","expires_at","Date","now","expires_in","site_id","login","apiKey","verbose","opts","writeCredentials","api_key","success","runDeviceFlow","noBrowser","console","log","promptSiteSelection","siteToken","refreshAccessToken","switchSite","creds","readCredentials","Error","baseToken","resolvedSiteId","refreshed","logout","clearCredentials","getToken","updated","getTokenForSite","msid","cached","get","entry","set","isAuthenticated"],"sources":["../../../src/auth/index.ts"],"sourcesContent":["import {\n runDeviceFlow,\n refreshAccessToken,\n promptSiteSelection,\n} from './deviceFlow';\nimport {\n writeCredentials,\n readCredentials,\n clearCredentials,\n} from './secretStore';\nimport { success } from '../utils/print';\n\nexport type { Credentials } from './secretStore';\n\n// Refresh proactively if the access token expires within this window\nconst EXPIRY_BUFFER_MS = 60_000;\n\n// Per-process in-memory cache for site-scoped tokens. Never persisted.\nconst siteTokenCache = new Map<\n string,\n { access_token: string; expires_at: number }\n>();\n\nfunction credentialsFromToken(\n token: {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n },\n siteId?: string,\n) {\n return {\n access_token: token.access_token,\n refresh_token: token.refresh_token,\n expires_at: Date.now() + token.expires_in * 1000,\n ...(siteId ? { site_id: siteId } : {}),\n };\n}\n\nexport async function login(\n apiKey?: string,\n verbose = false,\n opts: { siteId?: string; noBrowser?: boolean } = {},\n): Promise<void> {\n if (apiKey) {\n await writeCredentials({ api_key: apiKey });\n success('API key saved');\n return;\n }\n\n const token = await runDeviceFlow(verbose, opts.noBrowser ?? false);\n\n console.log('');\n const siteId = opts.siteId ?? (await promptSiteSelection(token.access_token));\n const siteToken = await refreshAccessToken(token.refresh_token, siteId);\n await writeCredentials(credentialsFromToken(siteToken, siteId));\n\n success('Authenticated');\n}\n\nexport async function switchSite(siteId?: string): Promise<void> {\n const creds = await readCredentials();\n if (!creds) {\n throw new Error('Not authenticated. Run `web5 login` first.');\n }\n if (creds.api_key) {\n throw new Error(\n 'Cannot switch site when using an API key — re-run `web5 login --site-id <msid>` instead.',\n );\n }\n if (!creds.refresh_token) {\n throw new Error('No refresh token available. Run `web5 login` first.');\n }\n // Get an unscoped token to fetch the sites list, then let user pick\n const baseToken = await refreshAccessToken(creds.refresh_token);\n const resolvedSiteId =\n siteId ?? (await promptSiteSelection(baseToken.access_token));\n const refreshed = await refreshAccessToken(\n creds.refresh_token,\n resolvedSiteId,\n );\n await writeCredentials(credentialsFromToken(refreshed, resolvedSiteId));\n success(`Switched to site ${resolvedSiteId}`);\n}\n\nexport async function logout(): Promise<void> {\n await clearCredentials();\n success('Signed out \\u2014 credentials removed');\n}\n\nexport async function getToken(): Promise<string | null> {\n const creds = await readCredentials();\n if (!creds) {\n return null;\n }\n\n // API key path — no expiry concept\n if (creds.api_key) {\n return creds.api_key;\n }\n\n // Access token still valid\n if (\n creds.access_token &&\n creds.expires_at &&\n creds.expires_at - Date.now() > EXPIRY_BUFFER_MS\n ) {\n return creds.access_token;\n }\n\n // Access token missing or expiring soon — try refresh\n if (creds.refresh_token) {\n try {\n const refreshed = await refreshAccessToken(\n creds.refresh_token,\n creds.site_id,\n );\n const updated = credentialsFromToken(refreshed, creds.site_id);\n await writeCredentials(updated);\n return updated.access_token;\n } catch {\n // Refresh token is expired or revoked — force re-login\n await clearCredentials();\n throw new Error('Session expired. Run `web5 login` to re-authenticate.');\n }\n }\n\n return null;\n}\n\nexport async function getTokenForSite(msid: string): Promise<string> {\n const cached = siteTokenCache.get(msid);\n if (cached && cached.expires_at - Date.now() > EXPIRY_BUFFER_MS) {\n return cached.access_token;\n }\n\n const creds = await readCredentials();\n if (!creds) {\n throw new Error('Not authenticated. Run `web5 login` first.');\n }\n\n if (creds.api_key) {\n return creds.api_key;\n }\n\n if (!creds.refresh_token) {\n throw new Error('Not authenticated. Run `web5 login` first.');\n }\n\n try {\n const refreshed = await refreshAccessToken(creds.refresh_token, msid);\n const entry = {\n access_token: refreshed.access_token,\n expires_at: Date.now() + refreshed.expires_in * 1000,\n };\n siteTokenCache.set(msid, entry);\n return entry.access_token;\n } catch {\n throw new Error(\n `Failed to get a token scoped to site ${msid}. ` +\n `Verify the msid in web5.config.json is correct and you have access to that site.`,\n );\n }\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n try {\n return (await getToken()) !== null;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/cjs/cli.js
CHANGED
|
@@ -12,13 +12,13 @@ var _embed = require("./commands/embed");
|
|
|
12
12
|
var _conversationWizard = require("./commands/conversationWizard");
|
|
13
13
|
var _instructions = require("./commands/instructions");
|
|
14
14
|
var _deploy = require("./commands/deploy");
|
|
15
|
-
var _getClientId = require("./commands/getClientId");
|
|
16
15
|
var _whoami = require("./commands/whoami");
|
|
16
|
+
var _ecom = require("./commands/ecom");
|
|
17
17
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
18
18
|
// Read version from package.json at runtime (works from dist/cjs/ via ../../)
|
|
19
19
|
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf8'));
|
|
20
20
|
const program = new _commander.Command();
|
|
21
|
-
program.name('web5').description('Developer CLI for the Web5 platform').version(pkg.version).option('--json', 'Output as machine-readable JSON (suppresses decorations)');
|
|
21
|
+
program.name('web5').description('Developer CLI for the Web5 platform').version(pkg.version).addHelpCommand(false).option('--json', 'Output as machine-readable JSON (suppresses decorations)');
|
|
22
22
|
|
|
23
23
|
// Propagate --json to child processes via environment variable so that
|
|
24
24
|
// every command's action can call isJsonMode() without reading parent opts.
|
|
@@ -37,7 +37,7 @@ program.addCommand(_validate.validateCommand);
|
|
|
37
37
|
program.addCommand(_deploy.deployCommand);
|
|
38
38
|
program.addCommand(_serve.serveCommand);
|
|
39
39
|
program.addCommand(_embed.embedCommand);
|
|
40
|
-
program.addCommand(
|
|
40
|
+
program.addCommand(_ecom.ecomCommand);
|
|
41
41
|
|
|
42
42
|
// ── Wizards ───────────────────────────────────────────────────────────────
|
|
43
43
|
program.addCommand(_instructions.instructionsCommand);
|
package/dist/cjs/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_commander","require","fs","_interopRequireWildcard","path","_login","_logout","_init","_validate","_serve","_embed","_conversationWizard","_instructions","_deploy","
|
|
1
|
+
{"version":3,"names":["_commander","require","fs","_interopRequireWildcard","path","_login","_logout","_init","_validate","_serve","_embed","_conversationWizard","_instructions","_deploy","_whoami","_ecom","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","pkg","JSON","parse","readFileSync","join","__dirname","program","Command","name","description","version","addHelpCommand","option","hook","opts","json","process","env","WEB5_JSON_MODE","addCommand","loginCommand","logoutCommand","whoamiCommand","initCommand","validateCommand","deployCommand","serveCommand","embedCommand","ecomCommand","instructionsCommand","conversationsCommand","parseAsync","argv"],"sources":["../../src/cli.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { loginCommand } from './commands/login';\nimport { logoutCommand } from './commands/logout';\nimport { initCommand } from './commands/init';\nimport { validateCommand } from './commands/validate';\nimport { serveCommand } from './commands/serve';\nimport { embedCommand } from './commands/embed';\nimport { conversationsCommand } from './commands/conversationWizard';\nimport { instructionsCommand } from './commands/instructions';\nimport { deployCommand } from './commands/deploy';\nimport { whoamiCommand } from './commands/whoami';\nimport { ecomCommand } from './commands/ecom';\n\n// Read version from package.json at runtime (works from dist/cjs/ via ../../)\nconst pkg = JSON.parse(\n fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf8'),\n) as { version: string };\n\nconst program = new Command();\n\nprogram\n .name('web5')\n .description('Developer CLI for the Web5 platform')\n .version(pkg.version)\n .addHelpCommand(false)\n .option('--json', 'Output as machine-readable JSON (suppresses decorations)');\n\n// Propagate --json to child processes via environment variable so that\n// every command's action can call isJsonMode() without reading parent opts.\nprogram.hook('preAction', () => {\n if (program.opts().json) {\n process.env.WEB5_JSON_MODE = '1';\n }\n});\n\n// ── Commands ──────────────────────────────────────────────────────────────\nprogram.addCommand(loginCommand);\nprogram.addCommand(logoutCommand);\nprogram.addCommand(whoamiCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(validateCommand);\nprogram.addCommand(deployCommand);\nprogram.addCommand(serveCommand);\nprogram.addCommand(embedCommand);\nprogram.addCommand(ecomCommand);\n\n// ── Wizards ───────────────────────────────────────────────────────────────\nprogram.addCommand(instructionsCommand);\nprogram.addCommand(conversationsCommand);\n\nprogram.parseAsync(process.argv);\n"],"mappings":";;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,EAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,IAAA,GAAAD,uBAAA,CAAAF,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AACA,IAAAM,KAAA,GAAAN,OAAA;AACA,IAAAO,SAAA,GAAAP,OAAA;AACA,IAAAQ,MAAA,GAAAR,OAAA;AACA,IAAAS,MAAA,GAAAT,OAAA;AACA,IAAAU,mBAAA,GAAAV,OAAA;AACA,IAAAW,aAAA,GAAAX,OAAA;AACA,IAAAY,OAAA,GAAAZ,OAAA;AACA,IAAAa,OAAA,GAAAb,OAAA;AACA,IAAAc,KAAA,GAAAd,OAAA;AAA8C,SAAAE,wBAAAa,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAf,uBAAA,YAAAA,CAAAa,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAE9C;AACA,MAAMkB,GAAG,GAAGC,IAAI,CAACC,KAAK,CACpBnC,EAAE,CAACoC,YAAY,CAAClC,IAAI,CAACmC,IAAI,CAACC,SAAS,EAAE,oBAAoB,CAAC,EAAE,MAAM,CACpE,CAAwB;AAExB,MAAMC,OAAO,GAAG,IAAIC,kBAAO,CAAC,CAAC;AAE7BD,OAAO,CACJE,IAAI,CAAC,MAAM,CAAC,CACZC,WAAW,CAAC,qCAAqC,CAAC,CAClDC,OAAO,CAACV,GAAG,CAACU,OAAO,CAAC,CACpBC,cAAc,CAAC,KAAK,CAAC,CACrBC,MAAM,CAAC,QAAQ,EAAE,0DAA0D,CAAC;;AAE/E;AACA;AACAN,OAAO,CAACO,IAAI,CAAC,WAAW,EAAE,MAAM;EAC9B,IAAIP,OAAO,CAACQ,IAAI,CAAC,CAAC,CAACC,IAAI,EAAE;IACvBC,OAAO,CAACC,GAAG,CAACC,cAAc,GAAG,GAAG;EAClC;AACF,CAAC,CAAC;;AAEF;AACAZ,OAAO,CAACa,UAAU,CAACC,mBAAY,CAAC;AAChCd,OAAO,CAACa,UAAU,CAACE,qBAAa,CAAC;AACjCf,OAAO,CAACa,UAAU,CAACG,qBAAa,CAAC;AACjChB,OAAO,CAACa,UAAU,CAACI,iBAAW,CAAC;AAC/BjB,OAAO,CAACa,UAAU,CAACK,yBAAe,CAAC;AACnClB,OAAO,CAACa,UAAU,CAACM,qBAAa,CAAC;AACjCnB,OAAO,CAACa,UAAU,CAACO,mBAAY,CAAC;AAChCpB,OAAO,CAACa,UAAU,CAACQ,mBAAY,CAAC;AAChCrB,OAAO,CAACa,UAAU,CAACS,iBAAW,CAAC;;AAE/B;AACAtB,OAAO,CAACa,UAAU,CAACU,iCAAmB,CAAC;AACvCvB,OAAO,CAACa,UAAU,CAACW,wCAAoB,CAAC;AAExCxB,OAAO,CAACyB,UAAU,CAACf,OAAO,CAACgB,IAAI,CAAC","ignoreList":[]}
|
|
@@ -23,9 +23,15 @@ async function runBundle(root, opts = {}) {
|
|
|
23
23
|
process.exit(1);
|
|
24
24
|
}
|
|
25
25
|
const args = ['build', '--config', 'src/vite.cdn.config.ts'];
|
|
26
|
-
if (!minify)
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
if (!minify) {
|
|
27
|
+
args.push('--minify', 'false');
|
|
28
|
+
}
|
|
29
|
+
if (outDir) {
|
|
30
|
+
args.push('--outDir', outDir);
|
|
31
|
+
}
|
|
32
|
+
if (sourcemap) {
|
|
33
|
+
args.push('--sourcemap');
|
|
34
|
+
}
|
|
29
35
|
if (watch) {
|
|
30
36
|
// Non-blocking watch mode — let vite output flow through
|
|
31
37
|
args.push('--watch');
|
|
@@ -41,7 +47,9 @@ async function runBundle(root, opts = {}) {
|
|
|
41
47
|
});
|
|
42
48
|
await new Promise((_, reject) => {
|
|
43
49
|
child.on('exit', code => {
|
|
44
|
-
if (code !== 0)
|
|
50
|
+
if (code !== 0) {
|
|
51
|
+
reject(new Error(`vite exited with code ${code}`));
|
|
52
|
+
}
|
|
45
53
|
});
|
|
46
54
|
});
|
|
47
55
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_commander","require","_child_process","_fs","path","_interopRequireWildcard","_project","_print","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","runBundle","root","opts","watch","minify","outDir","sourcemap","viteBin","join","existsSync","error","process","exit","args","push","success","child","spawn","cwd","shell","stdio","on","err_","message","Promise","_","reject","code","Error","sp","isJsonMode","spinner","execSync","stop","resolvedOutDir","resolve","files","readdirSync","map","full","file","size","statSync","console","log","JSON","stringify","ok","_stderr","msg","stderr","toString","trim","String","bundleCommand","exports","Command","description","option","action","findProjectRoot","outdir"],"sources":["../../../src/commands/bundle.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { execSync, spawn } from 'child_process';\nimport { existsSync, readdirSync, statSync } from 'fs';\nimport * as path from 'path';\nimport { findProjectRoot } from '../utils/project';\nimport { success, error, spinner, isJsonMode } from '../utils/print';\n\nexport interface BundleOptions {\n watch?: boolean;\n minify?: boolean;\n outDir?: string;\n sourcemap?: boolean;\n}\n\nexport async function runBundle(root: string
|
|
1
|
+
{"version":3,"names":["_commander","require","_child_process","_fs","path","_interopRequireWildcard","_project","_print","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","runBundle","root","opts","watch","minify","outDir","sourcemap","viteBin","join","existsSync","error","process","exit","args","push","success","child","spawn","cwd","shell","stdio","on","err_","message","Promise","_","reject","code","Error","sp","isJsonMode","spinner","execSync","stop","resolvedOutDir","resolve","files","readdirSync","map","full","file","size","statSync","console","log","JSON","stringify","ok","_stderr","msg","stderr","toString","trim","String","bundleCommand","exports","Command","description","option","action","findProjectRoot","outdir"],"sources":["../../../src/commands/bundle.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { execSync, spawn } from 'child_process';\nimport { existsSync, readdirSync, statSync } from 'fs';\nimport * as path from 'path';\nimport { findProjectRoot } from '../utils/project';\nimport { success, error, spinner, isJsonMode } from '../utils/print';\n\nexport interface BundleOptions {\n watch?: boolean;\n minify?: boolean;\n outDir?: string;\n sourcemap?: boolean;\n}\n\nexport async function runBundle(\n root: string,\n opts: BundleOptions = {},\n): Promise<void> {\n const { watch, minify = true, outDir, sourcemap } = opts;\n\n const viteBin = path.join(root, 'node_modules', '.bin', 'vite');\n if (!existsSync(viteBin)) {\n error('vite not found. Run `npm install` in your project first.');\n process.exit(1);\n }\n\n const args = ['build', '--config', 'src/vite.cdn.config.ts'];\n if (!minify) {\n args.push('--minify', 'false');\n }\n if (outDir) {\n args.push('--outDir', outDir);\n }\n if (sourcemap) {\n args.push('--sourcemap');\n }\n\n if (watch) {\n // Non-blocking watch mode — let vite output flow through\n args.push('--watch');\n success('Starting bundle watch mode (press Ctrl+C to stop)...');\n const child = spawn(`\"${viteBin}\"`, args, {\n cwd: root,\n shell: true,\n stdio: 'inherit',\n });\n child.on('error', (err_) => {\n error(err_.message);\n process.exit(1);\n });\n await new Promise<void>((_, reject) => {\n child.on('exit', (code) => {\n if (code !== 0) {\n reject(new Error(`vite exited with code ${code}`));\n }\n });\n });\n return;\n }\n\n const sp = isJsonMode()\n ? null\n : spinner('Bundling actions and components...');\n try {\n execSync(`\"${viteBin}\" ${args.join(' ')}`, { cwd: root, stdio: 'pipe' });\n sp?.stop();\n\n const resolvedOutDir = outDir\n ? path.resolve(outDir)\n : path.join(root, 'dist', 'cdn');\n\n if (isJsonMode()) {\n const files = existsSync(resolvedOutDir)\n ? readdirSync(resolvedOutDir).map((f) => {\n const full = path.join(resolvedOutDir, f);\n return { file: f, size: statSync(full).size };\n })\n : [];\n console.log(JSON.stringify({ ok: true, outDir: resolvedOutDir, files }));\n } else {\n sp?.stop();\n success('Bundle complete');\n }\n } catch (err_) {\n sp?.stop();\n const msg =\n err_ instanceof Error\n ? (err_ as Error & { stderr?: Buffer }).stderr?.toString().trim() ||\n err_.message\n : String(err_);\n error(msg);\n process.exit(1);\n }\n}\n\nexport const bundleCommand = new Command('bundle')\n .description('Bundle actions and components into dist/cdn/')\n .option('--watch', 'Re-bundle on source file changes')\n .option('--no-minify', 'Disable minification (useful for debugging)')\n .option('--outdir <path>', 'Override output directory (default: dist/cdn/)')\n .option('--sourcemap', 'Generate source maps')\n .action(\n async (opts: {\n watch?: boolean;\n minify: boolean;\n outdir?: string;\n sourcemap?: boolean;\n }) => {\n const root = findProjectRoot(process.cwd());\n if (!root) {\n error(\n 'No web5.config.json found. Run this command from within a Web5 project.',\n );\n process.exit(1);\n }\n await runBundle(root, {\n watch: opts.watch,\n minify: opts.minify,\n outDir: opts.outdir,\n sourcemap: opts.sourcemap,\n });\n },\n );\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_commander","require","readline","_interopRequireWildcard","_chalk","_interopRequireDefault","_wixApi","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","promptForTid","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","question","answer","close","trim","getCmd","Command","description","option","action","opts","tid","id","console","error","exit","data","wixRequest","path","messages","length","log","msg","role","chalk","cyan","green","content","err","message","conversationCommand","exports","addCommand"],"sources":["../../../src/commands/conversation.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport chalk from 'chalk';\nimport { wixRequest } from '../utils/wixApi';\n\ninterface ConversationMessage {\n role?: string;\n content?: string;\n createdDate?: string;\n}\n\ninterface ConversationDetail {\n messages?: ConversationMessage[];\n [key: string]: unknown;\n}\n\nasync function promptForTid(): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question('Enter trigger ID (TID): ', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nconst getCmd = new Command('get')\n .description('Get a conversation by trigger ID')\n .option('--id <uuid>', 'Trigger ID (TID)')\n .action(async (opts) => {\n try {\n const tid: string = opts.id || (await promptForTid());\n if (!tid) {\n console.error('Error: trigger ID is required');\n process.exit(1);\n }\n\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${tid}`,\n });\n\n const messages = data.messages ?? [];\n if (messages.length === 0) {\n console.log('(no messages)');\n return;\n }\n for (const msg of messages) {\n const role
|
|
1
|
+
{"version":3,"names":["_commander","require","readline","_interopRequireWildcard","_chalk","_interopRequireDefault","_wixApi","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","promptForTid","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","question","answer","close","trim","getCmd","Command","description","option","action","opts","tid","id","console","error","exit","data","wixRequest","path","messages","length","log","msg","role","chalk","cyan","green","content","err","message","conversationCommand","exports","addCommand"],"sources":["../../../src/commands/conversation.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport chalk from 'chalk';\nimport { wixRequest } from '../utils/wixApi';\n\ninterface ConversationMessage {\n role?: string;\n content?: string;\n createdDate?: string;\n}\n\ninterface ConversationDetail {\n messages?: ConversationMessage[];\n [key: string]: unknown;\n}\n\nasync function promptForTid(): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question('Enter trigger ID (TID): ', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nconst getCmd = new Command('get')\n .description('Get a conversation by trigger ID')\n .option('--id <uuid>', 'Trigger ID (TID)')\n .action(async (opts) => {\n try {\n const tid: string = opts.id || (await promptForTid());\n if (!tid) {\n console.error('Error: trigger ID is required');\n process.exit(1);\n }\n\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${tid}`,\n });\n\n const messages = data.messages ?? [];\n if (messages.length === 0) {\n console.log('(no messages)');\n return;\n }\n for (const msg of messages) {\n const role =\n msg.role === 'user'\n ? chalk.cyan('user: ')\n : chalk.green('assistant:');\n console.log(role);\n console.log(msg.content ?? '(empty)');\n console.log();\n }\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\nexport const conversationCommand = new Command('conversation')\n .description('Conversation history commands')\n .addCommand(getCmd);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,9 +12,22 @@ var _chalk = _interopRequireDefault(require("chalk"));
|
|
|
12
12
|
var _ora = _interopRequireDefault(require("ora"));
|
|
13
13
|
var _open = _interopRequireDefault(require("open"));
|
|
14
14
|
var _wixApi = require("../utils/wixApi");
|
|
15
|
+
var _project = require("../utils/project");
|
|
15
16
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
16
17
|
// ── API response shapes ────────────────────────────────────────────────────
|
|
17
18
|
|
|
19
|
+
// ── Config helpers ─────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
function getFirstAllowedDomain() {
|
|
22
|
+
var _config$allowedDomain;
|
|
23
|
+
const root = (0, _project.findProjectRoot)(process.cwd());
|
|
24
|
+
if (!root) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const config = (0, _project.readConfig)(root);
|
|
28
|
+
return ((_config$allowedDomain = config.allowedDomains) == null ? void 0 : _config$allowedDomain[0]) ?? null;
|
|
29
|
+
}
|
|
30
|
+
|
|
18
31
|
// ── Verbose flag ───────────────────────────────────────────────────────────
|
|
19
32
|
|
|
20
33
|
let verbose = false;
|
|
@@ -292,23 +305,27 @@ async function showMessageDetailScreen(messages, index, conversationId) {
|
|
|
292
305
|
console.log(_chalk.default.cyan('╚' + '═'.repeat(BOX_W) + '╝'));
|
|
293
306
|
console.log();
|
|
294
307
|
const tid = msg.triggerId ?? '';
|
|
295
|
-
const
|
|
308
|
+
const domain = getFirstAllowedDomain();
|
|
309
|
+
const choices = [{
|
|
310
|
+
name: ` ${_chalk.default.dim('← Back')}`,
|
|
311
|
+
value: 'back'
|
|
312
|
+
}];
|
|
313
|
+
if (domain) {
|
|
314
|
+
choices.push({
|
|
315
|
+
name: ` 🌐 Open in browser`,
|
|
316
|
+
value: 'browser'
|
|
317
|
+
});
|
|
318
|
+
}
|
|
296
319
|
const {
|
|
297
320
|
action
|
|
298
321
|
} = await _inquirer.default.prompt([{
|
|
299
322
|
type: 'list',
|
|
300
323
|
name: 'action',
|
|
301
324
|
message: _chalk.default.bold('What would you like to do?'),
|
|
302
|
-
choices
|
|
303
|
-
name: ` ${_chalk.default.dim('← Back')}`,
|
|
304
|
-
value: 'back'
|
|
305
|
-
}, {
|
|
306
|
-
name: ` 🌐 Open in browser`,
|
|
307
|
-
value: 'browser'
|
|
308
|
-
}]
|
|
325
|
+
choices
|
|
309
326
|
}]);
|
|
310
|
-
if (action === 'browser') {
|
|
311
|
-
await (0, _open.default)(
|
|
327
|
+
if (action === 'browser' && domain) {
|
|
328
|
+
await (0, _open.default)(`${domain}/web5#tid=${tid}`);
|
|
312
329
|
}
|
|
313
330
|
}
|
|
314
331
|
|
|
@@ -443,7 +460,9 @@ const listCmd = new _commander.Command('list').description('List conversations (
|
|
|
443
460
|
process.exit(1);
|
|
444
461
|
}
|
|
445
462
|
roots = roots.filter(r => {
|
|
446
|
-
if (!r.createdDate)
|
|
463
|
+
if (!r.createdDate) {
|
|
464
|
+
return true;
|
|
465
|
+
}
|
|
447
466
|
return new Date(r.createdDate).getTime() >= since;
|
|
448
467
|
});
|
|
449
468
|
}
|
|
@@ -500,7 +519,12 @@ const exportCmd = new _commander.Command('export').description('Export a convers
|
|
|
500
519
|
// ── open ───────────────────────────────────────────────────────────────────
|
|
501
520
|
|
|
502
521
|
const openCmd = new _commander.Command('open').description('Open a conversation in the browser').requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation').action(async opts => {
|
|
503
|
-
const
|
|
522
|
+
const domain = getFirstAllowedDomain();
|
|
523
|
+
if (!domain) {
|
|
524
|
+
console.error(_chalk.default.red('No allowedDomains configured in web5.config.json'));
|
|
525
|
+
process.exit(1);
|
|
526
|
+
}
|
|
527
|
+
const browserUrl = `${domain}/web5#tid=${opts.id}`;
|
|
504
528
|
console.log(`Opening ${browserUrl}`);
|
|
505
529
|
await (0, _open.default)(browserUrl);
|
|
506
530
|
});
|