@wix/web50-cli 0.1.0

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 (102) hide show
  1. package/README.md +8 -0
  2. package/bin/web5.js +3 -0
  3. package/defaults/package.json +42 -0
  4. package/dist/cjs/auth/deviceFlow.js +76 -0
  5. package/dist/cjs/auth/deviceFlow.js.map +1 -0
  6. package/dist/cjs/auth/index.js +47 -0
  7. package/dist/cjs/auth/index.js.map +1 -0
  8. package/dist/cjs/auth/secretStore.js +103 -0
  9. package/dist/cjs/auth/secretStore.js.map +1 -0
  10. package/dist/cjs/cli.js +18 -0
  11. package/dist/cjs/cli.js.map +1 -0
  12. package/dist/cjs/commands/init.js +161 -0
  13. package/dist/cjs/commands/init.js.map +1 -0
  14. package/dist/cjs/commands/login.js +18 -0
  15. package/dist/cjs/commands/login.js.map +1 -0
  16. package/dist/cjs/commands/validate.js +706 -0
  17. package/dist/cjs/commands/validate.js.map +1 -0
  18. package/dist/cjs/counter.js +19 -0
  19. package/dist/cjs/counter.js.map +1 -0
  20. package/dist/cjs/external-types.d.js +2 -0
  21. package/dist/cjs/external-types.d.js.map +1 -0
  22. package/dist/cjs/index.js +10 -0
  23. package/dist/cjs/index.js.map +1 -0
  24. package/dist/cjs/templates/actionYamlSchema.js +33 -0
  25. package/dist/cjs/templates/actionYamlSchema.js.map +1 -0
  26. package/dist/cjs/templates/aiInstructionsSchema.js +39 -0
  27. package/dist/cjs/templates/aiInstructionsSchema.js.map +1 -0
  28. package/dist/cjs/templates/cmsSchemaSchema.js +59 -0
  29. package/dist/cjs/templates/cmsSchemaSchema.js.map +1 -0
  30. package/dist/cjs/test-types.d.js +2 -0
  31. package/dist/cjs/test-types.d.js.map +1 -0
  32. package/dist/cjs/utils/fs.js +25 -0
  33. package/dist/cjs/utils/fs.js.map +1 -0
  34. package/dist/cjs/utils/print.js +27 -0
  35. package/dist/cjs/utils/print.js.map +1 -0
  36. package/dist/cjs/utils/project.js +27 -0
  37. package/dist/cjs/utils/project.js.map +1 -0
  38. package/dist/esm/auth/deviceFlow.js +72 -0
  39. package/dist/esm/auth/deviceFlow.js.map +1 -0
  40. package/dist/esm/auth/index.js +40 -0
  41. package/dist/esm/auth/index.js.map +1 -0
  42. package/dist/esm/auth/secretStore.js +96 -0
  43. package/dist/esm/auth/secretStore.js.map +1 -0
  44. package/dist/esm/cli.js +16 -0
  45. package/dist/esm/cli.js.map +1 -0
  46. package/dist/esm/commands/init.js +161 -0
  47. package/dist/esm/commands/init.js.map +1 -0
  48. package/dist/esm/commands/login.js +14 -0
  49. package/dist/esm/commands/login.js.map +1 -0
  50. package/dist/esm/commands/validate.js +704 -0
  51. package/dist/esm/commands/validate.js.map +1 -0
  52. package/dist/esm/counter.js +16 -0
  53. package/dist/esm/counter.js.map +1 -0
  54. package/dist/esm/external-types.d.js +2 -0
  55. package/dist/esm/external-types.d.js.map +1 -0
  56. package/dist/esm/index.js +5 -0
  57. package/dist/esm/index.js.map +1 -0
  58. package/dist/esm/templates/actionYamlSchema.js +29 -0
  59. package/dist/esm/templates/actionYamlSchema.js.map +1 -0
  60. package/dist/esm/templates/aiInstructionsSchema.js +35 -0
  61. package/dist/esm/templates/aiInstructionsSchema.js.map +1 -0
  62. package/dist/esm/templates/cmsSchemaSchema.js +55 -0
  63. package/dist/esm/templates/cmsSchemaSchema.js.map +1 -0
  64. package/dist/esm/test-types.d.js +2 -0
  65. package/dist/esm/test-types.d.js.map +1 -0
  66. package/dist/esm/utils/fs.js +22 -0
  67. package/dist/esm/utils/fs.js.map +1 -0
  68. package/dist/esm/utils/print.js +18 -0
  69. package/dist/esm/utils/print.js.map +1 -0
  70. package/dist/esm/utils/project.js +23 -0
  71. package/dist/esm/utils/project.js.map +1 -0
  72. package/dist/types/auth/deviceFlow.d.ts +8 -0
  73. package/dist/types/auth/deviceFlow.d.ts.map +1 -0
  74. package/dist/types/auth/index.d.ts +6 -0
  75. package/dist/types/auth/index.d.ts.map +1 -0
  76. package/dist/types/auth/secretStore.d.ts +9 -0
  77. package/dist/types/auth/secretStore.d.ts.map +1 -0
  78. package/dist/types/cli.d.ts +2 -0
  79. package/dist/types/cli.d.ts.map +1 -0
  80. package/dist/types/commands/init.d.ts +3 -0
  81. package/dist/types/commands/init.d.ts.map +1 -0
  82. package/dist/types/commands/login.d.ts +3 -0
  83. package/dist/types/commands/login.d.ts.map +1 -0
  84. package/dist/types/commands/validate.d.ts +3 -0
  85. package/dist/types/commands/validate.d.ts.map +1 -0
  86. package/dist/types/counter.d.ts +6 -0
  87. package/dist/types/counter.d.ts.map +1 -0
  88. package/dist/types/index.d.ts +3 -0
  89. package/dist/types/index.d.ts.map +1 -0
  90. package/dist/types/templates/actionYamlSchema.d.ts +2 -0
  91. package/dist/types/templates/actionYamlSchema.d.ts.map +1 -0
  92. package/dist/types/templates/aiInstructionsSchema.d.ts +2 -0
  93. package/dist/types/templates/aiInstructionsSchema.d.ts.map +1 -0
  94. package/dist/types/templates/cmsSchemaSchema.d.ts +2 -0
  95. package/dist/types/templates/cmsSchemaSchema.d.ts.map +1 -0
  96. package/dist/types/utils/fs.d.ts +3 -0
  97. package/dist/types/utils/fs.d.ts.map +1 -0
  98. package/dist/types/utils/print.d.ts +7 -0
  99. package/dist/types/utils/print.d.ts.map +1 -0
  100. package/dist/types/utils/project.d.ts +6 -0
  101. package/dist/types/utils/project.d.ts.map +1 -0
  102. package/package.json +92 -0
package/README.md ADDED
@@ -0,0 +1,8 @@
1
+ # web50-cli
2
+
3
+ Library flow package generated with Yoshi.
4
+
5
+ ## Useful URLs
6
+
7
+ - [Yoshi Library Flow Docs](https://bo.wix.com/pages/yoshi/docs/library-flow/overview)
8
+ - [Falcon Packages Guide Docs](https://dev.wix.com/docs/rnd-general/devex/falcon/guide/packages)
package/bin/web5.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ // eslint-disable-next-line import/no-unresolved
3
+ require('../dist/cjs/cli');
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "{{NAME}}",
3
+ "version": "0.0.1",
4
+ "license": "UNLICENSED",
5
+ "private": true,
6
+ "main": "dist/cjs/index.js",
7
+ "module": "dist/esm/index.js",
8
+ "types": "dist/types/index.d.ts",
9
+ "files": [
10
+ "dist/cjs",
11
+ "dist/esm",
12
+ "dist/types"
13
+ ],
14
+ "scripts": {
15
+ "build": "yoshi-library build",
16
+ "start": "yoshi-library start",
17
+ "test": "yoshi-library test",
18
+ "lint": "yoshi-library lint"
19
+ },
20
+ "dependencies": {
21
+ "@babel/runtime": "^7.0.0",
22
+ "@wix/web5-core": "*"
23
+ },
24
+ "devDependencies": {
25
+ "@types/jest": "^27.4.0",
26
+ "@types/node": "^18.0.0",
27
+ "@wix/eslint-config-yoshi": "^6.0.0",
28
+ "@wix/jest-yoshi-preset": "^6.0.0",
29
+ "@wix/yoshi-flow-library": "^6.0.0",
30
+ "ts-jest": "^27.1.2",
31
+ "typescript": "~5.0.0"
32
+ },
33
+ "jest": {
34
+ "preset": "@wix/jest-yoshi-preset"
35
+ },
36
+ "yoshiFlowLibrary": {
37
+ "buildEsmWithBabel": true
38
+ },
39
+ "eslintConfig": {
40
+ "extends": "@wix/eslint-config-yoshi"
41
+ }
42
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.runDeviceFlow = runDeviceFlow;
5
+ var readline = _interopRequireWildcard(require("readline"));
6
+ var _print = require("../utils/print");
7
+ 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); }
8
+ // const CLIENT_ID = '602051c7-ec4b-4334-b90d-b029b076ba8f';
9
+ const CLIENT_ID = '6f95cec8-3e98-48b9-b4e5-1fb92fcd9973';
10
+ const DEVICE_CODE_URL = 'https://www.wixapis.com/oauth2/device/code';
11
+ const TOKEN_URL = 'https://www.wixapis.com/oauth2/token';
12
+ const POLL_INTERVAL_MS = 3000;
13
+ const POLL_TIMEOUT_MS = 60_000;
14
+ async function sleep(ms) {
15
+ return new Promise(resolve => setTimeout(resolve, ms));
16
+ }
17
+ async function requestDeviceCode() {
18
+ const res = await fetch(`${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=session_bound_access`);
19
+ if (!res.ok) {
20
+ throw new Error(`Device code request failed: ${res.status} ${res.statusText}`);
21
+ }
22
+ return res.json();
23
+ }
24
+ async function pollToken(deviceCode) {
25
+ const deadline = Date.now() + POLL_TIMEOUT_MS;
26
+ const url = `${TOKEN_URL}` + `?grant_type=${encodeURIComponent('urn:ietf:params:oauth:grant-type:device_code')}` + `&client_id=${CLIENT_ID}` + `&device_code=${encodeURIComponent(deviceCode)}`;
27
+ while (Date.now() < deadline) {
28
+ const res = await fetch(url, {
29
+ method: 'POST'
30
+ });
31
+ if (res.ok) {
32
+ return res.json();
33
+ }
34
+ const body = await res.json().catch(() => ({}));
35
+ if (body.error === 'access_denied') {
36
+ throw new Error('Access denied');
37
+ }
38
+
39
+ // authorization_pending, slow_down, unknown_error, or any transient error → keep polling
40
+ await sleep(POLL_INTERVAL_MS);
41
+ }
42
+ throw new Error('Verification failed — timed out after 60 seconds. Please run `web5 login` again.');
43
+ }
44
+ async function pressEnterToContinue() {
45
+ return new Promise(resolve => {
46
+ const rl = readline.createInterface({
47
+ input: process.stdin,
48
+ output: process.stdout
49
+ });
50
+ rl.question(' Press Enter to open in browser...', () => {
51
+ rl.close();
52
+ resolve();
53
+ });
54
+ });
55
+ }
56
+ async function runDeviceFlow() {
57
+ const code = await requestDeviceCode();
58
+ console.log('');
59
+ (0, _print.info)(`Verification code: ${code.userCode}`);
60
+ console.log(` ${code.verificationUri}`);
61
+ console.log('');
62
+ await pressEnterToContinue();
63
+ const open = (await Promise.resolve().then(() => _interopRequireWildcard(require('open')))).default;
64
+ await open(code.verificationUri);
65
+ console.log('');
66
+ const spin = (0, _print.spinner)('Waiting for approval...');
67
+ try {
68
+ const token = await pollToken(code.deviceCode);
69
+ spin.succeed('Approved');
70
+ return token;
71
+ } catch (err) {
72
+ spin.fail('Authentication failed');
73
+ throw err;
74
+ }
75
+ }
76
+ //# sourceMappingURL=deviceFlow.js.map
@@ -0,0 +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","sleep","ms","Promise","resolve","setTimeout","requestDeviceCode","res","fetch","ok","Error","status","statusText","json","pollToken","deviceCode","deadline","Date","now","url","encodeURIComponent","method","body","catch","error","pressEnterToContinue","rl","createInterface","input","process","stdin","output","stdout","question","close","runDeviceFlow","code","console","log","info","userCode","verificationUri","open","then","spin","spinner","token","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\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 res = await fetch(\n `${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=session_bound_access`,\n );\n if (!res.ok) {\n throw new Error(\n `Device code request failed: ${res.status} ${res.statusText}`,\n );\n }\n return res.json() as Promise<DeviceCodeResponse>;\n}\n\nasync function pollToken(deviceCode: string): Promise<TokenResponse> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n const url =\n `${TOKEN_URL}` +\n `?grant_type=${encodeURIComponent(\n 'urn:ietf:params:oauth:grant-type:device_code',\n )}` +\n `&client_id=${CLIENT_ID}` +\n `&device_code=${encodeURIComponent(deviceCode)}`;\n\n while (Date.now() < deadline) {\n const res = await fetch(url, { method: 'POST' });\n\n if (res.ok) {\n return res.json() as Promise<TokenResponse>;\n }\n\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n\n if (body.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\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(): Promise<TokenResponse> {\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 await pressEnterToContinue();\n\n const open = (await import('open')).default;\n await open(code.verificationUri);\n console.log('');\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":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.getToken = getToken;
5
+ exports.isAuthenticated = isAuthenticated;
6
+ exports.login = login;
7
+ exports.logout = logout;
8
+ var _deviceFlow = require("./deviceFlow");
9
+ var _secretStore = require("./secretStore");
10
+ var _print = require("../utils/print");
11
+ async function login(apiKey) {
12
+ if (apiKey) {
13
+ await (0, _secretStore.writeCredentials)({
14
+ api_key: apiKey
15
+ });
16
+ (0, _print.success)('API key saved');
17
+ return;
18
+ }
19
+ const token = await (0, _deviceFlow.runDeviceFlow)();
20
+ await (0, _secretStore.writeCredentials)({
21
+ access_token: token.access_token,
22
+ refresh_token: token.refresh_token
23
+ });
24
+ (0, _print.success)('Authenticated');
25
+ (0, _print.success)('Tokens stored in system keychain');
26
+ }
27
+ async function logout() {
28
+ await (0, _secretStore.clearCredentials)();
29
+ (0, _print.success)('Signed out \u2014 credentials removed');
30
+ }
31
+ async function getToken() {
32
+ const creds = await (0, _secretStore.readCredentials)();
33
+ if (!creds) {
34
+ return null;
35
+ }
36
+ if (creds.access_token) {
37
+ return creds.access_token;
38
+ }
39
+ if (creds.api_key) {
40
+ return creds.api_key;
41
+ }
42
+ return creds.refresh_token ?? null;
43
+ }
44
+ async function isAuthenticated() {
45
+ return (await getToken()) !== null;
46
+ }
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_deviceFlow","require","_secretStore","_print","login","apiKey","writeCredentials","api_key","success","token","runDeviceFlow","access_token","refresh_token","logout","clearCredentials","getToken","creds","readCredentials","isAuthenticated"],"sources":["../../../src/auth/index.ts"],"sourcesContent":["import { runDeviceFlow } from './deviceFlow';\nimport {\n writeCredentials,\n readCredentials,\n clearCredentials,\n} from './secretStore';\nimport { success } from '../utils/print';\n\nexport type { Credentials } from './secretStore';\n\nexport async function login(apiKey?: string): 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();\n await writeCredentials({\n access_token: token.access_token,\n refresh_token: token.refresh_token,\n });\n success('Authenticated');\n success('Tokens stored in system keychain');\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 if (creds.access_token) {\n return creds.access_token;\n }\n if (creds.api_key) {\n return creds.api_key;\n }\n return creds.refresh_token ?? null;\n}\n\nexport async function isAuthenticated(): Promise<boolean> {\n return (await getToken()) !== null;\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAKA,IAAAE,MAAA,GAAAF,OAAA;AAIO,eAAeG,KAAKA,CAACC,MAAe,EAAiB;EAC1D,IAAIA,MAAM,EAAE;IACV,MAAM,IAAAC,6BAAgB,EAAC;MAAEC,OAAO,EAAEF;IAAO,CAAC,CAAC;IAC3C,IAAAG,cAAO,EAAC,eAAe,CAAC;IACxB;EACF;EAEA,MAAMC,KAAK,GAAG,MAAM,IAAAC,yBAAa,EAAC,CAAC;EACnC,MAAM,IAAAJ,6BAAgB,EAAC;IACrBK,YAAY,EAAEF,KAAK,CAACE,YAAY;IAChCC,aAAa,EAAEH,KAAK,CAACG;EACvB,CAAC,CAAC;EACF,IAAAJ,cAAO,EAAC,eAAe,CAAC;EACxB,IAAAA,cAAO,EAAC,kCAAkC,CAAC;AAC7C;AAEO,eAAeK,MAAMA,CAAA,EAAkB;EAC5C,MAAM,IAAAC,6BAAgB,EAAC,CAAC;EACxB,IAAAN,cAAO,EAAC,uCAAuC,CAAC;AAClD;AAEO,eAAeO,QAAQA,CAAA,EAA2B;EACvD,MAAMC,KAAK,GAAG,MAAM,IAAAC,4BAAe,EAAC,CAAC;EACrC,IAAI,CAACD,KAAK,EAAE;IACV,OAAO,IAAI;EACb;EACA,IAAIA,KAAK,CAACL,YAAY,EAAE;IACtB,OAAOK,KAAK,CAACL,YAAY;EAC3B;EACA,IAAIK,KAAK,CAACT,OAAO,EAAE;IACjB,OAAOS,KAAK,CAACT,OAAO;EACtB;EACA,OAAOS,KAAK,CAACJ,aAAa,IAAI,IAAI;AACpC;AAEO,eAAeM,eAAeA,CAAA,EAAqB;EACxD,OAAO,CAAC,MAAMH,QAAQ,CAAC,CAAC,MAAM,IAAI;AACpC","ignoreList":[]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.clearCredentials = clearCredentials;
5
+ exports.readCredentials = readCredentials;
6
+ exports.writeCredentials = writeCredentials;
7
+ var crypto = _interopRequireWildcard(require("crypto"));
8
+ var os = _interopRequireWildcard(require("os"));
9
+ var path = _interopRequireWildcard(require("path"));
10
+ var _promises = require("fs/promises");
11
+ var _fs = require("../utils/fs");
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); }
13
+ const SERVICE = 'wix-web5-cli';
14
+ const ACCOUNT = 'credentials';
15
+ const CRED_FILE = path.join(os.homedir(), '.wix', 'credentials.enc');
16
+ let _storeType = null;
17
+ function getDerivedKey() {
18
+ const uid = String(os.userInfo().uid);
19
+ const raw = `${os.hostname()}:${uid}`;
20
+ return crypto.createHash('sha256').update(raw).digest();
21
+ }
22
+ async function detectStore() {
23
+ if (_storeType) {
24
+ return _storeType;
25
+ }
26
+ try {
27
+ // Dynamic import — keytar is optional; throws if the native module is absent
28
+ const keytar = await Promise.resolve().then(() => _interopRequireWildcard(require('keytar')));
29
+ await keytar.setPassword(SERVICE, '_probe', 'test');
30
+ await keytar.deletePassword(SERVICE, '_probe');
31
+ _storeType = 'keychain';
32
+ } catch {
33
+ _storeType = 'file';
34
+ }
35
+ return _storeType;
36
+ }
37
+ function encrypt(plaintext) {
38
+ const key = getDerivedKey();
39
+ const iv = crypto.randomBytes(12);
40
+ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
41
+ const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
42
+ const tag = cipher.getAuthTag();
43
+ return Buffer.concat([iv, tag, encrypted]).toString('base64');
44
+ }
45
+ function decrypt(ciphertext) {
46
+ const key = getDerivedKey();
47
+ const buf = Buffer.from(ciphertext, 'base64');
48
+ const iv = buf.subarray(0, 12);
49
+ const tag = buf.subarray(12, 28);
50
+ const encrypted = buf.subarray(28);
51
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
52
+ decipher.setAuthTag(tag);
53
+ return decipher.update(encrypted) + decipher.final('utf8');
54
+ }
55
+ async function writeCredentials(creds) {
56
+ const store = await detectStore();
57
+ const payload = JSON.stringify(creds);
58
+ if (store === 'keychain') {
59
+ const keytar = await Promise.resolve().then(() => _interopRequireWildcard(require('keytar')));
60
+ await keytar.setPassword(SERVICE, ACCOUNT, payload);
61
+ } else {
62
+ await (0, _fs.atomicWrite)(CRED_FILE, encrypt(payload), 0o600);
63
+ }
64
+ }
65
+ async function readCredentials() {
66
+ // Env var takes highest priority — used in CI/CD pipelines
67
+ const apiKey = process.env.WEB5_API_KEY;
68
+ if (apiKey) {
69
+ return {
70
+ api_key: apiKey
71
+ };
72
+ }
73
+ const store = await detectStore();
74
+ if (store === 'keychain') {
75
+ const keytar = await Promise.resolve().then(() => _interopRequireWildcard(require('keytar')));
76
+ const payload = await keytar.getPassword(SERVICE, ACCOUNT);
77
+ if (!payload) {
78
+ return null;
79
+ }
80
+ return JSON.parse(payload);
81
+ } else {
82
+ try {
83
+ const encrypted = await (0, _promises.readFile)(CRED_FILE, 'utf8');
84
+ return JSON.parse(decrypt(encrypted.trim()));
85
+ } catch {
86
+ return null;
87
+ }
88
+ }
89
+ }
90
+ async function clearCredentials() {
91
+ const store = await detectStore();
92
+ if (store === 'keychain') {
93
+ const keytar = await Promise.resolve().then(() => _interopRequireWildcard(require('keytar')));
94
+ await keytar.deletePassword(SERVICE, ACCOUNT);
95
+ } else {
96
+ try {
97
+ await (0, _promises.unlink)(CRED_FILE);
98
+ } catch {
99
+ // Already gone — that's fine
100
+ }
101
+ }
102
+ }
103
+ //# sourceMappingURL=secretStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["crypto","_interopRequireWildcard","require","os","path","_promises","_fs","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SERVICE","ACCOUNT","CRED_FILE","join","homedir","_storeType","getDerivedKey","uid","String","userInfo","raw","hostname","createHash","update","digest","detectStore","keytar","Promise","resolve","then","setPassword","deletePassword","encrypt","plaintext","key","iv","randomBytes","cipher","createCipheriv","encrypted","Buffer","concat","final","tag","getAuthTag","toString","decrypt","ciphertext","buf","from","subarray","decipher","createDecipheriv","setAuthTag","writeCredentials","creds","store","payload","JSON","stringify","atomicWrite","readCredentials","apiKey","process","env","WEB5_API_KEY","api_key","getPassword","parse","readFile","trim","clearCredentials","unlink"],"sources":["../../../src/auth/secretStore.ts"],"sourcesContent":["import * as crypto from 'crypto';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { readFile, unlink } from 'fs/promises';\nimport { atomicWrite } from '../utils/fs';\n\nconst SERVICE = 'wix-web5-cli';\nconst ACCOUNT = 'credentials';\nconst CRED_FILE = path.join(os.homedir(), '.wix', 'credentials.enc');\n\nexport interface Credentials {\n access_token?: string;\n refresh_token?: string;\n api_key?: string;\n}\n\ntype StoreType = 'keychain' | 'file';\n\nlet _storeType: StoreType | null = null;\n\nfunction getDerivedKey(): Buffer {\n const uid = String(os.userInfo().uid);\n const raw = `${os.hostname()}:${uid}`;\n return crypto.createHash('sha256').update(raw).digest();\n}\n\nasync function detectStore(): Promise<StoreType> {\n if (_storeType) {\n return _storeType;\n }\n\n try {\n // Dynamic import — keytar is optional; throws if the native module is absent\n const keytar = await import('keytar');\n await keytar.setPassword(SERVICE, '_probe', 'test');\n await keytar.deletePassword(SERVICE, '_probe');\n _storeType = 'keychain';\n } catch {\n _storeType = 'file';\n }\n\n return _storeType;\n}\n\nfunction encrypt(plaintext: string): string {\n const key = getDerivedKey();\n const iv = crypto.randomBytes(12);\n const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);\n const encrypted = Buffer.concat([\n cipher.update(plaintext, 'utf8'),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([iv, tag, encrypted]).toString('base64');\n}\n\nfunction decrypt(ciphertext: string): string {\n const key = getDerivedKey();\n const buf = Buffer.from(ciphertext, 'base64');\n const iv = buf.subarray(0, 12);\n const tag = buf.subarray(12, 28);\n const encrypted = buf.subarray(28);\n const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);\n decipher.setAuthTag(tag);\n return decipher.update(encrypted) + decipher.final('utf8');\n}\n\nexport async function writeCredentials(creds: Credentials): Promise<void> {\n const store = await detectStore();\n const payload = JSON.stringify(creds);\n\n if (store === 'keychain') {\n const keytar = await import('keytar');\n await keytar.setPassword(SERVICE, ACCOUNT, payload);\n } else {\n await atomicWrite(CRED_FILE, encrypt(payload), 0o600);\n }\n}\n\nexport async function readCredentials(): Promise<Credentials | null> {\n // Env var takes highest priority — used in CI/CD pipelines\n const apiKey = process.env.WEB5_API_KEY;\n if (apiKey) {\n return { api_key: apiKey };\n }\n\n const store = await detectStore();\n\n if (store === 'keychain') {\n const keytar = await import('keytar');\n const payload = await keytar.getPassword(SERVICE, ACCOUNT);\n if (!payload) {\n return null;\n }\n return JSON.parse(payload) as Credentials;\n } else {\n try {\n const encrypted = await readFile(CRED_FILE, 'utf8');\n return JSON.parse(decrypt(encrypted.trim())) as Credentials;\n } catch {\n return null;\n }\n }\n}\n\nexport async function clearCredentials(): Promise<void> {\n const store = await detectStore();\n\n if (store === 'keychain') {\n const keytar = await import('keytar');\n await keytar.deletePassword(SERVICE, ACCOUNT);\n } else {\n try {\n await unlink(CRED_FILE);\n } catch {\n // Already gone — that's fine\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ var _commander = require("commander");
4
+ var fs = _interopRequireWildcard(require("fs"));
5
+ var path = _interopRequireWildcard(require("path"));
6
+ var _login = require("./commands/login");
7
+ var _init = require("./commands/init");
8
+ var _validate = require("./commands/validate");
9
+ 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
+ // Read version from package.json at runtime (works from dist/cjs/ via ../../)
11
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf8'));
12
+ const program = new _commander.Command();
13
+ program.name('web5').description('Developer CLI for the Web5 platform').version(pkg.version);
14
+ program.addCommand(_login.loginCommand);
15
+ program.addCommand(_init.initCommand);
16
+ program.addCommand(_validate.validateCommand);
17
+ program.parseAsync(process.argv);
18
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_commander","require","fs","_interopRequireWildcard","path","_login","_init","_validate","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","addCommand","loginCommand","initCommand","validateCommand","parseAsync","process","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 { initCommand } from './commands/init';\nimport { validateCommand } from './commands/validate';\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\nprogram.addCommand(loginCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(validateCommand);\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,KAAA,GAAAL,OAAA;AACA,IAAAM,SAAA,GAAAN,OAAA;AAAsD,SAAAE,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAP,uBAAA,YAAAA,CAAAK,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;AAEtD;AACA,MAAMkB,GAAG,GAAGC,IAAI,CAACC,KAAK,CACpB3B,EAAE,CAAC4B,YAAY,CAAC1B,IAAI,CAAC2B,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;AAEvBJ,OAAO,CAACK,UAAU,CAACC,mBAAY,CAAC;AAChCN,OAAO,CAACK,UAAU,CAACE,iBAAW,CAAC;AAC/BP,OAAO,CAACK,UAAU,CAACG,yBAAe,CAAC;AAEnCR,OAAO,CAACS,UAAU,CAACC,OAAO,CAACC,IAAI,CAAC","ignoreList":[]}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ exports.__esModule = true;
5
+ exports.initCommand = void 0;
6
+ var _commander = require("commander");
7
+ var _inquirer = _interopRequireDefault(require("inquirer"));
8
+ var path = _interopRequireWildcard(require("path"));
9
+ var fs = _interopRequireWildcard(require("fs"));
10
+ var _promises = require("fs/promises");
11
+ var _print = require("../utils/print");
12
+ var _fs2 = require("../utils/fs");
13
+ 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
+ const DEFAULTS_DIR = path.join(__dirname, '../../../defaults');
15
+ async function copyDefault(srcRelative, destAbsolute, substitutions = {}) {
16
+ const srcPath = path.join(DEFAULTS_DIR, srcRelative);
17
+ let content = await (0, _promises.readFile)(srcPath, 'utf8');
18
+ for (const [token, value] of Object.entries(substitutions)) {
19
+ content = content.replaceAll(`{{${token}}}`, value);
20
+ }
21
+ await (0, _fs2.atomicWrite)(destAbsolute, content);
22
+ }
23
+ function findExistingConfig(startDir) {
24
+ let current = startDir;
25
+ let parent = path.dirname(current);
26
+ while (current !== parent) {
27
+ const candidate = path.join(current, 'web5.config.json');
28
+ if (fs.existsSync(candidate)) {
29
+ return candidate;
30
+ }
31
+ current = parent;
32
+ parent = path.dirname(current);
33
+ }
34
+ const candidate = path.join(current, 'web5.config.json');
35
+ if (fs.existsSync(candidate)) {
36
+ return candidate;
37
+ }
38
+ return null;
39
+ }
40
+ async function resolveString(flag, isTTY, question, opts = {}) {
41
+ if (flag) {
42
+ return flag;
43
+ }
44
+ if (!isTTY) {
45
+ if (opts.defaultValue !== undefined) {
46
+ return opts.defaultValue;
47
+ }
48
+ if (opts.exitMsg) {
49
+ (0, _print.error)(opts.exitMsg);
50
+ }
51
+ process.exit(1);
52
+ }
53
+ const answers = await _inquirer.default.prompt(question);
54
+ return answers.value ?? opts.defaultValue ?? '';
55
+ }
56
+ 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 => {
57
+ try {
58
+ const existing = findExistingConfig(process.cwd());
59
+ if (existing) {
60
+ (0, _print.warn)(`web5.config.json already exists at ${existing}`);
61
+ (0, _print.warn)('Proceeding will create a nested project.');
62
+ }
63
+ const isTTY = Boolean(process.stdin.isTTY);
64
+ const mode = opts.mode ?? 'defaults';
65
+
66
+ // ── Collect: package name ─────────────────────────────────────────────
67
+ const name = await resolveString(opts.name, isTTY, [{
68
+ type: 'input',
69
+ name: 'value',
70
+ message: 'Package name (e.g. @wix/my-components):',
71
+ validate: v => v.trim().length > 0 ? true : 'Package name is required'
72
+ }], {
73
+ exitMsg: '--name is required in non-interactive mode'
74
+ });
75
+
76
+ // ── Collect: display name ─────────────────────────────────────────────
77
+ const defaultDisplay = name.split('/').pop().replace(/-/g, ' ');
78
+ const displayName = await resolveString(opts.displayName, isTTY, [{
79
+ type: 'input',
80
+ name: 'value',
81
+ message: 'Display name:',
82
+ default: defaultDisplay
83
+ }], {
84
+ defaultValue: defaultDisplay
85
+ });
86
+
87
+ // ── Collect: output directory ─────────────────────────────────────────
88
+ const defaultDir = name.split('/').pop();
89
+ const dir = await resolveString(opts.dir, isTTY, [{
90
+ type: 'input',
91
+ name: 'value',
92
+ message: 'Output directory:',
93
+ default: defaultDir
94
+ }], {
95
+ defaultValue: defaultDir
96
+ });
97
+ const outDir = path.resolve(process.cwd(), dir);
98
+ if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {
99
+ (0, _print.warn)(`Directory ${outDir} already exists and is not empty`);
100
+ }
101
+ (0, _print.info)(`Scaffolding ${name} \u2192 ${outDir}`);
102
+ void mode;
103
+ const subs = {
104
+ NAME: name,
105
+ DISPLAY_NAME: displayName
106
+ };
107
+
108
+ // ── Root config files ─────────────────────────────────────────────────
109
+ await copyDefault('web5.config.json', path.join(outDir, 'web5.config.json'), subs);
110
+ await copyDefault('package.json', path.join(outDir, 'package.json'), subs);
111
+ await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));
112
+
113
+ // ── src/ ──────────────────────────────────────────────────────────────
114
+ await copyDefault('src/index.ts', path.join(outDir, 'src', 'index.ts'), subs);
115
+ await copyDefault('src/createRegistry.ts', path.join(outDir, 'src', 'createRegistry.ts'));
116
+ await copyDefault('src/components/types.ts', path.join(outDir, 'src', 'components', 'types.ts'));
117
+
118
+ // ── src/configuration/ ────────────────────────────────────────────────
119
+ await copyDefault('src/configuration/client.config.ts', path.join(outDir, 'src', 'configuration', 'client.config.ts'));
120
+ await copyDefault('src/configuration/ai/prompt-instructions.yaml', path.join(outDir, 'src', 'configuration', 'ai', 'prompt-instructions.yaml'));
121
+ await copyDefault('src/configuration/cms/cms-mapping.yaml', path.join(outDir, 'src', 'configuration', 'cms', 'cms-mapping.yaml'));
122
+ await copyDefault('src/configuration/cms/cms-schema.yaml', path.join(outDir, 'src', 'configuration', 'cms', 'cms-schema.yaml'));
123
+
124
+ // ── src/actions/ ──────────────────────────────────────────────────────
125
+ await copyDefault('src/actions/index.ts', path.join(outDir, 'src', 'actions', 'index.ts'));
126
+ await copyDefault('src/actions/bookDemoAction.ts', path.join(outDir, 'src', 'actions', 'bookDemoAction.ts'));
127
+ await copyDefault('src/actions/book-demo.yaml', path.join(outDir, 'src', 'actions', 'book-demo.yaml'));
128
+ await copyDefault('src/actions/contactAction.ts', path.join(outDir, 'src', 'actions', 'contactAction.ts'));
129
+ await copyDefault('src/actions/contact-action.yaml', path.join(outDir, 'src', 'actions', 'contact-action.yaml'));
130
+
131
+ // ── AGENTS.md ─────────────────────────────────────────────────────────
132
+ await copyDefault('AGENTS.md', path.join(outDir, 'AGENTS.md'), subs);
133
+
134
+ // ── docs/ ─────────────────────────────────────────────────────────────
135
+ await copyDefault('docs/architecture.md', path.join(outDir, 'docs', 'architecture.md'), subs);
136
+ await copyDefault('docs/api-reference.md', path.join(outDir, 'docs', 'api-reference.md'), subs);
137
+
138
+ // ── skills/ ───────────────────────────────────────────────────────────
139
+ for (const skill of ['action-add', 'action-remove', 'action-update', 'section-add', 'section-remove', 'section-update', 'slot-add']) {
140
+ await copyDefault(`skills/${skill}.md`, path.join(outDir, 'skills', `${skill}.md`));
141
+ }
142
+
143
+ // ── Component subdirectories ──────────────────────────────────────────
144
+ for (const folder of ['base', 'slots', 'sections']) {
145
+ const componentDir = path.join(outDir, 'src', 'components', folder);
146
+ await (0, _fs2.ensureDir)(componentDir);
147
+ await (0, _fs2.atomicWrite)(path.join(componentDir, '.gitkeep'), '');
148
+ }
149
+
150
+ // ── Done ──────────────────────────────────────────────────────────────
151
+ (0, _print.success)(`Created ${name}`);
152
+ console.log('');
153
+ (0, _print.info)('Next steps:');
154
+ (0, _print.info)(` cd ${dir}`);
155
+ (0, _print.info)(' yarn install');
156
+ } catch (err_) {
157
+ (0, _print.error)(err_ instanceof Error ? err_.message : String(err_));
158
+ process.exit(1);
159
+ }
160
+ });
161
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_commander","require","_inquirer","_interopRequireDefault","path","_interopRequireWildcard","fs","_promises","_print","_fs2","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULTS_DIR","join","__dirname","copyDefault","srcRelative","destAbsolute","substitutions","srcPath","content","readFile","token","value","entries","replaceAll","atomicWrite","findExistingConfig","startDir","current","parent","dirname","candidate","existsSync","resolveString","flag","isTTY","question","opts","defaultValue","undefined","exitMsg","error","process","exit","answers","inquirer","prompt","initCommand","exports","Command","description","option","action","existing","cwd","warn","Boolean","stdin","mode","name","type","message","validate","v","trim","length","defaultDisplay","split","pop","replace","displayName","defaultDir","dir","outDir","resolve","readdirSync","info","subs","NAME","DISPLAY_NAME","skill","folder","componentDir","ensureDir","success","console","log","err_","Error","String"],"sources":["../../../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { readFile } from 'fs/promises';\nimport { success, error, info, warn } from '../utils/print';\nimport { atomicWrite, ensureDir } from '../utils/fs';\n\nconst DEFAULTS_DIR = path.join(__dirname, '../../../defaults');\n\ntype Mode = 'defaults' | 'scratch';\n\ninterface InitOptions {\n mode?: Mode;\n name?: string;\n displayName?: string;\n dir?: string;\n}\n\nasync function copyDefault(\n srcRelative: string,\n destAbsolute: string,\n substitutions: Record<string, string> = {},\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n let content = await readFile(srcPath, 'utf8');\n for (const [token, value] of Object.entries(substitutions)) {\n content = content.replaceAll(`{{${token}}}`, value);\n }\n await atomicWrite(destAbsolute, content);\n}\n\nfunction findExistingConfig(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n current = parent;\n parent = path.dirname(current);\n }\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n return null;\n}\n\nasync function resolveString(\n flag: string | undefined,\n isTTY: boolean,\n question: Parameters<typeof inquirer.prompt>[0],\n opts: { defaultValue?: string; exitMsg?: string } = {},\n): Promise<string> {\n if (flag) {\n return flag;\n }\n if (!isTTY) {\n if (opts.defaultValue !== undefined) {\n return opts.defaultValue;\n }\n if (opts.exitMsg) {\n error(opts.exitMsg);\n }\n process.exit(1);\n }\n const answers = await inquirer.prompt<{ value: string }>(question);\n return answers.value ?? opts.defaultValue ?? '';\n}\n\nexport const initCommand = new Command('init')\n .description('Scaffold a new Web5 client component library')\n .option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults')\n .option('--name <name>', 'npm package name (e.g. @wix/my-components)')\n .option('--display-name <displayName>', 'human-readable display name')\n .option(\n '--dir <dir>',\n 'output directory (default: derived from package name)',\n )\n .action(async (opts: InitOptions) => {\n try {\n const existing = findExistingConfig(process.cwd());\n if (existing) {\n warn(`web5.config.json already exists at ${existing}`);\n warn('Proceeding will create a nested project.');\n }\n\n const isTTY = Boolean(process.stdin.isTTY);\n const mode: Mode = opts.mode ?? 'defaults';\n\n // ── Collect: package name ─────────────────────────────────────────────\n const name = await resolveString(\n opts.name,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Package name (e.g. @wix/my-components):',\n validate: (v: string) =>\n v.trim().length > 0 ? true : 'Package name is required',\n },\n ],\n { exitMsg: '--name is required in non-interactive mode' },\n );\n\n // ── Collect: display name ─────────────────────────────────────────────\n const defaultDisplay = name.split('/').pop()!.replace(/-/g, ' ');\n const displayName = await resolveString(\n opts.displayName,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Display name:',\n default: defaultDisplay,\n },\n ],\n { defaultValue: defaultDisplay },\n );\n\n // ── Collect: output directory ─────────────────────────────────────────\n const defaultDir = name.split('/').pop()!;\n const dir = await resolveString(\n opts.dir,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Output directory:',\n default: defaultDir,\n },\n ],\n { defaultValue: defaultDir },\n );\n\n const outDir = path.resolve(process.cwd(), dir);\n\n if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {\n warn(`Directory ${outDir} already exists and is not empty`);\n }\n\n info(`Scaffolding ${name} \\u2192 ${outDir}`);\n void mode;\n\n const subs = { NAME: name, DISPLAY_NAME: displayName };\n\n // ── Root config files ─────────────────────────────────────────────────\n await copyDefault(\n 'web5.config.json',\n path.join(outDir, 'web5.config.json'),\n subs,\n );\n await copyDefault(\n 'package.json',\n path.join(outDir, 'package.json'),\n subs,\n );\n await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));\n\n // ── src/ ──────────────────────────────────────────────────────────────\n await copyDefault(\n 'src/index.ts',\n path.join(outDir, 'src', 'index.ts'),\n subs,\n );\n await copyDefault(\n 'src/createRegistry.ts',\n path.join(outDir, 'src', 'createRegistry.ts'),\n );\n await copyDefault(\n 'src/components/types.ts',\n path.join(outDir, 'src', 'components', 'types.ts'),\n );\n\n // ── src/configuration/ ────────────────────────────────────────────────\n await copyDefault(\n 'src/configuration/client.config.ts',\n path.join(outDir, 'src', 'configuration', 'client.config.ts'),\n );\n await copyDefault(\n 'src/configuration/ai/prompt-instructions.yaml',\n path.join(\n outDir,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n ),\n );\n await copyDefault(\n 'src/configuration/cms/cms-mapping.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-mapping.yaml'),\n );\n await copyDefault(\n 'src/configuration/cms/cms-schema.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-schema.yaml'),\n );\n\n // ── src/actions/ ──────────────────────────────────────────────────────\n await copyDefault(\n 'src/actions/index.ts',\n path.join(outDir, 'src', 'actions', 'index.ts'),\n );\n await copyDefault(\n 'src/actions/bookDemoAction.ts',\n path.join(outDir, 'src', 'actions', 'bookDemoAction.ts'),\n );\n await copyDefault(\n 'src/actions/book-demo.yaml',\n path.join(outDir, 'src', 'actions', 'book-demo.yaml'),\n );\n await copyDefault(\n 'src/actions/contactAction.ts',\n path.join(outDir, 'src', 'actions', 'contactAction.ts'),\n );\n await copyDefault(\n 'src/actions/contact-action.yaml',\n path.join(outDir, 'src', 'actions', 'contact-action.yaml'),\n );\n\n // ── AGENTS.md ─────────────────────────────────────────────────────────\n await copyDefault('AGENTS.md', path.join(outDir, 'AGENTS.md'), subs);\n\n // ── docs/ ─────────────────────────────────────────────────────────────\n await copyDefault(\n 'docs/architecture.md',\n path.join(outDir, 'docs', 'architecture.md'),\n subs,\n );\n await copyDefault(\n 'docs/api-reference.md',\n path.join(outDir, 'docs', 'api-reference.md'),\n subs,\n );\n\n // ── skills/ ───────────────────────────────────────────────────────────\n for (const skill of [\n 'action-add',\n 'action-remove',\n 'action-update',\n 'section-add',\n 'section-remove',\n 'section-update',\n 'slot-add',\n ]) {\n await copyDefault(\n `skills/${skill}.md`,\n path.join(outDir, 'skills', `${skill}.md`),\n );\n }\n\n // ── Component subdirectories ──────────────────────────────────────────\n for (const folder of ['base', 'slots', 'sections']) {\n const componentDir = path.join(outDir, 'src', 'components', folder);\n await ensureDir(componentDir);\n await atomicWrite(path.join(componentDir, '.gitkeep'), '');\n }\n\n // ── Done ──────────────────────────────────────────────────────────────\n success(`Created ${name}`);\n console.log('');\n info('Next steps:');\n info(` cd ${dir}`);\n info(' yarn install');\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.loginCommand = void 0;
5
+ var _commander = require("commander");
6
+ var _auth = require("../auth");
7
+ var _print = require("../utils/print");
8
+ const loginCommand = exports.loginCommand = new _commander.Command('login').description('Authenticate with the Web5 platform').option('--api-key <key>', 'authenticate using an API key instead of browser flow').action(async opts => {
9
+ try {
10
+ // Env var takes precedence over the flag
11
+ const apiKey = process.env.WEB5_API_KEY ?? opts.apiKey;
12
+ await (0, _auth.login)(apiKey);
13
+ } catch (err_) {
14
+ (0, _print.error)(err_ instanceof Error ? err_.message : String(err_));
15
+ process.exit(1);
16
+ }
17
+ });
18
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_commander","require","_auth","_print","loginCommand","exports","Command","description","option","action","opts","apiKey","process","env","WEB5_API_KEY","login","err_","error","Error","message","String","exit"],"sources":["../../../src/commands/login.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { login } from '../auth';\nimport { error } from '../utils/print';\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with the Web5 platform')\n .option(\n '--api-key <key>',\n 'authenticate using an API key instead of browser flow',\n )\n .action(async (opts: { apiKey?: string }) => {\n try {\n // Env var takes precedence over the flag\n const apiKey = process.env.WEB5_API_KEY ?? opts.apiKey;\n await login(apiKey);\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":";;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEO,MAAMG,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG,IAAIE,kBAAO,CAAC,OAAO,CAAC,CAC7CC,WAAW,CAAC,qCAAqC,CAAC,CAClDC,MAAM,CACL,iBAAiB,EACjB,uDACF,CAAC,CACAC,MAAM,CAAC,MAAOC,IAAyB,IAAK;EAC3C,IAAI;IACF;IACA,MAAMC,MAAM,GAAGC,OAAO,CAACC,GAAG,CAACC,YAAY,IAAIJ,IAAI,CAACC,MAAM;IACtD,MAAM,IAAAI,WAAK,EAACJ,MAAM,CAAC;EACrB,CAAC,CAAC,OAAOK,IAAI,EAAE;IACb,IAAAC,YAAK,EAACD,IAAI,YAAYE,KAAK,GAAGF,IAAI,CAACG,OAAO,GAAGC,MAAM,CAACJ,IAAI,CAAC,CAAC;IAC1DJ,OAAO,CAACS,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC","ignoreList":[]}