@brewnet/cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +184 -0
- package/dist/admin-server-DQVIEHV3.js +14 -0
- package/dist/admin-server-DQVIEHV3.js.map +1 -0
- package/dist/boilerplate-manager-P6QYUU7Q.js +29 -0
- package/dist/boilerplate-manager-P6QYUU7Q.js.map +1 -0
- package/dist/chunk-2VWMDHGI.js +1393 -0
- package/dist/chunk-2VWMDHGI.js.map +1 -0
- package/dist/chunk-4TJMJZMO.js +1173 -0
- package/dist/chunk-4TJMJZMO.js.map +1 -0
- package/dist/chunk-BAVGYMGA.js +114 -0
- package/dist/chunk-BAVGYMGA.js.map +1 -0
- package/dist/chunk-DH2VK3YI.js +293 -0
- package/dist/chunk-DH2VK3YI.js.map +1 -0
- package/dist/chunk-HCHY5UIQ.js +301 -0
- package/dist/chunk-HCHY5UIQ.js.map +1 -0
- package/dist/chunk-JFPHGZ6Z.js +254 -0
- package/dist/chunk-JFPHGZ6Z.js.map +1 -0
- package/dist/chunk-SIXBB6JU.js +2973 -0
- package/dist/chunk-SIXBB6JU.js.map +1 -0
- package/dist/chunk-SYV6PK3R.js +181 -0
- package/dist/chunk-SYV6PK3R.js.map +1 -0
- package/dist/chunk-ZKMWE5AH.js +444 -0
- package/dist/chunk-ZKMWE5AH.js.map +1 -0
- package/dist/cloudflare-client-TFT6VCXF.js +32 -0
- package/dist/cloudflare-client-TFT6VCXF.js.map +1 -0
- package/dist/compose-generator-O7GSIJ2S.js +19 -0
- package/dist/compose-generator-O7GSIJ2S.js.map +1 -0
- package/dist/frameworks-Z7VXDGP4.js +18 -0
- package/dist/frameworks-Z7VXDGP4.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +7897 -0
- package/dist/index.js.map +1 -0
- package/dist/services/admin-daemon.d.ts +2 -0
- package/dist/services/admin-daemon.js +33 -0
- package/dist/services/admin-daemon.js.map +1 -0
- package/dist/stacks-M4FBTVO5.js +16 -0
- package/dist/stacks-M4FBTVO5.js.map +1 -0
- package/dist/state-2SI3P4JG.js +27 -0
- package/dist/state-2SI3P4JG.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wizard/state.ts","../src/config/defaults.ts","../src/utils/logger.ts","../src/utils/log-rotation.ts"],"sourcesContent":["/**\n * T022 — WizardState Management\n *\n * Handles create/load/save/reset of wizard state, schema migration,\n * resume detection, and persistence.\n *\n * State files: ~/.brewnet/projects/<name>/selections.json\n * Global config: ~/.brewnet/config.json (via conf package)\n *\n * @module wizard/state\n */\n\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n readdirSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport Conf from 'conf';\nimport { SCHEMA_VERSION } from '@brewnet/shared';\nimport type { WizardState } from '@brewnet/shared';\nimport { createDefaultWizardState } from '../config/defaults.js';\nimport { logger } from '../utils/logger.js';\n\n// ---------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------\n\nconst BREWNET_DIR = join(homedir(), '.brewnet');\nconst PROJECTS_DIR = join(BREWNET_DIR, 'projects');\n\n/**\n * Get the project directory for a given project name.\n */\nexport function getProjectDir(projectName: string): string {\n return join(PROJECTS_DIR, projectName);\n}\n\n/**\n * Get the state file path for a given project name.\n */\nexport function getStateFilePath(projectName: string): string {\n return join(getProjectDir(projectName), 'selections.json');\n}\n\n// ---------------------------------------------------------------------------\n// Global Config (lazy-initialized)\n// ---------------------------------------------------------------------------\n\ninterface GlobalConfig {\n lastProject: string;\n}\n\nlet _globalConfig: Conf<GlobalConfig> | null = null;\n\nfunction getGlobalConfig(): Conf<GlobalConfig> {\n if (!_globalConfig) {\n mkdirSync(BREWNET_DIR, { recursive: true });\n _globalConfig = new Conf<GlobalConfig>({\n cwd: BREWNET_DIR,\n configName: 'config',\n defaults: { lastProject: '' },\n });\n }\n return _globalConfig;\n}\n\n// ---------------------------------------------------------------------------\n// State Operations\n// ---------------------------------------------------------------------------\n\n/**\n * Create a fresh default WizardState (schema v5).\n */\nexport function createState(): WizardState {\n return createDefaultWizardState();\n}\n\n/**\n * Check if a previous wizard session exists for the given project name.\n */\nexport function hasResumeState(projectName: string): boolean {\n return existsSync(getStateFilePath(projectName));\n}\n\n/**\n * Load wizard state from disk.\n *\n * Returns null if:\n * - No state file exists\n * - The state is corrupt/unparsable\n * - Schema version < current (migration = reset)\n *\n * NOTE: This performs lenient validation (schema version check only).\n * Full Zod validation happens at the Review step since in-progress\n * wizard states may have incomplete fields (e.g., empty passwords).\n */\nexport function loadState(projectName: string): WizardState | null {\n const filePath = getStateFilePath(projectName);\n if (!existsSync(filePath)) return null;\n\n try {\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n\n if (typeof parsed !== 'object' || parsed === null) {\n logger.warn('wizard', 'Saved state is not an object', { projectName });\n return null;\n }\n\n const obj = parsed as Record<string, unknown>;\n\n // Schema migration: v6 → v7 (frontend: array → single value | null)\n if (\n typeof obj.schemaVersion === 'number' &&\n obj.schemaVersion === 6\n ) {\n logger.warn(\n 'wizard',\n `Schema version 6 detected — migrating to v7 (frontend array → single value)`,\n { projectName },\n );\n const devStack = obj.devStack as Record<string, unknown> | undefined;\n if (devStack && Array.isArray(devStack.frontend)) {\n const arr = devStack.frontend as string[];\n // Map old array values to new single values\n if (arr.includes('reactjs') || arr.includes('react')) {\n devStack.frontend = 'react';\n } else if (arr.includes('vuejs') || arr.includes('vue')) {\n devStack.frontend = 'vue';\n } else {\n devStack.frontend = null;\n }\n }\n obj.schemaVersion = SCHEMA_VERSION;\n }\n\n // Schema migration: version < current → reset\n if (\n typeof obj.schemaVersion === 'number' &&\n obj.schemaVersion < SCHEMA_VERSION\n ) {\n logger.warn(\n 'wizard',\n `Schema version ${obj.schemaVersion} is outdated (current: ${SCHEMA_VERSION}). Resetting state.`,\n { projectName },\n );\n return null;\n }\n\n // Must have the current schema version\n if (obj.schemaVersion !== SCHEMA_VERSION) {\n logger.warn('wizard', 'Schema version mismatch', {\n projectName,\n found: obj.schemaVersion,\n expected: SCHEMA_VERSION,\n });\n return null;\n }\n\n // Backfill domainConnections for existing v7 state files (added in 003-domain-external-access)\n if (!Array.isArray(obj.domainConnections)) {\n obj.domainConnections = [];\n }\n\n return parsed as WizardState;\n } catch (err) {\n logger.warn('wizard', 'Failed to load saved state', {\n projectName,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n}\n\n/**\n * Save wizard state to disk.\n * Also updates the global config with the last active project name.\n */\nexport function saveState(state: WizardState): void {\n const dir = getProjectDir(state.projectName);\n mkdirSync(dir, { recursive: true });\n\n const filePath = join(dir, 'selections.json');\n writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');\n\n try {\n getGlobalConfig().set('lastProject', state.projectName);\n } catch {\n // Non-critical: global config write failure doesn't block wizard\n }\n\n logger.info('wizard', 'State saved', { projectName: state.projectName });\n}\n\n/**\n * Reset state by creating a fresh default and saving it.\n */\nexport function resetState(projectName: string): WizardState {\n const state = createDefaultWizardState();\n const updated: WizardState = {\n ...state,\n projectName,\n projectPath: `~/brewnet/${projectName}`,\n };\n saveState(updated);\n return updated;\n}\n\n/**\n * Get the last active project name from global config.\n * Returns undefined if no project has been saved yet.\n */\nexport function getLastProject(): string | undefined {\n try {\n const last = getGlobalConfig().get('lastProject');\n return last || undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * List all project names that have saved wizard state.\n */\nexport function listProjects(): string[] {\n if (!existsSync(PROJECTS_DIR)) return [];\n\n try {\n return readdirSync(PROJECTS_DIR, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .filter((entry) =>\n existsSync(join(PROJECTS_DIR, entry.name, 'selections.json')),\n )\n .map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\n/**\n * Reset the global config singleton (for testing).\n * @internal\n */\nexport function _resetGlobalConfig(): void {\n _globalConfig = null;\n}\n","/**\n * @module defaults\n * @description Default values for the Brewnet installation wizard state.\n * Provides factory functions for creating a fresh WizardState and for\n * applying Full Install / Partial Install presets.\n *\n * Task: T021 — Phase 2 Config Registries\n */\n\nimport type { WizardState } from '@brewnet/shared';\nimport { SCHEMA_VERSION } from '@brewnet/shared';\n\n// ---------------------------------------------------------------------------\n// Factory — creates a blank default WizardState\n// ---------------------------------------------------------------------------\n\n/**\n * Create a fresh WizardState populated with sensible defaults.\n *\n * - `admin.password` and `dbServer.dbPassword` are left as empty strings;\n * they should be auto-generated at wizard runtime.\n */\nexport function createDefaultWizardState(): WizardState {\n return {\n schemaVersion: SCHEMA_VERSION,\n projectName: 'my-homeserver',\n projectPath: '~/brewnet/my-homeserver',\n setupType: 'full',\n\n admin: {\n username: 'admin',\n password: '',\n storage: 'local',\n },\n\n servers: {\n webServer: { enabled: true, service: 'traefik' },\n fileServer: { enabled: false, service: '' },\n gitServer: { enabled: true, service: 'gitea', port: 3000, sshPort: 3022 },\n dbServer: {\n enabled: true,\n primary: 'postgresql',\n primaryVersion: '18.3',\n dbName: 'brewnet_db',\n dbUser: 'brewnet',\n dbPassword: '',\n adminUI: true,\n pgadminEmail: '',\n cache: '',\n },\n media: { enabled: false, services: [] },\n sshServer: { enabled: false, port: 2222, passwordAuth: false, sftp: false },\n appServer: { enabled: false },\n fileBrowser: { enabled: false, mode: '' },\n },\n\n portRemapping: {},\n\n devStack: {\n languages: [],\n frameworks: {},\n frontend: null,\n },\n\n boilerplate: {\n generate: true,\n sampleData: true,\n devMode: 'hot-reload',\n },\n\n domain: {\n provider: 'local',\n name: 'brewnet.local',\n ssl: 'self-signed',\n cloudflare: {\n enabled: false,\n tunnelMode: 'none',\n quickTunnelUrl: '',\n accountId: '',\n apiToken: '',\n tunnelId: '',\n tunnelToken: '',\n tunnelName: '',\n zoneId: '',\n zoneName: '',\n },\n },\n\n domainConnections: [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Presets\n// ---------------------------------------------------------------------------\n\n/**\n * Full Install defaults.\n *\n * Enables: Web Server (Traefik) + Git Server (Gitea) + DB (PostgreSQL + Redis).\n * Everything else remains at the base default (disabled).\n */\nexport function applyFullInstallDefaults(state: WizardState): WizardState {\n return {\n ...state,\n setupType: 'full',\n servers: {\n ...state.servers,\n webServer: { enabled: true, service: 'traefik' },\n gitServer: { enabled: true, service: 'gitea', port: 3000, sshPort: 3022 },\n dbServer: {\n ...state.servers.dbServer,\n enabled: true,\n primary: 'postgresql',\n primaryVersion: '18.3',\n dbName: 'brewnet_db',\n dbUser: 'brewnet',\n adminUI: true,\n pgadminEmail: '',\n cache: '',\n },\n },\n };\n}\n\n/**\n * Partial Install defaults.\n *\n * Enables only: Web Server (Traefik) + Git Server (Gitea).\n * Database and all other optional components are disabled.\n */\nexport function applyPartialInstallDefaults(state: WizardState): WizardState {\n return {\n ...state,\n setupType: 'partial',\n servers: {\n ...state.servers,\n webServer: { enabled: true, service: 'traefik' },\n fileServer: { enabled: false, service: '' },\n gitServer: { enabled: true, service: 'gitea', port: 3000, sshPort: 3022 },\n dbServer: {\n enabled: false,\n primary: '',\n primaryVersion: '',\n dbName: '',\n dbUser: '',\n dbPassword: '',\n adminUI: false,\n pgadminEmail: '',\n cache: '',\n },\n media: { enabled: false, services: [] },\n sshServer: { enabled: false, port: 2222, passwordAuth: false, sftp: false },\n appServer: { enabled: false },\n fileBrowser: { enabled: false, mode: '' },\n },\n };\n}\n\n/**\n * Minimal Install defaults.\n *\n * Enables only: Web Server (Traefik) + Git Server (Gitea) + Quick Tunnel.\n * No database, no boilerplate cloning. Fastest path to a running server.\n */\nexport function applyMinimalInstallDefaults(state: WizardState): WizardState {\n return {\n ...state,\n setupType: 'minimal',\n servers: {\n ...state.servers,\n webServer: { enabled: true, service: 'traefik' },\n fileServer: { enabled: false, service: '' },\n gitServer: { enabled: true, service: 'gitea', port: 3000, sshPort: 3022 },\n dbServer: {\n enabled: false,\n primary: '',\n primaryVersion: '',\n dbName: '',\n dbUser: '',\n dbPassword: '',\n adminUI: false,\n pgadminEmail: '',\n cache: '',\n },\n media: { enabled: false, services: [] },\n sshServer: { enabled: false, port: 2222, passwordAuth: false, sftp: false },\n appServer: { enabled: false },\n fileBrowser: { enabled: false, mode: '' },\n },\n domain: {\n ...state.domain,\n provider: 'local',\n cloudflare: {\n ...state.domain.cloudflare,\n enabled: true,\n tunnelMode: 'quick',\n },\n },\n boilerplate: {\n ...state.boilerplate,\n generate: false,\n },\n devStack: {\n ...state.devStack,\n languages: [],\n },\n };\n}\n","/**\n * Brewnet CLI — Structured Logger (T106)\n *\n * Writes daily JSONL log files to a configurable logs directory.\n * Each log entry is a single JSON line appended to the file\n * named by date (e.g. brewnet-2026-02-23.log).\n *\n * Usage:\n * import { createLogger } from './utils/logger';\n * const logger = createLogger('/path/to/logs');\n * logger.info('init', 'Wizard started');\n * logger.warn('deploy', 'Slow build', { duration: 12000 });\n * logger.error('up', 'Container failed', { service: 'redis' });\n *\n * @module utils/logger\n */\n\nimport { existsSync, mkdirSync, appendFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { CLI_LOG_RETENTION_DAYS } from '@brewnet/shared';\nimport { cleanOldCliLogs } from './log-rotation.js';\n\nexport type LogLevel = 'info' | 'warn' | 'error';\n\nexport interface LogEntry {\n timestamp: string;\n level: LogLevel;\n command: string;\n message: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface Logger {\n info(command: string, message: string, metadata?: Record<string, unknown>): void;\n warn(command: string, message: string, metadata?: Record<string, unknown>): void;\n error(command: string, message: string, metadata?: Record<string, unknown>): void;\n}\n\n/**\n * Create a Logger that writes daily JSONL log files into `logsDir`.\n *\n * - Creates the directory (recursively) if it doesn't already exist.\n * - Each call to info/warn/error appends a single JSON line to\n * `<logsDir>/brewnet-YYYY-MM-DD.log`.\n * - Daily rotation is automatic: a new file is started each calendar day.\n *\n * @param logsDir - Absolute path to the directory where log files are stored.\n */\nexport function createLogger(logsDir: string): Logger {\n // Eagerly ensure the log directory exists.\n if (!existsSync(logsDir)) {\n mkdirSync(logsDir, { recursive: true });\n }\n\n // Clean up old CLI log files (non-blocking, never prevents logger creation)\n try {\n cleanOldCliLogs(logsDir, CLI_LOG_RETENTION_DAYS);\n } catch {\n // Rotation failure must never crash the CLI\n }\n\n function write(\n level: LogLevel,\n command: string,\n message: string,\n metadata?: Record<string, unknown>,\n ): void {\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n command,\n message,\n metadata: metadata ?? {},\n };\n\n const dateStr = new Date().toISOString().slice(0, 10);\n const filePath = join(logsDir, `brewnet-${dateStr}.log`);\n\n try {\n appendFileSync(filePath, JSON.stringify(entry) + '\\n', 'utf-8');\n } catch {\n // Logging should never crash the CLI. If the write fails (e.g. disk full,\n // permission denied), we silently drop the entry.\n }\n }\n\n return {\n info(command: string, message: string, metadata?: Record<string, unknown>): void {\n write('info', command, message, metadata);\n },\n warn(command: string, message: string, metadata?: Record<string, unknown>): void {\n write('warn', command, message, metadata);\n },\n error(command: string, message: string, metadata?: Record<string, unknown>): void {\n write('error', command, message, metadata);\n },\n };\n}\n\n/**\n * Default global logger instance.\n * Uses ~/.brewnet/logs/ as the log directory.\n */\nexport const logger = createLogger(join(homedir(), '.brewnet', 'logs'));\n","/**\n * Log Rotation — manages log file lifecycle for non-Docker sources.\n *\n * - CLI logs: delete files older than CLI_LOG_RETENTION_DAYS\n * - Tunnel/Access logs: copytruncate rotation at ACCESS_LOG_MAX_BYTES\n *\n * @module utils/log-rotation\n */\n\nimport {\n existsSync,\n readdirSync,\n statSync,\n unlinkSync,\n copyFileSync,\n renameSync,\n truncateSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport {\n CLI_LOG_RETENTION_DAYS,\n ACCESS_LOG_MAX_BYTES,\n} from '@brewnet/shared';\n\n/**\n * Delete CLI log files older than `retentionDays`.\n *\n * Parses the date from the filename pattern `brewnet-YYYY-MM-DD.log`\n * and deletes files whose date is before the retention threshold.\n */\nexport function cleanOldCliLogs(logsDir: string, retentionDays: number): number {\n if (!existsSync(logsDir)) return 0;\n\n const now = Date.now();\n const thresholdMs = retentionDays * 24 * 60 * 60 * 1000;\n let deleted = 0;\n\n const files = readdirSync(logsDir).filter((f) =>\n /^brewnet-\\d{4}-\\d{2}-\\d{2}\\.log$/.test(f),\n );\n\n for (const file of files) {\n const dateStr = file.replace('brewnet-', '').replace('.log', '');\n const fileDate = new Date(dateStr + 'T00:00:00Z');\n if (isNaN(fileDate.getTime())) continue;\n\n if (now - fileDate.getTime() > thresholdMs) {\n try {\n unlinkSync(join(logsDir, file));\n deleted++;\n } catch {\n // Skip files that can't be deleted\n }\n }\n }\n\n return deleted;\n}\n\n/**\n * Rotate a large file using the copytruncate strategy.\n *\n * 1. Shift existing rotated files: .4 → .5, .3 → .4, etc.\n * 2. Copy current file to .1\n * 3. Truncate the original file to 0 bytes\n *\n * This preserves the file handle for processes writing to the original file.\n *\n * @returns true if rotation was performed, false if file is under the size limit\n */\nexport function rotateLargeFile(\n filePath: string,\n maxBytes: number,\n maxFiles: number,\n): boolean {\n if (!existsSync(filePath)) return false;\n\n const stat = statSync(filePath);\n if (stat.size < maxBytes) return false;\n\n // Shift existing rotated files (delete oldest if at max)\n const oldest = `${filePath}.${maxFiles}`;\n if (existsSync(oldest)) {\n try {\n unlinkSync(oldest);\n } catch {\n // Best effort\n }\n }\n\n // Shift .N-1 → .N, .N-2 → .N-1, etc.\n for (let i = maxFiles - 1; i >= 1; i--) {\n const src = `${filePath}.${i}`;\n const dst = `${filePath}.${i + 1}`;\n if (existsSync(src)) {\n try {\n renameSync(src, dst);\n } catch {\n // Best effort\n }\n }\n }\n\n // Copy current → .1, then truncate original\n try {\n copyFileSync(filePath, `${filePath}.1`);\n truncateSync(filePath, 0);\n } catch {\n // If copy/truncate fails, don't lose data\n return false;\n }\n\n return true;\n}\n\n/**\n * Run all rotation tasks for non-Docker log sources.\n *\n * - CLI logs: delete files older than 30 days\n * - Tunnel log: copytruncate at 50MB × 5 copies\n * - Access log: copytruncate at 50MB × 5 copies\n */\nexport function runRotation(logsDir: string, projectPath: string): void {\n // CLI log retention\n try {\n cleanOldCliLogs(logsDir, CLI_LOG_RETENTION_DAYS);\n } catch {\n // Non-critical\n }\n\n // Tunnel log rotation\n const tunnelLog = join(logsDir, 'tunnel.log');\n try {\n rotateLargeFile(tunnelLog, ACCESS_LOG_MAX_BYTES, 5);\n } catch {\n // Non-critical\n }\n\n // Access log rotation\n const accessLog = join(projectPath, 'logs', 'access.log');\n try {\n rotateLargeFile(accessLog, ACCESS_LOG_MAX_BYTES, 5);\n } catch {\n // Non-critical\n }\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","readdirSync","homedir","join","existsSync","join","existsSync","join","join","homedir","mkdirSync","existsSync","readdirSync"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
buildTokenCreationUrl,
|
|
4
|
+
configureTunnelIngress,
|
|
5
|
+
createDnsRecord,
|
|
6
|
+
createTunnel,
|
|
7
|
+
deleteDnsRecord,
|
|
8
|
+
deleteTunnel,
|
|
9
|
+
fetchWithRetry,
|
|
10
|
+
getAccounts,
|
|
11
|
+
getActiveServiceRoutes,
|
|
12
|
+
getDnsRecords,
|
|
13
|
+
getTunnelHealth,
|
|
14
|
+
getZones,
|
|
15
|
+
verifyToken
|
|
16
|
+
} from "./chunk-JFPHGZ6Z.js";
|
|
17
|
+
export {
|
|
18
|
+
buildTokenCreationUrl,
|
|
19
|
+
configureTunnelIngress,
|
|
20
|
+
createDnsRecord,
|
|
21
|
+
createTunnel,
|
|
22
|
+
deleteDnsRecord,
|
|
23
|
+
deleteTunnel,
|
|
24
|
+
fetchWithRetry,
|
|
25
|
+
getAccounts,
|
|
26
|
+
getActiveServiceRoutes,
|
|
27
|
+
getDnsRecords,
|
|
28
|
+
getTunnelHealth,
|
|
29
|
+
getZones,
|
|
30
|
+
verifyToken
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=cloudflare-client-TFT6VCXF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
addExternalLabels,
|
|
4
|
+
addQuickTunnelAppLabels,
|
|
5
|
+
composeConfigToYaml,
|
|
6
|
+
generateComposeConfig,
|
|
7
|
+
patchCloudflaredToNamedTunnel,
|
|
8
|
+
removeExternalLabels
|
|
9
|
+
} from "./chunk-4TJMJZMO.js";
|
|
10
|
+
import "./chunk-HCHY5UIQ.js";
|
|
11
|
+
export {
|
|
12
|
+
addExternalLabels,
|
|
13
|
+
addQuickTunnelAppLabels,
|
|
14
|
+
composeConfigToYaml,
|
|
15
|
+
generateComposeConfig,
|
|
16
|
+
patchCloudflaredToNamedTunnel,
|
|
17
|
+
removeExternalLabels
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=compose-generator-O7GSIJ2S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
FRONTEND_REGISTRY,
|
|
4
|
+
LANGUAGE_REGISTRY,
|
|
5
|
+
getAllFrontendTechs,
|
|
6
|
+
getAllLanguages,
|
|
7
|
+
getFrameworksForLanguage,
|
|
8
|
+
resolveStackId
|
|
9
|
+
} from "./chunk-BAVGYMGA.js";
|
|
10
|
+
export {
|
|
11
|
+
FRONTEND_REGISTRY,
|
|
12
|
+
LANGUAGE_REGISTRY,
|
|
13
|
+
getAllFrontendTechs,
|
|
14
|
+
getAllLanguages,
|
|
15
|
+
getFrameworksForLanguage,
|
|
16
|
+
resolveStackId
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=frameworks-Z7VXDGP4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Brewnet CLI — Entry Point
|
|
5
|
+
*
|
|
6
|
+
* Exports `createProgram()` which builds and returns the Commander.js
|
|
7
|
+
* program with all subcommands registered. The program is NOT parsed
|
|
8
|
+
* here so that tests can inspect it without triggering side effects.
|
|
9
|
+
*
|
|
10
|
+
* @module cli/index
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Build and return a fully configured Commander.js program with all
|
|
15
|
+
* Brewnet CLI subcommands registered.
|
|
16
|
+
*
|
|
17
|
+
* The caller is responsible for invoking `program.parse()` when ready
|
|
18
|
+
* to execute (this keeps the function pure and testable).
|
|
19
|
+
*/
|
|
20
|
+
declare function createProgram(): Command;
|
|
21
|
+
|
|
22
|
+
export { createProgram };
|