@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.
Files changed (108) hide show
  1. package/bin/web5.js +1 -2
  2. package/dist/cjs/auth/deviceFlow.js +96 -17
  3. package/dist/cjs/auth/deviceFlow.js.map +1 -1
  4. package/dist/cjs/auth/index.js +40 -10
  5. package/dist/cjs/auth/index.js.map +1 -1
  6. package/dist/cjs/cli.js +3 -3
  7. package/dist/cjs/cli.js.map +1 -1
  8. package/dist/cjs/commands/bundle.js +12 -4
  9. package/dist/cjs/commands/bundle.js.map +1 -1
  10. package/dist/cjs/commands/conversation.js.map +1 -1
  11. package/dist/cjs/commands/conversationWizard.js +36 -12
  12. package/dist/cjs/commands/conversationWizard.js.map +1 -1
  13. package/dist/cjs/commands/deploy.js +55 -10
  14. package/dist/cjs/commands/deploy.js.map +1 -1
  15. package/dist/cjs/commands/ecom.js +239 -0
  16. package/dist/cjs/commands/ecom.js.map +1 -0
  17. package/dist/cjs/commands/embed.js +41 -52
  18. package/dist/cjs/commands/embed.js.map +1 -1
  19. package/dist/cjs/commands/init.js +34 -3
  20. package/dist/cjs/commands/init.js.map +1 -1
  21. package/dist/cjs/commands/instructions.js +147 -51
  22. package/dist/cjs/commands/instructions.js.map +1 -1
  23. package/dist/cjs/commands/login.js +8 -4
  24. package/dist/cjs/commands/login.js.map +1 -1
  25. package/dist/cjs/commands/serve.js.map +1 -1
  26. package/dist/cjs/commands/validate.js +368 -16
  27. package/dist/cjs/commands/validate.js.map +1 -1
  28. package/dist/cjs/commands/whoami.js.map +1 -1
  29. package/dist/cjs/templates/aiInstructionsSchema.js +5 -1
  30. package/dist/cjs/templates/aiInstructionsSchema.js.map +1 -1
  31. package/dist/cjs/templates/cmsMappingSchema.js +132 -0
  32. package/dist/cjs/templates/cmsMappingSchema.js.map +1 -0
  33. package/dist/cjs/templates/embedDocs.js +488 -0
  34. package/dist/cjs/templates/embedDocs.js.map +1 -0
  35. package/dist/cjs/utils/project.js +13 -0
  36. package/dist/cjs/utils/project.js.map +1 -1
  37. package/dist/cjs/utils/wixApi.js +3 -1
  38. package/dist/cjs/utils/wixApi.js.map +1 -1
  39. package/dist/esm/auth/deviceFlow.js +95 -17
  40. package/dist/esm/auth/deviceFlow.js.map +1 -1
  41. package/dist/esm/auth/index.js +40 -11
  42. package/dist/esm/auth/index.js.map +1 -1
  43. package/dist/esm/cli.js +3 -3
  44. package/dist/esm/cli.js.map +1 -1
  45. package/dist/esm/commands/bundle.js +12 -4
  46. package/dist/esm/commands/bundle.js.map +1 -1
  47. package/dist/esm/commands/conversation.js.map +1 -1
  48. package/dist/esm/commands/conversationWizard.js +36 -12
  49. package/dist/esm/commands/conversationWizard.js.map +1 -1
  50. package/dist/esm/commands/deploy.js +55 -10
  51. package/dist/esm/commands/deploy.js.map +1 -1
  52. package/dist/esm/commands/ecom.js +234 -0
  53. package/dist/esm/commands/ecom.js.map +1 -0
  54. package/dist/esm/commands/embed.js +42 -52
  55. package/dist/esm/commands/embed.js.map +1 -1
  56. package/dist/esm/commands/init.js +34 -3
  57. package/dist/esm/commands/init.js.map +1 -1
  58. package/dist/esm/commands/instructions.js +152 -53
  59. package/dist/esm/commands/instructions.js.map +1 -1
  60. package/dist/esm/commands/login.js +8 -4
  61. package/dist/esm/commands/login.js.map +1 -1
  62. package/dist/esm/commands/serve.js.map +1 -1
  63. package/dist/esm/commands/validate.js +373 -19
  64. package/dist/esm/commands/validate.js.map +1 -1
  65. package/dist/esm/commands/whoami.js.map +1 -1
  66. package/dist/esm/templates/aiInstructionsSchema.js +5 -1
  67. package/dist/esm/templates/aiInstructionsSchema.js.map +1 -1
  68. package/dist/esm/templates/cmsMappingSchema.js +128 -0
  69. package/dist/esm/templates/cmsMappingSchema.js.map +1 -0
  70. package/dist/esm/templates/embedDocs.js +484 -0
  71. package/dist/esm/templates/embedDocs.js.map +1 -0
  72. package/dist/esm/utils/project.js +15 -0
  73. package/dist/esm/utils/project.js.map +1 -1
  74. package/dist/esm/utils/wixApi.js +4 -2
  75. package/dist/esm/utils/wixApi.js.map +1 -1
  76. package/dist/types/auth/deviceFlow.d.ts +1 -1
  77. package/dist/types/auth/deviceFlow.d.ts.map +1 -1
  78. package/dist/types/auth/index.d.ts +2 -1
  79. package/dist/types/auth/index.d.ts.map +1 -1
  80. package/dist/types/commands/bundle.d.ts.map +1 -1
  81. package/dist/types/commands/conversation.d.ts.map +1 -1
  82. package/dist/types/commands/conversationWizard.d.ts.map +1 -1
  83. package/dist/types/commands/deploy.d.ts.map +1 -1
  84. package/dist/types/commands/ecom.d.ts +3 -0
  85. package/dist/types/commands/ecom.d.ts.map +1 -0
  86. package/dist/types/commands/embed.d.ts.map +1 -1
  87. package/dist/types/commands/init.d.ts.map +1 -1
  88. package/dist/types/commands/instructions.d.ts.map +1 -1
  89. package/dist/types/commands/login.d.ts.map +1 -1
  90. package/dist/types/commands/serve.d.ts.map +1 -1
  91. package/dist/types/commands/validate.d.ts +4 -2
  92. package/dist/types/commands/validate.d.ts.map +1 -1
  93. package/dist/types/commands/whoami.d.ts.map +1 -1
  94. package/dist/types/templates/aiInstructionsSchema.d.ts.map +1 -1
  95. package/dist/types/templates/cmsMappingSchema.d.ts +2 -0
  96. package/dist/types/templates/cmsMappingSchema.d.ts.map +1 -0
  97. package/dist/types/templates/embedDocs.d.ts +2 -0
  98. package/dist/types/templates/embedDocs.d.ts.map +1 -0
  99. package/dist/types/utils/project.d.ts +3 -0
  100. package/dist/types/utils/project.d.ts.map +1 -1
  101. package/dist/types/utils/wixApi.d.ts.map +1 -1
  102. package/package.json +2 -2
  103. package/dist/cjs/commands/getClientId.js +0 -60
  104. package/dist/cjs/commands/getClientId.js.map +0 -1
  105. package/dist/esm/commands/getClientId.js +0 -56
  106. package/dist/esm/commands/getClientId.js.map +0 -1
  107. package/dist/types/commands/getClientId.d.ts +0 -3
  108. package/dist/types/commands/getClientId.d.ts.map +0 -1
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ exports.__esModule = true;
5
+ exports.ecomCommand = void 0;
6
+ var _commander = require("commander");
7
+ var _inquirer = _interopRequireDefault(require("inquirer"));
8
+ var _open = _interopRequireDefault(require("open"));
9
+ var _wixApi = require("../utils/wixApi");
10
+ var _print = require("../utils/print");
11
+ const BASE = '/_api/ecom-integrations/v1/ecom-integrations';
12
+
13
+ // ── Types ─────────────────────────────────────────────────────────────────────
14
+
15
+ // ── connect ───────────────────────────────────────────────────────────────────
16
+
17
+ const POLL_INTERVAL_MS = 3000;
18
+ const POLL_TIMEOUT_MS = 120_000;
19
+ async function pollUntilActive() {
20
+ const deadline = Date.now() + POLL_TIMEOUT_MS;
21
+ while (Date.now() < deadline) {
22
+ await new Promise(r => setTimeout(r, POLL_INTERVAL_MS));
23
+ try {
24
+ const data = await (0, _wixApi.wixRequest)({
25
+ path: `${BASE}/connection-status`,
26
+ method: 'GET'
27
+ });
28
+ if (data.status === 'ACTIVE') {
29
+ return true;
30
+ }
31
+ } catch {
32
+ // ignore transient errors and keep polling
33
+ }
34
+ }
35
+ return false;
36
+ }
37
+ const connectCmd = new _commander.Command('connect').description('Connect a Shopify store via OAuth2 (opens browser)').option('--store-id <id>', 'Shopify store slug (e.g. mystore)').action(async opts => {
38
+ const statusSp = (0, _print.spinner)('Checking connection status...');
39
+ try {
40
+ const statusData = await (0, _wixApi.wixRequest)({
41
+ path: `${BASE}/connection-status`,
42
+ method: 'GET'
43
+ });
44
+ statusSp.stop();
45
+ if (statusData.status === 'ACTIVE') {
46
+ (0, _print.error)('Already connected. Use `web5 ecom disconnect` first to reconnect.');
47
+ process.exit(1);
48
+ }
49
+ } catch {
50
+ statusSp.stop();
51
+ // not connected yet, proceed
52
+ }
53
+ let storeId = opts.storeId;
54
+ if (!storeId) {
55
+ const answer = await _inquirer.default.prompt([{
56
+ type: 'input',
57
+ name: 'storeId',
58
+ message: 'Shopify store slug (e.g. mystore):',
59
+ validate: v => v.trim().length > 0 || 'Store ID is required'
60
+ }]);
61
+ storeId = answer.storeId.trim();
62
+ }
63
+ const sp = (0, _print.spinner)('Initiating Shopify OAuth...');
64
+ try {
65
+ const data = await (0, _wixApi.wixRequest)({
66
+ path: `${BASE}/shopify-oauth/initiate`,
67
+ method: 'POST',
68
+ body: {
69
+ platform: 'SHOPIFY',
70
+ shopify: {
71
+ storeId
72
+ }
73
+ }
74
+ });
75
+ sp.stop();
76
+ const url = data.authorizationUrl ?? data.authorization_url;
77
+ if (!url) {
78
+ (0, _print.error)('No authorization URL returned by the server.');
79
+ process.exit(1);
80
+ }
81
+ (0, _print.info)(`Authorization URL: ${url}`);
82
+ await (0, _open.default)(url);
83
+ (0, _print.info)('Browser opened — complete the Shopify authorization...');
84
+ const polling = (0, _print.spinner)('Waiting for connection to become active...');
85
+ const active = await pollUntilActive();
86
+ polling.stop();
87
+ if (active) {
88
+ (0, _print.success)('Connected! Your Shopify store is now active.');
89
+ } else {
90
+ (0, _print.error)('Timed out waiting for the connection to become active. Run `web5 ecom status` to check.');
91
+ process.exit(1);
92
+ }
93
+ } catch (err_) {
94
+ sp.stop();
95
+ (0, _print.error)(err_.message);
96
+ process.exit(1);
97
+ }
98
+ });
99
+
100
+ // ── status ────────────────────────────────────────────────────────────────────
101
+
102
+ const statusCmd = new _commander.Command('status').description('Show the current ecom provider connection status').action(async () => {
103
+ const sp = (0, _print.spinner)('Fetching connection status...');
104
+ try {
105
+ const data = await (0, _wixApi.wixRequest)({
106
+ path: `${BASE}/connection-status`,
107
+ method: 'GET'
108
+ });
109
+ sp.stop();
110
+ if ((0, _print.isJsonMode)()) {
111
+ console.log(JSON.stringify(data));
112
+ return;
113
+ }
114
+ const status = data.status ?? 'UNKNOWN';
115
+ if (status === 'UNKNOWN') {
116
+ (0, _print.info)('Status: not connected');
117
+ return;
118
+ }
119
+ if (status === 'ACTIVE') {
120
+ (0, _print.success)(`Status: ${status}`);
121
+ } else {
122
+ (0, _print.error)(`Status: ${status}`);
123
+ if (data.errorMessage) {
124
+ (0, _print.info)(`Error: ${data.errorMessage}`);
125
+ }
126
+ }
127
+ if (data.lastFullSync) {
128
+ (0, _print.info)(`Last full sync: ${data.lastFullSync}`);
129
+ } else {
130
+ (0, _print.info)('Last full sync: never');
131
+ }
132
+ if (data.lastAlignmentSync) {
133
+ (0, _print.info)(`Last alignment: ${data.lastAlignmentSync}`);
134
+ } else {
135
+ (0, _print.info)('Last alignment: never');
136
+ }
137
+ } catch (err_) {
138
+ sp.stop();
139
+ (0, _print.error)(err_.message);
140
+ process.exit(1);
141
+ }
142
+ });
143
+
144
+ // ── full-sync ─────────────────────────────────────────────────────────────────
145
+
146
+ const fullSyncCmd = new _commander.Command('full-sync').description('Trigger a full sync from the ecom provider into CMS').action(async () => {
147
+ const sp = (0, _print.spinner)('Running full sync...');
148
+ try {
149
+ const data = await (0, _wixApi.wixRequest)({
150
+ path: `${BASE}/full-sync`,
151
+ method: 'POST',
152
+ body: {}
153
+ });
154
+ sp.stop();
155
+ (0, _print.success)(data.status ?? 'Full sync triggered');
156
+ } catch (err_) {
157
+ sp.stop();
158
+ (0, _print.error)(err_.message);
159
+ process.exit(1);
160
+ }
161
+ });
162
+
163
+ // ── alignment-sync ────────────────────────────────────────────────────────────
164
+
165
+ const alignmentSyncCmd = new _commander.Command('alignment-sync').description('Run an alignment sync to catch any missed webhook updates').action(async () => {
166
+ const sp = (0, _print.spinner)('Running alignment sync...');
167
+ try {
168
+ const data = await (0, _wixApi.wixRequest)({
169
+ path: `${BASE}/alignment-sync`,
170
+ method: 'POST',
171
+ body: {}
172
+ });
173
+ sp.stop();
174
+ (0, _print.success)(data.status ?? 'Alignment sync complete');
175
+ const counts = data.syncedCounts ?? {};
176
+ for (const [table, count] of Object.entries(counts)) {
177
+ (0, _print.info)(` ${table}: ${count}`);
178
+ }
179
+ } catch (err_) {
180
+ sp.stop();
181
+ (0, _print.error)(err_.message);
182
+ process.exit(1);
183
+ }
184
+ });
185
+
186
+ // ── align-cms ─────────────────────────────────────────────────────────────────
187
+
188
+ const alignCmsCmd = new _commander.Command('align-cms').description('Align CMS collections with the ecom provider schema').action(async () => {
189
+ const sp = (0, _print.spinner)('Aligning CMS collections...');
190
+ try {
191
+ await (0, _wixApi.wixRequest)({
192
+ path: `${BASE}/align-cms-collections`,
193
+ method: 'POST',
194
+ body: {}
195
+ });
196
+ sp.stop();
197
+ (0, _print.success)('CMS collections aligned');
198
+ } catch (err_) {
199
+ sp.stop();
200
+ (0, _print.error)(err_.message);
201
+ process.exit(1);
202
+ }
203
+ });
204
+
205
+ // ── disconnect ────────────────────────────────────────────────────────────────
206
+
207
+ const disconnectCmd = new _commander.Command('disconnect').description('Disconnect from the ecom provider').action(async () => {
208
+ const {
209
+ confirmed
210
+ } = await _inquirer.default.prompt([{
211
+ type: 'confirm',
212
+ name: 'confirmed',
213
+ message: 'Are you sure you want to disconnect from the ecom provider?',
214
+ default: false
215
+ }]);
216
+ if (!confirmed) {
217
+ (0, _print.info)('Disconnect cancelled.');
218
+ return;
219
+ }
220
+ const sp = (0, _print.spinner)('Disconnecting...');
221
+ try {
222
+ await (0, _wixApi.wixRequest)({
223
+ path: `${BASE}/disconnect`,
224
+ method: 'POST',
225
+ body: {}
226
+ });
227
+ sp.stop();
228
+ (0, _print.success)('Disconnected from ecom provider');
229
+ } catch (err_) {
230
+ sp.stop();
231
+ (0, _print.error)(err_.message);
232
+ process.exit(1);
233
+ }
234
+ });
235
+
236
+ // ── root ecom command ─────────────────────────────────────────────────────────
237
+
238
+ const ecomCommand = exports.ecomCommand = new _commander.Command('ecom').description('Manage ecom provider integrations').addCommand(connectCmd).addCommand(statusCmd).addCommand(fullSyncCmd).addCommand(alignmentSyncCmd).addCommand(alignCmsCmd).addCommand(disconnectCmd);
239
+ //# sourceMappingURL=ecom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_commander","require","_inquirer","_interopRequireDefault","_open","_wixApi","_print","BASE","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","pollUntilActive","deadline","Date","now","Promise","r","setTimeout","data","wixRequest","path","method","status","connectCmd","Command","description","option","action","opts","statusSp","spinner","statusData","stop","error","process","exit","storeId","answer","inquirer","prompt","type","name","message","validate","v","trim","length","sp","body","platform","shopify","url","authorizationUrl","authorization_url","info","open","polling","active","success","err_","statusCmd","isJsonMode","console","log","JSON","stringify","errorMessage","lastFullSync","lastAlignmentSync","fullSyncCmd","alignmentSyncCmd","counts","syncedCounts","table","count","Object","entries","alignCmsCmd","disconnectCmd","confirmed","default","ecomCommand","exports","addCommand"],"sources":["../../../src/commands/ecom.ts"],"sourcesContent":["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport open from 'open';\nimport { wixRequest } from '../utils/wixApi';\nimport { success, error, info, spinner, isJsonMode } from '../utils/print';\n\nconst BASE = '/_api/ecom-integrations/v1/ecom-integrations';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\ninterface InitiateOAuthResponse {\n authorizationUrl?: string;\n authorization_url?: string;\n}\n\ninterface ConnectionStatusResponse {\n status?: string;\n platformMetadata?: Record<string, string>;\n lastFullSync?: string;\n lastAlignmentSync?: string;\n errorMessage?: string;\n}\n\ninterface SyncResponse {\n status?: string;\n syncedCounts?: Record<string, number>;\n}\n\n// ── connect ───────────────────────────────────────────────────────────────────\n\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 120_000;\n\nasync function pollUntilActive(): Promise<boolean> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n try {\n const data = await wixRequest<ConnectionStatusResponse>({\n path: `${BASE}/connection-status`,\n method: 'GET',\n });\n if (data.status === 'ACTIVE') {\n return true;\n }\n } catch {\n // ignore transient errors and keep polling\n }\n }\n return false;\n}\n\nconst connectCmd = new Command('connect')\n .description('Connect a Shopify store via OAuth2 (opens browser)')\n .option('--store-id <id>', 'Shopify store slug (e.g. mystore)')\n .action(async (opts: { storeId?: string }) => {\n const statusSp = spinner('Checking connection status...');\n try {\n const statusData = await wixRequest<ConnectionStatusResponse>({\n path: `${BASE}/connection-status`,\n method: 'GET',\n });\n statusSp.stop();\n if (statusData.status === 'ACTIVE') {\n error(\n 'Already connected. Use `web5 ecom disconnect` first to reconnect.',\n );\n process.exit(1);\n }\n } catch {\n statusSp.stop();\n // not connected yet, proceed\n }\n\n let storeId = opts.storeId;\n\n if (!storeId) {\n const answer = await inquirer.prompt<{ storeId: string }>([\n {\n type: 'input',\n name: 'storeId',\n message: 'Shopify store slug (e.g. mystore):',\n validate: (v: string) =>\n v.trim().length > 0 || 'Store ID is required',\n },\n ]);\n storeId = answer.storeId.trim();\n }\n\n const sp = spinner('Initiating Shopify OAuth...');\n try {\n const data = await wixRequest<InitiateOAuthResponse>({\n path: `${BASE}/shopify-oauth/initiate`,\n method: 'POST',\n body: {\n platform: 'SHOPIFY',\n shopify: { storeId },\n },\n });\n sp.stop();\n\n const url = data.authorizationUrl ?? data.authorization_url;\n if (!url) {\n error('No authorization URL returned by the server.');\n process.exit(1);\n }\n\n info(`Authorization URL: ${url}`);\n await open(url);\n info('Browser opened — complete the Shopify authorization...');\n\n const polling = spinner('Waiting for connection to become active...');\n const active = await pollUntilActive();\n polling.stop();\n\n if (active) {\n success('Connected! Your Shopify store is now active.');\n } else {\n error(\n 'Timed out waiting for the connection to become active. Run `web5 ecom status` to check.',\n );\n process.exit(1);\n }\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\n// ── status ────────────────────────────────────────────────────────────────────\n\nconst statusCmd = new Command('status')\n .description('Show the current ecom provider connection status')\n .action(async () => {\n const sp = spinner('Fetching connection status...');\n try {\n const data = await wixRequest<ConnectionStatusResponse>({\n path: `${BASE}/connection-status`,\n method: 'GET',\n });\n sp.stop();\n\n if (isJsonMode()) {\n console.log(JSON.stringify(data));\n return;\n }\n\n const status = data.status ?? 'UNKNOWN';\n\n if (status === 'UNKNOWN') {\n info('Status: not connected');\n return;\n }\n\n if (status === 'ACTIVE') {\n success(`Status: ${status}`);\n } else {\n error(`Status: ${status}`);\n if (data.errorMessage) {\n info(`Error: ${data.errorMessage}`);\n }\n }\n\n if (data.lastFullSync) {\n info(`Last full sync: ${data.lastFullSync}`);\n } else {\n info('Last full sync: never');\n }\n\n if (data.lastAlignmentSync) {\n info(`Last alignment: ${data.lastAlignmentSync}`);\n } else {\n info('Last alignment: never');\n }\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\n// ── full-sync ─────────────────────────────────────────────────────────────────\n\nconst fullSyncCmd = new Command('full-sync')\n .description('Trigger a full sync from the ecom provider into CMS')\n .action(async () => {\n const sp = spinner('Running full sync...');\n try {\n const data = await wixRequest<SyncResponse>({\n path: `${BASE}/full-sync`,\n method: 'POST',\n body: {},\n });\n sp.stop();\n success(data.status ?? 'Full sync triggered');\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\n// ── alignment-sync ────────────────────────────────────────────────────────────\n\nconst alignmentSyncCmd = new Command('alignment-sync')\n .description('Run an alignment sync to catch any missed webhook updates')\n .action(async () => {\n const sp = spinner('Running alignment sync...');\n try {\n const data = await wixRequest<SyncResponse>({\n path: `${BASE}/alignment-sync`,\n method: 'POST',\n body: {},\n });\n sp.stop();\n success(data.status ?? 'Alignment sync complete');\n\n const counts = data.syncedCounts ?? {};\n for (const [table, count] of Object.entries(counts)) {\n info(` ${table}: ${count}`);\n }\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\n// ── align-cms ─────────────────────────────────────────────────────────────────\n\nconst alignCmsCmd = new Command('align-cms')\n .description('Align CMS collections with the ecom provider schema')\n .action(async () => {\n const sp = spinner('Aligning CMS collections...');\n try {\n await wixRequest({\n path: `${BASE}/align-cms-collections`,\n method: 'POST',\n body: {},\n });\n sp.stop();\n success('CMS collections aligned');\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\n// ── disconnect ────────────────────────────────────────────────────────────────\n\nconst disconnectCmd = new Command('disconnect')\n .description('Disconnect from the ecom provider')\n .action(async () => {\n const { confirmed } = await inquirer.prompt<{ confirmed: boolean }>([\n {\n type: 'confirm',\n name: 'confirmed',\n message: 'Are you sure you want to disconnect from the ecom provider?',\n default: false,\n },\n ]);\n\n if (!confirmed) {\n info('Disconnect cancelled.');\n return;\n }\n\n const sp = spinner('Disconnecting...');\n try {\n await wixRequest({\n path: `${BASE}/disconnect`,\n method: 'POST',\n body: {},\n });\n sp.stop();\n success('Disconnected from ecom provider');\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\n// ── root ecom command ─────────────────────────────────────────────────────────\n\nexport const ecomCommand = new Command('ecom')\n .description('Manage ecom provider integrations')\n .addCommand(connectCmd)\n .addCommand(statusCmd)\n .addCommand(fullSyncCmd)\n .addCommand(alignmentSyncCmd)\n .addCommand(alignCmsCmd)\n .addCommand(disconnectCmd);\n"],"mappings":"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","ignoreList":[]}
@@ -1,52 +1,24 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  exports.__esModule = true;
5
4
  exports.embedCommand = void 0;
6
5
  var _commander = require("commander");
7
- var readline = _interopRequireWildcard(require("readline"));
6
+ var http = _interopRequireWildcard(require("http"));
8
7
  var _child_process = require("child_process");
9
- var _inquirer = _interopRequireDefault(require("inquirer"));
10
8
  var _wixApi = require("../utils/wixApi");
11
9
  var _print = require("../utils/print");
12
10
  var _project = require("../utils/project");
11
+ var _embedDocs = require("../templates/embedDocs");
13
12
  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); }
14
- function copyToClipboard(text) {
15
- const cmd = process.platform === 'win32' ? `echo ${text} | clip` : process.platform === 'darwin' ? 'pbcopy' : 'xclip -selection clipboard';
16
- (0, _child_process.execSync)(process.platform === 'win32' ? `echo ${text} | clip` : cmd, process.platform === 'win32' ? undefined : {
17
- input: text
18
- });
19
- }
20
- async function promptCopyToClipboard(text) {
21
- const rl = readline.createInterface({
22
- input: process.stdin,
23
- output: process.stdout
24
- });
25
- return new Promise(resolve => {
26
- rl.question('\nPress Enter to copy to clipboard...', () => {
27
- rl.close();
28
- copyToClipboard(text);
29
- console.log('Copied to clipboard.');
30
- resolve();
13
+ function openBrowser(url) {
14
+ const cmd = process.platform === 'win32' ? `start "" "${url}"` : process.platform === 'darwin' ? `open "${url}"` : `xdg-open "${url}"`;
15
+ try {
16
+ (0, _child_process.execSync)(cmd, {
17
+ stdio: 'ignore'
31
18
  });
32
- });
33
- }
34
- async function promptForType() {
35
- const {
36
- type
37
- } = await _inquirer.default.prompt([{
38
- type: 'list',
39
- name: 'type',
40
- message: 'Select embed type:',
41
- choices: [{
42
- name: 'Script tag',
43
- value: 'script'
44
- }, {
45
- name: 'React component',
46
- value: 'react'
47
- }]
48
- }]);
49
- return type;
19
+ } catch {
20
+ // URL is printed to stdout regardless
21
+ }
50
22
  }
51
23
  async function getOrCreateClientId() {
52
24
  var _createData$oAuthApp;
@@ -80,13 +52,8 @@ async function getOrCreateClientId() {
80
52
  console.log(`Client ID created: ${id}`);
81
53
  return id;
82
54
  }
83
- const embedCommand = exports.embedCommand = new _commander.Command('embed').description('Generate embed code for a Web5 component').option('--type <type>', 'Embed type: script or react').option('--client-id <id>', 'Use this client ID instead of fetching from the API').option('--no-clipboard', 'Print to stdout only skip the clipboard prompt').action(async opts => {
55
+ const embedCommand = exports.embedCommand = new _commander.Command('embed').description('Generate embed code for a Web5 component').option('--client-id <id>', 'Use this client ID instead of fetching from the API').option('--no-serve', 'Print client ID to stdout instead of launching a browser').action(async opts => {
84
56
  try {
85
- const type = opts.type ?? (await promptForType());
86
- if (type === 'react') {
87
- console.log('no react for now');
88
- return;
89
- }
90
57
  const root = (0, _project.findProjectRoot)(process.cwd());
91
58
  const config = root ? (0, _project.readConfig)(root) : null;
92
59
  const clientId = opts.clientId ?? ((config == null ? void 0 : config.clientId) || undefined) ?? (await getOrCreateClientId());
@@ -96,20 +63,42 @@ const embedCommand = exports.embedCommand = new _commander.Command('embed').desc
96
63
  clientId
97
64
  });
98
65
  }
99
- const embedScript = `<script src="https://www.wix.com/embed/v1/component.js" data-client-id="${clientId}"></script>`;
66
+
67
+ // ── JSON mode: structured output, no server ──────────────────────────
100
68
  if ((0, _print.isJsonMode)()) {
101
69
  console.log(JSON.stringify({
102
- type,
103
- clientId,
104
- embedCode: embedScript
70
+ clientId
105
71
  }));
106
72
  return;
107
73
  }
108
- console.log('\nEmbed script:\n');
109
- console.log(embedScript);
110
- if (opts.clipboard !== false && process.stdout.isTTY) {
111
- await promptCopyToClipboard(embedScript);
74
+
75
+ // ── --no-serve: print client ID only ────────────────────────────────
76
+ if (!opts.serve) {
77
+ console.log(clientId);
78
+ return;
112
79
  }
80
+
81
+ // ── Default: launch documentation server ─────────────────────────────
82
+ const html = (0, _embedDocs.generateEmbedDocs)(clientId);
83
+ const server = http.createServer((_req, res) => {
84
+ res.writeHead(200, {
85
+ 'Content-Type': 'text/html; charset=utf-8'
86
+ });
87
+ res.end(html);
88
+ });
89
+ server.listen(0, '127.0.0.1', () => {
90
+ const addr = server.address();
91
+ const url = `http://localhost:${addr.port}`;
92
+ (0, _print.success)(`Embed documentation ready at ${url}`);
93
+ (0, _print.info)('Opening in your browser...');
94
+ (0, _print.info)('Press Ctrl+C to stop.');
95
+ openBrowser(url);
96
+ });
97
+ process.on('SIGINT', () => {
98
+ (0, _print.info)('\nShutting down...');
99
+ server.close(() => process.exit(0));
100
+ setTimeout(() => process.exit(0), 1000).unref();
101
+ });
113
102
  } catch (err) {
114
103
  console.error('Error:', err.message);
115
104
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"names":["_commander","require","readline","_interopRequireWildcard","_child_process","_inquirer","_interopRequireDefault","_wixApi","_print","_project","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","copyToClipboard","text","cmd","process","platform","execSync","undefined","input","promptCopyToClipboard","rl","createInterface","stdin","output","stdout","Promise","resolve","question","close","console","log","promptForType","type","inquirer","prompt","name","message","choices","value","getOrCreateClientId","_createData$oAuthApp","queryData","wixRequest","path","method","body","apps","oAuthApps","existing","find","app","id","createData","oAuthApp","application_type","Error","embedCommand","exports","Command","description","option","action","opts","root","findProjectRoot","cwd","config","readConfig","clientId","writeConfig","embedScript","isJsonMode","JSON","stringify","embedCode","clipboard","isTTY","err","error","exit"],"sources":["../../../src/commands/embed.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport { execSync } from 'child_process';\nimport inquirer from 'inquirer';\nimport { wixRequest } from '../utils/wixApi';\nimport { isJsonMode } from '../utils/print';\nimport { findProjectRoot, readConfig, writeConfig } from '../utils/project';\n\nfunction copyToClipboard(text: string): void {\n const cmd =\n process.platform === 'win32'\n ? `echo ${text} | clip`\n : process.platform === 'darwin'\n ? 'pbcopy'\n : 'xclip -selection clipboard';\n\n execSync(\n process.platform === 'win32' ? `echo ${text} | clip` : cmd,\n process.platform === 'win32' ? undefined : { input: text },\n );\n}\n\nasync function promptCopyToClipboard(text: string): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question('\\nPress Enter to copy to clipboard...', () => {\n rl.close();\n copyToClipboard(text);\n console.log('Copied to clipboard.');\n resolve();\n });\n });\n}\n\ntype EmbedType = 'script' | 'react';\n\ninterface OAuthApp {\n id: string;\n name: string;\n}\n\ninterface QueryResponse {\n oAuthApps?: OAuthApp[];\n}\n\ninterface CreateResponse {\n oAuthApp?: OAuthApp;\n}\n\nasync function promptForType(): Promise<EmbedType> {\n const { type } = await inquirer.prompt<{ type: EmbedType }>([\n {\n type: 'list',\n name: 'type',\n message: 'Select embed type:',\n choices: [\n { name: 'Script tag', value: 'script' },\n { name: 'React component', value: 'react' },\n ],\n },\n ]);\n return type;\n}\n\nasync function getOrCreateClientId(): Promise<string> {\n console.log('Searching for client ID...');\n\n const queryData = await wixRequest<QueryResponse>({\n path: '/oauth-app/v1/oauth-apps/query',\n method: 'POST',\n body: {},\n });\n\n const apps = queryData.oAuthApps ?? [];\n const existing = apps.find((app) => app.name === 'web5');\n\n if (existing) {\n console.log(`Found client ID: ${existing.id}`);\n return existing.id;\n }\n\n console.log('Client ID not found, creating...');\n\n const createData = await wixRequest<CreateResponse>({\n path: '/oauth-app/v1/oauth-apps',\n method: 'POST',\n body: { oAuthApp: { name: 'web5', application_type: 'WEB_APP' } },\n });\n\n const id = createData.oAuthApp?.id;\n if (!id) {\n throw new Error('Failed to create OAuth app — no ID returned');\n }\n\n console.log(`Client ID created: ${id}`);\n return id;\n}\n\nexport const embedCommand = new Command('embed')\n .description('Generate embed code for a Web5 component')\n .option('--type <type>', 'Embed type: script or react')\n .option('--client-id <id>', 'Use this client ID instead of fetching from the API')\n .option('--no-clipboard', 'Print to stdout only skip the clipboard prompt')\n .action(async (opts: { type?: string; clientId?: string; clipboard: boolean }) => {\n try {\n const type: EmbedType = opts.type as EmbedType ?? (await promptForType());\n\n if (type === 'react') {\n console.log('no react for now');\n return;\n }\n\n const root = findProjectRoot(process.cwd());\n const config = root ? readConfig(root) : null;\n\n const clientId =\n opts.clientId ??\n (config?.clientId || undefined) ??\n (await getOrCreateClientId());\n\n if (root && config && config.clientId !== clientId) {\n writeConfig(root, { ...config, clientId });\n }\n\n const embedScript = `<script src=\"https://www.wix.com/embed/v1/component.js\" data-client-id=\"${clientId}\"></script>`;\n\n if (isJsonMode()) {\n console.log(JSON.stringify({ type, clientId, embedCode: embedScript }));\n return;\n }\n\n console.log('\\nEmbed script:\\n');\n console.log(embedScript);\n\n if (opts.clipboard !== false && process.stdout.isTTY) {\n await promptCopyToClipboard(embedScript);\n }\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_commander","require","http","_interopRequireWildcard","_child_process","_wixApi","_print","_project","_embedDocs","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","openBrowser","url","cmd","process","platform","execSync","stdio","getOrCreateClientId","_createData$oAuthApp","console","log","queryData","wixRequest","path","method","body","apps","oAuthApps","existing","find","app","name","id","createData","oAuthApp","application_type","Error","embedCommand","exports","Command","description","option","action","opts","root","findProjectRoot","cwd","config","readConfig","clientId","undefined","writeConfig","isJsonMode","JSON","stringify","serve","html","generateEmbedDocs","server","createServer","_req","res","writeHead","end","listen","addr","address","port","success","info","on","close","exit","setTimeout","unref","err","error","message"],"sources":["../../../src/commands/embed.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as http from 'http';\nimport type { AddressInfo } from 'net';\nimport { execSync } from 'child_process';\nimport { wixRequest } from '../utils/wixApi';\nimport { isJsonMode, info, success } from '../utils/print';\nimport { findProjectRoot, readConfig, writeConfig } from '../utils/project';\nimport { generateEmbedDocs } from '../templates/embedDocs';\n\nfunction openBrowser(url: string): void {\n const cmd =\n process.platform === 'win32'\n ? `start \"\" \"${url}\"`\n : process.platform === 'darwin'\n ? `open \"${url}\"`\n : `xdg-open \"${url}\"`;\n try {\n execSync(cmd, { stdio: 'ignore' });\n } catch {\n // URL is printed to stdout regardless\n }\n}\n\n\ninterface OAuthApp {\n id: string;\n name: string;\n}\n\ninterface QueryResponse {\n oAuthApps?: OAuthApp[];\n}\n\ninterface CreateResponse {\n oAuthApp?: OAuthApp;\n}\n\nasync function getOrCreateClientId(): Promise<string> {\n console.log('Searching for client ID...');\n\n const queryData = await wixRequest<QueryResponse>({\n path: '/oauth-app/v1/oauth-apps/query',\n method: 'POST',\n body: {},\n });\n\n const apps = queryData.oAuthApps ?? [];\n const existing = apps.find((app) => app.name === 'web5');\n\n if (existing) {\n console.log(`Found client ID: ${existing.id}`);\n return existing.id;\n }\n\n console.log('Client ID not found, creating...');\n\n const createData = await wixRequest<CreateResponse>({\n path: '/oauth-app/v1/oauth-apps',\n method: 'POST',\n body: { oAuthApp: { name: 'web5', application_type: 'WEB_APP' } },\n });\n\n const id = createData.oAuthApp?.id;\n if (!id) {\n throw new Error('Failed to create OAuth app — no ID returned');\n }\n\n console.log(`Client ID created: ${id}`);\n return id;\n}\n\nexport const embedCommand = new Command('embed')\n .description('Generate embed code for a Web5 component')\n .option(\n '--client-id <id>',\n 'Use this client ID instead of fetching from the API',\n )\n .option('--no-serve', 'Print client ID to stdout instead of launching a browser')\n .action(\n async (opts: {\n clientId?: string;\n serve: boolean;\n }) => {\n try {\n const root = findProjectRoot(process.cwd());\n const config = root ? readConfig(root) : null;\n\n const clientId =\n opts.clientId ??\n (config?.clientId || undefined) ??\n (await getOrCreateClientId());\n\n if (root && config && config.clientId !== clientId) {\n writeConfig(root, { ...config, clientId });\n }\n\n // ── JSON mode: structured output, no server ──────────────────────────\n if (isJsonMode()) {\n console.log(JSON.stringify({ clientId }));\n return;\n }\n\n // ── --no-serve: print client ID only ────────────────────────────────\n if (!opts.serve) {\n console.log(clientId);\n return;\n }\n\n // ── Default: launch documentation server ─────────────────────────────\n const html = generateEmbedDocs(clientId);\n\n const server = http.createServer((_req, res) => {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(html);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address() as AddressInfo;\n const url = `http://localhost:${addr.port}`;\n\n success(`Embed documentation ready at ${url}`);\n info('Opening in your browser...');\n info('Press Ctrl+C to stop.');\n\n openBrowser(url);\n });\n\n process.on('SIGINT', () => {\n info('\\nShutting down...');\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n });\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n },\n );\n"],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,8 @@ var _promises = require("fs/promises");
11
11
  var _chalk = _interopRequireDefault(require("chalk"));
12
12
  var _print = require("../utils/print");
13
13
  var _fs2 = require("../utils/fs");
14
+ var _auth = require("../auth");
15
+ var _deviceFlow = require("../auth/deviceFlow");
14
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); }
15
17
  const DEFAULTS_DIR = path.join(__dirname, '../../../defaults');
16
18
  function printBanner() {
@@ -73,8 +75,13 @@ async function resolveString(flag, isTTY, question, opts = {}) {
73
75
  const answers = await _inquirer.default.prompt(question);
74
76
  return answers.value ?? opts.defaultValue ?? '';
75
77
  }
76
- const initCommand = exports.initCommand = new _commander.Command('init').description('Scaffold a new Web5 client component library').option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults').option('--name <name>', 'npm package name (e.g. @wix/my-components)').option('--display-name <displayName>', 'human-readable display name').option('--dir <dir>', 'output directory (default: derived from package name)').action(async opts => {
78
+ const initCommand = exports.initCommand = new _commander.Command('init').description('Scaffold a new Web5 client component library').option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults').option('--name <name>', 'npm package name (e.g. @wix/my-components)').option('--display-name <displayName>', 'human-readable display name').option('--dir <dir>', 'output directory (default: derived from package name)').option('--msid <msid>', 'Wix site ID to bind this project to').action(async opts => {
77
79
  try {
80
+ const authed = await (0, _auth.isAuthenticated)();
81
+ if (!authed) {
82
+ (0, _print.error)('You must be logged in. Run `web5 login` first.');
83
+ process.exit(1);
84
+ }
78
85
  printBanner();
79
86
  const existing = findExistingConfig(process.cwd());
80
87
  if (existing) {
@@ -98,6 +105,28 @@ const initCommand = exports.initCommand = new _commander.Command('init').descrip
98
105
  const stem = name.split('/').pop();
99
106
  const displayName = opts.displayName ?? stem.replace(/-/g, ' ');
100
107
  const dir = opts.dir ?? stem;
108
+ let msid;
109
+ if (opts.msid) {
110
+ msid = opts.msid;
111
+ } else if (isTTY) {
112
+ const token = await (0, _auth.getToken)();
113
+ msid = await (0, _deviceFlow.promptSiteSelection)(token);
114
+ } else {
115
+ (0, _print.error)('--msid is required in non-interactive mode');
116
+ process.exit(1);
117
+ }
118
+ let platformType;
119
+ if (isTTY) {
120
+ const answers = await _inquirer.default.prompt([{
121
+ type: 'list',
122
+ name: 'value',
123
+ message: 'Platform type:',
124
+ choices: ['Content', 'Ecommerce']
125
+ }]);
126
+ platformType = answers.value;
127
+ } else {
128
+ platformType = 'Content';
129
+ }
101
130
  const outDir = path.resolve(process.cwd(), dir);
102
131
  if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {
103
132
  (0, _print.warn)(`Directory ${outDir} already exists and is not empty`);
@@ -106,11 +135,13 @@ const initCommand = exports.initCommand = new _commander.Command('init').descrip
106
135
  void mode;
107
136
  const subs = {
108
137
  NAME: name,
109
- DISPLAY_NAME: displayName
138
+ DISPLAY_NAME: displayName,
139
+ MSID: msid,
140
+ PLATFORM_TYPE: platformType
110
141
  };
111
142
 
112
143
  // ── Root config files ─────────────────────────────────────────────────
113
- await copyDefault('web5.config.json', path.join(outDir, 'web5.config.json'), subs);
144
+ await copyDefault('web5.config.template.json', path.join(outDir, 'web5.config.json'), subs);
114
145
  await copyDefault('package.template.json', path.join(outDir, 'package.json'), subs);
115
146
  await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));
116
147