@wix/web50-cli 0.1.0 → 0.1.1
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/dist/cjs/auth/deviceFlow.js +99 -13
- package/dist/cjs/auth/deviceFlow.js.map +1 -1
- package/dist/cjs/auth/index.js +65 -12
- package/dist/cjs/auth/index.js.map +1 -1
- package/dist/cjs/auth/secretStore.js.map +1 -1
- package/dist/cjs/cli.js +29 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands/bundle.js +95 -0
- package/dist/cjs/commands/bundle.js.map +1 -0
- package/dist/cjs/commands/conversation.js +50 -0
- package/dist/cjs/commands/conversation.js.map +1 -0
- package/dist/cjs/commands/conversationWizard.js +526 -0
- package/dist/cjs/commands/conversationWizard.js.map +1 -0
- package/dist/cjs/commands/deploy.js +192 -0
- package/dist/cjs/commands/deploy.js.map +1 -0
- package/dist/cjs/commands/embed.js +118 -0
- package/dist/cjs/commands/embed.js.map +1 -0
- package/dist/cjs/commands/getClientId.js +60 -0
- package/dist/cjs/commands/getClientId.js.map +1 -0
- package/dist/cjs/commands/init.js +31 -26
- package/dist/cjs/commands/init.js.map +1 -1
- package/dist/cjs/commands/instructions.js +360 -0
- package/dist/cjs/commands/instructions.js.map +1 -0
- package/dist/cjs/commands/login.js +59 -4
- package/dist/cjs/commands/login.js.map +1 -1
- package/dist/cjs/commands/logout.js +16 -0
- package/dist/cjs/commands/logout.js.map +1 -0
- package/dist/cjs/commands/serve.js +122 -0
- package/dist/cjs/commands/serve.js.map +1 -0
- package/dist/cjs/commands/storybook.js +102 -0
- package/dist/cjs/commands/storybook.js.map +1 -0
- package/dist/cjs/commands/validate.js +266 -18
- package/dist/cjs/commands/validate.js.map +1 -1
- package/dist/cjs/commands/whoami.js +48 -0
- package/dist/cjs/commands/whoami.js.map +1 -0
- package/dist/cjs/utils/print.js +12 -0
- package/dist/cjs/utils/print.js.map +1 -1
- package/dist/cjs/utils/project.js +11 -0
- package/dist/cjs/utils/project.js.map +1 -1
- package/dist/cjs/utils/wixApi.js +55 -0
- package/dist/cjs/utils/wixApi.js.map +1 -0
- package/dist/esm/auth/deviceFlow.js +106 -13
- package/dist/esm/auth/deviceFlow.js.map +1 -1
- package/dist/esm/auth/index.js +71 -13
- package/dist/esm/auth/index.js.map +1 -1
- package/dist/esm/auth/secretStore.js.map +1 -1
- package/dist/esm/cli.js +29 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/bundle.js +92 -0
- package/dist/esm/commands/bundle.js.map +1 -0
- package/dist/esm/commands/conversation.js +44 -0
- package/dist/esm/commands/conversation.js.map +1 -0
- package/dist/esm/commands/conversationWizard.js +527 -0
- package/dist/esm/commands/conversationWizard.js.map +1 -0
- package/dist/esm/commands/deploy.js +194 -0
- package/dist/esm/commands/deploy.js.map +1 -0
- package/dist/esm/commands/embed.js +112 -0
- package/dist/esm/commands/embed.js.map +1 -0
- package/dist/esm/commands/getClientId.js +56 -0
- package/dist/esm/commands/getClientId.js.map +1 -0
- package/dist/esm/commands/init.js +32 -27
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/instructions.js +360 -0
- package/dist/esm/commands/instructions.js.map +1 -0
- package/dist/esm/commands/login.js +62 -6
- package/dist/esm/commands/login.js.map +1 -1
- package/dist/esm/commands/logout.js +12 -0
- package/dist/esm/commands/logout.js.map +1 -0
- package/dist/esm/commands/serve.js +117 -0
- package/dist/esm/commands/serve.js.map +1 -0
- package/dist/esm/commands/storybook.js +97 -0
- package/dist/esm/commands/storybook.js.map +1 -0
- package/dist/esm/commands/validate.js +269 -19
- package/dist/esm/commands/validate.js.map +1 -1
- package/dist/esm/commands/whoami.js +44 -0
- package/dist/esm/commands/whoami.js.map +1 -0
- package/dist/esm/utils/print.js +10 -0
- package/dist/esm/utils/print.js.map +1 -1
- package/dist/esm/utils/project.js +8 -0
- package/dist/esm/utils/project.js.map +1 -1
- package/dist/esm/utils/wixApi.js +51 -0
- package/dist/esm/utils/wixApi.js.map +1 -0
- package/dist/types/auth/deviceFlow.d.ts +3 -1
- package/dist/types/auth/deviceFlow.d.ts.map +1 -1
- package/dist/types/auth/index.d.ts +5 -1
- package/dist/types/auth/index.d.ts.map +1 -1
- package/dist/types/auth/secretStore.d.ts +2 -0
- package/dist/types/auth/secretStore.d.ts.map +1 -1
- package/dist/types/commands/bundle.d.ts +10 -0
- package/dist/types/commands/bundle.d.ts.map +1 -0
- package/dist/types/commands/conversation.d.ts +3 -0
- package/dist/types/commands/conversation.d.ts.map +1 -0
- package/dist/types/commands/conversationWizard.d.ts +3 -0
- package/dist/types/commands/conversationWizard.d.ts.map +1 -0
- package/dist/types/commands/deploy.d.ts +3 -0
- package/dist/types/commands/deploy.d.ts.map +1 -0
- package/dist/types/commands/embed.d.ts +3 -0
- package/dist/types/commands/embed.d.ts.map +1 -0
- package/dist/types/commands/getClientId.d.ts +3 -0
- package/dist/types/commands/getClientId.d.ts.map +1 -0
- package/dist/types/commands/init.d.ts.map +1 -1
- package/dist/types/commands/instructions.d.ts +3 -0
- package/dist/types/commands/instructions.d.ts.map +1 -0
- package/dist/types/commands/login.d.ts.map +1 -1
- package/dist/types/commands/logout.d.ts +3 -0
- package/dist/types/commands/logout.d.ts.map +1 -0
- package/dist/types/commands/serve.d.ts +3 -0
- package/dist/types/commands/serve.d.ts.map +1 -0
- package/dist/types/commands/storybook.d.ts +3 -0
- package/dist/types/commands/storybook.d.ts.map +1 -0
- package/dist/types/commands/validate.d.ts +5 -0
- package/dist/types/commands/validate.d.ts.map +1 -1
- package/dist/types/commands/whoami.d.ts +3 -0
- package/dist/types/commands/whoami.d.ts.map +1 -0
- package/dist/types/utils/print.d.ts +3 -0
- package/dist/types/utils/print.d.ts.map +1 -1
- package/dist/types/utils/project.d.ts +10 -0
- package/dist/types/utils/project.d.ts.map +1 -1
- package/dist/types/utils/wixApi.d.ts +9 -0
- package/dist/types/utils/wixApi.d.ts.map +1 -0
- package/package.json +5 -5
- package/defaults/package.json +0 -42
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Command","Ajv","load","yamlLoad","readFileSync","existsSync","readdirSync","path","chalk","error","info","cmsSchemaSchemaTemplate","aiInstructionsSchemaTemplate","actionYamlSchemaTemplate","SCHEMAS","findProjectRoot","startDir","current","parent","dirname","join","tryParseYaml","filePath","data","e","err","Error","message","String","readText","kebabToCamel","s","replace","_","c","toUpperCase","camelToSnake","toLowerCase","formatAjvError","hints","loc","instancePath","keyword","missing","params","missingProperty","hint","fix","expected","type","field","min","limit","extra","additionalProperty","AI_INSTRUCTIONS_HINTS","rules","instructions","semantics","tone","ACTION_YAML_HINTS","name","buildAiInstructionsDomain","root","fileName","ajv","allErrors","strict","schema","parsed","fileExists","yamlOk","checks","label","run","ok","errors","result","undefined","validate","compile","map","buildCmsSchemaDomain","buildActionsDomain","actionsDir","registryPath","indexPath","yamlFiles","filter","f","endsWith","length","actionSchema","yamlFile","yamlPath","yamlData","schemaOk","actionName","basename","extname","push","getNames","camel","handler","snake","handlerFile","handlerPath","content","includes","declaredParams","Set","p","param","match","usedParams","split","trim","startsWith","undeclared","has","validateCommand","description","action","process","cwd","exit","console","log","domains","hasErrors","domain","check","green","stderr","write","red","e_"],"sources":["../../../src/commands/validate.ts"],"sourcesContent":["import { Command } from 'commander';\nimport Ajv from 'ajv/dist/2020';\nimport type { ErrorObject } from 'ajv';\nimport { load as yamlLoad } from 'js-yaml';\nimport { readFileSync, existsSync, readdirSync } from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { error, info } from '../utils/print';\nimport { cmsSchemaSchemaTemplate } from '../templates/cmsSchemaSchema';\nimport { aiInstructionsSchemaTemplate } from '../templates/aiInstructionsSchema';\nimport { actionYamlSchemaTemplate } from '../templates/actionYamlSchema';\n\n// ── Bundled schemas (never exposed to user's project) ────────────────────────\n\nconst SCHEMAS: Record<string, object> = {\n 'cms-schema.yaml': yamlLoad(cmsSchemaSchemaTemplate()) as object,\n 'prompt-instructions.yaml': yamlLoad(\n aiInstructionsSchemaTemplate(),\n ) as object,\n 'action.yaml': yamlLoad(actionYamlSchemaTemplate()) as object,\n};\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface CheckError {\n message: string;\n fix?: string;\n}\n\ninterface CheckResult {\n ok: boolean;\n errors: CheckError[];\n}\n\ninterface Check {\n label: string;\n run: () => CheckResult;\n}\n\ninterface Domain {\n name: string;\n checks: Check[];\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findProjectRoot(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n current = parent;\n parent = path.dirname(current);\n }\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n return null;\n}\n\nfunction tryParseYaml(\n filePath: string,\n): { data: unknown; err?: undefined } | { data?: undefined; err: string } {\n try {\n return { data: yamlLoad(readFileSync(filePath, 'utf8')) };\n } catch (e) {\n return { err: e instanceof Error ? e.message : String(e) };\n }\n}\n\nfunction readText(filePath: string): string {\n return readFileSync(filePath, 'utf8');\n}\n\n/** kebab-case → camelCase e.g. book-demo → bookDemo */\nfunction kebabToCamel(s: string): string {\n return s.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/** camelCase → snake_case e.g. bookDemo → book_demo */\nfunction camelToSnake(s: string): string {\n return s.replace(/([A-Z])/g, '_$1').toLowerCase();\n}\n\n// ── AJV error formatter ───────────────────────────────────────────────────────\n\n// hints: field-name → indented YAML example of the full expected structure\nfunction formatAjvError(\n e: ErrorObject,\n hints: Record<string, string> = {},\n): CheckError {\n const loc = e.instancePath || '(root)';\n\n if (e.keyword === 'required') {\n const missing = (e.params as { missingProperty: string }).missingProperty;\n const parent =\n loc === '(root)' ? 'top level' : `'${loc.replace(/^\\//, '')}'`;\n const hint = hints[missing];\n return {\n message: `[${loc}] missing required property '${missing}'`,\n fix: hint\n ? `Add '${missing}:' under ${parent}. Expected structure:\\n${hint}`\n : `Add '${missing}:' under ${parent}.`,\n };\n }\n\n if (e.keyword === 'type') {\n const expected = (e.params as { type: string }).type;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must be ${expected}`,\n fix: hint\n ? `Replace the current value of '${field}' with:\\n${hint}`\n : `Change '${field}' to a ${expected}.`,\n };\n }\n\n if (e.keyword === 'minItems') {\n const min = (e.params as { limit: number }).limit;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must have at least ${min} item${min === 1 ? '' : 's'}`,\n fix: hint\n ? `Add at least ${min} entry under '${field}':\\n${hint}`\n : `Add at least ${min} entry under '${field}'.`,\n };\n }\n\n if (e.keyword === 'additionalProperties') {\n const extra = (e.params as { additionalProperty: string })\n .additionalProperty;\n return {\n message: `[${loc}] unknown property '${extra}'`,\n fix: `Remove '${extra}' — it is not a recognised field.`,\n };\n }\n\n return { message: `[${loc}] ${e.message ?? e.keyword}` };\n}\n\n// ── Structural hints ──────────────────────────────────────────────────────────\n\nconst AI_INSTRUCTIONS_HINTS: Record<string, string> = {\n rules: [\n ' rules:',\n \" - Always respond in the language of the user's prompt\",\n ' - Do not hallucinate or fabricate information',\n ' - Refuse requests that are harmful, illegal, or unethical',\n ].join('\\n'),\n instructions: [\n ' instructions: >',\n ' Structure prompts clearly and specifically. Provide relevant',\n ' context and set output expectations (format, length, style).',\n ].join('\\n'),\n semantics: [\n ' semantics:',\n \" PROX: The user's natural language request or structured prompt\",\n ' VERIFY: A response aligned with the detected intent',\n ' SUB-ACTION: Background information or metadata alongside the prompt',\n ].join('\\n'),\n tone: [\n ' tone:',\n ' style: concise',\n ' voice: \"clear and direct — avoid filler phrases\"',\n ].join('\\n'),\n};\n\nconst ACTION_YAML_HINTS: Record<string, string> = {\n name: [' name: my-action'].join('\\n'),\n params: [\n ' params:',\n ' - param: exampleParam',\n ' values:',\n ' - value1',\n ' - value2',\n ' - param: optionalParam',\n ' optional: true',\n ' values:',\n ' - valueA',\n ].join('\\n'),\n};\n\n// ── Domain builders ───────────────────────────────────────────────────────────\n\nfunction buildAiInstructionsDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n );\n const fileName = 'prompt-instructions.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'AI Instructions',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/ai/prompt-instructions.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, AI_INSTRUCTIONS_HINTS),\n ),\n };\n },\n },\n ],\n };\n}\n\nfunction buildCmsSchemaDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'cms',\n 'cms-schema.yaml',\n );\n const fileName = 'cms-schema.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'CMS Schema',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/cms/cms-schema.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) => formatAjvError(e)),\n };\n },\n },\n ],\n };\n}\n\nfunction buildActionsDomain(root: string): Domain {\n const actionsDir = path.join(root, 'src', 'actions');\n const registryPath = path.join(root, 'src', 'createRegistry.ts');\n const indexPath = path.join(actionsDir, 'index.ts');\n\n // If the actions directory is missing, report it and stop\n if (!existsSync(actionsDir)) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — directory exists',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'src/actions/ directory not found',\n fix: 'Create the src/actions/ directory and add at least one action YAML + handler.',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const yamlFiles = readdirSync(actionsDir).filter(\n (f) => f.endsWith('.yaml') || f.endsWith('.yml'),\n );\n\n if (yamlFiles.length === 0) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — at least one action defined',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'No action YAML files found in src/actions/',\n fix: 'Add an action YAML file, e.g. src/actions/my-action.yaml',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n const actionSchema = SCHEMAS['action.yaml'];\n const checks: Check[] = [];\n\n for (const yamlFile of yamlFiles) {\n const yamlPath = path.join(actionsDir, yamlFile);\n\n // Mutable state shared across this action's checks (captured by closures)\n let yamlData: Record<string, unknown> = {};\n let yamlOk = false;\n let schemaOk = false;\n let actionName = path.basename(yamlFile, path.extname(yamlFile));\n\n // ── Check 1: valid YAML ────────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — valid YAML`,\n run(): CheckResult {\n const result = tryParseYaml(yamlPath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n { message: result.err, fix: 'Fix the YAML syntax error.' },\n ],\n };\n }\n yamlData = result.data as Record<string, unknown>;\n yamlOk = true;\n if (typeof yamlData.name === 'string') {\n actionName = yamlData.name;\n }\n return { ok: true, errors: [] };\n },\n });\n\n // ── Check 2: schema valid ─────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(actionSchema);\n if (validate(yamlData)) {\n schemaOk = true;\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, ACTION_YAML_HINTS),\n ),\n };\n },\n });\n\n // Derive names — evaluated lazily inside each check closure after\n // yamlOk sets actionName correctly\n const getNames = () => {\n const camel = kebabToCamel(actionName);\n return {\n camel,\n handler: `${camel}Action`,\n snake: camelToSnake(camel),\n handlerFile: `${camel}Action.ts`,\n handlerPath: path.join(actionsDir, `${camel}Action.ts`),\n };\n };\n\n // ── Check 3: handler file exists ──────────────────────────────────────\n checks.push({\n label: `${yamlFile} — handler file exists`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (existsSync(handlerPath)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Handler not found: src/actions/${handlerFile}`,\n fix: `Create src/actions/${handlerFile} exporting 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 4: handler exports correct name ─────────────────────────────\n checks.push({\n label: `${yamlFile} — handler exports correct name`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n const content = readText(handlerPath);\n if (content.includes(`export const ${handler}`)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'export const ${handler}' not found in ${handlerFile}`,\n fix: `Rename the export to 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 5: handler params ⊆ YAML params ────────────────────────────\n checks.push({\n label: `${yamlFile} — handler params declared in YAML`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n\n const declaredParams = new Set(\n ((yamlData.params as { param: string }[]) ?? []).map((p) => p.param),\n );\n\n const content = readText(handlerPath);\n const match = content.match(/const\\s*\\{([^}]+)\\}\\s*=\\s*params/);\n if (!match) {\n return { ok: true, errors: [] }; // No destructure — nothing to check\n }\n\n const usedParams = match[1]\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0 && !s.startsWith('...'))\n .map((s) => s.split(':')[0].trim()); // handle aliased: { foo: bar }\n\n const undeclared = usedParams.filter((p) => !declaredParams.has(p));\n if (undeclared.length === 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: undeclared.map((p) => ({\n message: `Handler uses param '${p}' not declared in ${yamlFile}`,\n fix: `Add to ${yamlFile}:\\n params:\\n - param: ${p}\\n values: [...]`,\n })),\n };\n },\n });\n\n // ── Check 6: index.ts exports handler ─────────────────────────────────\n checks.push({\n label: `${yamlFile} — exported from src/actions/index.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler } = getNames();\n if (!existsSync(indexPath)) {\n return {\n ok: false,\n errors: [\n {\n message: 'src/actions/index.ts not found',\n fix: `Create src/actions/index.ts and add:\\nexport { ${handler} } from './${handler}';`,\n },\n ],\n };\n }\n const content = readText(indexPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not found in src/actions/index.ts`,\n fix: `Add: export { ${handler} } from './${handler}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 7: createRegistry.ts imports handler ────────────────────────\n checks.push({\n label: `${yamlFile} — imported in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not imported in src/createRegistry.ts`,\n fix: `Add: import { ${handler} } from './actions/${handlerFile.replace(\n '.ts',\n '',\n )}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 8: createRegistry.ts registers the action ──────────────────\n checks.push({\n label: `${yamlFile} — registered in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, snake } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (\n content.includes(`registerAction('${snake}'`) ||\n content.includes(`registerAction(\"${snake}\"`)\n ) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'.registerAction('${snake}', ...)' not found in src/createRegistry.ts`,\n fix: `Add to the registry chain:\\n .registerAction('${snake}', ${handler})`,\n },\n ],\n };\n },\n });\n }\n\n return { name: 'Actions', checks };\n}\n\n// ── Command ───────────────────────────────────────────────────────────────────\n\nexport const validateCommand = new Command('validate')\n .description('Validate project config files against their schemas')\n .action(() => {\n const root = findProjectRoot(process.cwd());\n if (!root) {\n error(\n 'No web5.config.json found — run this command from inside a Web5 project',\n );\n process.exit(1);\n }\n\n info(`Project root: ${root}`);\n console.log('');\n\n const domains: Domain[] = [\n buildAiInstructionsDomain(root),\n buildCmsSchemaDomain(root),\n buildActionsDomain(root),\n ];\n\n let hasErrors = false;\n\n for (const domain of domains) {\n console.log(domain.name);\n\n for (const check of domain.checks) {\n const result = check.run();\n\n if (result.ok) {\n console.log(chalk.green(` \\u2714 ${check.label}`));\n } else {\n hasErrors = true;\n process.stderr.write(chalk.red(` \\u2716 ${check.label}\\n`));\n for (const e_ of result.errors) {\n process.stderr.write(` ${e_.message}\\n`);\n if (e_.fix) {\n process.stderr.write(` Fix: ${e_.fix}\\n`);\n }\n }\n }\n }\n\n console.log('');\n }\n\n if (hasErrors) {\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Command","Ajv","load","yamlLoad","readFileSync","existsSync","readdirSync","watch","fsWatch","path","chalk","error","info","cmsSchemaSchemaTemplate","aiInstructionsSchemaTemplate","actionYamlSchemaTemplate","SCHEMAS","findProjectRoot","startDir","current","parent","dirname","join","tryParseYaml","filePath","data","e","err","Error","message","String","readText","kebabToCamel","s","replace","_","c","toUpperCase","camelToSnake","toLowerCase","formatAjvError","hints","loc","instancePath","keyword","missing","params","missingProperty","hint","fix","expected","type","field","min","limit","extra","additionalProperty","AI_INSTRUCTIONS_HINTS","rules","instructions","semantics","tone","ACTION_YAML_HINTS","name","buildAiInstructionsDomain","root","fileName","ajv","allErrors","strict","schema","parsed","fileExists","yamlOk","checks","label","run","ok","errors","result","undefined","validate","compile","map","buildCmsSchemaDomain","buildActionsDomain","actionsDir","registryPath","indexPath","yamlFiles","filter","f","endsWith","length","actionSchema","yamlFile","yamlPath","yamlData","schemaOk","actionName","basename","extname","push","getNames","camel","handler","snake","handlerFile","handlerPath","content","includes","declaredParams","Set","p","param","match","usedParams","split","trim","startsWith","undeclared","has","printDomain","domain","results","verbose","failed","r","domainOk","console","log","green","process","stderr","write","red","e_","collectDomainJson","every","_ref","buildScriptsDomain","pkgPath","pkg","JSON","parse","_pkg$scripts","scripts","bundle","_pkg$scripts2","build","selectDomains","all","ai","cms","actions","d","runDomains","domains","format","hasErrors","jsonResults","check","jr","runValidation","startWatch","watchDirs","debounce","trigger","clearTimeout","setTimeout","clear","Date","toLocaleTimeString","dir","recursive","relative","validateCommand","description","option","action","opts","Boolean","domainFilter","project","resolve","cwd","exit","stringify","stdout","isTTY"],"sources":["../../../src/commands/validate.ts"],"sourcesContent":["import { Command } from 'commander';\nimport Ajv from 'ajv/dist/2020';\nimport type { ErrorObject } from 'ajv';\nimport { load as yamlLoad } from 'js-yaml';\nimport { readFileSync, existsSync, readdirSync, watch as fsWatch } from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { error, info } from '../utils/print';\n\ntype OutputFormat = 'text' | 'json';\ntype DomainFilter = 'ai' | 'cms' | 'actions' | 'scripts';\nimport { cmsSchemaSchemaTemplate } from '../templates/cmsSchemaSchema';\nimport { aiInstructionsSchemaTemplate } from '../templates/aiInstructionsSchema';\nimport { actionYamlSchemaTemplate } from '../templates/actionYamlSchema';\n\n// ── Bundled schemas (never exposed to user's project) ────────────────────────\n\nconst SCHEMAS: Record<string, object> = {\n 'cms-schema.yaml': yamlLoad(cmsSchemaSchemaTemplate()) as object,\n 'prompt-instructions.yaml': yamlLoad(\n aiInstructionsSchemaTemplate(),\n ) as object,\n 'action.yaml': yamlLoad(actionYamlSchemaTemplate()) as object,\n};\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface CheckError {\n message: string;\n fix?: string;\n}\n\ninterface CheckResult {\n ok: boolean;\n errors: CheckError[];\n}\n\ninterface Check {\n label: string;\n run: () => CheckResult;\n}\n\ninterface Domain {\n name: string;\n checks: Check[];\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findProjectRoot(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n current = parent;\n parent = path.dirname(current);\n }\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n return null;\n}\n\nfunction tryParseYaml(\n filePath: string,\n): { data: unknown; err?: undefined } | { data?: undefined; err: string } {\n try {\n return { data: yamlLoad(readFileSync(filePath, 'utf8')) };\n } catch (e) {\n return { err: e instanceof Error ? e.message : String(e) };\n }\n}\n\nfunction readText(filePath: string): string {\n return readFileSync(filePath, 'utf8');\n}\n\n/** kebab-case → camelCase e.g. book-demo → bookDemo */\nfunction kebabToCamel(s: string): string {\n return s.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/** camelCase → snake_case e.g. bookDemo → book_demo */\nfunction camelToSnake(s: string): string {\n return s.replace(/([A-Z])/g, '_$1').toLowerCase();\n}\n\n// ── AJV error formatter ───────────────────────────────────────────────────────\n\n// hints: field-name → indented YAML example of the full expected structure\nfunction formatAjvError(\n e: ErrorObject,\n hints: Record<string, string> = {},\n): CheckError {\n const loc = e.instancePath || '(root)';\n\n if (e.keyword === 'required') {\n const missing = (e.params as { missingProperty: string }).missingProperty;\n const parent =\n loc === '(root)' ? 'top level' : `'${loc.replace(/^\\//, '')}'`;\n const hint = hints[missing];\n return {\n message: `[${loc}] missing required property '${missing}'`,\n fix: hint\n ? `Add '${missing}:' under ${parent}. Expected structure:\\n${hint}`\n : `Add '${missing}:' under ${parent}.`,\n };\n }\n\n if (e.keyword === 'type') {\n const expected = (e.params as { type: string }).type;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must be ${expected}`,\n fix: hint\n ? `Replace the current value of '${field}' with:\\n${hint}`\n : `Change '${field}' to a ${expected}.`,\n };\n }\n\n if (e.keyword === 'minItems') {\n const min = (e.params as { limit: number }).limit;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must have at least ${min} item${min === 1 ? '' : 's'}`,\n fix: hint\n ? `Add at least ${min} entry under '${field}':\\n${hint}`\n : `Add at least ${min} entry under '${field}'.`,\n };\n }\n\n if (e.keyword === 'additionalProperties') {\n const extra = (e.params as { additionalProperty: string })\n .additionalProperty;\n return {\n message: `[${loc}] unknown property '${extra}'`,\n fix: `Remove '${extra}' — it is not a recognised field.`,\n };\n }\n\n return { message: `[${loc}] ${e.message ?? e.keyword}` };\n}\n\n// ── Structural hints ──────────────────────────────────────────────────────────\n\nconst AI_INSTRUCTIONS_HINTS: Record<string, string> = {\n rules: [\n ' rules:',\n \" - Always respond in the language of the user's prompt\",\n ' - Do not hallucinate or fabricate information',\n ' - Refuse requests that are harmful, illegal, or unethical',\n ].join('\\n'),\n instructions: [\n ' instructions: >',\n ' Structure prompts clearly and specifically. Provide relevant',\n ' context and set output expectations (format, length, style).',\n ].join('\\n'),\n semantics: [\n ' semantics:',\n \" PROX: The user's natural language request or structured prompt\",\n ' VERIFY: A response aligned with the detected intent',\n ' SUB-ACTION: Background information or metadata alongside the prompt',\n ].join('\\n'),\n tone: [\n ' tone:',\n ' style: concise',\n ' voice: \"clear and direct — avoid filler phrases\"',\n ].join('\\n'),\n};\n\nconst ACTION_YAML_HINTS: Record<string, string> = {\n name: [' name: my-action'].join('\\n'),\n params: [\n ' params:',\n ' - param: exampleParam',\n ' values:',\n ' - value1',\n ' - value2',\n ' - param: optionalParam',\n ' optional: true',\n ' values:',\n ' - valueA',\n ].join('\\n'),\n};\n\n// ── Domain builders ───────────────────────────────────────────────────────────\n\nfunction buildAiInstructionsDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n );\n const fileName = 'prompt-instructions.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'AI Instructions',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/ai/prompt-instructions.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, AI_INSTRUCTIONS_HINTS),\n ),\n };\n },\n },\n ],\n };\n}\n\nfunction buildCmsSchemaDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'cms',\n 'cms-schema.yaml',\n );\n const fileName = 'cms-schema.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'CMS Schema',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/cms/cms-schema.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) => formatAjvError(e)),\n };\n },\n },\n ],\n };\n}\n\nfunction buildActionsDomain(root: string): Domain {\n const actionsDir = path.join(root, 'src', 'actions');\n const registryPath = path.join(root, 'src', 'createRegistry.ts');\n const indexPath = path.join(actionsDir, 'index.ts');\n\n // If the actions directory is missing, report it and stop\n if (!existsSync(actionsDir)) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — directory exists',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'src/actions/ directory not found',\n fix: 'Create the src/actions/ directory and add at least one action YAML + handler.',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const yamlFiles = readdirSync(actionsDir).filter(\n (f) => f.endsWith('.yaml') || f.endsWith('.yml'),\n );\n\n if (yamlFiles.length === 0) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — at least one action defined',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'No action YAML files found in src/actions/',\n fix: 'Add an action YAML file, e.g. src/actions/my-action.yaml',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n const actionSchema = SCHEMAS['action.yaml'];\n const checks: Check[] = [];\n\n for (const yamlFile of yamlFiles) {\n const yamlPath = path.join(actionsDir, yamlFile);\n\n // Mutable state shared across this action's checks (captured by closures)\n let yamlData: Record<string, unknown> = {};\n let yamlOk = false;\n let schemaOk = false;\n let actionName = path.basename(yamlFile, path.extname(yamlFile));\n\n // ── Check 1: valid YAML ────────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — valid YAML`,\n run(): CheckResult {\n const result = tryParseYaml(yamlPath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n { message: result.err, fix: 'Fix the YAML syntax error.' },\n ],\n };\n }\n yamlData = result.data as Record<string, unknown>;\n yamlOk = true;\n if (typeof yamlData.name === 'string') {\n actionName = yamlData.name;\n }\n return { ok: true, errors: [] };\n },\n });\n\n // ── Check 2: schema valid ─────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(actionSchema);\n if (validate(yamlData)) {\n schemaOk = true;\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, ACTION_YAML_HINTS),\n ),\n };\n },\n });\n\n // Derive names — evaluated lazily inside each check closure after\n // yamlOk sets actionName correctly\n const getNames = () => {\n const camel = kebabToCamel(actionName);\n return {\n camel,\n handler: `${camel}Action`,\n snake: camelToSnake(camel),\n handlerFile: `${camel}Action.ts`,\n handlerPath: path.join(actionsDir, `${camel}Action.ts`),\n };\n };\n\n // ── Check 3: handler file exists ──────────────────────────────────────\n checks.push({\n label: `${yamlFile} — handler file exists`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (existsSync(handlerPath)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Handler not found: src/actions/${handlerFile}`,\n fix: `Create src/actions/${handlerFile} exporting 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 4: handler exports correct name ─────────────────────────────\n checks.push({\n label: `${yamlFile} — handler exports correct name`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n const content = readText(handlerPath);\n if (content.includes(`export const ${handler}`)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'export const ${handler}' not found in ${handlerFile}`,\n fix: `Rename the export to 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 5: handler params ⊆ YAML params ────────────────────────────\n checks.push({\n label: `${yamlFile} — handler params declared in YAML`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n\n const declaredParams = new Set(\n ((yamlData.params as { param: string }[]) ?? []).map((p) => p.param),\n );\n\n const content = readText(handlerPath);\n const match = content.match(/const\\s*\\{([^}]+)\\}\\s*=\\s*params/);\n if (!match) {\n return { ok: true, errors: [] }; // No destructure — nothing to check\n }\n\n const usedParams = match[1]\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0 && !s.startsWith('...'))\n .map((s) => s.split(':')[0].trim()); // handle aliased: { foo: bar }\n\n const undeclared = usedParams.filter((p) => !declaredParams.has(p));\n if (undeclared.length === 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: undeclared.map((p) => ({\n message: `Handler uses param '${p}' not declared in ${yamlFile}`,\n fix: `Add to ${yamlFile}:\\n params:\\n - param: ${p}\\n values: [...]`,\n })),\n };\n },\n });\n\n // ── Check 6: index.ts exports handler ─────────────────────────────────\n checks.push({\n label: `${yamlFile} — exported from src/actions/index.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler } = getNames();\n if (!existsSync(indexPath)) {\n return {\n ok: false,\n errors: [\n {\n message: 'src/actions/index.ts not found',\n fix: `Create src/actions/index.ts and add:\\nexport { ${handler} } from './${handler}';`,\n },\n ],\n };\n }\n const content = readText(indexPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not found in src/actions/index.ts`,\n fix: `Add: export { ${handler} } from './${handler}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 7: createRegistry.ts imports handler ────────────────────────\n checks.push({\n label: `${yamlFile} — imported in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not imported in src/createRegistry.ts`,\n fix: `Add: import { ${handler} } from './actions/${handlerFile.replace(\n '.ts',\n '',\n )}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 8: createRegistry.ts registers the action ──────────────────\n checks.push({\n label: `${yamlFile} — registered in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, snake } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (\n content.includes(`registerAction('${snake}'`) ||\n content.includes(`registerAction(\"${snake}\"`)\n ) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'.registerAction('${snake}', ...)' not found in src/createRegistry.ts`,\n fix: `Add to the registry chain:\\n .registerAction('${snake}', ${handler})`,\n },\n ],\n };\n },\n });\n }\n\n return { name: 'Actions', checks };\n}\n\n// ── Rendering ─────────────────────────────────────────────────────────────────\n\ninterface CheckResultWithLabel {\n label: string;\n result: CheckResult;\n}\n\nfunction printDomain(\n domain: Domain,\n results: CheckResultWithLabel[],\n verbose: boolean,\n): boolean {\n const failed = results.filter((r) => !r.result.ok);\n const domainOk = failed.length === 0;\n\n if (verbose) {\n console.log(domain.name);\n for (const { label, result } of results) {\n if (result.ok) {\n console.log(chalk.green(` \\u2714 ${label}`));\n } else {\n process.stderr.write(chalk.red(` \\u2716 ${label}\\n`));\n for (const e_ of result.errors) {\n process.stderr.write(` ${e_.message}\\n`);\n if (e_.fix) {\n process.stderr.write(` Fix: ${e_.fix}\\n`);\n }\n }\n }\n }\n console.log('');\n return domainOk;\n }\n\n // Slim mode\n if (domainOk) {\n console.log(chalk.green(`\\u2714 ${domain.name} — valid`));\n return true;\n }\n\n console.log(domain.name);\n for (const { label, result } of failed) {\n process.stderr.write(chalk.red(` \\u2716 ${label}\\n`));\n for (const e_ of result.errors) {\n process.stderr.write(` ${e_.message}\\n`);\n if (e_.fix) {\n process.stderr.write(` Fix: ${e_.fix}\\n`);\n }\n }\n }\n console.log('');\n return false;\n}\n\n// ── JSON output ───────────────────────────────────────────────────────────────\n\ninterface JsonDomainResult {\n name: string;\n ok: boolean;\n checks: { label: string; ok: boolean; errors: CheckError[] }[];\n}\n\nfunction collectDomainJson(\n domain: Domain,\n results: CheckResultWithLabel[],\n): JsonDomainResult {\n return {\n name: domain.name,\n ok: results.every((r) => r.result.ok),\n checks: results.map(({ label, result }) => ({\n label,\n ok: result.ok,\n errors: result.errors,\n })),\n };\n}\n\n// ── Build scripts domain ──────────────────────────────────────────────────────\n\nfunction buildScriptsDomain(root: string): Domain {\n const pkgPath = path.join(root, 'package.json');\n let pkg: { scripts?: Record<string, string> } = {};\n let fileExists = false;\n\n return {\n name: 'Build Scripts',\n checks: [\n {\n label: 'package.json — file exists',\n run(): CheckResult {\n fileExists = existsSync(pkgPath);\n if (!fileExists) {\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${pkgPath}`,\n fix: `Create a 'package.json' at the root of your project.`,\n },\n ],\n };\n }\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as typeof pkg;\n } catch (e) {\n fileExists = false;\n return {\n ok: false,\n errors: [\n {\n message: `Failed to parse package.json: ${e instanceof Error ? e.message : String(e)}`,\n fix: `Fix the JSON syntax in your package.json.`,\n },\n ],\n };\n }\n return { ok: true, errors: [] };\n },\n },\n {\n label: 'package.json — bundle script defined',\n run(): CheckResult {\n if (!fileExists) {\n return { ok: false, errors: [{ message: 'skipped — package.json not readable' }] };\n }\n if (typeof pkg.scripts?.bundle === 'string' && pkg.scripts.bundle.length > 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Missing 'bundle' script in package.json`,\n fix: `Add a 'bundle' script to your package.json scripts, e.g.:\\n \"bundle\": \"vite build --config src/vite.cdn.config.ts\"`,\n },\n ],\n };\n },\n },\n {\n label: 'package.json — build script defined',\n run(): CheckResult {\n if (!fileExists) {\n return { ok: false, errors: [{ message: 'skipped — package.json not readable' }] };\n }\n if (typeof pkg.scripts?.build === 'string' && pkg.scripts.build.length > 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Missing 'build' script in package.json`,\n fix: `Add a 'build' script to your package.json scripts, e.g.:\\n \"build\": \"tsc\"`,\n },\n ],\n };\n },\n },\n ],\n };\n}\n\n// ── Domain selection ──────────────────────────────────────────────────────────\n\nfunction selectDomains(root: string, filter?: DomainFilter): Domain[] {\n const all: Domain[] = [\n buildAiInstructionsDomain(root),\n buildCmsSchemaDomain(root),\n buildActionsDomain(root),\n buildScriptsDomain(root),\n ];\n if (!filter) return all;\n const map: Record<DomainFilter, string> = {\n ai: 'AI Instructions',\n cms: 'CMS Schema',\n scripts: 'Build Scripts',\n actions: 'Actions',\n };\n return all.filter((d) => d.name === map[filter]);\n}\n\n// ── Core runner ───────────────────────────────────────────────────────────────\n\nfunction runDomains(\n domains: Domain[],\n verbose: boolean,\n format: OutputFormat,\n): { ok: boolean; jsonResults?: JsonDomainResult[] } {\n let hasErrors = false;\n const jsonResults: JsonDomainResult[] = [];\n\n for (const domain of domains) {\n const results: CheckResultWithLabel[] = domain.checks.map((check) => ({\n label: check.label,\n result: check.run(),\n }));\n\n let domainOk: boolean;\n if (format === 'json') {\n const jr = collectDomainJson(domain, results);\n jsonResults.push(jr);\n domainOk = jr.ok;\n } else {\n domainOk = printDomain(domain, results, verbose);\n }\n\n if (!domainOk) hasErrors = true;\n }\n\n return { ok: !hasErrors, jsonResults };\n}\n\n// ── Programmatic API ─────────────────────────────────────────────────────────\n\n/**\n * Runs all validation domains against the given project root.\n * Prints results in slim mode and returns true if everything passes.\n */\nexport function runValidation(root: string): boolean {\n const domains = selectDomains(root);\n const { ok } = runDomains(domains, false, 'text');\n return ok;\n}\n\n// ── Watch mode ────────────────────────────────────────────────────────────────\n\nfunction startWatch(\n root: string,\n run: () => void,\n): void {\n const watchDirs = [\n path.join(root, 'src', 'configuration'),\n path.join(root, 'src', 'actions'),\n ].filter((d) => existsSync(d));\n\n if (watchDirs.length === 0) {\n error('No directories to watch found.');\n return;\n }\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n const trigger = () => {\n if (debounce) clearTimeout(debounce);\n debounce = setTimeout(() => {\n console.clear();\n info(`[${new Date().toLocaleTimeString()}] Re-validating...`);\n console.log('');\n run();\n }, 200);\n };\n\n for (const dir of watchDirs) {\n fsWatch(dir, { recursive: true }, trigger);\n }\n\n info(`Watching for changes in ${watchDirs.map((d) => path.relative(root, d)).join(', ')}...`);\n info('Press Ctrl+C to stop.');\n console.log('');\n}\n\n// ── Command ───────────────────────────────────────────────────────────────────\n\nexport const validateCommand = new Command('validate')\n .description('Validate project config files against their schemas')\n .option('--verbose', 'Show all checks, including passing ones')\n .option('--domain <domain>', 'Only validate one domain: ai, cms, actions, or scripts')\n .option('--format <format>', 'Output format: text (default) or json', 'text')\n .option('--watch', 'Re-validate on file changes (TTY only)')\n .option('--strict', 'Exit with error even on warnings')\n .option('--project <path>', 'Explicit project root (overrides cwd auto-detection)')\n .action((opts: {\n verbose?: boolean;\n domain?: string;\n format?: string;\n watch?: boolean;\n strict?: boolean;\n project?: string;\n }) => {\n const verbose = Boolean(opts.verbose);\n const format = (opts.format ?? 'text') as OutputFormat;\n const domainFilter = opts.domain as DomainFilter | undefined;\n\n const root = opts.project\n ? path.resolve(opts.project)\n : findProjectRoot(process.cwd());\n\n if (!root) {\n error(\n 'No web5.config.json found — run this command from inside a Web5 project',\n );\n process.exit(1);\n }\n\n if (format === 'text') {\n info(`Project root: ${root}`);\n console.log('');\n }\n\n const run = () => {\n const domains = selectDomains(root, domainFilter);\n const { ok, jsonResults } = runDomains(domains, verbose, format);\n\n if (format === 'json') {\n console.log(JSON.stringify({ ok, domains: jsonResults }, null, 2));\n }\n\n if (!ok && !opts.watch) {\n process.exit(1);\n }\n };\n\n run();\n\n if (opts.watch) {\n if (!process.stdout.isTTY) {\n error('--watch requires a TTY (interactive terminal).');\n process.exit(1);\n }\n startWatch(root, run);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { readCredentials } from '../auth/secretStore';
|
|
3
|
+
import { success, error, info, isJsonMode } from '../utils/print';
|
|
4
|
+
export const whoamiCommand = new Command('whoami').description('Show current authentication status and identity').action(async () => {
|
|
5
|
+
try {
|
|
6
|
+
const creds = await readCredentials();
|
|
7
|
+
if (!creds) {
|
|
8
|
+
if (isJsonMode()) {
|
|
9
|
+
console.log(JSON.stringify({
|
|
10
|
+
authenticated: false
|
|
11
|
+
}));
|
|
12
|
+
} else {
|
|
13
|
+
info('Not authenticated. Run `web5 login` to sign in.');
|
|
14
|
+
}
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const authMethod = creds.api_key ? 'api-key' : 'device-flow';
|
|
18
|
+
const siteId = creds.site_id ?? null;
|
|
19
|
+
const expiresAt = creds.expires_at ? new Date(creds.expires_at).toISOString() : null;
|
|
20
|
+
const expired = creds.expires_at ? creds.expires_at < Date.now() : false;
|
|
21
|
+
if (isJsonMode()) {
|
|
22
|
+
console.log(JSON.stringify({
|
|
23
|
+
authenticated: true,
|
|
24
|
+
authMethod,
|
|
25
|
+
siteId,
|
|
26
|
+
expiresAt,
|
|
27
|
+
expired
|
|
28
|
+
}));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
success('Authenticated');
|
|
32
|
+
info(`Method: ${authMethod}`);
|
|
33
|
+
if (siteId) {
|
|
34
|
+
info(`Site ID: ${siteId}`);
|
|
35
|
+
}
|
|
36
|
+
if (expiresAt) {
|
|
37
|
+
info(`Expires: ${expiresAt}${expired ? ' (expired)' : ''}`);
|
|
38
|
+
}
|
|
39
|
+
} catch (err_) {
|
|
40
|
+
error(err_ instanceof Error ? err_.message : String(err_));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Command","readCredentials","success","error","info","isJsonMode","whoamiCommand","description","action","creds","console","log","JSON","stringify","authenticated","authMethod","api_key","siteId","site_id","expiresAt","expires_at","Date","toISOString","expired","now","err_","Error","message","String","process","exit"],"sources":["../../../src/commands/whoami.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readCredentials } from '../auth/secretStore';\nimport { success, error, info, isJsonMode } from '../utils/print';\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current authentication status and identity')\n .action(async () => {\n try {\n const creds = await readCredentials();\n\n if (!creds) {\n if (isJsonMode()) {\n console.log(JSON.stringify({ authenticated: false }));\n } else {\n info('Not authenticated. Run `web5 login` to sign in.');\n }\n return;\n }\n\n const authMethod = creds.api_key ? 'api-key' : 'device-flow';\n const siteId = creds.site_id ?? null;\n const expiresAt = creds.expires_at\n ? new Date(creds.expires_at).toISOString()\n : null;\n const expired = creds.expires_at ? creds.expires_at < Date.now() : false;\n\n if (isJsonMode()) {\n console.log(\n JSON.stringify({ authenticated: true, authMethod, siteId, expiresAt, expired }),\n );\n return;\n }\n\n success('Authenticated');\n info(`Method: ${authMethod}`);\n if (siteId) {\n info(`Site ID: ${siteId}`);\n }\n if (expiresAt) {\n info(`Expires: ${expiresAt}${expired ? ' (expired)' : ''}`);\n }\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,eAAe,QAAQ,qBAAqB;AACrD,SAASC,OAAO,EAAEC,KAAK,EAAEC,IAAI,EAAEC,UAAU,QAAQ,gBAAgB;AAEjE,OAAO,MAAMC,aAAa,GAAG,IAAIN,OAAO,CAAC,QAAQ,CAAC,CAC/CO,WAAW,CAAC,iDAAiD,CAAC,CAC9DC,MAAM,CAAC,YAAY;EAClB,IAAI;IACF,MAAMC,KAAK,GAAG,MAAMR,eAAe,CAAC,CAAC;IAErC,IAAI,CAACQ,KAAK,EAAE;MACV,IAAIJ,UAAU,CAAC,CAAC,EAAE;QAChBK,OAAO,CAACC,GAAG,CAACC,IAAI,CAACC,SAAS,CAAC;UAAEC,aAAa,EAAE;QAAM,CAAC,CAAC,CAAC;MACvD,CAAC,MAAM;QACLV,IAAI,CAAC,iDAAiD,CAAC;MACzD;MACA;IACF;IAEA,MAAMW,UAAU,GAAGN,KAAK,CAACO,OAAO,GAAG,SAAS,GAAG,aAAa;IAC5D,MAAMC,MAAM,GAAGR,KAAK,CAACS,OAAO,IAAI,IAAI;IACpC,MAAMC,SAAS,GAAGV,KAAK,CAACW,UAAU,GAC9B,IAAIC,IAAI,CAACZ,KAAK,CAACW,UAAU,CAAC,CAACE,WAAW,CAAC,CAAC,GACxC,IAAI;IACR,MAAMC,OAAO,GAAGd,KAAK,CAACW,UAAU,GAAGX,KAAK,CAACW,UAAU,GAAGC,IAAI,CAACG,GAAG,CAAC,CAAC,GAAG,KAAK;IAExE,IAAInB,UAAU,CAAC,CAAC,EAAE;MAChBK,OAAO,CAACC,GAAG,CACTC,IAAI,CAACC,SAAS,CAAC;QAAEC,aAAa,EAAE,IAAI;QAAEC,UAAU;QAAEE,MAAM;QAAEE,SAAS;QAAEI;MAAQ,CAAC,CAChF,CAAC;MACD;IACF;IAEArB,OAAO,CAAC,eAAe,CAAC;IACxBE,IAAI,CAAC,aAAaW,UAAU,EAAE,CAAC;IAC/B,IAAIE,MAAM,EAAE;MACVb,IAAI,CAAC,aAAaa,MAAM,EAAE,CAAC;IAC7B;IACA,IAAIE,SAAS,EAAE;MACbf,IAAI,CAAC,aAAae,SAAS,GAAGI,OAAO,GAAG,aAAa,GAAG,EAAE,EAAE,CAAC;IAC/D;EACF,CAAC,CAAC,OAAOE,IAAI,EAAE;IACbtB,KAAK,CAACsB,IAAI,YAAYC,KAAK,GAAGD,IAAI,CAACE,OAAO,GAAGC,MAAM,CAACH,IAAI,CAAC,CAAC;IAC1DI,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC","ignoreList":[]}
|
package/dist/esm/utils/print.js
CHANGED
|
@@ -15,4 +15,14 @@ export function warn(msg) {
|
|
|
15
15
|
export function spinner(msg) {
|
|
16
16
|
return ora(msg).start();
|
|
17
17
|
}
|
|
18
|
+
export function step(n, total, label) {
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(chalk.bold.cyan(` Step ${n}/${total} ${label}`));
|
|
21
|
+
console.log(chalk.dim(` ${'─'.repeat(40)}`));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Returns true when the caller passed --json (or set WEB5_JSON_MODE=1). */
|
|
25
|
+
export function isJsonMode() {
|
|
26
|
+
return process.env.WEB5_JSON_MODE === '1';
|
|
27
|
+
}
|
|
18
28
|
//# sourceMappingURL=print.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["chalk","ora","success","msg","console","log","green","error","process","stderr","write","red","info","dim","warn","yellow","spinner","start"],"sources":["../../../src/utils/print.ts"],"sourcesContent":["import chalk from 'chalk';\nimport ora from 'ora';\nimport type { Ora } from 'ora';\n\nexport function success(msg: string): void {\n console.log(chalk.green(`\\u2714 ${msg}`));\n}\n\nexport function error(msg: string): void {\n process.stderr.write(chalk.red(`\\u2716 ${msg}\\n`));\n}\n\nexport function info(msg: string): void {\n console.log(chalk.dim(` ${msg}`));\n}\n\nexport function warn(msg: string): void {\n console.log(chalk.yellow(`\\u26a0 ${msg}`));\n}\n\nexport function spinner(msg: string): Ora {\n return ora(msg).start();\n}\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,GAAG,MAAM,KAAK;AAGrB,OAAO,SAASC,OAAOA,CAACC,GAAW,EAAQ;EACzCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACM,KAAK,CAAC,WAAWH,GAAG,EAAE,CAAC,CAAC;AAC5C;AAEA,OAAO,SAASI,KAAKA,CAACJ,GAAW,EAAQ;EACvCK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACV,KAAK,CAACW,GAAG,CAAC,WAAWR,GAAG,IAAI,CAAC,CAAC;AACrD;AAEA,OAAO,SAASS,IAAIA,CAACT,GAAW,EAAQ;EACtCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACa,GAAG,CAAC,MAAMV,GAAG,EAAE,CAAC,CAAC;AACrC;AAEA,OAAO,SAASW,IAAIA,CAACX,GAAW,EAAQ;EACtCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACe,MAAM,CAAC,WAAWZ,GAAG,EAAE,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASa,OAAOA,CAACb,GAAW,EAAO;EACxC,OAAOF,GAAG,CAACE,GAAG,CAAC,CAACc,KAAK,CAAC,CAAC;AACzB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["chalk","ora","success","msg","console","log","green","error","process","stderr","write","red","info","dim","warn","yellow","spinner","start","step","n","total","label","bold","cyan","repeat","isJsonMode","env","WEB5_JSON_MODE"],"sources":["../../../src/utils/print.ts"],"sourcesContent":["import chalk from 'chalk';\nimport ora from 'ora';\nimport type { Ora } from 'ora';\n\nexport function success(msg: string): void {\n console.log(chalk.green(`\\u2714 ${msg}`));\n}\n\nexport function error(msg: string): void {\n process.stderr.write(chalk.red(`\\u2716 ${msg}\\n`));\n}\n\nexport function info(msg: string): void {\n console.log(chalk.dim(` ${msg}`));\n}\n\nexport function warn(msg: string): void {\n console.log(chalk.yellow(`\\u26a0 ${msg}`));\n}\n\nexport function spinner(msg: string): Ora {\n return ora(msg).start();\n}\n\nexport function step(n: number, total: number, label: string): void {\n console.log('');\n console.log(chalk.bold.cyan(` Step ${n}/${total} ${label}`));\n console.log(chalk.dim(` ${'─'.repeat(40)}`));\n}\n\n/** Returns true when the caller passed --json (or set WEB5_JSON_MODE=1). */\nexport function isJsonMode(): boolean {\n return process.env.WEB5_JSON_MODE === '1';\n}\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,GAAG,MAAM,KAAK;AAGrB,OAAO,SAASC,OAAOA,CAACC,GAAW,EAAQ;EACzCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACM,KAAK,CAAC,WAAWH,GAAG,EAAE,CAAC,CAAC;AAC5C;AAEA,OAAO,SAASI,KAAKA,CAACJ,GAAW,EAAQ;EACvCK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACV,KAAK,CAACW,GAAG,CAAC,WAAWR,GAAG,IAAI,CAAC,CAAC;AACrD;AAEA,OAAO,SAASS,IAAIA,CAACT,GAAW,EAAQ;EACtCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACa,GAAG,CAAC,MAAMV,GAAG,EAAE,CAAC,CAAC;AACrC;AAEA,OAAO,SAASW,IAAIA,CAACX,GAAW,EAAQ;EACtCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACe,MAAM,CAAC,WAAWZ,GAAG,EAAE,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASa,OAAOA,CAACb,GAAW,EAAO;EACxC,OAAOF,GAAG,CAACE,GAAG,CAAC,CAACc,KAAK,CAAC,CAAC;AACzB;AAEA,OAAO,SAASC,IAAIA,CAACC,CAAS,EAAEC,KAAa,EAAEC,KAAa,EAAQ;EAClEjB,OAAO,CAACC,GAAG,CAAC,EAAE,CAAC;EACfD,OAAO,CAACC,GAAG,CAACL,KAAK,CAACsB,IAAI,CAACC,IAAI,CAAC,UAAUJ,CAAC,IAAIC,KAAK,KAAKC,KAAK,EAAE,CAAC,CAAC;EAC9DjB,OAAO,CAACC,GAAG,CAACL,KAAK,CAACa,GAAG,CAAC,KAAK,GAAG,CAACW,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC/C;;AAEA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAY;EACpC,OAAOjB,OAAO,CAACkB,GAAG,CAACC,cAAc,KAAK,GAAG;AAC3C","ignoreList":[]}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
+
export function readConfig(root) {
|
|
4
|
+
const configPath = path.join(root, 'web5.config.json');
|
|
5
|
+
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
6
|
+
}
|
|
7
|
+
export function writeConfig(root, config) {
|
|
8
|
+
const configPath = path.join(root, 'web5.config.json');
|
|
9
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
10
|
+
}
|
|
3
11
|
|
|
4
12
|
/**
|
|
5
13
|
* Walk up from startDir until we find a directory containing web5.config.json.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["fs","path","findProjectRoot","startDir","current","parent","dirname","existsSync"
|
|
1
|
+
{"version":3,"names":["fs","path","readConfig","root","configPath","join","JSON","parse","readFileSync","writeConfig","config","writeFileSync","stringify","findProjectRoot","startDir","current","parent","dirname","existsSync"],"sources":["../../../src/utils/project.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface Web5Config {\n $schema?: string;\n packageName?: string;\n displayName?: string;\n msid?: string;\n clientId?: string;\n [key: string]: unknown;\n}\n\nexport function readConfig(root: string): Web5Config {\n const configPath = path.join(root, 'web5.config.json');\n return JSON.parse(fs.readFileSync(configPath, 'utf8')) as Web5Config;\n}\n\nexport function writeConfig(root: string, config: Web5Config): void {\n const configPath = path.join(root, 'web5.config.json');\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\n/**\n * Walk up from startDir until we find a directory containing web5.config.json.\n * Returns that directory, or null if none found.\n */\nexport function findProjectRoot(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n if (fs.existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n current = parent;\n parent = path.dirname(current);\n }\n if (fs.existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n return null;\n}\n"],"mappings":"AAAA,OAAO,KAAKA,EAAE,MAAM,IAAI;AACxB,OAAO,KAAKC,IAAI,MAAM,MAAM;AAW5B,OAAO,SAASC,UAAUA,CAACC,IAAY,EAAc;EACnD,MAAMC,UAAU,GAAGH,IAAI,CAACI,IAAI,CAACF,IAAI,EAAE,kBAAkB,CAAC;EACtD,OAAOG,IAAI,CAACC,KAAK,CAACP,EAAE,CAACQ,YAAY,CAACJ,UAAU,EAAE,MAAM,CAAC,CAAC;AACxD;AAEA,OAAO,SAASK,WAAWA,CAACN,IAAY,EAAEO,MAAkB,EAAQ;EAClE,MAAMN,UAAU,GAAGH,IAAI,CAACI,IAAI,CAACF,IAAI,EAAE,kBAAkB,CAAC;EACtDH,EAAE,CAACW,aAAa,CAACP,UAAU,EAAEE,IAAI,CAACM,SAAS,CAACF,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC;AAC9E;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASG,eAAeA,CAACC,QAAgB,EAAiB;EAC/D,IAAIC,OAAO,GAAGD,QAAQ;EACtB,IAAIE,MAAM,GAAGf,IAAI,CAACgB,OAAO,CAACF,OAAO,CAAC;EAClC,OAAOA,OAAO,KAAKC,MAAM,EAAE;IACzB,IAAIhB,EAAE,CAACkB,UAAU,CAACjB,IAAI,CAACI,IAAI,CAACU,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE;MACzD,OAAOA,OAAO;IAChB;IACAA,OAAO,GAAGC,MAAM;IAChBA,MAAM,GAAGf,IAAI,CAACgB,OAAO,CAACF,OAAO,CAAC;EAChC;EACA,IAAIf,EAAE,CAACkB,UAAU,CAACjB,IAAI,CAACI,IAAI,CAACU,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE;IACzD,OAAOA,OAAO;EAChB;EACA,OAAO,IAAI;AACb","ignoreList":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { getToken } from '../auth';
|
|
2
|
+
const BASE_URL = 'https://www.wixapis.com';
|
|
3
|
+
export async function wixRequest(options) {
|
|
4
|
+
const {
|
|
5
|
+
path,
|
|
6
|
+
method = 'GET',
|
|
7
|
+
params,
|
|
8
|
+
body,
|
|
9
|
+
verbose = false
|
|
10
|
+
} = options;
|
|
11
|
+
const token = await getToken();
|
|
12
|
+
if (!token) {
|
|
13
|
+
throw new Error('Not authenticated. Run `web5 login` first.');
|
|
14
|
+
}
|
|
15
|
+
const url = new URL(`${BASE_URL}${path}`);
|
|
16
|
+
if (params) {
|
|
17
|
+
for (const [key, value] of Object.entries(params)) {
|
|
18
|
+
url.searchParams.set(key, value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (verbose) {
|
|
22
|
+
console.error(`[LOG] ${method} ${url.toString()}`);
|
|
23
|
+
if (body !== undefined) {
|
|
24
|
+
console.error(`[LOG] body: ${JSON.stringify(body)}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const res = await fetch(url.toString(), {
|
|
28
|
+
method,
|
|
29
|
+
headers: {
|
|
30
|
+
Authorization: `Bearer ${token}`,
|
|
31
|
+
'Content-Type': 'application/json'
|
|
32
|
+
},
|
|
33
|
+
...(body !== undefined ? {
|
|
34
|
+
body: JSON.stringify(body)
|
|
35
|
+
} : {})
|
|
36
|
+
});
|
|
37
|
+
const text = await res.text();
|
|
38
|
+
if (verbose) {
|
|
39
|
+
console.error(`[LOG] HTTP ${res.status} ${res.statusText}`);
|
|
40
|
+
console.error(`[LOG] response: ${text}`);
|
|
41
|
+
}
|
|
42
|
+
if (!text) {
|
|
43
|
+
throw new Error(`Empty response from ${method} ${path} (HTTP ${res.status})`);
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(text);
|
|
47
|
+
} catch {
|
|
48
|
+
throw new Error(`Invalid JSON from ${method} ${path} (HTTP ${res.status}): ${text.slice(0, 200)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=wixApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getToken","BASE_URL","wixRequest","options","path","method","params","body","verbose","token","Error","url","URL","key","value","Object","entries","searchParams","set","console","error","toString","undefined","JSON","stringify","res","fetch","headers","Authorization","text","status","statusText","parse","slice"],"sources":["../../../src/utils/wixApi.ts"],"sourcesContent":["import { getToken } from '../auth';\n\nconst BASE_URL = 'https://www.wixapis.com';\n\nexport interface WixRequestOptions {\n path: string;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n params?: Record<string, string>;\n body?: unknown;\n verbose?: boolean;\n}\n\nexport async function wixRequest<T = unknown>(\n options: WixRequestOptions,\n): Promise<T> {\n const { path, method = 'GET', params, body, verbose = false } = options;\n\n const token = await getToken();\n if (!token) {\n throw new Error('Not authenticated. Run `web5 login` first.');\n }\n\n const url = new URL(`${BASE_URL}${path}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n }\n\n if (verbose) {\n console.error(`[LOG] ${method} ${url.toString()}`);\n if (body !== undefined) {\n console.error(`[LOG] body: ${JSON.stringify(body)}`);\n }\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n const text = await res.text();\n\n if (verbose) {\n console.error(`[LOG] HTTP ${res.status} ${res.statusText}`);\n console.error(`[LOG] response: ${text}`);\n }\n\n if (!text) {\n throw new Error(\n `Empty response from ${method} ${path} (HTTP ${res.status})`,\n );\n }\n\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error(\n `Invalid JSON from ${method} ${path} (HTTP ${res.status}): ${text.slice(\n 0,\n 200,\n )}`,\n );\n }\n}\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,SAAS;AAElC,MAAMC,QAAQ,GAAG,yBAAyB;AAU1C,OAAO,eAAeC,UAAUA,CAC9BC,OAA0B,EACd;EACZ,MAAM;IAAEC,IAAI;IAAEC,MAAM,GAAG,KAAK;IAAEC,MAAM;IAAEC,IAAI;IAAEC,OAAO,GAAG;EAAM,CAAC,GAAGL,OAAO;EAEvE,MAAMM,KAAK,GAAG,MAAMT,QAAQ,CAAC,CAAC;EAC9B,IAAI,CAACS,KAAK,EAAE;IACV,MAAM,IAAIC,KAAK,CAAC,4CAA4C,CAAC;EAC/D;EAEA,MAAMC,GAAG,GAAG,IAAIC,GAAG,CAAC,GAAGX,QAAQ,GAAGG,IAAI,EAAE,CAAC;EACzC,IAAIE,MAAM,EAAE;IACV,KAAK,MAAM,CAACO,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACV,MAAM,CAAC,EAAE;MACjDK,GAAG,CAACM,YAAY,CAACC,GAAG,CAACL,GAAG,EAAEC,KAAK,CAAC;IAClC;EACF;EAEA,IAAIN,OAAO,EAAE;IACXW,OAAO,CAACC,KAAK,CAAC,SAASf,MAAM,IAAIM,GAAG,CAACU,QAAQ,CAAC,CAAC,EAAE,CAAC;IAClD,IAAId,IAAI,KAAKe,SAAS,EAAE;MACtBH,OAAO,CAACC,KAAK,CAAC,eAAeG,IAAI,CAACC,SAAS,CAACjB,IAAI,CAAC,EAAE,CAAC;IACtD;EACF;EAEA,MAAMkB,GAAG,GAAG,MAAMC,KAAK,CAACf,GAAG,CAACU,QAAQ,CAAC,CAAC,EAAE;IACtChB,MAAM;IACNsB,OAAO,EAAE;MACPC,aAAa,EAAE,UAAUnB,KAAK,EAAE;MAChC,cAAc,EAAE;IAClB,CAAC;IACD,IAAIF,IAAI,KAAKe,SAAS,GAAG;MAAEf,IAAI,EAAEgB,IAAI,CAACC,SAAS,CAACjB,IAAI;IAAE,CAAC,GAAG,CAAC,CAAC;EAC9D,CAAC,CAAC;EAEF,MAAMsB,IAAI,GAAG,MAAMJ,GAAG,CAACI,IAAI,CAAC,CAAC;EAE7B,IAAIrB,OAAO,EAAE;IACXW,OAAO,CAACC,KAAK,CAAC,cAAcK,GAAG,CAACK,MAAM,IAAIL,GAAG,CAACM,UAAU,EAAE,CAAC;IAC3DZ,OAAO,CAACC,KAAK,CAAC,mBAAmBS,IAAI,EAAE,CAAC;EAC1C;EAEA,IAAI,CAACA,IAAI,EAAE;IACT,MAAM,IAAInB,KAAK,CACb,uBAAuBL,MAAM,IAAID,IAAI,UAAUqB,GAAG,CAACK,MAAM,GAC3D,CAAC;EACH;EAEA,IAAI;IACF,OAAOP,IAAI,CAACS,KAAK,CAACH,IAAI,CAAC;EACzB,CAAC,CAAC,MAAM;IACN,MAAM,IAAInB,KAAK,CACb,qBAAqBL,MAAM,IAAID,IAAI,UAAUqB,GAAG,CAACK,MAAM,MAAMD,IAAI,CAACI,KAAK,CACrE,CAAC,EACD,GACF,CAAC,EACH,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -4,5 +4,7 @@ export interface TokenResponse {
|
|
|
4
4
|
expires_in: number;
|
|
5
5
|
refresh_token: string;
|
|
6
6
|
}
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function promptForSiteId(): Promise<string | null>;
|
|
8
|
+
export declare function refreshAccessToken(refreshToken: string, siteId?: string): Promise<TokenResponse>;
|
|
9
|
+
export declare function runDeviceFlow(verbose?: boolean, noBrowser?: boolean): Promise<TokenResponse>;
|
|
8
10
|
//# sourceMappingURL=deviceFlow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceFlow.d.ts","sourceRoot":"","sources":["../../../src/auth/deviceFlow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deviceFlow.d.ts","sourceRoot":"","sources":["../../../src/auth/deviceFlow.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AA+ED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiB9D;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CA2CxB;AAeD,wBAAsB,aAAa,CACjC,OAAO,UAAQ,EACf,SAAS,UAAQ,GAChB,OAAO,CAAC,aAAa,CAAC,CA4BxB"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export type { Credentials } from './secretStore';
|
|
2
|
-
export declare function login(apiKey?: string
|
|
2
|
+
export declare function login(apiKey?: string, verbose?: boolean, opts?: {
|
|
3
|
+
siteId?: string;
|
|
4
|
+
noBrowser?: boolean;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
export declare function switchSite(siteId: string): Promise<void>;
|
|
3
7
|
export declare function logout(): Promise<void>;
|
|
4
8
|
export declare function getToken(): Promise<string | null>;
|
|
5
9
|
export declare function isAuthenticated(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAYA,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAqBjD,wBAAsB,KAAK,CACzB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,UAAQ,EACf,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAClD,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9D;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAG5C;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCvD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAMxD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secretStore.d.ts","sourceRoot":"","sources":["../../../src/auth/secretStore.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqDD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwBnE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAatD"}
|
|
1
|
+
{"version":3,"file":"secretStore.d.ts","sourceRoot":"","sources":["../../../src/auth/secretStore.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqDD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwBnE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAatD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface BundleOptions {
|
|
3
|
+
watch?: boolean;
|
|
4
|
+
minify?: boolean;
|
|
5
|
+
outDir?: string;
|
|
6
|
+
sourcemap?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function runBundle(root: string, opts?: BundleOptions): Promise<void>;
|
|
9
|
+
export declare const bundleCommand: Command;
|
|
10
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../../src/commands/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkErF;AAED,eAAO,MAAM,aAAa,SAyBtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/commands/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6DpC,eAAO,MAAM,mBAAmB,SAEX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversationWizard.d.ts","sourceRoot":"","sources":["../../../src/commands/conversationWizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgoBpC,eAAO,MAAM,oBAAoB,SASX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0MpC,eAAO,MAAM,aAAa,SAqCE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../../src/commands/embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqGpC,eAAO,MAAM,YAAY,SA2CrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getClientId.d.ts","sourceRoot":"","sources":["../../../src/commands/getClientId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,kBAAkB,SAiD3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsGpC,eAAO,MAAM,WAAW,SAuLpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../../src/commands/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmZpC,eAAO,MAAM,mBAAmB,SAYN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6DpC,eAAO,MAAM,YAAY,SAmBG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAStB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DpC,eAAO,MAAM,YAAY,SAuFrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storybook.d.ts","sourceRoot":"","sources":["../../../src/commands/storybook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,gBAAgB,SA8FzB,CAAC"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Runs all validation domains against the given project root.
|
|
4
|
+
* Prints results in slim mode and returns true if everything passes.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runValidation(root: string): boolean;
|
|
2
7
|
export declare const validateCommand: Command;
|
|
3
8
|
//# sourceMappingURL=validate.d.ts.map
|