@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.
- package/README.md +8 -0
- package/bin/web5.js +3 -0
- package/defaults/package.json +42 -0
- package/dist/cjs/auth/deviceFlow.js +76 -0
- package/dist/cjs/auth/deviceFlow.js.map +1 -0
- package/dist/cjs/auth/index.js +47 -0
- package/dist/cjs/auth/index.js.map +1 -0
- package/dist/cjs/auth/secretStore.js +103 -0
- package/dist/cjs/auth/secretStore.js.map +1 -0
- package/dist/cjs/cli.js +18 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/commands/init.js +161 -0
- package/dist/cjs/commands/init.js.map +1 -0
- package/dist/cjs/commands/login.js +18 -0
- package/dist/cjs/commands/login.js.map +1 -0
- package/dist/cjs/commands/validate.js +706 -0
- package/dist/cjs/commands/validate.js.map +1 -0
- package/dist/cjs/counter.js +19 -0
- package/dist/cjs/counter.js.map +1 -0
- package/dist/cjs/external-types.d.js +2 -0
- package/dist/cjs/external-types.d.js.map +1 -0
- package/dist/cjs/index.js +10 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/templates/actionYamlSchema.js +33 -0
- package/dist/cjs/templates/actionYamlSchema.js.map +1 -0
- package/dist/cjs/templates/aiInstructionsSchema.js +39 -0
- package/dist/cjs/templates/aiInstructionsSchema.js.map +1 -0
- package/dist/cjs/templates/cmsSchemaSchema.js +59 -0
- package/dist/cjs/templates/cmsSchemaSchema.js.map +1 -0
- package/dist/cjs/test-types.d.js +2 -0
- package/dist/cjs/test-types.d.js.map +1 -0
- package/dist/cjs/utils/fs.js +25 -0
- package/dist/cjs/utils/fs.js.map +1 -0
- package/dist/cjs/utils/print.js +27 -0
- package/dist/cjs/utils/print.js.map +1 -0
- package/dist/cjs/utils/project.js +27 -0
- package/dist/cjs/utils/project.js.map +1 -0
- package/dist/esm/auth/deviceFlow.js +72 -0
- package/dist/esm/auth/deviceFlow.js.map +1 -0
- package/dist/esm/auth/index.js +40 -0
- package/dist/esm/auth/index.js.map +1 -0
- package/dist/esm/auth/secretStore.js +96 -0
- package/dist/esm/auth/secretStore.js.map +1 -0
- package/dist/esm/cli.js +16 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/commands/init.js +161 -0
- package/dist/esm/commands/init.js.map +1 -0
- package/dist/esm/commands/login.js +14 -0
- package/dist/esm/commands/login.js.map +1 -0
- package/dist/esm/commands/validate.js +704 -0
- package/dist/esm/commands/validate.js.map +1 -0
- package/dist/esm/counter.js +16 -0
- package/dist/esm/counter.js.map +1 -0
- package/dist/esm/external-types.d.js +2 -0
- package/dist/esm/external-types.d.js.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/templates/actionYamlSchema.js +29 -0
- package/dist/esm/templates/actionYamlSchema.js.map +1 -0
- package/dist/esm/templates/aiInstructionsSchema.js +35 -0
- package/dist/esm/templates/aiInstructionsSchema.js.map +1 -0
- package/dist/esm/templates/cmsSchemaSchema.js +55 -0
- package/dist/esm/templates/cmsSchemaSchema.js.map +1 -0
- package/dist/esm/test-types.d.js +2 -0
- package/dist/esm/test-types.d.js.map +1 -0
- package/dist/esm/utils/fs.js +22 -0
- package/dist/esm/utils/fs.js.map +1 -0
- package/dist/esm/utils/print.js +18 -0
- package/dist/esm/utils/print.js.map +1 -0
- package/dist/esm/utils/project.js +23 -0
- package/dist/esm/utils/project.js.map +1 -0
- package/dist/types/auth/deviceFlow.d.ts +8 -0
- package/dist/types/auth/deviceFlow.d.ts.map +1 -0
- package/dist/types/auth/index.d.ts +6 -0
- package/dist/types/auth/index.d.ts.map +1 -0
- package/dist/types/auth/secretStore.d.ts +9 -0
- package/dist/types/auth/secretStore.d.ts.map +1 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/commands/init.d.ts +3 -0
- package/dist/types/commands/init.d.ts.map +1 -0
- package/dist/types/commands/login.d.ts +3 -0
- package/dist/types/commands/login.d.ts.map +1 -0
- package/dist/types/commands/validate.d.ts +3 -0
- package/dist/types/commands/validate.d.ts.map +1 -0
- package/dist/types/counter.d.ts +6 -0
- package/dist/types/counter.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/templates/actionYamlSchema.d.ts +2 -0
- package/dist/types/templates/actionYamlSchema.d.ts.map +1 -0
- package/dist/types/templates/aiInstructionsSchema.d.ts +2 -0
- package/dist/types/templates/aiInstructionsSchema.d.ts.map +1 -0
- package/dist/types/templates/cmsSchemaSchema.d.ts +2 -0
- package/dist/types/templates/cmsSchemaSchema.d.ts.map +1 -0
- package/dist/types/utils/fs.d.ts +3 -0
- package/dist/types/utils/fs.d.ts.map +1 -0
- package/dist/types/utils/print.d.ts +7 -0
- package/dist/types/utils/print.d.ts.map +1 -0
- package/dist/types/utils/project.d.ts +6 -0
- package/dist/types/utils/project.d.ts.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import * as crypto from 'crypto';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { readFile, unlink } from 'fs/promises';
|
|
5
|
+
import { atomicWrite } from '../utils/fs';
|
|
6
|
+
const SERVICE = 'wix-web5-cli';
|
|
7
|
+
const ACCOUNT = 'credentials';
|
|
8
|
+
const CRED_FILE = path.join(os.homedir(), '.wix', 'credentials.enc');
|
|
9
|
+
let _storeType = null;
|
|
10
|
+
function getDerivedKey() {
|
|
11
|
+
const uid = String(os.userInfo().uid);
|
|
12
|
+
const raw = `${os.hostname()}:${uid}`;
|
|
13
|
+
return crypto.createHash('sha256').update(raw).digest();
|
|
14
|
+
}
|
|
15
|
+
async function detectStore() {
|
|
16
|
+
if (_storeType) {
|
|
17
|
+
return _storeType;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
// Dynamic import — keytar is optional; throws if the native module is absent
|
|
21
|
+
const keytar = await import('keytar');
|
|
22
|
+
await keytar.setPassword(SERVICE, '_probe', 'test');
|
|
23
|
+
await keytar.deletePassword(SERVICE, '_probe');
|
|
24
|
+
_storeType = 'keychain';
|
|
25
|
+
} catch {
|
|
26
|
+
_storeType = 'file';
|
|
27
|
+
}
|
|
28
|
+
return _storeType;
|
|
29
|
+
}
|
|
30
|
+
function encrypt(plaintext) {
|
|
31
|
+
const key = getDerivedKey();
|
|
32
|
+
const iv = crypto.randomBytes(12);
|
|
33
|
+
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
|
|
34
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
|
|
35
|
+
const tag = cipher.getAuthTag();
|
|
36
|
+
return Buffer.concat([iv, tag, encrypted]).toString('base64');
|
|
37
|
+
}
|
|
38
|
+
function decrypt(ciphertext) {
|
|
39
|
+
const key = getDerivedKey();
|
|
40
|
+
const buf = Buffer.from(ciphertext, 'base64');
|
|
41
|
+
const iv = buf.subarray(0, 12);
|
|
42
|
+
const tag = buf.subarray(12, 28);
|
|
43
|
+
const encrypted = buf.subarray(28);
|
|
44
|
+
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
|
|
45
|
+
decipher.setAuthTag(tag);
|
|
46
|
+
return decipher.update(encrypted) + decipher.final('utf8');
|
|
47
|
+
}
|
|
48
|
+
export async function writeCredentials(creds) {
|
|
49
|
+
const store = await detectStore();
|
|
50
|
+
const payload = JSON.stringify(creds);
|
|
51
|
+
if (store === 'keychain') {
|
|
52
|
+
const keytar = await import('keytar');
|
|
53
|
+
await keytar.setPassword(SERVICE, ACCOUNT, payload);
|
|
54
|
+
} else {
|
|
55
|
+
await atomicWrite(CRED_FILE, encrypt(payload), 0o600);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function readCredentials() {
|
|
59
|
+
// Env var takes highest priority — used in CI/CD pipelines
|
|
60
|
+
const apiKey = process.env.WEB5_API_KEY;
|
|
61
|
+
if (apiKey) {
|
|
62
|
+
return {
|
|
63
|
+
api_key: apiKey
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const store = await detectStore();
|
|
67
|
+
if (store === 'keychain') {
|
|
68
|
+
const keytar = await import('keytar');
|
|
69
|
+
const payload = await keytar.getPassword(SERVICE, ACCOUNT);
|
|
70
|
+
if (!payload) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return JSON.parse(payload);
|
|
74
|
+
} else {
|
|
75
|
+
try {
|
|
76
|
+
const encrypted = await readFile(CRED_FILE, 'utf8');
|
|
77
|
+
return JSON.parse(decrypt(encrypted.trim()));
|
|
78
|
+
} catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export async function clearCredentials() {
|
|
84
|
+
const store = await detectStore();
|
|
85
|
+
if (store === 'keychain') {
|
|
86
|
+
const keytar = await import('keytar');
|
|
87
|
+
await keytar.deletePassword(SERVICE, ACCOUNT);
|
|
88
|
+
} else {
|
|
89
|
+
try {
|
|
90
|
+
await unlink(CRED_FILE);
|
|
91
|
+
} catch {
|
|
92
|
+
// Already gone — that's fine
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=secretStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["crypto","os","path","readFile","unlink","atomicWrite","SERVICE","ACCOUNT","CRED_FILE","join","homedir","_storeType","getDerivedKey","uid","String","userInfo","raw","hostname","createHash","update","digest","detectStore","keytar","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","readCredentials","apiKey","process","env","WEB5_API_KEY","api_key","getPassword","parse","trim","clearCredentials"],"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":[]}
|
package/dist/esm/cli.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { loginCommand } from './commands/login';
|
|
5
|
+
import { initCommand } from './commands/init';
|
|
6
|
+
import { validateCommand } from './commands/validate';
|
|
7
|
+
|
|
8
|
+
// Read version from package.json at runtime (works from dist/cjs/ via ../../)
|
|
9
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf8'));
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program.name('web5').description('Developer CLI for the Web5 platform').version(pkg.version);
|
|
12
|
+
program.addCommand(loginCommand);
|
|
13
|
+
program.addCommand(initCommand);
|
|
14
|
+
program.addCommand(validateCommand);
|
|
15
|
+
program.parseAsync(process.argv);
|
|
16
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Command","fs","path","loginCommand","initCommand","validateCommand","pkg","JSON","parse","readFileSync","join","__dirname","program","name","description","version","addCommand","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,SAASA,OAAO,QAAQ,WAAW;AACnC,OAAO,KAAKC,EAAE,MAAM,IAAI;AACxB,OAAO,KAAKC,IAAI,MAAM,MAAM;AAC5B,SAASC,YAAY,QAAQ,kBAAkB;AAC/C,SAASC,WAAW,QAAQ,iBAAiB;AAC7C,SAASC,eAAe,QAAQ,qBAAqB;;AAErD;AACA,MAAMC,GAAG,GAAGC,IAAI,CAACC,KAAK,CACpBP,EAAE,CAACQ,YAAY,CAACP,IAAI,CAACQ,IAAI,CAACC,SAAS,EAAE,oBAAoB,CAAC,EAAE,MAAM,CACpE,CAAwB;AAExB,MAAMC,OAAO,GAAG,IAAIZ,OAAO,CAAC,CAAC;AAE7BY,OAAO,CACJC,IAAI,CAAC,MAAM,CAAC,CACZC,WAAW,CAAC,qCAAqC,CAAC,CAClDC,OAAO,CAACT,GAAG,CAACS,OAAO,CAAC;AAEvBH,OAAO,CAACI,UAAU,CAACb,YAAY,CAAC;AAChCS,OAAO,CAACI,UAAU,CAACZ,WAAW,CAAC;AAC/BQ,OAAO,CAACI,UAAU,CAACX,eAAe,CAAC;AAEnCO,OAAO,CAACK,UAAU,CAACC,OAAO,CAACC,IAAI,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import { readFile } from 'fs/promises';
|
|
6
|
+
import { success, error, info, warn } from '../utils/print';
|
|
7
|
+
import { atomicWrite, ensureDir } from '../utils/fs';
|
|
8
|
+
const DEFAULTS_DIR = path.join(__dirname, '../../../defaults');
|
|
9
|
+
async function copyDefault(srcRelative, destAbsolute, substitutions) {
|
|
10
|
+
if (substitutions === void 0) {
|
|
11
|
+
substitutions = {};
|
|
12
|
+
}
|
|
13
|
+
const srcPath = path.join(DEFAULTS_DIR, srcRelative);
|
|
14
|
+
let content = await readFile(srcPath, 'utf8');
|
|
15
|
+
for (const [token, value] of Object.entries(substitutions)) {
|
|
16
|
+
content = content.replaceAll(`{{${token}}}`, value);
|
|
17
|
+
}
|
|
18
|
+
await atomicWrite(destAbsolute, content);
|
|
19
|
+
}
|
|
20
|
+
function findExistingConfig(startDir) {
|
|
21
|
+
let current = startDir;
|
|
22
|
+
let parent = path.dirname(current);
|
|
23
|
+
while (current !== parent) {
|
|
24
|
+
const candidate = path.join(current, 'web5.config.json');
|
|
25
|
+
if (fs.existsSync(candidate)) {
|
|
26
|
+
return candidate;
|
|
27
|
+
}
|
|
28
|
+
current = parent;
|
|
29
|
+
parent = path.dirname(current);
|
|
30
|
+
}
|
|
31
|
+
const candidate = path.join(current, 'web5.config.json');
|
|
32
|
+
if (fs.existsSync(candidate)) {
|
|
33
|
+
return candidate;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
async function resolveString(flag, isTTY, question, opts) {
|
|
38
|
+
if (opts === void 0) {
|
|
39
|
+
opts = {};
|
|
40
|
+
}
|
|
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
|
+
error(opts.exitMsg);
|
|
50
|
+
}
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const answers = await inquirer.prompt(question);
|
|
54
|
+
return answers.value ?? opts.defaultValue ?? '';
|
|
55
|
+
}
|
|
56
|
+
export const initCommand = new 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
|
+
warn(`web5.config.json already exists at ${existing}`);
|
|
61
|
+
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
|
+
warn(`Directory ${outDir} already exists and is not empty`);
|
|
100
|
+
}
|
|
101
|
+
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 ensureDir(componentDir);
|
|
147
|
+
await atomicWrite(path.join(componentDir, '.gitkeep'), '');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ── Done ──────────────────────────────────────────────────────────────
|
|
151
|
+
success(`Created ${name}`);
|
|
152
|
+
console.log('');
|
|
153
|
+
info('Next steps:');
|
|
154
|
+
info(` cd ${dir}`);
|
|
155
|
+
info(' yarn install');
|
|
156
|
+
} catch (err_) {
|
|
157
|
+
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":["Command","inquirer","path","fs","readFile","success","error","info","warn","atomicWrite","ensureDir","DEFAULTS_DIR","join","__dirname","copyDefault","srcRelative","destAbsolute","substitutions","srcPath","content","token","value","Object","entries","replaceAll","findExistingConfig","startDir","current","parent","dirname","candidate","existsSync","resolveString","flag","isTTY","question","opts","defaultValue","undefined","exitMsg","process","exit","answers","prompt","initCommand","description","option","action","existing","cwd","Boolean","stdin","mode","name","type","message","validate","v","trim","length","defaultDisplay","split","pop","replace","displayName","default","defaultDir","dir","outDir","resolve","readdirSync","subs","NAME","DISPLAY_NAME","skill","folder","componentDir","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,14 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { login } from '../auth';
|
|
3
|
+
import { error } from '../utils/print';
|
|
4
|
+
export const loginCommand = new Command('login').description('Authenticate with the Web5 platform').option('--api-key <key>', 'authenticate using an API key instead of browser flow').action(async opts => {
|
|
5
|
+
try {
|
|
6
|
+
// Env var takes precedence over the flag
|
|
7
|
+
const apiKey = process.env.WEB5_API_KEY ?? opts.apiKey;
|
|
8
|
+
await login(apiKey);
|
|
9
|
+
} catch (err_) {
|
|
10
|
+
error(err_ instanceof Error ? err_.message : String(err_));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Command","login","error","loginCommand","description","option","action","opts","apiKey","process","env","WEB5_API_KEY","err_","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,SAASA,OAAO,QAAQ,WAAW;AACnC,SAASC,KAAK,QAAQ,SAAS;AAC/B,SAASC,KAAK,QAAQ,gBAAgB;AAEtC,OAAO,MAAMC,YAAY,GAAG,IAAIH,OAAO,CAAC,OAAO,CAAC,CAC7CI,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,MAAMP,KAAK,CAACO,MAAM,CAAC;EACrB,CAAC,CAAC,OAAOI,IAAI,EAAE;IACbV,KAAK,CAACU,IAAI,YAAYC,KAAK,GAAGD,IAAI,CAACE,OAAO,GAAGC,MAAM,CAACH,IAAI,CAAC,CAAC;IAC1DH,OAAO,CAACO,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC","ignoreList":[]}
|