@woodsportal/hubspot-kit 1.0.41-dev.0 → 1.0.41-dev.2

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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/program.ts","../src/lib/config.ts","../src/lib/config-files.ts","../src/schema/woodsportal-hs.ts","../src/lib/paths.ts","../src/lib/logger.ts","../src/lib/wphs-baseline.ts","../src/cli/commands/doctor.ts","../src/lib/cli-spinner.ts","../src/lib/hubspot-cli-setup.ts","../src/lib/template-dev-deps.ts","../src/lib/hubspot-fields-json.ts","../src/lib/developer-slug.ts","../src/lib/module-build-id.ts","../src/lib/upload-only-module.ts","../src/vite/resolve-dev-config.ts","../src/lib/node-loader-interop.ts","../src/cli/commands/config-validate.ts","../src/cli/commands/build.ts","../src/lib/cli-banner.ts","../src/lib/kit-version.ts","../src/lib/build-tier.ts","../src/cli/commands/dev.ts","../src/cli/commands/deploy.ts","../src/lib/project-env-files.ts","../src/cli/commands/upload.ts","../src/cli/commands/publish.ts","../src/cli/commands/audit.ts","../src/cli/commands/init.ts","../src/lib/init-router-scaffold.ts","../src/lib/cdn-github-setup.ts","../src/lib/project-setup.ts","../src/lib/template-scripts.ts","../src/lib/project-name.ts","../src/cli/commands/migrate.ts","../src/cli/commands/examples.ts","../src/cli/commands/fields.ts","../src/cli/commands/regression.ts","../src/cli/commands/setup.ts","../src/cli/commands/portal.ts","../src/lib/hubspot-portals.ts","../src/cli/commands/watch.ts","../src/cli/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Command } from 'commander'\n\nimport { loadConfig } from '../lib/config.js'\nimport { createLogger } from '../lib/logger.js'\nimport { findProjectRoot, getKitRoot } from '../lib/paths.js'\nimport { defaultBaselineDir } from '../lib/wphs-baseline.js'\nimport { isWpHsError, ExitCode } from '../lib/errors.js'\nimport type { GlobalCliOptions, CommandContext } from './context.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { runConfigValidate } from './commands/config-validate.js'\nimport { runBuild } from './commands/build.js'\nimport { runDev } from './commands/dev.js'\nimport { runDeploy } from './commands/deploy.js'\nimport { runPublish } from './commands/publish.js'\nimport {\n runAuditBaselineCapture,\n runAuditParity,\n runAuditSecrets,\n runAuditShipBundle,\n} from './commands/audit.js'\nimport { runInit } from './commands/init.js'\nimport { runMigrate } from './commands/migrate.js'\nimport { runExamplesList, runExamplesSmoke } from './commands/examples.js'\nimport { runFieldsSync } from './commands/fields.js'\nimport { runRegressionSmoke } from './commands/regression.js'\nimport { runSetup } from './commands/setup.js'\nimport { runPortalList, runPortalUse } from './commands/portal.js'\nimport { runUpload } from './commands/upload.js'\nimport { runWatch } from './commands/watch.js'\nimport { DEFAULT_BUILD_TIER, parseBuildTier } from '../lib/build-tier.js'\nimport { DEFAULT_WOODSPORTAL_HS } from '../schema/woodsportal-hs.js'\n\ntype InitTemplate = 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\n\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(resolve(getKitRoot(), 'package.json'), 'utf8')) as {\n version?: string\n }\n return pkg.version ?? '0.0.0'\n } catch {\n return '0.0.0'\n }\n}\n\nfunction buildContext(global: GlobalCliOptions): CommandContext {\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n\n const projectRoot = global.project ?? findProjectRoot()\n const { config } = loadConfig(projectRoot)\n\n return { projectRoot, config, logger, global }\n}\n\nfunction attachGlobals(command: Command): void {\n command\n .option('--project <path>', 'Project root (woodscli.json)')\n .option('--ci', 'Non-interactive CI mode', false)\n .option('--json', 'Machine-readable JSON output', false)\n .option('--verbose', 'Step-by-step logs and child-process output (disables spinners)', false)\n .option('--quiet', 'Errors only', false)\n .option('--dry-run', 'Print planned actions without executing', false)\n .option('-y, --yes', 'Assume yes (non-interactive)', false)\n .option('--no-bump', 'Do not auto-increment module build id before CDN build', false)\n}\n\nasync function handle(fn: () => Promise<number>): Promise<void> {\n try {\n const code = await fn()\n process.exit(code)\n } catch (error) {\n if (isWpHsError(error)) {\n process.stderr.write(`Error: ${error.message}\\n`)\n if (error.remediation) {\n process.stderr.write(`→ ${error.remediation}\\n`)\n }\n process.exit(error.exitCode)\n }\n process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(ExitCode.INTERNAL)\n }\n}\n\nexport function createProgram(): Command {\n const program = new Command()\n .name('wp')\n .description('WoodsCLI — HubSpot CMS dev kit by WoodsPortal (modules + themes)')\n .version(readVersion())\n .addHelpText('after', '\\nWoodsCLI · WoodsPortal HubSpot CLI · npm @woodsportal/hubspot-kit')\n\n attachGlobals(program)\n\n program\n .command('doctor')\n .description('Check prerequisites (Node, HubSpot CLI, .wphs workspace, config)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDoctor(buildContext(global)))\n })\n\n program\n .command('setup')\n .description('Copy missing hubspot.config.yml, .env.*, CDN config, and vite shims from kit templates')\n .option('--tier <tier>', 'dev | stg | prod — copy only this .env file (default: all env.tiers)')\n .action(async (opts: { tier?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runSetup(buildContext(global), {\n tier: opts.tier ? parseBuildTier(opts.tier) : undefined,\n }),\n )\n })\n\n const configCmd = program.command('config').description('Project configuration')\n\n configCmd\n .command('validate')\n .description('Validate woodscli.json')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runConfigValidate(buildContext(global)))\n })\n\n program\n .command('init')\n .description('Scaffold a new module or theme project')\n .option('-t, --template <type>', 'module-hybrid-cdn | module-monolith | theme-starter')\n .option('-n, --name <slug>', 'Project name (creates ./<name>/ under cwd)')\n .option('-d, --directory <path>', 'Full target directory (skips name → folder prompt)')\n .option('--router <mode>', 'hash (client-frontend default) | browser | none — modules only')\n .option(\n '--cdn-github <org/repo>',\n 'Public GitHub CDN mirror repo (hybrid CDN; use with --ci / -y)',\n )\n .action(\n async (opts: {\n template?: string\n name?: string\n directory?: string\n router?: string\n cdnGithub?: string\n }) => {\n const global = program.opts<GlobalCliOptions>()\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n const ctx: CommandContext = {\n projectRoot: process.cwd(),\n config: DEFAULT_WOODSPORTAL_HS,\n logger,\n global,\n }\n const routerMode =\n opts.router === 'browser' || opts.router === 'none' || opts.router === 'hash'\n ? opts.router\n : undefined\n\n await handle(() =>\n runInit(ctx, {\n template: opts.template as InitTemplate | undefined,\n name: opts.name,\n directory: opts.directory,\n router: routerMode,\n cdnGithub: opts.cdnGithub,\n }),\n )\n })\n\n program\n .command('migrate')\n .description('Migrate legacy .dev/ or .wp-hs-baseline/ to .wphs/')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runMigrate(buildContext(global)))\n })\n\n program\n .command('dev')\n .alias('local')\n .description('Start local development server (Vite HMR + CMS dev tool)')\n .option('-p, --port <port>', 'Port', '3000')\n .action(async (opts: { port: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDev(buildContext(global), { port: Number(opts.port) }))\n })\n\n program\n .command('build')\n .description('Build CDN + HubSpot module (or theme no-op)')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--cdn-only', 'CDN chunks only')\n .option('--hubspot-only', 'HubSpot module only')\n .option('--cdn-esm', 'Build CDN via ESM preset')\n .action(\n async (opts: {\n tier: string\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runBuild(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n cdnOnly: opts.cdnOnly,\n hubspotOnly: opts.hubspotOnly,\n cdnEsm: opts.cdnEsm,\n }),\n )\n },\n )\n\n program\n .command('deploy')\n .description('Build, publish CDN, upload HubSpot module')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--skip-publish', 'Skip CDN publish')\n .option('--skip-upload', 'Skip HubSpot cms upload (e.g. CodeBuild module-git push)')\n .action(async (opts: { tier: string; skipPublish?: boolean; skipUpload?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runDeploy(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n skipPublish: opts.skipPublish,\n skipUpload: opts.skipUpload,\n }),\n )\n })\n\n program\n .command('publish')\n .description('Publish CDN artifacts to jsDelivr mirror')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--dry-run', 'Print publish plan without pushing')\n .action(async (opts: { tier: string; dryRun?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runPublish(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n dryRun: opts.dryRun,\n }),\n )\n })\n\n const audit = program.command('audit').description('Build audits')\n\n audit\n .command('ship-bundle')\n .description('Fail if dev tooling appears in dist artifacts')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditShipBundle(buildContext(global)))\n })\n\n audit\n .command('parity')\n .description('Compare dist output to baseline snapshot')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditParity(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('baseline')\n .description('Capture dist output as parity baseline')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditBaselineCapture(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('secrets')\n .description('Scan source for hardcoded secrets / PAT patterns')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditSecrets(buildContext(global)))\n })\n\n const fields = program.command('fields').description('Module fields.json utilities')\n\n fields\n .command('sync')\n .description('Pull/push fields.json vs local cache')\n .option('--direction <dir>', 'pull | push', 'pull')\n .action(async (opts: { direction: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const direction = opts.direction === 'push' ? 'push' : 'pull'\n await handle(() => runFieldsSync(buildContext(global), { direction }))\n })\n\n const examples = program.command('examples').description('Examples smoke matrix')\n\n examples\n .command('list')\n .description('List scenarios from examples/manifest.json')\n .option('--track <track>', 'module | theme')\n .option('--setup <setup>', 'greenfield | existing | adopted')\n .action(async (opts: { track?: string; setup?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runExamplesList(buildContext(global), {\n track: opts.track as 'module' | 'theme' | undefined,\n setup: opts.setup as 'greenfield' | 'existing' | 'adopted' | undefined,\n }),\n )\n })\n\n examples\n .command('smoke')\n .description('Run static/live smoke checks for example scenarios')\n .option('--scenario <id>', 'Single scenario id')\n .option('--tier <tier>', 'static | live', 'static')\n .action(async (opts: { scenario?: string; tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = opts.tier === 'live' ? 'live' : 'static'\n await handle(() =>\n runExamplesSmoke(buildContext(global), { scenario: opts.scenario, tier }),\n )\n })\n\n const regression = program.command('regression').description('Compatibility regression checks')\n\n regression\n .command('smoke')\n .description('Doctor + config validate + consumer boundary checks')\n .option('--skip-doctor', 'Skip prerequisite doctor check')\n .action(async (opts: { skipDoctor?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runRegressionSmoke(buildContext(global), { skipDoctor: opts.skipDoctor }),\n )\n })\n\n program\n .command('watch')\n .description('Watch HubSpot module or theme folder and re-upload on change')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--rebuild', 'Rebuild module before watch')\n .action(async (opts: { tier: string; rebuild?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = parseBuildTier(opts.tier)\n await handle(() =>\n runWatch(buildContext(global), {\n tier: tier === 'prod' ? 'prod' : tier === 'stg' ? 'stg' : 'dev',\n rebuild: opts.rebuild,\n }),\n )\n })\n\n program\n .command('upload')\n .description('Upload built HubSpot module or theme (hs cms upload)')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .action(async (opts: { tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runUpload(buildContext(global), { tier: parseBuildTier(opts.tier) }),\n )\n })\n\n program\n .command('auth')\n .description('Authenticate HubSpot CLI (hs auth)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const { runCommand } = await import('../lib/exec.js')\n runCommand('hs', ['auth'], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n process.exit(ExitCode.SUCCESS)\n })\n\n const portal = program.command('portal').description('HubSpot default portal selection')\n\n portal\n .command('list')\n .alias('ls')\n .description('List portals from hubspot.config.yml')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runPortalList(buildContext(global)))\n })\n\n portal\n .command('use [name]')\n .description('Set defaultPortal (hs accounts use)')\n .action(async (name?: string) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runPortalUse(buildContext(global), { name }))\n })\n\n return program\n}\n","import { readFileSync } from 'node:fs'\n\nimport {\n resolveProjectConfig,\n WOODSCLI_CONFIG_FILE,\n} from './config-files.js'\nimport { WoodsPortalHsSchema, type WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WpHsError, ExitCode } from './errors.js'\nimport { findProjectRoot } from './paths.js'\n\nexport type LoadedProjectConfig = {\n root: string\n config: WoodsPortalHsConfig\n configPath: string\n configFileName: string\n}\n\nexport function loadConfig(projectRoot?: string): LoadedProjectConfig {\n const root = projectRoot ?? findProjectRoot()\n const resolved = resolveProjectConfig(root)\n\n if (!resolved) {\n throw new WpHsError(`Missing ${WOODSCLI_CONFIG_FILE}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init. Legacy woodsportal.hs.json → run wp migrate --yes.',\n })\n }\n\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(resolved.path, 'utf8'))\n } catch (cause) {\n throw new WpHsError(`Invalid JSON in ${resolved.fileName}`, {\n exitCode: ExitCode.USER_ERROR,\n cause,\n })\n }\n\n const parsed = WoodsPortalHsSchema.safeParse(raw)\n if (!parsed.success) {\n throw new WpHsError(`${resolved.fileName} validation failed: ${parsed.error.message}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp config validate for details.',\n })\n }\n\n return {\n root,\n config: parsed.data,\n configPath: resolved.path,\n configFileName: resolved.fileName,\n }\n}\n\nexport function validateConfigFile(projectRoot?: string): {\n valid: boolean\n errors: string[]\n config?: WoodsPortalHsConfig\n} {\n try {\n const { config } = loadConfig(projectRoot)\n return { valid: true, errors: [], config }\n } catch (error) {\n if (error instanceof WpHsError) {\n return { valid: false, errors: [error.message] }\n }\n return { valid: false, errors: [String(error)] }\n }\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** Canonical WoodsCLI project config — the only supported filename. */\nexport const WOODSCLI_CONFIG_FILE = 'woodscli.json'\n\n/** Removed in v1.0.2+ — detected only for migrate/doctor messaging. */\nexport const LEGACY_WOODSPORTAL_HS_FILE = 'woodsportal.hs.json'\n\nexport type ResolvedProjectConfig = {\n path: string\n fileName: typeof WOODSCLI_CONFIG_FILE\n}\n\nfunction envConfigPath(projectRoot: string): string | null {\n const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null\n if (!fromEnv) return null\n return resolve(projectRoot, fromEnv)\n}\n\nexport function legacyConfigPath(projectRoot: string): string {\n return resolve(projectRoot, LEGACY_WOODSPORTAL_HS_FILE)\n}\n\nexport function woodscliConfigPath(projectRoot: string): string {\n return resolve(projectRoot, WOODSCLI_CONFIG_FILE)\n}\n\n/** @returns null | 'legacy-only' | 'duplicate' */\nexport function legacyConfigConflict(projectRoot: string): 'legacy-only' | 'duplicate' | null {\n const hasWoodscli = existsSync(woodscliConfigPath(projectRoot))\n const hasLegacy = existsSync(legacyConfigPath(projectRoot))\n if (hasLegacy && hasWoodscli) return 'duplicate'\n if (hasLegacy && !hasWoodscli) return 'legacy-only'\n return null\n}\n\n/**\n * Resolve the active project config file (`woodscli.json` only).\n */\nexport function resolveProjectConfig(projectRoot: string): ResolvedProjectConfig | null {\n const envPath = envConfigPath(projectRoot)\n if (envPath) {\n if (!existsSync(envPath)) return null\n return { path: envPath, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n const path = woodscliConfigPath(projectRoot)\n if (existsSync(path)) {\n return { path, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n return null\n}\n\nexport function findProjectRoot(from = process.cwd()): string | null {\n if (process.env.WP_HS_PROJECT_ROOT?.trim()) {\n return resolve(process.env.WP_HS_PROJECT_ROOT.trim())\n }\n\n let dir = resolve(from)\n while (true) {\n if (resolveProjectConfig(dir)) {\n return dir\n }\n const parent = resolve(dir, '..')\n if (parent === dir) {\n return null\n }\n dir = parent\n }\n}\n","import { z } from 'zod'\n\nexport const CONFIG_VERSION = 1\n\nexport const WPHS_WORKSPACE_DIR = '.wphs' as const\n\nexport const WoodsPortalHsSchema = z.object({\n configVersion: z.number().int().default(CONFIG_VERSION),\n projectType: z.enum(['module-hybrid-cdn', 'module-monolith', 'theme-starter']),\n module: z.object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n outDir: z.string().default('dist/WoodsPortal.Module'),\n }),\n theme: z\n .object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n srcDir: z.string().default('src/theme'),\n themeJson: z.string().default('src/theme/theme.json'),\n })\n .optional(),\n cdn: z\n .object({\n mode: z.enum(['jsdelivr', 'custom', 'local', 'none']).default('jsdelivr'),\n buildIdFile: z.string().default('.module-build-id'),\n mirror: z.string().default('portal.cdn.json'),\n })\n .default({}),\n entries: z\n .object({\n app: z.string().default('src/cdn/app-entry.ts'),\n vendor: z.string().default('src/cdn/vendor-entry.ts'),\n hubspotBootstrap: z.string().default('src/hubspot/bootstrap.ts'),\n /** Monolith production IIFE entry (wp build --hubspot-only) */\n module: z.string().default('src/hubspot/module-entry.tsx'),\n localDev: z.string().default('src/main.tsx'),\n })\n .default({}),\n env: z\n .object({\n tiers: z.array(z.enum(['dev', 'stg', 'prod'])).default(['dev', 'stg', 'prod']),\n })\n .default({}),\n dev: z\n .object({\n moduleConfigDir: z.literal(WPHS_WORKSPACE_DIR).default(WPHS_WORKSPACE_DIR),\n adapter: z.string().default('./wphs.adapter.ts'),\n fieldsJson: z.string().default('public/fields.json'),\n themeFieldsJson: z.string().optional(),\n })\n .default({}),\n scaffold: z\n .object({\n /** hash = woodsportal-client-frontend (HubSpot CMS); browser = local clean URLs; none = single page */\n router: z.enum(['hash', 'browser', 'none']).default('hash'),\n })\n .optional(),\n})\n\nexport type WoodsPortalHsConfig = z.infer<typeof WoodsPortalHsSchema>\n\nexport const DEFAULT_WOODSPORTAL_HS: WoodsPortalHsConfig = {\n configVersion: CONFIG_VERSION,\n projectType: 'module-hybrid-cdn',\n module: {\n name: 'woodsportal-module',\n uploadPath: 'dw-modules/woodsportal-module.module',\n outDir: 'dist/WoodsPortal.Module',\n },\n cdn: {\n mode: 'jsdelivr',\n buildIdFile: '.module-build-id',\n mirror: 'portal.cdn.json',\n },\n entries: {\n app: 'src/cdn/app-entry.ts',\n vendor: 'src/cdn/vendor-entry.ts',\n hubspotBootstrap: 'src/hubspot/bootstrap.ts',\n module: 'src/hubspot/module-entry.tsx',\n localDev: 'src/main.tsx',\n },\n env: {\n tiers: ['dev', 'stg', 'prod'],\n },\n dev: {\n moduleConfigDir: WPHS_WORKSPACE_DIR,\n adapter: './wphs.adapter.ts',\n fieldsJson: 'public/fields.json',\n },\n}\n\nexport function isModuleProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' || config.projectType === 'module-monolith'\n}\n\nexport function isThemeProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'theme-starter'\n}\n\nexport function usesCdnPipeline(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' && config.cdn.mode !== 'none'\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { findProjectRoot as findConfigProjectRoot } from './config-files.js'\nimport { WpHsError, ExitCode } from './errors.js'\n\nconst KIT_PACKAGE_NAME = '@woodsportal/hubspot-kit'\n\nfunction resolveKitRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n while (true) {\n const pkgPath = resolve(dir, 'package.json')\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { name?: string }\n if (pkg.name === KIT_PACKAGE_NAME) {\n return dir\n }\n } catch {\n // keep walking\n }\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n\n throw new WpHsError('Could not resolve @woodsportal/hubspot-kit package root.', {\n exitCode: ExitCode.INTERNAL,\n })\n}\n\nconst kitRoot = resolveKitRoot()\n\nexport function getKitRoot(): string {\n return kitRoot\n}\n\nexport function findProjectRoot(from = process.cwd()): string {\n const resolved = findConfigProjectRoot(from)\n\n if (!resolved) {\n throw new WpHsError('Could not find woodscli.json in this directory or any parent.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init, or pass --project <path>. Legacy config: wp migrate --yes.',\n })\n }\n return resolved\n}\n\nexport function kitPath(...segments: string[]): string {\n return resolve(kitRoot, ...segments)\n}\n\nexport { resolveProjectConfig, WOODSCLI_CONFIG_FILE, LEGACY_WOODSPORTAL_HS_FILE } from './config-files.js'\n","import pc from 'picocolors'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport type LoggerOptions = {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n ci?: boolean\n}\n\nexport type Logger = {\n debug: (message: string) => void\n info: (message: string) => void\n warn: (message: string) => void\n error: (message: string) => void\n success: (message: string) => void\n step: (message: string) => void\n stepDone: (message: string) => void\n json: (payload: Record<string, unknown>) => void\n}\n\nfunction shouldUseColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false\n if (process.env.CI === 'true') return false\n return process.stderr.isTTY === true\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const useColor = shouldUseColor()\n const { verbose = false, quiet = false, json = false } = options\n\n const write = (line: string) => {\n process.stderr.write(`${line}\\n`)\n }\n\n const emit = (level: LogLevel, message: string) => {\n if (json) return\n if (quiet && level !== 'error' && level !== 'warn') return\n if (level === 'debug' && !verbose) return\n\n const prefix =\n level === 'error'\n ? useColor\n ? pc.red('error')\n : 'error'\n : level === 'warn'\n ? useColor\n ? pc.yellow('warn')\n : 'warn'\n : level === 'debug'\n ? useColor\n ? pc.dim('debug')\n : 'debug'\n : useColor\n ? pc.cyan('info')\n : 'info'\n\n write(`[${prefix}] ${message}`)\n }\n\n return {\n debug: (message) => emit('debug', message),\n info: (message) => emit('info', message),\n warn: (message) => emit('warn', message),\n error: (message) => emit('error', message),\n success: (message) => {\n if (json || quiet) return\n const prefix = useColor ? pc.green('ok') : 'ok'\n write(`[${prefix}] ${message}`)\n },\n step: (message) => {\n if (json || quiet) return\n const bullet = useColor ? pc.cyan('→') : '→'\n write(`${bullet} ${message}`)\n },\n stepDone: (message) => {\n if (json || quiet) return\n const mark = useColor ? pc.green('✓') : '✓'\n write(` ${mark} ${message}`)\n },\n json: (payload) => {\n if (!json) return\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n },\n }\n}\n","import { resolve } from 'node:path'\n\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WPHS_WORKSPACE_DIR } from '../schema/woodsportal-hs.js'\n\n/** Default parity baseline directory under `.wphs/audit/baseline`. */\nexport function defaultBaselineDir(projectRoot: string, config: WoodsPortalHsConfig): string {\n const workspace = config.dev.moduleConfigDir ?? WPHS_WORKSPACE_DIR\n return resolve(projectRoot, workspace, 'audit', 'baseline')\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { loadConfig } from '../../lib/config.js'\nimport {\n legacyConfigConflict,\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { isInteractiveCli, printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { doctorHubSpotChecks } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { MODULE_CONFIG_UI_DEPS } from '../../lib/template-dev-deps.js'\nimport { validateHubSpotFieldsJson } from '../../lib/hubspot-fields-json.js'\nimport { readDeveloperSlug } from '../../lib/developer-slug.js'\nimport { resolveModuleBuildIdMetaForCli } from '../../lib/module-build-id.js'\nimport { isUploadOnlyPreexistingProject } from '../../lib/upload-only-module.js'\nimport { isThemeProject, usesCdnPipeline, WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport { isProjectViteInstalled } from '../../vite/resolve-dev-config.js'\nimport { nodeLoaderInteropWarning } from '../../lib/node-loader-interop.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DoctorCheck = {\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'error' | 'warn'\n}\n\nfunction checkNode(): DoctorCheck {\n const major = Number(process.versions.node.split('.')[0])\n const ok = major >= 20\n return {\n name: 'node',\n ok,\n message: ok ? `Node ${process.versions.node}` : `Node ${process.versions.node} (need >= 20)`,\n remediation: ok ? undefined : 'Install Node 24 LTS (recommended) or Node 20 LTS.',\n severity: 'error',\n }\n}\n\nfunction checkLegacyConfig(projectRoot: string): DoctorCheck | null {\n const conflict = legacyConfigConflict(projectRoot)\n if (conflict === 'legacy-only') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Legacy ${LEGACY_WOODSPORTAL_HS_FILE} — ${WOODSCLI_CONFIG_FILE} is required`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n }\n }\n if (conflict === 'duplicate') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Both ${WOODSCLI_CONFIG_FILE} and ${LEGACY_WOODSPORTAL_HS_FILE} present`,\n remediation: 'Run wp migrate --yes to remove the legacy file',\n severity: 'error',\n }\n }\n return null\n}\n\nfunction checkConfig(ctx: CommandContext): DoctorCheck[] {\n const legacy = checkLegacyConfig(ctx.projectRoot)\n if (legacy) {\n return [legacy]\n }\n\n try {\n const loaded = loadConfig(ctx.projectRoot)\n return [\n {\n name: 'config',\n ok: true,\n message: `${loaded.configFileName} valid`,\n severity: 'error',\n },\n ]\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n name: 'config',\n ok: false,\n message,\n remediation: 'Run wp config validate',\n severity: 'error',\n },\n ]\n }\n}\n\nfunction envFileForTier(tier: string): string {\n if (tier === 'dev') return '.env.dev'\n if (tier === 'stg') return '.env.stg'\n return '.env.prod'\n}\n\nfunction readEnvFileValue(projectRoot: string, file: string, key: string): string | undefined {\n const path = resolve(projectRoot, file)\n if (!existsSync(path)) return undefined\n try {\n const content = readFileSync(path, 'utf8')\n const match = content.match(new RegExp(`^${key}=(.*)$`, 'm'))\n return match?.[1]?.trim()\n } catch {\n return undefined\n }\n}\n\nfunction checkEnvFiles(ctx: CommandContext): DoctorCheck[] {\n const checks: DoctorCheck[] = []\n\n const localPath = resolve(ctx.projectRoot, '.env.local')\n const localOk = existsSync(localPath)\n checks.push({\n name: 'env-local',\n ok: localOk,\n message: localOk ? '.env.local present' : '.env.local missing (required for yarn local / wp local)',\n remediation: localOk ? undefined : 'wp setup or copy .env.local.example → .env.local',\n severity: 'warn',\n })\n\n const legacyLocalDev = resolve(ctx.projectRoot, '.env.dev')\n if (!localOk && existsSync(legacyLocalDev)) {\n const nodeEnv = readEnvFileValue(ctx.projectRoot, '.env.dev', 'VITE_NODE_ENV')\n const hasDevMode = readEnvFileValue(ctx.projectRoot, '.env.dev', 'VITE_DEV_MODE') != null\n const looksLikeLocal =\n hasDevMode || nodeEnv === 'local' || nodeEnv == null || nodeEnv === 'development'\n if (looksLikeLocal) {\n checks.push({\n name: 'env-local-migration',\n ok: false,\n message:\n '.env.dev looks like old localhost config — rename to .env.local and add VITE_NODE_ENV=local',\n remediation: 'mv .env.dev .env.local (then create .env.dev from .env.dev.example for deploy:dev)',\n severity: 'warn',\n })\n }\n }\n\n for (const tier of ctx.config.env.tiers) {\n const file = envFileForTier(tier)\n const ok = existsSync(resolve(ctx.projectRoot, file))\n if (tier === 'stg') {\n checks.push({\n name: 'env-stg',\n ok: true,\n message: ok\n ? '.env.stg present'\n : '.env.stg missing (optional — reserved for future staging)',\n remediation: ok ? undefined : 'Create from .env.stg.example when a staging API exists',\n severity: 'warn',\n })\n continue\n }\n checks.push({\n name: `env-${tier}`,\n ok,\n message: ok ? `${file} present` : `${file} missing`,\n remediation: ok ? undefined : 'wp setup (copies from .example templates)',\n severity: 'warn',\n })\n }\n\n return checks\n}\n\nfunction checkLegacyBuildIdFile(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n const legacy = resolve(ctx.projectRoot, '.portal-build-id')\n if (!existsSync(legacy)) return null\n return {\n name: 'legacy-build-id',\n ok: false,\n message: 'Legacy .portal-build-id present — use .module-build-id',\n remediation: 'Run wp migrate --yes',\n severity: 'warn',\n }\n}\n\nfunction checkBuildId(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n const file = resolve(ctx.projectRoot, ctx.config.cdn.buildIdFile)\n const ok = existsSync(file)\n return {\n name: 'build-id',\n ok,\n message: ok ? `${ctx.config.cdn.buildIdFile} present` : `${ctx.config.cdn.buildIdFile} missing`,\n remediation: ok ? undefined : 'wp setup (creates channel baseline e.g. v0.0.1-dev)',\n severity: 'warn',\n }\n}\n\nfunction checkModuleBuildIdResolved(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n try {\n const meta = resolveModuleBuildIdMetaForCli(ctx.projectRoot, process.env)\n const detail =\n meta.source === 'state'\n ? `${meta.id} (state: ${meta.slug} #${meta.seq})`\n : `${meta.id} (source: ${meta.source})`\n return {\n name: 'module-build-id',\n ok: true,\n message: `Effective module build id: ${detail}`,\n severity: 'warn',\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'module-build-id',\n ok: false,\n message: `Could not resolve module build id — ${message}`,\n remediation: 'Run wp setup and set a CDN dev slug (or PORTAL_CDN_DEV_SLUG)',\n severity: 'warn',\n }\n }\n}\n\nfunction checkDevSlug(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n if (process.env.PORTAL_BUILD_ID?.trim() || process.env.MODULE_BUILD_ID?.trim()) {\n return null\n }\n\n const slug = readDeveloperSlug(ctx.projectRoot)\n if (slug) {\n return {\n name: 'cdn-dev-slug',\n ok: true,\n message: `CDN dev slug: ${slug}`,\n severity: 'warn',\n }\n }\n\n return {\n name: 'cdn-dev-slug',\n ok: false,\n message: 'CDN dev slug not configured (shared CDN mirror needs per-developer ids)',\n remediation:\n 'Run wp setup, set PORTAL_CDN_DEV_SLUG, or configure git user.name for automatic slug',\n severity: 'warn',\n }\n}\n\nfunction isUploadOnlyProject(ctx: CommandContext): boolean {\n const moduleDirs = [resolve(ctx.projectRoot, ctx.config.module.uploadPath)]\n return isUploadOnlyPreexistingProject(ctx.projectRoot, moduleDirs)\n}\n\nfunction checkUploadOnlyNote(ctx: CommandContext): DoctorCheck | null {\n if (!isUploadOnlyProject(ctx)) return null\n return {\n name: 'upload-only-module',\n ok: true,\n message: 'Upload-only module (no local dev app)',\n remediation: 'Add package.json + src/ via wp init in a new folder, or continue upload-only with wp upload',\n severity: 'warn',\n }\n}\n\nfunction checkDevViteConfig(ctx: CommandContext): DoctorCheck {\n const path = resolve(ctx.projectRoot, 'vite.config.dev.mjs')\n const ok = existsSync(path)\n return {\n name: 'vite-dev-config',\n ok,\n message: ok ? 'vite.config.dev.mjs present' : 'vite.config.dev.mjs missing',\n remediation: ok\n ? undefined\n : 'Add vite.config.dev.mjs that re-exports @woodsportal/hubspot-kit/vite/vite.config.dev.mjs',\n severity: 'error',\n }\n}\n\nfunction checkMetaJson(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n\n const path = resolve(ctx.projectRoot, 'public/meta.json')\n if (!existsSync(path)) {\n return {\n name: 'meta-json',\n ok: false,\n message: 'public/meta.json missing',\n remediation:\n 'Copy meta.json from @woodsportal/hubspot-kit templates (content_types + module label for page editor)',\n severity: 'warn',\n }\n }\n\n try {\n const meta = JSON.parse(readFileSync(path, 'utf8')) as { content_types?: unknown }\n const hasContentTypes =\n Array.isArray(meta.content_types) && meta.content_types.length > 0\n return {\n name: 'meta-json',\n ok: hasContentTypes,\n message: hasContentTypes\n ? 'public/meta.json includes content_types'\n : 'public/meta.json missing content_types (module may not appear on site pages)',\n remediation: hasContentTypes\n ? undefined\n : 'Add content_types: [\"SITE_PAGE\", \"LANDING_PAGE\", ...] — see templates/module-hybrid-cdn/public/meta.json',\n severity: 'warn',\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'meta-json',\n ok: false,\n message: `public/meta.json is invalid JSON — ${message}`,\n remediation: 'Fix JSON syntax in public/meta.json',\n severity: 'warn',\n }\n }\n}\n\nasync function checkCdnMirrorPublic(ctx: CommandContext): Promise<DoctorCheck | null> {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n\n const mirrorPath = resolve(ctx.projectRoot, ctx.config.cdn?.mirror ?? 'portal.cdn.json')\n if (!existsSync(mirrorPath)) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: 'portal.cdn.json missing (hybrid CDN publish config)',\n remediation: 'Run wp setup or wp init to configure the public GitHub CDN mirror',\n severity: 'error',\n }\n }\n\n let github: string | undefined\n try {\n const mirror = JSON.parse(readFileSync(mirrorPath, 'utf8')) as { github?: string }\n github = mirror.github?.trim()\n } catch {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: 'portal.cdn.json is invalid JSON',\n remediation: 'Fix portal.cdn.json or re-run wp setup',\n severity: 'error',\n }\n }\n\n if (!github) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: 'portal.cdn.json missing github (org/repo)',\n remediation: 'Set github to a public repo for jsDelivr (e.g. Digital-Woods/woodsportal-client-frontend-cdn)',\n severity: 'error',\n }\n }\n\n try {\n const res = await fetch(`https://api.github.com/repos/${github}`, {\n headers: { Accept: 'application/vnd.github+json' },\n })\n if (res.status === 404) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `GitHub CDN repo ${github} not found`,\n remediation: 'Create the repo or fix portal.cdn.json github slug',\n severity: 'error',\n }\n }\n const data = (await res.json()) as { private?: boolean }\n if (data.private === true) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `CDN mirror ${github} is private — jsDelivr returns 404 (blank HubSpot preview)`,\n remediation:\n 'Make the GitHub repo public (Settings → Change visibility) or point portal.cdn.json at a public mirror',\n severity: 'error',\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `Could not verify CDN repo ${github} — ${message}`,\n severity: 'warn',\n }\n }\n\n const manifestPath = resolve(ctx.projectRoot, 'dist/cdn/manifest.json')\n if (!existsSync(manifestPath)) {\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public (run wp build to verify jsDelivr URLs)`,\n severity: 'error',\n }\n }\n\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as {\n scripts?: Array<{ name?: string; url?: string }>\n }\n const appUrl = manifest.scripts?.find((s) => s.name === 'app')?.url\n if (!appUrl) {\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public`,\n severity: 'error',\n }\n }\n const head = await fetch(appUrl, { method: 'HEAD' })\n if (!head.ok) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `jsDelivr app chunk not reachable (HTTP ${head.status}) — HubSpot preview will be blank`,\n remediation: 'Run wp deploy (publish CDN + upload module) after making the mirror repo public',\n severity: 'error',\n }\n }\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public and jsDelivr app chunk is reachable`,\n severity: 'error',\n }\n } catch {\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public`,\n severity: 'error',\n }\n }\n}\n\nfunction checkFieldsJson(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n\n const path = resolve(ctx.projectRoot, 'public/fields.json')\n if (!existsSync(path)) {\n return {\n name: 'fields-json',\n ok: false,\n message: 'public/fields.json missing',\n remediation: 'Copy fields.json from @woodsportal/hubspot-kit templates for your project type',\n severity: 'error',\n }\n }\n\n try {\n const fields = JSON.parse(readFileSync(path, 'utf8')) as unknown\n const issues = validateHubSpotFieldsJson(fields)\n if (issues.length === 0) {\n return {\n name: 'fields-json',\n ok: true,\n message: 'public/fields.json uses valid HubSpot field types',\n severity: 'error',\n }\n }\n\n const preview = issues\n .slice(0, 3)\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ')\n return {\n name: 'fields-json',\n ok: false,\n message: `public/fields.json has ${issues.length} issue(s) — ${preview}`,\n remediation:\n 'Use HubSpot field types (e.g. \"text\" + \"display\": \"textarea\", not type \"textarea\"). See templates/module-hybrid-cdn/public/fields.json',\n severity: 'error',\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'fields-json',\n ok: false,\n message: `public/fields.json is invalid JSON — ${message}`,\n remediation: 'Fix JSON syntax in public/fields.json',\n severity: 'error',\n }\n }\n}\n\nfunction readProjectFile(projectRoot: string, relativePath: string): string | null {\n const path = resolve(projectRoot, relativePath)\n if (!existsSync(path)) {\n return null\n }\n return readFileSync(path, 'utf8')\n}\n\nfunction checkCssPipeline(ctx: CommandContext): DoctorCheck[] {\n if (isThemeProject(ctx.config) || isUploadOnlyProject(ctx)) {\n return []\n }\n\n const checks: DoctorCheck[] = []\n const mainDev = readProjectFile(ctx.projectRoot, 'src/assets/css/main.dev.css')\n const mainProd = readProjectFile(ctx.projectRoot, 'src/assets/css/main.prod.css')\n const appEntry = readProjectFile(ctx.projectRoot, 'src/cdn/app-entry.ts')\n\n if (mainDev) {\n const withoutComments = mainDev.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/^\\s*\\/\\/.*$/gm, '')\n const hasPrefix = /@import\\s+['\"]tailwindcss['\"]\\s+prefix\\s*\\(\\s*dw\\s*\\)/i.test(\n withoutComments,\n )\n checks.push({\n name: 'css-main-dev-unprefixed',\n ok: !hasPrefix,\n message: hasPrefix\n ? 'main.dev.css uses prefix(dw) — local wp dev will not match HubSpot builds'\n : 'main.dev.css is unprefixed (local dev)',\n remediation: hasPrefix\n ? 'Remove prefix(dw) from main.dev.css; use main.prod.css for HubSpot/CDN builds only'\n : undefined,\n severity: 'error',\n })\n }\n\n if (mainProd) {\n const withoutComments = mainProd.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/^\\s*\\/\\/.*$/gm, '')\n const hasPrefix = /@import\\s+['\"]tailwindcss['\"]\\s+prefix\\s*\\(\\s*dw\\s*\\)/i.test(\n withoutComments,\n )\n const scansTemp = /@source\\s+['\"][^'\"]*\\.temp/.test(mainProd)\n checks.push({\n name: 'css-main-prod-prefixed',\n ok: hasPrefix,\n message: hasPrefix\n ? 'main.prod.css uses prefix(dw) (HubSpot/CDN)'\n : 'main.prod.css missing prefix(dw)',\n remediation: hasPrefix ? undefined : 'Add @import \\'tailwindcss\\' prefix(dw) to main.prod.css',\n severity: 'error',\n })\n checks.push({\n name: 'css-main-prod-temp-source',\n ok: scansTemp,\n message: scansTemp\n ? 'main.prod.css scans .temp/ for prefixed utilities'\n : 'main.prod.css missing @source for .temp/',\n remediation: scansTemp\n ? undefined\n : 'Add @source \\'../../../.temp/**/*.{js,jsx,ts,tsx}\\' to main.prod.css',\n severity: 'error',\n })\n }\n\n if (usesCdnPipeline(ctx.config) && appEntry) {\n const skipsRuntimeCss =\n /skipRuntimeCss\\s*:\\s*true/.test(appEntry) ||\n /mountPortal\\s*\\(\\s*\\{[^}]*skipRuntimeCss\\s*:\\s*true/.test(appEntry)\n checks.push({\n name: 'css-app-entry-skip-runtime',\n ok: skipsRuntimeCss,\n message: skipsRuntimeCss\n ? 'cdn/app-entry.ts skips runtime CSS (relies on module.css)'\n : 'cdn/app-entry.ts should call mountPortal({ skipRuntimeCss: true })',\n remediation: skipsRuntimeCss\n ? undefined\n : 'Update src/cdn/app-entry.ts — see templates/module-hybrid-cdn/src/cdn/app-entry.ts',\n severity: 'error',\n })\n }\n\n const moduleHtml = readProjectFile(ctx.projectRoot, 'public/module.html')\n if (moduleHtml && usesCdnPipeline(ctx.config)) {\n const loadsCdnAppCss =\n /require_css\\s*\\([^)]*portal_app_css/i.test(moduleHtml) ||\n /require_css\\s*\\([^)]*PORTAL_APP_CSS/i.test(moduleHtml)\n checks.push({\n name: 'css-module-html-no-cdn-require',\n ok: !loadsCdnAppCss,\n message: loadsCdnAppCss\n ? 'module.html require_css for CDN app CSS may double-load with merged module.css'\n : 'module.html relies on merged module.css (no CDN require_css)',\n remediation: loadsCdnAppCss\n ? 'Remove require_css for app.*.css; wp build merges app CSS into module.css'\n : undefined,\n severity: 'warn',\n })\n }\n\n const moduleOutDir = ctx.config.module?.outDir\n if (moduleOutDir && usesCdnPipeline(ctx.config)) {\n const moduleCssPath = resolve(ctx.projectRoot, moduleOutDir, 'module.css')\n if (existsSync(moduleCssPath)) {\n const css = readFileSync(moduleCssPath, 'utf8')\n const hasDwUtilities = /dw\\\\:/.test(css) || /\\.dw:/.test(css)\n checks.push({\n name: 'css-module-dist-prefixed',\n ok: hasDwUtilities,\n message: hasDwUtilities\n ? `${moduleOutDir}/module.css contains dw-prefixed utilities`\n : `${moduleOutDir}/module.css missing dw: utilities — run wp build`,\n remediation: hasDwUtilities ? undefined : 'Run wp build --tier dev (or stg/prod) before upload',\n severity: 'warn',\n })\n }\n }\n\n return checks\n}\n\nfunction checkHybridModuleHtml(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n\n const path = resolve(ctx.projectRoot, 'public/module.html')\n if (!existsSync(path)) {\n return {\n name: 'module-html',\n ok: false,\n message: 'public/module.html missing',\n remediation: 'Copy module.html from @woodsportal/hubspot-kit templates/module-hybrid-cdn',\n severity: 'error',\n }\n }\n\n const html = readFileSync(path, 'utf8')\n const needs = ['__PORTAL_CDN_BASE__', 'require_js', 'hubSpotData', 'id=\"app\"']\n const missing = needs.filter((token) => !html.includes(token))\n const usesUndeclaredCdnFields = /module\\.portal_(cdn_base_url|vendor_script|app_script|app_css)/.test(\n html,\n )\n const ok = missing.length === 0 && !usesUndeclaredCdnFields\n\n return {\n name: 'module-html-hybrid',\n ok,\n message: ok\n ? 'public/module.html includes CDN require_js + hubSpotData'\n : usesUndeclaredCdnFields\n ? 'public/module.html references undeclared module.portal_cdn_* fields'\n : `public/module.html missing hybrid CDN markers: ${missing.join(', ')}`,\n remediation: ok\n ? undefined\n : usesUndeclaredCdnFields\n ? 'Use __PORTAL_CDN_BASE__ placeholders in module.html (see templates/module-hybrid-cdn) — CDN URLs are injected at build time'\n : 'Update public/module.html from templates/module-hybrid-cdn (hybrid loads app from jsDelivr)',\n severity: 'error',\n }\n}\n\nfunction checkCdnViteConfigs(ctx: CommandContext): DoctorCheck[] {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return []\n\n return ['vite.config.cdn-vendor.mjs', 'vite.config.cdn-app.mjs'].map((file) => {\n const path = resolve(ctx.projectRoot, file)\n const ok = existsSync(path)\n return {\n name: file.replace(/\\./g, '-'),\n ok,\n message: ok ? `${file} present` : `${file} missing`,\n remediation: ok\n ? undefined\n : `Add ${file} that re-exports @woodsportal/hubspot-kit/vite/${file}`,\n severity: 'error' as const,\n }\n })\n}\n\nfunction checkDevEntry(ctx: CommandContext): DoctorCheck[] {\n const checks: DoctorCheck[] = []\n const indexHtml = resolve(ctx.projectRoot, 'index.html')\n const hasIndex = existsSync(indexHtml)\n checks.push({\n name: 'index-html',\n ok: hasIndex,\n message: hasIndex ? 'index.html present' : 'index.html missing',\n remediation: hasIndex ? undefined : 'Re-run wp init or copy index.html from kit templates',\n severity: 'error',\n })\n\n const localDev = resolve(ctx.projectRoot, ctx.config.entries.localDev)\n const hasEntry = existsSync(localDev)\n checks.push({\n name: 'local-dev-entry',\n ok: hasEntry,\n message: hasEntry ? `${ctx.config.entries.localDev} present` : `${ctx.config.entries.localDev} missing`,\n remediation: hasEntry\n ? undefined\n : 'Re-run wp init or restore src/main.tsx from kit templates',\n severity: 'error',\n })\n\n if (hasEntry) {\n try {\n const source = readFileSync(localDev, 'utf8')\n const usesKitNodeBootstrap =\n source.includes('@woodsportal/hubspot-kit/dev/bootstrap-greenfield') ||\n source.includes('@woodsportal/hubspot-kit/dev/bootstrap')\n const usesWphsShim =\n source.includes('.wphs/.kit-bootstrap-greenfield') ||\n source.includes('.wphs/.kit-bootstrap') ||\n source.includes('@wphs/bootstrap-greenfield') ||\n source.includes('@wphs/bootstrap')\n checks.push({\n name: 'local-dev-bootstrap-import',\n ok: !usesKitNodeBootstrap || usesWphsShim,\n message: usesKitNodeBootstrap\n ? `${ctx.config.entries.localDev} imports kit bootstrap via node_modules (breaks React JSX in dev)`\n : 'local dev bootstrap import uses .wphs shim',\n remediation: usesKitNodeBootstrap\n ? `Use import from '../.wphs/.kit-bootstrap-greenfield.tsx' (greenfield) or '@wphs/bootstrap' (full portal)`\n : undefined,\n severity: 'error',\n })\n } catch {\n // ignore read errors\n }\n }\n\n return checks\n}\n\nfunction checkKitScripts(): DoctorCheck {\n const script = kitPath('scripts', 'build-cdn.mjs')\n const ok = existsSync(script)\n return {\n name: 'kit-scripts',\n ok,\n message: ok ? '@woodsportal/hubspot-kit scripts installed' : 'Kit build scripts missing',\n remediation: ok ? undefined : 'Reinstall @woodsportal/hubspot-kit',\n severity: 'error',\n }\n}\n\nfunction checkWphsWorkspace(ctx: CommandContext): DoctorCheck[] {\n const workspace = ctx.config.dev.moduleConfigDir\n const checks: DoctorCheck[] = []\n\n for (const legacy of ['.dev', '.woodsportal']) {\n const legacyPath = resolve(ctx.projectRoot, legacy)\n if (existsSync(legacyPath)) {\n checks.push({\n name: `legacy-${legacy}`,\n ok: false,\n message: `Legacy workspace ${legacy}/ still present`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n }\n\n if (existsSync(resolve(ctx.projectRoot, '.wp-hs-baseline'))) {\n checks.push({\n name: 'legacy-baseline',\n ok: false,\n message: 'Legacy .wp-hs-baseline/ at repo root',\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n\n if (workspace !== WPHS_WORKSPACE_DIR) {\n checks.push({\n name: 'wphs-dir',\n ok: false,\n message: `dev.moduleConfigDir must be \"${WPHS_WORKSPACE_DIR}\" (got \"${workspace}\")`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n return checks\n }\n\n const wphsRoot = resolve(ctx.projectRoot, workspace)\n const required = ['config', 'assets/branding', 'fixtures', 'cache', 'audit/baseline', 'state']\n for (const sub of required) {\n const ok = existsSync(join(wphsRoot, sub))\n checks.push({\n name: `wphs-${sub.replace(/\\//g, '-')}`,\n ok,\n message: ok ? `.wphs/${sub}/ present` : `.wphs/${sub}/ missing`,\n remediation: ok ? undefined : 'Run wp doctor (auto-scaffolds) or wp init',\n severity: 'error',\n })\n }\n\n return checks\n}\n\nfunction checkAdapter(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n const adapterPath = resolve(ctx.projectRoot, ctx.config.dev.adapter)\n const ok = existsSync(adapterPath)\n return {\n name: 'wphs-adapter',\n ok,\n message: ok ? `${ctx.config.dev.adapter} present` : `${ctx.config.dev.adapter} missing`,\n remediation: ok ? undefined : 'Create wphs.adapter.ts (see kit templates)',\n severity: 'warn',\n }\n}\n\nfunction checkModuleConfigUiDeps(ctx: CommandContext): DoctorCheck[] {\n if (isThemeProject(ctx.config)) return []\n\n const pkgPath = resolve(ctx.projectRoot, 'package.json')\n if (!existsSync(pkgPath)) return []\n\n let deps: Record<string, string> = {}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n devDependencies?: Record<string, string>\n dependencies?: Record<string, string>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n return []\n }\n\n return MODULE_CONFIG_UI_DEPS.map((name) => {\n const ok = Boolean(deps[name])\n return {\n name: `module-config-${name.replace(/[@/]/g, '-')}`,\n ok,\n message: ok ? `${name} installed` : `${name} missing (module-config overlay)`,\n remediation: ok\n ? undefined\n : 'Run yarn install after wp init, or add @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities to devDependencies',\n severity: 'error' as const,\n }\n })\n}\n\nfunction checkNodeLoaderInterop(): DoctorCheck {\n const warning = nodeLoaderInteropWarning()\n return {\n name: 'node-loader-interop',\n ok: !warning,\n message: warning ?? `Node ${process.versions.node} (Vite config load OK)`,\n remediation: warning ?? undefined,\n severity: 'warn',\n }\n}\n\nfunction checkViteInstalled(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) && !existsSync(resolve(ctx.projectRoot, 'vite.config.dev.mjs'))) {\n return null\n }\n const ok = isProjectViteInstalled(ctx.projectRoot)\n return {\n name: 'vite',\n ok,\n message: ok ? 'vite installed' : 'vite not installed',\n remediation: ok\n ? undefined\n : 'Run yarn install or npm install (wp init scaffolds vite + peer deps in devDependencies)',\n severity: 'error',\n }\n}\n\nasync function gatherDoctorChecks(ctx: CommandContext): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = []\n\n await runCliTasks(ctx, [\n {\n title: 'Preparing .wphs workspace',\n task: async () => {\n if (ctx.global.dryRun) return\n try {\n runNodeScript(kitPath('scripts', 'ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n } catch {\n // non-fatal before config validation\n }\n },\n },\n {\n title: 'Checking Node, Vite, and kit scripts',\n task: async () => {\n checks.push(checkNode(), checkNodeLoaderInterop(), checkKitScripts())\n const uploadOnlyNote = checkUploadOnlyNote(ctx)\n if (uploadOnlyNote) {\n checks.push(uploadOnlyNote)\n } else {\n checks.push(checkDevViteConfig(ctx), ...checkCdnViteConfigs(ctx), ...checkDevEntry(ctx))\n checks.push(...checkCssPipeline(ctx))\n const hybridHtml = checkHybridModuleHtml(ctx)\n if (hybridHtml) checks.push(hybridHtml)\n const viteCheck = checkViteInstalled(ctx)\n if (viteCheck) checks.push(viteCheck)\n checks.push(...checkModuleConfigUiDeps(ctx))\n }\n },\n },\n {\n title: 'Checking woodscli.json and project layout',\n task: async () => {\n checks.push(...checkConfig(ctx), ...checkWphsWorkspace(ctx))\n const fieldsCheck = checkFieldsJson(ctx)\n if (fieldsCheck) checks.push(fieldsCheck)\n const metaCheck = checkMetaJson(ctx)\n if (metaCheck) checks.push(metaCheck)\n const adapterCheck = checkAdapter(ctx)\n if (adapterCheck) checks.push(adapterCheck)\n },\n },\n {\n title: 'Checking HubSpot CLI (this can take a few seconds)',\n task: async () => {\n checks.push(...doctorHubSpotChecks(ctx.projectRoot))\n },\n },\n {\n title: 'Checking environment and CDN files',\n task: async () => {\n const legacyBuildId = checkLegacyBuildIdFile(ctx)\n if (legacyBuildId) checks.push(legacyBuildId)\n const buildIdCheck = checkBuildId(ctx)\n if (buildIdCheck) checks.push(buildIdCheck)\n const resolvedBuildId = checkModuleBuildIdResolved(ctx)\n if (resolvedBuildId) checks.push(resolvedBuildId)\n const devSlugCheck = checkDevSlug(ctx)\n if (devSlugCheck) checks.push(devSlugCheck)\n checks.push(...checkEnvFiles(ctx))\n const cdnMirrorCheck = await checkCdnMirrorPublic(ctx)\n if (cdnMirrorCheck) checks.push(cdnMirrorCheck)\n },\n },\n ])\n\n return checks.filter((c): c is DoctorCheck => c !== null)\n}\n\nfunction printDoctorResults(ctx: CommandContext, checks: DoctorCheck[]): void {\n if (ctx.global.json) return\n\n const interactive = isInteractiveCli(ctx)\n const verbose = ctx.global.verbose\n const showPassing = !interactive || verbose\n\n if (interactive) {\n process.stdout.write('\\n')\n }\n\n for (const check of checks) {\n if (check.ok && !showPassing) continue\n\n if (check.ok) {\n ctx.logger.success(check.message)\n } else if (check.severity === 'warn') {\n ctx.logger.warn(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n } else {\n ctx.logger.error(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n }\n }\n}\n\nexport async function runDoctor(ctx: CommandContext): Promise<number> {\n const checks = await gatherDoctorChecks(ctx)\n\n const failed = checks.filter((c) => !c.ok && (c.severity ?? 'error') === 'error')\n const warnings = checks.filter((c) => !c.ok && c.severity === 'warn')\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'doctor',\n ok: failed.length === 0,\n warnings: warnings.length,\n checks,\n })\n } else {\n printDoctorResults(ctx, checks)\n\n if (!ctx.global.quiet && failed.length === 0) {\n const summary =\n warnings.length > 0\n ? `${checks.length} checks passed · ${warnings.length} warning(s)`\n : `${checks.length} checks passed`\n printCommandDone(ctx, summary)\n }\n }\n\n if (failed.length > 0) {\n throw new WpHsError(`${failed.length} doctor check(s) failed`, {\n exitCode: ExitCode.PREREQUISITE,\n })\n }\n\n if (warnings.length > 0 && !ctx.global.quiet && !ctx.global.json) {\n ctx.logger.warn(\n `${warnings.length} optional check(s) — local dev may work; fix before wp upload / wp watch`,\n )\n }\n\n return ExitCode.SUCCESS\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { CommandContext } from '../cli/context.js'\n\nexport type CliTask = {\n title: string\n task: () => void | Promise<void>\n}\n\nexport type ProgressOptions = {\n /** When false, never show spinners (e.g. nested call from deploy). Default: interactive TTY */\n progress?: boolean\n /** Shown immediately before task spinners (avoids a silent gap while Vite starts). */\n intro?: string\n}\n\n/** TTY + human mode — skip for --json, --quiet, --ci */\nexport function isInteractiveCli(ctx: CommandContext): boolean {\n const { json, quiet, ci } = ctx.global\n return !json && !quiet && !ci && process.stdout.isTTY === true\n}\n\nexport function shouldShowProgress(\n ctx: CommandContext,\n override?: boolean,\n): boolean {\n if (override === false) return false\n if (ctx.global.verbose) return false\n return isInteractiveCli(ctx)\n}\n\nfunction isVerboseStepLog(ctx: CommandContext): boolean {\n return ctx.global.verbose === true && !ctx.global.quiet && !ctx.global.json\n}\n\n/** Yield so @clack can paint spinner frames before blocking work starts. */\nexport async function yieldForSpinnerPaint(): Promise<void> {\n await new Promise<void>((resolve) => {\n setImmediate(resolve)\n })\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 48)\n })\n}\n\n/**\n * Run phased CLI work with @clack/prompts spinners (or sequential fallback).\n * Uses async spawn in child commands so the event loop can animate spinners.\n */\nexport async function runCliTasks(\n ctx: CommandContext,\n tasks: CliTask[],\n options: ProgressOptions = {},\n): Promise<void> {\n if (!shouldShowProgress(ctx, options.progress)) {\n const verbose = isVerboseStepLog(ctx)\n if (verbose && options.intro) {\n ctx.logger.info(options.intro)\n }\n for (const step of tasks) {\n if (verbose) {\n ctx.logger.step(step.title)\n }\n try {\n await step.task()\n if (verbose) {\n ctx.logger.stepDone(step.title)\n }\n } catch (error) {\n if (verbose) {\n ctx.logger.error(step.title)\n }\n throw error\n }\n }\n return\n }\n\n if (tasks.length === 0) {\n return\n }\n\n const spinner = p.spinner()\n const firstTitle = tasks[0].title\n spinner.start(options.intro ?? firstTitle)\n await yieldForSpinnerPaint()\n\n for (let i = 0; i < tasks.length; i++) {\n const step = tasks[i]\n if (i > 0) {\n spinner.start(step.title)\n await yieldForSpinnerPaint()\n } else if (options.intro) {\n spinner.message(firstTitle)\n await yieldForSpinnerPaint()\n }\n\n try {\n await step.task()\n spinner.stop(step.title)\n } catch (error) {\n spinner.stop(pc.red(step.title))\n throw error\n }\n }\n}\n\n/**\n * True when child processes (Vite, git, etc.) should pipe output so @clack spinners stay visible.\n * Pass quietSubprocess: true from nested commands (e.g. deploy → build).\n */\nexport function shouldQuietSubprocess(\n ctx: CommandContext,\n options: { progress?: boolean; quietSubprocess?: boolean; /** @deprecated */ quietVite?: boolean } = {},\n): boolean {\n if (ctx.global.verbose) return false\n if (options.quietSubprocess === true || options.quietVite === true) return true\n return shouldShowProgress(ctx, options.progress)\n}\n\n/** @deprecated use shouldQuietSubprocess */\nexport const shouldQuietViteBuild = shouldQuietSubprocess\n\n/** Green ◆ summary line (interactive) or logger.success fallback */\nexport function printCommandDone(ctx: CommandContext, message: string): void {\n if (isInteractiveCli(ctx)) {\n process.stdout.write(`${pc.green('◆')} ${message}\\n`)\n return\n }\n ctx.logger.success(message)\n}\n\nexport type CliSpinnerHandle = {\n message: (text: string) => void\n stop: (finalMessage?: string) => void\n}\n\n/** Single spinner for one blocking step */\nexport function createCliSpinner(ctx: CommandContext, label: string): CliSpinnerHandle | null {\n if (!isInteractiveCli(ctx)) return null\n\n const spinner = p.spinner()\n spinner.start(label)\n\n return {\n message: (text: string) => {\n spinner.message(text)\n },\n stop: (finalMessage?: string) => {\n spinner.stop(finalMessage)\n },\n }\n}\n\nexport async function withCliSpinner<T>(\n ctx: CommandContext,\n label: string,\n fn: () => T | Promise<T>,\n options: ProgressOptions = {},\n): Promise<T> {\n if (!shouldShowProgress(ctx, options.progress)) {\n return await fn()\n }\n\n const spinner = createCliSpinner(ctx, label)\n await yieldForSpinnerPaint()\n try {\n return await fn()\n } finally {\n spinner?.stop()\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { spawnSync, type SpawnSyncReturns } from 'node:child_process'\n\nimport type { CommandContext } from '../cli/context.js'\nimport { ExitCode, WpHsError } from './errors.js'\n\nexport const HUBSPOT_CONFIG_FILE = 'hubspot.config.yml'\nexport const HUBSPOT_CONFIG_EXAMPLE = 'hubspot.config.yml.example'\n\nconst HS_VERSION_TIMEOUT_MS = 5_000\nconst HS_ACCOUNTS_TIMEOUT_MS = 10_000\n\nconst PLACEHOLDER_PATTERNS = [\n /YOUR_PAT_HERE/i,\n /your-portal-id/i,\n /personalAccessKey:\\s*$/m,\n /portalId:\\s*12345678\\b/,\n]\n\nexport type HubSpotConfigFileAssessment = {\n configPath: string\n examplePath: string\n configPresent: boolean\n examplePresent: boolean\n looksLikePlaceholder: boolean\n}\n\nfunction spawnHs(\n args: string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): SpawnSyncReturns<string> {\n return spawnSync('hs', args, {\n cwd: options.cwd,\n encoding: 'utf8',\n timeout: options.timeoutMs ?? HS_ACCOUNTS_TIMEOUT_MS,\n // Keep HubSpot CLI off the interactive TTY (avoids hangs under @clack spinners)\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n}\n\nfunction hsTimedOut(result: SpawnSyncReturns<string>): boolean {\n const err = result.error as NodeJS.ErrnoException | undefined\n return err?.code === 'ETIMEDOUT'\n}\n\n/** Fast sync checks — no HubSpot CLI subprocess (used by wp dev). */\nexport function assessHubSpotConfigFiles(projectRoot: string): HubSpotConfigFileAssessment {\n const configPath = resolve(projectRoot, HUBSPOT_CONFIG_FILE)\n const examplePath = resolve(projectRoot, HUBSPOT_CONFIG_EXAMPLE)\n const configPresent = existsSync(configPath)\n const examplePresent = existsSync(examplePath)\n\n let looksLikePlaceholder = false\n if (configPresent) {\n const raw = readFileSync(configPath, 'utf8')\n looksLikePlaceholder = PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(raw))\n } else {\n looksLikePlaceholder = true\n }\n\n return {\n configPath,\n examplePath,\n configPresent,\n examplePresent,\n looksLikePlaceholder,\n }\n}\n\nfunction runHubSpotCliChecks(\n projectRoot: string,\n options: { checkAccounts?: boolean } = {},\n): Pick<HubSpotSetupAssessment, 'hsCliInstalled' | 'hsCliVersion' | 'authenticated' | 'accountsHint'> {\n const checkAccounts = options.checkAccounts !== false\n\n const hsVersion = spawnHs(['--version'], { timeoutMs: HS_VERSION_TIMEOUT_MS })\n const hsCliInstalled = hsVersion.status === 0 && !hsTimedOut(hsVersion)\n const hsCliVersion = hsCliInstalled ? (hsVersion.stdout || hsVersion.stderr || '').trim() : null\n\n let authenticated = false\n let accountsHint: string | null = null\n\n if (hsCliInstalled && checkAccounts) {\n const accounts = spawnHs(['accounts', 'list'], {\n cwd: projectRoot,\n timeoutMs: HS_ACCOUNTS_TIMEOUT_MS,\n })\n const output = `${accounts.stdout || ''}\\n${accounts.stderr || ''}`.trim()\n accountsHint = hsTimedOut(accounts) ? 'timed out' : output || null\n authenticated =\n !hsTimedOut(accounts) &&\n accounts.status === 0 &&\n /Account:|portalId|portal/i.test(output) &&\n !/No accounts/i.test(output)\n }\n\n return { hsCliInstalled, hsCliVersion, authenticated, accountsHint }\n}\n\nexport type HubSpotSetupAssessment = HubSpotConfigFileAssessment & {\n hsCliInstalled: boolean\n hsCliVersion: string | null\n authenticated: boolean\n accountsHint: string | null\n}\n\nexport function assessHubSpotCliSetup(\n projectRoot: string,\n options: { checkAccounts?: boolean } = {},\n): HubSpotSetupAssessment {\n return {\n ...assessHubSpotConfigFiles(projectRoot),\n ...runHubSpotCliChecks(projectRoot, options),\n }\n}\n\nexport function hubSpotSetupRemediation(\n projectRoot: string,\n assessment: HubSpotSetupAssessment = assessHubSpotCliSetup(projectRoot),\n): string[] {\n const steps: string[] = []\n\n if (!assessment.hsCliInstalled) {\n steps.push('Install HubSpot CLI: npm i -g @hubspot/cli')\n }\n\n if (!assessment.configPresent) {\n if (assessment.examplePresent) {\n steps.push(`Run wp setup (copies ${HUBSPOT_CONFIG_EXAMPLE} → ${HUBSPOT_CONFIG_FILE}) and add portal + PAT`)\n } else {\n steps.push(`Create ${HUBSPOT_CONFIG_FILE} (see docs/HUBSPOT-CLI-SETUP.md)`)\n }\n steps.push('Generate a PAT: https://app.hubspot.com/l/personal-access-key')\n } else if (assessment.looksLikePlaceholder) {\n steps.push(`Edit ${HUBSPOT_CONFIG_FILE} — replace placeholder portalId and personalAccessKey`)\n }\n\n if (assessment.configPresent && !assessment.looksLikePlaceholder && !assessment.authenticated) {\n steps.push('Run wp auth (or hs auth) and confirm with: hs accounts list')\n }\n\n return steps\n}\n\nexport type HubSpotSetupMode = 'local' | 'cms'\n\nfunction hubSpotLocalDevRemediation(files: HubSpotConfigFileAssessment): string[] {\n const steps: string[] = []\n\n if (!files.configPresent) {\n if (files.examplePresent) {\n steps.push(`Run wp setup (copies ${HUBSPOT_CONFIG_EXAMPLE} → ${HUBSPOT_CONFIG_FILE}) and add portal + PAT`)\n } else {\n steps.push(`Create ${HUBSPOT_CONFIG_FILE} (see docs/HUBSPOT-CLI-SETUP.md)`)\n }\n steps.push('Generate a PAT: https://app.hubspot.com/l/personal-access-key')\n } else if (files.looksLikePlaceholder) {\n steps.push(`Edit ${HUBSPOT_CONFIG_FILE} — replace placeholder portalId and personalAccessKey`)\n }\n\n return steps\n}\n\nfunction cmsEnsureAssessment(projectRoot: string): HubSpotSetupAssessment {\n return assessHubSpotCliSetup(projectRoot, { checkAccounts: false })\n}\n\nfunction throwCmsConfigError(_ctx: CommandContext, files: HubSpotConfigFileAssessment): never {\n const steps = hubSpotLocalDevRemediation(files)\n throw new WpHsError('HubSpot config is not ready for cms watch/upload in this project.', {\n exitCode: ExitCode.PREREQUISITE,\n remediation: steps.join('; '),\n })\n}\n\n/**\n * Filesystem-only CMS prereq — no `hs` subprocess (safe for wp watch; Ctrl+C stays responsive).\n */\nexport function ensureHubSpotConfigForCms(ctx: CommandContext): void {\n if (ctx.global.dryRun || ctx.global.json) return\n\n const files = assessHubSpotConfigFiles(ctx.projectRoot)\n if (files.configPresent && !files.looksLikePlaceholder) return\n\n throwCmsConfigError(ctx, files)\n}\n\n/**\n * Warn (local dev) or require (upload/deploy) HubSpot CLI project setup.\n * CMS mode: hubspot.config.yml + `hs --version` (5s timeout) — no `hs accounts list`.\n * Use {@link ensureHubSpotConfigForCms} for wp watch (long-running TTY).\n */\nexport function ensureHubSpotCliSetup(ctx: CommandContext, mode: HubSpotSetupMode): void {\n if (ctx.global.dryRun || ctx.global.json) return\n\n if (mode === 'local') {\n const files = assessHubSpotConfigFiles(ctx.projectRoot)\n if (files.configPresent && !files.looksLikePlaceholder) {\n return\n }\n\n const steps = hubSpotLocalDevRemediation(files)\n ctx.logger.warn(\n 'HubSpot upload/watch is not configured for this project (local preview still works).',\n )\n for (const step of steps) {\n ctx.logger.info(` → ${step}`)\n }\n ctx.logger.info(' → Full HubSpot CLI checks: wp doctor')\n ctx.logger.info(' → Docs: @woodsportal/hubspot-kit/docs/HUBSPOT-CLI-SETUP.md')\n return\n }\n\n const assessment = cmsEnsureAssessment(ctx.projectRoot)\n const needsSetup =\n !assessment.hsCliInstalled ||\n !assessment.configPresent ||\n assessment.looksLikePlaceholder\n\n if (!needsSetup) return\n\n const steps = hubSpotSetupRemediation(ctx.projectRoot, assessment)\n const headline = 'HubSpot CLI is not ready for cms upload/watch in this project.'\n\n throw new WpHsError(headline, {\n exitCode: ExitCode.PREREQUISITE,\n remediation: steps.join('; '),\n })\n}\n\nexport function doctorHubSpotChecks(projectRoot: string): Array<{\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'warn' | 'error'\n}> {\n const assessment = assessHubSpotCliSetup(projectRoot, { checkAccounts: true })\n const steps = hubSpotSetupRemediation(projectRoot, assessment)\n const remediation = steps.length > 0 ? steps.join(' · ') : undefined\n\n return [\n {\n name: 'hubspot-cli',\n ok: assessment.hsCliInstalled,\n message: assessment.hsCliInstalled\n ? `HubSpot CLI ${assessment.hsCliVersion ?? ''}`.trim()\n : 'HubSpot CLI not installed',\n remediation: assessment.hsCliInstalled ? undefined : 'npm i -g @hubspot/cli',\n severity: 'error',\n },\n {\n name: 'hubspot-config',\n ok: assessment.configPresent && !assessment.looksLikePlaceholder,\n message: !assessment.configPresent\n ? `${HUBSPOT_CONFIG_FILE} missing (required for wp upload / wp watch)`\n : assessment.looksLikePlaceholder\n ? `${HUBSPOT_CONFIG_FILE} still has placeholder values`\n : `${HUBSPOT_CONFIG_FILE} present`,\n remediation,\n severity: 'warn',\n },\n {\n name: 'hubspot-auth',\n ok: assessment.authenticated,\n message: assessment.authenticated\n ? 'HubSpot CLI authenticated for this project'\n : assessment.accountsHint === 'timed out'\n ? 'HubSpot CLI auth check timed out — run hs accounts list manually'\n : 'HubSpot CLI not authenticated (or no portal in hubspot.config.yml)',\n remediation: assessment.authenticated ? undefined : 'wp auth · hs accounts list',\n severity: 'warn',\n },\n ]\n}\n","/** Dev deps required for `wp dev` (Vite preset peer dependencies). */\nexport const VITE_DEV_PEER_DEPS: Record<string, string> = {\n vite: '^6.1.0',\n '@vitejs/plugin-react': '^4.3.4',\n 'babel-plugin-react-compiler': '^1.0.0',\n '@tailwindcss/vite': '^4.0.6',\n '@tanstack/router-plugin': '^1.121.2',\n '@tanstack/react-router': '^1.121.2',\n '@dnd-kit/core': '^6.3.1',\n '@dnd-kit/sortable': '^10.0.0',\n '@dnd-kit/utilities': '^3.2.2',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n tailwindcss: '^4.0.6',\n}\n\nexport const KIT_DEV_DEP = '@woodsportal/hubspot-kit'\n\n/** Latest kit version pinned in `wp init` scaffolds. Keep aligned with package.json. */\nexport const KIT_DEV_DEP_VERSION = '^1.0.30'\n\n/** Required for module-config overlay UI (HsRepeaterList drag-and-drop). */\nexport const MODULE_CONFIG_UI_DEPS = [\n '@dnd-kit/core',\n '@dnd-kit/sortable',\n '@dnd-kit/utilities',\n] as const\n\nexport function templateDevDependencies(): Record<string, string> {\n return {\n [KIT_DEV_DEP]: KIT_DEV_DEP_VERSION,\n ...VITE_DEV_PEER_DEPS,\n }\n}\n","/** HubSpot CMS module field types (fields.json `type` values). */\nexport const HUBSPOT_MODULE_FIELD_TYPES = new Set([\n 'boolean',\n 'choice',\n 'color',\n 'cta',\n 'date',\n 'datetime',\n 'email',\n 'embed',\n 'file',\n 'followup_email',\n 'font',\n 'form',\n 'group',\n 'html',\n 'hubdb_row',\n 'hubdb_table',\n 'icon',\n 'image',\n 'link',\n 'logo',\n 'meeting',\n 'menu',\n 'number',\n 'page',\n 'payment',\n 'richtext',\n 'salesforce_campaign',\n 'simple_menu',\n 'spacing',\n 'tag',\n 'text',\n 'url',\n 'video',\n 'workflow',\n])\n\nexport type FieldsJsonIssue = {\n path: string\n message: string\n}\n\nfunction isFieldRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction validateFieldNode(node: unknown, path: string, issues: FieldsJsonIssue[]): void {\n if (!isFieldRecord(node)) {\n issues.push({ path, message: 'expected a field object' })\n return\n }\n\n const type = node.type\n if (typeof type !== 'string' || type.length === 0) {\n issues.push({ path: `${path}.type`, message: 'missing field type' })\n } else if (!HUBSPOT_MODULE_FIELD_TYPES.has(type)) {\n issues.push({\n path: `${path}.type`,\n message:\n type === 'textarea'\n ? `'textarea' is not a HubSpot field type — use \"type\": \"text\" with \"display\": \"textarea\"`\n : `'${type}' is not a valid HubSpot field type`,\n })\n }\n\n const tab = node.tab\n if (tab === 'STYLE' && type !== 'group') {\n issues.push({\n path: `${path}.tab`,\n message:\n 'STYLE tab fields must live inside a \"type\": \"group\" with \"tab\": \"STYLE\" (HubSpot page editor Styles tab)',\n })\n }\n\n if (type !== 'group') {\n const name = node.name\n if (typeof name !== 'string' || name.trim().length === 0) {\n issues.push({ path: `${path}.name`, message: 'missing field name' })\n }\n\n const label = node.label\n if (typeof label !== 'string' || label.trim().length === 0) {\n issues.push({ path: `${path}.label`, message: 'missing field label' })\n }\n } else {\n const children = node.children\n if (!Array.isArray(children)) {\n issues.push({ path: `${path}.children`, message: 'group fields require a children array' })\n } else {\n children.forEach((child, index) => {\n validateFieldNode(child, `${path}.children[${index}]`, issues)\n })\n }\n }\n}\n\nexport function validateHubSpotFieldsJson(fields: unknown): FieldsJsonIssue[] {\n if (!Array.isArray(fields)) {\n return [{ path: '$', message: 'fields.json must be a top-level array' }]\n }\n\n const issues: FieldsJsonIssue[] = []\n fields.forEach((field, index) => {\n validateFieldNode(field, `[${index}]`, issues)\n })\n return issues\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nconst SLUG_MAX_LEN = 12\nconst SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,10}[a-z0-9])?$/\n\nexport const DEVELOPER_CONFIG_FILE = 'developer.json'\n\nexport function developerConfigPath(projectRoot: string): string {\n return resolve(projectRoot, '.wphs', 'config', DEVELOPER_CONFIG_FILE)\n}\n\nexport function sanitizeDevSlug(input: string | undefined): string | undefined {\n if (!input?.trim()) return undefined\n const slug = input\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, SLUG_MAX_LEN)\n if (!slug || !SLUG_PATTERN.test(slug)) return undefined\n return slug\n}\n\nexport function readDeveloperSlug(projectRoot: string): string | undefined {\n const fromEnv =\n sanitizeDevSlug(process.env.PORTAL_CDN_DEV_SLUG) ??\n sanitizeDevSlug(process.env.MODULE_CDN_DEV_SLUG)\n if (fromEnv) return fromEnv\n\n const path = developerConfigPath(projectRoot)\n if (!existsSync(path)) return undefined\n try {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as { slug?: string }\n return sanitizeDevSlug(raw.slug)\n } catch {\n return undefined\n }\n}\n\nexport function writeDeveloperSlug(projectRoot: string, slug: string): void {\n const normalized = sanitizeDevSlug(slug)\n if (!normalized) {\n throw new Error('Invalid CDN dev slug — use lowercase letters, numbers, and hyphens (max 12 chars)')\n }\n const path = developerConfigPath(projectRoot)\n mkdirSync(resolve(path, '..'), { recursive: true })\n writeFileSync(path, `${JSON.stringify({ slug: normalized }, null, 2)}\\n`)\n}\n\nexport function needsDeveloperSlugSetup(projectRoot: string): boolean {\n return !readDeveloperSlug(projectRoot)\n}\n\nexport async function promptDeveloperSlug(projectRoot: string): Promise<string | undefined> {\n if (!needsDeveloperSlugSetup(projectRoot)) {\n return readDeveloperSlug(projectRoot)\n }\n\n const slug = await p.text({\n message:\n 'CDN dev slug (unique per developer for shared CDN mirror — e.g. your first name)',\n placeholder: 'manab',\n validate: (value) => {\n if (!sanitizeDevSlug(value)) {\n return 'Use 1–12 lowercase letters, numbers, or hyphens'\n }\n return undefined\n },\n })\n\n if (p.isCancel(slug) || typeof slug !== 'string') {\n return undefined\n }\n\n writeDeveloperSlug(projectRoot, slug)\n return sanitizeDevSlug(slug)\n}\n","import { spawnSync } from 'node:child_process'\n\nimport { kitPath } from './paths.js'\n\nexport type BumpModuleBuildIdResult = {\n id: string\n bumped: boolean\n source: string\n slug?: string\n seq?: number\n baseline?: string\n}\n\nexport type ModuleBuildIdMeta = {\n id: string\n source: string\n slug?: string\n seq?: number\n baseline?: string\n}\n\nfunction runKitScript(\n script: string,\n args: string[],\n options: { cwd: string; env: NodeJS.ProcessEnv; dryRun?: boolean },\n): string {\n const result = spawnSync(process.execPath, [kitPath('scripts', script), ...args], {\n cwd: options.cwd,\n env: {\n ...options.env,\n WP_HS_PROJECT_ROOT: options.cwd,\n },\n encoding: 'utf8',\n })\n\n if (result.status !== 0) {\n const stderr = result.stderr?.trim() || result.stdout?.trim()\n throw new Error(stderr || `Failed running ${script}`)\n }\n\n return (result.stdout ?? '').trim()\n}\n\nexport function bumpModuleBuildIdForCli(\n projectRoot: string,\n options: { tier?: string; dryRun?: boolean; env?: NodeJS.ProcessEnv } = {},\n): BumpModuleBuildIdResult {\n const args = [...(options.tier ? [`--tier=${options.tier}`] : []), ...(options.dryRun ? ['--dry-run'] : [])]\n const stdout = runKitScript('bump-module-build-id.mjs', args, {\n cwd: projectRoot,\n env: options.env ?? process.env,\n dryRun: options.dryRun,\n })\n return JSON.parse(stdout) as BumpModuleBuildIdResult\n}\n\nexport function resolveModuleBuildIdMetaForCli(\n projectRoot: string,\n env: NodeJS.ProcessEnv = process.env,\n): ModuleBuildIdMeta {\n const stdout = runKitScript('resolve-module-build-id-meta.mjs', [], {\n cwd: projectRoot,\n env,\n })\n return JSON.parse(stdout) as ModuleBuildIdMeta\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** True when project has HubSpot .module artifacts but no local dev app yet. */\nexport function isUploadOnlyPreexistingProject(\n projectRoot: string,\n moduleArtifactDirs: string[],\n): boolean {\n if (moduleArtifactDirs.length === 0) return false\n if (existsSync(resolve(projectRoot, 'package.json'))) return false\n if (existsSync(resolve(projectRoot, 'src'))) return false\n return moduleArtifactDirs.some((dir) => existsSync(resolve(dir, 'fields.json')))\n}\n","import { existsSync } from 'node:fs'\nimport { platform } from 'node:os'\nimport { resolve } from 'node:path'\n\nimport { kitPath } from '../lib/paths.js'\n\nconst CONSUMER_DEV_CONFIG = 'vite.config.dev.mjs'\nconst VITE_JS_SEGMENTS = ['node_modules', 'vite', 'bin', 'vite.js'] as const\n\n/**\n * Vite resolves config dependencies from the config file's package context.\n * The preset must be re-exported from the consumer repo (vite.config.dev.mjs)\n * so `vite` and plugins resolve from the project's node_modules.\n */\nexport function resolveDevViteConfigPath(projectRoot: string): string {\n const consumerConfig = resolve(projectRoot, CONSUMER_DEV_CONFIG)\n if (existsSync(consumerConfig)) {\n return consumerConfig\n }\n return kitPath('vite', 'vite.config.dev.mjs')\n}\n\nexport type ProjectViteSpawn = {\n command: string\n /** Arguments placed before Vite CLI flags (e.g. path to vite.js when command is node). */\n prefixArgs: string[]\n}\n\n/** True when the consumer project has the vite package installed (cross-platform). */\nexport function isProjectViteInstalled(projectRoot: string): boolean {\n return existsSync(resolve(projectRoot, ...VITE_JS_SEGMENTS))\n}\n\n/**\n * Resolve how to spawn Vite from the consumer project.\n * Windows: `.bin/vite` is a shell shim — spawn `node …/vite/bin/vite.js` or `vite.cmd`.\n */\nexport function resolveProjectViteSpawn(projectRoot: string): ProjectViteSpawn | null {\n const viteJs = resolve(projectRoot, ...VITE_JS_SEGMENTS)\n if (existsSync(viteJs)) {\n return { command: process.execPath, prefixArgs: [viteJs] }\n }\n\n const binDir = resolve(projectRoot, 'node_modules', '.bin')\n if (platform() === 'win32') {\n const winCmd = resolve(binDir, 'vite.cmd')\n if (existsSync(winCmd)) {\n return { command: winCmd, prefixArgs: [] }\n }\n }\n\n const posixShim = resolve(binDir, 'vite')\n if (existsSync(posixShim)) {\n return { command: posixShim, prefixArgs: [] }\n }\n\n return null\n}\n\n/** Human-readable spawn target for dry-run logs. */\nexport function formatProjectViteSpawn(spawn: ProjectViteSpawn): string {\n return [spawn.command, ...spawn.prefixArgs].join(' ')\n}\n\n/** @deprecated Prefer {@link resolveProjectViteSpawn} — kept for dry-run display. */\nexport function resolveProjectViteBin(projectRoot: string): string {\n const spawn = resolveProjectViteSpawn(projectRoot)\n if (!spawn) {\n return 'vite'\n }\n return formatProjectViteSpawn(spawn)\n}\n","/** Current Active LTS — update when Node release schedule changes. */\nexport const NODE_LTS_RECOMMENDED = '24'\n\n/**\n * Node ESM/CJS loader regressions that break sync require() of ESM-only packages.\n * Node 24 LTS is supported; warnings target known-bad 22.18+ and early 23.x only.\n * @see https://github.com/nodejs/node/issues/59366\n */\nexport function nodeLoaderInteropWarning(): string | null {\n const [major, minor] = process.versions.node.split('.').map(Number)\n\n if (major === 22 && minor >= 18) {\n return `Node 22.18+ can fail loading Vite config (getStatus). Upgrade to Node ${NODE_LTS_RECOMMENDED} LTS or the latest Node 22 patch.`\n }\n\n if (major === 23 && minor < 4) {\n return `Node 23.0–23.3 can fail loading Vite config (getStatus). Upgrade to Node ${NODE_LTS_RECOMMENDED} LTS.`\n }\n\n return null\n}\n","import { validateConfigFile } from '../../lib/config.js'\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport async function runConfigValidate(ctx: CommandContext): Promise<number> {\n const result = validateConfigFile(ctx.projectRoot)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'config validate',\n valid: result.valid,\n errors: result.errors,\n config: result.config,\n })\n } else if (result.valid) {\n ctx.logger.success(`${WOODSCLI_CONFIG_FILE} is valid`)\n } else {\n for (const err of result.errors) {\n ctx.logger.error(err)\n }\n }\n\n return result.valid ? ExitCode.SUCCESS : ExitCode.USER_ERROR\n}\n","import { resolve } from 'node:path'\n\nimport { bumpModuleBuildIdForCli } from '../../lib/module-build-id.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { formatProjectLabel } from '../../lib/cli-banner.js'\nimport {\n printCommandDone,\n runCliTasks,\n shouldQuietSubprocess,\n type CliTask,\n} from '../../lib/cli-spinner.js'\nimport { runNodeScriptAsync } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER, type BuildTier } from '../../lib/build-tier.js'\nimport { isThemeProject, usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type { BuildTier }\n\nexport type BuildOptions = {\n tier?: BuildTier\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n progress?: boolean\n /** Suppress ◆ Build complete (nested deploy). */\n quiet?: boolean\n /** Pipe child-process output when a parent command shows progress spinners. */\n quietSubprocess?: boolean\n /** @deprecated use quietSubprocess */\n quietVite?: boolean\n /** Parent already bumped module build id (deploy). */\n buildIdBumped?: boolean\n /** Inherit env from parent command (deploy publish pin). */\n env?: NodeJS.ProcessEnv\n}\n\nfunction tierToViteModeFlag(tier: BuildTier): string[] {\n if (tier === 'dev') return ['--dev']\n if (tier === 'stg') return ['--stg']\n return ['--prod']\n}\n\nfunction buildTasks(\n ctx: CommandContext,\n options: BuildOptions,\n run: (script: string, args?: string[]) => Promise<void>,\n): CliTask[] {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const isTheme = isThemeProject(ctx.config)\n const useCdn = usesCdnPipeline(ctx.config) && !isTheme\n const tasks: CliTask[] = []\n\n if (isTheme && !options.cdnOnly) {\n return tasks\n }\n\n if (ctx.config.projectType === 'module-monolith' && !options.cdnOnly) {\n tasks.push({\n title: `Building monolith module (${tier})`,\n task: async () => {\n await run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.monolith.mjs'),\n ...tierToViteModeFlag(tier),\n ])\n await run('run-hubspot-module-postbuild.mjs')\n },\n })\n return tasks\n }\n\n if (!options.hubspotOnly && useCdn) {\n tasks.push({\n title: `Building CDN (${tier})`,\n task: async () => {\n if (options.cdnEsm) {\n await run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.cdn-esm.mjs'),\n ...tierToViteModeFlag(tier),\n ])\n } else {\n await run('build-cdn.mjs', tierToViteModeFlag(tier))\n }\n await run('generate-cdn-manifest.mjs')\n },\n })\n }\n\n if (!options.cdnOnly) {\n tasks.push({\n title: `Building HubSpot module (${tier})`,\n task: async () => {\n await run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.hubspot.mjs'),\n ...tierToViteModeFlag(tier),\n ])\n await run('run-hubspot-module-postbuild.mjs')\n },\n })\n }\n\n if (!options.cdnOnly && !options.hubspotOnly) {\n tasks.push({\n title: 'Running bundle checks',\n task: async () => {\n await run('check-hubspot-bundle-size.mjs')\n await run('write-audit-artifacts.mjs')\n },\n })\n }\n\n return tasks\n}\n\nfunction buildIntroLine(\n ctx: CommandContext,\n tier: BuildTier,\n options: BuildOptions,\n): string | undefined {\n const isTheme = isThemeProject(ctx.config)\n const useCdn = usesCdnPipeline(ctx.config) && !isTheme\n const parts: string[] = []\n if (!options.hubspotOnly && useCdn) parts.push('CDN')\n if (!options.cdnOnly) parts.push('HubSpot module')\n if (!options.cdnOnly && !options.hubspotOnly && !isTheme) parts.push('bundle checks')\n if (parts.length === 0) return undefined\n return `${formatProjectLabel(ctx.config)} · ${parts.join(' + ')} (${tier})`\n}\n\nasync function maybeBumpModuleBuildId(\n ctx: CommandContext,\n tier: BuildTier,\n options: BuildOptions,\n env: NodeJS.ProcessEnv,\n): Promise<NodeJS.ProcessEnv> {\n const useCdn = usesCdnPipeline(ctx.config) && !isThemeProject(ctx.config)\n const shouldBump =\n useCdn &&\n !options.hubspotOnly &&\n !ctx.global.noBump &&\n !options.buildIdBumped &&\n !env.PORTAL_BUILD_ID?.trim() &&\n !env.MODULE_BUILD_ID?.trim() &&\n !env.GITHUB_REF_NAME?.trim()\n\n if (!shouldBump) {\n return env\n }\n\n const result = bumpModuleBuildIdForCli(ctx.projectRoot, {\n tier,\n dryRun: ctx.global.dryRun,\n env,\n })\n\n if (!ctx.global.quiet && !ctx.global.json && result.bumped) {\n ctx.logger.info(`Module build id → ${result.id}`)\n }\n\n return {\n ...env,\n PORTAL_BUILD_ID: result.id,\n MODULE_BUILD_ID: result.id,\n }\n}\n\nexport async function runBuild(ctx: CommandContext, options: BuildOptions): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const quietSubprocess = shouldQuietSubprocess(ctx, options)\n let env: NodeJS.ProcessEnv = {\n ...(options.env ?? process.env),\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n ...(quietSubprocess ? { WP_HS_QUIET_BUILD: '1' } : {}),\n }\n env = await maybeBumpModuleBuildId(ctx, tier, options, env)\n const isTheme = isThemeProject(ctx.config)\n\n const execOpts = {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n }\n\n const run = (script: string, args: string[] = []) => {\n return runNodeScriptAsync(kitPath('scripts', script), args, execOpts)\n }\n\n try {\n if (isTheme && !options.cdnOnly) {\n if (ctx.global.json) {\n ctx.logger.json({ command: 'build', tier, ok: true, projectType: ctx.config.projectType })\n } else if (!options.progress) {\n ctx.logger.info('Theme project — skipping CDN/module.js build (use wp upload for theme assets)')\n printCommandDone(ctx, 'Theme build complete (no-op)')\n } else {\n await runCliTasks(\n ctx,\n [{ title: 'Theme project (no module build)', task: async () => {} }],\n options,\n )\n printCommandDone(ctx, 'Theme build complete (no-op)')\n }\n return ExitCode.SUCCESS\n }\n\n const tasks = buildTasks(ctx, options, run)\n await runCliTasks(ctx, tasks, {\n ...options,\n intro: buildIntroLine(ctx, tier, options),\n })\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'build',\n tier,\n ok: true,\n outDir: resolve(ctx.projectRoot, ctx.config.module.outDir),\n })\n } else if (!options.quiet) {\n printCommandDone(ctx, 'Build complete')\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.BUILD_FAILED,\n })\n }\n}\n","import pc from 'picocolors'\n\nimport type { GlobalCliOptions } from '../cli/context.js'\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { isThemeProject } from '../schema/woodsportal-hs.js'\n\nimport { readKitVersion } from './kit-version.js'\n\n/** Figlet \"big\" font — spells WoodsCLI (not WoodsPortal). */\nexport const WOODSCLI_ASCII_BANNER = `\n __ __ _ _____ _ _____ \n \\\\ \\\\ / / | | / ____| | |_ _|\n \\\\ \\\\ /\\\\ / /__ ___ __| |___| | | | | | \n \\\\ \\\\/ \\\\/ / _ \\\\ / _ \\\\ / _\\` / __| | | | | | \n \\\\ /\\\\ / (_) | (_) | (_| \\\\__ \\\\ |____| |____ _| |_ \n \\\\/ \\\\/ \\\\___/ \\\\___/ \\\\__,_|___/\\\\_____|______|_____|\n`.trimEnd()\n\nconst RULE = '──────────────────────────────────────────────────────────────────────────────'\n\nexport function shouldPrintCliBanner(global: GlobalCliOptions): boolean {\n if (global.json || global.quiet || global.ci || global.dryRun) {\n return false\n }\n return process.stdout.isTTY === true\n}\n\nfunction useCliColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false\n if (process.env.CI === 'true') return false\n return process.stdout.isTTY === true\n}\n\nexport function formatProjectLabel(config: WoodsPortalHsConfig): string {\n if (isThemeProject(config)) {\n return `${config.theme?.name ?? 'theme'} · theme-starter`\n }\n\n const router = config.scaffold?.router\n const routerNote =\n router && router !== 'hash' ? ` · router ${router}` : ' · hash router'\n\n return `${config.module.name} · ${config.projectType}${routerNote}`\n}\n\nexport type DevBannerOptions = {\n config: WoodsPortalHsConfig\n port: number\n global: GlobalCliOptions\n version?: string\n}\n\nfunction section(color: boolean, title: string, body: string): string {\n const bold = (text: string) => (color ? pc.bold(text) : text)\n return ` ${bold(title)}\\n${body}`\n}\n\n/** Branded startup banner for `wp dev` — matches client-sdk dev-watch layout. */\nexport function printWoodsCliDevBanner(options: DevBannerOptions): void {\n if (!shouldPrintCliBanner(options.global)) {\n return\n }\n\n const color = useCliColor()\n const cyan = (text: string) => (color ? pc.cyan(text) : text)\n const dim = (text: string) => (color ? pc.dim(text) : text)\n const bold = (text: string) => (color ? pc.bold(text) : text)\n const yellow = (text: string) => (color ? pc.yellow(text) : text)\n\n const version = options.version ?? readKitVersion()\n const project = formatProjectLabel(options.config)\n const isTheme = isThemeProject(options.config)\n const localUrl = `http://localhost:${options.port}/`\n const docsRoot = 'node_modules/@woodsportal/hubspot-kit/docs'\n\n const header = [\n color\n ? WOODSCLI_ASCII_BANNER.split('\\n')\n .map((line) => cyan(bold(line)))\n .join('\\n')\n : WOODSCLI_ASCII_BANNER,\n ` ${bold('HubSpot kit')}${dim(` v${version}`)} ${yellow('· dev')}`,\n ].join('\\n')\n\n const outputLine = isTheme\n ? ' Vite HMR + theme field overlay (Ctrl+Shift+Z)'\n : ' Vite HMR + module-config overlay (Ctrl+Shift+Z)'\n\n const quickChecks = isTheme\n ? ` wp doctor prerequisites + HubSpot CLI\n wp dev alias: wp local\n wp upload cms theme upload`\n : ` wp doctor prerequisites + HubSpot CLI\n wp setup copy missing config / .env templates\n wp build module.js / CDN (tier defaults dev)\n wp upload cms module upload`\n\n const tips = [\n dim(RULE),\n section(color, 'Output', ` ${outputLine}`),\n '',\n section(color, 'Project', ` ${project}`),\n '',\n section(color, 'Preview', ` ${color ? cyan(localUrl) : localUrl}`),\n '',\n section(\n color,\n 'Overlay',\n ` Ctrl+Shift+Z ${isTheme ? 'theme' : 'module'} fields ${dim('(Mac ⌃⇧Z)')}`,\n ),\n '',\n section(\n color,\n 'Workspace',\n ` ${dim('.wphs/')} · ${options.config.dev.fieldsJson}`,\n ),\n '',\n section(color, 'Quick checks', `\\n${quickChecks}`),\n '',\n section(\n color,\n 'Docs',\n ` ${docsRoot}/CLI-REFERENCE.md · ${docsRoot}/MODULES.md`,\n ),\n dim(RULE),\n ].join('\\n')\n\n process.stdout.write(`\\n${header}\\n\\n${tips}\\n\\n`)\n process.stdout.write(`${dim('Starting Vite dev…')}\\n\\n`)\n}\n","import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { getKitRoot } from './paths.js'\n\nlet cachedVersion: string | null = null\n\nexport function readKitVersion(): string {\n if (cachedVersion) {\n return cachedVersion\n }\n\n try {\n const pkg = JSON.parse(readFileSync(resolve(getKitRoot(), 'package.json'), 'utf8')) as {\n version?: string\n }\n cachedVersion = pkg.version ?? '0.0.0'\n } catch {\n cachedVersion = '0.0.0'\n }\n\n return cachedVersion\n}\n","export type BuildTier = 'dev' | 'stg' | 'prod'\n\n/** Default tier for wp build / deploy / publish / upload / watch */\nexport const DEFAULT_BUILD_TIER: BuildTier = 'dev'\n\nexport function parseBuildTier(value: string | undefined): BuildTier {\n if (value === 'dev' || value === 'stg' || value === 'prod') return value\n return DEFAULT_BUILD_TIER\n}\n","import { printWoodsCliDevBanner } from '../../lib/cli-banner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScriptLongRunning } from '../../lib/exec.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { nodeLoaderInteropWarning } from '../../lib/node-loader-interop.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { resolveProjectViteSpawn } from '../../vite/resolve-dev-config.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DevOptions = {\n port?: number\n}\n\nexport async function runDev(ctx: CommandContext, options: DevOptions): Promise<number> {\n const port = options.port ?? 3000\n const nodeWarning = nodeLoaderInteropWarning()\n if (nodeWarning) {\n ctx.logger.warn(nodeWarning)\n }\n const env = {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n WP_HS_DEV_PORT: String(port),\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] node ${kitPath('scripts', 'run-dev.mjs')} (port ${port})`)\n return ExitCode.SUCCESS\n }\n\n if (!resolveProjectViteSpawn(ctx.projectRoot)) {\n throw new WpHsError('vite is not installed in this project.', {\n exitCode: ExitCode.PREREQUISITE,\n remediation:\n 'Run yarn install or npm install. If this is an older wp init project, add vite and peers to devDependencies (run wp init again or see @woodsportal/hubspot-kit templates).',\n })\n }\n\n printWoodsCliDevBanner({\n config: ctx.config,\n port,\n global: ctx.global,\n })\n\n setImmediate(() => ensureHubSpotCliSetup(ctx, 'local'))\n\n return runNodeScriptLongRunning(kitPath('scripts', 'run-dev.mjs'), [], {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: false,\n projectRoot: ctx.projectRoot,\n })\n}\n","import { resolve } from 'node:path'\n\nimport { bumpModuleBuildIdForCli } from '../../lib/module-build-id.js'\nimport { formatProjectLabel } from '../../lib/cli-banner.js'\nimport { ExitCode } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { printCommandDone, runCliTasks, shouldQuietSubprocess, type CliTask } from '../../lib/cli-spinner.js'\nimport { runNodeScriptAsync } from '../../lib/exec.js'\nimport { mergeProjectEnv } from '../../lib/project-env-files.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport { isThemeProject, usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport { runBuild } from './build.js'\nimport { runUpload } from './upload.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DeployOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n skipPublish?: boolean\n skipUpload?: boolean\n progress?: boolean\n}\n\nexport async function runDeploy(ctx: CommandContext, options: DeployOptions): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const skipUpload =\n options.skipUpload ||\n process.env.PORTAL_MODULE_GIT_ONLY === '1' ||\n process.env.PORTAL_MODULE_GIT_ONLY === 'true'\n const intro = `${formatProjectLabel(ctx.config)} · deploy (${tier})`\n const quietSubprocess = shouldQuietSubprocess(ctx, options)\n const nested = {\n progress: false as const,\n quiet: true as const,\n quietSubprocess: true as const,\n }\n\n const useCdn = usesCdnPipeline(ctx.config) && !isThemeProject(ctx.config)\n\n let baseEnv = mergeProjectEnv(ctx.projectRoot, {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n ...(quietSubprocess ? { WP_HS_QUIET_BUILD: '1' } : {}),\n })\n\n let buildIdBumped = false\n if (\n useCdn &&\n !ctx.global.noBump &&\n !baseEnv.PORTAL_BUILD_ID?.trim() &&\n !baseEnv.MODULE_BUILD_ID?.trim() &&\n !baseEnv.GITHUB_REF_NAME?.trim()\n ) {\n const bump = bumpModuleBuildIdForCli(ctx.projectRoot, {\n tier,\n dryRun: ctx.global.dryRun,\n env: baseEnv,\n })\n baseEnv = {\n ...baseEnv,\n PORTAL_BUILD_ID: bump.id,\n MODULE_BUILD_ID: bump.id,\n }\n buildIdBumped = bump.bumped\n if (!ctx.global.quiet && !ctx.global.json && bump.bumped) {\n ctx.logger.info(`Module build id → ${bump.id}`)\n }\n }\n\n const execOpts = {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n env: baseEnv,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n }\n\n if (!skipUpload) {\n ensureHubSpotCliSetup(ctx, 'cms')\n }\n\n const verifyFlag =\n tier === 'prod' ? ['--prod'] : tier === 'stg' ? ['--stg'] : ['--dev']\n const tasks: CliTask[] = []\n\n if (!skipUpload) {\n tasks.push({\n title: 'Checking HubSpot CLI',\n task: async () => {\n ensureHubSpotCliSetup(ctx, 'cms')\n },\n })\n }\n\n if (useCdn) {\n tasks.push({\n title: `Building CDN (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, cdnOnly: true, buildIdBumped, env: baseEnv, ...nested })\n },\n })\n\n if (!options.skipPublish) {\n tasks.push({\n title: `Verifying CDN API (${tier})`,\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'verify-cdn-api-endpoint.mjs'), verifyFlag, execOpts)\n },\n })\n tasks.push({\n title: `Publishing CDN to GitHub (${tier})`,\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'publish-cdn-github.mjs'), [], execOpts)\n },\n })\n }\n\n tasks.push({\n title: `Building HubSpot module (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, hubspotOnly: true, env: baseEnv, ...nested })\n },\n })\n } else {\n tasks.push({\n title: `Building module (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, ...nested })\n },\n })\n }\n\n tasks.push(\n {\n title: 'Running bundle checks',\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'check-hubspot-bundle-size.mjs'), [], execOpts)\n await runNodeScriptAsync(kitPath('scripts', 'write-audit-artifacts.mjs'), [], execOpts)\n },\n },\n )\n\n if (!skipUpload) {\n tasks.push({\n title: 'Uploading to HubSpot',\n task: async () => {\n await runUpload(ctx, {\n tier,\n ...nested,\n skipPrereqCheck: true,\n })\n },\n })\n } else if (!ctx.global.quiet && !ctx.global.json) {\n ctx.logger.info('Skipping HubSpot upload (module git push / PORTAL_MODULE_GIT_ONLY)')\n }\n\n await runCliTasks(ctx, tasks, {\n ...options,\n intro,\n })\n\n if (!ctx.global.json) {\n printCommandDone(\n ctx,\n `Deploy complete (${resolve(ctx.projectRoot, ctx.config.module.outDir)} → ${ctx.config.module.uploadPath})`,\n )\n }\n return ExitCode.SUCCESS\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** Gitignored secrets + machine-local overrides (never committed). */\nexport const ENV_LOCAL_FILE = '.env.local'\n\nconst ENV_GITIGNORE_LINES = ['.env', '.env.*', '!.env*.example', ENV_LOCAL_FILE]\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {}\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eq = trimmed.indexOf('=')\n if (eq <= 0) continue\n const key = trimmed.slice(0, eq).trim()\n let value = trimmed.slice(eq + 1).trim()\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n result[key] = value\n }\n return result\n}\n\nexport function readEnvLocal(projectRoot: string): Record<string, string> {\n const path = resolve(projectRoot, ENV_LOCAL_FILE)\n if (!existsSync(path)) return {}\n return parseEnvFile(readFileSync(path, 'utf8'))\n}\n\nexport function formatEnvLocal(entries: Record<string, string>): string {\n const lines = [\n '# Local secrets — gitignored. Created by wp init / wp setup (hybrid CDN).',\n '# PORTAL_CDN_PUBLISH_TOKEN needs repo push on your portal.cdn.json mirror.',\n '',\n ]\n for (const [key, value] of Object.entries(entries)) {\n if (value.includes(' ') || value.includes('#')) {\n lines.push(`${key}=\"${value.replace(/\"/g, '\\\\\"')}\"`)\n } else {\n lines.push(`${key}=${value}`)\n }\n }\n return `${lines.join('\\n').trimEnd()}\\n`\n}\n\nexport function writeEnvLocal(projectRoot: string, entries: Record<string, string>): void {\n const path = resolve(projectRoot, ENV_LOCAL_FILE)\n const existing = existsSync(path) ? parseEnvFile(readFileSync(path, 'utf8')) : {}\n writeFileSync(path, formatEnvLocal({ ...existing, ...entries }))\n}\n\nexport function mergeProjectEnv(\n projectRoot: string,\n base: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const local = readEnvLocal(projectRoot)\n const merged = { ...base }\n for (const [key, value] of Object.entries(local)) {\n if (merged[key] == null || merged[key] === '') {\n merged[key] = value\n }\n }\n return merged\n}\n\nexport function ensureEnvFilesGitignore(projectRoot: string): void {\n const gitignorePath = resolve(projectRoot, '.gitignore')\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf8') : ''\n const toAppend = ENV_GITIGNORE_LINES.filter((line) => !existing.includes(line)).join('\\n')\n if (!toAppend) return\n writeFileSync(gitignorePath, `${existing.trimEnd()}\\n\\n# Env files (secrets)\\n${toAppend}\\n`)\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { runCommandAsync } from '../../lib/exec.js'\nimport { isThemeProject } from '../../schema/woodsportal-hs.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport type { CommandContext } from '../context.js'\n\nexport type UploadOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n progress?: boolean\n /** Suppress success line (e.g. when called from deploy) */\n quiet?: boolean\n /** Skip HubSpot CLI check when a parent command already verified */\n skipPrereqCheck?: boolean\n}\n\nasync function uploadModuleOrTheme(ctx: CommandContext): Promise<string> {\n if (isThemeProject(ctx.config)) {\n const theme = ctx.config.theme\n if (!theme) {\n throw new WpHsError('theme block missing in woodscli.json', { exitCode: ExitCode.USER_ERROR })\n }\n const srcDir = resolve(ctx.projectRoot, theme.srcDir)\n await runCommandAsync('hs', ['cms', 'upload', srcDir, theme.uploadPath], {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n })\n return `Uploaded theme ${srcDir} → ${theme.uploadPath}`\n }\n\n const outDir = resolve(ctx.projectRoot, ctx.config.module.outDir)\n const uploadPath = ctx.config.module.uploadPath\n await runCommandAsync('hs', ['cms', 'upload', outDir, uploadPath], {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n })\n return `Uploaded ${outDir} → ${uploadPath}`\n}\n\nexport async function runUpload(ctx: CommandContext, options: UploadOptions = {}): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n\n if (tier === 'prod' && !ctx.global.yes && !ctx.global.ci) {\n const confirmed = process.env.WP_HS_CONFIRM_PROD === '1'\n if (!confirmed) {\n throw new WpHsError('Production upload blocked — pass --yes or set WP_HS_CONFIRM_PROD=1', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp upload --tier prod --yes',\n })\n }\n }\n\n if (!options.skipPrereqCheck) {\n ensureHubSpotCliSetup(ctx, 'cms')\n }\n\n try {\n let successMessage = ''\n\n await runCliTasks(\n ctx,\n [\n {\n title: isThemeProject(ctx.config) ? 'Uploading theme to HubSpot' : 'Uploading module to HubSpot',\n task: async () => {\n successMessage = await uploadModuleOrTheme(ctx)\n },\n },\n ],\n options,\n )\n\n if (!ctx.global.json && !options.quiet) {\n printCommandDone(ctx, successMessage)\n }\n return ExitCode.SUCCESS\n } catch (error) {\n const detail =\n error instanceof WpHsError\n ? error.message\n : error instanceof Error\n ? error.message\n : String(error)\n throw new WpHsError(\n detail.includes('HubSpot upload failed') ? detail : `HubSpot upload failed\\n${detail}`,\n {\n exitCode: ExitCode.PUBLISH_FAILED,\n cause: error,\n remediation: 'Run wp auth, then build the module before upload.',\n },\n )\n }\n}\n","import { formatProjectLabel } from '../../lib/cli-banner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { printCommandDone, runCliTasks, shouldQuietSubprocess } from '../../lib/cli-spinner.js'\nimport { runNodeScriptAsync } from '../../lib/exec.js'\nimport { mergeProjectEnv } from '../../lib/project-env-files.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport { usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type PublishOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n dryRun?: boolean\n progress?: boolean\n /** Suppress ◆ CDN publish complete (nested deploy). */\n quiet?: boolean\n quietSubprocess?: boolean\n}\n\nexport async function runPublish(ctx: CommandContext, options: PublishOptions): Promise<number> {\n if (!usesCdnPipeline(ctx.config)) {\n throw new WpHsError('This project does not use the CDN pipeline.', {\n exitCode: ExitCode.USER_ERROR,\n remediation:\n 'module-monolith / cdn.mode none: use wp build && wp upload (or wp deploy without CDN publish).',\n })\n }\n\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const quietSubprocess = shouldQuietSubprocess(ctx, options)\n const env = mergeProjectEnv(ctx.projectRoot, {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n ...(quietSubprocess ? { WP_HS_QUIET_BUILD: '1' } : {}),\n })\n const execOpts = {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun || options.dryRun,\n streamOutput: ctx.global.verbose,\n }\n\n const verifyFlag =\n tier === 'prod' ? ['--prod'] : tier === 'stg' ? ['--stg'] : ['--dev']\n const publishArgs = options.dryRun ? ['--dry-run'] : []\n\n try {\n await runCliTasks(\n ctx,\n [\n {\n title: `Verifying CDN API endpoint (${tier})`,\n task: async () => {\n if (options.dryRun) return\n await runNodeScriptAsync(kitPath('scripts', 'verify-cdn-api-endpoint.mjs'), verifyFlag, execOpts)\n },\n },\n {\n title: options.dryRun\n ? `CDN publish dry-run (${tier})`\n : `Publishing CDN to GitHub (${tier})`,\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'publish-cdn-github.mjs'), publishArgs, execOpts)\n },\n },\n ],\n {\n ...options,\n intro: options.quiet ? undefined : `${formatProjectLabel(ctx.config)} · CDN publish (${tier})`,\n },\n )\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'publish', tier, dryRun: Boolean(options.dryRun), ok: true })\n } else if (!options.quiet) {\n printCommandDone(\n ctx,\n options.dryRun ? 'CDN publish dry-run complete' : 'CDN publish complete',\n )\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.PUBLISH_FAILED,\n remediation: 'Check CDN PAT, portal.cdn.json, and verify-cdn-api-endpoint.',\n })\n }\n}\n","import { createHash } from 'node:crypto'\nimport { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { defaultBaselineDir } from '../../lib/wphs-baseline.js'\nimport type { CommandContext } from '../context.js'\n\nconst FORBIDDEN_SHIP_TOKENS = [\n 'ModuleConfigOverlay',\n 'module-config-store',\n '__dev/module-config',\n 'src/dev/module-config',\n 'dev.module-config',\n]\n\n/** Localhost fixture menu labels — must not ship in CDN app bundles. */\nconst FORBIDDEN_FIXTURE_MENU_TOKENS = ['User Home', 'Primary Company Deals']\n\nfunction hashFile(path: string): string {\n return createHash('sha256').update(readFileSync(path)).digest('hex')\n}\n\nfunction walkFiles(dir: string): string[] {\n if (!existsSync(dir)) return []\n const entries = readdirSync(dir)\n const files: string[] = []\n for (const entry of entries) {\n const full = join(dir, entry)\n if (statSync(full).isDirectory()) {\n files.push(...walkFiles(full))\n } else {\n files.push(full)\n }\n }\n return files\n}\n\nexport async function runAuditShipBundle(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const targets = [\n resolve(root, 'dist/cdn'),\n resolve(root, ctx.config.module.outDir),\n ]\n\n const violations: string[] = []\n\n for (const dir of targets) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(js|css|html)$/i.test(file)) continue\n const content = readFileSync(file, 'utf8')\n for (const token of FORBIDDEN_SHIP_TOKENS) {\n if (content.includes(token)) {\n violations.push(`${file}: contains forbidden token \"${token}\"`)\n }\n }\n const isCdnAppBundle = /[/\\\\]dist[/\\\\]cdn[/\\\\]app\\..*\\.js$/i.test(file)\n if (isCdnAppBundle) {\n for (const token of FORBIDDEN_FIXTURE_MENU_TOKENS) {\n if (content.includes(token)) {\n violations.push(`${file}: contains fixture menu marker \"${token}\"`)\n }\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:ship-bundle', ok: violations.length === 0, violations })\n } else if (violations.length === 0) {\n ctx.logger.success('Ship bundle audit passed')\n } else {\n for (const v of violations) ctx.logger.error(v)\n }\n\n if (violations.length > 0) {\n throw new WpHsError('Ship bundle audit failed — dev tooling leaked into production artifacts', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Ensure dev-only code is not imported in production build graph.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n\nexport type ParityOptions = {\n baselineDir?: string\n}\n\nexport type BaselineOptions = {\n baselineDir?: string\n}\n\nexport async function runAuditBaselineCapture(\n ctx: CommandContext,\n options: BaselineOptions,\n): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const sources = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would capture baseline to ${baseline}`)\n return ExitCode.SUCCESS\n }\n\n for (const { label, path } of sources) {\n if (!existsSync(path)) {\n throw new WpHsError(`Cannot capture baseline — missing ${path}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp build before wp audit baseline --capture.',\n })\n }\n const target = resolve(baseline, label)\n rmSync(target, { recursive: true, force: true })\n mkdirSync(baseline, { recursive: true })\n cpSync(path, target, { recursive: true })\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:baseline', ok: true, baseline })\n } else {\n ctx.logger.success(`Baseline captured at ${baseline}`)\n }\n\n return ExitCode.SUCCESS\n}\n\nexport async function runAuditParity(ctx: CommandContext, options: ParityOptions): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const currentDirs = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n const mismatches: string[] = []\n\n for (const { label, path } of currentDirs) {\n const baselinePath = resolve(baseline, label)\n if (!existsSync(baselinePath)) {\n ctx.logger.warn(`No baseline at ${baselinePath} — skipping ${label} parity`)\n continue\n }\n\n const baselineFiles = walkFiles(baselinePath).filter((f) => !f.endsWith('.map'))\n const currentFiles = walkFiles(path).filter((f) => !f.endsWith('.map'))\n\n const baselineNames = new Set(baselineFiles.map((f) => f.replace(baselinePath, '')))\n const currentNames = new Set(currentFiles.map((f) => f.replace(path, '')))\n\n for (const name of baselineNames) {\n if (!currentNames.has(name)) {\n mismatches.push(`missing file: ${label}${name}`)\n }\n }\n\n for (const file of baselineFiles) {\n const rel = file.replace(baselinePath, '')\n const current = resolve(path, rel.slice(1))\n if (!existsSync(current)) continue\n const bh = hashFile(file)\n const ch = hashFile(current)\n if (bh !== ch) {\n mismatches.push(`hash mismatch: ${label}${rel}`)\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:parity', ok: mismatches.length === 0, mismatches })\n } else if (mismatches.length === 0) {\n ctx.logger.success('Parity audit passed (or no baseline configured)')\n } else {\n for (const m of mismatches) ctx.logger.error(m)\n }\n\n if (mismatches.length > 0) {\n throw new WpHsError('Parity audit failed', { exitCode: ExitCode.AUDIT_FAILED })\n }\n\n return ExitCode.SUCCESS\n}\n\nconst SECRET_PATTERNS = [\n /(?:api[_-]?key|secret|password|token|private[_-]?key)\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/gi,\n /sk_live_[a-zA-Z0-9]{16,}/g,\n /pat-[a-z]{2}-[a-f0-9-]{20,}/gi,\n]\n\nexport async function runAuditSecrets(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const scanRoots = ['src', 'public', '.wphs/config'].map((d) => resolve(root, d))\n const findings: string[] = []\n\n for (const dir of scanRoots) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(ts|tsx|js|jsx|json|env|yml|yaml|html)$/i.test(file)) continue\n if (file.includes('node_modules')) continue\n const content = readFileSync(file, 'utf8')\n for (const pattern of SECRET_PATTERNS) {\n pattern.lastIndex = 0\n if (pattern.test(content)) {\n findings.push(`${file}: possible secret pattern matched`)\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:secrets', ok: findings.length === 0, findings })\n } else if (findings.length === 0) {\n ctx.logger.success('Secrets audit passed')\n } else {\n for (const f of findings) ctx.logger.error(f)\n }\n\n if (findings.length > 0) {\n throw new WpHsError('Secrets audit found potential credentials in source files', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Move secrets to env vars; never commit PATs or API keys.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { templateDevDependencies } from '../../lib/template-dev-deps.js'\nimport { DEFAULT_WOODSPORTAL_HS, type WoodsPortalHsConfig } from '../../schema/woodsportal-hs.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport {\n applyRouterScaffold,\n isModuleTemplate,\n type RouterScaffoldMode,\n} from '../../lib/init-router-scaffold.js'\nimport {\n applyCdnGitHubSetup,\n formatCdnSetupNote,\n githubDefaultForPrompt,\n needsCdnGitHubSetup,\n promptCdnGitHubSetup,\n} from '../../lib/cdn-github-setup.js'\nimport { copySharedSetupExamples } from '../../lib/project-setup.js'\nimport { TEMPLATE_SCRIPTS } from '../../lib/template-scripts.js'\nimport type { CommandContext } from '../context.js'\n\nexport type InitOptions = {\n template?: 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\n /** Full target directory (skips name prompt when set). */\n directory?: string\n /** Project slug — creates `<parent>/<name>/` (default parent: cwd). */\n name?: string\n /** Client routing: hash (client-frontend default), browser, or none */\n router?: RouterScaffoldMode\n /** Public GitHub CDN mirror org/repo (hybrid CDN; CI / non-interactive) */\n cdnGithub?: string\n}\n\nimport {\n moduleOutDirFromSlug,\n normalizeProjectName,\n validateProjectName,\n} from '../../lib/project-name.js'\n\nfunction buildConfigForProject(\n template: InitOptions['template'],\n projectName: string,\n router?: RouterScaffoldMode,\n): WoodsPortalHsConfig {\n const base = { ...DEFAULT_WOODSPORTAL_HS, projectType: template! }\n\n if (template === 'theme-starter') {\n return {\n ...base,\n theme: {\n name: projectName,\n uploadPath: `themes/${projectName}`,\n srcDir: 'src/theme',\n themeJson: 'src/theme/theme.json',\n },\n }\n }\n\n const config: WoodsPortalHsConfig = {\n ...base,\n module: {\n name: projectName,\n uploadPath: `dw-modules/${projectName}.module`,\n outDir: moduleOutDirFromSlug(projectName),\n },\n cdn: {\n ...base.cdn,\n mode: template === 'module-monolith' ? 'none' : base.cdn.mode,\n },\n }\n\n if (isModuleTemplate(template!) && router) {\n config.scaffold = { router }\n }\n\n return config\n}\n\nfunction assertTargetDirIsScaffoldable(targetDir: string): void {\n if (!existsSync(targetDir)) return\n\n const entries = readdirSync(targetDir).filter((entry) => entry !== '.DS_Store')\n if (entries.length > 0) {\n throw new WpHsError(`Target directory is not empty: ${targetDir}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Choose a different project name or remove existing files.',\n })\n }\n}\n\nfunction resolveInitTargetDir(options: InitOptions, interactiveName?: string): string {\n if (options.directory) {\n return resolve(options.directory)\n }\n\n const parentDir = process.cwd()\n const slug = options.name ?? interactiveName\n if (!slug) {\n throw new WpHsError('Project name is required', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run interactively, or pass --name my-project (or --directory ./my-project).',\n })\n }\n\n const error = validateProjectName(slug)\n if (error) {\n throw new WpHsError(error, { exitCode: ExitCode.USER_ERROR })\n }\n\n return resolve(parentDir, slug)\n}\n\nexport async function runInit(ctx: CommandContext, options: InitOptions): Promise<number> {\n const nonInteractive = ctx.global.ci || ctx.global.yes || ctx.global.json\n\n let template = options.template\n let projectName = options.name ? normalizeProjectName(options.name) : undefined\n let router = options.router\n\n if (!nonInteractive) {\n if (!template) {\n const type = await p.select({\n message: 'Project type',\n options: [\n {\n value: 'module-hybrid-cdn',\n label: 'Module (hybrid CDN)',\n hint: 'jsDelivr + thin module.js',\n },\n { value: 'module-monolith', label: 'Module (monolith)', hint: 'Single module.js IIFE' },\n { value: 'theme-starter', label: 'Theme starter', hint: 'CMS theme templates' },\n ],\n })\n if (p.isCancel(type)) throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n template = type as InitOptions['template']\n }\n\n if (!options.directory && !projectName) {\n const nameAnswer = await p.text({\n message: 'Project name (folder name)',\n placeholder: 'my-portal-module',\n validate: (value) => validateProjectName(normalizeProjectName(value ?? '')),\n })\n if (p.isCancel(nameAnswer)) {\n throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n projectName = normalizeProjectName(nameAnswer)\n }\n\n if (!router && template && isModuleTemplate(template)) {\n const routerAnswer = await p.select({\n message: 'Client-side routing',\n initialValue: 'hash',\n options: [\n {\n value: 'hash',\n label: 'Hash history (recommended)',\n hint: 'Same as woodsportal-client-frontend — works in HubSpot CMS embeds',\n },\n {\n value: 'browser',\n label: 'Browser history',\n hint: 'Clean /guide URLs for local dev (not for HubSpot iframe embeds)',\n },\n {\n value: 'none',\n label: 'No router',\n hint: 'Single-page starter — add TanStack Router later',\n },\n ],\n })\n if (p.isCancel(routerAnswer)) {\n throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n router = routerAnswer as RouterScaffoldMode\n }\n }\n\n if (!template) {\n template = 'module-hybrid-cdn'\n }\n\n if (!router && isModuleTemplate(template)) {\n router = 'hash'\n }\n\n const targetDir = resolveInitTargetDir(options, projectName)\n const slug = projectName ?? basename(targetDir)\n assertTargetDirIsScaffoldable(targetDir)\n\n const templateDir = kitPath('templates', template)\n if (!existsSync(templateDir)) {\n throw new WpHsError(`Template not found: ${template}`, { exitCode: ExitCode.USER_ERROR })\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would scaffold ${template} in ${targetDir}`)\n return ExitCode.SUCCESS\n }\n\n mkdirSync(targetDir, { recursive: true })\n cpSync(templateDir, targetDir, { recursive: true })\n copySharedSetupExamples(targetDir)\n\n const config = buildConfigForProject(template, slug, router)\n writeFileSync(resolve(targetDir, WOODSCLI_CONFIG_FILE), `${JSON.stringify(config, null, 2)}\\n`)\n\n const pkgPath = resolve(targetDir, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n name?: string\n scripts?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n pkg.name = slug\n pkg.scripts = { ...pkg.scripts, ...TEMPLATE_SCRIPTS[template] }\n pkg.devDependencies = {\n ...pkg.devDependencies,\n ...templateDevDependencies(),\n }\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n }\n\n if (router && isModuleTemplate(template)) {\n applyRouterScaffold(targetDir, router, template)\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: targetDir,\n logger: ctx.logger,\n dryRun: false,\n })\n\n const gitignorePath = resolve(targetDir, '.gitignore')\n const gitignoreExtras = [\n 'hubspot.config.yml',\n '.wphs/config/module-config.local.json',\n '.wphs/assets/',\n '.wphs/cache/',\n '.wphs/audit/',\n '.wphs/state/',\n '.wphs/fixtures/hubspot-data.json',\n '.wphs/.kit-module-config',\n '.wphs/.kit-bootstrap.tsx',\n '.wphs/.kit-bootstrap-greenfield.tsx',\n ]\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf8') : ''\n const toAppend = gitignoreExtras.filter((line) => !existing.includes(line)).join('\\n')\n if (toAppend) {\n writeFileSync(gitignorePath, `${existing.trimEnd()}\\n${toAppend}\\n`)\n }\n\n if (template === 'module-hybrid-cdn' && !ctx.global.dryRun && needsCdnGitHubSetup(targetDir)) {\n const githubDefault = githubDefaultForPrompt(targetDir)\n let cdnSetup = null as Awaited<ReturnType<typeof promptCdnGitHubSetup>>\n\n if (nonInteractive) {\n if (options.cdnGithub) {\n cdnSetup = { github: options.cdnGithub }\n }\n } else {\n p.log.step('Hybrid CDN — GitHub mirror (public repo for jsDelivr)')\n cdnSetup = await promptCdnGitHubSetup({\n projectRoot: targetDir,\n githubDefault,\n github: options.cdnGithub,\n })\n }\n\n if (cdnSetup) {\n applyCdnGitHubSetup(targetDir, cdnSetup)\n if (!nonInteractive) {\n p.log.success(formatCdnSetupNote(targetDir))\n } else {\n ctx.logger.success(formatCdnSetupNote(targetDir))\n }\n }\n }\n\n if (!nonInteractive) {\n p.log.success(`Scaffolded ${template} in ${targetDir}`)\n p.note(`cd ${slug} && yarn install && wp setup && wp doctor && wp dev`, 'Getting started')\n } else {\n ctx.logger.success(`Scaffolded ${template} in ${targetDir}`)\n }\n\n return ExitCode.SUCCESS\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport type RouterScaffoldMode = 'hash' | 'browser' | 'none'\n\nconst ROUTER_FILES = [\n 'src/routes',\n 'src/routeTree.gen.ts',\n 'src/integrations/tanstack-router',\n 'src/config/routes.ts',\n 'src/config/router.ts',\n 'src/app.tsx',\n] as const\n\nconst TANSTACK_DEPS = ['@tanstack/react-router', '@tanstack/router-plugin'] as const\n\nexport function isModuleTemplate(template: string): boolean {\n return template === 'module-hybrid-cdn' || template === 'module-monolith'\n}\n\nexport function writeRouterConfig(targetDir: string, mode: Exclude<RouterScaffoldMode, 'none'>): void {\n const configDir = resolve(targetDir, 'src/config')\n mkdirSync(configDir, { recursive: true })\n writeFileSync(\n resolve(configDir, 'router.ts'),\n `/** Router history — set by \\`wp init\\`. Hash matches woodsportal-client-frontend (HubSpot CMS embeds). */\nexport type RouterHistoryMode = 'hash' | 'browser'\n\nexport const ROUTER_HISTORY: RouterHistoryMode = '${mode}'\n`,\n )\n}\n\nexport function writeMountDevPreviewRouter(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-dev-preview.tsx'),\n `import { mountGreenfieldDev } from '../../.wphs/.kit-bootstrap-greenfield.tsx'\n\nimport { App } from '@/app'\n\n/** Local dev: module-config overlay + routed starter preview. */\nexport async function mountDevPreview() {\n await mountGreenfieldDev({ preview: <App /> })\n}\n`,\n )\n}\n\nexport function writeMountDevPreviewSinglePage(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-dev-preview.tsx'),\n `import { mountGreenfieldDev } from '../../.wphs/.kit-bootstrap-greenfield.tsx'\n\nimport { StarterSinglePage } from '@/features/starter'\n\n/** Local dev: module-config overlay + single-page starter (no TanStack Router). */\nexport async function mountDevPreview() {\n await mountGreenfieldDev({ preview: <StarterSinglePage /> })\n}\n`,\n )\n}\n\nexport function writeMountPortalRouter(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-portal.tsx'),\n `import ReactDOM from 'react-dom/client'\n\nimport { App } from '@/app'\n\n/** Production mount — same App shell as woodsportal-client-frontend CDN app chunk. */\nexport async function mountPortal() {\n const root = document.getElementById('app')\n if (!root) {\n return\n }\n ReactDOM.createRoot(root).render(<App />)\n}\n`,\n )\n}\n\nexport function writeMountPortalSinglePage(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-portal.tsx'),\n `import ReactDOM from 'react-dom/client'\n\nimport { StarterSinglePage } from '@/features/starter'\n\n/** Production mount — single-page starter when router scaffold is \\`none\\`. */\nexport async function mountPortal() {\n const root = document.getElementById('app')\n if (!root) {\n return\n }\n ReactDOM.createRoot(root).render(<StarterSinglePage />)\n}\n`,\n )\n}\n\nexport function writeStarterSinglePage(targetDir: string): void {\n const file = resolve(targetDir, 'src/features/starter/components/starter-single-page.tsx')\n if (existsSync(file)) {\n return\n }\n writeFileSync(\n file,\n `import { StarterShell } from '@/components/layout/starter-shell'\n\nimport { StarterGuidePage } from './starter-guide-page'\nimport { StarterHome } from './starter-home'\n\n/** Single-page starter when \\`wp init --router none\\` (no TanStack Router). */\nexport function StarterSinglePage() {\n return (\n <StarterShell showNav={false}>\n <StarterHome />\n <div className=\"mx-auto max-w-4xl px-6 sm:px-10\">\n <hr className=\"my-10 border-[#cbd6e2]\" />\n </div>\n <StarterGuidePage />\n </StarterShell>\n )\n}\n`,\n )\n}\n\nfunction removePath(targetDir: string, relativePath: string): void {\n const full = resolve(targetDir, relativePath)\n if (!existsSync(full)) {\n return\n }\n rmSync(full, { recursive: true, force: true })\n}\n\nexport function stripTanStackFromPackage(targetDir: string): void {\n const pkgPath = resolve(targetDir, 'package.json')\n if (!existsSync(pkgPath)) {\n return\n }\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n devDependencies?: Record<string, string>\n }\n if (!pkg.devDependencies) {\n return\n }\n for (const dep of TANSTACK_DEPS) {\n delete pkg.devDependencies[dep]\n }\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n}\n\nexport function applyRouterScaffold(\n targetDir: string,\n mode: RouterScaffoldMode,\n template: string,\n): void {\n if (!isModuleTemplate(template)) {\n return\n }\n\n if (mode === 'none') {\n for (const relativePath of ROUTER_FILES) {\n removePath(targetDir, relativePath)\n }\n writeStarterSinglePage(targetDir)\n writeMountDevPreviewSinglePage(targetDir)\n writeMountPortalSinglePage(targetDir)\n stripTanStackFromPackage(targetDir)\n return\n }\n\n writeRouterConfig(targetDir, mode)\n writeMountDevPreviewRouter(targetDir)\n writeMountPortalRouter(targetDir)\n\n const featuresIndex = resolve(targetDir, 'src/features/starter/index.ts')\n if (existsSync(featuresIndex)) {\n let content = readFileSync(featuresIndex, 'utf8')\n if (!content.includes('StarterSinglePage')) {\n content = content.replace(\n \"export type { StarterPreviewValues } from './hooks/use-starter-preview'\\n\",\n \"export type { StarterPreviewValues } from './hooks/use-starter-preview'\\nexport { StarterSinglePage } from './components/starter-single-page'\\n\",\n )\n writeFileSync(featuresIndex, content)\n }\n }\n}\n\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nimport {\n ensureEnvFilesGitignore,\n ENV_LOCAL_FILE,\n readEnvLocal,\n writeEnvLocal,\n} from './project-env-files.js'\nimport { kitPath } from './paths.js'\n\nexport const PORTAL_CDN_PUBLISH_TOKEN_ENV = 'PORTAL_CDN_PUBLISH_TOKEN'\nexport const PORTAL_CDN_JSON = 'portal.cdn.json'\n\nexport type PortalCdnJson = {\n publishMode?: string\n github: string\n gitRemote: string\n cdnPathInRepo?: string\n defaultBranch?: string\n}\n\nexport type CdnGitHubSetupInput = {\n github: string\n token?: string\n}\n\nconst PLACEHOLDER_GITHUB = /your-org|your-portal-cdn-mirror/i\n\nexport function defaultPortalCdnJson(): PortalCdnJson {\n const examplePath = kitPath('templates', 'shared', 'portal.cdn.json.example')\n if (existsSync(examplePath)) {\n return JSON.parse(readFileSync(examplePath, 'utf8')) as PortalCdnJson\n }\n return {\n publishMode: 'jsdelivr',\n github: 'your-org/your-portal-cdn-mirror',\n gitRemote: 'https://github.com/your-org/your-portal-cdn-mirror.git',\n cdnPathInRepo: 'dist/cdn',\n defaultBranch: 'main',\n }\n}\n\nexport function readPortalCdnJson(projectRoot: string): PortalCdnJson | null {\n const path = resolve(projectRoot, PORTAL_CDN_JSON)\n if (!existsSync(path)) return null\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as PortalCdnJson\n } catch {\n return null\n }\n}\n\nexport function normalizeGithubSlug(input: string): string | null {\n const trimmed = input.trim().replace(/^https:\\/\\/github\\.com\\//, '').replace(/\\.git$/, '')\n const parts = trimmed.split('/').filter(Boolean)\n if (parts.length !== 2) return null\n return `${parts[0]}/${parts[1]}`\n}\n\nexport function portalCdnJsonFromGithub(github: string, base?: PortalCdnJson): PortalCdnJson {\n const slug = normalizeGithubSlug(github)\n if (!slug) {\n throw new Error(`Invalid GitHub repo — use org/repo (got \"${github}\")`)\n }\n return {\n publishMode: base?.publishMode ?? 'jsdelivr',\n github: slug,\n gitRemote: `https://github.com/${slug}.git`,\n cdnPathInRepo: base?.cdnPathInRepo ?? 'dist/cdn',\n defaultBranch: base?.defaultBranch ?? 'main',\n }\n}\n\nexport function hasCdnPublishToken(projectRoot: string): boolean {\n if (process.env[PORTAL_CDN_PUBLISH_TOKEN_ENV]?.trim()) return true\n if (process.env.GITHUB_TOKEN?.trim()) return true\n return Boolean(readEnvLocal(projectRoot)[PORTAL_CDN_PUBLISH_TOKEN_ENV]?.trim())\n}\n\nexport function hasConfiguredCdnGithubMirror(projectRoot: string): boolean {\n const config = readPortalCdnJson(projectRoot)\n const github = config?.github ?? ''\n return Boolean(github) && !PLACEHOLDER_GITHUB.test(github)\n}\n\nexport function githubDefaultForPrompt(projectRoot: string): string {\n const existing = readPortalCdnJson(projectRoot)\n if (existing?.github && !PLACEHOLDER_GITHUB.test(existing.github)) {\n return existing.github\n }\n return defaultPortalCdnJson().github\n}\n\nexport function needsCdnGitHubSetup(projectRoot: string): boolean {\n return !hasConfiguredCdnGithubMirror(projectRoot) || !hasCdnPublishToken(projectRoot)\n}\n\nexport function applyCdnGitHubSetup(projectRoot: string, input: CdnGitHubSetupInput): void {\n const existing = readPortalCdnJson(projectRoot) ?? defaultPortalCdnJson()\n const updated = portalCdnJsonFromGithub(input.github, existing)\n writeFileSync(resolve(projectRoot, PORTAL_CDN_JSON), `${JSON.stringify(updated, null, 2)}\\n`)\n\n if (input.token?.trim()) {\n writeEnvLocal(projectRoot, { [PORTAL_CDN_PUBLISH_TOKEN_ENV]: input.token.trim() })\n }\n\n ensureEnvFilesGitignore(projectRoot)\n}\n\nexport type PromptCdnGitHubOptions = {\n projectRoot?: string\n githubDefault?: string\n /** Pre-set from --cdn-github (CI); skips repo prompt */\n github?: string\n /** When true, skip all prompts */\n skip?: boolean\n}\n\nexport async function promptCdnGitHubSetup(\n options: PromptCdnGitHubOptions = {},\n): Promise<CdnGitHubSetupInput | null> {\n if (options.skip) return null\n\n const projectRoot = options.projectRoot ?? process.cwd()\n\n if (!needsCdnGitHubSetup(projectRoot)) {\n return null\n }\n\n let github = options.github?.trim()\n if (!github && hasConfiguredCdnGithubMirror(projectRoot)) {\n github = readPortalCdnJson(projectRoot)?.github\n }\n if (!github) {\n const answer = await p.text({\n message: 'Public GitHub CDN mirror (org/repo)',\n placeholder: options.githubDefault ?? 'your-org/your-portal-cdn-mirror',\n initialValue: options.githubDefault,\n validate: (value) => {\n const slug = normalizeGithubSlug(value ?? '')\n return slug ? undefined : 'Enter a public repo as org/repo (jsDelivr serves from it)'\n },\n })\n if (p.isCancel(answer)) return null\n github = normalizeGithubSlug(answer) ?? undefined\n }\n\n if (!github) return null\n\n if (hasCdnPublishToken(projectRoot)) {\n return { github }\n }\n\n const tokenAnswer = await p.password({\n message: 'GitHub token (repo push on CDN mirror)',\n validate: (value) => {\n if (!value?.trim()) return 'Required for wp publish — create a fine-grained PAT with Contents: Read and write'\n return undefined\n },\n })\n if (p.isCancel(tokenAnswer)) return null\n\n return { github, token: tokenAnswer.trim() }\n}\n\nexport function formatCdnSetupNote(_projectRoot?: string): string {\n return `CDN config written — edit ${PORTAL_CDN_JSON} if needed; token saved to ${ENV_LOCAL_FILE} (gitignored)`\n}\n","import { copyFileSync, existsSync, writeFileSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\n\nimport type { CommandContext } from '../cli/context.js'\nimport {\n HUBSPOT_CONFIG_EXAMPLE,\n HUBSPOT_CONFIG_FILE,\n} from './hubspot-cli-setup.js'\nimport { kitPath } from './paths.js'\nimport {\n isModuleProject,\n isThemeProject,\n usesCdnPipeline,\n type WoodsPortalHsConfig,\n} from '../schema/woodsportal-hs.js'\nimport type { BuildTier } from './build-tier.js'\n\nexport type SetupResult = {\n action: 'copied' | 'skipped' | 'manual'\n path: string\n detail: string\n}\n\ntype SetupOptions = {\n tier?: BuildTier\n dryRun?: boolean\n}\n\nfunction envFileForTier(tier: BuildTier): string {\n return tier === 'dev' ? '.env.dev' : tier === 'stg' ? '.env.stg' : '.env.prod'\n}\n\nfunction tiersToSetup(config: WoodsPortalHsConfig, tier?: BuildTier): BuildTier[] {\n if (tier) return [tier]\n return config.env.tiers\n}\n\nfunction firstExisting(paths: string[]): string | null {\n for (const path of paths) {\n if (existsSync(path)) return path\n }\n return null\n}\n\nfunction copyMissingFile(\n projectRoot: string,\n targetName: string,\n sourceCandidates: string[],\n dryRun: boolean,\n): SetupResult {\n const target = resolve(projectRoot, targetName)\n if (existsSync(target)) {\n return { action: 'skipped', path: targetName, detail: 'already present' }\n }\n\n const source = firstExisting(sourceCandidates)\n if (!source) {\n return {\n action: 'manual',\n path: targetName,\n detail: `no template found — create ${targetName} manually`,\n }\n }\n\n if (!dryRun) {\n copyFileSync(source, target)\n }\n\n const from = basename(source)\n return {\n action: 'copied',\n path: targetName,\n detail: dryRun ? `[dry-run] would copy ${from} → ${targetName}` : `copied ${from} → ${targetName}`,\n }\n}\n\nfunction writeMissingFile(\n projectRoot: string,\n targetName: string,\n content: string,\n dryRun: boolean,\n): SetupResult {\n const target = resolve(projectRoot, targetName)\n if (existsSync(target)) {\n return { action: 'skipped', path: targetName, detail: 'already present' }\n }\n\n if (!dryRun) {\n writeFileSync(target, content)\n }\n\n return {\n action: 'copied',\n path: targetName,\n detail: dryRun ? `[dry-run] would create ${targetName}` : `created ${targetName}`,\n }\n}\n\nfunction templateViteFiles(config: WoodsPortalHsConfig): string[] {\n if (isThemeProject(config)) return ['vite.config.dev.mjs']\n if (config.projectType === 'module-monolith') {\n return ['vite.config.dev.mjs', 'vite.config.monolith.mjs']\n }\n return ['vite.config.dev.mjs', 'vite.config.hubspot.mjs', 'vite.config.monolith.mjs']\n}\n\nfunction kitTemplateDir(config: WoodsPortalHsConfig): string {\n return kitPath('templates', config.projectType)\n}\n\nexport function applyProjectSetup(ctx: CommandContext, options: SetupOptions = {}): SetupResult[] {\n const { projectRoot, config } = ctx\n const dryRun = options.dryRun ?? false\n const results: SetupResult[] = []\n const sharedDir = kitPath('templates', 'shared')\n const templateDir = kitTemplateDir(config)\n\n // HubSpot CLI config\n results.push(\n copyMissingFile(projectRoot, HUBSPOT_CONFIG_FILE, [\n resolve(projectRoot, HUBSPOT_CONFIG_EXAMPLE),\n resolve(templateDir, HUBSPOT_CONFIG_EXAMPLE),\n kitPath('templates', HUBSPOT_CONFIG_EXAMPLE),\n ], dryRun),\n )\n\n // Localhost SPA env (not a WoodsCLI deploy tier)\n results.push(\n copyMissingFile(projectRoot, '.env.local', [\n resolve(projectRoot, '.env.local.example'),\n resolve(sharedDir, '.env.local.example'),\n ], dryRun),\n )\n\n // Env files (all tiers or single --tier)\n for (const tier of tiersToSetup(config, options.tier)) {\n const envFile = envFileForTier(tier)\n const envExample = `${envFile}.example`\n results.push(\n copyMissingFile(projectRoot, envFile, [\n resolve(projectRoot, envExample),\n resolve(sharedDir, envExample),\n ], dryRun),\n )\n }\n\n // CDN pipeline extras\n if (usesCdnPipeline(config) && !isThemeProject(config)) {\n const mirror = config.cdn.mirror\n results.push(\n copyMissingFile(projectRoot, mirror, [\n resolve(projectRoot, `${mirror}.example`),\n resolve(sharedDir, 'portal.cdn.json.example'),\n ], dryRun),\n )\n\n const buildIdFile = config.cdn.buildIdFile\n results.push(\n writeMissingFile(\n projectRoot,\n buildIdFile,\n '# Channel baseline for local CDN deploys (wp deploy auto-bumps per developer).\\n# Example resolved id: v0.0.1-dev.you.1\\nv0.0.1-dev\\n',\n dryRun,\n ),\n )\n }\n\n // Vite shims from project template\n for (const file of templateViteFiles(config)) {\n results.push(\n copyMissingFile(projectRoot, file, [resolve(templateDir, file)], dryRun),\n )\n }\n\n // Module adapter stub\n if (isModuleProject(config) && !isThemeProject(config)) {\n const adapter = config.dev.adapter\n const adapterPath = resolve(projectRoot, adapter)\n if (!existsSync(adapterPath)) {\n const templateAdapter = resolve(templateDir, 'wphs.adapter.ts')\n if (existsSync(templateAdapter)) {\n results.push(copyMissingFile(projectRoot, adapter, [templateAdapter], dryRun))\n } else {\n results.push({\n action: 'manual',\n path: adapter,\n detail: 'create wphs.adapter.ts (see docs/ADAPTER.md)',\n })\n }\n } else {\n results.push({ action: 'skipped', path: adapter, detail: 'already present' })\n }\n }\n\n return results\n}\n\n/** Copy shared env/hubspot examples into a freshly scaffolded project (init). */\nexport function copySharedSetupExamples(targetDir: string): void {\n const sharedDir = kitPath('templates', 'shared')\n if (!existsSync(sharedDir)) return\n\n for (const name of [\n '.env.local.example',\n '.env.dev.example',\n '.env.stg.example',\n '.env.prod.example',\n 'portal.cdn.json.example',\n ]) {\n const src = resolve(sharedDir, name)\n const dest = resolve(targetDir, name)\n if (existsSync(src) && !existsSync(dest)) {\n copyFileSync(src, dest)\n }\n }\n\n const hubspotExample = firstExisting([\n resolve(sharedDir, HUBSPOT_CONFIG_EXAMPLE),\n kitPath('templates', HUBSPOT_CONFIG_EXAMPLE),\n ])\n if (!hubspotExample) return\n const destHubspot = resolve(targetDir, HUBSPOT_CONFIG_EXAMPLE)\n if (!existsSync(destHubspot) && !existsSync(resolve(targetDir, HUBSPOT_CONFIG_FILE))) {\n copyFileSync(hubspotExample, destHubspot)\n }\n}\n\nexport function formatSetupHint(results: SetupResult[]): string | undefined {\n const hubspot = results.find((r) => r.path === HUBSPOT_CONFIG_FILE && r.action === 'copied')\n if (hubspot) {\n return `Edit ${HUBSPOT_CONFIG_FILE} — set portalId and personalAccessKey (https://app.hubspot.com/l/personal-access-key)`\n }\n\n const envCopied = results.some((r) => r.path.startsWith('.env.') && r.action === 'copied')\n if (envCopied) {\n return 'Edit .env.* files — set VITE_PUBLIC_REST_API_ENDPOINT and portal IDs for your environment'\n }\n\n const cdnMirror = results.find((r) => r.path === 'portal.cdn.json' && r.action === 'copied')\n if (cdnMirror) {\n return 'Hybrid CDN: set public GitHub mirror in portal.cdn.json; token in .env.local (wp init prompts)'\n }\n\n return undefined\n}\n","/** npm scripts merged into scaffolded package.json by wp init */\nexport const TEMPLATE_SCRIPTS: Record<string, Record<string, string>> = {\n 'module-hybrid-cdn': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:prod': 'wp build --tier prod',\n 'build:dev': 'wp build --tier dev',\n 'deploy:prod': 'wp deploy --tier prod --yes',\n 'deploy:dev': 'wp deploy --tier dev --yes',\n doctor: 'wp doctor',\n },\n 'module-monolith': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:dev': 'wp build --tier dev',\n 'build:prod': 'wp build --tier prod',\n 'deploy:dev': 'wp deploy --tier dev --yes',\n 'deploy:prod': 'wp deploy --tier prod --yes',\n watch: 'wp watch --rebuild',\n doctor: 'wp doctor',\n },\n 'theme-starter': {\n dev: 'wp dev',\n local: 'wp dev',\n doctor: 'wp doctor',\n },\n}\n\nexport type ModuleTemplateTrack = 'module-hybrid-cdn' | 'module-monolith'\n","const PROJECT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/\n\nexport function normalizeProjectName(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nexport function validateProjectName(name: string): string | undefined {\n if (!name) return 'Project name is required'\n if (!PROJECT_NAME_PATTERN.test(name)) {\n return 'Use lowercase letters, numbers, and hyphens (e.g. my-portal-module)'\n }\n if (name.length > 64) return 'Project name is too long (max 64 characters)'\n return undefined\n}\n\nexport function moduleOutDirFromSlug(slug: string): string {\n const pascal = slug\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n return `dist/${pascal || 'HubSpot'}.Module`\n}\n","import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport {\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nconst LEGACY_DIRS = ['.dev', '.woodsportal']\nconst LEGACY_BASELINE = '.wp-hs-baseline'\nconst LEGACY_BUILD_ID_FILE = '.portal-build-id'\nconst MODULE_BUILD_ID_FILE = '.module-build-id'\n\nfunction readFirstNonCommentLine(filePath: string): string | undefined {\n if (!existsSync(filePath)) return undefined\n const line = readFileSync(filePath, 'utf8')\n .split('\\n')\n .map((l) => l.trim())\n .find((l) => l.length > 0 && !l.startsWith('#'))\n return line || undefined\n}\n\nfunction stripToBaseline(raw: string | undefined): string | undefined {\n const line = raw?.trim()\n if (!line) return undefined\n const perDev = line.match(/^(v\\d+\\.\\d+\\.\\d+(?:-[a-z0-9]+)?)\\.[a-z0-9-]{1,12}\\.\\d+$/i)\n if (perDev) return perDev[1]\n const numericSuffix = line.match(/^(v\\d+\\.\\d+\\.\\d+(?:-[a-z0-9]+)?)\\.\\d+$/)\n if (numericSuffix) return numericSuffix[1]\n return line\n}\n\nexport type MigrateOptions = {\n yes?: boolean\n}\n\nexport async function runMigrate(ctx: CommandContext, _options: MigrateOptions = {}): Promise<number> {\n const root = ctx.projectRoot\n const wphsRoot = resolve(root, WPHS_WORKSPACE_DIR)\n const actions: string[] = []\n\n for (const legacy of LEGACY_DIRS) {\n const legacyPath = resolve(root, legacy)\n if (!existsSync(legacyPath)) continue\n\n actions.push(`Move ${legacy}/ → .wphs/`)\n if (ctx.global.dryRun) continue\n\n mkdirSync(join(wphsRoot, 'config'), { recursive: true })\n mkdirSync(join(wphsRoot, 'assets', 'branding'), { recursive: true })\n\n const localConfig = join(legacyPath, 'module-config.local.json')\n const exampleConfig = join(legacyPath, 'module-config.example.json')\n if (existsSync(localConfig)) {\n cpSync(localConfig, join(wphsRoot, 'config', 'module-config.local.json'))\n }\n if (existsSync(exampleConfig)) {\n cpSync(exampleConfig, join(wphsRoot, 'config', 'module-config.example.json'))\n }\n\n const branding = join(legacyPath, 'branding-assets')\n if (existsSync(branding)) {\n for (const file of readdirSync(branding)) {\n cpSync(join(branding, file), join(wphsRoot, 'assets', 'branding', file))\n }\n }\n\n rmSync(legacyPath, { recursive: true, force: true })\n }\n\n const legacyBaseline = resolve(root, LEGACY_BASELINE)\n const targetBaseline = join(wphsRoot, 'audit', 'baseline')\n if (existsSync(legacyBaseline)) {\n actions.push(`Move ${LEGACY_BASELINE}/ → .wphs/audit/baseline/`)\n if (!ctx.global.dryRun) {\n mkdirSync(targetBaseline, { recursive: true })\n cpSync(legacyBaseline, targetBaseline, { recursive: true })\n rmSync(legacyBaseline, { recursive: true, force: true })\n }\n }\n\n const legacyConfigPath = resolve(root, LEGACY_WOODSPORTAL_HS_FILE)\n const woodscliPath = resolve(root, WOODSCLI_CONFIG_FILE)\n\n if (existsSync(legacyConfigPath) && !existsSync(woodscliPath)) {\n actions.push(`Rename ${LEGACY_WOODSPORTAL_HS_FILE} → ${WOODSCLI_CONFIG_FILE}`)\n if (!ctx.global.dryRun) {\n renameSync(legacyConfigPath, woodscliPath)\n }\n } else if (existsSync(legacyConfigPath) && existsSync(woodscliPath)) {\n actions.push(`Remove duplicate ${LEGACY_WOODSPORTAL_HS_FILE}`)\n if (!ctx.global.dryRun) {\n rmSync(legacyConfigPath, { force: true })\n }\n }\n\n const legacyBuildIdPath = resolve(root, LEGACY_BUILD_ID_FILE)\n const moduleBuildIdPath = resolve(root, MODULE_BUILD_ID_FILE)\n if (existsSync(legacyBuildIdPath) && !existsSync(moduleBuildIdPath)) {\n const baseline = stripToBaseline(readFirstNonCommentLine(legacyBuildIdPath)) ?? 'v0.0.1-dev'\n actions.push(`Migrate ${LEGACY_BUILD_ID_FILE} → ${MODULE_BUILD_ID_FILE} (baseline ${baseline})`)\n if (!ctx.global.dryRun) {\n writeFileSync(\n moduleBuildIdPath,\n `# Channel baseline for local CDN deploys (wp deploy auto-bumps per developer).\\n${baseline}\\n`,\n )\n rmSync(legacyBuildIdPath, { force: true })\n }\n }\n\n if (existsSync(woodscliPath)) {\n const raw = JSON.parse(readFileSync(woodscliPath, 'utf8'))\n let configChanged = false\n if (raw?.dev?.moduleConfigDir && raw.dev.moduleConfigDir !== WPHS_WORKSPACE_DIR) {\n actions.push(`Update dev.moduleConfigDir → .wphs in project config`)\n if (!ctx.global.dryRun) {\n raw.dev.moduleConfigDir = WPHS_WORKSPACE_DIR\n configChanged = true\n }\n }\n if (raw?.cdn?.buildIdFile === LEGACY_BUILD_ID_FILE) {\n actions.push(`Update cdn.buildIdFile → ${MODULE_BUILD_ID_FILE}`)\n if (!ctx.global.dryRun) {\n raw.cdn.buildIdFile = MODULE_BUILD_ID_FILE\n configChanged = true\n }\n }\n if (configChanged && !ctx.global.dryRun) {\n writeFileSync(woodscliPath, `${JSON.stringify(raw, null, 2)}\\n`)\n }\n }\n\n if (actions.length === 0) {\n ctx.logger.success('Nothing to migrate — already on .wphs / woodscli.json')\n return ExitCode.SUCCESS\n }\n\n if (ctx.global.dryRun) {\n for (const action of actions) ctx.logger.info(`[dry-run] ${action}`)\n return ExitCode.SUCCESS\n }\n\n if (!ctx.global.yes && !ctx.global.ci) {\n throw new WpHsError('Migration requires --yes.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run: wp migrate --yes',\n })\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: root,\n logger: ctx.logger,\n dryRun: false,\n })\n\n for (const action of actions) ctx.logger.success(action)\n return ExitCode.SUCCESS\n}\n","import { readFileSync } from 'node:fs'\n\nimport { ExitCode } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type ExamplesListOptions = {\n track?: 'module' | 'theme'\n setup?: 'greenfield' | 'existing' | 'adopted'\n}\n\nexport type ExamplesSmokeOptions = {\n scenario?: string\n tier?: 'static' | 'live'\n}\n\ntype Scenario = {\n id: string\n setup: string\n track: string\n projectType?: string\n smokeTier: string\n fixture?: string\n checks?: string[]\n}\n\nfunction loadManifest() {\n const manifestPath = kitPath('examples', 'manifest.json')\n const raw = JSON.parse(readFileSync(manifestPath, 'utf8')) as { scenarios: Scenario[] }\n return raw.scenarios\n}\n\nexport async function runExamplesList(\n ctx: CommandContext,\n options: ExamplesListOptions = {},\n): Promise<number> {\n let scenarios = loadManifest()\n if (options.track) scenarios = scenarios.filter((s) => s.track === options.track)\n if (options.setup) scenarios = scenarios.filter((s) => s.setup === options.setup)\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:list', scenarios })\n } else {\n for (const s of scenarios) {\n ctx.logger.info(`${s.id} (${s.setup}/${s.track}) tier=${s.smokeTier}`)\n }\n }\n return ExitCode.SUCCESS\n}\n\nexport async function runExamplesSmoke(\n ctx: CommandContext,\n options: ExamplesSmokeOptions = {},\n): Promise<number> {\n const tier = options.tier ?? 'static'\n const args = ['--tier', tier]\n if (options.scenario) args.push('--scenario', options.scenario)\n\n const { runNodeScript } = await import('../../lib/exec.js')\n runNodeScript(kitPath('examples', 'smoke', 'run-matrix.mjs'), args, {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:smoke', tier, scenario: options.scenario ?? 'all', ok: true })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport type FieldsSyncOptions = {\n direction?: 'pull' | 'push'\n dryRun?: boolean\n}\n\nexport async function runFieldsSync(\n ctx: CommandContext,\n options: FieldsSyncOptions = {},\n): Promise<number> {\n const direction = options.direction ?? 'pull'\n const fieldsPath = resolve(ctx.projectRoot, ctx.config.dev.fieldsJson)\n const cacheDir = resolve(ctx.projectRoot, ctx.config.dev.moduleConfigDir, 'cache', 'fields-sync')\n const cachePath = resolve(cacheDir, 'fields.json')\n\n if (direction === 'pull') {\n if (!existsSync(fieldsPath)) {\n throw new WpHsError(`Missing ${ctx.config.dev.fieldsJson}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Add fields.json or run wp init.',\n })\n }\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would cache ${fieldsPath} → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n const { mkdirSync } = await import('node:fs')\n mkdirSync(cacheDir, { recursive: true })\n cpSync(fieldsPath, cachePath)\n ctx.logger.success(`Cached fields → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n\n if (!existsSync(cachePath)) {\n throw new WpHsError('No cached fields — run wp fields sync pull first.', {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would write ${cachePath} → ${fieldsPath}`)\n return ExitCode.SUCCESS\n }\n\n writeFileSync(fieldsPath, readFileSync(cachePath, 'utf8'))\n ctx.logger.success(`Restored fields from cache → ${fieldsPath}`)\n return ExitCode.SUCCESS\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\nimport { runConfigValidate } from './config-validate.js'\nimport { runDoctor } from './doctor.js'\n\nexport type RegressionSmokeOptions = {\n /** Skip doctor (e.g. when HubSpot CLI is not installed in CI) */\n skipDoctor?: boolean\n /** Fail if legacy consumer script shims are missing */\n checkLegacyShims?: boolean\n}\n\nconst LEGACY_SHIM_SCRIPTS = [\n 'build-cdn.mjs',\n 'run-vite-build.mjs',\n 'run-hubspot-module-postbuild.mjs',\n 'watch-hubspot.mjs',\n]\n\nconst FORBIDDEN_CONSUMER_PATHS = ['src/dev/module-config', 'src/dev/bootstrap.tsx']\n\nexport async function runRegressionSmoke(\n ctx: CommandContext,\n options: RegressionSmokeOptions = {},\n): Promise<number> {\n const failures: string[] = []\n const checks: { name: string; ok: boolean; detail?: string }[] = []\n\n if (!options.skipDoctor) {\n const doctorCode = await runDoctor(ctx)\n const doctorOk = doctorCode === ExitCode.SUCCESS\n checks.push({ name: 'doctor', ok: doctorOk })\n if (!doctorOk) failures.push('wp doctor failed')\n }\n\n const validateCode = await runConfigValidate(ctx)\n const validateOk = validateCode === ExitCode.SUCCESS\n checks.push({ name: 'config-validate', ok: validateOk })\n if (!validateOk) failures.push('wp config validate failed')\n\n if (options.checkLegacyShims !== false) {\n for (const script of LEGACY_SHIM_SCRIPTS) {\n const shim = resolve(ctx.projectRoot, 'scripts', script)\n const kitScript = kitPath('scripts', script)\n const shimOk = existsSync(shim) && existsSync(kitScript)\n checks.push({ name: `shim:${script}`, ok: shimOk })\n if (!shimOk) failures.push(`Missing legacy shim or kit script: ${script}`)\n }\n }\n\n for (const rel of FORBIDDEN_CONSUMER_PATHS) {\n const forbidden = resolve(ctx.projectRoot, rel)\n const absent = !existsSync(forbidden)\n checks.push({ name: `no-${rel}`, ok: absent })\n if (!absent) failures.push(`Forbidden dev path still present: ${rel}`)\n }\n\n const woodscliConfig = resolve(ctx.projectRoot, WOODSCLI_CONFIG_FILE)\n const configOk = existsSync(woodscliConfig)\n checks.push({ name: WOODSCLI_CONFIG_FILE, ok: configOk })\n if (!configOk) failures.push(`${WOODSCLI_CONFIG_FILE} missing`)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'regression:smoke',\n ok: failures.length === 0,\n checks,\n failures,\n })\n } else if (failures.length === 0) {\n ctx.logger.success('Regression smoke passed')\n } else {\n for (const f of failures) ctx.logger.error(f)\n }\n\n if (failures.length > 0) {\n throw new WpHsError('Regression smoke failed', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Run wp doctor and fix listed checks. See docs/REGRESSION-SMOKE.md.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { ExitCode } from '../../lib/errors.js'\nimport { printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport {\n applyCdnGitHubSetup,\n formatCdnSetupNote,\n githubDefaultForPrompt,\n needsCdnGitHubSetup,\n promptCdnGitHubSetup,\n} from '../../lib/cdn-github-setup.js'\nimport { promptDeveloperSlug } from '../../lib/developer-slug.js'\nimport { applyProjectSetup, formatSetupHint } from '../../lib/project-setup.js'\nimport { usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { BuildTier } from '../../lib/build-tier.js'\nimport type { CommandContext } from '../context.js'\n\nexport type SetupOptions = {\n tier?: BuildTier\n progress?: boolean\n}\n\nexport async function runSetup(ctx: CommandContext, options: SetupOptions = {}): Promise<number> {\n let results: ReturnType<typeof applyProjectSetup> = []\n\n await runCliTasks(\n ctx,\n [\n {\n title: 'Preparing .wphs workspace',\n task: async () => {\n if (ctx.global.dryRun) return\n try {\n runNodeScript(kitPath('scripts', 'ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n } catch {\n // non-fatal\n }\n },\n },\n {\n title: 'Copying missing config files',\n task: async () => {\n results = applyProjectSetup(ctx, {\n tier: options.tier,\n dryRun: ctx.global.dryRun,\n })\n },\n },\n ],\n options,\n )\n\n const copied = results.filter((r) => r.action === 'copied')\n const manual = results.filter((r) => r.action === 'manual')\n\n const nonInteractive = ctx.global.ci || ctx.global.yes || ctx.global.json || ctx.global.dryRun\n if (usesCdnPipeline(ctx.config) && !nonInteractive && !ctx.global.dryRun) {\n const slug = await promptDeveloperSlug(ctx.projectRoot)\n if (slug) {\n ctx.logger.success(`CDN dev slug → ${slug} (.wphs/config/developer.json)`)\n }\n }\n\n if (\n usesCdnPipeline(ctx.config) &&\n needsCdnGitHubSetup(ctx.projectRoot) &&\n !nonInteractive\n ) {\n const cdnSetup = await promptCdnGitHubSetup({\n projectRoot: ctx.projectRoot,\n githubDefault: githubDefaultForPrompt(ctx.projectRoot),\n })\n if (cdnSetup) {\n applyCdnGitHubSetup(ctx.projectRoot, cdnSetup)\n ctx.logger.success(formatCdnSetupNote(ctx.projectRoot))\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'setup',\n ok: manual.length === 0,\n copied: copied.length,\n skipped: results.filter((r) => r.action === 'skipped').length,\n manual,\n results,\n })\n } else {\n for (const result of results) {\n if (result.action === 'skipped') continue\n if (result.action === 'copied') {\n ctx.logger.success(result.detail)\n } else {\n ctx.logger.warn(`${result.path}: ${result.detail}`)\n }\n }\n\n if (copied.length === 0 && manual.length === 0) {\n printCommandDone(ctx, 'Nothing to copy — required files already present')\n } else if (copied.length > 0) {\n printCommandDone(ctx, `Setup complete — ${copied.length} file(s) copied`)\n }\n\n const hint = formatSetupHint(results)\n if (hint) {\n ctx.logger.info(`→ ${hint}`)\n }\n\n if (manual.length > 0) {\n ctx.logger.info('→ Run wp doctor for the full checklist')\n }\n }\n\n return ExitCode.SUCCESS\n}\n","import * as p from '@clack/prompts'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { isInteractiveCli, printCommandDone } from '../../lib/cli-spinner.js'\nimport { runCommand } from '../../lib/exec.js'\nimport {\n readHubSpotPortals,\n resolvePortalName,\n type HubSpotPortalEntry,\n} from '../../lib/hubspot-portals.js'\nimport type { CommandContext } from '../context.js'\n\nexport type PortalListOptions = Record<string, never>\n\nexport type PortalUseOptions = {\n name?: string\n}\n\nfunction formatPortalLine(portal: HubSpotPortalEntry, defaultPortal: string | null): string {\n const id = portal.portalId ? `portalId ${portal.portalId}` : 'portalId ?'\n const mark = portal.name === defaultPortal ? ' · default' : ''\n return `${portal.name} (${id})${mark}`\n}\n\nexport async function runPortalList(ctx: CommandContext, _options: PortalListOptions = {}): Promise<number> {\n const data = readHubSpotPortals(ctx.projectRoot)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'portal:list',\n configPath: data.configPath,\n defaultPortal: data.defaultPortal,\n portals: data.portals,\n })\n return ExitCode.SUCCESS\n }\n\n if (data.portals.length === 0) {\n ctx.logger.warn(`No portals[] entries found in ${data.configPath}`)\n ctx.logger.info('→ Add portals under hubspot.config.yml or run hs auth')\n return ExitCode.SUCCESS\n }\n\n if (data.defaultPortal) {\n ctx.logger.info(`Default: ${data.defaultPortal}`)\n }\n\n for (const portal of data.portals) {\n ctx.logger.info(formatPortalLine(portal, data.defaultPortal))\n }\n\n return ExitCode.SUCCESS\n}\n\nexport async function runPortalUse(ctx: CommandContext, options: PortalUseOptions = {}): Promise<number> {\n const data = readHubSpotPortals(ctx.projectRoot)\n\n if (data.portals.length === 0) {\n throw new WpHsError('No portals configured in hubspot.config.yml', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp auth or add portals[] to hubspot.config.yml',\n })\n }\n\n let targetName = options.name?.trim()\n\n if (!targetName) {\n if (ctx.global.ci || ctx.global.json) {\n throw new WpHsError('Portal name or id required in non-interactive mode', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal use <name>',\n })\n }\n\n if (!isInteractiveCli(ctx)) {\n throw new WpHsError('Portal name or id required', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal use <name> · wp portal list',\n })\n }\n\n const answer = await p.select({\n message: 'Set default HubSpot portal',\n options: data.portals.map((portal) => ({\n value: portal.name,\n label: portal.name,\n hint:\n portal.name === data.defaultPortal\n ? `current default · ${portal.portalId ?? 'no id'}`\n : portal.portalId ?? undefined,\n })),\n })\n\n if (p.isCancel(answer)) {\n throw new WpHsError('Portal selection cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n\n targetName = answer\n }\n\n const portal = resolvePortalName(data.portals, targetName)\n if (!portal) {\n throw new WpHsError(`Unknown portal: ${targetName}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal list',\n })\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] hs accounts use ${portal.name}`)\n return ExitCode.SUCCESS\n }\n\n runCommand('hs', ['accounts', 'use', portal.name], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n\n if (!ctx.global.json && !ctx.global.quiet) {\n printCommandDone(ctx, `Default portal → ${portal.name}`)\n } else if (ctx.global.json) {\n ctx.logger.json({\n command: 'portal:use',\n ok: true,\n defaultPortal: portal.name,\n portalId: portal.portalId ?? null,\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from './errors.js'\nimport { HUBSPOT_CONFIG_FILE } from './hubspot-cli-setup.js'\n\nexport type HubSpotPortalEntry = {\n name: string\n portalId?: string\n}\n\nexport type HubSpotPortalsFile = {\n configPath: string\n defaultPortal: string | null\n portals: HubSpotPortalEntry[]\n}\n\nfunction stripYamlScalar(value: string): string {\n const trimmed = value.trim()\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1)\n }\n return trimmed\n}\n\n/** Minimal parser for hubspot.config.yml portal names (no YAML dependency). */\nexport function parseHubSpotConfigPortals(raw: string): Pick<HubSpotPortalsFile, 'defaultPortal' | 'portals'> {\n const defaultMatch = raw.match(/^defaultPortal:\\s*(.+)\\s*$/m)\n const defaultPortal = defaultMatch ? stripYamlScalar(defaultMatch[1]) : null\n\n const portals: HubSpotPortalEntry[] = []\n let current: HubSpotPortalEntry | null = null\n let inPortals = false\n\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed === 'portals:') {\n inPortals = true\n continue\n }\n if (!inPortals) continue\n\n const listItemName = line.match(/^\\s+-\\s+name:\\s+(.+)\\s*$/)\n const nestedName = line.match(/^\\s+name:\\s+(.+)\\s*$/)\n const portalId = line.match(/^\\s+portalId:\\s+(\\d+)\\s*$/)\n\n if (listItemName || (nestedName && !line.match(/^\\s+-\\s/))) {\n if (current) portals.push(current)\n const nameValue = listItemName?.[1] ?? nestedName?.[1]\n current = nameValue ? { name: stripYamlScalar(nameValue) } : null\n continue\n }\n\n if (portalId && current) {\n current.portalId = portalId[1]\n }\n }\n\n if (current) portals.push(current)\n\n return { defaultPortal, portals }\n}\n\nexport function readHubSpotPortals(projectRoot: string): HubSpotPortalsFile {\n const configPath = resolve(projectRoot, HUBSPOT_CONFIG_FILE)\n if (!existsSync(configPath)) {\n throw new WpHsError(`${HUBSPOT_CONFIG_FILE} not found in project root.`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp setup, then add your portal + PAT.',\n })\n }\n\n const raw = readFileSync(configPath, 'utf8')\n const { defaultPortal, portals } = parseHubSpotConfigPortals(raw)\n\n return { configPath, defaultPortal, portals }\n}\n\nexport function resolvePortalName(\n portals: HubSpotPortalEntry[],\n nameOrId: string,\n): HubSpotPortalEntry | null {\n const needle = nameOrId.trim()\n return (\n portals.find((p) => p.name === needle) ??\n portals.find((p) => p.portalId === needle) ??\n null\n )\n}\n","import { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotConfigForCms } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScriptLongRunning } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type WatchOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n rebuild?: boolean\n progress?: boolean\n}\n\nexport async function runWatch(ctx: CommandContext, options: WatchOptions): Promise<number> {\n // No hs subprocess here — spawnSync under Clack/spinners blocks Ctrl+C\n ensureHubSpotConfigForCms(ctx)\n\n const tier = options.tier ?? 'dev'\n const args: string[] = ['--tier', tier]\n if (options.rebuild) args.push('--rebuild')\n\n const code = await runNodeScriptLongRunning(kitPath('scripts', 'watch-hubspot.mjs'), args, {\n cwd: ctx.projectRoot,\n env: { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot },\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n\n if (code === 130 || code === 143) {\n return code\n }\n\n if (code !== ExitCode.SUCCESS) {\n throw new WpHsError(`Watch exited with code ${code}`, {\n exitCode: ExitCode.BUILD_FAILED,\n remediation:\n 'Run wp build once, then wp watch. For src/ changes use wp watch --rebuild. Check hubspot.config.yml and hs cms watch output.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { createProgram } from './program.js'\n\nconst program = createProgram()\nprogram.parse(process.argv)\n"],"mappings":"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","names":["readFileSync","resolve","readFileSync","existsSync","resolve","resolve","existsSync","findProjectRoot","findProjectRoot","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","pc","resolve","spinner","pc","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","steps","existsSync","readFileSync","resolve","p","spawnSync","spawnSync","existsSync","resolve","existsSync","resolve","existsSync","resolve","resolve","existsSync","readFileSync","resolve","pc","readFileSync","resolve","readFileSync","resolve","text","pc","resolve","resolve","existsSync","readFileSync","writeFileSync","resolve","resolve","resolve","resolve","existsSync","mkdirSync","readFileSync","resolve","join","readFileSync","existsSync","join","resolve","mkdirSync","cpSync","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","basename","resolve","p","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","resolve","existsSync","readFileSync","writeFileSync","resolve","p","existsSync","readFileSync","resolve","writeFileSync","existsSync","writeFileSync","resolve","envFileForTier","existsSync","resolve","writeFileSync","existsSync","readdirSync","resolve","basename","mkdirSync","cpSync","writeFileSync","readFileSync","cpSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","writeFileSync","join","resolve","existsSync","readFileSync","resolve","mkdirSync","join","cpSync","readdirSync","rmSync","legacyConfigPath","writeFileSync","readFileSync","readFileSync","runNodeScript","cpSync","existsSync","readFileSync","writeFileSync","resolve","resolve","existsSync","mkdirSync","cpSync","writeFileSync","readFileSync","existsSync","resolve","resolve","existsSync","p","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","p","portal","readFileSync","resolve","findProjectRoot","program","runCommand"]}
1
+ {"version":3,"sources":["../src/cli/program.ts","../src/lib/config.ts","../src/lib/config-files.ts","../src/schema/woodsportal-hs.ts","../src/lib/paths.ts","../src/lib/logger.ts","../src/lib/wphs-baseline.ts","../src/cli/commands/doctor.ts","../src/lib/cli-spinner.ts","../src/lib/hubspot-cli-setup.ts","../src/lib/template-dev-deps.ts","../src/lib/hubspot-fields-json.ts","../src/lib/developer-slug.ts","../src/lib/module-build-id.ts","../src/lib/upload-only-module.ts","../src/vite/resolve-dev-config.ts","../src/lib/node-loader-interop.ts","../src/cli/commands/config-validate.ts","../src/cli/commands/build.ts","../src/lib/cli-banner.ts","../src/lib/kit-version.ts","../src/lib/build-tier.ts","../src/cli/commands/dev.ts","../src/cli/commands/deploy.ts","../src/lib/project-env-files.ts","../src/cli/commands/upload.ts","../src/cli/commands/publish.ts","../src/cli/commands/audit.ts","../src/cli/commands/init.ts","../src/lib/init-router-scaffold.ts","../src/lib/cdn-github-setup.ts","../src/lib/project-setup.ts","../src/lib/template-scripts.ts","../src/lib/project-name.ts","../src/cli/commands/migrate.ts","../src/cli/commands/examples.ts","../src/cli/commands/fields.ts","../src/cli/commands/regression.ts","../src/cli/commands/setup.ts","../src/cli/commands/portal.ts","../src/lib/hubspot-portals.ts","../src/cli/commands/watch.ts","../src/cli/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Command } from 'commander'\n\nimport { loadConfig } from '../lib/config.js'\nimport { createLogger } from '../lib/logger.js'\nimport { findProjectRoot, getKitRoot } from '../lib/paths.js'\nimport { defaultBaselineDir } from '../lib/wphs-baseline.js'\nimport { isWpHsError, ExitCode } from '../lib/errors.js'\nimport type { GlobalCliOptions, CommandContext } from './context.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { runConfigValidate } from './commands/config-validate.js'\nimport { runBuild } from './commands/build.js'\nimport { runDev } from './commands/dev.js'\nimport { runDeploy } from './commands/deploy.js'\nimport { runPublish } from './commands/publish.js'\nimport {\n runAuditBaselineCapture,\n runAuditParity,\n runAuditSecrets,\n runAuditShipBundle,\n} from './commands/audit.js'\nimport { runInit } from './commands/init.js'\nimport { runMigrate } from './commands/migrate.js'\nimport { runExamplesList, runExamplesSmoke } from './commands/examples.js'\nimport { runFieldsSync } from './commands/fields.js'\nimport { runRegressionSmoke } from './commands/regression.js'\nimport { runSetup } from './commands/setup.js'\nimport { runPortalList, runPortalUse } from './commands/portal.js'\nimport { runUpload } from './commands/upload.js'\nimport { runWatch } from './commands/watch.js'\nimport { DEFAULT_BUILD_TIER, parseBuildTier } from '../lib/build-tier.js'\nimport { DEFAULT_WOODSPORTAL_HS } from '../schema/woodsportal-hs.js'\n\ntype InitTemplate = 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\n\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(resolve(getKitRoot(), 'package.json'), 'utf8')) as {\n version?: string\n }\n return pkg.version ?? '0.0.0'\n } catch {\n return '0.0.0'\n }\n}\n\nfunction buildContext(global: GlobalCliOptions): CommandContext {\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n\n const projectRoot = global.project ?? findProjectRoot()\n const { config } = loadConfig(projectRoot)\n\n return { projectRoot, config, logger, global }\n}\n\nfunction attachGlobals(command: Command): void {\n command\n .option('--project <path>', 'Project root (woodscli.json)')\n .option('--ci', 'Non-interactive CI mode', false)\n .option('--json', 'Machine-readable JSON output', false)\n .option('--verbose', 'Step-by-step logs and child-process output (disables spinners)', false)\n .option('--quiet', 'Errors only', false)\n .option('--dry-run', 'Print planned actions without executing', false)\n .option('-y, --yes', 'Assume yes (non-interactive)', false)\n .option('--no-bump', 'Do not auto-increment module build id before CDN build', false)\n}\n\nasync function handle(fn: () => Promise<number>): Promise<void> {\n try {\n const code = await fn()\n process.exit(code)\n } catch (error) {\n if (isWpHsError(error)) {\n process.stderr.write(`Error: ${error.message}\\n`)\n if (error.remediation) {\n process.stderr.write(`→ ${error.remediation}\\n`)\n }\n process.exit(error.exitCode)\n }\n process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(ExitCode.INTERNAL)\n }\n}\n\nexport function createProgram(): Command {\n const program = new Command()\n .name('wp')\n .description('WoodsCLI — HubSpot CMS dev kit by WoodsPortal (modules + themes)')\n .version(readVersion())\n .addHelpText('after', '\\nWoodsCLI · WoodsPortal HubSpot CLI · npm @woodsportal/hubspot-kit')\n\n attachGlobals(program)\n\n program\n .command('doctor')\n .description('Check prerequisites (Node, HubSpot CLI, .wphs workspace, config)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDoctor(buildContext(global)))\n })\n\n program\n .command('setup')\n .description('Copy missing hubspot.config.yml, .env.*, CDN config, and vite shims from kit templates')\n .option('--tier <tier>', 'dev | stg | prod — copy only this .env file (default: all env.tiers)')\n .action(async (opts: { tier?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runSetup(buildContext(global), {\n tier: opts.tier ? parseBuildTier(opts.tier) : undefined,\n }),\n )\n })\n\n const configCmd = program.command('config').description('Project configuration')\n\n configCmd\n .command('validate')\n .description('Validate woodscli.json')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runConfigValidate(buildContext(global)))\n })\n\n program\n .command('init')\n .description('Scaffold a new module or theme project')\n .option('-t, --template <type>', 'module-hybrid-cdn | module-monolith | theme-starter')\n .option('-n, --name <slug>', 'Project name (creates ./<name>/ under cwd)')\n .option('-d, --directory <path>', 'Full target directory (skips name → folder prompt)')\n .option('--router <mode>', 'hash (client-frontend default) | browser | none — modules only')\n .option(\n '--cdn-github <org/repo>',\n 'Public GitHub CDN mirror repo (hybrid CDN; use with --ci / -y)',\n )\n .action(\n async (opts: {\n template?: string\n name?: string\n directory?: string\n router?: string\n cdnGithub?: string\n }) => {\n const global = program.opts<GlobalCliOptions>()\n const logger = createLogger({\n verbose: global.verbose,\n quiet: global.quiet,\n json: global.json,\n ci: global.ci,\n })\n const ctx: CommandContext = {\n projectRoot: process.cwd(),\n config: DEFAULT_WOODSPORTAL_HS,\n logger,\n global,\n }\n const routerMode =\n opts.router === 'browser' || opts.router === 'none' || opts.router === 'hash'\n ? opts.router\n : undefined\n\n await handle(() =>\n runInit(ctx, {\n template: opts.template as InitTemplate | undefined,\n name: opts.name,\n directory: opts.directory,\n router: routerMode,\n cdnGithub: opts.cdnGithub,\n }),\n )\n })\n\n program\n .command('migrate')\n .description('Migrate legacy .dev/ or .wp-hs-baseline/ to .wphs/')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runMigrate(buildContext(global)))\n })\n\n program\n .command('dev')\n .alias('local')\n .description('Start local development server (Vite HMR + CMS dev tool)')\n .option('-p, --port <port>', 'Port', '3000')\n .action(async (opts: { port: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runDev(buildContext(global), { port: Number(opts.port) }))\n })\n\n program\n .command('build')\n .description('Build CDN + HubSpot module (or theme no-op)')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--cdn-only', 'CDN chunks only')\n .option('--hubspot-only', 'HubSpot module only')\n .option('--cdn-esm', 'Build CDN via ESM preset')\n .action(\n async (opts: {\n tier: string\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runBuild(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n cdnOnly: opts.cdnOnly,\n hubspotOnly: opts.hubspotOnly,\n cdnEsm: opts.cdnEsm,\n }),\n )\n },\n )\n\n program\n .command('deploy')\n .description('Build, publish CDN, upload HubSpot module')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--skip-publish', 'Skip CDN publish')\n .option('--skip-upload', 'Skip HubSpot cms upload (e.g. CodeBuild module-git push)')\n .action(async (opts: { tier: string; skipPublish?: boolean; skipUpload?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runDeploy(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n skipPublish: opts.skipPublish,\n skipUpload: opts.skipUpload,\n }),\n )\n })\n\n program\n .command('publish')\n .description('Publish CDN artifacts to jsDelivr mirror')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--dry-run', 'Print publish plan without pushing')\n .action(async (opts: { tier: string; dryRun?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runPublish(buildContext(global), {\n tier: parseBuildTier(opts.tier),\n dryRun: opts.dryRun,\n }),\n )\n })\n\n const audit = program.command('audit').description('Build audits')\n\n audit\n .command('ship-bundle')\n .description('Fail if dev tooling appears in dist artifacts')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditShipBundle(buildContext(global)))\n })\n\n audit\n .command('parity')\n .description('Compare dist output to baseline snapshot')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditParity(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('baseline')\n .description('Capture dist output as parity baseline')\n .option('--baseline <dir>', 'Baseline directory')\n .action(async (opts: { baseline?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const baseline = opts.baseline ?? defaultBaselineDir(ctx.projectRoot, ctx.config)\n await handle(() => runAuditBaselineCapture(ctx, { baselineDir: baseline }))\n })\n\n audit\n .command('secrets')\n .description('Scan source for hardcoded secrets / PAT patterns')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runAuditSecrets(buildContext(global)))\n })\n\n const fields = program.command('fields').description('Module fields.json utilities')\n\n fields\n .command('sync')\n .description('Pull/push fields.json vs local cache')\n .option('--direction <dir>', 'pull | push', 'pull')\n .action(async (opts: { direction: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const direction = opts.direction === 'push' ? 'push' : 'pull'\n await handle(() => runFieldsSync(buildContext(global), { direction }))\n })\n\n const examples = program.command('examples').description('Examples smoke matrix')\n\n examples\n .command('list')\n .description('List scenarios from examples/manifest.json')\n .option('--track <track>', 'module | theme')\n .option('--setup <setup>', 'greenfield | existing | adopted')\n .action(async (opts: { track?: string; setup?: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runExamplesList(buildContext(global), {\n track: opts.track as 'module' | 'theme' | undefined,\n setup: opts.setup as 'greenfield' | 'existing' | 'adopted' | undefined,\n }),\n )\n })\n\n examples\n .command('smoke')\n .description('Run static/live smoke checks for example scenarios')\n .option('--scenario <id>', 'Single scenario id')\n .option('--tier <tier>', 'static | live', 'static')\n .action(async (opts: { scenario?: string; tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = opts.tier === 'live' ? 'live' : 'static'\n await handle(() =>\n runExamplesSmoke(buildContext(global), { scenario: opts.scenario, tier }),\n )\n })\n\n const regression = program.command('regression').description('Compatibility regression checks')\n\n regression\n .command('smoke')\n .description('Doctor + config validate + consumer boundary checks')\n .option('--skip-doctor', 'Skip prerequisite doctor check')\n .action(async (opts: { skipDoctor?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runRegressionSmoke(buildContext(global), { skipDoctor: opts.skipDoctor }),\n )\n })\n\n program\n .command('watch')\n .description('Watch HubSpot module or theme folder and re-upload on change')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .option('--rebuild', 'Rebuild module before watch')\n .action(async (opts: { tier: string; rebuild?: boolean }) => {\n const global = program.opts<GlobalCliOptions>()\n const tier = parseBuildTier(opts.tier)\n await handle(() =>\n runWatch(buildContext(global), {\n tier: tier === 'prod' ? 'prod' : tier === 'stg' ? 'stg' : 'dev',\n rebuild: opts.rebuild,\n }),\n )\n })\n\n program\n .command('upload')\n .description('Upload built HubSpot module or theme (hs cms upload)')\n .option('--tier <tier>', 'dev | stg | prod', DEFAULT_BUILD_TIER)\n .action(async (opts: { tier: string }) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() =>\n runUpload(buildContext(global), { tier: parseBuildTier(opts.tier) }),\n )\n })\n\n program\n .command('auth')\n .description('Authenticate HubSpot CLI (hs auth)')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n const ctx = buildContext(global)\n const { runCommand } = await import('../lib/exec.js')\n runCommand('hs', ['auth'], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n process.exit(ExitCode.SUCCESS)\n })\n\n const portal = program.command('portal').description('HubSpot default portal selection')\n\n portal\n .command('list')\n .alias('ls')\n .description('List portals from hubspot.config.yml')\n .action(async () => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runPortalList(buildContext(global)))\n })\n\n portal\n .command('use [name]')\n .description('Set defaultPortal (hs accounts use)')\n .action(async (name?: string) => {\n const global = program.opts<GlobalCliOptions>()\n await handle(() => runPortalUse(buildContext(global), { name }))\n })\n\n return program\n}\n","import { readFileSync } from 'node:fs'\n\nimport {\n resolveProjectConfig,\n WOODSCLI_CONFIG_FILE,\n} from './config-files.js'\nimport { WoodsPortalHsSchema, type WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WpHsError, ExitCode } from './errors.js'\nimport { findProjectRoot } from './paths.js'\n\nexport type LoadedProjectConfig = {\n root: string\n config: WoodsPortalHsConfig\n configPath: string\n configFileName: string\n}\n\nexport function loadConfig(projectRoot?: string): LoadedProjectConfig {\n const root = projectRoot ?? findProjectRoot()\n const resolved = resolveProjectConfig(root)\n\n if (!resolved) {\n throw new WpHsError(`Missing ${WOODSCLI_CONFIG_FILE}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init. Legacy woodsportal.hs.json → run wp migrate --yes.',\n })\n }\n\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(resolved.path, 'utf8'))\n } catch (cause) {\n throw new WpHsError(`Invalid JSON in ${resolved.fileName}`, {\n exitCode: ExitCode.USER_ERROR,\n cause,\n })\n }\n\n const parsed = WoodsPortalHsSchema.safeParse(raw)\n if (!parsed.success) {\n throw new WpHsError(`${resolved.fileName} validation failed: ${parsed.error.message}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp config validate for details.',\n })\n }\n\n return {\n root,\n config: parsed.data,\n configPath: resolved.path,\n configFileName: resolved.fileName,\n }\n}\n\nexport function validateConfigFile(projectRoot?: string): {\n valid: boolean\n errors: string[]\n config?: WoodsPortalHsConfig\n} {\n try {\n const { config } = loadConfig(projectRoot)\n return { valid: true, errors: [], config }\n } catch (error) {\n if (error instanceof WpHsError) {\n return { valid: false, errors: [error.message] }\n }\n return { valid: false, errors: [String(error)] }\n }\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** Canonical WoodsCLI project config — the only supported filename. */\nexport const WOODSCLI_CONFIG_FILE = 'woodscli.json'\n\n/** Removed in v1.0.2+ — detected only for migrate/doctor messaging. */\nexport const LEGACY_WOODSPORTAL_HS_FILE = 'woodsportal.hs.json'\n\nexport type ResolvedProjectConfig = {\n path: string\n fileName: typeof WOODSCLI_CONFIG_FILE\n}\n\nfunction envConfigPath(projectRoot: string): string | null {\n const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null\n if (!fromEnv) return null\n return resolve(projectRoot, fromEnv)\n}\n\nexport function legacyConfigPath(projectRoot: string): string {\n return resolve(projectRoot, LEGACY_WOODSPORTAL_HS_FILE)\n}\n\nexport function woodscliConfigPath(projectRoot: string): string {\n return resolve(projectRoot, WOODSCLI_CONFIG_FILE)\n}\n\n/** @returns null | 'legacy-only' | 'duplicate' */\nexport function legacyConfigConflict(projectRoot: string): 'legacy-only' | 'duplicate' | null {\n const hasWoodscli = existsSync(woodscliConfigPath(projectRoot))\n const hasLegacy = existsSync(legacyConfigPath(projectRoot))\n if (hasLegacy && hasWoodscli) return 'duplicate'\n if (hasLegacy && !hasWoodscli) return 'legacy-only'\n return null\n}\n\n/**\n * Resolve the active project config file (`woodscli.json` only).\n */\nexport function resolveProjectConfig(projectRoot: string): ResolvedProjectConfig | null {\n const envPath = envConfigPath(projectRoot)\n if (envPath) {\n if (!existsSync(envPath)) return null\n return { path: envPath, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n const path = woodscliConfigPath(projectRoot)\n if (existsSync(path)) {\n return { path, fileName: WOODSCLI_CONFIG_FILE }\n }\n\n return null\n}\n\nexport function findProjectRoot(from = process.cwd()): string | null {\n if (process.env.WP_HS_PROJECT_ROOT?.trim()) {\n return resolve(process.env.WP_HS_PROJECT_ROOT.trim())\n }\n\n let dir = resolve(from)\n while (true) {\n if (resolveProjectConfig(dir)) {\n return dir\n }\n const parent = resolve(dir, '..')\n if (parent === dir) {\n return null\n }\n dir = parent\n }\n}\n","import { z } from 'zod'\n\nexport const CONFIG_VERSION = 1\n\nexport const WPHS_WORKSPACE_DIR = '.wphs' as const\n\nexport const WoodsPortalHsSchema = z.object({\n configVersion: z.number().int().default(CONFIG_VERSION),\n projectType: z.enum(['module-hybrid-cdn', 'module-monolith', 'theme-starter']),\n module: z.object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n outDir: z.string().default('dist/WoodsPortal.Module'),\n }),\n theme: z\n .object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n srcDir: z.string().default('src/theme'),\n themeJson: z.string().default('src/theme/theme.json'),\n })\n .optional(),\n cdn: z\n .object({\n mode: z.enum(['jsdelivr', 'custom', 'local', 'none']).default('jsdelivr'),\n buildIdFile: z.string().default('.module-build-id'),\n mirror: z.string().default('portal.cdn.json'),\n })\n .default({}),\n entries: z\n .object({\n app: z.string().default('src/cdn/app-entry.ts'),\n vendor: z.string().default('src/cdn/vendor-entry.ts'),\n hubspotBootstrap: z.string().default('src/hubspot/bootstrap.ts'),\n /** Monolith production IIFE entry (wp build --hubspot-only) */\n module: z.string().default('src/hubspot/module-entry.tsx'),\n localDev: z.string().default('src/main.tsx'),\n })\n .default({}),\n env: z\n .object({\n tiers: z.array(z.enum(['dev', 'stg', 'prod'])).default(['dev', 'stg', 'prod']),\n })\n .default({}),\n dev: z\n .object({\n moduleConfigDir: z.literal(WPHS_WORKSPACE_DIR).default(WPHS_WORKSPACE_DIR),\n adapter: z.string().default('./wphs.adapter.ts'),\n fieldsJson: z.string().default('public/fields.json'),\n themeFieldsJson: z.string().optional(),\n })\n .default({}),\n scaffold: z\n .object({\n /** hash = woodsportal-client-frontend (HubSpot CMS); browser = local clean URLs; none = single page */\n router: z.enum(['hash', 'browser', 'none']).default('hash'),\n })\n .optional(),\n})\n\nexport type WoodsPortalHsConfig = z.infer<typeof WoodsPortalHsSchema>\n\nexport const DEFAULT_WOODSPORTAL_HS: WoodsPortalHsConfig = {\n configVersion: CONFIG_VERSION,\n projectType: 'module-hybrid-cdn',\n module: {\n name: 'woodsportal-module',\n uploadPath: 'dw-modules/woodsportal-module.module',\n outDir: 'dist/WoodsPortal.Module',\n },\n cdn: {\n mode: 'jsdelivr',\n buildIdFile: '.module-build-id',\n mirror: 'portal.cdn.json',\n },\n entries: {\n app: 'src/cdn/app-entry.ts',\n vendor: 'src/cdn/vendor-entry.ts',\n hubspotBootstrap: 'src/hubspot/bootstrap.ts',\n module: 'src/hubspot/module-entry.tsx',\n localDev: 'src/main.tsx',\n },\n env: {\n tiers: ['dev', 'stg', 'prod'],\n },\n dev: {\n moduleConfigDir: WPHS_WORKSPACE_DIR,\n adapter: './wphs.adapter.ts',\n fieldsJson: 'public/fields.json',\n },\n}\n\nexport function isModuleProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' || config.projectType === 'module-monolith'\n}\n\nexport function isThemeProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'theme-starter'\n}\n\nexport function usesCdnPipeline(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' && config.cdn.mode !== 'none'\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { findProjectRoot as findConfigProjectRoot } from './config-files.js'\nimport { WpHsError, ExitCode } from './errors.js'\n\nconst KIT_PACKAGE_NAME = '@woodsportal/hubspot-kit'\n\nfunction resolveKitRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n while (true) {\n const pkgPath = resolve(dir, 'package.json')\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { name?: string }\n if (pkg.name === KIT_PACKAGE_NAME) {\n return dir\n }\n } catch {\n // keep walking\n }\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n\n throw new WpHsError('Could not resolve @woodsportal/hubspot-kit package root.', {\n exitCode: ExitCode.INTERNAL,\n })\n}\n\nconst kitRoot = resolveKitRoot()\n\nexport function getKitRoot(): string {\n return kitRoot\n}\n\nexport function findProjectRoot(from = process.cwd()): string {\n const resolved = findConfigProjectRoot(from)\n\n if (!resolved) {\n throw new WpHsError('Could not find woodscli.json in this directory or any parent.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init, or pass --project <path>. Legacy config: wp migrate --yes.',\n })\n }\n return resolved\n}\n\nexport function kitPath(...segments: string[]): string {\n return resolve(kitRoot, ...segments)\n}\n\nexport { resolveProjectConfig, WOODSCLI_CONFIG_FILE, LEGACY_WOODSPORTAL_HS_FILE } from './config-files.js'\n","import pc from 'picocolors'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport type LoggerOptions = {\n verbose?: boolean\n quiet?: boolean\n json?: boolean\n ci?: boolean\n}\n\nexport type Logger = {\n debug: (message: string) => void\n info: (message: string) => void\n warn: (message: string) => void\n error: (message: string) => void\n success: (message: string) => void\n step: (message: string) => void\n stepDone: (message: string) => void\n json: (payload: Record<string, unknown>) => void\n}\n\nfunction shouldUseColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false\n if (process.env.CI === 'true') return false\n return process.stderr.isTTY === true\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const useColor = shouldUseColor()\n const { verbose = false, quiet = false, json = false } = options\n\n const write = (line: string) => {\n process.stderr.write(`${line}\\n`)\n }\n\n const emit = (level: LogLevel, message: string) => {\n if (json) return\n if (quiet && level !== 'error' && level !== 'warn') return\n if (level === 'debug' && !verbose) return\n\n const prefix =\n level === 'error'\n ? useColor\n ? pc.red('error')\n : 'error'\n : level === 'warn'\n ? useColor\n ? pc.yellow('warn')\n : 'warn'\n : level === 'debug'\n ? useColor\n ? pc.dim('debug')\n : 'debug'\n : useColor\n ? pc.cyan('info')\n : 'info'\n\n write(`[${prefix}] ${message}`)\n }\n\n return {\n debug: (message) => emit('debug', message),\n info: (message) => emit('info', message),\n warn: (message) => emit('warn', message),\n error: (message) => emit('error', message),\n success: (message) => {\n if (json || quiet) return\n const prefix = useColor ? pc.green('ok') : 'ok'\n write(`[${prefix}] ${message}`)\n },\n step: (message) => {\n if (json || quiet) return\n const bullet = useColor ? pc.cyan('→') : '→'\n write(`${bullet} ${message}`)\n },\n stepDone: (message) => {\n if (json || quiet) return\n const mark = useColor ? pc.green('✓') : '✓'\n write(` ${mark} ${message}`)\n },\n json: (payload) => {\n if (!json) return\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n },\n }\n}\n","import { resolve } from 'node:path'\n\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WPHS_WORKSPACE_DIR } from '../schema/woodsportal-hs.js'\n\n/** Default parity baseline directory under `.wphs/audit/baseline`. */\nexport function defaultBaselineDir(projectRoot: string, config: WoodsPortalHsConfig): string {\n const workspace = config.dev.moduleConfigDir ?? WPHS_WORKSPACE_DIR\n return resolve(projectRoot, workspace, 'audit', 'baseline')\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { loadConfig } from '../../lib/config.js'\nimport {\n legacyConfigConflict,\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { isInteractiveCli, printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { doctorHubSpotChecks } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { MODULE_CONFIG_UI_DEPS } from '../../lib/template-dev-deps.js'\nimport { validateHubSpotFieldsJson } from '../../lib/hubspot-fields-json.js'\nimport { readDeveloperSlug } from '../../lib/developer-slug.js'\nimport { resolveModuleBuildIdMetaForCli } from '../../lib/module-build-id.js'\nimport { isUploadOnlyPreexistingProject } from '../../lib/upload-only-module.js'\nimport { isThemeProject, usesCdnPipeline, WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport { isProjectViteInstalled } from '../../vite/resolve-dev-config.js'\nimport { nodeLoaderInteropWarning } from '../../lib/node-loader-interop.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DoctorCheck = {\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'error' | 'warn'\n}\n\nfunction checkNode(): DoctorCheck {\n const major = Number(process.versions.node.split('.')[0])\n const ok = major >= 20\n return {\n name: 'node',\n ok,\n message: ok ? `Node ${process.versions.node}` : `Node ${process.versions.node} (need >= 20)`,\n remediation: ok ? undefined : 'Install Node 24 LTS (recommended) or Node 20 LTS.',\n severity: 'error',\n }\n}\n\nfunction checkLegacyConfig(projectRoot: string): DoctorCheck | null {\n const conflict = legacyConfigConflict(projectRoot)\n if (conflict === 'legacy-only') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Legacy ${LEGACY_WOODSPORTAL_HS_FILE} — ${WOODSCLI_CONFIG_FILE} is required`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n }\n }\n if (conflict === 'duplicate') {\n return {\n name: 'config-filename',\n ok: false,\n message: `Both ${WOODSCLI_CONFIG_FILE} and ${LEGACY_WOODSPORTAL_HS_FILE} present`,\n remediation: 'Run wp migrate --yes to remove the legacy file',\n severity: 'error',\n }\n }\n return null\n}\n\nfunction checkConfig(ctx: CommandContext): DoctorCheck[] {\n const legacy = checkLegacyConfig(ctx.projectRoot)\n if (legacy) {\n return [legacy]\n }\n\n try {\n const loaded = loadConfig(ctx.projectRoot)\n return [\n {\n name: 'config',\n ok: true,\n message: `${loaded.configFileName} valid`,\n severity: 'error',\n },\n ]\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return [\n {\n name: 'config',\n ok: false,\n message,\n remediation: 'Run wp config validate',\n severity: 'error',\n },\n ]\n }\n}\n\nfunction envFileForTier(tier: string): string {\n if (tier === 'dev') return '.env.dev'\n if (tier === 'stg') return '.env.stg'\n return '.env.prod'\n}\n\nfunction readEnvFileValue(projectRoot: string, file: string, key: string): string | undefined {\n const path = resolve(projectRoot, file)\n if (!existsSync(path)) return undefined\n try {\n const content = readFileSync(path, 'utf8')\n const match = content.match(new RegExp(`^${key}=(.*)$`, 'm'))\n return match?.[1]?.trim()\n } catch {\n return undefined\n }\n}\n\nfunction checkEnvFiles(ctx: CommandContext): DoctorCheck[] {\n const checks: DoctorCheck[] = []\n\n const localPath = resolve(ctx.projectRoot, '.env.local')\n const localOk = existsSync(localPath)\n checks.push({\n name: 'env-local',\n ok: localOk,\n message: localOk ? '.env.local present' : '.env.local missing (required for yarn local / wp local)',\n remediation: localOk ? undefined : 'wp setup or copy .env.local.example → .env.local',\n severity: 'warn',\n })\n\n const legacyLocalDev = resolve(ctx.projectRoot, '.env.dev')\n if (!localOk && existsSync(legacyLocalDev)) {\n const nodeEnv = readEnvFileValue(ctx.projectRoot, '.env.dev', 'VITE_NODE_ENV')\n const hasDevMode = readEnvFileValue(ctx.projectRoot, '.env.dev', 'VITE_DEV_MODE') != null\n const looksLikeLocal =\n hasDevMode || nodeEnv === 'local' || nodeEnv == null || nodeEnv === 'development'\n if (looksLikeLocal) {\n checks.push({\n name: 'env-local-migration',\n ok: false,\n message:\n '.env.dev looks like old localhost config — rename to .env.local and add VITE_NODE_ENV=local',\n remediation: 'mv .env.dev .env.local (then create .env.dev from .env.dev.example for deploy:dev)',\n severity: 'warn',\n })\n }\n }\n\n for (const tier of ctx.config.env.tiers) {\n const file = envFileForTier(tier)\n const ok = existsSync(resolve(ctx.projectRoot, file))\n if (tier === 'stg') {\n checks.push({\n name: 'env-stg',\n ok: true,\n message: ok\n ? '.env.stg present'\n : '.env.stg missing (optional — reserved for future staging)',\n remediation: ok ? undefined : 'Create from .env.stg.example when a staging API exists',\n severity: 'warn',\n })\n continue\n }\n checks.push({\n name: `env-${tier}`,\n ok,\n message: ok ? `${file} present` : `${file} missing`,\n remediation: ok ? undefined : 'wp setup (copies from .example templates)',\n severity: 'warn',\n })\n }\n\n return checks\n}\n\nfunction checkLegacyBuildIdFile(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n const legacy = resolve(ctx.projectRoot, '.portal-build-id')\n if (!existsSync(legacy)) return null\n return {\n name: 'legacy-build-id',\n ok: false,\n message: 'Legacy .portal-build-id present — use .module-build-id',\n remediation: 'Run wp migrate --yes',\n severity: 'warn',\n }\n}\n\nfunction checkBuildId(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n const file = resolve(ctx.projectRoot, ctx.config.cdn.buildIdFile)\n const ok = existsSync(file)\n return {\n name: 'build-id',\n ok,\n message: ok ? `${ctx.config.cdn.buildIdFile} present` : `${ctx.config.cdn.buildIdFile} missing`,\n remediation: ok ? undefined : 'wp setup (creates channel baseline e.g. v0.0.1-dev)',\n severity: 'warn',\n }\n}\n\nfunction checkModuleBuildIdResolved(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n try {\n const meta = resolveModuleBuildIdMetaForCli(ctx.projectRoot, process.env)\n const detail =\n meta.source === 'state'\n ? `${meta.id} (state: ${meta.slug} #${meta.seq})`\n : `${meta.id} (source: ${meta.source})`\n return {\n name: 'module-build-id',\n ok: true,\n message: `Effective module build id: ${detail}`,\n severity: 'warn',\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'module-build-id',\n ok: false,\n message: `Could not resolve module build id — ${message}`,\n remediation: 'Run wp setup and set a CDN dev slug (or PORTAL_CDN_DEV_SLUG)',\n severity: 'warn',\n }\n }\n}\n\nfunction checkDevSlug(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n if (process.env.PORTAL_BUILD_ID?.trim() || process.env.MODULE_BUILD_ID?.trim()) {\n return null\n }\n\n const slug = readDeveloperSlug(ctx.projectRoot)\n if (slug) {\n return {\n name: 'cdn-dev-slug',\n ok: true,\n message: `CDN dev slug: ${slug}`,\n severity: 'warn',\n }\n }\n\n return {\n name: 'cdn-dev-slug',\n ok: false,\n message: 'CDN dev slug not configured (shared CDN mirror needs per-developer ids)',\n remediation:\n 'Run wp setup, set PORTAL_CDN_DEV_SLUG, or configure git user.name for automatic slug',\n severity: 'warn',\n }\n}\n\nfunction isUploadOnlyProject(ctx: CommandContext): boolean {\n const moduleDirs = [resolve(ctx.projectRoot, ctx.config.module.uploadPath)]\n return isUploadOnlyPreexistingProject(ctx.projectRoot, moduleDirs)\n}\n\nfunction checkUploadOnlyNote(ctx: CommandContext): DoctorCheck | null {\n if (!isUploadOnlyProject(ctx)) return null\n return {\n name: 'upload-only-module',\n ok: true,\n message: 'Upload-only module (no local dev app)',\n remediation: 'Add package.json + src/ via wp init in a new folder, or continue upload-only with wp upload',\n severity: 'warn',\n }\n}\n\nfunction checkDevViteConfig(ctx: CommandContext): DoctorCheck {\n const path = resolve(ctx.projectRoot, 'vite.config.dev.mjs')\n const ok = existsSync(path)\n return {\n name: 'vite-dev-config',\n ok,\n message: ok ? 'vite.config.dev.mjs present' : 'vite.config.dev.mjs missing',\n remediation: ok\n ? undefined\n : 'Add vite.config.dev.mjs that re-exports @woodsportal/hubspot-kit/vite/vite.config.dev.mjs',\n severity: 'error',\n }\n}\n\nfunction checkMetaJson(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n\n const path = resolve(ctx.projectRoot, 'public/meta.json')\n if (!existsSync(path)) {\n return {\n name: 'meta-json',\n ok: false,\n message: 'public/meta.json missing',\n remediation:\n 'Copy meta.json from @woodsportal/hubspot-kit templates (content_types + module label for page editor)',\n severity: 'warn',\n }\n }\n\n try {\n const meta = JSON.parse(readFileSync(path, 'utf8')) as { content_types?: unknown }\n const hasContentTypes =\n Array.isArray(meta.content_types) && meta.content_types.length > 0\n return {\n name: 'meta-json',\n ok: hasContentTypes,\n message: hasContentTypes\n ? 'public/meta.json includes content_types'\n : 'public/meta.json missing content_types (module may not appear on site pages)',\n remediation: hasContentTypes\n ? undefined\n : 'Add content_types: [\"SITE_PAGE\", \"LANDING_PAGE\", ...] — see templates/module-hybrid-cdn/public/meta.json',\n severity: 'warn',\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'meta-json',\n ok: false,\n message: `public/meta.json is invalid JSON — ${message}`,\n remediation: 'Fix JSON syntax in public/meta.json',\n severity: 'warn',\n }\n }\n}\n\nasync function checkCdnMirrorPublic(ctx: CommandContext): Promise<DoctorCheck | null> {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n\n const mirrorPath = resolve(ctx.projectRoot, ctx.config.cdn?.mirror ?? 'portal.cdn.json')\n if (!existsSync(mirrorPath)) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: 'portal.cdn.json missing (hybrid CDN publish config)',\n remediation: 'Run wp setup or wp init to configure the public GitHub CDN mirror',\n severity: 'error',\n }\n }\n\n let github: string | undefined\n try {\n const mirror = JSON.parse(readFileSync(mirrorPath, 'utf8')) as { github?: string }\n github = mirror.github?.trim()\n } catch {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: 'portal.cdn.json is invalid JSON',\n remediation: 'Fix portal.cdn.json or re-run wp setup',\n severity: 'error',\n }\n }\n\n if (!github) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: 'portal.cdn.json missing github (org/repo)',\n remediation: 'Set github to a public repo for jsDelivr (e.g. Digital-Woods/woodsportal-client-frontend-cdn)',\n severity: 'error',\n }\n }\n\n try {\n const res = await fetch(`https://api.github.com/repos/${github}`, {\n headers: { Accept: 'application/vnd.github+json' },\n })\n if (res.status === 404) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `GitHub CDN repo ${github} not found`,\n remediation: 'Create the repo or fix portal.cdn.json github slug',\n severity: 'error',\n }\n }\n const data = (await res.json()) as { private?: boolean }\n if (data.private === true) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `CDN mirror ${github} is private — jsDelivr returns 404 (blank HubSpot preview)`,\n remediation:\n 'Make the GitHub repo public (Settings → Change visibility) or point portal.cdn.json at a public mirror',\n severity: 'error',\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `Could not verify CDN repo ${github} — ${message}`,\n severity: 'warn',\n }\n }\n\n const manifestPath = resolve(ctx.projectRoot, 'dist/cdn/manifest.json')\n if (!existsSync(manifestPath)) {\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public (run wp build to verify jsDelivr URLs)`,\n severity: 'error',\n }\n }\n\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as {\n scripts?: Array<{ name?: string; url?: string }>\n }\n const appUrl = manifest.scripts?.find((s) => s.name === 'app')?.url\n if (!appUrl) {\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public`,\n severity: 'error',\n }\n }\n const head = await fetch(appUrl, { method: 'HEAD' })\n if (!head.ok) {\n return {\n name: 'cdn-mirror-public',\n ok: false,\n message: `jsDelivr app chunk not reachable (HTTP ${head.status}) — HubSpot preview will be blank`,\n remediation: 'Run wp deploy (publish CDN + upload module) after making the mirror repo public',\n severity: 'error',\n }\n }\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public and jsDelivr app chunk is reachable`,\n severity: 'error',\n }\n } catch {\n return {\n name: 'cdn-mirror-public',\n ok: true,\n message: `CDN mirror ${github} is public`,\n severity: 'error',\n }\n }\n}\n\nfunction checkFieldsJson(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n\n const path = resolve(ctx.projectRoot, 'public/fields.json')\n if (!existsSync(path)) {\n return {\n name: 'fields-json',\n ok: false,\n message: 'public/fields.json missing',\n remediation: 'Copy fields.json from @woodsportal/hubspot-kit templates for your project type',\n severity: 'error',\n }\n }\n\n try {\n const fields = JSON.parse(readFileSync(path, 'utf8')) as unknown\n const issues = validateHubSpotFieldsJson(fields)\n if (issues.length === 0) {\n return {\n name: 'fields-json',\n ok: true,\n message: 'public/fields.json uses valid HubSpot field types',\n severity: 'error',\n }\n }\n\n const preview = issues\n .slice(0, 3)\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ')\n return {\n name: 'fields-json',\n ok: false,\n message: `public/fields.json has ${issues.length} issue(s) — ${preview}`,\n remediation:\n 'Use HubSpot field types (e.g. \"text\" + \"display\": \"textarea\", not type \"textarea\"). See templates/module-hybrid-cdn/public/fields.json',\n severity: 'error',\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n name: 'fields-json',\n ok: false,\n message: `public/fields.json is invalid JSON — ${message}`,\n remediation: 'Fix JSON syntax in public/fields.json',\n severity: 'error',\n }\n }\n}\n\nfunction readProjectFile(projectRoot: string, relativePath: string): string | null {\n const path = resolve(projectRoot, relativePath)\n if (!existsSync(path)) {\n return null\n }\n return readFileSync(path, 'utf8')\n}\n\nfunction checkCssPipeline(ctx: CommandContext): DoctorCheck[] {\n if (isThemeProject(ctx.config) || isUploadOnlyProject(ctx)) {\n return []\n }\n\n const checks: DoctorCheck[] = []\n const mainDev = readProjectFile(ctx.projectRoot, 'src/assets/css/main.dev.css')\n const mainProd = readProjectFile(ctx.projectRoot, 'src/assets/css/main.prod.css')\n const appEntry = readProjectFile(ctx.projectRoot, 'src/cdn/app-entry.ts')\n\n if (mainDev) {\n const withoutComments = mainDev.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/^\\s*\\/\\/.*$/gm, '')\n const hasPrefix = /@import\\s+['\"]tailwindcss['\"]\\s+prefix\\s*\\(\\s*dw\\s*\\)/i.test(\n withoutComments,\n )\n checks.push({\n name: 'css-main-dev-unprefixed',\n ok: !hasPrefix,\n message: hasPrefix\n ? 'main.dev.css uses prefix(dw) — local wp dev will not match HubSpot builds'\n : 'main.dev.css is unprefixed (local dev)',\n remediation: hasPrefix\n ? 'Remove prefix(dw) from main.dev.css; use main.prod.css for HubSpot/CDN builds only'\n : undefined,\n severity: 'error',\n })\n }\n\n if (mainProd) {\n const withoutComments = mainProd.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/^\\s*\\/\\/.*$/gm, '')\n const hasPrefix = /@import\\s+['\"]tailwindcss['\"]\\s+prefix\\s*\\(\\s*dw\\s*\\)/i.test(\n withoutComments,\n )\n const scansTemp = /@source\\s+['\"][^'\"]*\\.temp/.test(mainProd)\n checks.push({\n name: 'css-main-prod-prefixed',\n ok: hasPrefix,\n message: hasPrefix\n ? 'main.prod.css uses prefix(dw) (HubSpot/CDN)'\n : 'main.prod.css missing prefix(dw)',\n remediation: hasPrefix ? undefined : 'Add @import \\'tailwindcss\\' prefix(dw) to main.prod.css',\n severity: 'error',\n })\n checks.push({\n name: 'css-main-prod-temp-source',\n ok: scansTemp,\n message: scansTemp\n ? 'main.prod.css scans .temp/ for prefixed utilities'\n : 'main.prod.css missing @source for .temp/',\n remediation: scansTemp\n ? undefined\n : 'Add @source \\'../../../.temp/**/*.{js,jsx,ts,tsx}\\' to main.prod.css',\n severity: 'error',\n })\n }\n\n if (usesCdnPipeline(ctx.config) && appEntry) {\n const skipsRuntimeCss =\n /skipRuntimeCss\\s*:\\s*true/.test(appEntry) ||\n /mountPortal\\s*\\(\\s*\\{[^}]*skipRuntimeCss\\s*:\\s*true/.test(appEntry)\n checks.push({\n name: 'css-app-entry-skip-runtime',\n ok: skipsRuntimeCss,\n message: skipsRuntimeCss\n ? 'cdn/app-entry.ts skips runtime CSS (relies on module.css)'\n : 'cdn/app-entry.ts should call mountPortal({ skipRuntimeCss: true })',\n remediation: skipsRuntimeCss\n ? undefined\n : 'Update src/cdn/app-entry.ts — see templates/module-hybrid-cdn/src/cdn/app-entry.ts',\n severity: 'error',\n })\n }\n\n const moduleHtml = readProjectFile(ctx.projectRoot, 'public/module.html')\n if (moduleHtml && usesCdnPipeline(ctx.config)) {\n const loadsCdnAppCss =\n /require_css\\s*\\([^)]*portal_app_css/i.test(moduleHtml) ||\n /require_css\\s*\\([^)]*PORTAL_APP_CSS/i.test(moduleHtml)\n checks.push({\n name: 'css-module-html-no-cdn-require',\n ok: !loadsCdnAppCss,\n message: loadsCdnAppCss\n ? 'module.html require_css for CDN app CSS may double-load with merged module.css'\n : 'module.html relies on merged module.css (no CDN require_css)',\n remediation: loadsCdnAppCss\n ? 'Remove require_css for app.*.css; wp build merges app CSS into module.css'\n : undefined,\n severity: 'warn',\n })\n }\n\n const moduleOutDir = ctx.config.module?.outDir\n if (moduleOutDir && usesCdnPipeline(ctx.config)) {\n const moduleCssPath = resolve(ctx.projectRoot, moduleOutDir, 'module.css')\n if (existsSync(moduleCssPath)) {\n const css = readFileSync(moduleCssPath, 'utf8')\n const hasDwUtilities = /dw\\\\:/.test(css) || /\\.dw:/.test(css)\n checks.push({\n name: 'css-module-dist-prefixed',\n ok: hasDwUtilities,\n message: hasDwUtilities\n ? `${moduleOutDir}/module.css contains dw-prefixed utilities`\n : `${moduleOutDir}/module.css missing dw: utilities — run wp build`,\n remediation: hasDwUtilities ? undefined : 'Run wp build --tier dev (or stg/prod) before upload',\n severity: 'warn',\n })\n }\n }\n\n return checks\n}\n\nfunction checkHybridModuleHtml(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return null\n\n const path = resolve(ctx.projectRoot, 'public/module.html')\n if (!existsSync(path)) {\n return {\n name: 'module-html',\n ok: false,\n message: 'public/module.html missing',\n remediation: 'Copy module.html from @woodsportal/hubspot-kit templates/module-hybrid-cdn',\n severity: 'error',\n }\n }\n\n const html = readFileSync(path, 'utf8')\n const needs = ['__PORTAL_CDN_BASE__', 'require_js', 'hubSpotData', 'id=\"app\"']\n const missing = needs.filter((token) => !html.includes(token))\n const usesUndeclaredCdnFields = /module\\.portal_(cdn_base_url|vendor_script|app_script|app_css)/.test(\n html,\n )\n const ok = missing.length === 0 && !usesUndeclaredCdnFields\n\n return {\n name: 'module-html-hybrid',\n ok,\n message: ok\n ? 'public/module.html includes CDN require_js + hubSpotData'\n : usesUndeclaredCdnFields\n ? 'public/module.html references undeclared module.portal_cdn_* fields'\n : `public/module.html missing hybrid CDN markers: ${missing.join(', ')}`,\n remediation: ok\n ? undefined\n : usesUndeclaredCdnFields\n ? 'Use __PORTAL_CDN_BASE__ placeholders in module.html (see templates/module-hybrid-cdn) — CDN URLs are injected at build time'\n : 'Update public/module.html from templates/module-hybrid-cdn (hybrid loads app from jsDelivr)',\n severity: 'error',\n }\n}\n\nfunction checkCdnViteConfigs(ctx: CommandContext): DoctorCheck[] {\n if (isThemeProject(ctx.config) || !usesCdnPipeline(ctx.config)) return []\n\n return ['vite.config.cdn-vendor.mjs', 'vite.config.cdn-app.mjs'].map((file) => {\n const path = resolve(ctx.projectRoot, file)\n const ok = existsSync(path)\n return {\n name: file.replace(/\\./g, '-'),\n ok,\n message: ok ? `${file} present` : `${file} missing`,\n remediation: ok\n ? undefined\n : `Add ${file} that re-exports @woodsportal/hubspot-kit/vite/${file}`,\n severity: 'error' as const,\n }\n })\n}\n\nfunction checkDevEntry(ctx: CommandContext): DoctorCheck[] {\n const checks: DoctorCheck[] = []\n const indexHtml = resolve(ctx.projectRoot, 'index.html')\n const hasIndex = existsSync(indexHtml)\n checks.push({\n name: 'index-html',\n ok: hasIndex,\n message: hasIndex ? 'index.html present' : 'index.html missing',\n remediation: hasIndex ? undefined : 'Re-run wp init or copy index.html from kit templates',\n severity: 'error',\n })\n\n const localDev = resolve(ctx.projectRoot, ctx.config.entries.localDev)\n const hasEntry = existsSync(localDev)\n checks.push({\n name: 'local-dev-entry',\n ok: hasEntry,\n message: hasEntry ? `${ctx.config.entries.localDev} present` : `${ctx.config.entries.localDev} missing`,\n remediation: hasEntry\n ? undefined\n : 'Re-run wp init or restore src/main.tsx from kit templates',\n severity: 'error',\n })\n\n if (hasEntry) {\n try {\n const source = readFileSync(localDev, 'utf8')\n const usesKitNodeBootstrap =\n source.includes('@woodsportal/hubspot-kit/dev/bootstrap-greenfield') ||\n source.includes('@woodsportal/hubspot-kit/dev/bootstrap')\n const usesWphsShim =\n source.includes('.wphs/.kit-bootstrap-greenfield') ||\n source.includes('.wphs/.kit-bootstrap') ||\n source.includes('@wphs/bootstrap-greenfield') ||\n source.includes('@wphs/bootstrap')\n checks.push({\n name: 'local-dev-bootstrap-import',\n ok: !usesKitNodeBootstrap || usesWphsShim,\n message: usesKitNodeBootstrap\n ? `${ctx.config.entries.localDev} imports kit bootstrap via node_modules (breaks React JSX in dev)`\n : 'local dev bootstrap import uses .wphs shim',\n remediation: usesKitNodeBootstrap\n ? `Use import from '../.wphs/.kit-bootstrap-greenfield.tsx' (greenfield) or '@wphs/bootstrap' (full portal)`\n : undefined,\n severity: 'error',\n })\n } catch {\n // ignore read errors\n }\n }\n\n return checks\n}\n\nfunction checkKitScripts(): DoctorCheck {\n const script = kitPath('scripts', 'build-cdn.mjs')\n const ok = existsSync(script)\n return {\n name: 'kit-scripts',\n ok,\n message: ok ? '@woodsportal/hubspot-kit scripts installed' : 'Kit build scripts missing',\n remediation: ok ? undefined : 'Reinstall @woodsportal/hubspot-kit',\n severity: 'error',\n }\n}\n\nfunction checkWphsWorkspace(ctx: CommandContext): DoctorCheck[] {\n const workspace = ctx.config.dev.moduleConfigDir\n const checks: DoctorCheck[] = []\n\n for (const legacy of ['.dev', '.woodsportal']) {\n const legacyPath = resolve(ctx.projectRoot, legacy)\n if (existsSync(legacyPath)) {\n checks.push({\n name: `legacy-${legacy}`,\n ok: false,\n message: `Legacy workspace ${legacy}/ still present`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n }\n\n if (existsSync(resolve(ctx.projectRoot, '.wp-hs-baseline'))) {\n checks.push({\n name: 'legacy-baseline',\n ok: false,\n message: 'Legacy .wp-hs-baseline/ at repo root',\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n }\n\n if (workspace !== WPHS_WORKSPACE_DIR) {\n checks.push({\n name: 'wphs-dir',\n ok: false,\n message: `dev.moduleConfigDir must be \"${WPHS_WORKSPACE_DIR}\" (got \"${workspace}\")`,\n remediation: 'Run wp migrate --yes',\n severity: 'error',\n })\n return checks\n }\n\n const wphsRoot = resolve(ctx.projectRoot, workspace)\n const required = ['config', 'assets/branding', 'fixtures', 'cache', 'audit/baseline', 'state']\n for (const sub of required) {\n const ok = existsSync(join(wphsRoot, sub))\n checks.push({\n name: `wphs-${sub.replace(/\\//g, '-')}`,\n ok,\n message: ok ? `.wphs/${sub}/ present` : `.wphs/${sub}/ missing`,\n remediation: ok ? undefined : 'Run wp doctor (auto-scaffolds) or wp init',\n severity: 'error',\n })\n }\n\n return checks\n}\n\nfunction checkAdapter(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config)) return null\n const adapterPath = resolve(ctx.projectRoot, ctx.config.dev.adapter)\n const ok = existsSync(adapterPath)\n return {\n name: 'wphs-adapter',\n ok,\n message: ok ? `${ctx.config.dev.adapter} present` : `${ctx.config.dev.adapter} missing`,\n remediation: ok ? undefined : 'Create wphs.adapter.ts (see kit templates)',\n severity: 'warn',\n }\n}\n\nfunction checkModuleConfigUiDeps(ctx: CommandContext): DoctorCheck[] {\n if (isThemeProject(ctx.config)) return []\n\n const pkgPath = resolve(ctx.projectRoot, 'package.json')\n if (!existsSync(pkgPath)) return []\n\n let deps: Record<string, string> = {}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n devDependencies?: Record<string, string>\n dependencies?: Record<string, string>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n return []\n }\n\n return MODULE_CONFIG_UI_DEPS.map((name) => {\n const ok = Boolean(deps[name])\n return {\n name: `module-config-${name.replace(/[@/]/g, '-')}`,\n ok,\n message: ok ? `${name} installed` : `${name} missing (module-config overlay)`,\n remediation: ok\n ? undefined\n : 'Run yarn install after wp init, or add @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities to devDependencies',\n severity: 'error' as const,\n }\n })\n}\n\nfunction checkNodeLoaderInterop(): DoctorCheck {\n const warning = nodeLoaderInteropWarning()\n return {\n name: 'node-loader-interop',\n ok: !warning,\n message: warning ?? `Node ${process.versions.node} (Vite config load OK)`,\n remediation: warning ?? undefined,\n severity: 'warn',\n }\n}\n\nfunction checkViteInstalled(ctx: CommandContext): DoctorCheck | null {\n if (isThemeProject(ctx.config) && !existsSync(resolve(ctx.projectRoot, 'vite.config.dev.mjs'))) {\n return null\n }\n const ok = isProjectViteInstalled(ctx.projectRoot)\n return {\n name: 'vite',\n ok,\n message: ok ? 'vite installed' : 'vite not installed',\n remediation: ok\n ? undefined\n : 'Run yarn install or npm install (wp init scaffolds vite + peer deps in devDependencies)',\n severity: 'error',\n }\n}\n\nasync function gatherDoctorChecks(ctx: CommandContext): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = []\n\n await runCliTasks(ctx, [\n {\n title: 'Preparing .wphs workspace',\n task: async () => {\n if (ctx.global.dryRun) return\n try {\n runNodeScript(kitPath('scripts', 'ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n } catch {\n // non-fatal before config validation\n }\n },\n },\n {\n title: 'Checking Node, Vite, and kit scripts',\n task: async () => {\n checks.push(checkNode(), checkNodeLoaderInterop(), checkKitScripts())\n const uploadOnlyNote = checkUploadOnlyNote(ctx)\n if (uploadOnlyNote) {\n checks.push(uploadOnlyNote)\n } else {\n checks.push(checkDevViteConfig(ctx), ...checkCdnViteConfigs(ctx), ...checkDevEntry(ctx))\n checks.push(...checkCssPipeline(ctx))\n const hybridHtml = checkHybridModuleHtml(ctx)\n if (hybridHtml) checks.push(hybridHtml)\n const viteCheck = checkViteInstalled(ctx)\n if (viteCheck) checks.push(viteCheck)\n checks.push(...checkModuleConfigUiDeps(ctx))\n }\n },\n },\n {\n title: 'Checking woodscli.json and project layout',\n task: async () => {\n checks.push(...checkConfig(ctx), ...checkWphsWorkspace(ctx))\n const fieldsCheck = checkFieldsJson(ctx)\n if (fieldsCheck) checks.push(fieldsCheck)\n const metaCheck = checkMetaJson(ctx)\n if (metaCheck) checks.push(metaCheck)\n const adapterCheck = checkAdapter(ctx)\n if (adapterCheck) checks.push(adapterCheck)\n },\n },\n {\n title: 'Checking HubSpot CLI (this can take a few seconds)',\n task: async () => {\n checks.push(...doctorHubSpotChecks(ctx.projectRoot))\n },\n },\n {\n title: 'Checking environment and CDN files',\n task: async () => {\n const legacyBuildId = checkLegacyBuildIdFile(ctx)\n if (legacyBuildId) checks.push(legacyBuildId)\n const buildIdCheck = checkBuildId(ctx)\n if (buildIdCheck) checks.push(buildIdCheck)\n const resolvedBuildId = checkModuleBuildIdResolved(ctx)\n if (resolvedBuildId) checks.push(resolvedBuildId)\n const devSlugCheck = checkDevSlug(ctx)\n if (devSlugCheck) checks.push(devSlugCheck)\n checks.push(...checkEnvFiles(ctx))\n const cdnMirrorCheck = await checkCdnMirrorPublic(ctx)\n if (cdnMirrorCheck) checks.push(cdnMirrorCheck)\n },\n },\n ])\n\n return checks.filter((c): c is DoctorCheck => c !== null)\n}\n\nfunction printDoctorResults(ctx: CommandContext, checks: DoctorCheck[]): void {\n if (ctx.global.json) return\n\n const interactive = isInteractiveCli(ctx)\n const verbose = ctx.global.verbose\n const showPassing = !interactive || verbose\n\n if (interactive) {\n process.stdout.write('\\n')\n }\n\n for (const check of checks) {\n if (check.ok && !showPassing) continue\n\n if (check.ok) {\n ctx.logger.success(check.message)\n } else if (check.severity === 'warn') {\n ctx.logger.warn(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n } else {\n ctx.logger.error(check.message)\n if (check.remediation) ctx.logger.info(` → ${check.remediation}`)\n }\n }\n}\n\nexport async function runDoctor(ctx: CommandContext): Promise<number> {\n const checks = await gatherDoctorChecks(ctx)\n\n const failed = checks.filter((c) => !c.ok && (c.severity ?? 'error') === 'error')\n const warnings = checks.filter((c) => !c.ok && c.severity === 'warn')\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'doctor',\n ok: failed.length === 0,\n warnings: warnings.length,\n checks,\n })\n } else {\n printDoctorResults(ctx, checks)\n\n if (!ctx.global.quiet && failed.length === 0) {\n const summary =\n warnings.length > 0\n ? `${checks.length} checks passed · ${warnings.length} warning(s)`\n : `${checks.length} checks passed`\n printCommandDone(ctx, summary)\n }\n }\n\n if (failed.length > 0) {\n throw new WpHsError(`${failed.length} doctor check(s) failed`, {\n exitCode: ExitCode.PREREQUISITE,\n })\n }\n\n if (warnings.length > 0 && !ctx.global.quiet && !ctx.global.json) {\n ctx.logger.warn(\n `${warnings.length} optional check(s) — local dev may work; fix before wp upload / wp watch`,\n )\n }\n\n return ExitCode.SUCCESS\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { CommandContext } from '../cli/context.js'\n\nexport type CliTask = {\n title: string\n task: () => void | Promise<void>\n}\n\nexport type ProgressOptions = {\n /** When false, never show spinners (e.g. nested call from deploy). Default: interactive TTY */\n progress?: boolean\n /** Shown immediately before task spinners (avoids a silent gap while Vite starts). */\n intro?: string\n}\n\n/** TTY + human mode — skip for --json, --quiet, --ci */\nexport function isInteractiveCli(ctx: CommandContext): boolean {\n const { json, quiet, ci } = ctx.global\n return !json && !quiet && !ci && process.stdout.isTTY === true\n}\n\nexport function shouldShowProgress(\n ctx: CommandContext,\n override?: boolean,\n): boolean {\n if (override === false) return false\n if (ctx.global.verbose) return false\n return isInteractiveCli(ctx)\n}\n\nfunction isVerboseStepLog(ctx: CommandContext): boolean {\n return ctx.global.verbose === true && !ctx.global.quiet && !ctx.global.json\n}\n\n/** Yield so @clack can paint spinner frames before blocking work starts. */\nexport async function yieldForSpinnerPaint(): Promise<void> {\n await new Promise<void>((resolve) => {\n setImmediate(resolve)\n })\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 48)\n })\n}\n\n/**\n * Run phased CLI work with @clack/prompts spinners (or sequential fallback).\n * Uses async spawn in child commands so the event loop can animate spinners.\n */\nexport async function runCliTasks(\n ctx: CommandContext,\n tasks: CliTask[],\n options: ProgressOptions = {},\n): Promise<void> {\n if (!shouldShowProgress(ctx, options.progress)) {\n const verbose = isVerboseStepLog(ctx)\n if (verbose && options.intro) {\n ctx.logger.info(options.intro)\n }\n for (const step of tasks) {\n if (verbose) {\n ctx.logger.step(step.title)\n }\n try {\n await step.task()\n if (verbose) {\n ctx.logger.stepDone(step.title)\n }\n } catch (error) {\n if (verbose) {\n ctx.logger.error(step.title)\n }\n throw error\n }\n }\n return\n }\n\n if (tasks.length === 0) {\n return\n }\n\n const spinner = p.spinner()\n const firstTitle = tasks[0].title\n spinner.start(options.intro ?? firstTitle)\n await yieldForSpinnerPaint()\n\n for (let i = 0; i < tasks.length; i++) {\n const step = tasks[i]\n if (i > 0) {\n spinner.start(step.title)\n await yieldForSpinnerPaint()\n } else if (options.intro) {\n spinner.message(firstTitle)\n await yieldForSpinnerPaint()\n }\n\n try {\n await step.task()\n spinner.stop(step.title)\n } catch (error) {\n spinner.stop(pc.red(step.title))\n throw error\n }\n }\n}\n\n/**\n * True when child processes (Vite, git, etc.) should pipe output so @clack spinners stay visible.\n * Pass quietSubprocess: true from nested commands (e.g. deploy → build).\n */\nexport function shouldQuietSubprocess(\n ctx: CommandContext,\n options: { progress?: boolean; quietSubprocess?: boolean; /** @deprecated */ quietVite?: boolean } = {},\n): boolean {\n if (ctx.global.verbose) return false\n if (options.quietSubprocess === true || options.quietVite === true) return true\n return shouldShowProgress(ctx, options.progress)\n}\n\n/** @deprecated use shouldQuietSubprocess */\nexport const shouldQuietViteBuild = shouldQuietSubprocess\n\n/** Green ◆ summary line (interactive) or logger.success fallback */\nexport function printCommandDone(ctx: CommandContext, message: string): void {\n if (isInteractiveCli(ctx)) {\n process.stdout.write(`${pc.green('◆')} ${message}\\n`)\n return\n }\n ctx.logger.success(message)\n}\n\nexport type CliSpinnerHandle = {\n message: (text: string) => void\n stop: (finalMessage?: string) => void\n}\n\n/** Single spinner for one blocking step */\nexport function createCliSpinner(ctx: CommandContext, label: string): CliSpinnerHandle | null {\n if (!isInteractiveCli(ctx)) return null\n\n const spinner = p.spinner()\n spinner.start(label)\n\n return {\n message: (text: string) => {\n spinner.message(text)\n },\n stop: (finalMessage?: string) => {\n spinner.stop(finalMessage)\n },\n }\n}\n\nexport async function withCliSpinner<T>(\n ctx: CommandContext,\n label: string,\n fn: () => T | Promise<T>,\n options: ProgressOptions = {},\n): Promise<T> {\n if (!shouldShowProgress(ctx, options.progress)) {\n return await fn()\n }\n\n const spinner = createCliSpinner(ctx, label)\n await yieldForSpinnerPaint()\n try {\n return await fn()\n } finally {\n spinner?.stop()\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { spawnSync, type SpawnSyncReturns } from 'node:child_process'\n\nimport type { CommandContext } from '../cli/context.js'\nimport { ExitCode, WpHsError } from './errors.js'\n\nexport const HUBSPOT_CONFIG_FILE = 'hubspot.config.yml'\nexport const HUBSPOT_CONFIG_EXAMPLE = 'hubspot.config.yml.example'\n\nconst HS_VERSION_TIMEOUT_MS = 5_000\nconst HS_ACCOUNTS_TIMEOUT_MS = 10_000\n\nconst PLACEHOLDER_PATTERNS = [\n /YOUR_PAT_HERE/i,\n /your-portal-id/i,\n /personalAccessKey:\\s*$/m,\n /portalId:\\s*12345678\\b/,\n]\n\nexport type HubSpotConfigFileAssessment = {\n configPath: string\n examplePath: string\n configPresent: boolean\n examplePresent: boolean\n looksLikePlaceholder: boolean\n}\n\nfunction spawnHs(\n args: string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): SpawnSyncReturns<string> {\n return spawnSync('hs', args, {\n cwd: options.cwd,\n encoding: 'utf8',\n timeout: options.timeoutMs ?? HS_ACCOUNTS_TIMEOUT_MS,\n // Keep HubSpot CLI off the interactive TTY (avoids hangs under @clack spinners)\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n}\n\nfunction hsTimedOut(result: SpawnSyncReturns<string>): boolean {\n const err = result.error as NodeJS.ErrnoException | undefined\n return err?.code === 'ETIMEDOUT'\n}\n\n/** Fast sync checks — no HubSpot CLI subprocess (used by wp dev). */\nexport function assessHubSpotConfigFiles(projectRoot: string): HubSpotConfigFileAssessment {\n const configPath = resolve(projectRoot, HUBSPOT_CONFIG_FILE)\n const examplePath = resolve(projectRoot, HUBSPOT_CONFIG_EXAMPLE)\n const configPresent = existsSync(configPath)\n const examplePresent = existsSync(examplePath)\n\n let looksLikePlaceholder = false\n if (configPresent) {\n const raw = readFileSync(configPath, 'utf8')\n looksLikePlaceholder = PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(raw))\n } else {\n looksLikePlaceholder = true\n }\n\n return {\n configPath,\n examplePath,\n configPresent,\n examplePresent,\n looksLikePlaceholder,\n }\n}\n\nfunction runHubSpotCliChecks(\n projectRoot: string,\n options: { checkAccounts?: boolean } = {},\n): Pick<HubSpotSetupAssessment, 'hsCliInstalled' | 'hsCliVersion' | 'authenticated' | 'accountsHint'> {\n const checkAccounts = options.checkAccounts !== false\n\n const hsVersion = spawnHs(['--version'], { timeoutMs: HS_VERSION_TIMEOUT_MS })\n const hsCliInstalled = hsVersion.status === 0 && !hsTimedOut(hsVersion)\n const hsCliVersion = hsCliInstalled ? (hsVersion.stdout || hsVersion.stderr || '').trim() : null\n\n let authenticated = false\n let accountsHint: string | null = null\n\n if (hsCliInstalled && checkAccounts) {\n const accounts = spawnHs(['accounts', 'list'], {\n cwd: projectRoot,\n timeoutMs: HS_ACCOUNTS_TIMEOUT_MS,\n })\n const output = `${accounts.stdout || ''}\\n${accounts.stderr || ''}`.trim()\n accountsHint = hsTimedOut(accounts) ? 'timed out' : output || null\n authenticated =\n !hsTimedOut(accounts) &&\n accounts.status === 0 &&\n /Account:|portalId|portal/i.test(output) &&\n !/No accounts/i.test(output)\n }\n\n return { hsCliInstalled, hsCliVersion, authenticated, accountsHint }\n}\n\nexport type HubSpotSetupAssessment = HubSpotConfigFileAssessment & {\n hsCliInstalled: boolean\n hsCliVersion: string | null\n authenticated: boolean\n accountsHint: string | null\n}\n\nexport function assessHubSpotCliSetup(\n projectRoot: string,\n options: { checkAccounts?: boolean } = {},\n): HubSpotSetupAssessment {\n return {\n ...assessHubSpotConfigFiles(projectRoot),\n ...runHubSpotCliChecks(projectRoot, options),\n }\n}\n\nexport function hubSpotSetupRemediation(\n projectRoot: string,\n assessment: HubSpotSetupAssessment = assessHubSpotCliSetup(projectRoot),\n): string[] {\n const steps: string[] = []\n\n if (!assessment.hsCliInstalled) {\n steps.push('Install HubSpot CLI: npm i -g @hubspot/cli')\n }\n\n if (!assessment.configPresent) {\n if (assessment.examplePresent) {\n steps.push(`Run wp setup (copies ${HUBSPOT_CONFIG_EXAMPLE} → ${HUBSPOT_CONFIG_FILE}) and add portal + PAT`)\n } else {\n steps.push(`Create ${HUBSPOT_CONFIG_FILE} (see docs/HUBSPOT-CLI-SETUP.md)`)\n }\n steps.push('Generate a PAT: https://app.hubspot.com/l/personal-access-key')\n } else if (assessment.looksLikePlaceholder) {\n steps.push(`Edit ${HUBSPOT_CONFIG_FILE} — replace placeholder portalId and personalAccessKey`)\n }\n\n if (assessment.configPresent && !assessment.looksLikePlaceholder && !assessment.authenticated) {\n steps.push('Run wp auth (or hs auth) and confirm with: hs accounts list')\n }\n\n return steps\n}\n\nexport type HubSpotSetupMode = 'local' | 'cms'\n\nfunction hubSpotLocalDevRemediation(files: HubSpotConfigFileAssessment): string[] {\n const steps: string[] = []\n\n if (!files.configPresent) {\n if (files.examplePresent) {\n steps.push(`Run wp setup (copies ${HUBSPOT_CONFIG_EXAMPLE} → ${HUBSPOT_CONFIG_FILE}) and add portal + PAT`)\n } else {\n steps.push(`Create ${HUBSPOT_CONFIG_FILE} (see docs/HUBSPOT-CLI-SETUP.md)`)\n }\n steps.push('Generate a PAT: https://app.hubspot.com/l/personal-access-key')\n } else if (files.looksLikePlaceholder) {\n steps.push(`Edit ${HUBSPOT_CONFIG_FILE} — replace placeholder portalId and personalAccessKey`)\n }\n\n return steps\n}\n\nfunction cmsEnsureAssessment(projectRoot: string): HubSpotSetupAssessment {\n return assessHubSpotCliSetup(projectRoot, { checkAccounts: false })\n}\n\nfunction throwCmsConfigError(_ctx: CommandContext, files: HubSpotConfigFileAssessment): never {\n const steps = hubSpotLocalDevRemediation(files)\n throw new WpHsError('HubSpot config is not ready for cms watch/upload in this project.', {\n exitCode: ExitCode.PREREQUISITE,\n remediation: steps.join('; '),\n })\n}\n\n/**\n * Filesystem-only CMS prereq — no `hs` subprocess (safe for wp watch; Ctrl+C stays responsive).\n */\nexport function ensureHubSpotConfigForCms(ctx: CommandContext): void {\n if (ctx.global.dryRun || ctx.global.json) return\n\n const files = assessHubSpotConfigFiles(ctx.projectRoot)\n if (files.configPresent && !files.looksLikePlaceholder) return\n\n throwCmsConfigError(ctx, files)\n}\n\n/**\n * Warn (local dev) or require (upload/deploy) HubSpot CLI project setup.\n * CMS mode: hubspot.config.yml + `hs --version` (5s timeout) — no `hs accounts list`.\n * Use {@link ensureHubSpotConfigForCms} for wp watch (long-running TTY).\n */\nexport function ensureHubSpotCliSetup(ctx: CommandContext, mode: HubSpotSetupMode): void {\n if (ctx.global.dryRun || ctx.global.json) return\n\n if (mode === 'local') {\n const files = assessHubSpotConfigFiles(ctx.projectRoot)\n if (files.configPresent && !files.looksLikePlaceholder) {\n return\n }\n\n const steps = hubSpotLocalDevRemediation(files)\n ctx.logger.warn(\n 'HubSpot upload/watch is not configured for this project (local preview still works).',\n )\n for (const step of steps) {\n ctx.logger.info(` → ${step}`)\n }\n ctx.logger.info(' → Full HubSpot CLI checks: wp doctor')\n ctx.logger.info(' → Docs: @woodsportal/hubspot-kit/docs/HUBSPOT-CLI-SETUP.md')\n return\n }\n\n const assessment = cmsEnsureAssessment(ctx.projectRoot)\n const needsSetup =\n !assessment.hsCliInstalled ||\n !assessment.configPresent ||\n assessment.looksLikePlaceholder\n\n if (!needsSetup) return\n\n const steps = hubSpotSetupRemediation(ctx.projectRoot, assessment)\n const headline = 'HubSpot CLI is not ready for cms upload/watch in this project.'\n\n throw new WpHsError(headline, {\n exitCode: ExitCode.PREREQUISITE,\n remediation: steps.join('; '),\n })\n}\n\nexport function doctorHubSpotChecks(projectRoot: string): Array<{\n name: string\n ok: boolean\n message: string\n remediation?: string\n severity?: 'warn' | 'error'\n}> {\n const assessment = assessHubSpotCliSetup(projectRoot, { checkAccounts: true })\n const steps = hubSpotSetupRemediation(projectRoot, assessment)\n const remediation = steps.length > 0 ? steps.join(' · ') : undefined\n\n return [\n {\n name: 'hubspot-cli',\n ok: assessment.hsCliInstalled,\n message: assessment.hsCliInstalled\n ? `HubSpot CLI ${assessment.hsCliVersion ?? ''}`.trim()\n : 'HubSpot CLI not installed',\n remediation: assessment.hsCliInstalled ? undefined : 'npm i -g @hubspot/cli',\n severity: 'error',\n },\n {\n name: 'hubspot-config',\n ok: assessment.configPresent && !assessment.looksLikePlaceholder,\n message: !assessment.configPresent\n ? `${HUBSPOT_CONFIG_FILE} missing (required for wp upload / wp watch)`\n : assessment.looksLikePlaceholder\n ? `${HUBSPOT_CONFIG_FILE} still has placeholder values`\n : `${HUBSPOT_CONFIG_FILE} present`,\n remediation,\n severity: 'warn',\n },\n {\n name: 'hubspot-auth',\n ok: assessment.authenticated,\n message: assessment.authenticated\n ? 'HubSpot CLI authenticated for this project'\n : assessment.accountsHint === 'timed out'\n ? 'HubSpot CLI auth check timed out — run hs accounts list manually'\n : 'HubSpot CLI not authenticated (or no portal in hubspot.config.yml)',\n remediation: assessment.authenticated ? undefined : 'wp auth · hs accounts list',\n severity: 'warn',\n },\n ]\n}\n","/** Dev deps required for `wp dev` (Vite preset peer dependencies). */\nexport const VITE_DEV_PEER_DEPS: Record<string, string> = {\n vite: '^6.1.0',\n '@vitejs/plugin-react': '^4.3.4',\n 'babel-plugin-react-compiler': '^1.0.0',\n '@tailwindcss/vite': '^4.0.6',\n '@tanstack/router-plugin': '^1.121.2',\n '@tanstack/react-router': '^1.121.2',\n '@dnd-kit/core': '^6.3.1',\n '@dnd-kit/sortable': '^10.0.0',\n '@dnd-kit/utilities': '^3.2.2',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n tailwindcss: '^4.0.6',\n}\n\nexport const KIT_DEV_DEP = '@woodsportal/hubspot-kit'\n\n/** Latest kit version pinned in `wp init` scaffolds. Keep aligned with package.json. */\nexport const KIT_DEV_DEP_VERSION = '^1.0.30'\n\n/** Required for module-config overlay UI (HsRepeaterList drag-and-drop). */\nexport const MODULE_CONFIG_UI_DEPS = [\n '@dnd-kit/core',\n '@dnd-kit/sortable',\n '@dnd-kit/utilities',\n] as const\n\nexport function templateDevDependencies(): Record<string, string> {\n return {\n [KIT_DEV_DEP]: KIT_DEV_DEP_VERSION,\n ...VITE_DEV_PEER_DEPS,\n }\n}\n","/** HubSpot CMS module field types (fields.json `type` values). */\nexport const HUBSPOT_MODULE_FIELD_TYPES = new Set([\n 'boolean',\n 'choice',\n 'color',\n 'cta',\n 'date',\n 'datetime',\n 'email',\n 'embed',\n 'file',\n 'followup_email',\n 'font',\n 'form',\n 'group',\n 'html',\n 'hubdb_row',\n 'hubdb_table',\n 'icon',\n 'image',\n 'link',\n 'logo',\n 'meeting',\n 'menu',\n 'number',\n 'page',\n 'payment',\n 'richtext',\n 'salesforce_campaign',\n 'simple_menu',\n 'spacing',\n 'tag',\n 'text',\n 'url',\n 'video',\n 'workflow',\n])\n\nexport type FieldsJsonIssue = {\n path: string\n message: string\n}\n\nfunction isFieldRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction validateFieldNode(node: unknown, path: string, issues: FieldsJsonIssue[]): void {\n if (!isFieldRecord(node)) {\n issues.push({ path, message: 'expected a field object' })\n return\n }\n\n const type = node.type\n if (typeof type !== 'string' || type.length === 0) {\n issues.push({ path: `${path}.type`, message: 'missing field type' })\n } else if (!HUBSPOT_MODULE_FIELD_TYPES.has(type)) {\n issues.push({\n path: `${path}.type`,\n message:\n type === 'textarea'\n ? `'textarea' is not a HubSpot field type — use \"type\": \"text\" with \"display\": \"textarea\"`\n : `'${type}' is not a valid HubSpot field type`,\n })\n }\n\n const tab = node.tab\n if (tab === 'STYLE' && type !== 'group') {\n issues.push({\n path: `${path}.tab`,\n message:\n 'STYLE tab fields must live inside a \"type\": \"group\" with \"tab\": \"STYLE\" (HubSpot page editor Styles tab)',\n })\n }\n\n if (type !== 'group') {\n const name = node.name\n if (typeof name !== 'string' || name.trim().length === 0) {\n issues.push({ path: `${path}.name`, message: 'missing field name' })\n }\n\n const label = node.label\n if (typeof label !== 'string' || label.trim().length === 0) {\n issues.push({ path: `${path}.label`, message: 'missing field label' })\n }\n } else {\n const children = node.children\n if (!Array.isArray(children)) {\n issues.push({ path: `${path}.children`, message: 'group fields require a children array' })\n } else {\n children.forEach((child, index) => {\n validateFieldNode(child, `${path}.children[${index}]`, issues)\n })\n }\n }\n}\n\nexport function validateHubSpotFieldsJson(fields: unknown): FieldsJsonIssue[] {\n if (!Array.isArray(fields)) {\n return [{ path: '$', message: 'fields.json must be a top-level array' }]\n }\n\n const issues: FieldsJsonIssue[] = []\n fields.forEach((field, index) => {\n validateFieldNode(field, `[${index}]`, issues)\n })\n return issues\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nconst SLUG_MAX_LEN = 12\nconst SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,10}[a-z0-9])?$/\n\nexport const DEVELOPER_CONFIG_FILE = 'developer.json'\n\nexport function developerConfigPath(projectRoot: string): string {\n return resolve(projectRoot, '.wphs', 'config', DEVELOPER_CONFIG_FILE)\n}\n\nexport function sanitizeDevSlug(input: string | undefined): string | undefined {\n if (!input?.trim()) return undefined\n const slug = input\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, SLUG_MAX_LEN)\n if (!slug || !SLUG_PATTERN.test(slug)) return undefined\n return slug\n}\n\nexport function readDeveloperSlug(projectRoot: string): string | undefined {\n const fromEnv =\n sanitizeDevSlug(process.env.PORTAL_CDN_DEV_SLUG) ??\n sanitizeDevSlug(process.env.MODULE_CDN_DEV_SLUG)\n if (fromEnv) return fromEnv\n\n const path = developerConfigPath(projectRoot)\n if (!existsSync(path)) return undefined\n try {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as { slug?: string }\n return sanitizeDevSlug(raw.slug)\n } catch {\n return undefined\n }\n}\n\nexport function writeDeveloperSlug(projectRoot: string, slug: string): void {\n const normalized = sanitizeDevSlug(slug)\n if (!normalized) {\n throw new Error('Invalid CDN dev slug — use lowercase letters, numbers, and hyphens (max 12 chars)')\n }\n const path = developerConfigPath(projectRoot)\n mkdirSync(resolve(path, '..'), { recursive: true })\n writeFileSync(path, `${JSON.stringify({ slug: normalized }, null, 2)}\\n`)\n}\n\nexport function needsDeveloperSlugSetup(projectRoot: string): boolean {\n return !readDeveloperSlug(projectRoot)\n}\n\nexport async function promptDeveloperSlug(projectRoot: string): Promise<string | undefined> {\n if (!needsDeveloperSlugSetup(projectRoot)) {\n return readDeveloperSlug(projectRoot)\n }\n\n const slug = await p.text({\n message:\n 'CDN dev slug (unique per developer for shared CDN mirror — e.g. your first name)',\n placeholder: 'manab',\n validate: (value) => {\n if (!sanitizeDevSlug(value)) {\n return 'Use 1–12 lowercase letters, numbers, or hyphens'\n }\n return undefined\n },\n })\n\n if (p.isCancel(slug) || typeof slug !== 'string') {\n return undefined\n }\n\n writeDeveloperSlug(projectRoot, slug)\n return sanitizeDevSlug(slug)\n}\n","import { spawnSync } from 'node:child_process'\n\nimport { kitPath } from './paths.js'\n\nexport type BumpModuleBuildIdResult = {\n id: string\n bumped: boolean\n source: string\n slug?: string\n seq?: number\n baseline?: string\n}\n\nexport type ModuleBuildIdMeta = {\n id: string\n source: string\n slug?: string\n seq?: number\n baseline?: string\n}\n\nfunction runKitScript(\n script: string,\n args: string[],\n options: { cwd: string; env: NodeJS.ProcessEnv; dryRun?: boolean },\n): string {\n const result = spawnSync(process.execPath, [kitPath('scripts', script), ...args], {\n cwd: options.cwd,\n env: {\n ...options.env,\n WP_HS_PROJECT_ROOT: options.cwd,\n },\n encoding: 'utf8',\n })\n\n if (result.status !== 0) {\n const stderr = result.stderr?.trim() || result.stdout?.trim()\n throw new Error(stderr || `Failed running ${script}`)\n }\n\n return (result.stdout ?? '').trim()\n}\n\nexport function bumpModuleBuildIdForCli(\n projectRoot: string,\n options: { tier?: string; dryRun?: boolean; env?: NodeJS.ProcessEnv } = {},\n): BumpModuleBuildIdResult {\n const args = [...(options.tier ? [`--tier=${options.tier}`] : []), ...(options.dryRun ? ['--dry-run'] : [])]\n const stdout = runKitScript('bump-module-build-id.mjs', args, {\n cwd: projectRoot,\n env: options.env ?? process.env,\n dryRun: options.dryRun,\n })\n return JSON.parse(stdout) as BumpModuleBuildIdResult\n}\n\nexport function resolveModuleBuildIdMetaForCli(\n projectRoot: string,\n env: NodeJS.ProcessEnv = process.env,\n): ModuleBuildIdMeta {\n const stdout = runKitScript('resolve-module-build-id-meta.mjs', [], {\n cwd: projectRoot,\n env,\n })\n return JSON.parse(stdout) as ModuleBuildIdMeta\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** True when project has HubSpot .module artifacts but no local dev app yet. */\nexport function isUploadOnlyPreexistingProject(\n projectRoot: string,\n moduleArtifactDirs: string[],\n): boolean {\n if (moduleArtifactDirs.length === 0) return false\n if (existsSync(resolve(projectRoot, 'package.json'))) return false\n if (existsSync(resolve(projectRoot, 'src'))) return false\n return moduleArtifactDirs.some((dir) => existsSync(resolve(dir, 'fields.json')))\n}\n","import { existsSync } from 'node:fs'\nimport { platform } from 'node:os'\nimport { resolve } from 'node:path'\n\nimport { kitPath } from '../lib/paths.js'\n\nconst CONSUMER_DEV_CONFIG = 'vite.config.dev.mjs'\nconst VITE_JS_SEGMENTS = ['node_modules', 'vite', 'bin', 'vite.js'] as const\n\n/**\n * Vite resolves config dependencies from the config file's package context.\n * The preset must be re-exported from the consumer repo (vite.config.dev.mjs)\n * so `vite` and plugins resolve from the project's node_modules.\n */\nexport function resolveDevViteConfigPath(projectRoot: string): string {\n const consumerConfig = resolve(projectRoot, CONSUMER_DEV_CONFIG)\n if (existsSync(consumerConfig)) {\n return consumerConfig\n }\n return kitPath('vite', 'vite.config.dev.mjs')\n}\n\nexport type ProjectViteSpawn = {\n command: string\n /** Arguments placed before Vite CLI flags (e.g. path to vite.js when command is node). */\n prefixArgs: string[]\n}\n\n/** True when the consumer project has the vite package installed (cross-platform). */\nexport function isProjectViteInstalled(projectRoot: string): boolean {\n return existsSync(resolve(projectRoot, ...VITE_JS_SEGMENTS))\n}\n\n/**\n * Resolve how to spawn Vite from the consumer project.\n * Windows: `.bin/vite` is a shell shim — spawn `node …/vite/bin/vite.js` or `vite.cmd`.\n */\nexport function resolveProjectViteSpawn(projectRoot: string): ProjectViteSpawn | null {\n const viteJs = resolve(projectRoot, ...VITE_JS_SEGMENTS)\n if (existsSync(viteJs)) {\n return { command: process.execPath, prefixArgs: [viteJs] }\n }\n\n const binDir = resolve(projectRoot, 'node_modules', '.bin')\n if (platform() === 'win32') {\n const winCmd = resolve(binDir, 'vite.cmd')\n if (existsSync(winCmd)) {\n return { command: winCmd, prefixArgs: [] }\n }\n }\n\n const posixShim = resolve(binDir, 'vite')\n if (existsSync(posixShim)) {\n return { command: posixShim, prefixArgs: [] }\n }\n\n return null\n}\n\n/** Human-readable spawn target for dry-run logs. */\nexport function formatProjectViteSpawn(spawn: ProjectViteSpawn): string {\n return [spawn.command, ...spawn.prefixArgs].join(' ')\n}\n\n/** @deprecated Prefer {@link resolveProjectViteSpawn} — kept for dry-run display. */\nexport function resolveProjectViteBin(projectRoot: string): string {\n const spawn = resolveProjectViteSpawn(projectRoot)\n if (!spawn) {\n return 'vite'\n }\n return formatProjectViteSpawn(spawn)\n}\n","/** Current Active LTS — update when Node release schedule changes. */\nexport const NODE_LTS_RECOMMENDED = '24'\n\n/**\n * Node ESM/CJS loader regressions that break sync require() of ESM-only packages.\n * Node 24 LTS is supported; warnings target known-bad 22.18+ and early 23.x only.\n * @see https://github.com/nodejs/node/issues/59366\n */\nexport function nodeLoaderInteropWarning(): string | null {\n const [major, minor] = process.versions.node.split('.').map(Number)\n\n if (major === 22 && minor >= 18) {\n return `Node 22.18+ can fail loading Vite config (getStatus). Upgrade to Node ${NODE_LTS_RECOMMENDED} LTS or the latest Node 22 patch.`\n }\n\n if (major === 23 && minor < 4) {\n return `Node 23.0–23.3 can fail loading Vite config (getStatus). Upgrade to Node ${NODE_LTS_RECOMMENDED} LTS.`\n }\n\n return null\n}\n","import { validateConfigFile } from '../../lib/config.js'\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport async function runConfigValidate(ctx: CommandContext): Promise<number> {\n const result = validateConfigFile(ctx.projectRoot)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'config validate',\n valid: result.valid,\n errors: result.errors,\n config: result.config,\n })\n } else if (result.valid) {\n ctx.logger.success(`${WOODSCLI_CONFIG_FILE} is valid`)\n } else {\n for (const err of result.errors) {\n ctx.logger.error(err)\n }\n }\n\n return result.valid ? ExitCode.SUCCESS : ExitCode.USER_ERROR\n}\n","import { resolve } from 'node:path'\n\nimport { bumpModuleBuildIdForCli } from '../../lib/module-build-id.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { formatProjectLabel } from '../../lib/cli-banner.js'\nimport {\n printCommandDone,\n runCliTasks,\n shouldQuietSubprocess,\n type CliTask,\n} from '../../lib/cli-spinner.js'\nimport { runNodeScriptAsync } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER, type BuildTier } from '../../lib/build-tier.js'\nimport { isThemeProject, usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type { BuildTier }\n\nexport type BuildOptions = {\n tier?: BuildTier\n cdnOnly?: boolean\n hubspotOnly?: boolean\n cdnEsm?: boolean\n progress?: boolean\n /** Suppress ◆ Build complete (nested deploy). */\n quiet?: boolean\n /** Pipe child-process output when a parent command shows progress spinners. */\n quietSubprocess?: boolean\n /** @deprecated use quietSubprocess */\n quietVite?: boolean\n /** Parent already bumped module build id (deploy). */\n buildIdBumped?: boolean\n /** Inherit env from parent command (deploy publish pin). */\n env?: NodeJS.ProcessEnv\n}\n\nfunction tierToViteModeFlag(tier: BuildTier): string[] {\n if (tier === 'dev') return ['--dev']\n if (tier === 'stg') return ['--stg']\n return ['--prod']\n}\n\nfunction buildTasks(\n ctx: CommandContext,\n options: BuildOptions,\n run: (script: string, args?: string[]) => Promise<void>,\n): CliTask[] {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const isTheme = isThemeProject(ctx.config)\n const useCdn = usesCdnPipeline(ctx.config) && !isTheme\n const tasks: CliTask[] = []\n\n if (isTheme && !options.cdnOnly) {\n return tasks\n }\n\n if (ctx.config.projectType === 'module-monolith' && !options.cdnOnly) {\n tasks.push({\n title: `Building monolith module (${tier})`,\n task: async () => {\n await run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.monolith.mjs'),\n ...tierToViteModeFlag(tier),\n ])\n await run('run-hubspot-module-postbuild.mjs')\n },\n })\n return tasks\n }\n\n if (!options.hubspotOnly && useCdn) {\n tasks.push({\n title: `Building CDN (${tier})`,\n task: async () => {\n if (options.cdnEsm) {\n await run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.cdn-esm.mjs'),\n ...tierToViteModeFlag(tier),\n ])\n } else {\n await run('build-cdn.mjs', tierToViteModeFlag(tier))\n }\n await run('generate-cdn-manifest.mjs')\n },\n })\n }\n\n if (!options.cdnOnly) {\n tasks.push({\n title: `Building HubSpot module (${tier})`,\n task: async () => {\n await run('run-vite-build.mjs', [\n resolve(ctx.projectRoot, 'vite.config.hubspot.mjs'),\n ...tierToViteModeFlag(tier),\n ])\n await run('run-hubspot-module-postbuild.mjs')\n },\n })\n }\n\n if (!options.cdnOnly && !options.hubspotOnly) {\n tasks.push({\n title: 'Running bundle checks',\n task: async () => {\n await run('check-hubspot-bundle-size.mjs')\n await run('write-audit-artifacts.mjs')\n },\n })\n }\n\n return tasks\n}\n\nfunction buildIntroLine(\n ctx: CommandContext,\n tier: BuildTier,\n options: BuildOptions,\n): string | undefined {\n const isTheme = isThemeProject(ctx.config)\n const useCdn = usesCdnPipeline(ctx.config) && !isTheme\n const parts: string[] = []\n if (!options.hubspotOnly && useCdn) parts.push('CDN')\n if (!options.cdnOnly) parts.push('HubSpot module')\n if (!options.cdnOnly && !options.hubspotOnly && !isTheme) parts.push('bundle checks')\n if (parts.length === 0) return undefined\n return `${formatProjectLabel(ctx.config)} · ${parts.join(' + ')} (${tier})`\n}\n\nasync function maybeBumpModuleBuildId(\n ctx: CommandContext,\n tier: BuildTier,\n options: BuildOptions,\n env: NodeJS.ProcessEnv,\n): Promise<NodeJS.ProcessEnv> {\n const useCdn = usesCdnPipeline(ctx.config) && !isThemeProject(ctx.config)\n const shouldBump =\n useCdn &&\n !options.hubspotOnly &&\n !ctx.global.noBump &&\n !options.buildIdBumped &&\n !env.PORTAL_BUILD_ID?.trim() &&\n !env.MODULE_BUILD_ID?.trim() &&\n !env.GITHUB_REF_NAME?.trim()\n\n if (!shouldBump) {\n return env\n }\n\n const result = bumpModuleBuildIdForCli(ctx.projectRoot, {\n tier,\n dryRun: ctx.global.dryRun,\n env,\n })\n\n if (!ctx.global.quiet && !ctx.global.json && result.bumped) {\n ctx.logger.info(`Module build id → ${result.id}`)\n }\n\n return {\n ...env,\n PORTAL_BUILD_ID: result.id,\n MODULE_BUILD_ID: result.id,\n }\n}\n\nexport async function runBuild(ctx: CommandContext, options: BuildOptions): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const quietSubprocess = shouldQuietSubprocess(ctx, options)\n let env: NodeJS.ProcessEnv = {\n ...(options.env ?? process.env),\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n ...(quietSubprocess ? { WP_HS_QUIET_BUILD: '1' } : {}),\n }\n env = await maybeBumpModuleBuildId(ctx, tier, options, env)\n const isTheme = isThemeProject(ctx.config)\n\n const execOpts = {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n }\n\n const run = (script: string, args: string[] = []) => {\n return runNodeScriptAsync(kitPath('scripts', script), args, execOpts)\n }\n\n try {\n if (isTheme && !options.cdnOnly) {\n if (ctx.global.json) {\n ctx.logger.json({ command: 'build', tier, ok: true, projectType: ctx.config.projectType })\n } else if (!options.progress) {\n ctx.logger.info('Theme project — skipping CDN/module.js build (use wp upload for theme assets)')\n printCommandDone(ctx, 'Theme build complete (no-op)')\n } else {\n await runCliTasks(\n ctx,\n [{ title: 'Theme project (no module build)', task: async () => {} }],\n options,\n )\n printCommandDone(ctx, 'Theme build complete (no-op)')\n }\n return ExitCode.SUCCESS\n }\n\n const tasks = buildTasks(ctx, options, run)\n await runCliTasks(ctx, tasks, {\n ...options,\n intro: buildIntroLine(ctx, tier, options),\n })\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'build',\n tier,\n ok: true,\n outDir: resolve(ctx.projectRoot, ctx.config.module.outDir),\n })\n } else if (!options.quiet) {\n printCommandDone(ctx, 'Build complete')\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.BUILD_FAILED,\n })\n }\n}\n","import pc from 'picocolors'\n\nimport type { GlobalCliOptions } from '../cli/context.js'\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { isThemeProject } from '../schema/woodsportal-hs.js'\n\nimport { readKitVersion } from './kit-version.js'\n\n/** Figlet \"big\" font — spells WoodsCLI (not WoodsPortal). */\nexport const WOODSCLI_ASCII_BANNER = `\n __ __ _ _____ _ _____ \n \\\\ \\\\ / / | | / ____| | |_ _|\n \\\\ \\\\ /\\\\ / /__ ___ __| |___| | | | | | \n \\\\ \\\\/ \\\\/ / _ \\\\ / _ \\\\ / _\\` / __| | | | | | \n \\\\ /\\\\ / (_) | (_) | (_| \\\\__ \\\\ |____| |____ _| |_ \n \\\\/ \\\\/ \\\\___/ \\\\___/ \\\\__,_|___/\\\\_____|______|_____|\n`.trimEnd()\n\nconst RULE = '──────────────────────────────────────────────────────────────────────────────'\n\nexport function shouldPrintCliBanner(global: GlobalCliOptions): boolean {\n if (global.json || global.quiet || global.ci || global.dryRun) {\n return false\n }\n return process.stdout.isTTY === true\n}\n\nfunction useCliColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false\n if (process.env.CI === 'true') return false\n return process.stdout.isTTY === true\n}\n\nexport function formatProjectLabel(config: WoodsPortalHsConfig): string {\n if (isThemeProject(config)) {\n return `${config.theme?.name ?? 'theme'} · theme-starter`\n }\n\n const router = config.scaffold?.router\n const routerNote =\n router && router !== 'hash' ? ` · router ${router}` : ' · hash router'\n\n return `${config.module.name} · ${config.projectType}${routerNote}`\n}\n\nexport type DevBannerOptions = {\n config: WoodsPortalHsConfig\n port: number\n global: GlobalCliOptions\n version?: string\n}\n\nfunction section(color: boolean, title: string, body: string): string {\n const bold = (text: string) => (color ? pc.bold(text) : text)\n return ` ${bold(title)}\\n${body}`\n}\n\n/** Branded startup banner for `wp dev` — matches client-sdk dev-watch layout. */\nexport function printWoodsCliDevBanner(options: DevBannerOptions): void {\n if (!shouldPrintCliBanner(options.global)) {\n return\n }\n\n const color = useCliColor()\n const cyan = (text: string) => (color ? pc.cyan(text) : text)\n const dim = (text: string) => (color ? pc.dim(text) : text)\n const bold = (text: string) => (color ? pc.bold(text) : text)\n const yellow = (text: string) => (color ? pc.yellow(text) : text)\n\n const version = options.version ?? readKitVersion()\n const project = formatProjectLabel(options.config)\n const isTheme = isThemeProject(options.config)\n const localUrl = `http://localhost:${options.port}/`\n const docsRoot = 'node_modules/@woodsportal/hubspot-kit/docs'\n\n const header = [\n color\n ? WOODSCLI_ASCII_BANNER.split('\\n')\n .map((line) => cyan(bold(line)))\n .join('\\n')\n : WOODSCLI_ASCII_BANNER,\n ` ${bold('HubSpot kit')}${dim(` v${version}`)} ${yellow('· dev')}`,\n ].join('\\n')\n\n const outputLine = isTheme\n ? ' Vite HMR + theme field overlay (Ctrl+Shift+Z)'\n : ' Vite HMR + module-config overlay (Ctrl+Shift+Z)'\n\n const quickChecks = isTheme\n ? ` wp doctor prerequisites + HubSpot CLI\n wp dev alias: wp local\n wp upload cms theme upload`\n : ` wp doctor prerequisites + HubSpot CLI\n wp setup copy missing config / .env templates\n wp build module.js / CDN (tier defaults dev)\n wp upload cms module upload`\n\n const tips = [\n dim(RULE),\n section(color, 'Output', ` ${outputLine}`),\n '',\n section(color, 'Project', ` ${project}`),\n '',\n section(color, 'Preview', ` ${color ? cyan(localUrl) : localUrl}`),\n '',\n section(\n color,\n 'Overlay',\n ` Ctrl+Shift+Z ${isTheme ? 'theme' : 'module'} fields ${dim('(Mac ⌃⇧Z)')}`,\n ),\n '',\n section(\n color,\n 'Workspace',\n ` ${dim('.wphs/')} · ${options.config.dev.fieldsJson}`,\n ),\n '',\n section(color, 'Quick checks', `\\n${quickChecks}`),\n '',\n section(\n color,\n 'Docs',\n ` ${docsRoot}/CLI-REFERENCE.md · ${docsRoot}/MODULES.md`,\n ),\n dim(RULE),\n ].join('\\n')\n\n process.stdout.write(`\\n${header}\\n\\n${tips}\\n\\n`)\n process.stdout.write(`${dim('Starting Vite dev…')}\\n\\n`)\n}\n","import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { getKitRoot } from './paths.js'\n\nlet cachedVersion: string | null = null\n\nexport function readKitVersion(): string {\n if (cachedVersion) {\n return cachedVersion\n }\n\n try {\n const pkg = JSON.parse(readFileSync(resolve(getKitRoot(), 'package.json'), 'utf8')) as {\n version?: string\n }\n cachedVersion = pkg.version ?? '0.0.0'\n } catch {\n cachedVersion = '0.0.0'\n }\n\n return cachedVersion\n}\n","export type BuildTier = 'dev' | 'stg' | 'prod'\n\n/** Default tier for wp build / deploy / publish / upload / watch */\nexport const DEFAULT_BUILD_TIER: BuildTier = 'dev'\n\nexport function parseBuildTier(value: string | undefined): BuildTier {\n if (value === 'dev' || value === 'stg' || value === 'prod') return value\n return DEFAULT_BUILD_TIER\n}\n","import { printWoodsCliDevBanner } from '../../lib/cli-banner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScriptLongRunning } from '../../lib/exec.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { nodeLoaderInteropWarning } from '../../lib/node-loader-interop.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { resolveProjectViteSpawn } from '../../vite/resolve-dev-config.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DevOptions = {\n port?: number\n}\n\nexport async function runDev(ctx: CommandContext, options: DevOptions): Promise<number> {\n const port = options.port ?? 3000\n const nodeWarning = nodeLoaderInteropWarning()\n if (nodeWarning) {\n ctx.logger.warn(nodeWarning)\n }\n const env = {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n WP_HS_DEV_PORT: String(port),\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] node ${kitPath('scripts', 'run-dev.mjs')} (port ${port})`)\n return ExitCode.SUCCESS\n }\n\n if (!resolveProjectViteSpawn(ctx.projectRoot)) {\n throw new WpHsError('vite is not installed in this project.', {\n exitCode: ExitCode.PREREQUISITE,\n remediation:\n 'Run yarn install or npm install. If this is an older wp init project, add vite and peers to devDependencies (run wp init again or see @woodsportal/hubspot-kit templates).',\n })\n }\n\n printWoodsCliDevBanner({\n config: ctx.config,\n port,\n global: ctx.global,\n })\n\n setImmediate(() => ensureHubSpotCliSetup(ctx, 'local'))\n\n return runNodeScriptLongRunning(kitPath('scripts', 'run-dev.mjs'), [], {\n cwd: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: false,\n projectRoot: ctx.projectRoot,\n })\n}\n","import { resolve } from 'node:path'\n\nimport { bumpModuleBuildIdForCli } from '../../lib/module-build-id.js'\nimport { formatProjectLabel } from '../../lib/cli-banner.js'\nimport { ExitCode } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { printCommandDone, runCliTasks, shouldQuietSubprocess, type CliTask } from '../../lib/cli-spinner.js'\nimport { runNodeScriptAsync } from '../../lib/exec.js'\nimport { mergeProjectEnv } from '../../lib/project-env-files.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport { isThemeProject, usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport { runBuild } from './build.js'\nimport { runUpload } from './upload.js'\nimport type { CommandContext } from '../context.js'\n\nexport type DeployOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n skipPublish?: boolean\n skipUpload?: boolean\n progress?: boolean\n}\n\nexport async function runDeploy(ctx: CommandContext, options: DeployOptions): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const skipUpload =\n options.skipUpload ||\n process.env.PORTAL_MODULE_GIT_ONLY === '1' ||\n process.env.PORTAL_MODULE_GIT_ONLY === 'true'\n const intro = `${formatProjectLabel(ctx.config)} · deploy (${tier})`\n const quietSubprocess = shouldQuietSubprocess(ctx, options)\n const nested = {\n progress: false as const,\n quiet: true as const,\n quietSubprocess: true as const,\n }\n\n const useCdn = usesCdnPipeline(ctx.config) && !isThemeProject(ctx.config)\n\n let baseEnv = mergeProjectEnv(ctx.projectRoot, {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n ...(quietSubprocess ? { WP_HS_QUIET_BUILD: '1' } : {}),\n })\n\n let buildIdBumped = false\n if (\n useCdn &&\n !ctx.global.noBump &&\n !baseEnv.PORTAL_BUILD_ID?.trim() &&\n !baseEnv.MODULE_BUILD_ID?.trim() &&\n !baseEnv.GITHUB_REF_NAME?.trim()\n ) {\n const bump = bumpModuleBuildIdForCli(ctx.projectRoot, {\n tier,\n dryRun: ctx.global.dryRun,\n env: baseEnv,\n })\n baseEnv = {\n ...baseEnv,\n PORTAL_BUILD_ID: bump.id,\n MODULE_BUILD_ID: bump.id,\n }\n buildIdBumped = bump.bumped\n if (!ctx.global.quiet && !ctx.global.json && bump.bumped) {\n ctx.logger.info(`Module build id → ${bump.id}`)\n }\n }\n\n const execOpts = {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n env: baseEnv,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n }\n\n if (!skipUpload) {\n ensureHubSpotCliSetup(ctx, 'cms')\n }\n\n const verifyFlag =\n tier === 'prod' ? ['--prod'] : tier === 'stg' ? ['--stg'] : ['--dev']\n const tasks: CliTask[] = []\n\n if (!skipUpload) {\n tasks.push({\n title: 'Checking HubSpot CLI',\n task: async () => {\n ensureHubSpotCliSetup(ctx, 'cms')\n },\n })\n }\n\n if (useCdn) {\n tasks.push({\n title: `Building CDN (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, cdnOnly: true, buildIdBumped, env: baseEnv, ...nested })\n },\n })\n\n if (!options.skipPublish) {\n tasks.push({\n title: `Verifying CDN API (${tier})`,\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'verify-cdn-api-endpoint.mjs'), verifyFlag, execOpts)\n },\n })\n tasks.push({\n title: `Publishing CDN to GitHub (${tier})`,\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'publish-cdn-github.mjs'), [], execOpts)\n },\n })\n }\n\n tasks.push({\n title: `Building HubSpot module (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, hubspotOnly: true, env: baseEnv, ...nested })\n },\n })\n } else {\n tasks.push({\n title: `Building module (${tier})`,\n task: async () => {\n await runBuild(ctx, { tier, ...nested })\n },\n })\n }\n\n tasks.push(\n {\n title: 'Running bundle checks',\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'check-hubspot-bundle-size.mjs'), [], execOpts)\n await runNodeScriptAsync(kitPath('scripts', 'write-audit-artifacts.mjs'), [], execOpts)\n },\n },\n )\n\n if (!skipUpload) {\n tasks.push({\n title: 'Uploading to HubSpot',\n task: async () => {\n await runUpload(ctx, {\n tier,\n ...nested,\n skipPrereqCheck: true,\n })\n },\n })\n } else if (!ctx.global.quiet && !ctx.global.json) {\n ctx.logger.info('Skipping HubSpot upload (module git push / PORTAL_MODULE_GIT_ONLY)')\n }\n\n await runCliTasks(ctx, tasks, {\n ...options,\n intro,\n })\n\n if (!ctx.global.json) {\n printCommandDone(\n ctx,\n `Deploy complete (${resolve(ctx.projectRoot, ctx.config.module.outDir)} → ${ctx.config.module.uploadPath})`,\n )\n }\n return ExitCode.SUCCESS\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** Gitignored secrets + machine-local overrides (never committed). */\nexport const ENV_LOCAL_FILE = '.env.local'\n\nconst ENV_GITIGNORE_LINES = ['.env', '.env.*', '!.env*.example', ENV_LOCAL_FILE]\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {}\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eq = trimmed.indexOf('=')\n if (eq <= 0) continue\n const key = trimmed.slice(0, eq).trim()\n let value = trimmed.slice(eq + 1).trim()\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n result[key] = value\n }\n return result\n}\n\nexport function readEnvLocal(projectRoot: string): Record<string, string> {\n const path = resolve(projectRoot, ENV_LOCAL_FILE)\n if (!existsSync(path)) return {}\n return parseEnvFile(readFileSync(path, 'utf8'))\n}\n\nexport function formatEnvLocal(entries: Record<string, string>): string {\n const lines = [\n '# Local secrets — gitignored. Created by wp init / wp setup (hybrid CDN).',\n '# PORTAL_CDN_PUBLISH_TOKEN needs repo push on your portal.cdn.json mirror.',\n '',\n ]\n for (const [key, value] of Object.entries(entries)) {\n if (value.includes(' ') || value.includes('#')) {\n lines.push(`${key}=\"${value.replace(/\"/g, '\\\\\"')}\"`)\n } else {\n lines.push(`${key}=${value}`)\n }\n }\n return `${lines.join('\\n').trimEnd()}\\n`\n}\n\nexport function writeEnvLocal(projectRoot: string, entries: Record<string, string>): void {\n const path = resolve(projectRoot, ENV_LOCAL_FILE)\n const existing = existsSync(path) ? parseEnvFile(readFileSync(path, 'utf8')) : {}\n writeFileSync(path, formatEnvLocal({ ...existing, ...entries }))\n}\n\nexport function mergeProjectEnv(\n projectRoot: string,\n base: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const local = readEnvLocal(projectRoot)\n const merged = { ...base }\n for (const [key, value] of Object.entries(local)) {\n if (merged[key] == null || merged[key] === '') {\n merged[key] = value\n }\n }\n return merged\n}\n\nexport function ensureEnvFilesGitignore(projectRoot: string): void {\n const gitignorePath = resolve(projectRoot, '.gitignore')\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf8') : ''\n const toAppend = ENV_GITIGNORE_LINES.filter((line) => !existing.includes(line)).join('\\n')\n if (!toAppend) return\n writeFileSync(gitignorePath, `${existing.trimEnd()}\\n\\n# Env files (secrets)\\n${toAppend}\\n`)\n}\n","import { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotCliSetup } from '../../lib/hubspot-cli-setup.js'\nimport { printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { runCommandAsync } from '../../lib/exec.js'\nimport { isThemeProject } from '../../schema/woodsportal-hs.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport type { CommandContext } from '../context.js'\n\nexport type UploadOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n progress?: boolean\n /** Suppress success line (e.g. when called from deploy) */\n quiet?: boolean\n /** Skip HubSpot CLI check when a parent command already verified */\n skipPrereqCheck?: boolean\n}\n\nasync function uploadModuleOrTheme(ctx: CommandContext): Promise<string> {\n if (isThemeProject(ctx.config)) {\n const theme = ctx.config.theme\n if (!theme) {\n throw new WpHsError('theme block missing in woodscli.json', { exitCode: ExitCode.USER_ERROR })\n }\n const srcDir = resolve(ctx.projectRoot, theme.srcDir)\n await runCommandAsync('hs', ['cms', 'upload', srcDir, theme.uploadPath], {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n })\n return `Uploaded theme ${srcDir} → ${theme.uploadPath}`\n }\n\n const outDir = resolve(ctx.projectRoot, ctx.config.module.outDir)\n const uploadPath = ctx.config.module.uploadPath\n await runCommandAsync('hs', ['cms', 'upload', outDir, uploadPath], {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n streamOutput: ctx.global.verbose,\n })\n return `Uploaded ${outDir} → ${uploadPath}`\n}\n\nexport async function runUpload(ctx: CommandContext, options: UploadOptions = {}): Promise<number> {\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n\n if (tier === 'prod' && !ctx.global.yes && !ctx.global.ci) {\n const confirmed = process.env.WP_HS_CONFIRM_PROD === '1'\n if (!confirmed) {\n throw new WpHsError('Production upload blocked — pass --yes or set WP_HS_CONFIRM_PROD=1', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp upload --tier prod --yes',\n })\n }\n }\n\n if (!options.skipPrereqCheck) {\n ensureHubSpotCliSetup(ctx, 'cms')\n }\n\n try {\n let successMessage = ''\n\n await runCliTasks(\n ctx,\n [\n {\n title: isThemeProject(ctx.config) ? 'Uploading theme to HubSpot' : 'Uploading module to HubSpot',\n task: async () => {\n successMessage = await uploadModuleOrTheme(ctx)\n },\n },\n ],\n options,\n )\n\n if (!ctx.global.json && !options.quiet) {\n printCommandDone(ctx, successMessage)\n }\n return ExitCode.SUCCESS\n } catch (error) {\n const detail =\n error instanceof WpHsError\n ? error.message\n : error instanceof Error\n ? error.message\n : String(error)\n throw new WpHsError(\n detail.includes('HubSpot upload failed') ? detail : `HubSpot upload failed\\n${detail}`,\n {\n exitCode: ExitCode.PUBLISH_FAILED,\n cause: error,\n remediation: 'Run wp auth, then build the module before upload.',\n },\n )\n }\n}\n","import { formatProjectLabel } from '../../lib/cli-banner.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { printCommandDone, runCliTasks, shouldQuietSubprocess } from '../../lib/cli-spinner.js'\nimport { runNodeScriptAsync } from '../../lib/exec.js'\nimport { mergeProjectEnv } from '../../lib/project-env-files.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { DEFAULT_BUILD_TIER } from '../../lib/build-tier.js'\nimport { usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nexport type PublishOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n dryRun?: boolean\n progress?: boolean\n /** Suppress ◆ CDN publish complete (nested deploy). */\n quiet?: boolean\n quietSubprocess?: boolean\n}\n\nexport async function runPublish(ctx: CommandContext, options: PublishOptions): Promise<number> {\n if (!usesCdnPipeline(ctx.config)) {\n throw new WpHsError('This project does not use the CDN pipeline.', {\n exitCode: ExitCode.USER_ERROR,\n remediation:\n 'module-monolith / cdn.mode none: use wp build && wp upload (or wp deploy without CDN publish).',\n })\n }\n\n const tier = options.tier ?? DEFAULT_BUILD_TIER\n const quietSubprocess = shouldQuietSubprocess(ctx, options)\n const env = mergeProjectEnv(ctx.projectRoot, {\n ...process.env,\n WP_HS_PROJECT_ROOT: ctx.projectRoot,\n ...(quietSubprocess ? { WP_HS_QUIET_BUILD: '1' } : {}),\n })\n const execOpts = {\n cwd: ctx.projectRoot,\n projectRoot: ctx.projectRoot,\n env,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun || options.dryRun,\n streamOutput: ctx.global.verbose,\n }\n\n const verifyFlag =\n tier === 'prod' ? ['--prod'] : tier === 'stg' ? ['--stg'] : ['--dev']\n const publishArgs = options.dryRun ? ['--dry-run'] : []\n\n try {\n await runCliTasks(\n ctx,\n [\n {\n title: `Verifying CDN API endpoint (${tier})`,\n task: async () => {\n if (options.dryRun) return\n await runNodeScriptAsync(kitPath('scripts', 'verify-cdn-api-endpoint.mjs'), verifyFlag, execOpts)\n },\n },\n {\n title: options.dryRun\n ? `CDN publish dry-run (${tier})`\n : `Publishing CDN to GitHub (${tier})`,\n task: async () => {\n await runNodeScriptAsync(kitPath('scripts', 'publish-cdn-github.mjs'), publishArgs, execOpts)\n },\n },\n ],\n {\n ...options,\n intro: options.quiet ? undefined : `${formatProjectLabel(ctx.config)} · CDN publish (${tier})`,\n },\n )\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'publish', tier, dryRun: Boolean(options.dryRun), ok: true })\n } else if (!options.quiet) {\n printCommandDone(\n ctx,\n options.dryRun ? 'CDN publish dry-run complete' : 'CDN publish complete',\n )\n }\n\n return ExitCode.SUCCESS\n } catch (error) {\n throw new WpHsError(error instanceof Error ? error.message : String(error), {\n exitCode: ExitCode.PUBLISH_FAILED,\n remediation: 'Check CDN PAT, portal.cdn.json, and verify-cdn-api-endpoint.',\n })\n }\n}\n","import { createHash } from 'node:crypto'\nimport { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { defaultBaselineDir } from '../../lib/wphs-baseline.js'\nimport type { CommandContext } from '../context.js'\n\nconst FORBIDDEN_SHIP_TOKENS = [\n 'ModuleConfigOverlay',\n 'module-config-store',\n '__dev/module-config',\n 'src/dev/module-config',\n 'dev.module-config',\n]\n\n/** Localhost fixture menu labels — must not ship in CDN app bundles. */\nconst FORBIDDEN_FIXTURE_MENU_TOKENS = ['User Home', 'Primary Company Deals']\n\n/** CMS editor preview fixture markers — must not ship in CDN app entry bundle. */\nconst FORBIDDEN_PREVIEW_FIXTURE_TOKENS = ['preview.editor@example.com', 'CMS_EDITOR_PREVIEW']\n\nfunction hashFile(path: string): string {\n return createHash('sha256').update(readFileSync(path)).digest('hex')\n}\n\nfunction walkFiles(dir: string): string[] {\n if (!existsSync(dir)) return []\n const entries = readdirSync(dir)\n const files: string[] = []\n for (const entry of entries) {\n const full = join(dir, entry)\n if (statSync(full).isDirectory()) {\n files.push(...walkFiles(full))\n } else {\n files.push(full)\n }\n }\n return files\n}\n\nexport async function runAuditShipBundle(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const targets = [\n resolve(root, 'dist/cdn'),\n resolve(root, ctx.config.module.outDir),\n ]\n\n const violations: string[] = []\n\n for (const dir of targets) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(js|css|html)$/i.test(file)) continue\n const content = readFileSync(file, 'utf8')\n for (const token of FORBIDDEN_SHIP_TOKENS) {\n if (content.includes(token)) {\n violations.push(`${file}: contains forbidden token \"${token}\"`)\n }\n }\n const isCdnAppEntry = /[/\\\\]dist[/\\\\]cdn[/\\\\]app\\..*\\.js$/i.test(file)\n if (isCdnAppEntry) {\n for (const token of FORBIDDEN_FIXTURE_MENU_TOKENS) {\n if (content.includes(token)) {\n violations.push(`${file}: contains fixture menu marker \"${token}\"`)\n }\n }\n for (const token of FORBIDDEN_PREVIEW_FIXTURE_TOKENS) {\n if (content.includes(token)) {\n violations.push(`${file}: contains preview fixture marker \"${token}\"`)\n }\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:ship-bundle', ok: violations.length === 0, violations })\n } else if (violations.length === 0) {\n ctx.logger.success('Ship bundle audit passed')\n } else {\n for (const v of violations) ctx.logger.error(v)\n }\n\n if (violations.length > 0) {\n throw new WpHsError('Ship bundle audit failed — dev tooling leaked into production artifacts', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Ensure dev-only code is not imported in production build graph.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n\nexport type ParityOptions = {\n baselineDir?: string\n}\n\nexport type BaselineOptions = {\n baselineDir?: string\n}\n\nexport async function runAuditBaselineCapture(\n ctx: CommandContext,\n options: BaselineOptions,\n): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const sources = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would capture baseline to ${baseline}`)\n return ExitCode.SUCCESS\n }\n\n for (const { label, path } of sources) {\n if (!existsSync(path)) {\n throw new WpHsError(`Cannot capture baseline — missing ${path}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp build before wp audit baseline --capture.',\n })\n }\n const target = resolve(baseline, label)\n rmSync(target, { recursive: true, force: true })\n mkdirSync(baseline, { recursive: true })\n cpSync(path, target, { recursive: true })\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:baseline', ok: true, baseline })\n } else {\n ctx.logger.success(`Baseline captured at ${baseline}`)\n }\n\n return ExitCode.SUCCESS\n}\n\nexport async function runAuditParity(ctx: CommandContext, options: ParityOptions): Promise<number> {\n const root = ctx.projectRoot\n const baseline = options.baselineDir ?? defaultBaselineDir(root, ctx.config)\n const currentDirs = [\n { label: 'cdn', path: resolve(root, 'dist/cdn') },\n { label: 'hubspot', path: resolve(root, ctx.config.module.outDir) },\n ]\n\n const mismatches: string[] = []\n\n for (const { label, path } of currentDirs) {\n const baselinePath = resolve(baseline, label)\n if (!existsSync(baselinePath)) {\n ctx.logger.warn(`No baseline at ${baselinePath} — skipping ${label} parity`)\n continue\n }\n\n const baselineFiles = walkFiles(baselinePath).filter((f) => !f.endsWith('.map'))\n const currentFiles = walkFiles(path).filter((f) => !f.endsWith('.map'))\n\n const baselineNames = new Set(baselineFiles.map((f) => f.replace(baselinePath, '')))\n const currentNames = new Set(currentFiles.map((f) => f.replace(path, '')))\n\n for (const name of baselineNames) {\n if (!currentNames.has(name)) {\n mismatches.push(`missing file: ${label}${name}`)\n }\n }\n\n for (const file of baselineFiles) {\n const rel = file.replace(baselinePath, '')\n const current = resolve(path, rel.slice(1))\n if (!existsSync(current)) continue\n const bh = hashFile(file)\n const ch = hashFile(current)\n if (bh !== ch) {\n mismatches.push(`hash mismatch: ${label}${rel}`)\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:parity', ok: mismatches.length === 0, mismatches })\n } else if (mismatches.length === 0) {\n ctx.logger.success('Parity audit passed (or no baseline configured)')\n } else {\n for (const m of mismatches) ctx.logger.error(m)\n }\n\n if (mismatches.length > 0) {\n throw new WpHsError('Parity audit failed', { exitCode: ExitCode.AUDIT_FAILED })\n }\n\n return ExitCode.SUCCESS\n}\n\nconst SECRET_PATTERNS = [\n /(?:api[_-]?key|secret|password|token|private[_-]?key)\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/gi,\n /sk_live_[a-zA-Z0-9]{16,}/g,\n /pat-[a-z]{2}-[a-f0-9-]{20,}/gi,\n]\n\nexport async function runAuditSecrets(ctx: CommandContext): Promise<number> {\n const root = ctx.projectRoot\n const scanRoots = ['src', 'public', '.wphs/config'].map((d) => resolve(root, d))\n const findings: string[] = []\n\n for (const dir of scanRoots) {\n for (const file of walkFiles(dir)) {\n if (!/\\.(ts|tsx|js|jsx|json|env|yml|yaml|html)$/i.test(file)) continue\n if (file.includes('node_modules')) continue\n const content = readFileSync(file, 'utf8')\n for (const pattern of SECRET_PATTERNS) {\n pattern.lastIndex = 0\n if (pattern.test(content)) {\n findings.push(`${file}: possible secret pattern matched`)\n }\n }\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'audit:secrets', ok: findings.length === 0, findings })\n } else if (findings.length === 0) {\n ctx.logger.success('Secrets audit passed')\n } else {\n for (const f of findings) ctx.logger.error(f)\n }\n\n if (findings.length > 0) {\n throw new WpHsError('Secrets audit found potential credentials in source files', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Move secrets to env vars; never commit PATs or API keys.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { templateDevDependencies } from '../../lib/template-dev-deps.js'\nimport { DEFAULT_WOODSPORTAL_HS, type WoodsPortalHsConfig } from '../../schema/woodsportal-hs.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport {\n applyRouterScaffold,\n isModuleTemplate,\n type RouterScaffoldMode,\n} from '../../lib/init-router-scaffold.js'\nimport {\n applyCdnGitHubSetup,\n formatCdnSetupNote,\n githubDefaultForPrompt,\n needsCdnGitHubSetup,\n promptCdnGitHubSetup,\n} from '../../lib/cdn-github-setup.js'\nimport { copySharedSetupExamples } from '../../lib/project-setup.js'\nimport { TEMPLATE_SCRIPTS } from '../../lib/template-scripts.js'\nimport type { CommandContext } from '../context.js'\n\nexport type InitOptions = {\n template?: 'module-hybrid-cdn' | 'module-monolith' | 'theme-starter'\n /** Full target directory (skips name prompt when set). */\n directory?: string\n /** Project slug — creates `<parent>/<name>/` (default parent: cwd). */\n name?: string\n /** Client routing: hash (client-frontend default), browser, or none */\n router?: RouterScaffoldMode\n /** Public GitHub CDN mirror org/repo (hybrid CDN; CI / non-interactive) */\n cdnGithub?: string\n}\n\nimport {\n moduleOutDirFromSlug,\n normalizeProjectName,\n validateProjectName,\n} from '../../lib/project-name.js'\n\nfunction buildConfigForProject(\n template: InitOptions['template'],\n projectName: string,\n router?: RouterScaffoldMode,\n): WoodsPortalHsConfig {\n const base = { ...DEFAULT_WOODSPORTAL_HS, projectType: template! }\n\n if (template === 'theme-starter') {\n return {\n ...base,\n theme: {\n name: projectName,\n uploadPath: `themes/${projectName}`,\n srcDir: 'src/theme',\n themeJson: 'src/theme/theme.json',\n },\n }\n }\n\n const config: WoodsPortalHsConfig = {\n ...base,\n module: {\n name: projectName,\n uploadPath: `dw-modules/${projectName}.module`,\n outDir: moduleOutDirFromSlug(projectName),\n },\n cdn: {\n ...base.cdn,\n mode: template === 'module-monolith' ? 'none' : base.cdn.mode,\n },\n }\n\n if (isModuleTemplate(template!) && router) {\n config.scaffold = { router }\n }\n\n return config\n}\n\nfunction assertTargetDirIsScaffoldable(targetDir: string): void {\n if (!existsSync(targetDir)) return\n\n const entries = readdirSync(targetDir).filter((entry) => entry !== '.DS_Store')\n if (entries.length > 0) {\n throw new WpHsError(`Target directory is not empty: ${targetDir}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Choose a different project name or remove existing files.',\n })\n }\n}\n\nfunction resolveInitTargetDir(options: InitOptions, interactiveName?: string): string {\n if (options.directory) {\n return resolve(options.directory)\n }\n\n const parentDir = process.cwd()\n const slug = options.name ?? interactiveName\n if (!slug) {\n throw new WpHsError('Project name is required', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run interactively, or pass --name my-project (or --directory ./my-project).',\n })\n }\n\n const error = validateProjectName(slug)\n if (error) {\n throw new WpHsError(error, { exitCode: ExitCode.USER_ERROR })\n }\n\n return resolve(parentDir, slug)\n}\n\nexport async function runInit(ctx: CommandContext, options: InitOptions): Promise<number> {\n const nonInteractive = ctx.global.ci || ctx.global.yes || ctx.global.json\n\n let template = options.template\n let projectName = options.name ? normalizeProjectName(options.name) : undefined\n let router = options.router\n\n if (!nonInteractive) {\n if (!template) {\n const type = await p.select({\n message: 'Project type',\n options: [\n {\n value: 'module-hybrid-cdn',\n label: 'Module (hybrid CDN)',\n hint: 'jsDelivr + thin module.js',\n },\n { value: 'module-monolith', label: 'Module (monolith)', hint: 'Single module.js IIFE' },\n { value: 'theme-starter', label: 'Theme starter', hint: 'CMS theme templates' },\n ],\n })\n if (p.isCancel(type)) throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n template = type as InitOptions['template']\n }\n\n if (!options.directory && !projectName) {\n const nameAnswer = await p.text({\n message: 'Project name (folder name)',\n placeholder: 'my-portal-module',\n validate: (value) => validateProjectName(normalizeProjectName(value ?? '')),\n })\n if (p.isCancel(nameAnswer)) {\n throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n projectName = normalizeProjectName(nameAnswer)\n }\n\n if (!router && template && isModuleTemplate(template)) {\n const routerAnswer = await p.select({\n message: 'Client-side routing',\n initialValue: 'hash',\n options: [\n {\n value: 'hash',\n label: 'Hash history (recommended)',\n hint: 'Same as woodsportal-client-frontend — works in HubSpot CMS embeds',\n },\n {\n value: 'browser',\n label: 'Browser history',\n hint: 'Clean /guide URLs for local dev (not for HubSpot iframe embeds)',\n },\n {\n value: 'none',\n label: 'No router',\n hint: 'Single-page starter — add TanStack Router later',\n },\n ],\n })\n if (p.isCancel(routerAnswer)) {\n throw new WpHsError('Init cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n router = routerAnswer as RouterScaffoldMode\n }\n }\n\n if (!template) {\n template = 'module-hybrid-cdn'\n }\n\n if (!router && isModuleTemplate(template)) {\n router = 'hash'\n }\n\n const targetDir = resolveInitTargetDir(options, projectName)\n const slug = projectName ?? basename(targetDir)\n assertTargetDirIsScaffoldable(targetDir)\n\n const templateDir = kitPath('templates', template)\n if (!existsSync(templateDir)) {\n throw new WpHsError(`Template not found: ${template}`, { exitCode: ExitCode.USER_ERROR })\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] Would scaffold ${template} in ${targetDir}`)\n return ExitCode.SUCCESS\n }\n\n mkdirSync(targetDir, { recursive: true })\n cpSync(templateDir, targetDir, { recursive: true })\n copySharedSetupExamples(targetDir)\n\n const config = buildConfigForProject(template, slug, router)\n writeFileSync(resolve(targetDir, WOODSCLI_CONFIG_FILE), `${JSON.stringify(config, null, 2)}\\n`)\n\n const pkgPath = resolve(targetDir, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n name?: string\n scripts?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n pkg.name = slug\n pkg.scripts = { ...pkg.scripts, ...TEMPLATE_SCRIPTS[template] }\n pkg.devDependencies = {\n ...pkg.devDependencies,\n ...templateDevDependencies(),\n }\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n }\n\n if (router && isModuleTemplate(template)) {\n applyRouterScaffold(targetDir, router, template)\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: targetDir,\n logger: ctx.logger,\n dryRun: false,\n })\n\n const gitignorePath = resolve(targetDir, '.gitignore')\n const gitignoreExtras = [\n 'hubspot.config.yml',\n '.wphs/config/module-config.local.json',\n '.wphs/assets/',\n '.wphs/cache/',\n '.wphs/audit/',\n '.wphs/state/',\n '.wphs/fixtures/hubspot-data.json',\n '.wphs/.kit-module-config',\n '.wphs/.kit-bootstrap.tsx',\n '.wphs/.kit-bootstrap-greenfield.tsx',\n ]\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf8') : ''\n const toAppend = gitignoreExtras.filter((line) => !existing.includes(line)).join('\\n')\n if (toAppend) {\n writeFileSync(gitignorePath, `${existing.trimEnd()}\\n${toAppend}\\n`)\n }\n\n if (template === 'module-hybrid-cdn' && !ctx.global.dryRun && needsCdnGitHubSetup(targetDir)) {\n const githubDefault = githubDefaultForPrompt(targetDir)\n let cdnSetup = null as Awaited<ReturnType<typeof promptCdnGitHubSetup>>\n\n if (nonInteractive) {\n if (options.cdnGithub) {\n cdnSetup = { github: options.cdnGithub }\n }\n } else {\n p.log.step('Hybrid CDN — GitHub mirror (public repo for jsDelivr)')\n cdnSetup = await promptCdnGitHubSetup({\n projectRoot: targetDir,\n githubDefault,\n github: options.cdnGithub,\n })\n }\n\n if (cdnSetup) {\n applyCdnGitHubSetup(targetDir, cdnSetup)\n if (!nonInteractive) {\n p.log.success(formatCdnSetupNote(targetDir))\n } else {\n ctx.logger.success(formatCdnSetupNote(targetDir))\n }\n }\n }\n\n if (!nonInteractive) {\n p.log.success(`Scaffolded ${template} in ${targetDir}`)\n p.note(`cd ${slug} && yarn install && wp setup && wp doctor && wp dev`, 'Getting started')\n } else {\n ctx.logger.success(`Scaffolded ${template} in ${targetDir}`)\n }\n\n return ExitCode.SUCCESS\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport type RouterScaffoldMode = 'hash' | 'browser' | 'none'\n\nconst ROUTER_FILES = [\n 'src/routes',\n 'src/routeTree.gen.ts',\n 'src/integrations/tanstack-router',\n 'src/config/routes.ts',\n 'src/config/router.ts',\n 'src/app.tsx',\n] as const\n\nconst TANSTACK_DEPS = ['@tanstack/react-router', '@tanstack/router-plugin'] as const\n\nexport function isModuleTemplate(template: string): boolean {\n return template === 'module-hybrid-cdn' || template === 'module-monolith'\n}\n\nexport function writeRouterConfig(targetDir: string, mode: Exclude<RouterScaffoldMode, 'none'>): void {\n const configDir = resolve(targetDir, 'src/config')\n mkdirSync(configDir, { recursive: true })\n writeFileSync(\n resolve(configDir, 'router.ts'),\n `/** Router history — set by \\`wp init\\`. Hash matches woodsportal-client-frontend (HubSpot CMS embeds). */\nexport type RouterHistoryMode = 'hash' | 'browser'\n\nexport const ROUTER_HISTORY: RouterHistoryMode = '${mode}'\n`,\n )\n}\n\nexport function writeMountDevPreviewRouter(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-dev-preview.tsx'),\n `import { mountGreenfieldDev } from '../../.wphs/.kit-bootstrap-greenfield.tsx'\n\nimport { App } from '@/app'\n\n/** Local dev: module-config overlay + routed starter preview. */\nexport async function mountDevPreview() {\n await mountGreenfieldDev({ preview: <App /> })\n}\n`,\n )\n}\n\nexport function writeMountDevPreviewSinglePage(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-dev-preview.tsx'),\n `import { mountGreenfieldDev } from '../../.wphs/.kit-bootstrap-greenfield.tsx'\n\nimport { StarterSinglePage } from '@/features/starter'\n\n/** Local dev: module-config overlay + single-page starter (no TanStack Router). */\nexport async function mountDevPreview() {\n await mountGreenfieldDev({ preview: <StarterSinglePage /> })\n}\n`,\n )\n}\n\nexport function writeMountPortalRouter(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-portal.tsx'),\n `import ReactDOM from 'react-dom/client'\n\nimport { App } from '@/app'\n\n/** Production mount — same App shell as woodsportal-client-frontend CDN app chunk. */\nexport async function mountPortal() {\n const root = document.getElementById('app')\n if (!root) {\n return\n }\n ReactDOM.createRoot(root).render(<App />)\n}\n`,\n )\n}\n\nexport function writeMountPortalSinglePage(targetDir: string): void {\n writeFileSync(\n resolve(targetDir, 'src/portal/mount-portal.tsx'),\n `import ReactDOM from 'react-dom/client'\n\nimport { StarterSinglePage } from '@/features/starter'\n\n/** Production mount — single-page starter when router scaffold is \\`none\\`. */\nexport async function mountPortal() {\n const root = document.getElementById('app')\n if (!root) {\n return\n }\n ReactDOM.createRoot(root).render(<StarterSinglePage />)\n}\n`,\n )\n}\n\nexport function writeStarterSinglePage(targetDir: string): void {\n const file = resolve(targetDir, 'src/features/starter/components/starter-single-page.tsx')\n if (existsSync(file)) {\n return\n }\n writeFileSync(\n file,\n `import { StarterShell } from '@/components/layout/starter-shell'\n\nimport { StarterGuidePage } from './starter-guide-page'\nimport { StarterHome } from './starter-home'\n\n/** Single-page starter when \\`wp init --router none\\` (no TanStack Router). */\nexport function StarterSinglePage() {\n return (\n <StarterShell showNav={false}>\n <StarterHome />\n <div className=\"mx-auto max-w-4xl px-6 sm:px-10\">\n <hr className=\"my-10 border-[#cbd6e2]\" />\n </div>\n <StarterGuidePage />\n </StarterShell>\n )\n}\n`,\n )\n}\n\nfunction removePath(targetDir: string, relativePath: string): void {\n const full = resolve(targetDir, relativePath)\n if (!existsSync(full)) {\n return\n }\n rmSync(full, { recursive: true, force: true })\n}\n\nexport function stripTanStackFromPackage(targetDir: string): void {\n const pkgPath = resolve(targetDir, 'package.json')\n if (!existsSync(pkgPath)) {\n return\n }\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n devDependencies?: Record<string, string>\n }\n if (!pkg.devDependencies) {\n return\n }\n for (const dep of TANSTACK_DEPS) {\n delete pkg.devDependencies[dep]\n }\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n}\n\nexport function applyRouterScaffold(\n targetDir: string,\n mode: RouterScaffoldMode,\n template: string,\n): void {\n if (!isModuleTemplate(template)) {\n return\n }\n\n if (mode === 'none') {\n for (const relativePath of ROUTER_FILES) {\n removePath(targetDir, relativePath)\n }\n writeStarterSinglePage(targetDir)\n writeMountDevPreviewSinglePage(targetDir)\n writeMountPortalSinglePage(targetDir)\n stripTanStackFromPackage(targetDir)\n return\n }\n\n writeRouterConfig(targetDir, mode)\n writeMountDevPreviewRouter(targetDir)\n writeMountPortalRouter(targetDir)\n\n const featuresIndex = resolve(targetDir, 'src/features/starter/index.ts')\n if (existsSync(featuresIndex)) {\n let content = readFileSync(featuresIndex, 'utf8')\n if (!content.includes('StarterSinglePage')) {\n content = content.replace(\n \"export type { StarterPreviewValues } from './hooks/use-starter-preview'\\n\",\n \"export type { StarterPreviewValues } from './hooks/use-starter-preview'\\nexport { StarterSinglePage } from './components/starter-single-page'\\n\",\n )\n writeFileSync(featuresIndex, content)\n }\n }\n}\n\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\n\nimport {\n ensureEnvFilesGitignore,\n ENV_LOCAL_FILE,\n readEnvLocal,\n writeEnvLocal,\n} from './project-env-files.js'\nimport { kitPath } from './paths.js'\n\nexport const PORTAL_CDN_PUBLISH_TOKEN_ENV = 'PORTAL_CDN_PUBLISH_TOKEN'\nexport const PORTAL_CDN_JSON = 'portal.cdn.json'\n\nexport type PortalCdnJson = {\n publishMode?: string\n github: string\n gitRemote: string\n cdnPathInRepo?: string\n defaultBranch?: string\n}\n\nexport type CdnGitHubSetupInput = {\n github: string\n token?: string\n}\n\nconst PLACEHOLDER_GITHUB = /your-org|your-portal-cdn-mirror/i\n\nexport function defaultPortalCdnJson(): PortalCdnJson {\n const examplePath = kitPath('templates', 'shared', 'portal.cdn.json.example')\n if (existsSync(examplePath)) {\n return JSON.parse(readFileSync(examplePath, 'utf8')) as PortalCdnJson\n }\n return {\n publishMode: 'jsdelivr',\n github: 'your-org/your-portal-cdn-mirror',\n gitRemote: 'https://github.com/your-org/your-portal-cdn-mirror.git',\n cdnPathInRepo: 'dist/cdn',\n defaultBranch: 'main',\n }\n}\n\nexport function readPortalCdnJson(projectRoot: string): PortalCdnJson | null {\n const path = resolve(projectRoot, PORTAL_CDN_JSON)\n if (!existsSync(path)) return null\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as PortalCdnJson\n } catch {\n return null\n }\n}\n\nexport function normalizeGithubSlug(input: string): string | null {\n const trimmed = input.trim().replace(/^https:\\/\\/github\\.com\\//, '').replace(/\\.git$/, '')\n const parts = trimmed.split('/').filter(Boolean)\n if (parts.length !== 2) return null\n return `${parts[0]}/${parts[1]}`\n}\n\nexport function portalCdnJsonFromGithub(github: string, base?: PortalCdnJson): PortalCdnJson {\n const slug = normalizeGithubSlug(github)\n if (!slug) {\n throw new Error(`Invalid GitHub repo — use org/repo (got \"${github}\")`)\n }\n return {\n publishMode: base?.publishMode ?? 'jsdelivr',\n github: slug,\n gitRemote: `https://github.com/${slug}.git`,\n cdnPathInRepo: base?.cdnPathInRepo ?? 'dist/cdn',\n defaultBranch: base?.defaultBranch ?? 'main',\n }\n}\n\nexport function hasCdnPublishToken(projectRoot: string): boolean {\n if (process.env[PORTAL_CDN_PUBLISH_TOKEN_ENV]?.trim()) return true\n if (process.env.GITHUB_TOKEN?.trim()) return true\n return Boolean(readEnvLocal(projectRoot)[PORTAL_CDN_PUBLISH_TOKEN_ENV]?.trim())\n}\n\nexport function hasConfiguredCdnGithubMirror(projectRoot: string): boolean {\n const config = readPortalCdnJson(projectRoot)\n const github = config?.github ?? ''\n return Boolean(github) && !PLACEHOLDER_GITHUB.test(github)\n}\n\nexport function githubDefaultForPrompt(projectRoot: string): string {\n const existing = readPortalCdnJson(projectRoot)\n if (existing?.github && !PLACEHOLDER_GITHUB.test(existing.github)) {\n return existing.github\n }\n return defaultPortalCdnJson().github\n}\n\nexport function needsCdnGitHubSetup(projectRoot: string): boolean {\n return !hasConfiguredCdnGithubMirror(projectRoot) || !hasCdnPublishToken(projectRoot)\n}\n\nexport function applyCdnGitHubSetup(projectRoot: string, input: CdnGitHubSetupInput): void {\n const existing = readPortalCdnJson(projectRoot) ?? defaultPortalCdnJson()\n const updated = portalCdnJsonFromGithub(input.github, existing)\n writeFileSync(resolve(projectRoot, PORTAL_CDN_JSON), `${JSON.stringify(updated, null, 2)}\\n`)\n\n if (input.token?.trim()) {\n writeEnvLocal(projectRoot, { [PORTAL_CDN_PUBLISH_TOKEN_ENV]: input.token.trim() })\n }\n\n ensureEnvFilesGitignore(projectRoot)\n}\n\nexport type PromptCdnGitHubOptions = {\n projectRoot?: string\n githubDefault?: string\n /** Pre-set from --cdn-github (CI); skips repo prompt */\n github?: string\n /** When true, skip all prompts */\n skip?: boolean\n}\n\nexport async function promptCdnGitHubSetup(\n options: PromptCdnGitHubOptions = {},\n): Promise<CdnGitHubSetupInput | null> {\n if (options.skip) return null\n\n const projectRoot = options.projectRoot ?? process.cwd()\n\n if (!needsCdnGitHubSetup(projectRoot)) {\n return null\n }\n\n let github = options.github?.trim()\n if (!github && hasConfiguredCdnGithubMirror(projectRoot)) {\n github = readPortalCdnJson(projectRoot)?.github\n }\n if (!github) {\n const answer = await p.text({\n message: 'Public GitHub CDN mirror (org/repo)',\n placeholder: options.githubDefault ?? 'your-org/your-portal-cdn-mirror',\n initialValue: options.githubDefault,\n validate: (value) => {\n const slug = normalizeGithubSlug(value ?? '')\n return slug ? undefined : 'Enter a public repo as org/repo (jsDelivr serves from it)'\n },\n })\n if (p.isCancel(answer)) return null\n github = normalizeGithubSlug(answer) ?? undefined\n }\n\n if (!github) return null\n\n if (hasCdnPublishToken(projectRoot)) {\n return { github }\n }\n\n const tokenAnswer = await p.password({\n message: 'GitHub token (repo push on CDN mirror)',\n validate: (value) => {\n if (!value?.trim()) return 'Required for wp publish — create a fine-grained PAT with Contents: Read and write'\n return undefined\n },\n })\n if (p.isCancel(tokenAnswer)) return null\n\n return { github, token: tokenAnswer.trim() }\n}\n\nexport function formatCdnSetupNote(_projectRoot?: string): string {\n return `CDN config written — edit ${PORTAL_CDN_JSON} if needed; token saved to ${ENV_LOCAL_FILE} (gitignored)`\n}\n","import { copyFileSync, existsSync, writeFileSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\n\nimport type { CommandContext } from '../cli/context.js'\nimport {\n HUBSPOT_CONFIG_EXAMPLE,\n HUBSPOT_CONFIG_FILE,\n} from './hubspot-cli-setup.js'\nimport { kitPath } from './paths.js'\nimport {\n isModuleProject,\n isThemeProject,\n usesCdnPipeline,\n type WoodsPortalHsConfig,\n} from '../schema/woodsportal-hs.js'\nimport type { BuildTier } from './build-tier.js'\n\nexport type SetupResult = {\n action: 'copied' | 'skipped' | 'manual'\n path: string\n detail: string\n}\n\ntype SetupOptions = {\n tier?: BuildTier\n dryRun?: boolean\n}\n\nfunction envFileForTier(tier: BuildTier): string {\n return tier === 'dev' ? '.env.dev' : tier === 'stg' ? '.env.stg' : '.env.prod'\n}\n\nfunction tiersToSetup(config: WoodsPortalHsConfig, tier?: BuildTier): BuildTier[] {\n if (tier) return [tier]\n return config.env.tiers\n}\n\nfunction firstExisting(paths: string[]): string | null {\n for (const path of paths) {\n if (existsSync(path)) return path\n }\n return null\n}\n\nfunction copyMissingFile(\n projectRoot: string,\n targetName: string,\n sourceCandidates: string[],\n dryRun: boolean,\n): SetupResult {\n const target = resolve(projectRoot, targetName)\n if (existsSync(target)) {\n return { action: 'skipped', path: targetName, detail: 'already present' }\n }\n\n const source = firstExisting(sourceCandidates)\n if (!source) {\n return {\n action: 'manual',\n path: targetName,\n detail: `no template found — create ${targetName} manually`,\n }\n }\n\n if (!dryRun) {\n copyFileSync(source, target)\n }\n\n const from = basename(source)\n return {\n action: 'copied',\n path: targetName,\n detail: dryRun ? `[dry-run] would copy ${from} → ${targetName}` : `copied ${from} → ${targetName}`,\n }\n}\n\nfunction writeMissingFile(\n projectRoot: string,\n targetName: string,\n content: string,\n dryRun: boolean,\n): SetupResult {\n const target = resolve(projectRoot, targetName)\n if (existsSync(target)) {\n return { action: 'skipped', path: targetName, detail: 'already present' }\n }\n\n if (!dryRun) {\n writeFileSync(target, content)\n }\n\n return {\n action: 'copied',\n path: targetName,\n detail: dryRun ? `[dry-run] would create ${targetName}` : `created ${targetName}`,\n }\n}\n\nfunction templateViteFiles(config: WoodsPortalHsConfig): string[] {\n if (isThemeProject(config)) return ['vite.config.dev.mjs']\n if (config.projectType === 'module-monolith') {\n return ['vite.config.dev.mjs', 'vite.config.monolith.mjs']\n }\n return ['vite.config.dev.mjs', 'vite.config.hubspot.mjs', 'vite.config.monolith.mjs']\n}\n\nfunction kitTemplateDir(config: WoodsPortalHsConfig): string {\n return kitPath('templates', config.projectType)\n}\n\nexport function applyProjectSetup(ctx: CommandContext, options: SetupOptions = {}): SetupResult[] {\n const { projectRoot, config } = ctx\n const dryRun = options.dryRun ?? false\n const results: SetupResult[] = []\n const sharedDir = kitPath('templates', 'shared')\n const templateDir = kitTemplateDir(config)\n\n // HubSpot CLI config\n results.push(\n copyMissingFile(projectRoot, HUBSPOT_CONFIG_FILE, [\n resolve(projectRoot, HUBSPOT_CONFIG_EXAMPLE),\n resolve(templateDir, HUBSPOT_CONFIG_EXAMPLE),\n kitPath('templates', HUBSPOT_CONFIG_EXAMPLE),\n ], dryRun),\n )\n\n // Localhost SPA env (not a WoodsCLI deploy tier)\n results.push(\n copyMissingFile(projectRoot, '.env.local', [\n resolve(projectRoot, '.env.local.example'),\n resolve(sharedDir, '.env.local.example'),\n ], dryRun),\n )\n\n // Env files (all tiers or single --tier)\n for (const tier of tiersToSetup(config, options.tier)) {\n const envFile = envFileForTier(tier)\n const envExample = `${envFile}.example`\n results.push(\n copyMissingFile(projectRoot, envFile, [\n resolve(projectRoot, envExample),\n resolve(sharedDir, envExample),\n ], dryRun),\n )\n }\n\n // CDN pipeline extras\n if (usesCdnPipeline(config) && !isThemeProject(config)) {\n const mirror = config.cdn.mirror\n results.push(\n copyMissingFile(projectRoot, mirror, [\n resolve(projectRoot, `${mirror}.example`),\n resolve(sharedDir, 'portal.cdn.json.example'),\n ], dryRun),\n )\n\n const buildIdFile = config.cdn.buildIdFile\n results.push(\n writeMissingFile(\n projectRoot,\n buildIdFile,\n '# Channel baseline for local CDN deploys (wp deploy auto-bumps per developer).\\n# Example resolved id: v0.0.1-dev.you.1\\nv0.0.1-dev\\n',\n dryRun,\n ),\n )\n }\n\n // Vite shims from project template\n for (const file of templateViteFiles(config)) {\n results.push(\n copyMissingFile(projectRoot, file, [resolve(templateDir, file)], dryRun),\n )\n }\n\n // Module adapter stub\n if (isModuleProject(config) && !isThemeProject(config)) {\n const adapter = config.dev.adapter\n const adapterPath = resolve(projectRoot, adapter)\n if (!existsSync(adapterPath)) {\n const templateAdapter = resolve(templateDir, 'wphs.adapter.ts')\n if (existsSync(templateAdapter)) {\n results.push(copyMissingFile(projectRoot, adapter, [templateAdapter], dryRun))\n } else {\n results.push({\n action: 'manual',\n path: adapter,\n detail: 'create wphs.adapter.ts (see docs/ADAPTER.md)',\n })\n }\n } else {\n results.push({ action: 'skipped', path: adapter, detail: 'already present' })\n }\n }\n\n return results\n}\n\n/** Copy shared env/hubspot examples into a freshly scaffolded project (init). */\nexport function copySharedSetupExamples(targetDir: string): void {\n const sharedDir = kitPath('templates', 'shared')\n if (!existsSync(sharedDir)) return\n\n for (const name of [\n '.env.local.example',\n '.env.dev.example',\n '.env.stg.example',\n '.env.prod.example',\n 'portal.cdn.json.example',\n ]) {\n const src = resolve(sharedDir, name)\n const dest = resolve(targetDir, name)\n if (existsSync(src) && !existsSync(dest)) {\n copyFileSync(src, dest)\n }\n }\n\n const hubspotExample = firstExisting([\n resolve(sharedDir, HUBSPOT_CONFIG_EXAMPLE),\n kitPath('templates', HUBSPOT_CONFIG_EXAMPLE),\n ])\n if (!hubspotExample) return\n const destHubspot = resolve(targetDir, HUBSPOT_CONFIG_EXAMPLE)\n if (!existsSync(destHubspot) && !existsSync(resolve(targetDir, HUBSPOT_CONFIG_FILE))) {\n copyFileSync(hubspotExample, destHubspot)\n }\n}\n\nexport function formatSetupHint(results: SetupResult[]): string | undefined {\n const hubspot = results.find((r) => r.path === HUBSPOT_CONFIG_FILE && r.action === 'copied')\n if (hubspot) {\n return `Edit ${HUBSPOT_CONFIG_FILE} — set portalId and personalAccessKey (https://app.hubspot.com/l/personal-access-key)`\n }\n\n const envCopied = results.some((r) => r.path.startsWith('.env.') && r.action === 'copied')\n if (envCopied) {\n return 'Edit .env.* files — set VITE_PUBLIC_REST_API_ENDPOINT and portal IDs for your environment'\n }\n\n const cdnMirror = results.find((r) => r.path === 'portal.cdn.json' && r.action === 'copied')\n if (cdnMirror) {\n return 'Hybrid CDN: set public GitHub mirror in portal.cdn.json; token in .env.local (wp init prompts)'\n }\n\n return undefined\n}\n","/** npm scripts merged into scaffolded package.json by wp init */\nexport const TEMPLATE_SCRIPTS: Record<string, Record<string, string>> = {\n 'module-hybrid-cdn': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:prod': 'wp build --tier prod',\n 'build:dev': 'wp build --tier dev',\n 'deploy:prod': 'wp deploy --tier prod --yes',\n 'deploy:dev': 'wp deploy --tier dev --yes',\n doctor: 'wp doctor',\n },\n 'module-monolith': {\n dev: 'wp dev',\n local: 'wp dev',\n 'build:dev': 'wp build --tier dev',\n 'build:prod': 'wp build --tier prod',\n 'deploy:dev': 'wp deploy --tier dev --yes',\n 'deploy:prod': 'wp deploy --tier prod --yes',\n watch: 'wp watch --rebuild',\n doctor: 'wp doctor',\n },\n 'theme-starter': {\n dev: 'wp dev',\n local: 'wp dev',\n doctor: 'wp doctor',\n },\n}\n\nexport type ModuleTemplateTrack = 'module-hybrid-cdn' | 'module-monolith'\n","const PROJECT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/\n\nexport function normalizeProjectName(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nexport function validateProjectName(name: string): string | undefined {\n if (!name) return 'Project name is required'\n if (!PROJECT_NAME_PATTERN.test(name)) {\n return 'Use lowercase letters, numbers, and hyphens (e.g. my-portal-module)'\n }\n if (name.length > 64) return 'Project name is too long (max 64 characters)'\n return undefined\n}\n\nexport function moduleOutDirFromSlug(slug: string): string {\n const pascal = slug\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n return `dist/${pascal || 'HubSpot'}.Module`\n}\n","import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport {\n LEGACY_WOODSPORTAL_HS_FILE,\n WOODSCLI_CONFIG_FILE,\n} from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport { WPHS_WORKSPACE_DIR } from '../../schema/woodsportal-hs.js'\nimport type { CommandContext } from '../context.js'\n\nconst LEGACY_DIRS = ['.dev', '.woodsportal']\nconst LEGACY_BASELINE = '.wp-hs-baseline'\nconst LEGACY_BUILD_ID_FILE = '.portal-build-id'\nconst MODULE_BUILD_ID_FILE = '.module-build-id'\n\nfunction readFirstNonCommentLine(filePath: string): string | undefined {\n if (!existsSync(filePath)) return undefined\n const line = readFileSync(filePath, 'utf8')\n .split('\\n')\n .map((l) => l.trim())\n .find((l) => l.length > 0 && !l.startsWith('#'))\n return line || undefined\n}\n\nfunction stripToBaseline(raw: string | undefined): string | undefined {\n const line = raw?.trim()\n if (!line) return undefined\n const perDev = line.match(/^(v\\d+\\.\\d+\\.\\d+(?:-[a-z0-9]+)?)\\.[a-z0-9-]{1,12}\\.\\d+$/i)\n if (perDev) return perDev[1]\n const numericSuffix = line.match(/^(v\\d+\\.\\d+\\.\\d+(?:-[a-z0-9]+)?)\\.\\d+$/)\n if (numericSuffix) return numericSuffix[1]\n return line\n}\n\nexport type MigrateOptions = {\n yes?: boolean\n}\n\nexport async function runMigrate(ctx: CommandContext, _options: MigrateOptions = {}): Promise<number> {\n const root = ctx.projectRoot\n const wphsRoot = resolve(root, WPHS_WORKSPACE_DIR)\n const actions: string[] = []\n\n for (const legacy of LEGACY_DIRS) {\n const legacyPath = resolve(root, legacy)\n if (!existsSync(legacyPath)) continue\n\n actions.push(`Move ${legacy}/ → .wphs/`)\n if (ctx.global.dryRun) continue\n\n mkdirSync(join(wphsRoot, 'config'), { recursive: true })\n mkdirSync(join(wphsRoot, 'assets', 'branding'), { recursive: true })\n\n const localConfig = join(legacyPath, 'module-config.local.json')\n const exampleConfig = join(legacyPath, 'module-config.example.json')\n if (existsSync(localConfig)) {\n cpSync(localConfig, join(wphsRoot, 'config', 'module-config.local.json'))\n }\n if (existsSync(exampleConfig)) {\n cpSync(exampleConfig, join(wphsRoot, 'config', 'module-config.example.json'))\n }\n\n const branding = join(legacyPath, 'branding-assets')\n if (existsSync(branding)) {\n for (const file of readdirSync(branding)) {\n cpSync(join(branding, file), join(wphsRoot, 'assets', 'branding', file))\n }\n }\n\n rmSync(legacyPath, { recursive: true, force: true })\n }\n\n const legacyBaseline = resolve(root, LEGACY_BASELINE)\n const targetBaseline = join(wphsRoot, 'audit', 'baseline')\n if (existsSync(legacyBaseline)) {\n actions.push(`Move ${LEGACY_BASELINE}/ → .wphs/audit/baseline/`)\n if (!ctx.global.dryRun) {\n mkdirSync(targetBaseline, { recursive: true })\n cpSync(legacyBaseline, targetBaseline, { recursive: true })\n rmSync(legacyBaseline, { recursive: true, force: true })\n }\n }\n\n const legacyConfigPath = resolve(root, LEGACY_WOODSPORTAL_HS_FILE)\n const woodscliPath = resolve(root, WOODSCLI_CONFIG_FILE)\n\n if (existsSync(legacyConfigPath) && !existsSync(woodscliPath)) {\n actions.push(`Rename ${LEGACY_WOODSPORTAL_HS_FILE} → ${WOODSCLI_CONFIG_FILE}`)\n if (!ctx.global.dryRun) {\n renameSync(legacyConfigPath, woodscliPath)\n }\n } else if (existsSync(legacyConfigPath) && existsSync(woodscliPath)) {\n actions.push(`Remove duplicate ${LEGACY_WOODSPORTAL_HS_FILE}`)\n if (!ctx.global.dryRun) {\n rmSync(legacyConfigPath, { force: true })\n }\n }\n\n const legacyBuildIdPath = resolve(root, LEGACY_BUILD_ID_FILE)\n const moduleBuildIdPath = resolve(root, MODULE_BUILD_ID_FILE)\n if (existsSync(legacyBuildIdPath) && !existsSync(moduleBuildIdPath)) {\n const baseline = stripToBaseline(readFirstNonCommentLine(legacyBuildIdPath)) ?? 'v0.0.1-dev'\n actions.push(`Migrate ${LEGACY_BUILD_ID_FILE} → ${MODULE_BUILD_ID_FILE} (baseline ${baseline})`)\n if (!ctx.global.dryRun) {\n writeFileSync(\n moduleBuildIdPath,\n `# Channel baseline for local CDN deploys (wp deploy auto-bumps per developer).\\n${baseline}\\n`,\n )\n rmSync(legacyBuildIdPath, { force: true })\n }\n }\n\n if (existsSync(woodscliPath)) {\n const raw = JSON.parse(readFileSync(woodscliPath, 'utf8'))\n let configChanged = false\n if (raw?.dev?.moduleConfigDir && raw.dev.moduleConfigDir !== WPHS_WORKSPACE_DIR) {\n actions.push(`Update dev.moduleConfigDir → .wphs in project config`)\n if (!ctx.global.dryRun) {\n raw.dev.moduleConfigDir = WPHS_WORKSPACE_DIR\n configChanged = true\n }\n }\n if (raw?.cdn?.buildIdFile === LEGACY_BUILD_ID_FILE) {\n actions.push(`Update cdn.buildIdFile → ${MODULE_BUILD_ID_FILE}`)\n if (!ctx.global.dryRun) {\n raw.cdn.buildIdFile = MODULE_BUILD_ID_FILE\n configChanged = true\n }\n }\n if (configChanged && !ctx.global.dryRun) {\n writeFileSync(woodscliPath, `${JSON.stringify(raw, null, 2)}\\n`)\n }\n }\n\n if (actions.length === 0) {\n ctx.logger.success('Nothing to migrate — already on .wphs / woodscli.json')\n return ExitCode.SUCCESS\n }\n\n if (ctx.global.dryRun) {\n for (const action of actions) ctx.logger.info(`[dry-run] ${action}`)\n return ExitCode.SUCCESS\n }\n\n if (!ctx.global.yes && !ctx.global.ci) {\n throw new WpHsError('Migration requires --yes.', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run: wp migrate --yes',\n })\n }\n\n runNodeScript(kitPath('scripts/ensure-wphs-workspace.mjs'), [], {\n cwd: root,\n logger: ctx.logger,\n dryRun: false,\n })\n\n for (const action of actions) ctx.logger.success(action)\n return ExitCode.SUCCESS\n}\n","import { readFileSync } from 'node:fs'\n\nimport { ExitCode } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type ExamplesListOptions = {\n track?: 'module' | 'theme'\n setup?: 'greenfield' | 'existing' | 'adopted'\n}\n\nexport type ExamplesSmokeOptions = {\n scenario?: string\n tier?: 'static' | 'live'\n}\n\ntype Scenario = {\n id: string\n setup: string\n track: string\n projectType?: string\n smokeTier: string\n fixture?: string\n checks?: string[]\n}\n\nfunction loadManifest() {\n const manifestPath = kitPath('examples', 'manifest.json')\n const raw = JSON.parse(readFileSync(manifestPath, 'utf8')) as { scenarios: Scenario[] }\n return raw.scenarios\n}\n\nexport async function runExamplesList(\n ctx: CommandContext,\n options: ExamplesListOptions = {},\n): Promise<number> {\n let scenarios = loadManifest()\n if (options.track) scenarios = scenarios.filter((s) => s.track === options.track)\n if (options.setup) scenarios = scenarios.filter((s) => s.setup === options.setup)\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:list', scenarios })\n } else {\n for (const s of scenarios) {\n ctx.logger.info(`${s.id} (${s.setup}/${s.track}) tier=${s.smokeTier}`)\n }\n }\n return ExitCode.SUCCESS\n}\n\nexport async function runExamplesSmoke(\n ctx: CommandContext,\n options: ExamplesSmokeOptions = {},\n): Promise<number> {\n const tier = options.tier ?? 'static'\n const args = ['--tier', tier]\n if (options.scenario) args.push('--scenario', options.scenario)\n\n const { runNodeScript } = await import('../../lib/exec.js')\n runNodeScript(kitPath('examples', 'smoke', 'run-matrix.mjs'), args, {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n\n if (ctx.global.json) {\n ctx.logger.json({ command: 'examples:smoke', tier, scenario: options.scenario ?? 'all', ok: true })\n }\n\n return ExitCode.SUCCESS\n}\n","import { cpSync, existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport type { CommandContext } from '../context.js'\n\nexport type FieldsSyncOptions = {\n direction?: 'pull' | 'push'\n dryRun?: boolean\n}\n\nexport async function runFieldsSync(\n ctx: CommandContext,\n options: FieldsSyncOptions = {},\n): Promise<number> {\n const direction = options.direction ?? 'pull'\n const fieldsPath = resolve(ctx.projectRoot, ctx.config.dev.fieldsJson)\n const cacheDir = resolve(ctx.projectRoot, ctx.config.dev.moduleConfigDir, 'cache', 'fields-sync')\n const cachePath = resolve(cacheDir, 'fields.json')\n\n if (direction === 'pull') {\n if (!existsSync(fieldsPath)) {\n throw new WpHsError(`Missing ${ctx.config.dev.fieldsJson}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Add fields.json or run wp init.',\n })\n }\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would cache ${fieldsPath} → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n const { mkdirSync } = await import('node:fs')\n mkdirSync(cacheDir, { recursive: true })\n cpSync(fieldsPath, cachePath)\n ctx.logger.success(`Cached fields → ${cachePath}`)\n return ExitCode.SUCCESS\n }\n\n if (!existsSync(cachePath)) {\n throw new WpHsError('No cached fields — run wp fields sync pull first.', {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n\n if (ctx.global.dryRun || options.dryRun) {\n ctx.logger.info(`[dry-run] Would write ${cachePath} → ${fieldsPath}`)\n return ExitCode.SUCCESS\n }\n\n writeFileSync(fieldsPath, readFileSync(cachePath, 'utf8'))\n ctx.logger.success(`Restored fields from cache → ${fieldsPath}`)\n return ExitCode.SUCCESS\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { WOODSCLI_CONFIG_FILE } from '../../lib/config-files.js'\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\nimport { runConfigValidate } from './config-validate.js'\nimport { runDoctor } from './doctor.js'\n\nexport type RegressionSmokeOptions = {\n /** Skip doctor (e.g. when HubSpot CLI is not installed in CI) */\n skipDoctor?: boolean\n /** Fail if legacy consumer script shims are missing */\n checkLegacyShims?: boolean\n}\n\nconst LEGACY_SHIM_SCRIPTS = [\n 'build-cdn.mjs',\n 'run-vite-build.mjs',\n 'run-hubspot-module-postbuild.mjs',\n 'watch-hubspot.mjs',\n]\n\nconst FORBIDDEN_CONSUMER_PATHS = ['src/dev/module-config', 'src/dev/bootstrap.tsx']\n\nexport async function runRegressionSmoke(\n ctx: CommandContext,\n options: RegressionSmokeOptions = {},\n): Promise<number> {\n const failures: string[] = []\n const checks: { name: string; ok: boolean; detail?: string }[] = []\n\n if (!options.skipDoctor) {\n const doctorCode = await runDoctor(ctx)\n const doctorOk = doctorCode === ExitCode.SUCCESS\n checks.push({ name: 'doctor', ok: doctorOk })\n if (!doctorOk) failures.push('wp doctor failed')\n }\n\n const validateCode = await runConfigValidate(ctx)\n const validateOk = validateCode === ExitCode.SUCCESS\n checks.push({ name: 'config-validate', ok: validateOk })\n if (!validateOk) failures.push('wp config validate failed')\n\n if (options.checkLegacyShims !== false) {\n for (const script of LEGACY_SHIM_SCRIPTS) {\n const shim = resolve(ctx.projectRoot, 'scripts', script)\n const kitScript = kitPath('scripts', script)\n const shimOk = existsSync(shim) && existsSync(kitScript)\n checks.push({ name: `shim:${script}`, ok: shimOk })\n if (!shimOk) failures.push(`Missing legacy shim or kit script: ${script}`)\n }\n }\n\n for (const rel of FORBIDDEN_CONSUMER_PATHS) {\n const forbidden = resolve(ctx.projectRoot, rel)\n const absent = !existsSync(forbidden)\n checks.push({ name: `no-${rel}`, ok: absent })\n if (!absent) failures.push(`Forbidden dev path still present: ${rel}`)\n }\n\n const woodscliConfig = resolve(ctx.projectRoot, WOODSCLI_CONFIG_FILE)\n const configOk = existsSync(woodscliConfig)\n checks.push({ name: WOODSCLI_CONFIG_FILE, ok: configOk })\n if (!configOk) failures.push(`${WOODSCLI_CONFIG_FILE} missing`)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'regression:smoke',\n ok: failures.length === 0,\n checks,\n failures,\n })\n } else if (failures.length === 0) {\n ctx.logger.success('Regression smoke passed')\n } else {\n for (const f of failures) ctx.logger.error(f)\n }\n\n if (failures.length > 0) {\n throw new WpHsError('Regression smoke failed', {\n exitCode: ExitCode.AUDIT_FAILED,\n remediation: 'Run wp doctor and fix listed checks. See docs/REGRESSION-SMOKE.md.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { ExitCode } from '../../lib/errors.js'\nimport { printCommandDone, runCliTasks } from '../../lib/cli-spinner.js'\nimport { runNodeScript } from '../../lib/exec.js'\nimport {\n applyCdnGitHubSetup,\n formatCdnSetupNote,\n githubDefaultForPrompt,\n needsCdnGitHubSetup,\n promptCdnGitHubSetup,\n} from '../../lib/cdn-github-setup.js'\nimport { promptDeveloperSlug } from '../../lib/developer-slug.js'\nimport { applyProjectSetup, formatSetupHint } from '../../lib/project-setup.js'\nimport { usesCdnPipeline } from '../../schema/woodsportal-hs.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { BuildTier } from '../../lib/build-tier.js'\nimport type { CommandContext } from '../context.js'\n\nexport type SetupOptions = {\n tier?: BuildTier\n progress?: boolean\n}\n\nexport async function runSetup(ctx: CommandContext, options: SetupOptions = {}): Promise<number> {\n let results: ReturnType<typeof applyProjectSetup> = []\n\n await runCliTasks(\n ctx,\n [\n {\n title: 'Preparing .wphs workspace',\n task: async () => {\n if (ctx.global.dryRun) return\n try {\n runNodeScript(kitPath('scripts', 'ensure-wphs-workspace.mjs'), [], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n } catch {\n // non-fatal\n }\n },\n },\n {\n title: 'Copying missing config files',\n task: async () => {\n results = applyProjectSetup(ctx, {\n tier: options.tier,\n dryRun: ctx.global.dryRun,\n })\n },\n },\n ],\n options,\n )\n\n const copied = results.filter((r) => r.action === 'copied')\n const manual = results.filter((r) => r.action === 'manual')\n\n const nonInteractive = ctx.global.ci || ctx.global.yes || ctx.global.json || ctx.global.dryRun\n if (usesCdnPipeline(ctx.config) && !nonInteractive && !ctx.global.dryRun) {\n const slug = await promptDeveloperSlug(ctx.projectRoot)\n if (slug) {\n ctx.logger.success(`CDN dev slug → ${slug} (.wphs/config/developer.json)`)\n }\n }\n\n if (\n usesCdnPipeline(ctx.config) &&\n needsCdnGitHubSetup(ctx.projectRoot) &&\n !nonInteractive\n ) {\n const cdnSetup = await promptCdnGitHubSetup({\n projectRoot: ctx.projectRoot,\n githubDefault: githubDefaultForPrompt(ctx.projectRoot),\n })\n if (cdnSetup) {\n applyCdnGitHubSetup(ctx.projectRoot, cdnSetup)\n ctx.logger.success(formatCdnSetupNote(ctx.projectRoot))\n }\n }\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'setup',\n ok: manual.length === 0,\n copied: copied.length,\n skipped: results.filter((r) => r.action === 'skipped').length,\n manual,\n results,\n })\n } else {\n for (const result of results) {\n if (result.action === 'skipped') continue\n if (result.action === 'copied') {\n ctx.logger.success(result.detail)\n } else {\n ctx.logger.warn(`${result.path}: ${result.detail}`)\n }\n }\n\n if (copied.length === 0 && manual.length === 0) {\n printCommandDone(ctx, 'Nothing to copy — required files already present')\n } else if (copied.length > 0) {\n printCommandDone(ctx, `Setup complete — ${copied.length} file(s) copied`)\n }\n\n const hint = formatSetupHint(results)\n if (hint) {\n ctx.logger.info(`→ ${hint}`)\n }\n\n if (manual.length > 0) {\n ctx.logger.info('→ Run wp doctor for the full checklist')\n }\n }\n\n return ExitCode.SUCCESS\n}\n","import * as p from '@clack/prompts'\n\nimport { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { isInteractiveCli, printCommandDone } from '../../lib/cli-spinner.js'\nimport { runCommand } from '../../lib/exec.js'\nimport {\n readHubSpotPortals,\n resolvePortalName,\n type HubSpotPortalEntry,\n} from '../../lib/hubspot-portals.js'\nimport type { CommandContext } from '../context.js'\n\nexport type PortalListOptions = Record<string, never>\n\nexport type PortalUseOptions = {\n name?: string\n}\n\nfunction formatPortalLine(portal: HubSpotPortalEntry, defaultPortal: string | null): string {\n const id = portal.portalId ? `portalId ${portal.portalId}` : 'portalId ?'\n const mark = portal.name === defaultPortal ? ' · default' : ''\n return `${portal.name} (${id})${mark}`\n}\n\nexport async function runPortalList(ctx: CommandContext, _options: PortalListOptions = {}): Promise<number> {\n const data = readHubSpotPortals(ctx.projectRoot)\n\n if (ctx.global.json) {\n ctx.logger.json({\n command: 'portal:list',\n configPath: data.configPath,\n defaultPortal: data.defaultPortal,\n portals: data.portals,\n })\n return ExitCode.SUCCESS\n }\n\n if (data.portals.length === 0) {\n ctx.logger.warn(`No portals[] entries found in ${data.configPath}`)\n ctx.logger.info('→ Add portals under hubspot.config.yml or run hs auth')\n return ExitCode.SUCCESS\n }\n\n if (data.defaultPortal) {\n ctx.logger.info(`Default: ${data.defaultPortal}`)\n }\n\n for (const portal of data.portals) {\n ctx.logger.info(formatPortalLine(portal, data.defaultPortal))\n }\n\n return ExitCode.SUCCESS\n}\n\nexport async function runPortalUse(ctx: CommandContext, options: PortalUseOptions = {}): Promise<number> {\n const data = readHubSpotPortals(ctx.projectRoot)\n\n if (data.portals.length === 0) {\n throw new WpHsError('No portals configured in hubspot.config.yml', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp auth or add portals[] to hubspot.config.yml',\n })\n }\n\n let targetName = options.name?.trim()\n\n if (!targetName) {\n if (ctx.global.ci || ctx.global.json) {\n throw new WpHsError('Portal name or id required in non-interactive mode', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal use <name>',\n })\n }\n\n if (!isInteractiveCli(ctx)) {\n throw new WpHsError('Portal name or id required', {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal use <name> · wp portal list',\n })\n }\n\n const answer = await p.select({\n message: 'Set default HubSpot portal',\n options: data.portals.map((portal) => ({\n value: portal.name,\n label: portal.name,\n hint:\n portal.name === data.defaultPortal\n ? `current default · ${portal.portalId ?? 'no id'}`\n : portal.portalId ?? undefined,\n })),\n })\n\n if (p.isCancel(answer)) {\n throw new WpHsError('Portal selection cancelled', { exitCode: ExitCode.USER_ERROR })\n }\n\n targetName = answer\n }\n\n const portal = resolvePortalName(data.portals, targetName)\n if (!portal) {\n throw new WpHsError(`Unknown portal: ${targetName}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'wp portal list',\n })\n }\n\n if (ctx.global.dryRun) {\n ctx.logger.info(`[dry-run] hs accounts use ${portal.name}`)\n return ExitCode.SUCCESS\n }\n\n runCommand('hs', ['accounts', 'use', portal.name], {\n cwd: ctx.projectRoot,\n logger: ctx.logger,\n dryRun: false,\n })\n\n if (!ctx.global.json && !ctx.global.quiet) {\n printCommandDone(ctx, `Default portal → ${portal.name}`)\n } else if (ctx.global.json) {\n ctx.logger.json({\n command: 'portal:use',\n ok: true,\n defaultPortal: portal.name,\n portalId: portal.portalId ?? null,\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { ExitCode, WpHsError } from './errors.js'\nimport { HUBSPOT_CONFIG_FILE } from './hubspot-cli-setup.js'\n\nexport type HubSpotPortalEntry = {\n name: string\n portalId?: string\n}\n\nexport type HubSpotPortalsFile = {\n configPath: string\n defaultPortal: string | null\n portals: HubSpotPortalEntry[]\n}\n\nfunction stripYamlScalar(value: string): string {\n const trimmed = value.trim()\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1)\n }\n return trimmed\n}\n\n/** Minimal parser for hubspot.config.yml portal names (no YAML dependency). */\nexport function parseHubSpotConfigPortals(raw: string): Pick<HubSpotPortalsFile, 'defaultPortal' | 'portals'> {\n const defaultMatch = raw.match(/^defaultPortal:\\s*(.+)\\s*$/m)\n const defaultPortal = defaultMatch ? stripYamlScalar(defaultMatch[1]) : null\n\n const portals: HubSpotPortalEntry[] = []\n let current: HubSpotPortalEntry | null = null\n let inPortals = false\n\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed === 'portals:') {\n inPortals = true\n continue\n }\n if (!inPortals) continue\n\n const listItemName = line.match(/^\\s+-\\s+name:\\s+(.+)\\s*$/)\n const nestedName = line.match(/^\\s+name:\\s+(.+)\\s*$/)\n const portalId = line.match(/^\\s+portalId:\\s+(\\d+)\\s*$/)\n\n if (listItemName || (nestedName && !line.match(/^\\s+-\\s/))) {\n if (current) portals.push(current)\n const nameValue = listItemName?.[1] ?? nestedName?.[1]\n current = nameValue ? { name: stripYamlScalar(nameValue) } : null\n continue\n }\n\n if (portalId && current) {\n current.portalId = portalId[1]\n }\n }\n\n if (current) portals.push(current)\n\n return { defaultPortal, portals }\n}\n\nexport function readHubSpotPortals(projectRoot: string): HubSpotPortalsFile {\n const configPath = resolve(projectRoot, HUBSPOT_CONFIG_FILE)\n if (!existsSync(configPath)) {\n throw new WpHsError(`${HUBSPOT_CONFIG_FILE} not found in project root.`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp setup, then add your portal + PAT.',\n })\n }\n\n const raw = readFileSync(configPath, 'utf8')\n const { defaultPortal, portals } = parseHubSpotConfigPortals(raw)\n\n return { configPath, defaultPortal, portals }\n}\n\nexport function resolvePortalName(\n portals: HubSpotPortalEntry[],\n nameOrId: string,\n): HubSpotPortalEntry | null {\n const needle = nameOrId.trim()\n return (\n portals.find((p) => p.name === needle) ??\n portals.find((p) => p.portalId === needle) ??\n null\n )\n}\n","import { ExitCode, WpHsError } from '../../lib/errors.js'\nimport { ensureHubSpotConfigForCms } from '../../lib/hubspot-cli-setup.js'\nimport { runNodeScriptLongRunning } from '../../lib/exec.js'\nimport { kitPath } from '../../lib/paths.js'\nimport type { CommandContext } from '../context.js'\n\nexport type WatchOptions = {\n tier?: 'dev' | 'stg' | 'prod'\n rebuild?: boolean\n progress?: boolean\n}\n\nexport async function runWatch(ctx: CommandContext, options: WatchOptions): Promise<number> {\n // No hs subprocess here — spawnSync under Clack/spinners blocks Ctrl+C\n ensureHubSpotConfigForCms(ctx)\n\n const tier = options.tier ?? 'dev'\n const args: string[] = ['--tier', tier]\n if (options.rebuild) args.push('--rebuild')\n\n const code = await runNodeScriptLongRunning(kitPath('scripts', 'watch-hubspot.mjs'), args, {\n cwd: ctx.projectRoot,\n env: { ...process.env, WP_HS_PROJECT_ROOT: ctx.projectRoot },\n logger: ctx.logger,\n dryRun: ctx.global.dryRun,\n })\n\n if (code === 130 || code === 143) {\n return code\n }\n\n if (code !== ExitCode.SUCCESS) {\n throw new WpHsError(`Watch exited with code ${code}`, {\n exitCode: ExitCode.BUILD_FAILED,\n remediation:\n 'Run wp build once, then wp watch. For src/ changes use wp watch --rebuild. Check hubspot.config.yml and hs cms watch output.',\n })\n }\n\n return ExitCode.SUCCESS\n}\n","import { createProgram } from './program.js'\n\nconst program = createProgram()\nprogram.parse(process.argv)\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,gBAAAA,sBAAoB;AAC7B,SAAS,WAAAC,iBAAe;AACxB,SAAS,eAAe;;;ACFxB,SAAS,gBAAAC,qBAAoB;;;ACA7B,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAGjB,IAAM,uBAAuB;AAG7B,IAAM,6BAA6B;AAO1C,SAAS,cAAc,aAAoC;AACzD,QAAM,UAAU,QAAQ,IAAI,iBAAiB,KAAK,KAAK,QAAQ,IAAI,cAAc,KAAK,KAAK;AAC3F,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,aAAa,OAAO;AACrC;AAEO,SAAS,iBAAiB,aAA6B;AAC5D,SAAO,QAAQ,aAAa,0BAA0B;AACxD;AAEO,SAAS,mBAAmB,aAA6B;AAC9D,SAAO,QAAQ,aAAa,oBAAoB;AAClD;AAGO,SAAS,qBAAqB,aAAyD;AAC5F,QAAM,cAAc,WAAW,mBAAmB,WAAW,CAAC;AAC9D,QAAM,YAAY,WAAW,iBAAiB,WAAW,CAAC;AAC1D,MAAI,aAAa,YAAa,QAAO;AACrC,MAAI,aAAa,CAAC,YAAa,QAAO;AACtC,SAAO;AACT;AAKO,SAAS,qBAAqB,aAAmD;AACtF,QAAM,UAAU,cAAc,WAAW;AACzC,MAAI,SAAS;AACX,QAAI,CAAC,WAAW,OAAO,EAAG,QAAO;AACjC,WAAO,EAAE,MAAM,SAAS,UAAU,qBAAqB;AAAA,EACzD;AAEA,QAAM,OAAO,mBAAmB,WAAW;AAC3C,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO,EAAE,MAAM,UAAU,qBAAqB;AAAA,EAChD;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAO,QAAQ,IAAI,GAAkB;AACnE,MAAI,QAAQ,IAAI,oBAAoB,KAAK,GAAG;AAC1C,WAAO,QAAQ,QAAQ,IAAI,mBAAmB,KAAK,CAAC;AAAA,EACtD;AAEA,MAAI,MAAM,QAAQ,IAAI;AACtB,SAAO,MAAM;AACX,QAAI,qBAAqB,GAAG,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,QAAI,WAAW,KAAK;AAClB,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;;;ACvEA,SAAS,SAAS;AAEX,IAAM,iBAAiB;AAEvB,IAAM,qBAAqB;AAE3B,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,cAAc;AAAA,EACtD,aAAa,EAAE,KAAK,CAAC,qBAAqB,mBAAmB,eAAe,CAAC;AAAA,EAC7E,QAAQ,EAAE,OAAO;AAAA,IACf,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,yBAAyB;AAAA,EACtD,CAAC;AAAA,EACD,OAAO,EACJ,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,WAAW;AAAA,IACtC,WAAW,EAAE,OAAO,EAAE,QAAQ,sBAAsB;AAAA,EACtD,CAAC,EACA,SAAS;AAAA,EACZ,KAAK,EACF,OAAO;AAAA,IACN,MAAM,EAAE,KAAK,CAAC,YAAY,UAAU,SAAS,MAAM,CAAC,EAAE,QAAQ,UAAU;AAAA,IACxE,aAAa,EAAE,OAAO,EAAE,QAAQ,kBAAkB;AAAA,IAClD,QAAQ,EAAE,OAAO,EAAE,QAAQ,iBAAiB;AAAA,EAC9C,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EACN,OAAO;AAAA,IACN,KAAK,EAAE,OAAO,EAAE,QAAQ,sBAAsB;AAAA,IAC9C,QAAQ,EAAE,OAAO,EAAE,QAAQ,yBAAyB;AAAA,IACpD,kBAAkB,EAAE,OAAO,EAAE,QAAQ,0BAA0B;AAAA;AAAA,IAE/D,QAAQ,EAAE,OAAO,EAAE,QAAQ,8BAA8B;AAAA,IACzD,UAAU,EAAE,OAAO,EAAE,QAAQ,cAAc;AAAA,EAC7C,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,KAAK,EACF,OAAO;AAAA,IACN,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,OAAO,MAAM,CAAC;AAAA,EAC/E,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,KAAK,EACF,OAAO;AAAA,IACN,iBAAiB,EAAE,QAAQ,kBAAkB,EAAE,QAAQ,kBAAkB;AAAA,IACzE,SAAS,EAAE,OAAO,EAAE,QAAQ,mBAAmB;AAAA,IAC/C,YAAY,EAAE,OAAO,EAAE,QAAQ,oBAAoB;AAAA,IACnD,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EACP,OAAO;AAAA;AAAA,IAEN,QAAQ,EAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA,EAC5D,CAAC,EACA,SAAS;AACd,CAAC;AAIM,IAAM,yBAA8C;AAAA,EACzD,eAAe;AAAA,EACf,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,OAAO,CAAC,OAAO,OAAO,MAAM;AAAA,EAC9B;AAAA,EACA,KAAK;AAAA,IACH,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,OAAO,gBAAgB,uBAAuB,OAAO,gBAAgB;AAC9E;AAEO,SAAS,eAAe,QAAsC;AACnE,SAAO,OAAO,gBAAgB;AAChC;AAEO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,OAAO,gBAAgB,uBAAuB,OAAO,IAAI,SAAS;AAC3E;;;ACtGA,SAAS,cAAAC,aAAY,oBAAoB;AACzC,SAAS,SAAS,WAAAC,gBAAe;AACjC,SAAS,qBAAqB;AAK9B,IAAM,mBAAmB;AAEzB,SAAS,iBAAyB;AAChC,MAAI,MAAM,QAAQ,cAAc,YAAY,GAAG,CAAC;AAChD,SAAO,MAAM;AACX,UAAM,UAAUC,SAAQ,KAAK,cAAc;AAC3C,QAAIC,YAAW,OAAO,GAAG;AACvB,UAAI;AACF,cAAM,MAAM,KAAK,MAAM,aAAa,SAAS,MAAM,CAAC;AACpD,YAAI,IAAI,SAAS,kBAAkB;AACjC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,KAAK;AAClB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,QAAM,IAAI,UAAU,4DAA4D;AAAA,IAC9E,UAAU,SAAS;AAAA,EACrB,CAAC;AACH;AAEA,IAAM,UAAU,eAAe;AAExB,SAAS,aAAqB;AACnC,SAAO;AACT;AAEO,SAASC,iBAAgB,OAAO,QAAQ,IAAI,GAAW;AAC5D,QAAM,WAAW,gBAAsB,IAAI;AAE3C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,UAAU,iEAAiE;AAAA,MACnF,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,WAAW,UAA4B;AACrD,SAAOF,SAAQ,SAAS,GAAG,QAAQ;AACrC;;;AHtCO,SAAS,WAAW,aAA2C;AACpE,QAAM,OAAO,eAAeG,iBAAgB;AAC5C,QAAM,WAAW,qBAAqB,IAAI;AAE1C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,UAAU,WAAW,oBAAoB,IAAI;AAAA,MACrD,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAMC,cAAa,SAAS,MAAM,MAAM,CAAC;AAAA,EACtD,SAAS,OAAO;AACd,UAAM,IAAI,UAAU,mBAAmB,SAAS,QAAQ,IAAI;AAAA,MAC1D,UAAU,SAAS;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,oBAAoB,UAAU,GAAG;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,UAAU,GAAG,SAAS,QAAQ,uBAAuB,OAAO,MAAM,OAAO,IAAI;AAAA,MACrF,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,YAAY,SAAS;AAAA,IACrB,gBAAgB,SAAS;AAAA,EAC3B;AACF;AAEO,SAAS,mBAAmB,aAIjC;AACA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,WAAW,WAAW;AACzC,WAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,OAAO;AAAA,EAC3C,SAAS,OAAO;AACd,QAAI,iBAAiB,WAAW;AAC9B,aAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,MAAM,OAAO,EAAE;AAAA,IACjD;AACA,WAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE;AAAA,EACjD;AACF;;;AIpEA,OAAO,QAAQ;AAsBf,SAAS,iBAA0B;AACjC,MAAI,QAAQ,IAAI,aAAa,OAAW,QAAO;AAC/C,MAAI,QAAQ,IAAI,OAAO,OAAQ,QAAO;AACtC,SAAO,QAAQ,OAAO,UAAU;AAClC;AAEO,SAAS,aAAa,UAAyB,CAAC,GAAW;AAChE,QAAM,WAAW,eAAe;AAChC,QAAM,EAAE,UAAU,OAAO,QAAQ,OAAO,OAAO,MAAM,IAAI;AAEzD,QAAM,QAAQ,CAAC,SAAiB;AAC9B,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAClC;AAEA,QAAM,OAAO,CAAC,OAAiB,YAAoB;AACjD,QAAI,KAAM;AACV,QAAI,SAAS,UAAU,WAAW,UAAU,OAAQ;AACpD,QAAI,UAAU,WAAW,CAAC,QAAS;AAEnC,UAAM,SACJ,UAAU,UACN,WACE,GAAG,IAAI,OAAO,IACd,UACF,UAAU,SACR,WACE,GAAG,OAAO,MAAM,IAChB,SACF,UAAU,UACR,WACE,GAAG,IAAI,OAAO,IACd,UACF,WACE,GAAG,KAAK,MAAM,IACd;AAEZ,UAAM,IAAI,MAAM,KAAK,OAAO,EAAE;AAAA,EAChC;AAEA,SAAO;AAAA,IACL,OAAO,CAAC,YAAY,KAAK,SAAS,OAAO;AAAA,IACzC,MAAM,CAAC,YAAY,KAAK,QAAQ,OAAO;AAAA,IACvC,MAAM,CAAC,YAAY,KAAK,QAAQ,OAAO;AAAA,IACvC,OAAO,CAAC,YAAY,KAAK,SAAS,OAAO;AAAA,IACzC,SAAS,CAAC,YAAY;AACpB,UAAI,QAAQ,MAAO;AACnB,YAAM,SAAS,WAAW,GAAG,MAAM,IAAI,IAAI;AAC3C,YAAM,IAAI,MAAM,KAAK,OAAO,EAAE;AAAA,IAChC;AAAA,IACA,MAAM,CAAC,YAAY;AACjB,UAAI,QAAQ,MAAO;AACnB,YAAM,SAAS,WAAW,GAAG,KAAK,QAAG,IAAI;AACzC,YAAM,GAAG,MAAM,IAAI,OAAO,EAAE;AAAA,IAC9B;AAAA,IACA,UAAU,CAAC,YAAY;AACrB,UAAI,QAAQ,MAAO;AACnB,YAAM,OAAO,WAAW,GAAG,MAAM,QAAG,IAAI;AACxC,YAAM,KAAK,IAAI,IAAI,OAAO,EAAE;AAAA,IAC9B;AAAA,IACA,MAAM,CAAC,YAAY;AACjB,UAAI,CAAC,KAAM;AACX,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI;AAAA,IACrD;AAAA,EACF;AACF;;;ACtFA,SAAS,WAAAC,gBAAe;AAMjB,SAAS,mBAAmB,aAAqB,QAAqC;AAC3F,QAAM,YAAY,OAAO,IAAI,mBAAmB;AAChD,SAAOC,SAAQ,aAAa,WAAW,SAAS,UAAU;AAC5D;;;ACTA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,MAAM,WAAAC,gBAAe;;;ACD9B,YAAY,OAAO;AACnB,OAAOC,SAAQ;AAiBR,SAAS,iBAAiB,KAA8B;AAC7D,QAAM,EAAE,MAAM,OAAO,GAAG,IAAI,IAAI;AAChC,SAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,QAAQ,OAAO,UAAU;AAC5D;AAEO,SAAS,mBACd,KACA,UACS;AACT,MAAI,aAAa,MAAO,QAAO;AAC/B,MAAI,IAAI,OAAO,QAAS,QAAO;AAC/B,SAAO,iBAAiB,GAAG;AAC7B;AAEA,SAAS,iBAAiB,KAA8B;AACtD,SAAO,IAAI,OAAO,YAAY,QAAQ,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,OAAO;AACzE;AAGA,eAAsB,uBAAsC;AAC1D,QAAM,IAAI,QAAc,CAACC,cAAY;AACnC,iBAAaA,SAAO;AAAA,EACtB,CAAC;AACD,QAAM,IAAI,QAAc,CAACA,cAAY;AACnC,eAAWA,WAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAMA,eAAsB,YACpB,KACA,OACA,UAA2B,CAAC,GACb;AACf,MAAI,CAAC,mBAAmB,KAAK,QAAQ,QAAQ,GAAG;AAC9C,UAAM,UAAU,iBAAiB,GAAG;AACpC,QAAI,WAAW,QAAQ,OAAO;AAC5B,UAAI,OAAO,KAAK,QAAQ,KAAK;AAAA,IAC/B;AACA,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS;AACX,YAAI,OAAO,KAAK,KAAK,KAAK;AAAA,MAC5B;AACA,UAAI;AACF,cAAM,KAAK,KAAK;AAChB,YAAI,SAAS;AACX,cAAI,OAAO,SAAS,KAAK,KAAK;AAAA,QAChC;AAAA,MACF,SAAS,OAAO;AACd,YAAI,SAAS;AACX,cAAI,OAAO,MAAM,KAAK,KAAK;AAAA,QAC7B;AACA,cAAM;AAAA,MACR;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB;AAAA,EACF;AAEA,QAAMC,WAAY,UAAQ;AAC1B,QAAM,aAAa,MAAM,CAAC,EAAE;AAC5B,EAAAA,SAAQ,MAAM,QAAQ,SAAS,UAAU;AACzC,QAAM,qBAAqB;AAE3B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,IAAI,GAAG;AACT,MAAAA,SAAQ,MAAM,KAAK,KAAK;AACxB,YAAM,qBAAqB;AAAA,IAC7B,WAAW,QAAQ,OAAO;AACxB,MAAAA,SAAQ,QAAQ,UAAU;AAC1B,YAAM,qBAAqB;AAAA,IAC7B;AAEA,QAAI;AACF,YAAM,KAAK,KAAK;AAChB,MAAAA,SAAQ,KAAK,KAAK,KAAK;AAAA,IACzB,SAAS,OAAO;AACd,MAAAA,SAAQ,KAAKF,IAAG,IAAI,KAAK,KAAK,CAAC;AAC/B,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAMO,SAAS,sBACd,KACA,UAAqG,CAAC,GAC7F;AACT,MAAI,IAAI,OAAO,QAAS,QAAO;AAC/B,MAAI,QAAQ,oBAAoB,QAAQ,QAAQ,cAAc,KAAM,QAAO;AAC3E,SAAO,mBAAmB,KAAK,QAAQ,QAAQ;AACjD;AAMO,SAAS,iBAAiB,KAAqB,SAAuB;AAC3E,MAAI,iBAAiB,GAAG,GAAG;AACzB,YAAQ,OAAO,MAAM,GAAGG,IAAG,MAAM,QAAG,CAAC,IAAI,OAAO;AAAA,CAAI;AACpD;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,OAAO;AAC5B;;;ACnIA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,gBAAe;AACxB,SAAS,iBAAwC;AAK1C,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAEtC,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAE/B,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUA,SAAS,QACP,MACA,UAAgD,CAAC,GACvB;AAC1B,SAAO,UAAU,MAAM,MAAM;AAAA,IAC3B,KAAK,QAAQ;AAAA,IACb,UAAU;AAAA,IACV,SAAS,QAAQ,aAAa;AAAA;AAAA,IAE9B,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AACH;AAEA,SAAS,WAAW,QAA2C;AAC7D,QAAM,MAAM,OAAO;AACnB,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,yBAAyB,aAAkD;AACzF,QAAM,aAAaC,SAAQ,aAAa,mBAAmB;AAC3D,QAAM,cAAcA,SAAQ,aAAa,sBAAsB;AAC/D,QAAM,gBAAgBC,YAAW,UAAU;AAC3C,QAAM,iBAAiBA,YAAW,WAAW;AAE7C,MAAI,uBAAuB;AAC3B,MAAI,eAAe;AACjB,UAAM,MAAMC,cAAa,YAAY,MAAM;AAC3C,2BAAuB,qBAAqB,KAAK,CAAC,YAAY,QAAQ,KAAK,GAAG,CAAC;AAAA,EACjF,OAAO;AACL,2BAAuB;AAAA,EACzB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,oBACP,aACA,UAAuC,CAAC,GAC4D;AACpG,QAAM,gBAAgB,QAAQ,kBAAkB;AAEhD,QAAM,YAAY,QAAQ,CAAC,WAAW,GAAG,EAAE,WAAW,sBAAsB,CAAC;AAC7E,QAAM,iBAAiB,UAAU,WAAW,KAAK,CAAC,WAAW,SAAS;AACtE,QAAM,eAAe,kBAAkB,UAAU,UAAU,UAAU,UAAU,IAAI,KAAK,IAAI;AAE5F,MAAI,gBAAgB;AACpB,MAAI,eAA8B;AAElC,MAAI,kBAAkB,eAAe;AACnC,UAAM,WAAW,QAAQ,CAAC,YAAY,MAAM,GAAG;AAAA,MAC7C,KAAK;AAAA,MACL,WAAW;AAAA,IACb,CAAC;AACD,UAAM,SAAS,GAAG,SAAS,UAAU,EAAE;AAAA,EAAK,SAAS,UAAU,EAAE,GAAG,KAAK;AACzE,mBAAe,WAAW,QAAQ,IAAI,cAAc,UAAU;AAC9D,oBACE,CAAC,WAAW,QAAQ,KACpB,SAAS,WAAW,KACpB,4BAA4B,KAAK,MAAM,KACvC,CAAC,eAAe,KAAK,MAAM;AAAA,EAC/B;AAEA,SAAO,EAAE,gBAAgB,cAAc,eAAe,aAAa;AACrE;AASO,SAAS,sBACd,aACA,UAAuC,CAAC,GAChB;AACxB,SAAO;AAAA,IACL,GAAG,yBAAyB,WAAW;AAAA,IACvC,GAAG,oBAAoB,aAAa,OAAO;AAAA,EAC7C;AACF;AAEO,SAAS,wBACd,aACA,aAAqC,sBAAsB,WAAW,GAC5D;AACV,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAC,WAAW,gBAAgB;AAC9B,UAAM,KAAK,4CAA4C;AAAA,EACzD;AAEA,MAAI,CAAC,WAAW,eAAe;AAC7B,QAAI,WAAW,gBAAgB;AAC7B,YAAM,KAAK,wBAAwB,sBAAsB,WAAM,mBAAmB,wBAAwB;AAAA,IAC5G,OAAO;AACL,YAAM,KAAK,UAAU,mBAAmB,kCAAkC;AAAA,IAC5E;AACA,UAAM,KAAK,+DAA+D;AAAA,EAC5E,WAAW,WAAW,sBAAsB;AAC1C,UAAM,KAAK,QAAQ,mBAAmB,4DAAuD;AAAA,EAC/F;AAEA,MAAI,WAAW,iBAAiB,CAAC,WAAW,wBAAwB,CAAC,WAAW,eAAe;AAC7F,UAAM,KAAK,6DAA6D;AAAA,EAC1E;AAEA,SAAO;AACT;AAIA,SAAS,2BAA2B,OAA8C;AAChF,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAC,MAAM,eAAe;AACxB,QAAI,MAAM,gBAAgB;AACxB,YAAM,KAAK,wBAAwB,sBAAsB,WAAM,mBAAmB,wBAAwB;AAAA,IAC5G,OAAO;AACL,YAAM,KAAK,UAAU,mBAAmB,kCAAkC;AAAA,IAC5E;AACA,UAAM,KAAK,+DAA+D;AAAA,EAC5E,WAAW,MAAM,sBAAsB;AACrC,UAAM,KAAK,QAAQ,mBAAmB,4DAAuD;AAAA,EAC/F;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,aAA6C;AACxE,SAAO,sBAAsB,aAAa,EAAE,eAAe,MAAM,CAAC;AACpE;AAEA,SAAS,oBAAoB,MAAsB,OAA2C;AAC5F,QAAM,QAAQ,2BAA2B,KAAK;AAC9C,QAAM,IAAI,UAAU,qEAAqE;AAAA,IACvF,UAAU,SAAS;AAAA,IACnB,aAAa,MAAM,KAAK,IAAI;AAAA,EAC9B,CAAC;AACH;AAKO,SAAS,0BAA0B,KAA2B;AACnE,MAAI,IAAI,OAAO,UAAU,IAAI,OAAO,KAAM;AAE1C,QAAM,QAAQ,yBAAyB,IAAI,WAAW;AACtD,MAAI,MAAM,iBAAiB,CAAC,MAAM,qBAAsB;AAExD,sBAAoB,KAAK,KAAK;AAChC;AAOO,SAAS,sBAAsB,KAAqB,MAA8B;AACvF,MAAI,IAAI,OAAO,UAAU,IAAI,OAAO,KAAM;AAE1C,MAAI,SAAS,SAAS;AACpB,UAAM,QAAQ,yBAAyB,IAAI,WAAW;AACtD,QAAI,MAAM,iBAAiB,CAAC,MAAM,sBAAsB;AACtD;AAAA,IACF;AAEA,UAAMC,SAAQ,2BAA2B,KAAK;AAC9C,QAAI,OAAO;AAAA,MACT;AAAA,IACF;AACA,eAAW,QAAQA,QAAO;AACxB,UAAI,OAAO,KAAK,YAAO,IAAI,EAAE;AAAA,IAC/B;AACA,QAAI,OAAO,KAAK,6CAAwC;AACxD,QAAI,OAAO,KAAK,mEAA8D;AAC9E;AAAA,EACF;AAEA,QAAM,aAAa,oBAAoB,IAAI,WAAW;AACtD,QAAM,aACJ,CAAC,WAAW,kBACZ,CAAC,WAAW,iBACZ,WAAW;AAEb,MAAI,CAAC,WAAY;AAEjB,QAAM,QAAQ,wBAAwB,IAAI,aAAa,UAAU;AACjE,QAAM,WAAW;AAEjB,QAAM,IAAI,UAAU,UAAU;AAAA,IAC5B,UAAU,SAAS;AAAA,IACnB,aAAa,MAAM,KAAK,IAAI;AAAA,EAC9B,CAAC;AACH;AAEO,SAAS,oBAAoB,aAMjC;AACD,QAAM,aAAa,sBAAsB,aAAa,EAAE,eAAe,KAAK,CAAC;AAC7E,QAAM,QAAQ,wBAAwB,aAAa,UAAU;AAC7D,QAAM,cAAc,MAAM,SAAS,IAAI,MAAM,KAAK,QAAK,IAAI;AAE3D,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,IAAI,WAAW;AAAA,MACf,SAAS,WAAW,iBAChB,eAAe,WAAW,gBAAgB,EAAE,GAAG,KAAK,IACpD;AAAA,MACJ,aAAa,WAAW,iBAAiB,SAAY;AAAA,MACrD,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,IAAI,WAAW,iBAAiB,CAAC,WAAW;AAAA,MAC5C,SAAS,CAAC,WAAW,gBACjB,GAAG,mBAAmB,iDACtB,WAAW,uBACT,GAAG,mBAAmB,kCACtB,GAAG,mBAAmB;AAAA,MAC5B;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,IAAI,WAAW;AAAA,MACf,SAAS,WAAW,gBAChB,+CACA,WAAW,iBAAiB,cAC1B,0EACA;AAAA,MACN,aAAa,WAAW,gBAAgB,SAAY;AAAA,MACpD,UAAU;AAAA,IACZ;AAAA,EACF;AACF;;;AClRO,IAAM,qBAA6C;AAAA,EACxD,MAAM;AAAA,EACN,wBAAwB;AAAA,EACxB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AACf;AAEO,IAAM,cAAc;AAGpB,IAAM,sBAAsB;AAG5B,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,0BAAkD;AAChE,SAAO;AAAA,IACL,CAAC,WAAW,GAAG;AAAA,IACf,GAAG;AAAA,EACL;AACF;;;AChCO,IAAM,6BAA6B,oBAAI,IAAI;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOD,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,kBAAkB,MAAe,MAAc,QAAiC;AACvF,MAAI,CAAC,cAAc,IAAI,GAAG;AACxB,WAAO,KAAK,EAAE,MAAM,SAAS,0BAA0B,CAAC;AACxD;AAAA,EACF;AAEA,QAAM,OAAO,KAAK;AAClB,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AACjD,WAAO,KAAK,EAAE,MAAM,GAAG,IAAI,SAAS,SAAS,qBAAqB,CAAC;AAAA,EACrE,WAAW,CAAC,2BAA2B,IAAI,IAAI,GAAG;AAChD,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SACE,SAAS,aACL,gGACA,IAAI,IAAI;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,KAAK;AACjB,MAAI,QAAQ,WAAW,SAAS,SAAS;AACvC,WAAO,KAAK;AAAA,MACV,MAAM,GAAG,IAAI;AAAA,MACb,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,SAAS;AACpB,UAAM,OAAO,KAAK;AAClB,QAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,WAAW,GAAG;AACxD,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,SAAS,SAAS,qBAAqB,CAAC;AAAA,IACrE;AAEA,UAAM,QAAQ,KAAK;AACnB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,UAAU,SAAS,sBAAsB,CAAC;AAAA,IACvE;AAAA,EACF,OAAO;AACL,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,aAAO,KAAK,EAAE,MAAM,GAAG,IAAI,aAAa,SAAS,wCAAwC,CAAC;AAAA,IAC5F,OAAO;AACL,eAAS,QAAQ,CAAC,OAAO,UAAU;AACjC,0BAAkB,OAAO,GAAG,IAAI,aAAa,KAAK,KAAK,MAAM;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,QAAoC;AAC5E,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,CAAC,EAAE,MAAM,KAAK,SAAS,wCAAwC,CAAC;AAAA,EACzE;AAEA,QAAM,SAA4B,CAAC;AACnC,SAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,sBAAkB,OAAO,IAAI,KAAK,KAAK,MAAM;AAAA,EAC/C,CAAC;AACD,SAAO;AACT;;;AC3GA,SAAS,cAAAC,aAAY,WAAW,gBAAAC,eAAc,qBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,YAAYC,QAAO;AAEnB,IAAM,eAAe;AACrB,IAAM,eAAe;AAEd,IAAM,wBAAwB;AAE9B,SAAS,oBAAoB,aAA6B;AAC/D,SAAOD,SAAQ,aAAa,SAAS,UAAU,qBAAqB;AACtE;AAEO,SAAS,gBAAgB,OAA+C;AAC7E,MAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,QAAM,OAAO,MACV,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,YAAY;AACxB,MAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,IAAI,EAAG,QAAO;AAC9C,SAAO;AACT;AAEO,SAAS,kBAAkB,aAAyC;AACzE,QAAM,UACJ,gBAAgB,QAAQ,IAAI,mBAAmB,KAC/C,gBAAgB,QAAQ,IAAI,mBAAmB;AACjD,MAAI,QAAS,QAAO;AAEpB,QAAM,OAAO,oBAAoB,WAAW;AAC5C,MAAI,CAACF,YAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC;AACjD,WAAO,gBAAgB,IAAI,IAAI;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,aAAqB,MAAoB;AAC1E,QAAM,aAAa,gBAAgB,IAAI;AACvC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,wFAAmF;AAAA,EACrG;AACA,QAAM,OAAO,oBAAoB,WAAW;AAC5C,YAAUC,SAAQ,MAAM,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,gBAAc,MAAM,GAAG,KAAK,UAAU,EAAE,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAC1E;AAEO,SAAS,wBAAwB,aAA8B;AACpE,SAAO,CAAC,kBAAkB,WAAW;AACvC;AAEA,eAAsB,oBAAoB,aAAkD;AAC1F,MAAI,CAAC,wBAAwB,WAAW,GAAG;AACzC,WAAO,kBAAkB,WAAW;AAAA,EACtC;AAEA,QAAM,OAAO,MAAQ,QAAK;AAAA,IACxB,SACE;AAAA,IACF,aAAa;AAAA,IACb,UAAU,CAAC,UAAU;AACnB,UAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAM,YAAS,IAAI,KAAK,OAAO,SAAS,UAAU;AAChD,WAAO;AAAA,EACT;AAEA,qBAAmB,aAAa,IAAI;AACpC,SAAO,gBAAgB,IAAI;AAC7B;;;AC9EA,SAAS,aAAAE,kBAAiB;AAqB1B,SAAS,aACP,QACA,MACA,SACQ;AACR,QAAM,SAASC,WAAU,QAAQ,UAAU,CAAC,QAAQ,WAAW,MAAM,GAAG,GAAG,IAAI,GAAG;AAAA,IAChF,KAAK,QAAQ;AAAA,IACb,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,oBAAoB,QAAQ;AAAA,IAC9B;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,SAAS,OAAO,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK;AAC5D,UAAM,IAAI,MAAM,UAAU,kBAAkB,MAAM,EAAE;AAAA,EACtD;AAEA,UAAQ,OAAO,UAAU,IAAI,KAAK;AACpC;AAEO,SAAS,wBACd,aACA,UAAwE,CAAC,GAChD;AACzB,QAAM,OAAO,CAAC,GAAI,QAAQ,OAAO,CAAC,UAAU,QAAQ,IAAI,EAAE,IAAI,CAAC,GAAI,GAAI,QAAQ,SAAS,CAAC,WAAW,IAAI,CAAC,CAAE;AAC3G,QAAM,SAAS,aAAa,4BAA4B,MAAM;AAAA,IAC5D,KAAK;AAAA,IACL,KAAK,QAAQ,OAAO,QAAQ;AAAA,IAC5B,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,SAAO,KAAK,MAAM,MAAM;AAC1B;AAEO,SAAS,+BACd,aACA,MAAyB,QAAQ,KACd;AACnB,QAAM,SAAS,aAAa,oCAAoC,CAAC,GAAG;AAAA,IAClE,KAAK;AAAA,IACL;AAAA,EACF,CAAC;AACD,SAAO,KAAK,MAAM,MAAM;AAC1B;;;ACjEA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AAGjB,SAAS,+BACd,aACA,oBACS;AACT,MAAI,mBAAmB,WAAW,EAAG,QAAO;AAC5C,MAAID,YAAWC,SAAQ,aAAa,cAAc,CAAC,EAAG,QAAO;AAC7D,MAAID,YAAWC,SAAQ,aAAa,KAAK,CAAC,EAAG,QAAO;AACpD,SAAO,mBAAmB,KAAK,CAAC,QAAQD,YAAWC,SAAQ,KAAK,aAAa,CAAC,CAAC;AACjF;;;ACZA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,WAAAC,gBAAe;AAKxB,IAAM,mBAAmB,CAAC,gBAAgB,QAAQ,OAAO,SAAS;AAsB3D,SAAS,uBAAuB,aAA8B;AACnE,SAAOC,YAAWC,SAAQ,aAAa,GAAG,gBAAgB,CAAC;AAC7D;AAMO,SAAS,wBAAwB,aAA8C;AACpF,QAAM,SAASA,SAAQ,aAAa,GAAG,gBAAgB;AACvD,MAAID,YAAW,MAAM,GAAG;AACtB,WAAO,EAAE,SAAS,QAAQ,UAAU,YAAY,CAAC,MAAM,EAAE;AAAA,EAC3D;AAEA,QAAM,SAASC,SAAQ,aAAa,gBAAgB,MAAM;AAC1D,MAAI,SAAS,MAAM,SAAS;AAC1B,UAAM,SAASA,SAAQ,QAAQ,UAAU;AACzC,QAAID,YAAW,MAAM,GAAG;AACtB,aAAO,EAAE,SAAS,QAAQ,YAAY,CAAC,EAAE;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,YAAYC,SAAQ,QAAQ,MAAM;AACxC,MAAID,YAAW,SAAS,GAAG;AACzB,WAAO,EAAE,SAAS,WAAW,YAAY,CAAC,EAAE;AAAA,EAC9C;AAEA,SAAO;AACT;;;ACxDO,IAAM,uBAAuB;AAO7B,SAAS,2BAA0C;AACxD,QAAM,CAAC,OAAO,KAAK,IAAI,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAElE,MAAI,UAAU,MAAM,SAAS,IAAI;AAC/B,WAAO,yEAAyE,oBAAoB;AAAA,EACtG;AAEA,MAAI,UAAU,MAAM,QAAQ,GAAG;AAC7B,WAAO,iFAA4E,oBAAoB;AAAA,EACzG;AAEA,SAAO;AACT;;;ATYA,SAAS,YAAyB;AAChC,QAAM,QAAQ,OAAO,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AACxD,QAAM,KAAK,SAAS;AACpB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KAAK,QAAQ,QAAQ,SAAS,IAAI,KAAK,QAAQ,QAAQ,SAAS,IAAI;AAAA,IAC7E,aAAa,KAAK,SAAY;AAAA,IAC9B,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,kBAAkB,aAAyC;AAClE,QAAM,WAAW,qBAAqB,WAAW;AACjD,MAAI,aAAa,eAAe;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,UAAU,0BAA0B,WAAM,oBAAoB;AAAA,MACvE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACA,MAAI,aAAa,aAAa;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,QAAQ,oBAAoB,QAAQ,0BAA0B;AAAA,MACvE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,KAAoC;AACvD,QAAM,SAAS,kBAAkB,IAAI,WAAW;AAChD,MAAI,QAAQ;AACV,WAAO,CAAC,MAAM;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,SAAS,WAAW,IAAI,WAAW;AACzC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS,GAAG,OAAO,cAAc;AAAA,QACjC,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ;AAAA,QACA,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAsB;AAC5C,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,SAAS,MAAO,QAAO;AAC3B,SAAO;AACT;AAEA,SAAS,iBAAiB,aAAqB,MAAc,KAAiC;AAC5F,QAAM,OAAOE,SAAQ,aAAa,IAAI;AACtC,MAAI,CAACC,YAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,UAAUC,cAAa,MAAM,MAAM;AACzC,UAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,IAAI,GAAG,UAAU,GAAG,CAAC;AAC5D,WAAO,QAAQ,CAAC,GAAG,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,KAAoC;AACzD,QAAM,SAAwB,CAAC;AAE/B,QAAM,YAAYF,SAAQ,IAAI,aAAa,YAAY;AACvD,QAAM,UAAUC,YAAW,SAAS;AACpC,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,SAAS,UAAU,uBAAuB;AAAA,IAC1C,aAAa,UAAU,SAAY;AAAA,IACnC,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,iBAAiBD,SAAQ,IAAI,aAAa,UAAU;AAC1D,MAAI,CAAC,WAAWC,YAAW,cAAc,GAAG;AAC1C,UAAM,UAAU,iBAAiB,IAAI,aAAa,YAAY,eAAe;AAC7E,UAAM,aAAa,iBAAiB,IAAI,aAAa,YAAY,eAAe,KAAK;AACrF,UAAM,iBACJ,cAAc,YAAY,WAAW,WAAW,QAAQ,YAAY;AACtE,QAAI,gBAAgB;AAClB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SACE;AAAA,QACF,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,QAAQ,IAAI,OAAO,IAAI,OAAO;AACvC,UAAM,OAAO,eAAe,IAAI;AAChC,UAAM,KAAKA,YAAWD,SAAQ,IAAI,aAAa,IAAI,CAAC;AACpD,QAAI,SAAS,OAAO;AAClB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS,KACL,qBACA;AAAA,QACJ,aAAa,KAAK,SAAY;AAAA,QAC9B,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV,MAAM,OAAO,IAAI;AAAA,MACjB;AAAA,MACA,SAAS,KAAK,GAAG,IAAI,aAAa,GAAG,IAAI;AAAA,MACzC,aAAa,KAAK,SAAY;AAAA,MAC9B,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,KAAyC;AACvE,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,gBAAgB,IAAI,MAAM,EAAG,QAAO;AACvE,QAAM,SAASA,SAAQ,IAAI,aAAa,kBAAkB;AAC1D,MAAI,CAACC,YAAW,MAAM,EAAG,QAAO;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,aAAa,KAAyC;AAC7D,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,gBAAgB,IAAI,MAAM,EAAG,QAAO;AACvE,QAAM,OAAOD,SAAQ,IAAI,aAAa,IAAI,OAAO,IAAI,WAAW;AAChE,QAAM,KAAKC,YAAW,IAAI;AAC1B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KAAK,GAAG,IAAI,OAAO,IAAI,WAAW,aAAa,GAAG,IAAI,OAAO,IAAI,WAAW;AAAA,IACrF,aAAa,KAAK,SAAY;AAAA,IAC9B,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,2BAA2B,KAAyC;AAC3E,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,gBAAgB,IAAI,MAAM,EAAG,QAAO;AACvE,MAAI;AACF,UAAM,OAAO,+BAA+B,IAAI,aAAa,QAAQ,GAAG;AACxE,UAAM,SACJ,KAAK,WAAW,UACZ,GAAG,KAAK,EAAE,YAAY,KAAK,IAAI,KAAK,KAAK,GAAG,MAC5C,GAAG,KAAK,EAAE,aAAa,KAAK,MAAM;AACxC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,8BAA8B,MAAM;AAAA,MAC7C,UAAU;AAAA,IACZ;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,4CAAuC,OAAO;AAAA,MACvD,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,aAAa,KAAyC;AAC7D,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,gBAAgB,IAAI,MAAM,EAAG,QAAO;AACvE,MAAI,QAAQ,IAAI,iBAAiB,KAAK,KAAK,QAAQ,IAAI,iBAAiB,KAAK,GAAG;AAC9E,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,kBAAkB,IAAI,WAAW;AAC9C,MAAI,MAAM;AACR,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,iBAAiB,IAAI;AAAA,MAC9B,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aACE;AAAA,IACF,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,oBAAoB,KAA8B;AACzD,QAAM,aAAa,CAACD,SAAQ,IAAI,aAAa,IAAI,OAAO,OAAO,UAAU,CAAC;AAC1E,SAAO,+BAA+B,IAAI,aAAa,UAAU;AACnE;AAEA,SAAS,oBAAoB,KAAyC;AACpE,MAAI,CAAC,oBAAoB,GAAG,EAAG,QAAO;AACtC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,mBAAmB,KAAkC;AAC5D,QAAM,OAAOA,SAAQ,IAAI,aAAa,qBAAqB;AAC3D,QAAM,KAAKC,YAAW,IAAI;AAC1B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KAAK,gCAAgC;AAAA,IAC9C,aAAa,KACT,SACA;AAAA,IACJ,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,cAAc,KAAyC;AAC9D,MAAI,eAAe,IAAI,MAAM,EAAG,QAAO;AAEvC,QAAM,OAAOD,SAAQ,IAAI,aAAa,kBAAkB;AACxD,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI;AACF,UAAM,OAAO,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC;AAClD,UAAM,kBACJ,MAAM,QAAQ,KAAK,aAAa,KAAK,KAAK,cAAc,SAAS;AACnE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,kBACL,4CACA;AAAA,MACJ,aAAa,kBACT,SACA;AAAA,MACJ,UAAU;AAAA,IACZ;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,2CAAsC,OAAO;AAAA,MACtD,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,eAAe,qBAAqB,KAAkD;AACpF,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,gBAAgB,IAAI,MAAM,EAAG,QAAO;AAEvE,QAAM,aAAaF,SAAQ,IAAI,aAAa,IAAI,OAAO,KAAK,UAAU,iBAAiB;AACvF,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,KAAK,MAAMC,cAAa,YAAY,MAAM,CAAC;AAC1D,aAAS,OAAO,QAAQ,KAAK;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,gCAAgC,MAAM,IAAI;AAAA,MAChE,SAAS,EAAE,QAAQ,8BAA8B;AAAA,IACnD,CAAC;AACD,QAAI,IAAI,WAAW,KAAK;AACtB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS,mBAAmB,MAAM;AAAA,QAClC,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,KAAK,YAAY,MAAM;AACzB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS,cAAc,MAAM;AAAA,QAC7B,aACE;AAAA,QACF,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,6BAA6B,MAAM,WAAM,OAAO;AAAA,MACzD,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,eAAeF,SAAQ,IAAI,aAAa,wBAAwB;AACtE,MAAI,CAACC,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,cAAc,MAAM;AAAA,MAC7B,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI;AACF,UAAM,WAAW,KAAK,MAAMC,cAAa,cAAc,MAAM,CAAC;AAG9D,UAAM,SAAS,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,GAAG;AAChE,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS,cAAc,MAAM;AAAA,QAC7B,UAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,OAAO,MAAM,MAAM,QAAQ,EAAE,QAAQ,OAAO,CAAC;AACnD,QAAI,CAAC,KAAK,IAAI;AACZ,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS,0CAA0C,KAAK,MAAM;AAAA,QAC9D,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,cAAc,MAAM;AAAA,MAC7B,UAAU;AAAA,IACZ;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,cAAc,MAAM;AAAA,MAC7B,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,KAAyC;AAChE,MAAI,eAAe,IAAI,MAAM,EAAG,QAAO;AAEvC,QAAM,OAAOF,SAAQ,IAAI,aAAa,oBAAoB;AAC1D,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC;AACpD,UAAM,SAAS,0BAA0B,MAAM;AAC/C,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,UAAU,OACb,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE,EAChD,KAAK,IAAI;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,0BAA0B,OAAO,MAAM,oBAAe,OAAO;AAAA,MACtE,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,6CAAwC,OAAO;AAAA,MACxD,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,aAAqB,cAAqC;AACjF,QAAM,OAAOF,SAAQ,aAAa,YAAY;AAC9C,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AACA,SAAOC,cAAa,MAAM,MAAM;AAClC;AAEA,SAAS,iBAAiB,KAAoC;AAC5D,MAAI,eAAe,IAAI,MAAM,KAAK,oBAAoB,GAAG,GAAG;AAC1D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAwB,CAAC;AAC/B,QAAM,UAAU,gBAAgB,IAAI,aAAa,6BAA6B;AAC9E,QAAM,WAAW,gBAAgB,IAAI,aAAa,8BAA8B;AAChF,QAAM,WAAW,gBAAgB,IAAI,aAAa,sBAAsB;AAExE,MAAI,SAAS;AACX,UAAM,kBAAkB,QAAQ,QAAQ,qBAAqB,EAAE,EAAE,QAAQ,iBAAiB,EAAE;AAC5F,UAAM,YAAY,yDAAyD;AAAA,MACzE;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI,CAAC;AAAA,MACL,SAAS,YACL,mFACA;AAAA,MACJ,aAAa,YACT,uFACA;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,MAAI,UAAU;AACZ,UAAM,kBAAkB,SAAS,QAAQ,qBAAqB,EAAE,EAAE,QAAQ,iBAAiB,EAAE;AAC7F,UAAM,YAAY,yDAAyD;AAAA,MACzE;AAAA,IACF;AACA,UAAM,YAAY,6BAA6B,KAAK,QAAQ;AAC5D,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,YACL,gDACA;AAAA,MACJ,aAAa,YAAY,SAAY;AAAA,MACrC,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,YACL,sDACA;AAAA,MACJ,aAAa,YACT,SACA;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB,IAAI,MAAM,KAAK,UAAU;AAC3C,UAAM,kBACJ,4BAA4B,KAAK,QAAQ,KACzC,sDAAsD,KAAK,QAAQ;AACrE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,kBACL,8DACA;AAAA,MACJ,aAAa,kBACT,SACA;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,gBAAgB,IAAI,aAAa,oBAAoB;AACxE,MAAI,cAAc,gBAAgB,IAAI,MAAM,GAAG;AAC7C,UAAM,iBACJ,uCAAuC,KAAK,UAAU,KACtD,uCAAuC,KAAK,UAAU;AACxD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI,CAAC;AAAA,MACL,SAAS,iBACL,mFACA;AAAA,MACJ,aAAa,iBACT,8EACA;AAAA,MACJ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,IAAI,OAAO,QAAQ;AACxC,MAAI,gBAAgB,gBAAgB,IAAI,MAAM,GAAG;AAC/C,UAAM,gBAAgBF,SAAQ,IAAI,aAAa,cAAc,YAAY;AACzE,QAAIC,YAAW,aAAa,GAAG;AAC7B,YAAM,MAAMC,cAAa,eAAe,MAAM;AAC9C,YAAM,iBAAiB,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAC5D,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,SAAS,iBACL,GAAG,YAAY,+CACf,GAAG,YAAY;AAAA,QACnB,aAAa,iBAAiB,SAAY;AAAA,QAC1C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,KAAyC;AACtE,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,gBAAgB,IAAI,MAAM,EAAG,QAAO;AAEvE,QAAM,OAAOF,SAAQ,IAAI,aAAa,oBAAoB;AAC1D,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,OAAOC,cAAa,MAAM,MAAM;AACtC,QAAM,QAAQ,CAAC,uBAAuB,cAAc,eAAe,UAAU;AAC7E,QAAM,UAAU,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,SAAS,KAAK,CAAC;AAC7D,QAAM,0BAA0B,iEAAiE;AAAA,IAC/F;AAAA,EACF;AACA,QAAM,KAAK,QAAQ,WAAW,KAAK,CAAC;AAEpC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KACL,6DACA,0BACE,wEACA,kDAAkD,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC1E,aAAa,KACT,SACA,0BACE,qIACA;AAAA,IACN,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,oBAAoB,KAAoC;AAC/D,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,gBAAgB,IAAI,MAAM,EAAG,QAAO,CAAC;AAExE,SAAO,CAAC,8BAA8B,yBAAyB,EAAE,IAAI,CAAC,SAAS;AAC7E,UAAM,OAAOF,SAAQ,IAAI,aAAa,IAAI;AAC1C,UAAM,KAAKC,YAAW,IAAI;AAC1B,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ,OAAO,GAAG;AAAA,MAC7B;AAAA,MACA,SAAS,KAAK,GAAG,IAAI,aAAa,GAAG,IAAI;AAAA,MACzC,aAAa,KACT,SACA,OAAO,IAAI,kDAAkD,IAAI;AAAA,MACrE,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,KAAoC;AACzD,QAAM,SAAwB,CAAC;AAC/B,QAAM,YAAYD,SAAQ,IAAI,aAAa,YAAY;AACvD,QAAM,WAAWC,YAAW,SAAS;AACrC,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,SAAS,WAAW,uBAAuB;AAAA,IAC3C,aAAa,WAAW,SAAY;AAAA,IACpC,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,WAAWD,SAAQ,IAAI,aAAa,IAAI,OAAO,QAAQ,QAAQ;AACrE,QAAM,WAAWC,YAAW,QAAQ;AACpC,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,SAAS,WAAW,GAAG,IAAI,OAAO,QAAQ,QAAQ,aAAa,GAAG,IAAI,OAAO,QAAQ,QAAQ;AAAA,IAC7F,aAAa,WACT,SACA;AAAA,IACJ,UAAU;AAAA,EACZ,CAAC;AAED,MAAI,UAAU;AACZ,QAAI;AACF,YAAM,SAASC,cAAa,UAAU,MAAM;AAC5C,YAAM,uBACJ,OAAO,SAAS,mDAAmD,KACnE,OAAO,SAAS,wCAAwC;AAC1D,YAAM,eACJ,OAAO,SAAS,iCAAiC,KACjD,OAAO,SAAS,sBAAsB,KACtC,OAAO,SAAS,4BAA4B,KAC5C,OAAO,SAAS,iBAAiB;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,CAAC,wBAAwB;AAAA,QAC7B,SAAS,uBACL,GAAG,IAAI,OAAO,QAAQ,QAAQ,sEAC9B;AAAA,QACJ,aAAa,uBACT,6GACA;AAAA,QACJ,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAA+B;AACtC,QAAM,SAAS,QAAQ,WAAW,eAAe;AACjD,QAAM,KAAKD,YAAW,MAAM;AAC5B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KAAK,+CAA+C;AAAA,IAC7D,aAAa,KAAK,SAAY;AAAA,IAC9B,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,mBAAmB,KAAoC;AAC9D,QAAM,YAAY,IAAI,OAAO,IAAI;AACjC,QAAM,SAAwB,CAAC;AAE/B,aAAW,UAAU,CAAC,QAAQ,cAAc,GAAG;AAC7C,UAAM,aAAaD,SAAQ,IAAI,aAAa,MAAM;AAClD,QAAIC,YAAW,UAAU,GAAG;AAC1B,aAAO,KAAK;AAAA,QACV,MAAM,UAAU,MAAM;AAAA,QACtB,IAAI;AAAA,QACJ,SAAS,oBAAoB,MAAM;AAAA,QACnC,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAIA,YAAWD,SAAQ,IAAI,aAAa,iBAAiB,CAAC,GAAG;AAC3D,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,MAAI,cAAc,oBAAoB;AACpC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,gCAAgC,kBAAkB,WAAW,SAAS;AAAA,MAC/E,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,WAAWA,SAAQ,IAAI,aAAa,SAAS;AACnD,QAAM,WAAW,CAAC,UAAU,mBAAmB,YAAY,SAAS,kBAAkB,OAAO;AAC7F,aAAW,OAAO,UAAU;AAC1B,UAAM,KAAKC,YAAW,KAAK,UAAU,GAAG,CAAC;AACzC,WAAO,KAAK;AAAA,MACV,MAAM,QAAQ,IAAI,QAAQ,OAAO,GAAG,CAAC;AAAA,MACrC;AAAA,MACA,SAAS,KAAK,SAAS,GAAG,cAAc,SAAS,GAAG;AAAA,MACpD,aAAa,KAAK,SAAY;AAAA,MAC9B,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,KAAyC;AAC7D,MAAI,eAAe,IAAI,MAAM,EAAG,QAAO;AACvC,QAAM,cAAcD,SAAQ,IAAI,aAAa,IAAI,OAAO,IAAI,OAAO;AACnE,QAAM,KAAKC,YAAW,WAAW;AACjC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KAAK,GAAG,IAAI,OAAO,IAAI,OAAO,aAAa,GAAG,IAAI,OAAO,IAAI,OAAO;AAAA,IAC7E,aAAa,KAAK,SAAY;AAAA,IAC9B,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,wBAAwB,KAAoC;AACnE,MAAI,eAAe,IAAI,MAAM,EAAG,QAAO,CAAC;AAExC,QAAM,UAAUD,SAAQ,IAAI,aAAa,cAAc;AACvD,MAAI,CAACC,YAAW,OAAO,EAAG,QAAO,CAAC;AAElC,MAAI,OAA+B,CAAC;AACpC,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,cAAa,SAAS,MAAM,CAAC;AAIpD,WAAO,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAAA,EACvD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,sBAAsB,IAAI,CAAC,SAAS;AACzC,UAAM,KAAK,QAAQ,KAAK,IAAI,CAAC;AAC7B,WAAO;AAAA,MACL,MAAM,iBAAiB,KAAK,QAAQ,SAAS,GAAG,CAAC;AAAA,MACjD;AAAA,MACA,SAAS,KAAK,GAAG,IAAI,eAAe,GAAG,IAAI;AAAA,MAC3C,aAAa,KACT,SACA;AAAA,MACJ,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAEA,SAAS,yBAAsC;AAC7C,QAAM,UAAU,yBAAyB;AACzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,CAAC;AAAA,IACL,SAAS,WAAW,QAAQ,QAAQ,SAAS,IAAI;AAAA,IACjD,aAAa,WAAW;AAAA,IACxB,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,mBAAmB,KAAyC;AACnE,MAAI,eAAe,IAAI,MAAM,KAAK,CAACD,YAAWD,SAAQ,IAAI,aAAa,qBAAqB,CAAC,GAAG;AAC9F,WAAO;AAAA,EACT;AACA,QAAM,KAAK,uBAAuB,IAAI,WAAW;AACjD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,KAAK,mBAAmB;AAAA,IACjC,aAAa,KACT,SACA;AAAA,IACJ,UAAU;AAAA,EACZ;AACF;AAEA,eAAe,mBAAmB,KAA6C;AAC7E,QAAM,SAAwB,CAAC;AAE/B,QAAM,YAAY,KAAK;AAAA,IACrB;AAAA,MACE,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,YAAI,IAAI,OAAO,OAAQ;AACvB,YAAI;AACF,wBAAc,QAAQ,WAAW,2BAA2B,GAAG,CAAC,GAAG;AAAA,YACjE,KAAK,IAAI;AAAA,YACT,QAAQ,IAAI;AAAA,YACZ,QAAQ;AAAA,UACV,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,eAAO,KAAK,UAAU,GAAG,uBAAuB,GAAG,gBAAgB,CAAC;AACpE,cAAM,iBAAiB,oBAAoB,GAAG;AAC9C,YAAI,gBAAgB;AAClB,iBAAO,KAAK,cAAc;AAAA,QAC5B,OAAO;AACL,iBAAO,KAAK,mBAAmB,GAAG,GAAG,GAAG,oBAAoB,GAAG,GAAG,GAAG,cAAc,GAAG,CAAC;AACvF,iBAAO,KAAK,GAAG,iBAAiB,GAAG,CAAC;AACpC,gBAAM,aAAa,sBAAsB,GAAG;AAC5C,cAAI,WAAY,QAAO,KAAK,UAAU;AACtC,gBAAM,YAAY,mBAAmB,GAAG;AACxC,cAAI,UAAW,QAAO,KAAK,SAAS;AACpC,iBAAO,KAAK,GAAG,wBAAwB,GAAG,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,eAAO,KAAK,GAAG,YAAY,GAAG,GAAG,GAAG,mBAAmB,GAAG,CAAC;AAC3D,cAAM,cAAc,gBAAgB,GAAG;AACvC,YAAI,YAAa,QAAO,KAAK,WAAW;AACxC,cAAM,YAAY,cAAc,GAAG;AACnC,YAAI,UAAW,QAAO,KAAK,SAAS;AACpC,cAAM,eAAe,aAAa,GAAG;AACrC,YAAI,aAAc,QAAO,KAAK,YAAY;AAAA,MAC5C;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,eAAO,KAAK,GAAG,oBAAoB,IAAI,WAAW,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,cAAM,gBAAgB,uBAAuB,GAAG;AAChD,YAAI,cAAe,QAAO,KAAK,aAAa;AAC5C,cAAM,eAAe,aAAa,GAAG;AACrC,YAAI,aAAc,QAAO,KAAK,YAAY;AAC1C,cAAM,kBAAkB,2BAA2B,GAAG;AACtD,YAAI,gBAAiB,QAAO,KAAK,eAAe;AAChD,cAAM,eAAe,aAAa,GAAG;AACrC,YAAI,aAAc,QAAO,KAAK,YAAY;AAC1C,eAAO,KAAK,GAAG,cAAc,GAAG,CAAC;AACjC,cAAM,iBAAiB,MAAM,qBAAqB,GAAG;AACrD,YAAI,eAAgB,QAAO,KAAK,cAAc;AAAA,MAChD;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,OAAO,OAAO,CAAC,MAAwB,MAAM,IAAI;AAC1D;AAEA,SAAS,mBAAmB,KAAqB,QAA6B;AAC5E,MAAI,IAAI,OAAO,KAAM;AAErB,QAAM,cAAc,iBAAiB,GAAG;AACxC,QAAM,UAAU,IAAI,OAAO;AAC3B,QAAM,cAAc,CAAC,eAAe;AAEpC,MAAI,aAAa;AACf,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAEA,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,MAAM,CAAC,YAAa;AAE9B,QAAI,MAAM,IAAI;AACZ,UAAI,OAAO,QAAQ,MAAM,OAAO;AAAA,IAClC,WAAW,MAAM,aAAa,QAAQ;AACpC,UAAI,OAAO,KAAK,MAAM,OAAO;AAC7B,UAAI,MAAM,YAAa,KAAI,OAAO,KAAK,YAAO,MAAM,WAAW,EAAE;AAAA,IACnE,OAAO;AACL,UAAI,OAAO,MAAM,MAAM,OAAO;AAC9B,UAAI,MAAM,YAAa,KAAI,OAAO,KAAK,YAAO,MAAM,WAAW,EAAE;AAAA,IACnE;AAAA,EACF;AACF;AAEA,eAAsB,UAAU,KAAsC;AACpE,QAAM,SAAS,MAAM,mBAAmB,GAAG;AAE3C,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,aAAa,OAAO;AAChF,QAAM,WAAW,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,MAAM;AAEpE,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK;AAAA,MACd,SAAS;AAAA,MACT,IAAI,OAAO,WAAW;AAAA,MACtB,UAAU,SAAS;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,uBAAmB,KAAK,MAAM;AAE9B,QAAI,CAAC,IAAI,OAAO,SAAS,OAAO,WAAW,GAAG;AAC5C,YAAM,UACJ,SAAS,SAAS,IACd,GAAG,OAAO,MAAM,uBAAoB,SAAS,MAAM,gBACnD,GAAG,OAAO,MAAM;AACtB,uBAAiB,KAAK,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,UAAU,GAAG,OAAO,MAAM,2BAA2B;AAAA,MAC7D,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,SAAS,KAAK,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,OAAO,MAAM;AAChE,QAAI,OAAO;AAAA,MACT,GAAG,SAAS,MAAM;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,SAAS;AAClB;;;AUr+BA,eAAsB,kBAAkB,KAAsC;AAC5E,QAAM,SAAS,mBAAmB,IAAI,WAAW;AAEjD,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK;AAAA,MACd,SAAS;AAAA,MACT,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH,WAAW,OAAO,OAAO;AACvB,QAAI,OAAO,QAAQ,GAAG,oBAAoB,WAAW;AAAA,EACvD,OAAO;AACL,eAAW,OAAO,OAAO,QAAQ;AAC/B,UAAI,OAAO,MAAM,GAAG;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,OAAO,QAAQ,SAAS,UAAU,SAAS;AACpD;;;ACxBA,SAAS,WAAAG,iBAAe;;;ACAxB,OAAOC,SAAQ;;;ACAf,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,WAAAC,gBAAe;AAIxB,IAAI,gBAA+B;AAE5B,SAAS,iBAAyB;AACvC,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,cAAaC,SAAQ,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC;AAGlF,oBAAgB,IAAI,WAAW;AAAA,EACjC,QAAQ;AACN,oBAAgB;AAAA,EAClB;AAEA,SAAO;AACT;;;ADbO,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnC,QAAQ;AAEV,IAAM,OAAO;AAEN,SAAS,qBAAqB,QAAmC;AACtE,MAAI,OAAO,QAAQ,OAAO,SAAS,OAAO,MAAM,OAAO,QAAQ;AAC7D,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,OAAO,UAAU;AAClC;AAEA,SAAS,cAAuB;AAC9B,MAAI,QAAQ,IAAI,aAAa,OAAW,QAAO;AAC/C,MAAI,QAAQ,IAAI,OAAO,OAAQ,QAAO;AACtC,SAAO,QAAQ,OAAO,UAAU;AAClC;AAEO,SAAS,mBAAmB,QAAqC;AACtE,MAAI,eAAe,MAAM,GAAG;AAC1B,WAAO,GAAG,OAAO,OAAO,QAAQ,OAAO;AAAA,EACzC;AAEA,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,aACJ,UAAU,WAAW,SAAS,gBAAa,MAAM,KAAK;AAExD,SAAO,GAAG,OAAO,OAAO,IAAI,SAAM,OAAO,WAAW,GAAG,UAAU;AACnE;AASA,SAAS,QAAQ,OAAgB,OAAe,MAAsB;AACpE,QAAM,OAAO,CAACC,UAAkB,QAAQC,IAAG,KAAKD,KAAI,IAAIA;AACxD,SAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAAK,IAAI;AAClC;AAGO,SAAS,uBAAuB,SAAiC;AACtE,MAAI,CAAC,qBAAqB,QAAQ,MAAM,GAAG;AACzC;AAAA,EACF;AAEA,QAAM,QAAQ,YAAY;AAC1B,QAAM,OAAO,CAACA,UAAkB,QAAQC,IAAG,KAAKD,KAAI,IAAIA;AACxD,QAAM,MAAM,CAACA,UAAkB,QAAQC,IAAG,IAAID,KAAI,IAAIA;AACtD,QAAM,OAAO,CAACA,UAAkB,QAAQC,IAAG,KAAKD,KAAI,IAAIA;AACxD,QAAM,SAAS,CAACA,UAAkB,QAAQC,IAAG,OAAOD,KAAI,IAAIA;AAE5D,QAAM,UAAU,QAAQ,WAAW,eAAe;AAClD,QAAM,UAAU,mBAAmB,QAAQ,MAAM;AACjD,QAAM,UAAU,eAAe,QAAQ,MAAM;AAC7C,QAAM,WAAW,oBAAoB,QAAQ,IAAI;AACjD,QAAM,WAAW;AAEjB,QAAM,SAAS;AAAA,IACb,QACI,sBAAsB,MAAM,IAAI,EAC7B,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC,EAC9B,KAAK,IAAI,IACZ;AAAA,IACJ,KAAK,KAAK,aAAa,CAAC,GAAG,IAAI,MAAM,OAAO,EAAE,CAAC,KAAK,OAAO,UAAO,CAAC;AAAA,EACrE,EAAE,KAAK,IAAI;AAEX,QAAM,aAAa,UACf,oDACA;AAEJ,QAAM,cAAc,UAChB;AAAA;AAAA,iDAGA;AAAA;AAAA;AAAA;AAKJ,QAAM,OAAO;AAAA,IACX,IAAI,IAAI;AAAA,IACR,QAAQ,OAAO,UAAU,UAAU,UAAU,EAAE;AAAA,IAC/C;AAAA,IACA,QAAQ,OAAO,WAAW,SAAS,OAAO,EAAE;AAAA,IAC5C;AAAA,IACA,QAAQ,OAAO,WAAW,SAAS,QAAQ,KAAK,QAAQ,IAAI,QAAQ,EAAE;AAAA,IACtE;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,uBAAuB,UAAU,UAAU,QAAQ,YAAY,IAAI,qBAAW,CAAC;AAAA,IACjF;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,QAAQ,CAAC,WAAQ,QAAQ,OAAO,IAAI,UAAU;AAAA,IAC5D;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,gBAAgB;AAAA,EAAK,WAAW,EAAE;AAAA,IACjD;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,0BAAuB,QAAQ;AAAA,IACtD;AAAA,IACA,IAAI,IAAI;AAAA,EACV,EAAE,KAAK,IAAI;AAEX,UAAQ,OAAO,MAAM;AAAA,EAAK,MAAM;AAAA;AAAA,EAAO,IAAI;AAAA;AAAA,CAAM;AACjD,UAAQ,OAAO,MAAM,GAAG,IAAI,yBAAoB,CAAC;AAAA;AAAA,CAAM;AACzD;;;AE9HO,IAAM,qBAAgC;AAEtC,SAAS,eAAe,OAAsC;AACnE,MAAI,UAAU,SAAS,UAAU,SAAS,UAAU,OAAQ,QAAO;AACnE,SAAO;AACT;;;AH6BA,SAAS,mBAAmB,MAA2B;AACrD,MAAI,SAAS,MAAO,QAAO,CAAC,OAAO;AACnC,MAAI,SAAS,MAAO,QAAO,CAAC,OAAO;AACnC,SAAO,CAAC,QAAQ;AAClB;AAEA,SAAS,WACP,KACA,SACA,KACW;AACX,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,UAAU,eAAe,IAAI,MAAM;AACzC,QAAM,SAAS,gBAAgB,IAAI,MAAM,KAAK,CAAC;AAC/C,QAAM,QAAmB,CAAC;AAE1B,MAAI,WAAW,CAAC,QAAQ,SAAS;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,OAAO,gBAAgB,qBAAqB,CAAC,QAAQ,SAAS;AACpE,UAAM,KAAK;AAAA,MACT,OAAO,6BAA6B,IAAI;AAAA,MACxC,MAAM,YAAY;AAChB,cAAM,IAAI,sBAAsB;AAAA,UAC9BE,UAAQ,IAAI,aAAa,0BAA0B;AAAA,UACnD,GAAG,mBAAmB,IAAI;AAAA,QAC5B,CAAC;AACD,cAAM,IAAI,kCAAkC;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,eAAe,QAAQ;AAClC,UAAM,KAAK;AAAA,MACT,OAAO,iBAAiB,IAAI;AAAA,MAC5B,MAAM,YAAY;AAChB,YAAI,QAAQ,QAAQ;AAClB,gBAAM,IAAI,sBAAsB;AAAA,YAC9BA,UAAQ,IAAI,aAAa,yBAAyB;AAAA,YAClD,GAAG,mBAAmB,IAAI;AAAA,UAC5B,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,IAAI,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,QACrD;AACA,cAAM,IAAI,2BAA2B;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,KAAK;AAAA,MACT,OAAO,4BAA4B,IAAI;AAAA,MACvC,MAAM,YAAY;AAChB,cAAM,IAAI,sBAAsB;AAAA,UAC9BA,UAAQ,IAAI,aAAa,yBAAyB;AAAA,UAClD,GAAG,mBAAmB,IAAI;AAAA,QAC5B,CAAC;AACD,cAAM,IAAI,kCAAkC;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,aAAa;AAC5C,UAAM,KAAK;AAAA,MACT,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,cAAM,IAAI,+BAA+B;AACzC,cAAM,IAAI,2BAA2B;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,eACP,KACA,MACA,SACoB;AACpB,QAAM,UAAU,eAAe,IAAI,MAAM;AACzC,QAAM,SAAS,gBAAgB,IAAI,MAAM,KAAK,CAAC;AAC/C,QAAM,QAAkB,CAAC;AACzB,MAAI,CAAC,QAAQ,eAAe,OAAQ,OAAM,KAAK,KAAK;AACpD,MAAI,CAAC,QAAQ,QAAS,OAAM,KAAK,gBAAgB;AACjD,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,eAAe,CAAC,QAAS,OAAM,KAAK,eAAe;AACpF,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,GAAG,mBAAmB,IAAI,MAAM,CAAC,SAAM,MAAM,KAAK,KAAK,CAAC,KAAK,IAAI;AAC1E;AAEA,eAAe,uBACb,KACA,MACA,SACA,KAC4B;AAC5B,QAAM,SAAS,gBAAgB,IAAI,MAAM,KAAK,CAAC,eAAe,IAAI,MAAM;AACxE,QAAM,aACJ,UACA,CAAC,QAAQ,eACT,CAAC,IAAI,OAAO,UACZ,CAAC,QAAQ,iBACT,CAAC,IAAI,iBAAiB,KAAK,KAC3B,CAAC,IAAI,iBAAiB,KAAK,KAC3B,CAAC,IAAI,iBAAiB,KAAK;AAE7B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,wBAAwB,IAAI,aAAa;AAAA,IACtD;AAAA,IACA,QAAQ,IAAI,OAAO;AAAA,IACnB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,OAAO,QAAQ,OAAO,QAAQ;AAC1D,QAAI,OAAO,KAAK,0BAAqB,OAAO,EAAE,EAAE;AAAA,EAClD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB,OAAO;AAAA,IACxB,iBAAiB,OAAO;AAAA,EAC1B;AACF;AAEA,eAAsB,SAAS,KAAqB,SAAwC;AAC1F,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,kBAAkB,sBAAsB,KAAK,OAAO;AAC1D,MAAI,MAAyB;AAAA,IAC3B,GAAI,QAAQ,OAAO,QAAQ;AAAA,IAC3B,oBAAoB,IAAI;AAAA,IACxB,GAAI,kBAAkB,EAAE,mBAAmB,IAAI,IAAI,CAAC;AAAA,EACtD;AACA,QAAM,MAAM,uBAAuB,KAAK,MAAM,SAAS,GAAG;AAC1D,QAAM,UAAU,eAAe,IAAI,MAAM;AAEzC,QAAM,WAAW;AAAA,IACf,KAAK,IAAI;AAAA,IACT,aAAa,IAAI;AAAA,IACjB;AAAA,IACA,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,OAAO;AAAA,IACnB,cAAc,IAAI,OAAO;AAAA,EAC3B;AAEA,QAAM,MAAM,CAAC,QAAgB,OAAiB,CAAC,MAAM;AACnD,WAAO,mBAAmB,QAAQ,WAAW,MAAM,GAAG,MAAM,QAAQ;AAAA,EACtE;AAEA,MAAI;AACF,QAAI,WAAW,CAAC,QAAQ,SAAS;AAC/B,UAAI,IAAI,OAAO,MAAM;AACnB,YAAI,OAAO,KAAK,EAAE,SAAS,SAAS,MAAM,IAAI,MAAM,aAAa,IAAI,OAAO,YAAY,CAAC;AAAA,MAC3F,WAAW,CAAC,QAAQ,UAAU;AAC5B,YAAI,OAAO,KAAK,oFAA+E;AAC/F,yBAAiB,KAAK,8BAA8B;AAAA,MACtD,OAAO;AACL,cAAM;AAAA,UACJ;AAAA,UACA,CAAC,EAAE,OAAO,mCAAmC,MAAM,YAAY;AAAA,UAAC,EAAE,CAAC;AAAA,UACnE;AAAA,QACF;AACA,yBAAiB,KAAK,8BAA8B;AAAA,MACtD;AACA,aAAO,SAAS;AAAA,IAClB;AAEA,UAAM,QAAQ,WAAW,KAAK,SAAS,GAAG;AAC1C,UAAM,YAAY,KAAK,OAAO;AAAA,MAC5B,GAAG;AAAA,MACH,OAAO,eAAe,KAAK,MAAM,OAAO;AAAA,IAC1C,CAAC;AAED,QAAI,IAAI,OAAO,MAAM;AACnB,UAAI,OAAO,KAAK;AAAA,QACd,SAAS;AAAA,QACT;AAAA,QACA,IAAI;AAAA,QACJ,QAAQA,UAAQ,IAAI,aAAa,IAAI,OAAO,OAAO,MAAM;AAAA,MAC3D,CAAC;AAAA,IACH,WAAW,CAAC,QAAQ,OAAO;AACzB,uBAAiB,KAAK,gBAAgB;AAAA,IACxC;AAEA,WAAO,SAAS;AAAA,EAClB,SAAS,OAAO;AACd,UAAM,IAAI,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;AAAA,MAC1E,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;AI1NA,eAAsB,OAAO,KAAqB,SAAsC;AACtF,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,cAAc,yBAAyB;AAC7C,MAAI,aAAa;AACf,QAAI,OAAO,KAAK,WAAW;AAAA,EAC7B;AACA,QAAM,MAAM;AAAA,IACV,GAAG,QAAQ;AAAA,IACX,oBAAoB,IAAI;AAAA,IACxB,gBAAgB,OAAO,IAAI;AAAA,EAC7B;AAEA,MAAI,IAAI,OAAO,QAAQ;AACrB,QAAI,OAAO,KAAK,kBAAkB,QAAQ,WAAW,aAAa,CAAC,UAAU,IAAI,GAAG;AACpF,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,CAAC,wBAAwB,IAAI,WAAW,GAAG;AAC7C,UAAM,IAAI,UAAU,0CAA0C;AAAA,MAC5D,UAAU,SAAS;AAAA,MACnB,aACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,yBAAuB;AAAA,IACrB,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA,QAAQ,IAAI;AAAA,EACd,CAAC;AAED,eAAa,MAAM,sBAAsB,KAAK,OAAO,CAAC;AAEtD,SAAO,yBAAyB,QAAQ,WAAW,aAAa,GAAG,CAAC,GAAG;AAAA,IACrE,KAAK,IAAI;AAAA,IACT;AAAA,IACA,QAAQ,IAAI;AAAA,IACZ,QAAQ;AAAA,IACR,aAAa,IAAI;AAAA,EACnB,CAAC;AACH;;;ACrDA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxD,SAAS,WAAAC,iBAAe;AAGjB,IAAM,iBAAiB;AAE9B,IAAM,sBAAsB,CAAC,QAAQ,UAAU,kBAAkB,cAAc;AAExE,SAAS,aAAa,SAAyC;AACpE,QAAM,SAAiC,CAAC;AACxC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAM,KAAK,QAAQ,QAAQ,GAAG;AAC9B,QAAI,MAAM,EAAG;AACb,UAAM,MAAM,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK;AACtC,QAAI,QAAQ,QAAQ,MAAM,KAAK,CAAC,EAAE,KAAK;AACvC,QACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,aAAa,aAA6C;AACxE,QAAM,OAAOA,UAAQ,aAAa,cAAc;AAChD,MAAI,CAACH,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,SAAO,aAAaC,cAAa,MAAM,MAAM,CAAC;AAChD;AAEO,SAAS,eAAe,SAAyC;AACtE,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAC9C,YAAM,KAAK,GAAG,GAAG,KAAK,MAAM,QAAQ,MAAM,KAAK,CAAC,GAAG;AAAA,IACrD,OAAO;AACL,YAAM,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,IAC9B;AAAA,EACF;AACA,SAAO,GAAG,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC;AAAA;AACtC;AAEO,SAAS,cAAc,aAAqB,SAAuC;AACxF,QAAM,OAAOE,UAAQ,aAAa,cAAc;AAChD,QAAM,WAAWH,YAAW,IAAI,IAAI,aAAaC,cAAa,MAAM,MAAM,CAAC,IAAI,CAAC;AAChF,EAAAC,eAAc,MAAM,eAAe,EAAE,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC;AACjE;AAEO,SAAS,gBACd,aACA,OAA0B,QAAQ,KACf;AACnB,QAAM,QAAQ,aAAa,WAAW;AACtC,QAAM,SAAS,EAAE,GAAG,KAAK;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,OAAO,GAAG,KAAK,QAAQ,OAAO,GAAG,MAAM,IAAI;AAC7C,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,aAA2B;AACjE,QAAM,gBAAgBC,UAAQ,aAAa,YAAY;AACvD,QAAM,WAAWH,YAAW,aAAa,IAAIC,cAAa,eAAe,MAAM,IAAI;AACnF,QAAM,WAAW,oBAAoB,OAAO,CAAC,SAAS,CAAC,SAAS,SAAS,IAAI,CAAC,EAAE,KAAK,IAAI;AACzF,MAAI,CAAC,SAAU;AACf,EAAAC,eAAc,eAAe,GAAG,SAAS,QAAQ,CAAC;AAAA;AAAA;AAAA,EAA8B,QAAQ;AAAA,CAAI;AAC9F;;;AC5EA,SAAS,WAAAE,iBAAe;AAmBxB,eAAe,oBAAoB,KAAsC;AACvE,MAAI,eAAe,IAAI,MAAM,GAAG;AAC9B,UAAM,QAAQ,IAAI,OAAO;AACzB,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,UAAU,wCAAwC,EAAE,UAAU,SAAS,WAAW,CAAC;AAAA,IAC/F;AACA,UAAM,SAASC,UAAQ,IAAI,aAAa,MAAM,MAAM;AACpD,UAAM,gBAAgB,MAAM,CAAC,OAAO,UAAU,QAAQ,MAAM,UAAU,GAAG;AAAA,MACvE,KAAK,IAAI;AAAA,MACT,aAAa,IAAI;AAAA,MACjB,QAAQ,IAAI;AAAA,MACZ,QAAQ,IAAI,OAAO;AAAA,MACnB,cAAc,IAAI,OAAO;AAAA,IAC3B,CAAC;AACD,WAAO,kBAAkB,MAAM,WAAM,MAAM,UAAU;AAAA,EACvD;AAEA,QAAM,SAASA,UAAQ,IAAI,aAAa,IAAI,OAAO,OAAO,MAAM;AAChE,QAAM,aAAa,IAAI,OAAO,OAAO;AACrC,QAAM,gBAAgB,MAAM,CAAC,OAAO,UAAU,QAAQ,UAAU,GAAG;AAAA,IACjE,KAAK,IAAI;AAAA,IACT,aAAa,IAAI;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,OAAO;AAAA,IACnB,cAAc,IAAI,OAAO;AAAA,EAC3B,CAAC;AACD,SAAO,YAAY,MAAM,WAAM,UAAU;AAC3C;AAEA,eAAsB,UAAU,KAAqB,UAAyB,CAAC,GAAoB;AACjG,QAAM,OAAO,QAAQ,QAAQ;AAE7B,MAAI,SAAS,UAAU,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,OAAO,IAAI;AACxD,UAAM,YAAY,QAAQ,IAAI,uBAAuB;AACrD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,UAAU,2EAAsE;AAAA,QACxF,UAAU,SAAS;AAAA,QACnB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,0BAAsB,KAAK,KAAK;AAAA,EAClC;AAEA,MAAI;AACF,QAAI,iBAAiB;AAErB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,UACE,OAAO,eAAe,IAAI,MAAM,IAAI,+BAA+B;AAAA,UACnE,MAAM,YAAY;AAChB,6BAAiB,MAAM,oBAAoB,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,IAAI,OAAO,QAAQ,CAAC,QAAQ,OAAO;AACtC,uBAAiB,KAAK,cAAc;AAAA,IACtC;AACA,WAAO,SAAS;AAAA,EAClB,SAAS,OAAO;AACd,UAAM,SACJ,iBAAiB,YACb,MAAM,UACN,iBAAiB,QACf,MAAM,UACN,OAAO,KAAK;AACpB,UAAM,IAAI;AAAA,MACR,OAAO,SAAS,uBAAuB,IAAI,SAAS;AAAA,EAA0B,MAAM;AAAA,MACpF;AAAA,QACE,UAAU,SAAS;AAAA,QACnB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;;;AF9EA,eAAsB,UAAU,KAAqB,SAAyC;AAC5F,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,aACJ,QAAQ,cACR,QAAQ,IAAI,2BAA2B,OACvC,QAAQ,IAAI,2BAA2B;AACzC,QAAM,QAAQ,GAAG,mBAAmB,IAAI,MAAM,CAAC,iBAAc,IAAI;AACjE,QAAM,kBAAkB,sBAAsB,KAAK,OAAO;AAC1D,QAAM,SAAS;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,iBAAiB;AAAA,EACnB;AAEA,QAAM,SAAS,gBAAgB,IAAI,MAAM,KAAK,CAAC,eAAe,IAAI,MAAM;AAExE,MAAI,UAAU,gBAAgB,IAAI,aAAa;AAAA,IAC7C,GAAG,QAAQ;AAAA,IACX,oBAAoB,IAAI;AAAA,IACxB,GAAI,kBAAkB,EAAE,mBAAmB,IAAI,IAAI,CAAC;AAAA,EACtD,CAAC;AAED,MAAI,gBAAgB;AACpB,MACE,UACA,CAAC,IAAI,OAAO,UACZ,CAAC,QAAQ,iBAAiB,KAAK,KAC/B,CAAC,QAAQ,iBAAiB,KAAK,KAC/B,CAAC,QAAQ,iBAAiB,KAAK,GAC/B;AACA,UAAM,OAAO,wBAAwB,IAAI,aAAa;AAAA,MACpD;AAAA,MACA,QAAQ,IAAI,OAAO;AAAA,MACnB,KAAK;AAAA,IACP,CAAC;AACD,cAAU;AAAA,MACR,GAAG;AAAA,MACH,iBAAiB,KAAK;AAAA,MACtB,iBAAiB,KAAK;AAAA,IACxB;AACA,oBAAgB,KAAK;AACrB,QAAI,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,OAAO,QAAQ,KAAK,QAAQ;AACxD,UAAI,OAAO,KAAK,0BAAqB,KAAK,EAAE,EAAE;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf,KAAK,IAAI;AAAA,IACT,aAAa,IAAI;AAAA,IACjB,KAAK;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,OAAO;AAAA,IACnB,cAAc,IAAI,OAAO;AAAA,EAC3B;AAEA,MAAI,CAAC,YAAY;AACf,0BAAsB,KAAK,KAAK;AAAA,EAClC;AAEA,QAAM,aACJ,SAAS,SAAS,CAAC,QAAQ,IAAI,SAAS,QAAQ,CAAC,OAAO,IAAI,CAAC,OAAO;AACtE,QAAM,QAAmB,CAAC;AAE1B,MAAI,CAAC,YAAY;AACf,UAAM,KAAK;AAAA,MACT,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,8BAAsB,KAAK,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ;AACV,UAAM,KAAK;AAAA,MACT,OAAO,iBAAiB,IAAI;AAAA,MAC5B,MAAM,YAAY;AAChB,cAAM,SAAS,KAAK,EAAE,MAAM,SAAS,MAAM,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC;AAAA,MACrF;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ,aAAa;AACxB,YAAM,KAAK;AAAA,QACT,OAAO,sBAAsB,IAAI;AAAA,QACjC,MAAM,YAAY;AAChB,gBAAM,mBAAmB,QAAQ,WAAW,6BAA6B,GAAG,YAAY,QAAQ;AAAA,QAClG;AAAA,MACF,CAAC;AACD,YAAM,KAAK;AAAA,QACT,OAAO,6BAA6B,IAAI;AAAA,QACxC,MAAM,YAAY;AAChB,gBAAM,mBAAmB,QAAQ,WAAW,wBAAwB,GAAG,CAAC,GAAG,QAAQ;AAAA,QACrF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,KAAK;AAAA,MACT,OAAO,4BAA4B,IAAI;AAAA,MACvC,MAAM,YAAY;AAChB,cAAM,SAAS,KAAK,EAAE,MAAM,aAAa,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC;AAAA,MAC1E;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,UAAM,KAAK;AAAA,MACT,OAAO,oBAAoB,IAAI;AAAA,MAC/B,MAAM,YAAY;AAChB,cAAM,SAAS,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;AAAA,MACzC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM;AAAA,IACJ;AAAA,MACE,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,cAAM,mBAAmB,QAAQ,WAAW,+BAA+B,GAAG,CAAC,GAAG,QAAQ;AAC1F,cAAM,mBAAmB,QAAQ,WAAW,2BAA2B,GAAG,CAAC,GAAG,QAAQ;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,UAAM,KAAK;AAAA,MACT,OAAO;AAAA,MACP,MAAM,YAAY;AAChB,cAAM,UAAU,KAAK;AAAA,UACnB;AAAA,UACA,GAAG;AAAA,UACH,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,WAAW,CAAC,IAAI,OAAO,SAAS,CAAC,IAAI,OAAO,MAAM;AAChD,QAAI,OAAO,KAAK,oEAAoE;AAAA,EACtF;AAEA,QAAM,YAAY,KAAK,OAAO;AAAA,IAC5B,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAED,MAAI,CAAC,IAAI,OAAO,MAAM;AACpB;AAAA,MACE;AAAA,MACA,oBAAoBC,UAAQ,IAAI,aAAa,IAAI,OAAO,OAAO,MAAM,CAAC,WAAM,IAAI,OAAO,OAAO,UAAU;AAAA,IAC1G;AAAA,EACF;AACA,SAAO,SAAS;AAClB;;;AGvJA,eAAsB,WAAW,KAAqB,SAA0C;AAC9F,MAAI,CAAC,gBAAgB,IAAI,MAAM,GAAG;AAChC,UAAM,IAAI,UAAU,+CAA+C;AAAA,MACjE,UAAU,SAAS;AAAA,MACnB,aACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,kBAAkB,sBAAsB,KAAK,OAAO;AAC1D,QAAM,MAAM,gBAAgB,IAAI,aAAa;AAAA,IAC3C,GAAG,QAAQ;AAAA,IACX,oBAAoB,IAAI;AAAA,IACxB,GAAI,kBAAkB,EAAE,mBAAmB,IAAI,IAAI,CAAC;AAAA,EACtD,CAAC;AACD,QAAM,WAAW;AAAA,IACf,KAAK,IAAI;AAAA,IACT,aAAa,IAAI;AAAA,IACjB;AAAA,IACA,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,OAAO,UAAU,QAAQ;AAAA,IACrC,cAAc,IAAI,OAAO;AAAA,EAC3B;AAEA,QAAM,aACJ,SAAS,SAAS,CAAC,QAAQ,IAAI,SAAS,QAAQ,CAAC,OAAO,IAAI,CAAC,OAAO;AACtE,QAAM,cAAc,QAAQ,SAAS,CAAC,WAAW,IAAI,CAAC;AAEtD,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,UACE,OAAO,+BAA+B,IAAI;AAAA,UAC1C,MAAM,YAAY;AAChB,gBAAI,QAAQ,OAAQ;AACpB,kBAAM,mBAAmB,QAAQ,WAAW,6BAA6B,GAAG,YAAY,QAAQ;AAAA,UAClG;AAAA,QACF;AAAA,QACA;AAAA,UACE,OAAO,QAAQ,SACX,wBAAwB,IAAI,MAC5B,6BAA6B,IAAI;AAAA,UACrC,MAAM,YAAY;AAChB,kBAAM,mBAAmB,QAAQ,WAAW,wBAAwB,GAAG,aAAa,QAAQ;AAAA,UAC9F;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,OAAO,QAAQ,QAAQ,SAAY,GAAG,mBAAmB,IAAI,MAAM,CAAC,sBAAmB,IAAI;AAAA,MAC7F;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,MAAM;AACnB,UAAI,OAAO,KAAK,EAAE,SAAS,WAAW,MAAM,QAAQ,QAAQ,QAAQ,MAAM,GAAG,IAAI,KAAK,CAAC;AAAA,IACzF,WAAW,CAAC,QAAQ,OAAO;AACzB;AAAA,QACE;AAAA,QACA,QAAQ,SAAS,iCAAiC;AAAA,MACpD;AAAA,IACF;AAEA,WAAO,SAAS;AAAA,EAClB,SAAS,OAAO;AACd,UAAM,IAAI,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;AAAA,MAC1E,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;AC1FA,SAAS,kBAAkB;AAC3B,SAAS,QAAQ,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,aAAa,QAAQ,gBAAgB;AAC3F,SAAS,WAAAC,WAAS,QAAAC,aAAY;AAM9B,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,gCAAgC,CAAC,aAAa,uBAAuB;AAG3E,IAAM,mCAAmC,CAAC,8BAA8B,oBAAoB;AAE5F,SAAS,SAAS,MAAsB;AACtC,SAAO,WAAW,QAAQ,EAAE,OAAOC,cAAa,IAAI,CAAC,EAAE,OAAO,KAAK;AACrE;AAEA,SAAS,UAAU,KAAuB;AACxC,MAAI,CAACC,YAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,QAAM,UAAU,YAAY,GAAG;AAC/B,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAOC,MAAK,KAAK,KAAK;AAC5B,QAAI,SAAS,IAAI,EAAE,YAAY,GAAG;AAChC,YAAM,KAAK,GAAG,UAAU,IAAI,CAAC;AAAA,IAC/B,OAAO;AACL,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,mBAAmB,KAAsC;AAC7E,QAAM,OAAO,IAAI;AACjB,QAAM,UAAU;AAAA,IACdC,UAAQ,MAAM,UAAU;AAAA,IACxBA,UAAQ,MAAM,IAAI,OAAO,OAAO,MAAM;AAAA,EACxC;AAEA,QAAM,aAAuB,CAAC;AAE9B,aAAW,OAAO,SAAS;AACzB,eAAW,QAAQ,UAAU,GAAG,GAAG;AACjC,UAAI,CAAC,oBAAoB,KAAK,IAAI,EAAG;AACrC,YAAM,UAAUH,cAAa,MAAM,MAAM;AACzC,iBAAW,SAAS,uBAAuB;AACzC,YAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,qBAAW,KAAK,GAAG,IAAI,+BAA+B,KAAK,GAAG;AAAA,QAChE;AAAA,MACF;AACA,YAAM,gBAAgB,sCAAsC,KAAK,IAAI;AACrE,UAAI,eAAe;AACjB,mBAAW,SAAS,+BAA+B;AACjD,cAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,uBAAW,KAAK,GAAG,IAAI,mCAAmC,KAAK,GAAG;AAAA,UACpE;AAAA,QACF;AACA,mBAAW,SAAS,kCAAkC;AACpD,cAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,uBAAW,KAAK,GAAG,IAAI,sCAAsC,KAAK,GAAG;AAAA,UACvE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK,EAAE,SAAS,qBAAqB,IAAI,WAAW,WAAW,GAAG,WAAW,CAAC;AAAA,EAC3F,WAAW,WAAW,WAAW,GAAG;AAClC,QAAI,OAAO,QAAQ,0BAA0B;AAAA,EAC/C,OAAO;AACL,eAAW,KAAK,WAAY,KAAI,OAAO,MAAM,CAAC;AAAA,EAChD;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,IAAI,UAAU,gFAA2E;AAAA,MAC7F,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO,SAAS;AAClB;AAUA,eAAsB,wBACpB,KACA,SACiB;AACjB,QAAM,OAAO,IAAI;AACjB,QAAM,WAAW,QAAQ,eAAe,mBAAmB,MAAM,IAAI,MAAM;AAC3E,QAAM,UAAU;AAAA,IACd,EAAE,OAAO,OAAO,MAAMG,UAAQ,MAAM,UAAU,EAAE;AAAA,IAChD,EAAE,OAAO,WAAW,MAAMA,UAAQ,MAAM,IAAI,OAAO,OAAO,MAAM,EAAE;AAAA,EACpE;AAEA,MAAI,IAAI,OAAO,QAAQ;AACrB,QAAI,OAAO,KAAK,uCAAuC,QAAQ,EAAE;AACjE,WAAO,SAAS;AAAA,EAClB;AAEA,aAAW,EAAE,OAAO,KAAK,KAAK,SAAS;AACrC,QAAI,CAACF,YAAW,IAAI,GAAG;AACrB,YAAM,IAAI,UAAU,0CAAqC,IAAI,IAAI;AAAA,QAC/D,UAAU,SAAS;AAAA,QACnB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,SAASE,UAAQ,UAAU,KAAK;AACtC,WAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC/C,IAAAC,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,WAAO,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK,EAAE,SAAS,kBAAkB,IAAI,MAAM,SAAS,CAAC;AAAA,EACnE,OAAO;AACL,QAAI,OAAO,QAAQ,wBAAwB,QAAQ,EAAE;AAAA,EACvD;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,eAAe,KAAqB,SAAyC;AACjG,QAAM,OAAO,IAAI;AACjB,QAAM,WAAW,QAAQ,eAAe,mBAAmB,MAAM,IAAI,MAAM;AAC3E,QAAM,cAAc;AAAA,IAClB,EAAE,OAAO,OAAO,MAAMD,UAAQ,MAAM,UAAU,EAAE;AAAA,IAChD,EAAE,OAAO,WAAW,MAAMA,UAAQ,MAAM,IAAI,OAAO,OAAO,MAAM,EAAE;AAAA,EACpE;AAEA,QAAM,aAAuB,CAAC;AAE9B,aAAW,EAAE,OAAO,KAAK,KAAK,aAAa;AACzC,UAAM,eAAeA,UAAQ,UAAU,KAAK;AAC5C,QAAI,CAACF,YAAW,YAAY,GAAG;AAC7B,UAAI,OAAO,KAAK,kBAAkB,YAAY,oBAAe,KAAK,SAAS;AAC3E;AAAA,IACF;AAEA,UAAM,gBAAgB,UAAU,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC;AAC/E,UAAM,eAAe,UAAU,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC;AAEtE,UAAM,gBAAgB,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,QAAQ,cAAc,EAAE,CAAC,CAAC;AACnF,UAAM,eAAe,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,QAAQ,MAAM,EAAE,CAAC,CAAC;AAEzE,eAAW,QAAQ,eAAe;AAChC,UAAI,CAAC,aAAa,IAAI,IAAI,GAAG;AAC3B,mBAAW,KAAK,iBAAiB,KAAK,GAAG,IAAI,EAAE;AAAA,MACjD;AAAA,IACF;AAEA,eAAW,QAAQ,eAAe;AAChC,YAAM,MAAM,KAAK,QAAQ,cAAc,EAAE;AACzC,YAAM,UAAUE,UAAQ,MAAM,IAAI,MAAM,CAAC,CAAC;AAC1C,UAAI,CAACF,YAAW,OAAO,EAAG;AAC1B,YAAM,KAAK,SAAS,IAAI;AACxB,YAAM,KAAK,SAAS,OAAO;AAC3B,UAAI,OAAO,IAAI;AACb,mBAAW,KAAK,kBAAkB,KAAK,GAAG,GAAG,EAAE;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK,EAAE,SAAS,gBAAgB,IAAI,WAAW,WAAW,GAAG,WAAW,CAAC;AAAA,EACtF,WAAW,WAAW,WAAW,GAAG;AAClC,QAAI,OAAO,QAAQ,iDAAiD;AAAA,EACtE,OAAO;AACL,eAAW,KAAK,WAAY,KAAI,OAAO,MAAM,CAAC;AAAA,EAChD;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,IAAI,UAAU,uBAAuB,EAAE,UAAU,SAAS,aAAa,CAAC;AAAA,EAChF;AAEA,SAAO,SAAS;AAClB;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,gBAAgB,KAAsC;AAC1E,QAAM,OAAO,IAAI;AACjB,QAAM,YAAY,CAAC,OAAO,UAAU,cAAc,EAAE,IAAI,CAAC,MAAME,UAAQ,MAAM,CAAC,CAAC;AAC/E,QAAM,WAAqB,CAAC;AAE5B,aAAW,OAAO,WAAW;AAC3B,eAAW,QAAQ,UAAU,GAAG,GAAG;AACjC,UAAI,CAAC,6CAA6C,KAAK,IAAI,EAAG;AAC9D,UAAI,KAAK,SAAS,cAAc,EAAG;AACnC,YAAM,UAAUH,cAAa,MAAM,MAAM;AACzC,iBAAW,WAAW,iBAAiB;AACrC,gBAAQ,YAAY;AACpB,YAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,mBAAS,KAAK,GAAG,IAAI,mCAAmC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK,EAAE,SAAS,iBAAiB,IAAI,SAAS,WAAW,GAAG,SAAS,CAAC;AAAA,EACnF,WAAW,SAAS,WAAW,GAAG;AAChC,QAAI,OAAO,QAAQ,sBAAsB;AAAA,EAC3C,OAAO;AACL,eAAW,KAAK,SAAU,KAAI,OAAO,MAAM,CAAC;AAAA,EAC9C;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,IAAI,UAAU,6DAA6D;AAAA,MAC/E,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO,SAAS;AAClB;;;AC5OA,SAAS,UAAAK,SAAQ,cAAAC,cAAY,aAAAC,YAAW,eAAAC,cAAa,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACxF,SAAS,YAAAC,WAAU,WAAAC,iBAAe;AAClC,YAAYC,QAAO;;;ACFnB,SAAS,cAAAC,cAAY,aAAAC,YAAW,gBAAAC,eAAc,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC3E,SAAS,WAAAC,iBAAe;AAIxB,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAgB,CAAC,0BAA0B,yBAAyB;AAEnE,SAAS,iBAAiB,UAA2B;AAC1D,SAAO,aAAa,uBAAuB,aAAa;AAC1D;AAEO,SAAS,kBAAkB,WAAmB,MAAiD;AACpG,QAAM,YAAYA,UAAQ,WAAW,YAAY;AACjD,EAAAJ,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,EAAAG;AAAA,IACEC,UAAQ,WAAW,WAAW;AAAA,IAC9B;AAAA;AAAA;AAAA,oDAGgD,IAAI;AAAA;AAAA,EAEtD;AACF;AAEO,SAAS,2BAA2B,WAAyB;AAClE,EAAAD;AAAA,IACEC,UAAQ,WAAW,kCAAkC;AAAA,IACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF;AACF;AAEO,SAAS,+BAA+B,WAAyB;AACtE,EAAAD;AAAA,IACEC,UAAQ,WAAW,kCAAkC;AAAA,IACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF;AACF;AAEO,SAAS,uBAAuB,WAAyB;AAC9D,EAAAD;AAAA,IACEC,UAAQ,WAAW,6BAA6B;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF;AACF;AAEO,SAAS,2BAA2B,WAAyB;AAClE,EAAAD;AAAA,IACEC,UAAQ,WAAW,6BAA6B;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF;AACF;AAEO,SAAS,uBAAuB,WAAyB;AAC9D,QAAM,OAAOA,UAAQ,WAAW,yDAAyD;AACzF,MAAIL,aAAW,IAAI,GAAG;AACpB;AAAA,EACF;AACA,EAAAI;AAAA,IACE;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBF;AACF;AAEA,SAAS,WAAW,WAAmB,cAA4B;AACjE,QAAM,OAAOC,UAAQ,WAAW,YAAY;AAC5C,MAAI,CAACL,aAAW,IAAI,GAAG;AACrB;AAAA,EACF;AACA,EAAAG,QAAO,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC/C;AAEO,SAAS,yBAAyB,WAAyB;AAChE,QAAM,UAAUE,UAAQ,WAAW,cAAc;AACjD,MAAI,CAACL,aAAW,OAAO,GAAG;AACxB;AAAA,EACF;AACA,QAAM,MAAM,KAAK,MAAME,cAAa,SAAS,MAAM,CAAC;AAGpD,MAAI,CAAC,IAAI,iBAAiB;AACxB;AAAA,EACF;AACA,aAAW,OAAO,eAAe;AAC/B,WAAO,IAAI,gBAAgB,GAAG;AAAA,EAChC;AACA,EAAAE,eAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D;AAEO,SAAS,oBACd,WACA,MACA,UACM;AACN,MAAI,CAAC,iBAAiB,QAAQ,GAAG;AAC/B;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,eAAW,gBAAgB,cAAc;AACvC,iBAAW,WAAW,YAAY;AAAA,IACpC;AACA,2BAAuB,SAAS;AAChC,mCAA+B,SAAS;AACxC,+BAA2B,SAAS;AACpC,6BAAyB,SAAS;AAClC;AAAA,EACF;AAEA,oBAAkB,WAAW,IAAI;AACjC,6BAA2B,SAAS;AACpC,yBAAuB,SAAS;AAEhC,QAAM,gBAAgBC,UAAQ,WAAW,+BAA+B;AACxE,MAAIL,aAAW,aAAa,GAAG;AAC7B,QAAI,UAAUE,cAAa,eAAe,MAAM;AAChD,QAAI,CAAC,QAAQ,SAAS,mBAAmB,GAAG;AAC1C,gBAAU,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AACA,MAAAE,eAAc,eAAe,OAAO;AAAA,IACtC;AAAA,EACF;AACF;;;AC7LA,SAAS,cAAAE,cAAY,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACxD,SAAS,WAAAC,iBAAe;AACxB,YAAYC,QAAO;AAUZ,IAAM,+BAA+B;AACrC,IAAM,kBAAkB;AAe/B,IAAM,qBAAqB;AAEpB,SAAS,uBAAsC;AACpD,QAAM,cAAc,QAAQ,aAAa,UAAU,yBAAyB;AAC5E,MAAIC,aAAW,WAAW,GAAG;AAC3B,WAAO,KAAK,MAAMC,eAAa,aAAa,MAAM,CAAC;AAAA,EACrD;AACA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,aAA2C;AAC3E,QAAM,OAAOC,UAAQ,aAAa,eAAe;AACjD,MAAI,CAACF,aAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,WAAO,KAAK,MAAMC,eAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,OAA8B;AAChE,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,4BAA4B,EAAE,EAAE,QAAQ,UAAU,EAAE;AACzF,QAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAChC;AAEO,SAAS,wBAAwB,QAAgB,MAAqC;AAC3F,QAAM,OAAO,oBAAoB,MAAM;AACvC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iDAA4C,MAAM,IAAI;AAAA,EACxE;AACA,SAAO;AAAA,IACL,aAAa,MAAM,eAAe;AAAA,IAClC,QAAQ;AAAA,IACR,WAAW,sBAAsB,IAAI;AAAA,IACrC,eAAe,MAAM,iBAAiB;AAAA,IACtC,eAAe,MAAM,iBAAiB;AAAA,EACxC;AACF;AAEO,SAAS,mBAAmB,aAA8B;AAC/D,MAAI,QAAQ,IAAI,4BAA4B,GAAG,KAAK,EAAG,QAAO;AAC9D,MAAI,QAAQ,IAAI,cAAc,KAAK,EAAG,QAAO;AAC7C,SAAO,QAAQ,aAAa,WAAW,EAAE,4BAA4B,GAAG,KAAK,CAAC;AAChF;AAEO,SAAS,6BAA6B,aAA8B;AACzE,QAAM,SAAS,kBAAkB,WAAW;AAC5C,QAAM,SAAS,QAAQ,UAAU;AACjC,SAAO,QAAQ,MAAM,KAAK,CAAC,mBAAmB,KAAK,MAAM;AAC3D;AAEO,SAAS,uBAAuB,aAA6B;AAClE,QAAM,WAAW,kBAAkB,WAAW;AAC9C,MAAI,UAAU,UAAU,CAAC,mBAAmB,KAAK,SAAS,MAAM,GAAG;AACjE,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,qBAAqB,EAAE;AAChC;AAEO,SAAS,oBAAoB,aAA8B;AAChE,SAAO,CAAC,6BAA6B,WAAW,KAAK,CAAC,mBAAmB,WAAW;AACtF;AAEO,SAAS,oBAAoB,aAAqB,OAAkC;AACzF,QAAM,WAAW,kBAAkB,WAAW,KAAK,qBAAqB;AACxE,QAAM,UAAU,wBAAwB,MAAM,QAAQ,QAAQ;AAC9D,EAAAE,eAAcD,UAAQ,aAAa,eAAe,GAAG,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAE5F,MAAI,MAAM,OAAO,KAAK,GAAG;AACvB,kBAAc,aAAa,EAAE,CAAC,4BAA4B,GAAG,MAAM,MAAM,KAAK,EAAE,CAAC;AAAA,EACnF;AAEA,0BAAwB,WAAW;AACrC;AAWA,eAAsB,qBACpB,UAAkC,CAAC,GACE;AACrC,MAAI,QAAQ,KAAM,QAAO;AAEzB,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;AAEvD,MAAI,CAAC,oBAAoB,WAAW,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,QAAQ,KAAK;AAClC,MAAI,CAAC,UAAU,6BAA6B,WAAW,GAAG;AACxD,aAAS,kBAAkB,WAAW,GAAG;AAAA,EAC3C;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,SAAS,MAAQ,QAAK;AAAA,MAC1B,SAAS;AAAA,MACT,aAAa,QAAQ,iBAAiB;AAAA,MACtC,cAAc,QAAQ;AAAA,MACtB,UAAU,CAAC,UAAU;AACnB,cAAM,OAAO,oBAAoB,SAAS,EAAE;AAC5C,eAAO,OAAO,SAAY;AAAA,MAC5B;AAAA,IACF,CAAC;AACD,QAAM,YAAS,MAAM,EAAG,QAAO;AAC/B,aAAS,oBAAoB,MAAM,KAAK;AAAA,EAC1C;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,mBAAmB,WAAW,GAAG;AACnC,WAAO,EAAE,OAAO;AAAA,EAClB;AAEA,QAAM,cAAc,MAAQ,YAAS;AAAA,IACnC,SAAS;AAAA,IACT,UAAU,CAAC,UAAU;AACnB,UAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,MAAM,YAAS,WAAW,EAAG,QAAO;AAEpC,SAAO,EAAE,QAAQ,OAAO,YAAY,KAAK,EAAE;AAC7C;AAEO,SAAS,mBAAmB,cAA+B;AAChE,SAAO,kCAA6B,eAAe,8BAA8B,cAAc;AACjG;;;ACzKA,SAAS,cAAc,cAAAE,cAAY,iBAAAC,sBAAqB;AACxD,SAAS,UAAU,WAAAC,iBAAe;AA2BlC,SAASC,gBAAe,MAAyB;AAC/C,SAAO,SAAS,QAAQ,aAAa,SAAS,QAAQ,aAAa;AACrE;AAEA,SAAS,aAAa,QAA6B,MAA+B;AAChF,MAAI,KAAM,QAAO,CAAC,IAAI;AACtB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,cAAc,OAAgC;AACrD,aAAW,QAAQ,OAAO;AACxB,QAAIC,aAAW,IAAI,EAAG,QAAO;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,SAAS,gBACP,aACA,YACA,kBACA,QACa;AACb,QAAM,SAASC,UAAQ,aAAa,UAAU;AAC9C,MAAID,aAAW,MAAM,GAAG;AACtB,WAAO,EAAE,QAAQ,WAAW,MAAM,YAAY,QAAQ,kBAAkB;AAAA,EAC1E;AAEA,QAAM,SAAS,cAAc,gBAAgB;AAC7C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ,mCAA8B,UAAU;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,iBAAa,QAAQ,MAAM;AAAA,EAC7B;AAEA,QAAM,OAAO,SAAS,MAAM;AAC5B,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ,SAAS,wBAAwB,IAAI,WAAM,UAAU,KAAK,UAAU,IAAI,WAAM,UAAU;AAAA,EAClG;AACF;AAEA,SAAS,iBACP,aACA,YACA,SACA,QACa;AACb,QAAM,SAASC,UAAQ,aAAa,UAAU;AAC9C,MAAID,aAAW,MAAM,GAAG;AACtB,WAAO,EAAE,QAAQ,WAAW,MAAM,YAAY,QAAQ,kBAAkB;AAAA,EAC1E;AAEA,MAAI,CAAC,QAAQ;AACX,IAAAE,eAAc,QAAQ,OAAO;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ,SAAS,0BAA0B,UAAU,KAAK,WAAW,UAAU;AAAA,EACjF;AACF;AAEA,SAAS,kBAAkB,QAAuC;AAChE,MAAI,eAAe,MAAM,EAAG,QAAO,CAAC,qBAAqB;AACzD,MAAI,OAAO,gBAAgB,mBAAmB;AAC5C,WAAO,CAAC,uBAAuB,0BAA0B;AAAA,EAC3D;AACA,SAAO,CAAC,uBAAuB,2BAA2B,0BAA0B;AACtF;AAEA,SAAS,eAAe,QAAqC;AAC3D,SAAO,QAAQ,aAAa,OAAO,WAAW;AAChD;AAEO,SAAS,kBAAkB,KAAqB,UAAwB,CAAC,GAAkB;AAChG,QAAM,EAAE,aAAa,OAAO,IAAI;AAChC,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,UAAyB,CAAC;AAChC,QAAM,YAAY,QAAQ,aAAa,QAAQ;AAC/C,QAAM,cAAc,eAAe,MAAM;AAGzC,UAAQ;AAAA,IACN,gBAAgB,aAAa,qBAAqB;AAAA,MAChDD,UAAQ,aAAa,sBAAsB;AAAA,MAC3CA,UAAQ,aAAa,sBAAsB;AAAA,MAC3C,QAAQ,aAAa,sBAAsB;AAAA,IAC7C,GAAG,MAAM;AAAA,EACX;AAGA,UAAQ;AAAA,IACN,gBAAgB,aAAa,cAAc;AAAA,MACzCA,UAAQ,aAAa,oBAAoB;AAAA,MACzCA,UAAQ,WAAW,oBAAoB;AAAA,IACzC,GAAG,MAAM;AAAA,EACX;AAGA,aAAW,QAAQ,aAAa,QAAQ,QAAQ,IAAI,GAAG;AACrD,UAAM,UAAUF,gBAAe,IAAI;AACnC,UAAM,aAAa,GAAG,OAAO;AAC7B,YAAQ;AAAA,MACN,gBAAgB,aAAa,SAAS;AAAA,QACpCE,UAAQ,aAAa,UAAU;AAAA,QAC/BA,UAAQ,WAAW,UAAU;AAAA,MAC/B,GAAG,MAAM;AAAA,IACX;AAAA,EACF;AAGA,MAAI,gBAAgB,MAAM,KAAK,CAAC,eAAe,MAAM,GAAG;AACtD,UAAM,SAAS,OAAO,IAAI;AAC1B,YAAQ;AAAA,MACN,gBAAgB,aAAa,QAAQ;AAAA,QACnCA,UAAQ,aAAa,GAAG,MAAM,UAAU;AAAA,QACxCA,UAAQ,WAAW,yBAAyB;AAAA,MAC9C,GAAG,MAAM;AAAA,IACX;AAEA,UAAM,cAAc,OAAO,IAAI;AAC/B,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,kBAAkB,MAAM,GAAG;AAC5C,YAAQ;AAAA,MACN,gBAAgB,aAAa,MAAM,CAACA,UAAQ,aAAa,IAAI,CAAC,GAAG,MAAM;AAAA,IACzE;AAAA,EACF;AAGA,MAAI,gBAAgB,MAAM,KAAK,CAAC,eAAe,MAAM,GAAG;AACtD,UAAM,UAAU,OAAO,IAAI;AAC3B,UAAM,cAAcA,UAAQ,aAAa,OAAO;AAChD,QAAI,CAACD,aAAW,WAAW,GAAG;AAC5B,YAAM,kBAAkBC,UAAQ,aAAa,iBAAiB;AAC9D,UAAID,aAAW,eAAe,GAAG;AAC/B,gBAAQ,KAAK,gBAAgB,aAAa,SAAS,CAAC,eAAe,GAAG,MAAM,CAAC;AAAA,MAC/E,OAAO;AACL,gBAAQ,KAAK;AAAA,UACX,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,EAAE,QAAQ,WAAW,MAAM,SAAS,QAAQ,kBAAkB,CAAC;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,wBAAwB,WAAyB;AAC/D,QAAM,YAAY,QAAQ,aAAa,QAAQ;AAC/C,MAAI,CAACA,aAAW,SAAS,EAAG;AAE5B,aAAW,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,UAAM,MAAMC,UAAQ,WAAW,IAAI;AACnC,UAAM,OAAOA,UAAQ,WAAW,IAAI;AACpC,QAAID,aAAW,GAAG,KAAK,CAACA,aAAW,IAAI,GAAG;AACxC,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,iBAAiB,cAAc;AAAA,IACnCC,UAAQ,WAAW,sBAAsB;AAAA,IACzC,QAAQ,aAAa,sBAAsB;AAAA,EAC7C,CAAC;AACD,MAAI,CAAC,eAAgB;AACrB,QAAM,cAAcA,UAAQ,WAAW,sBAAsB;AAC7D,MAAI,CAACD,aAAW,WAAW,KAAK,CAACA,aAAWC,UAAQ,WAAW,mBAAmB,CAAC,GAAG;AACpF,iBAAa,gBAAgB,WAAW;AAAA,EAC1C;AACF;AAEO,SAAS,gBAAgB,SAA4C;AAC1E,QAAM,UAAU,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,WAAW,QAAQ;AAC3F,MAAI,SAAS;AACX,WAAO,QAAQ,mBAAmB;AAAA,EACpC;AAEA,QAAM,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,WAAW,OAAO,KAAK,EAAE,WAAW,QAAQ;AACzF,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,WAAW,QAAQ;AAC3F,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACnPO,IAAM,mBAA2D;AAAA,EACtE,qBAAqB;AAAA,IACnB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,cAAc;AAAA,IACd,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AAAA,EACA,mBAAmB;AAAA,IACjB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;;;AC1BA,IAAM,uBAAuB;AAEtB,SAAS,qBAAqB,OAAuB;AAC1D,SAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,WAAW,GAAG,EACtB,QAAQ,eAAe,EAAE,EACzB,QAAQ,OAAO,GAAG,EAClB,QAAQ,YAAY,EAAE;AAC3B;AAEO,SAAS,oBAAoB,MAAkC;AACpE,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,qBAAqB,KAAK,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,GAAI,QAAO;AAC7B,SAAO;AACT;AAEO,SAAS,qBAAqB,MAAsB;AACzD,QAAM,SAAS,KACZ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AACV,SAAO,QAAQ,UAAU,SAAS;AACpC;;;ALgBA,SAAS,sBACP,UACA,aACA,QACqB;AACrB,QAAM,OAAO,EAAE,GAAG,wBAAwB,aAAa,SAAU;AAEjE,MAAI,aAAa,iBAAiB;AAChC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,UAAU,WAAW;AAAA,QACjC,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAA8B;AAAA,IAClC,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,YAAY,cAAc,WAAW;AAAA,MACrC,QAAQ,qBAAqB,WAAW;AAAA,IAC1C;AAAA,IACA,KAAK;AAAA,MACH,GAAG,KAAK;AAAA,MACR,MAAM,aAAa,oBAAoB,SAAS,KAAK,IAAI;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,iBAAiB,QAAS,KAAK,QAAQ;AACzC,WAAO,WAAW,EAAE,OAAO;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,WAAyB;AAC9D,MAAI,CAACE,aAAW,SAAS,EAAG;AAE5B,QAAM,UAAUC,aAAY,SAAS,EAAE,OAAO,CAAC,UAAU,UAAU,WAAW;AAC9E,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI,UAAU,kCAAkC,SAAS,IAAI;AAAA,MACjE,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAqB,SAAsB,iBAAkC;AACpF,MAAI,QAAQ,WAAW;AACrB,WAAOC,UAAQ,QAAQ,SAAS;AAAA,EAClC;AAEA,QAAM,YAAY,QAAQ,IAAI;AAC9B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,UAAU,4BAA4B;AAAA,MAC9C,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,oBAAoB,IAAI;AACtC,MAAI,OAAO;AACT,UAAM,IAAI,UAAU,OAAO,EAAE,UAAU,SAAS,WAAW,CAAC;AAAA,EAC9D;AAEA,SAAOA,UAAQ,WAAW,IAAI;AAChC;AAEA,eAAsB,QAAQ,KAAqB,SAAuC;AACxF,QAAM,iBAAiB,IAAI,OAAO,MAAM,IAAI,OAAO,OAAO,IAAI,OAAO;AAErE,MAAI,WAAW,QAAQ;AACvB,MAAI,cAAc,QAAQ,OAAO,qBAAqB,QAAQ,IAAI,IAAI;AACtE,MAAI,SAAS,QAAQ;AAErB,MAAI,CAAC,gBAAgB;AACnB,QAAI,CAAC,UAAU;AACb,YAAM,OAAO,MAAQ,UAAO;AAAA,QAC1B,SAAS;AAAA,QACT,SAAS;AAAA,UACP;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,YACP,MAAM;AAAA,UACR;AAAA,UACA,EAAE,OAAO,mBAAmB,OAAO,qBAAqB,MAAM,wBAAwB;AAAA,UACtF,EAAE,OAAO,iBAAiB,OAAO,iBAAiB,MAAM,sBAAsB;AAAA,QAChF;AAAA,MACF,CAAC;AACD,UAAM,YAAS,IAAI,EAAG,OAAM,IAAI,UAAU,kBAAkB,EAAE,UAAU,SAAS,WAAW,CAAC;AAC7F,iBAAW;AAAA,IACb;AAEA,QAAI,CAAC,QAAQ,aAAa,CAAC,aAAa;AACtC,YAAM,aAAa,MAAQ,QAAK;AAAA,QAC9B,SAAS;AAAA,QACT,aAAa;AAAA,QACb,UAAU,CAAC,UAAU,oBAAoB,qBAAqB,SAAS,EAAE,CAAC;AAAA,MAC5E,CAAC;AACD,UAAM,YAAS,UAAU,GAAG;AAC1B,cAAM,IAAI,UAAU,kBAAkB,EAAE,UAAU,SAAS,WAAW,CAAC;AAAA,MACzE;AACA,oBAAc,qBAAqB,UAAU;AAAA,IAC/C;AAEA,QAAI,CAAC,UAAU,YAAY,iBAAiB,QAAQ,GAAG;AACrD,YAAM,eAAe,MAAQ,UAAO;AAAA,QAClC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,SAAS;AAAA,UACP;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,YACP,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,YACP,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,OAAO;AAAA,YACP,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAM,YAAS,YAAY,GAAG;AAC5B,cAAM,IAAI,UAAU,kBAAkB,EAAE,UAAU,SAAS,WAAW,CAAC;AAAA,MACzE;AACA,eAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,CAAC,UAAU;AACb,eAAW;AAAA,EACb;AAEA,MAAI,CAAC,UAAU,iBAAiB,QAAQ,GAAG;AACzC,aAAS;AAAA,EACX;AAEA,QAAM,YAAY,qBAAqB,SAAS,WAAW;AAC3D,QAAM,OAAO,eAAeC,UAAS,SAAS;AAC9C,gCAA8B,SAAS;AAEvC,QAAM,cAAc,QAAQ,aAAa,QAAQ;AACjD,MAAI,CAACH,aAAW,WAAW,GAAG;AAC5B,UAAM,IAAI,UAAU,uBAAuB,QAAQ,IAAI,EAAE,UAAU,SAAS,WAAW,CAAC;AAAA,EAC1F;AAEA,MAAI,IAAI,OAAO,QAAQ;AACrB,QAAI,OAAO,KAAK,4BAA4B,QAAQ,OAAO,SAAS,EAAE;AACtE,WAAO,SAAS;AAAA,EAClB;AAEA,EAAAI,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,EAAAC,QAAO,aAAa,WAAW,EAAE,WAAW,KAAK,CAAC;AAClD,0BAAwB,SAAS;AAEjC,QAAM,SAAS,sBAAsB,UAAU,MAAM,MAAM;AAC3D,EAAAC,eAAcJ,UAAQ,WAAW,oBAAoB,GAAG,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAE9F,QAAM,UAAUA,UAAQ,WAAW,cAAc;AACjD,MAAIF,aAAW,OAAO,GAAG;AACvB,UAAM,MAAM,KAAK,MAAMO,eAAa,SAAS,MAAM,CAAC;AAKpD,QAAI,OAAO;AACX,QAAI,UAAU,EAAE,GAAG,IAAI,SAAS,GAAG,iBAAiB,QAAQ,EAAE;AAC9D,QAAI,kBAAkB;AAAA,MACpB,GAAG,IAAI;AAAA,MACP,GAAG,wBAAwB;AAAA,IAC7B;AACA,IAAAD,eAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC5D;AAEA,MAAI,UAAU,iBAAiB,QAAQ,GAAG;AACxC,wBAAoB,WAAW,QAAQ,QAAQ;AAAA,EACjD;AAEA,gBAAc,QAAQ,mCAAmC,GAAG,CAAC,GAAG;AAAA,IAC9D,KAAK;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,gBAAgBJ,UAAQ,WAAW,YAAY;AACrD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAWF,aAAW,aAAa,IAAIO,eAAa,eAAe,MAAM,IAAI;AACnF,QAAM,WAAW,gBAAgB,OAAO,CAAC,SAAS,CAAC,SAAS,SAAS,IAAI,CAAC,EAAE,KAAK,IAAI;AACrF,MAAI,UAAU;AACZ,IAAAD,eAAc,eAAe,GAAG,SAAS,QAAQ,CAAC;AAAA,EAAK,QAAQ;AAAA,CAAI;AAAA,EACrE;AAEA,MAAI,aAAa,uBAAuB,CAAC,IAAI,OAAO,UAAU,oBAAoB,SAAS,GAAG;AAC5F,UAAM,gBAAgB,uBAAuB,SAAS;AACtD,QAAI,WAAW;AAEf,QAAI,gBAAgB;AAClB,UAAI,QAAQ,WAAW;AACrB,mBAAW,EAAE,QAAQ,QAAQ,UAAU;AAAA,MACzC;AAAA,IACF,OAAO;AACL,MAAE,OAAI,KAAK,4DAAuD;AAClE,iBAAW,MAAM,qBAAqB;AAAA,QACpC,aAAa;AAAA,QACb;AAAA,QACA,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,QAAI,UAAU;AACZ,0BAAoB,WAAW,QAAQ;AACvC,UAAI,CAAC,gBAAgB;AACnB,QAAE,OAAI,QAAQ,mBAAmB,SAAS,CAAC;AAAA,MAC7C,OAAO;AACL,YAAI,OAAO,QAAQ,mBAAmB,SAAS,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB;AACnB,IAAE,OAAI,QAAQ,cAAc,QAAQ,OAAO,SAAS,EAAE;AACtD,IAAE,QAAK,MAAM,IAAI,uDAAuD,iBAAiB;AAAA,EAC3F,OAAO;AACL,QAAI,OAAO,QAAQ,cAAc,QAAQ,OAAO,SAAS,EAAE;AAAA,EAC7D;AAEA,SAAO,SAAS;AAClB;;;AMpSA,SAAS,UAAAE,SAAQ,cAAAC,cAAY,aAAAC,YAAW,gBAAAC,gBAAc,eAAAC,cAAa,YAAY,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC5G,SAAS,QAAAC,OAAM,WAAAC,iBAAe;AAY9B,IAAM,cAAc,CAAC,QAAQ,cAAc;AAC3C,IAAM,kBAAkB;AACxB,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,SAAS,wBAAwB,UAAsC;AACrE,MAAI,CAACC,aAAW,QAAQ,EAAG,QAAO;AAClC,QAAM,OAAOC,eAAa,UAAU,MAAM,EACvC,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AACjD,SAAO,QAAQ;AACjB;AAEA,SAAS,gBAAgB,KAA6C;AACpE,QAAM,OAAO,KAAK,KAAK;AACvB,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,SAAS,KAAK,MAAM,0DAA0D;AACpF,MAAI,OAAQ,QAAO,OAAO,CAAC;AAC3B,QAAM,gBAAgB,KAAK,MAAM,wCAAwC;AACzE,MAAI,cAAe,QAAO,cAAc,CAAC;AACzC,SAAO;AACT;AAMA,eAAsB,WAAW,KAAqB,WAA2B,CAAC,GAAoB;AACpG,QAAM,OAAO,IAAI;AACjB,QAAM,WAAWC,UAAQ,MAAM,kBAAkB;AACjD,QAAM,UAAoB,CAAC;AAE3B,aAAW,UAAU,aAAa;AAChC,UAAM,aAAaA,UAAQ,MAAM,MAAM;AACvC,QAAI,CAACF,aAAW,UAAU,EAAG;AAE7B,YAAQ,KAAK,QAAQ,MAAM,iBAAY;AACvC,QAAI,IAAI,OAAO,OAAQ;AAEvB,IAAAG,WAAUC,MAAK,UAAU,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,IAAAD,WAAUC,MAAK,UAAU,UAAU,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAEnE,UAAM,cAAcA,MAAK,YAAY,0BAA0B;AAC/D,UAAM,gBAAgBA,MAAK,YAAY,4BAA4B;AACnE,QAAIJ,aAAW,WAAW,GAAG;AAC3B,MAAAK,QAAO,aAAaD,MAAK,UAAU,UAAU,0BAA0B,CAAC;AAAA,IAC1E;AACA,QAAIJ,aAAW,aAAa,GAAG;AAC7B,MAAAK,QAAO,eAAeD,MAAK,UAAU,UAAU,4BAA4B,CAAC;AAAA,IAC9E;AAEA,UAAM,WAAWA,MAAK,YAAY,iBAAiB;AACnD,QAAIJ,aAAW,QAAQ,GAAG;AACxB,iBAAW,QAAQM,aAAY,QAAQ,GAAG;AACxC,QAAAD,QAAOD,MAAK,UAAU,IAAI,GAAGA,MAAK,UAAU,UAAU,YAAY,IAAI,CAAC;AAAA,MACzE;AAAA,IACF;AAEA,IAAAG,QAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD;AAEA,QAAM,iBAAiBL,UAAQ,MAAM,eAAe;AACpD,QAAM,iBAAiBE,MAAK,UAAU,SAAS,UAAU;AACzD,MAAIJ,aAAW,cAAc,GAAG;AAC9B,YAAQ,KAAK,QAAQ,eAAe,gCAA2B;AAC/D,QAAI,CAAC,IAAI,OAAO,QAAQ;AACtB,MAAAG,WAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAC7C,MAAAE,QAAO,gBAAgB,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAC1D,MAAAE,QAAO,gBAAgB,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,QAAMC,oBAAmBN,UAAQ,MAAM,0BAA0B;AACjE,QAAM,eAAeA,UAAQ,MAAM,oBAAoB;AAEvD,MAAIF,aAAWQ,iBAAgB,KAAK,CAACR,aAAW,YAAY,GAAG;AAC7D,YAAQ,KAAK,UAAU,0BAA0B,WAAM,oBAAoB,EAAE;AAC7E,QAAI,CAAC,IAAI,OAAO,QAAQ;AACtB,iBAAWQ,mBAAkB,YAAY;AAAA,IAC3C;AAAA,EACF,WAAWR,aAAWQ,iBAAgB,KAAKR,aAAW,YAAY,GAAG;AACnE,YAAQ,KAAK,oBAAoB,0BAA0B,EAAE;AAC7D,QAAI,CAAC,IAAI,OAAO,QAAQ;AACtB,MAAAO,QAAOC,mBAAkB,EAAE,OAAO,KAAK,CAAC;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,oBAAoBN,UAAQ,MAAM,oBAAoB;AAC5D,QAAM,oBAAoBA,UAAQ,MAAM,oBAAoB;AAC5D,MAAIF,aAAW,iBAAiB,KAAK,CAACA,aAAW,iBAAiB,GAAG;AACnE,UAAM,WAAW,gBAAgB,wBAAwB,iBAAiB,CAAC,KAAK;AAChF,YAAQ,KAAK,WAAW,oBAAoB,WAAM,oBAAoB,cAAc,QAAQ,GAAG;AAC/F,QAAI,CAAC,IAAI,OAAO,QAAQ;AACtB,MAAAS;AAAA,QACE;AAAA,QACA;AAAA,EAAmF,QAAQ;AAAA;AAAA,MAC7F;AACA,MAAAF,QAAO,mBAAmB,EAAE,OAAO,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,MAAIP,aAAW,YAAY,GAAG;AAC5B,UAAM,MAAM,KAAK,MAAMC,eAAa,cAAc,MAAM,CAAC;AACzD,QAAI,gBAAgB;AACpB,QAAI,KAAK,KAAK,mBAAmB,IAAI,IAAI,oBAAoB,oBAAoB;AAC/E,cAAQ,KAAK,2DAAsD;AACnE,UAAI,CAAC,IAAI,OAAO,QAAQ;AACtB,YAAI,IAAI,kBAAkB;AAC1B,wBAAgB;AAAA,MAClB;AAAA,IACF;AACA,QAAI,KAAK,KAAK,gBAAgB,sBAAsB;AAClD,cAAQ,KAAK,iCAA4B,oBAAoB,EAAE;AAC/D,UAAI,CAAC,IAAI,OAAO,QAAQ;AACtB,YAAI,IAAI,cAAc;AACtB,wBAAgB;AAAA,MAClB;AAAA,IACF;AACA,QAAI,iBAAiB,CAAC,IAAI,OAAO,QAAQ;AACvC,MAAAQ,eAAc,cAAc,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IACjE;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI,OAAO,QAAQ,4DAAuD;AAC1E,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,IAAI,OAAO,QAAQ;AACrB,eAAW,UAAU,QAAS,KAAI,OAAO,KAAK,aAAa,MAAM,EAAE;AACnE,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,OAAO,IAAI;AACrC,UAAM,IAAI,UAAU,6BAA6B;AAAA,MAC/C,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,gBAAc,QAAQ,mCAAmC,GAAG,CAAC,GAAG;AAAA,IAC9D,KAAK;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,QAAQ;AAAA,EACV,CAAC;AAED,aAAW,UAAU,QAAS,KAAI,OAAO,QAAQ,MAAM;AACvD,SAAO,SAAS;AAClB;;;AClKA,SAAS,gBAAAC,sBAAoB;AA0B7B,SAAS,eAAe;AACtB,QAAM,eAAe,QAAQ,YAAY,eAAe;AACxD,QAAM,MAAM,KAAK,MAAMC,eAAa,cAAc,MAAM,CAAC;AACzD,SAAO,IAAI;AACb;AAEA,eAAsB,gBACpB,KACA,UAA+B,CAAC,GACf;AACjB,MAAI,YAAY,aAAa;AAC7B,MAAI,QAAQ,MAAO,aAAY,UAAU,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,KAAK;AAChF,MAAI,QAAQ,MAAO,aAAY,UAAU,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,KAAK;AAEhF,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK,EAAE,SAAS,iBAAiB,UAAU,CAAC;AAAA,EACzD,OAAO;AACL,eAAW,KAAK,WAAW;AACzB,UAAI,OAAO,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE;AAAA,IACvE;AAAA,EACF;AACA,SAAO,SAAS;AAClB;AAEA,eAAsB,iBACpB,KACA,UAAgC,CAAC,GAChB;AACjB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,CAAC,UAAU,IAAI;AAC5B,MAAI,QAAQ,SAAU,MAAK,KAAK,cAAc,QAAQ,QAAQ;AAE9D,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,oBAAmB;AAC1D,EAAAA,eAAc,QAAQ,YAAY,SAAS,gBAAgB,GAAG,MAAM;AAAA,IAClE,KAAK,IAAI;AAAA,IACT,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,OAAO;AAAA,EACrB,CAAC;AAED,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK,EAAE,SAAS,kBAAkB,MAAM,UAAU,QAAQ,YAAY,OAAO,IAAI,KAAK,CAAC;AAAA,EACpG;AAEA,SAAO,SAAS;AAClB;;;ACtEA,SAAS,UAAAC,SAAQ,cAAAC,cAAY,gBAAAC,gBAAc,iBAAAC,sBAAqB;AAChE,SAAS,WAAAC,iBAAe;AAUxB,eAAsB,cACpB,KACA,UAA6B,CAAC,GACb;AACjB,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,aAAaC,UAAQ,IAAI,aAAa,IAAI,OAAO,IAAI,UAAU;AACrE,QAAM,WAAWA,UAAQ,IAAI,aAAa,IAAI,OAAO,IAAI,iBAAiB,SAAS,aAAa;AAChG,QAAM,YAAYA,UAAQ,UAAU,aAAa;AAEjD,MAAI,cAAc,QAAQ;AACxB,QAAI,CAACC,aAAW,UAAU,GAAG;AAC3B,YAAM,IAAI,UAAU,WAAW,IAAI,OAAO,IAAI,UAAU,IAAI;AAAA,QAC1D,UAAU,SAAS;AAAA,QACnB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,IAAI,OAAO,UAAU,QAAQ,QAAQ;AACvC,UAAI,OAAO,KAAK,yBAAyB,UAAU,WAAM,SAAS,EAAE;AACpE,aAAO,SAAS;AAAA,IAClB;AACA,UAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,IAAS;AAC5C,IAAAA,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,IAAAC,QAAO,YAAY,SAAS;AAC5B,QAAI,OAAO,QAAQ,wBAAmB,SAAS,EAAE;AACjD,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,CAACF,aAAW,SAAS,GAAG;AAC1B,UAAM,IAAI,UAAU,0DAAqD;AAAA,MACvE,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,OAAO,UAAU,QAAQ,QAAQ;AACvC,QAAI,OAAO,KAAK,yBAAyB,SAAS,WAAM,UAAU,EAAE;AACpE,WAAO,SAAS;AAAA,EAClB;AAEA,EAAAG,eAAc,YAAYC,eAAa,WAAW,MAAM,CAAC;AACzD,MAAI,OAAO,QAAQ,qCAAgC,UAAU,EAAE;AAC/D,SAAO,SAAS;AAClB;;;ACpDA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,iBAAe;AAgBxB,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,2BAA2B,CAAC,yBAAyB,uBAAuB;AAElF,eAAsB,mBACpB,KACA,UAAkC,CAAC,GAClB;AACjB,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAA2D,CAAC;AAElE,MAAI,CAAC,QAAQ,YAAY;AACvB,UAAM,aAAa,MAAM,UAAU,GAAG;AACtC,UAAM,WAAW,eAAe,SAAS;AACzC,WAAO,KAAK,EAAE,MAAM,UAAU,IAAI,SAAS,CAAC;AAC5C,QAAI,CAAC,SAAU,UAAS,KAAK,kBAAkB;AAAA,EACjD;AAEA,QAAM,eAAe,MAAM,kBAAkB,GAAG;AAChD,QAAM,aAAa,iBAAiB,SAAS;AAC7C,SAAO,KAAK,EAAE,MAAM,mBAAmB,IAAI,WAAW,CAAC;AACvD,MAAI,CAAC,WAAY,UAAS,KAAK,2BAA2B;AAE1D,MAAI,QAAQ,qBAAqB,OAAO;AACtC,eAAW,UAAU,qBAAqB;AACxC,YAAM,OAAOC,UAAQ,IAAI,aAAa,WAAW,MAAM;AACvD,YAAM,YAAY,QAAQ,WAAW,MAAM;AAC3C,YAAM,SAASC,aAAW,IAAI,KAAKA,aAAW,SAAS;AACvD,aAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,IAAI,IAAI,OAAO,CAAC;AAClD,UAAI,CAAC,OAAQ,UAAS,KAAK,sCAAsC,MAAM,EAAE;AAAA,IAC3E;AAAA,EACF;AAEA,aAAW,OAAO,0BAA0B;AAC1C,UAAM,YAAYD,UAAQ,IAAI,aAAa,GAAG;AAC9C,UAAM,SAAS,CAACC,aAAW,SAAS;AACpC,WAAO,KAAK,EAAE,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,CAAC;AAC7C,QAAI,CAAC,OAAQ,UAAS,KAAK,qCAAqC,GAAG,EAAE;AAAA,EACvE;AAEA,QAAM,iBAAiBD,UAAQ,IAAI,aAAa,oBAAoB;AACpE,QAAM,WAAWC,aAAW,cAAc;AAC1C,SAAO,KAAK,EAAE,MAAM,sBAAsB,IAAI,SAAS,CAAC;AACxD,MAAI,CAAC,SAAU,UAAS,KAAK,GAAG,oBAAoB,UAAU;AAE9D,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK;AAAA,MACd,SAAS;AAAA,MACT,IAAI,SAAS,WAAW;AAAA,MACxB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,WAAW,SAAS,WAAW,GAAG;AAChC,QAAI,OAAO,QAAQ,yBAAyB;AAAA,EAC9C,OAAO;AACL,eAAW,KAAK,SAAU,KAAI,OAAO,MAAM,CAAC;AAAA,EAC9C;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,IAAI,UAAU,2BAA2B;AAAA,MAC7C,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO,SAAS;AAClB;;;AClEA,eAAsB,SAAS,KAAqB,UAAwB,CAAC,GAAoB;AAC/F,MAAI,UAAgD,CAAC;AAErD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,MAAM,YAAY;AAChB,cAAI,IAAI,OAAO,OAAQ;AACvB,cAAI;AACF,0BAAc,QAAQ,WAAW,2BAA2B,GAAG,CAAC,GAAG;AAAA,cACjE,KAAK,IAAI;AAAA,cACT,QAAQ,IAAI;AAAA,cACZ,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM,YAAY;AAChB,oBAAU,kBAAkB,KAAK;AAAA,YAC/B,MAAM,QAAQ;AAAA,YACd,QAAQ,IAAI,OAAO;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAC1D,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAE1D,QAAM,iBAAiB,IAAI,OAAO,MAAM,IAAI,OAAO,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO;AACxF,MAAI,gBAAgB,IAAI,MAAM,KAAK,CAAC,kBAAkB,CAAC,IAAI,OAAO,QAAQ;AACxE,UAAM,OAAO,MAAM,oBAAoB,IAAI,WAAW;AACtD,QAAI,MAAM;AACR,UAAI,OAAO,QAAQ,uBAAkB,IAAI,gCAAgC;AAAA,IAC3E;AAAA,EACF;AAEA,MACE,gBAAgB,IAAI,MAAM,KAC1B,oBAAoB,IAAI,WAAW,KACnC,CAAC,gBACD;AACA,UAAM,WAAW,MAAM,qBAAqB;AAAA,MAC1C,aAAa,IAAI;AAAA,MACjB,eAAe,uBAAuB,IAAI,WAAW;AAAA,IACvD,CAAC;AACD,QAAI,UAAU;AACZ,0BAAoB,IAAI,aAAa,QAAQ;AAC7C,UAAI,OAAO,QAAQ,mBAAmB,IAAI,WAAW,CAAC;AAAA,IACxD;AAAA,EACF;AAEA,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK;AAAA,MACd,SAAS;AAAA,MACT,IAAI,OAAO,WAAW;AAAA,MACtB,QAAQ,OAAO;AAAA,MACf,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,MACvD;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,WAAW,UAAW;AACjC,UAAI,OAAO,WAAW,UAAU;AAC9B,YAAI,OAAO,QAAQ,OAAO,MAAM;AAAA,MAClC,OAAO;AACL,YAAI,OAAO,KAAK,GAAG,OAAO,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,MACpD;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAG;AAC9C,uBAAiB,KAAK,uDAAkD;AAAA,IAC1E,WAAW,OAAO,SAAS,GAAG;AAC5B,uBAAiB,KAAK,yBAAoB,OAAO,MAAM,iBAAiB;AAAA,IAC1E;AAEA,UAAM,OAAO,gBAAgB,OAAO;AACpC,QAAI,MAAM;AACR,UAAI,OAAO,KAAK,UAAK,IAAI,EAAE;AAAA,IAC7B;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,UAAI,OAAO,KAAK,6CAAwC;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO,SAAS;AAClB;;;ACtHA,YAAYC,QAAO;;;ACAnB,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,WAAAC,iBAAe;AAgBxB,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,UAAU,MAAM,KAAK;AAC3B,MACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAChD;AACA,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AAGO,SAAS,0BAA0B,KAAoE;AAC5G,QAAM,eAAe,IAAI,MAAM,6BAA6B;AAC5D,QAAM,gBAAgB,eAAe,gBAAgB,aAAa,CAAC,CAAC,IAAI;AAExE,QAAM,UAAgC,CAAC;AACvC,MAAI,UAAqC;AACzC,MAAI,YAAY;AAEhB,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,YAAY,YAAY;AAC1B,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,CAAC,UAAW;AAEhB,UAAM,eAAe,KAAK,MAAM,0BAA0B;AAC1D,UAAM,aAAa,KAAK,MAAM,sBAAsB;AACpD,UAAM,WAAW,KAAK,MAAM,2BAA2B;AAEvD,QAAI,gBAAiB,cAAc,CAAC,KAAK,MAAM,SAAS,GAAI;AAC1D,UAAI,QAAS,SAAQ,KAAK,OAAO;AACjC,YAAM,YAAY,eAAe,CAAC,KAAK,aAAa,CAAC;AACrD,gBAAU,YAAY,EAAE,MAAM,gBAAgB,SAAS,EAAE,IAAI;AAC7D;AAAA,IACF;AAEA,QAAI,YAAY,SAAS;AACvB,cAAQ,WAAW,SAAS,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,QAAS,SAAQ,KAAK,OAAO;AAEjC,SAAO,EAAE,eAAe,QAAQ;AAClC;AAEO,SAAS,mBAAmB,aAAyC;AAC1E,QAAM,aAAaC,UAAQ,aAAa,mBAAmB;AAC3D,MAAI,CAACC,aAAW,UAAU,GAAG;AAC3B,UAAM,IAAI,UAAU,GAAG,mBAAmB,+BAA+B;AAAA,MACvE,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,QAAM,MAAMC,eAAa,YAAY,MAAM;AAC3C,QAAM,EAAE,eAAe,QAAQ,IAAI,0BAA0B,GAAG;AAEhE,SAAO,EAAE,YAAY,eAAe,QAAQ;AAC9C;AAEO,SAAS,kBACd,SACA,UAC2B;AAC3B,QAAM,SAAS,SAAS,KAAK;AAC7B,SACE,QAAQ,KAAK,CAACC,OAAMA,GAAE,SAAS,MAAM,KACrC,QAAQ,KAAK,CAACA,OAAMA,GAAE,aAAa,MAAM,KACzC;AAEJ;;;ADzEA,SAAS,iBAAiB,QAA4B,eAAsC;AAC1F,QAAM,KAAK,OAAO,WAAW,YAAY,OAAO,QAAQ,KAAK;AAC7D,QAAM,OAAO,OAAO,SAAS,gBAAgB,kBAAe;AAC5D,SAAO,GAAG,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI;AACtC;AAEA,eAAsB,cAAc,KAAqB,WAA8B,CAAC,GAAoB;AAC1G,QAAM,OAAO,mBAAmB,IAAI,WAAW;AAE/C,MAAI,IAAI,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK;AAAA,MACd,SAAS;AAAA,MACT,YAAY,KAAK;AAAA,MACjB,eAAe,KAAK;AAAA,MACpB,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,QAAI,OAAO,KAAK,iCAAiC,KAAK,UAAU,EAAE;AAClE,QAAI,OAAO,KAAK,4DAAuD;AACvE,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,KAAK,eAAe;AACtB,QAAI,OAAO,KAAK,YAAY,KAAK,aAAa,EAAE;AAAA,EAClD;AAEA,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,OAAO,KAAK,iBAAiB,QAAQ,KAAK,aAAa,CAAC;AAAA,EAC9D;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,aAAa,KAAqB,UAA4B,CAAC,GAAoB;AACvG,QAAM,OAAO,mBAAmB,IAAI,WAAW;AAE/C,MAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,UAAM,IAAI,UAAU,+CAA+C;AAAA,MACjE,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,MAAI,aAAa,QAAQ,MAAM,KAAK;AAEpC,MAAI,CAAC,YAAY;AACf,QAAI,IAAI,OAAO,MAAM,IAAI,OAAO,MAAM;AACpC,YAAM,IAAI,UAAU,sDAAsD;AAAA,QACxE,UAAU,SAAS;AAAA,QACnB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,iBAAiB,GAAG,GAAG;AAC1B,YAAM,IAAI,UAAU,8BAA8B;AAAA,QAChD,UAAU,SAAS;AAAA,QACnB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,MAAQ,UAAO;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS,KAAK,QAAQ,IAAI,CAACC,aAAY;AAAA,QACrC,OAAOA,QAAO;AAAA,QACd,OAAOA,QAAO;AAAA,QACd,MACEA,QAAO,SAAS,KAAK,gBACjB,wBAAqBA,QAAO,YAAY,OAAO,KAC/CA,QAAO,YAAY;AAAA,MAC3B,EAAE;AAAA,IACJ,CAAC;AAED,QAAM,YAAS,MAAM,GAAG;AACtB,YAAM,IAAI,UAAU,8BAA8B,EAAE,UAAU,SAAS,WAAW,CAAC;AAAA,IACrF;AAEA,iBAAa;AAAA,EACf;AAEA,QAAM,SAAS,kBAAkB,KAAK,SAAS,UAAU;AACzD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,UAAU,mBAAmB,UAAU,IAAI;AAAA,MACnD,UAAU,SAAS;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,OAAO,QAAQ;AACrB,QAAI,OAAO,KAAK,6BAA6B,OAAO,IAAI,EAAE;AAC1D,WAAO,SAAS;AAAA,EAClB;AAEA,aAAW,MAAM,CAAC,YAAY,OAAO,OAAO,IAAI,GAAG;AAAA,IACjD,KAAK,IAAI;AAAA,IACT,QAAQ,IAAI;AAAA,IACZ,QAAQ;AAAA,EACV,CAAC;AAED,MAAI,CAAC,IAAI,OAAO,QAAQ,CAAC,IAAI,OAAO,OAAO;AACzC,qBAAiB,KAAK,yBAAoB,OAAO,IAAI,EAAE;AAAA,EACzD,WAAW,IAAI,OAAO,MAAM;AAC1B,QAAI,OAAO,KAAK;AAAA,MACd,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,eAAe,OAAO;AAAA,MACtB,UAAU,OAAO,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,SAAO,SAAS;AAClB;;;AEvHA,eAAsB,SAAS,KAAqB,SAAwC;AAE1F,4BAA0B,GAAG;AAE7B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAiB,CAAC,UAAU,IAAI;AACtC,MAAI,QAAQ,QAAS,MAAK,KAAK,WAAW;AAE1C,QAAM,OAAO,MAAM,yBAAyB,QAAQ,WAAW,mBAAmB,GAAG,MAAM;AAAA,IACzF,KAAK,IAAI;AAAA,IACT,KAAK,EAAE,GAAG,QAAQ,KAAK,oBAAoB,IAAI,YAAY;AAAA,IAC3D,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,OAAO;AAAA,EACrB,CAAC;AAED,MAAI,SAAS,OAAO,SAAS,KAAK;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,SAAS;AAC7B,UAAM,IAAI,UAAU,0BAA0B,IAAI,IAAI;AAAA,MACpD,UAAU,SAAS;AAAA,MACnB,aACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,SAAO,SAAS;AAClB;;;AzCJA,SAAS,cAAsB;AAC7B,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,eAAaC,UAAQ,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC;AAGlF,WAAO,IAAI,WAAW;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,QAA0C;AAC9D,QAAM,SAAS,aAAa;AAAA,IAC1B,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,IAAI,OAAO;AAAA,EACb,CAAC;AAED,QAAM,cAAc,OAAO,WAAWC,iBAAgB;AACtD,QAAM,EAAE,OAAO,IAAI,WAAW,WAAW;AAEzC,SAAO,EAAE,aAAa,QAAQ,QAAQ,OAAO;AAC/C;AAEA,SAAS,cAAc,SAAwB;AAC7C,UACG,OAAO,oBAAoB,8BAA8B,EACzD,OAAO,QAAQ,2BAA2B,KAAK,EAC/C,OAAO,UAAU,gCAAgC,KAAK,EACtD,OAAO,aAAa,kEAAkE,KAAK,EAC3F,OAAO,WAAW,eAAe,KAAK,EACtC,OAAO,aAAa,2CAA2C,KAAK,EACpE,OAAO,aAAa,gCAAgC,KAAK,EACzD,OAAO,aAAa,0DAA0D,KAAK;AACxF;AAEA,eAAe,OAAO,IAA0C;AAC9D,MAAI;AACF,UAAM,OAAO,MAAM,GAAG;AACtB,YAAQ,KAAK,IAAI;AAAA,EACnB,SAAS,OAAO;AACd,QAAI,YAAY,KAAK,GAAG;AACtB,cAAQ,OAAO,MAAM,UAAU,MAAM,OAAO;AAAA,CAAI;AAChD,UAAI,MAAM,aAAa;AACrB,gBAAQ,OAAO,MAAM,UAAK,MAAM,WAAW;AAAA,CAAI;AAAA,MACjD;AACA,cAAQ,KAAK,MAAM,QAAQ;AAAA,IAC7B;AACA,YAAQ,OAAO,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,CAAI;AACzF,YAAQ,KAAK,SAAS,QAAQ;AAAA,EAChC;AACF;AAEO,SAAS,gBAAyB;AACvC,QAAMC,WAAU,IAAI,QAAQ,EACzB,KAAK,IAAI,EACT,YAAY,uEAAkE,EAC9E,QAAQ,YAAY,CAAC,EACrB,YAAY,SAAS,2EAAqE;AAE7F,gBAAcA,QAAO;AAErB,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,kEAAkE,EAC9E,OAAO,YAAY;AAClB,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,EACpD,CAAC;AAEH,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,wFAAwF,EACpG,OAAO,iBAAiB,2EAAsE,EAC9F,OAAO,OAAO,SAA4B;AACzC,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM;AAAA,MAAO,MACX,SAAS,aAAa,MAAM,GAAG;AAAA,QAC7B,MAAM,KAAK,OAAO,eAAe,KAAK,IAAI,IAAI;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,QAAM,YAAYA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,uBAAuB;AAE/E,YACG,QAAQ,UAAU,EAClB,YAAY,wBAAwB,EACpC,OAAO,YAAY;AAClB,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,kBAAkB,aAAa,MAAM,CAAC,CAAC;AAAA,EAC5D,CAAC;AAEH,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,yBAAyB,qDAAqD,EACrF,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,0BAA0B,yDAAoD,EACrF,OAAO,mBAAmB,qEAAgE,EAC1F;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,OAAO,SAMD;AACN,YAAM,SAASA,SAAQ,KAAuB;AAC9C,YAAM,SAAS,aAAa;AAAA,QAC1B,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,QACb,IAAI,OAAO;AAAA,MACb,CAAC;AACD,YAAM,MAAsB;AAAA,QAC1B,aAAa,QAAQ,IAAI;AAAA,QACzB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACA,YAAM,aACJ,KAAK,WAAW,aAAa,KAAK,WAAW,UAAU,KAAK,WAAW,SACnE,KAAK,SACL;AAEN,YAAM;AAAA,QAAO,MACX,QAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,MAAM,KAAK;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,QAAQ;AAAA,UACR,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EAAC;AAEH,EAAAA,SACG,QAAQ,SAAS,EACjB,YAAY,oDAAoD,EAChE,OAAO,YAAY;AAClB,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,WAAW,aAAa,MAAM,CAAC,CAAC;AAAA,EACrD,CAAC;AAEH,EAAAA,SACG,QAAQ,KAAK,EACb,MAAM,OAAO,EACb,YAAY,0DAA0D,EACtE,OAAO,qBAAqB,QAAQ,MAAM,EAC1C,OAAO,OAAO,SAA2B;AACxC,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,OAAO,aAAa,MAAM,GAAG,EAAE,MAAM,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,EAC9E,CAAC;AAEH,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,6CAA6C,EACzD,OAAO,iBAAiB,oBAAoB,kBAAkB,EAC9D,OAAO,cAAc,iBAAiB,EACtC,OAAO,kBAAkB,qBAAqB,EAC9C,OAAO,aAAa,0BAA0B,EAC9C;AAAA,IACC,OAAO,SAKD;AACJ,YAAM,SAASA,SAAQ,KAAuB;AAC9C,YAAM;AAAA,QAAO,MACX,SAAS,aAAa,MAAM,GAAG;AAAA,UAC7B,MAAM,eAAe,KAAK,IAAI;AAAA,UAC9B,SAAS,KAAK;AAAA,UACd,aAAa,KAAK;AAAA,UAClB,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEF,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,OAAO,iBAAiB,oBAAoB,kBAAkB,EAC9D,OAAO,kBAAkB,kBAAkB,EAC3C,OAAO,iBAAiB,0DAA0D,EAClF,OAAO,OAAO,SAAwE;AACrF,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM;AAAA,MAAO,MACX,UAAU,aAAa,MAAM,GAAG;AAAA,QAC9B,MAAM,eAAe,KAAK,IAAI;AAAA,QAC9B,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,EAAAA,SACG,QAAQ,SAAS,EACjB,YAAY,0CAA0C,EACtD,OAAO,iBAAiB,oBAAoB,kBAAkB,EAC9D,OAAO,aAAa,oCAAoC,EACxD,OAAO,OAAO,SAA6C;AAC1D,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM;AAAA,MAAO,MACX,WAAW,aAAa,MAAM,GAAG;AAAA,QAC/B,MAAM,eAAe,KAAK,IAAI;AAAA,QAC9B,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,QAAM,QAAQA,SAAQ,QAAQ,OAAO,EAAE,YAAY,cAAc;AAEjE,QACG,QAAQ,aAAa,EACrB,YAAY,+CAA+C,EAC3D,OAAO,YAAY;AAClB,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,mBAAmB,aAAa,MAAM,CAAC,CAAC;AAAA,EAC7D,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,0CAA0C,EACtD,OAAO,oBAAoB,oBAAoB,EAC/C,OAAO,OAAO,SAAgC;AAC7C,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,MAAM,aAAa,MAAM;AAC/B,UAAM,WAAW,KAAK,YAAY,mBAAmB,IAAI,aAAa,IAAI,MAAM;AAChF,UAAM,OAAO,MAAM,eAAe,KAAK,EAAE,aAAa,SAAS,CAAC,CAAC;AAAA,EACnE,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,wCAAwC,EACpD,OAAO,oBAAoB,oBAAoB,EAC/C,OAAO,OAAO,SAAgC;AAC7C,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,MAAM,aAAa,MAAM;AAC/B,UAAM,WAAW,KAAK,YAAY,mBAAmB,IAAI,aAAa,IAAI,MAAM;AAChF,UAAM,OAAO,MAAM,wBAAwB,KAAK,EAAE,aAAa,SAAS,CAAC,CAAC;AAAA,EAC5E,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,kDAAkD,EAC9D,OAAO,YAAY;AAClB,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,gBAAgB,aAAa,MAAM,CAAC,CAAC;AAAA,EAC1D,CAAC;AAEH,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,8BAA8B;AAEnF,SACG,QAAQ,MAAM,EACd,YAAY,sCAAsC,EAClD,OAAO,qBAAqB,eAAe,MAAM,EACjD,OAAO,OAAO,SAAgC;AAC7C,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,YAAY,KAAK,cAAc,SAAS,SAAS;AACvD,UAAM,OAAO,MAAM,cAAc,aAAa,MAAM,GAAG,EAAE,UAAU,CAAC,CAAC;AAAA,EACvE,CAAC;AAEH,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,uBAAuB;AAEhF,WACG,QAAQ,MAAM,EACd,YAAY,4CAA4C,EACxD,OAAO,mBAAmB,gBAAgB,EAC1C,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,OAAO,SAA6C;AAC1D,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM;AAAA,MAAO,MACX,gBAAgB,aAAa,MAAM,GAAG;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,OAAO,EACf,YAAY,oDAAoD,EAChE,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,iBAAiB,iBAAiB,QAAQ,EACjD,OAAO,OAAO,SAA8C;AAC3D,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,KAAK,SAAS,SAAS,SAAS;AAC7C,UAAM;AAAA,MAAO,MACX,iBAAiB,aAAa,MAAM,GAAG,EAAE,UAAU,KAAK,UAAU,KAAK,CAAC;AAAA,IAC1E;AAAA,EACF,CAAC;AAEH,QAAM,aAAaA,SAAQ,QAAQ,YAAY,EAAE,YAAY,iCAAiC;AAE9F,aACG,QAAQ,OAAO,EACf,YAAY,qDAAqD,EACjE,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,OAAO,SAAmC;AAChD,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM;AAAA,MAAO,MACX,mBAAmB,aAAa,MAAM,GAAG,EAAE,YAAY,KAAK,WAAW,CAAC;AAAA,IAC1E;AAAA,EACF,CAAC;AAEH,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,8DAA8D,EAC1E,OAAO,iBAAiB,oBAAoB,kBAAkB,EAC9D,OAAO,aAAa,6BAA6B,EACjD,OAAO,OAAO,SAA8C;AAC3D,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,eAAe,KAAK,IAAI;AACrC,UAAM;AAAA,MAAO,MACX,SAAS,aAAa,MAAM,GAAG;AAAA,QAC7B,MAAM,SAAS,SAAS,SAAS,SAAS,QAAQ,QAAQ;AAAA,QAC1D,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,sDAAsD,EAClE,OAAO,iBAAiB,oBAAoB,kBAAkB,EAC9D,OAAO,OAAO,SAA2B;AACxC,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM;AAAA,MAAO,MACX,UAAU,aAAa,MAAM,GAAG,EAAE,MAAM,eAAe,KAAK,IAAI,EAAE,CAAC;AAAA,IACrE;AAAA,EACF,CAAC;AAEH,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,YAAY;AAClB,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,MAAM,aAAa,MAAM;AAC/B,UAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,oBAAgB;AACpD,IAAAA,YAAW,MAAM,CAAC,MAAM,GAAG;AAAA,MACzB,KAAK,IAAI;AAAA,MACT,QAAQ,IAAI;AAAA,MACZ,QAAQ,IAAI,OAAO;AAAA,IACrB,CAAC;AACD,YAAQ,KAAK,SAAS,OAAO;AAAA,EAC/B,CAAC;AAEH,QAAM,SAASD,SAAQ,QAAQ,QAAQ,EAAE,YAAY,kCAAkC;AAEvF,SACG,QAAQ,MAAM,EACd,MAAM,IAAI,EACV,YAAY,sCAAsC,EAClD,OAAO,YAAY;AAClB,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,cAAc,aAAa,MAAM,CAAC,CAAC;AAAA,EACxD,CAAC;AAEH,SACG,QAAQ,YAAY,EACpB,YAAY,qCAAqC,EACjD,OAAO,OAAO,SAAkB;AAC/B,UAAM,SAASA,SAAQ,KAAuB;AAC9C,UAAM,OAAO,MAAM,aAAa,aAAa,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;AAAA,EACjE,CAAC;AAEH,SAAOA;AACT;;;A0CzZA,IAAM,UAAU,cAAc;AAC9B,QAAQ,MAAM,QAAQ,IAAI;","names":["readFileSync","resolve","readFileSync","existsSync","resolve","resolve","existsSync","findProjectRoot","findProjectRoot","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","pc","resolve","spinner","pc","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","steps","existsSync","readFileSync","resolve","p","spawnSync","spawnSync","existsSync","resolve","existsSync","resolve","existsSync","resolve","resolve","existsSync","readFileSync","resolve","pc","readFileSync","resolve","readFileSync","resolve","text","pc","resolve","resolve","existsSync","readFileSync","writeFileSync","resolve","resolve","resolve","resolve","existsSync","mkdirSync","readFileSync","resolve","join","readFileSync","existsSync","join","resolve","mkdirSync","cpSync","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","basename","resolve","p","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","resolve","existsSync","readFileSync","writeFileSync","resolve","p","existsSync","readFileSync","resolve","writeFileSync","existsSync","writeFileSync","resolve","envFileForTier","existsSync","resolve","writeFileSync","existsSync","readdirSync","resolve","basename","mkdirSync","cpSync","writeFileSync","readFileSync","cpSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","writeFileSync","join","resolve","existsSync","readFileSync","resolve","mkdirSync","join","cpSync","readdirSync","rmSync","legacyConfigPath","writeFileSync","readFileSync","readFileSync","runNodeScript","cpSync","existsSync","readFileSync","writeFileSync","resolve","resolve","existsSync","mkdirSync","cpSync","writeFileSync","readFileSync","existsSync","resolve","resolve","existsSync","p","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","p","portal","readFileSync","resolve","findProjectRoot","program","runCommand"]}