@ollie-shop/cli 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -11
- package/CHANGELOG.md +17 -5
- package/CLAUDE_CLI.md +265 -0
- package/README.md +704 -8
- package/__tests__/mocks/console.ts +22 -0
- package/__tests__/mocks/core.ts +137 -0
- package/__tests__/mocks/index.ts +4 -0
- package/__tests__/mocks/inquirer.ts +16 -0
- package/__tests__/mocks/progress.ts +19 -0
- package/dist/__tests__/helpers/cli-test-helper.d.ts +89 -0
- package/dist/__tests__/helpers/cli-test-helper.d.ts.map +1 -0
- package/dist/__tests__/helpers/cli-test-helper.js +220 -0
- package/dist/__tests__/mocks/index.d.ts +69 -0
- package/dist/__tests__/mocks/index.d.ts.map +1 -0
- package/dist/__tests__/mocks/index.js +77 -0
- package/dist/actions/component.actions.d.ts +14 -0
- package/dist/actions/component.actions.d.ts.map +1 -0
- package/dist/actions/component.actions.js +273 -0
- package/dist/actions/function.actions.d.ts +15 -0
- package/dist/actions/function.actions.d.ts.map +1 -0
- package/dist/actions/function.actions.js +254 -0
- package/dist/actions/project.actions.d.ts +17 -0
- package/dist/actions/project.actions.d.ts.map +1 -0
- package/dist/actions/project.actions.js +97 -0
- package/dist/actions/version.actions.d.ts +19 -0
- package/dist/actions/version.actions.d.ts.map +1 -0
- package/dist/actions/version.actions.js +216 -0
- package/dist/commands/component.d.ts +3 -0
- package/dist/commands/component.d.ts.map +1 -0
- package/dist/commands/component.js +192 -0
- package/dist/commands/docs.d.ts +3 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +16 -0
- package/dist/commands/function.d.ts +3 -0
- package/dist/commands/function.d.ts.map +1 -0
- package/dist/commands/function.js +243 -0
- package/dist/commands/help.d.ts +3 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +20 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +26 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +175 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +78 -0
- package/dist/commands/store-version.d.ts +3 -0
- package/dist/commands/store-version.d.ts.map +1 -0
- package/dist/commands/store-version.js +241 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +46 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +41 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -226
- package/dist/prompts/component.prompts.d.ts +14 -0
- package/dist/prompts/component.prompts.d.ts.map +1 -0
- package/dist/prompts/component.prompts.js +75 -0
- package/dist/prompts/function.prompts.d.ts +21 -0
- package/dist/prompts/function.prompts.d.ts.map +1 -0
- package/dist/prompts/function.prompts.js +127 -0
- package/dist/schemas/command.schema.d.ts +516 -0
- package/dist/schemas/command.schema.d.ts.map +1 -0
- package/dist/schemas/command.schema.js +267 -0
- package/dist/types/index.d.ts +147 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/utils/auth.d.ts +4 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +26 -0
- package/dist/utils/cli-progress-reporter.d.ts +12 -0
- package/dist/utils/cli-progress-reporter.d.ts.map +1 -0
- package/dist/utils/cli-progress-reporter.js +77 -0
- package/dist/utils/command-builder.d.ts +22 -0
- package/dist/utils/command-builder.d.ts.map +1 -0
- package/dist/utils/command-builder.js +268 -0
- package/dist/utils/command-helpers.d.ts +19 -0
- package/dist/utils/command-helpers.d.ts.map +1 -0
- package/dist/utils/command-helpers.js +79 -0
- package/dist/utils/command-parser.d.ts +146 -0
- package/dist/utils/command-parser.d.ts.map +1 -0
- package/dist/utils/command-parser.js +179 -0
- package/dist/utils/command-suggestions.d.ts +35 -0
- package/dist/utils/command-suggestions.d.ts.map +1 -0
- package/dist/utils/command-suggestions.js +152 -0
- package/dist/utils/console.d.ts +44 -0
- package/dist/utils/console.d.ts.map +1 -0
- package/dist/utils/console.js +233 -0
- package/dist/utils/constants.d.ts +8 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +10 -0
- package/dist/utils/context-detector.d.ts +12 -0
- package/dist/utils/context-detector.d.ts.map +1 -0
- package/dist/utils/context-detector.js +155 -0
- package/dist/utils/enhanced-error-handler.d.ts +47 -0
- package/dist/utils/enhanced-error-handler.d.ts.map +1 -0
- package/dist/utils/enhanced-error-handler.js +221 -0
- package/dist/utils/error-handler.d.ts +3 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +55 -0
- package/dist/utils/errors.d.ts +44 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +76 -0
- package/dist/utils/interactive-builder.d.ts +22 -0
- package/dist/utils/interactive-builder.d.ts.map +1 -0
- package/dist/utils/interactive-builder.js +246 -0
- package/dist/utils/rich-progress.d.ts +59 -0
- package/dist/utils/rich-progress.d.ts.map +1 -0
- package/dist/utils/rich-progress.js +234 -0
- package/dist/utils/store.d.ts +11 -0
- package/dist/utils/store.d.ts.map +1 -0
- package/dist/utils/store.js +19 -0
- package/dist/utils/validation-error-formatter.d.ts +25 -0
- package/dist/utils/validation-error-formatter.d.ts.map +1 -0
- package/dist/utils/validation-error-formatter.js +258 -0
- package/dist/utils/validation-helpers.d.ts +60 -0
- package/dist/utils/validation-helpers.d.ts.map +1 -0
- package/dist/utils/validation-helpers.js +152 -0
- package/package.json +44 -9
- package/src/__tests__/helpers/cli-test-helper.ts +281 -0
- package/src/__tests__/mocks/index.ts +142 -0
- package/src/actions/component.actions.ts +334 -0
- package/src/actions/function.actions.ts +313 -0
- package/src/actions/project.actions.ts +126 -0
- package/src/actions/version.actions.ts +233 -0
- package/src/commands/__tests__/component-validation.test.ts +250 -0
- package/src/commands/__tests__/component.test.ts +321 -0
- package/src/commands/__tests__/function-validation.test.ts +220 -0
- package/src/commands/__tests__/function.test.ts +286 -0
- package/src/commands/__tests__/store-version-validation.test.ts +414 -0
- package/src/commands/__tests__/store-version.test.ts +405 -0
- package/src/commands/__tests__/version.test.ts +71 -0
- package/src/commands/component.ts +188 -0
- package/src/commands/docs.ts +24 -0
- package/src/commands/function.ts +252 -0
- package/src/commands/help.ts +18 -0
- package/src/commands/index.ts +21 -7
- package/src/commands/login.ts +19 -79
- package/src/commands/project.ts +107 -0
- package/src/commands/store-version.ts +242 -0
- package/src/commands/version.ts +51 -0
- package/src/commands/whoami.ts +46 -0
- package/src/index.ts +110 -15
- package/src/prompts/component.prompts.ts +94 -0
- package/src/prompts/function.prompts.ts +168 -0
- package/src/schemas/command.schema.ts +354 -0
- package/src/types/index.ts +183 -0
- package/src/utils/__tests__/command-parser.test.ts +159 -0
- package/src/utils/__tests__/command-suggestions.test.ts +185 -0
- package/src/utils/__tests__/console.test.ts +192 -0
- package/src/utils/__tests__/context-detector.test.ts +258 -0
- package/src/utils/__tests__/enhanced-error-handler.test.ts +137 -0
- package/src/utils/__tests__/error-handler.test.ts +107 -0
- package/src/utils/__tests__/rich-progress.test.ts +170 -0
- package/src/utils/__tests__/validation-error-formatter.test.ts +175 -0
- package/src/utils/__tests__/validation-helpers.test.ts +125 -0
- package/src/utils/auth.ts +41 -0
- package/src/utils/cli-progress-reporter.ts +84 -0
- package/src/utils/command-builder.ts +390 -0
- package/src/utils/command-helpers.ts +83 -0
- package/src/utils/command-parser.ts +250 -0
- package/src/utils/command-suggestions.ts +176 -0
- package/src/utils/console.ts +291 -0
- package/src/utils/context-detector.ts +177 -0
- package/src/utils/enhanced-error-handler.ts +264 -0
- package/src/utils/error-handler.ts +60 -0
- package/src/utils/errors.ts +125 -0
- package/src/utils/interactive-builder.ts +271 -0
- package/src/utils/rich-progress.ts +320 -0
- package/src/utils/store.ts +23 -0
- package/src/utils/validation-error-formatter.ts +337 -0
- package/src/utils/validation-helpers.ts +192 -0
- package/tsconfig.json +13 -7
- package/vitest.config.ts +28 -0
- package/vitest.setup.ts +29 -0
- package/tsup.config.ts +0 -15
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InteractiveCommandBuilder = void 0;
|
|
7
|
+
exports.runInteractiveCommand = runInteractiveCommand;
|
|
8
|
+
const core_1 = require("@ollie-shop/core");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
+
class InteractiveCommandBuilder {
|
|
12
|
+
constructor(console) {
|
|
13
|
+
this.console = console;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build component deploy command interactively
|
|
17
|
+
*/
|
|
18
|
+
async buildDeployComponentCommand() {
|
|
19
|
+
this.console.log(chalk_1.default.blue.bold("\n🚀 Component Deployment Wizard\n"));
|
|
20
|
+
try {
|
|
21
|
+
// Get available components (mock data for now)
|
|
22
|
+
const components = await this.getAvailableComponents();
|
|
23
|
+
const answers = await inquirer_1.default.prompt([
|
|
24
|
+
{
|
|
25
|
+
type: "list",
|
|
26
|
+
name: "component",
|
|
27
|
+
message: "Select component to deploy:",
|
|
28
|
+
choices: components.map((c) => ({
|
|
29
|
+
name: `${c.name} (${c.slot}) - v${c.version || "1.0.0"} - ${chalk_1.default.dim(`Created ${new Date(c.createdAt).toLocaleDateString()}`)}`,
|
|
30
|
+
value: c.id,
|
|
31
|
+
})),
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
type: "checkbox",
|
|
35
|
+
name: "options",
|
|
36
|
+
message: "Deployment options:",
|
|
37
|
+
choices: [
|
|
38
|
+
{ name: "Wait for completion", value: "wait", checked: true },
|
|
39
|
+
{ name: "Run tests before deploy", value: "test", checked: true },
|
|
40
|
+
{
|
|
41
|
+
name: "Enable verbose logging",
|
|
42
|
+
value: "verbose",
|
|
43
|
+
checked: false,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
48
|
+
// Build the command
|
|
49
|
+
let command = `ollieshop component deploy --id ${answers.component}`;
|
|
50
|
+
if (answers.options.includes("wait")) {
|
|
51
|
+
command += " --wait";
|
|
52
|
+
}
|
|
53
|
+
if (answers.options.includes("verbose")) {
|
|
54
|
+
command += " --verbose";
|
|
55
|
+
}
|
|
56
|
+
// Show preview
|
|
57
|
+
this.console.log(`\n${chalk_1.default.dim("[Preview] This will run:")}`);
|
|
58
|
+
this.console.log(chalk_1.default.cyan(` ${command}\n`));
|
|
59
|
+
// Confirm execution
|
|
60
|
+
const { proceed } = await inquirer_1.default.prompt({
|
|
61
|
+
type: "confirm",
|
|
62
|
+
name: "proceed",
|
|
63
|
+
message: "Execute this command?",
|
|
64
|
+
default: true,
|
|
65
|
+
});
|
|
66
|
+
if (proceed) {
|
|
67
|
+
// Execute the command
|
|
68
|
+
this.console.log(chalk_1.default.dim("\nExecuting command...\n"));
|
|
69
|
+
// Import and execute the action directly
|
|
70
|
+
const { deployComponent } = await import("../actions/component.actions.js");
|
|
71
|
+
const deployOptions = {
|
|
72
|
+
componentId: answers.component,
|
|
73
|
+
path: process.cwd(),
|
|
74
|
+
wait: answers.options.includes("wait"),
|
|
75
|
+
};
|
|
76
|
+
await deployComponent(deployOptions, this.console);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this.console.log(chalk_1.default.yellow("\n⚠️ Deployment cancelled"));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error instanceof Error && error.name === "ExitPromptError") {
|
|
84
|
+
this.console.log(chalk_1.default.yellow("\n⚠️ Wizard cancelled"));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Build component create command interactively
|
|
93
|
+
*/
|
|
94
|
+
async buildCreateComponentCommand() {
|
|
95
|
+
this.console.log(chalk_1.default.blue.bold("\n🎨 Component Creation Wizard\n"));
|
|
96
|
+
try {
|
|
97
|
+
const answers = await inquirer_1.default.prompt([
|
|
98
|
+
{
|
|
99
|
+
type: "input",
|
|
100
|
+
name: "name",
|
|
101
|
+
message: "Component name:",
|
|
102
|
+
validate: (input) => {
|
|
103
|
+
if (!input)
|
|
104
|
+
return "Component name is required";
|
|
105
|
+
if (!/^[a-z0-9-]+$/.test(input)) {
|
|
106
|
+
return "Must be lowercase with hyphens only (e.g., header-nav)";
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
},
|
|
110
|
+
transformer: (input) => {
|
|
111
|
+
// Show live validation
|
|
112
|
+
if (!/^[a-z0-9-]+$/.test(input) && input) {
|
|
113
|
+
return chalk_1.default.red(input);
|
|
114
|
+
}
|
|
115
|
+
return input;
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
type: "list",
|
|
120
|
+
name: "slot",
|
|
121
|
+
message: "Component slot:",
|
|
122
|
+
choices: core_1.ComponentSlot.options.map((slot) => ({
|
|
123
|
+
name: slot.charAt(0).toUpperCase() + slot.slice(1).replace(/-/g, " "),
|
|
124
|
+
value: slot,
|
|
125
|
+
})),
|
|
126
|
+
default: "main",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: "list",
|
|
130
|
+
name: "language",
|
|
131
|
+
message: "Language:",
|
|
132
|
+
choices: [
|
|
133
|
+
{ name: "TypeScript (recommended)", value: "typescript" },
|
|
134
|
+
{ name: "JavaScript", value: "javascript" },
|
|
135
|
+
],
|
|
136
|
+
default: "typescript",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: "confirm",
|
|
140
|
+
name: "tests",
|
|
141
|
+
message: "Include test files?",
|
|
142
|
+
default: true,
|
|
143
|
+
},
|
|
144
|
+
]);
|
|
145
|
+
// Build the command
|
|
146
|
+
let command = `ollieshop component create --name ${answers.name}`;
|
|
147
|
+
if (answers.slot !== "main") {
|
|
148
|
+
command += ` --slot ${answers.slot}`;
|
|
149
|
+
}
|
|
150
|
+
if (answers.language === "javascript") {
|
|
151
|
+
command += " --no-typescript";
|
|
152
|
+
}
|
|
153
|
+
if (!answers.tests) {
|
|
154
|
+
command += " --no-tests";
|
|
155
|
+
}
|
|
156
|
+
// Show preview
|
|
157
|
+
this.console.log(`\n${chalk_1.default.dim("[Preview] This will run:")}`);
|
|
158
|
+
this.console.log(chalk_1.default.cyan(` ${command}\n`));
|
|
159
|
+
// Confirm execution
|
|
160
|
+
const { proceed } = await inquirer_1.default.prompt({
|
|
161
|
+
type: "confirm",
|
|
162
|
+
name: "proceed",
|
|
163
|
+
message: "Create this component?",
|
|
164
|
+
default: true,
|
|
165
|
+
});
|
|
166
|
+
if (proceed) {
|
|
167
|
+
// Execute the command
|
|
168
|
+
this.console.log(chalk_1.default.dim("\nCreating component...\n"));
|
|
169
|
+
const { createComponent } = await import("../actions/component.actions.js");
|
|
170
|
+
await createComponent({
|
|
171
|
+
name: answers.name,
|
|
172
|
+
slot: answers.slot,
|
|
173
|
+
tests: answers.tests,
|
|
174
|
+
}, this.console);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.console.log(chalk_1.default.yellow("\n⚠️ Component creation cancelled"));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error instanceof Error && error.name === "ExitPromptError") {
|
|
182
|
+
this.console.log(chalk_1.default.yellow("\n⚠️ Wizard cancelled"));
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get available components (mock for now)
|
|
191
|
+
*/
|
|
192
|
+
async getAvailableComponents() {
|
|
193
|
+
// TODO: Replace with actual API call
|
|
194
|
+
return [
|
|
195
|
+
{
|
|
196
|
+
id: "comp_header_123",
|
|
197
|
+
name: "header-nav",
|
|
198
|
+
slot: "header",
|
|
199
|
+
version: "1.2.0",
|
|
200
|
+
enabled: true,
|
|
201
|
+
createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),
|
|
202
|
+
type: "ui",
|
|
203
|
+
description: "Navigation header component",
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: "comp_cart_456",
|
|
207
|
+
name: "shopping-cart",
|
|
208
|
+
slot: "sidebar",
|
|
209
|
+
version: "1.0.0",
|
|
210
|
+
enabled: true,
|
|
211
|
+
createdAt: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),
|
|
212
|
+
type: "ui",
|
|
213
|
+
description: "Shopping cart widget",
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: "comp_product_789",
|
|
217
|
+
name: "product-list",
|
|
218
|
+
slot: "main",
|
|
219
|
+
version: "2.1.0",
|
|
220
|
+
enabled: true,
|
|
221
|
+
createdAt: new Date(Date.now() - 3 * 24 * 60 * 60 * 1000).toISOString(),
|
|
222
|
+
type: "ui",
|
|
223
|
+
description: "Product listing component",
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
exports.InteractiveCommandBuilder = InteractiveCommandBuilder;
|
|
229
|
+
/**
|
|
230
|
+
* Create an interactive command builder
|
|
231
|
+
*/
|
|
232
|
+
async function runInteractiveCommand(command, console) {
|
|
233
|
+
const builder = new InteractiveCommandBuilder(console);
|
|
234
|
+
switch (command) {
|
|
235
|
+
case "deploy":
|
|
236
|
+
case "component-deploy":
|
|
237
|
+
await builder.buildDeployComponentCommand();
|
|
238
|
+
break;
|
|
239
|
+
case "create":
|
|
240
|
+
case "component-create":
|
|
241
|
+
await builder.buildCreateComponentCommand();
|
|
242
|
+
break;
|
|
243
|
+
default:
|
|
244
|
+
console.warn(`Interactive mode not available for command: ${command}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
interface CLIBuildProgress {
|
|
2
|
+
phase: string;
|
|
3
|
+
message: string;
|
|
4
|
+
progress: number;
|
|
5
|
+
metadata?: {
|
|
6
|
+
bundleSize?: number;
|
|
7
|
+
gzippedSize?: number;
|
|
8
|
+
dependencies?: number;
|
|
9
|
+
removedExports?: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare class RichProgressReporter {
|
|
13
|
+
private multibar;
|
|
14
|
+
private bars;
|
|
15
|
+
private steps;
|
|
16
|
+
private startTime;
|
|
17
|
+
private stats;
|
|
18
|
+
constructor();
|
|
19
|
+
/**
|
|
20
|
+
* Custom format for progress bars
|
|
21
|
+
*/
|
|
22
|
+
private formatBar;
|
|
23
|
+
/**
|
|
24
|
+
* Start progress tracking
|
|
25
|
+
*/
|
|
26
|
+
start(): void;
|
|
27
|
+
private readonly stepMap;
|
|
28
|
+
/**
|
|
29
|
+
* Update progress based on CLIBuildProgress
|
|
30
|
+
*/
|
|
31
|
+
updateProgress(progress: CLIBuildProgress): void;
|
|
32
|
+
private updateBar;
|
|
33
|
+
private updatePreviousSteps;
|
|
34
|
+
private markStepComplete;
|
|
35
|
+
private updateStats;
|
|
36
|
+
/**
|
|
37
|
+
* Stop progress tracking
|
|
38
|
+
*/
|
|
39
|
+
stop(success?: boolean): void;
|
|
40
|
+
/**
|
|
41
|
+
* Show success summary with stats
|
|
42
|
+
*/
|
|
43
|
+
private showSuccessSummary;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Simple progress reporter for single operations
|
|
47
|
+
*/
|
|
48
|
+
export declare class SimpleProgressReporter {
|
|
49
|
+
private message;
|
|
50
|
+
private spinner;
|
|
51
|
+
private startTime;
|
|
52
|
+
constructor(message: string);
|
|
53
|
+
start(): void;
|
|
54
|
+
update(message: string): void;
|
|
55
|
+
succeed(message?: string): void;
|
|
56
|
+
fail(message?: string): void;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=rich-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-progress.d.ts","sourceRoot":"","sources":["../../src/utils/rich-progress.ts"],"names":[],"mappings":"AAKA,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAUD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAiD;IAC7D,OAAO,CAAC,KAAK,CAMX;IACF,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,KAAK,CAKN;;IAkEP;;OAEG;IACH,OAAO,CAAC,SAAS;IAqCjB;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb,OAAO,CAAC,QAAQ,CAAC,OAAO,CAMtB;IAEF;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAShD,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,IAAI,CAAC,OAAO,UAAO,GAAG,IAAI;IAkB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CA+B3B;AAED;;GAEG;AACH,qBAAa,sBAAsB;IAIrB,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,SAAS,CAAS;gBAEN,OAAO,EAAE,MAAM;IAInC,KAAK,IAAI,IAAI;IAQb,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM7B,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS/B,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;CAK7B"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SimpleProgressReporter = exports.RichProgressReporter = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const cli_progress_1 = __importDefault(require("cli-progress"));
|
|
9
|
+
class RichProgressReporter {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.bars = new Map();
|
|
12
|
+
this.steps = [
|
|
13
|
+
{ name: "Validating", emoji: "🔍", weight: 10 },
|
|
14
|
+
{ name: "Building", emoji: "🔨", weight: 40 },
|
|
15
|
+
{ name: "Optimizing", emoji: "⚡", weight: 20 },
|
|
16
|
+
{ name: "Deploying", emoji: "🚀", weight: 20 },
|
|
17
|
+
{ name: "Verifying", emoji: "✅", weight: 10 },
|
|
18
|
+
];
|
|
19
|
+
this.startTime = Date.now();
|
|
20
|
+
this.stats = {};
|
|
21
|
+
this.stepMap = {
|
|
22
|
+
validate: "Validating",
|
|
23
|
+
build: "Building",
|
|
24
|
+
optimize: "Optimizing",
|
|
25
|
+
upload: "Deploying",
|
|
26
|
+
verify: "Verifying",
|
|
27
|
+
};
|
|
28
|
+
// Create a formatter function that matches cli-progress expectations
|
|
29
|
+
const formatter = (options, params, payload) => {
|
|
30
|
+
// Safe type conversion with validation
|
|
31
|
+
const formatOptions = {
|
|
32
|
+
barCompleteString: typeof options.barCompleteString === "string"
|
|
33
|
+
? options.barCompleteString
|
|
34
|
+
: undefined,
|
|
35
|
+
barIncompleteString: typeof options.barIncompleteString === "string"
|
|
36
|
+
? options.barIncompleteString
|
|
37
|
+
: undefined,
|
|
38
|
+
barsize: typeof options.barsize === "number" ? options.barsize : undefined,
|
|
39
|
+
};
|
|
40
|
+
// Convert params to expected format
|
|
41
|
+
const progressParams = {
|
|
42
|
+
progress: typeof params.progress === "number" ? params.progress : 0,
|
|
43
|
+
value: typeof params.value === "number" ? params.value : 0,
|
|
44
|
+
total: typeof params.total === "number" ? params.total : 0,
|
|
45
|
+
eta: typeof params.eta === "number" ? params.eta : 0,
|
|
46
|
+
startTime: typeof params.startTime === "number" ? params.startTime : Date.now(),
|
|
47
|
+
stopTime: typeof params.stopTime === "number" ? params.stopTime : null,
|
|
48
|
+
duration: typeof params.duration === "number" ? params.duration : 0,
|
|
49
|
+
};
|
|
50
|
+
// Convert payload to expected format
|
|
51
|
+
const progressPayload = {
|
|
52
|
+
...payload,
|
|
53
|
+
emoji: typeof payload.emoji === "string" ? payload.emoji : undefined,
|
|
54
|
+
step: typeof payload.step === "string" ? payload.step : undefined,
|
|
55
|
+
message: typeof payload.message === "string" ? payload.message : undefined,
|
|
56
|
+
startTime: typeof payload.startTime === "number" ? payload.startTime : undefined,
|
|
57
|
+
};
|
|
58
|
+
return this.formatBar(formatOptions, progressParams, progressPayload);
|
|
59
|
+
};
|
|
60
|
+
// Cast formatter to unknown first to bypass TypeScript's structural typing check
|
|
61
|
+
// cli-progress expects a GenericFormatter but the type definitions don't match exactly
|
|
62
|
+
const formatFunction = formatter;
|
|
63
|
+
this.multibar = new cli_progress_1.default.MultiBar({
|
|
64
|
+
format: formatFunction,
|
|
65
|
+
barCompleteChar: "\u2588",
|
|
66
|
+
barIncompleteChar: "\u2591",
|
|
67
|
+
hideCursor: true,
|
|
68
|
+
clearOnComplete: false,
|
|
69
|
+
forceRedraw: true,
|
|
70
|
+
}, cli_progress_1.default.Presets.shades_classic);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Custom format for progress bars
|
|
74
|
+
*/
|
|
75
|
+
formatBar(options, params, payload) {
|
|
76
|
+
const barCompleteString = options.barCompleteString || "\u2588";
|
|
77
|
+
const barIncompleteString = options.barIncompleteString || "\u2591";
|
|
78
|
+
const barsize = options.barsize || 40;
|
|
79
|
+
const bar = barCompleteString.substring(0, Math.round(params.progress * barsize));
|
|
80
|
+
const empty = barIncompleteString.substring(0, barsize - bar.length);
|
|
81
|
+
const percent = Math.round(params.progress * 100);
|
|
82
|
+
const emoji = payload.emoji || "📦";
|
|
83
|
+
const step = payload.step || "Processing";
|
|
84
|
+
const message = payload.message || "";
|
|
85
|
+
let line = `${emoji} ${step.padEnd(12)} ${bar}${empty} ${percent.toString().padStart(3)}%`;
|
|
86
|
+
if (percent === 100 && payload.startTime) {
|
|
87
|
+
const duration = ((Date.now() - payload.startTime) / 1000).toFixed(1);
|
|
88
|
+
line += chalk_1.default.green(` ✓ ${duration}s`);
|
|
89
|
+
}
|
|
90
|
+
else if (message) {
|
|
91
|
+
line += chalk_1.default.dim(` | ${message}`);
|
|
92
|
+
}
|
|
93
|
+
return line;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Start progress tracking
|
|
97
|
+
*/
|
|
98
|
+
start() {
|
|
99
|
+
console.log(chalk_1.default.blue.bold("\n🚀 Starting deployment...\n"));
|
|
100
|
+
// Create bars for each step
|
|
101
|
+
for (const step of this.steps) {
|
|
102
|
+
const bar = this.multibar.create(100, 0, {
|
|
103
|
+
emoji: step.emoji,
|
|
104
|
+
step: step.name,
|
|
105
|
+
startTime: Date.now(),
|
|
106
|
+
});
|
|
107
|
+
this.bars.set(step.name, bar);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Update progress based on CLIBuildProgress
|
|
112
|
+
*/
|
|
113
|
+
updateProgress(progress) {
|
|
114
|
+
const { phase, message, progress: percent } = progress;
|
|
115
|
+
const stepName = this.stepMap[phase] || "Processing";
|
|
116
|
+
this.updateBar(stepName, percent, message);
|
|
117
|
+
this.updatePreviousSteps(stepName);
|
|
118
|
+
this.updateStats(progress.metadata);
|
|
119
|
+
}
|
|
120
|
+
updateBar(stepName, percent, message) {
|
|
121
|
+
const bar = this.bars.get(stepName);
|
|
122
|
+
if (bar) {
|
|
123
|
+
bar.update(percent * 100, { message });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
updatePreviousSteps(currentStepName) {
|
|
127
|
+
let foundCurrent = false;
|
|
128
|
+
for (const step of this.steps) {
|
|
129
|
+
if (step.name === currentStepName) {
|
|
130
|
+
foundCurrent = true;
|
|
131
|
+
step.status = "active";
|
|
132
|
+
}
|
|
133
|
+
else if (!foundCurrent) {
|
|
134
|
+
this.markStepComplete(step);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
markStepComplete(step) {
|
|
139
|
+
step.status = "completed";
|
|
140
|
+
const bar = this.bars.get(step.name);
|
|
141
|
+
if (bar) {
|
|
142
|
+
bar.update(100);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
updateStats(metadata) {
|
|
146
|
+
if (!metadata)
|
|
147
|
+
return;
|
|
148
|
+
if (metadata.bundleSize) {
|
|
149
|
+
this.stats.bundleSize = metadata.bundleSize;
|
|
150
|
+
}
|
|
151
|
+
if (metadata.gzippedSize) {
|
|
152
|
+
this.stats.gzippedSize = metadata.gzippedSize;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Stop progress tracking
|
|
157
|
+
*/
|
|
158
|
+
stop(success = true) {
|
|
159
|
+
// Complete all bars if they exist
|
|
160
|
+
if (this.bars.size > 0) {
|
|
161
|
+
for (const bar of this.bars.values()) {
|
|
162
|
+
bar.update(100);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
this.multibar.stop();
|
|
166
|
+
// Show summary
|
|
167
|
+
if (success) {
|
|
168
|
+
this.showSuccessSummary();
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.log(chalk_1.default.red("\n❌ Deployment failed\n"));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Show success summary with stats
|
|
176
|
+
*/
|
|
177
|
+
showSuccessSummary() {
|
|
178
|
+
const duration = ((Date.now() - this.startTime) / 1000).toFixed(1);
|
|
179
|
+
console.log(chalk_1.default.green.bold("\n✅ Deployment completed successfully!\n"));
|
|
180
|
+
if (Object.keys(this.stats).length > 0) {
|
|
181
|
+
console.log(chalk_1.default.blue("📊 Build Stats:"));
|
|
182
|
+
if (this.stats.bundleSize) {
|
|
183
|
+
const sizeKB = (this.stats.bundleSize / 1024).toFixed(1);
|
|
184
|
+
const gzipKB = this.stats.gzippedSize
|
|
185
|
+
? (this.stats.gzippedSize / 1024).toFixed(1)
|
|
186
|
+
: "?";
|
|
187
|
+
console.log(` • Bundle size: ${sizeKB}KB (gzipped: ${gzipKB}KB)`);
|
|
188
|
+
}
|
|
189
|
+
if (this.stats.removedExports) {
|
|
190
|
+
console.log(` • Tree shaking: Removed ${this.stats.removedExports} unused exports`);
|
|
191
|
+
}
|
|
192
|
+
if (this.stats.dependencies) {
|
|
193
|
+
console.log(` • Dependencies: ${this.stats.dependencies}`);
|
|
194
|
+
}
|
|
195
|
+
console.log("");
|
|
196
|
+
}
|
|
197
|
+
console.log(chalk_1.default.dim(`Total time: ${duration}s`));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.RichProgressReporter = RichProgressReporter;
|
|
201
|
+
/**
|
|
202
|
+
* Simple progress reporter for single operations
|
|
203
|
+
*/
|
|
204
|
+
class SimpleProgressReporter {
|
|
205
|
+
constructor(message) {
|
|
206
|
+
this.message = message;
|
|
207
|
+
this.spinner = null;
|
|
208
|
+
this.startTime = Date.now();
|
|
209
|
+
}
|
|
210
|
+
start() {
|
|
211
|
+
const ora = require("ora");
|
|
212
|
+
this.spinner = ora({
|
|
213
|
+
text: this.message,
|
|
214
|
+
spinner: "dots",
|
|
215
|
+
}).start();
|
|
216
|
+
}
|
|
217
|
+
update(message) {
|
|
218
|
+
if (this.spinner) {
|
|
219
|
+
this.spinner.text = message;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
succeed(message) {
|
|
223
|
+
if (this.spinner) {
|
|
224
|
+
const duration = ((Date.now() - this.startTime) / 1000).toFixed(1);
|
|
225
|
+
this.spinner.succeed(message || `${this.message} ${chalk_1.default.dim(`(${duration}s)`)}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
fail(message) {
|
|
229
|
+
if (this.spinner) {
|
|
230
|
+
this.spinner.fail(message || this.message);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
exports.SimpleProgressReporter = SimpleProgressReporter;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type OllieConfig = {
|
|
2
|
+
storeId: string;
|
|
3
|
+
versionId: string;
|
|
4
|
+
platform: string;
|
|
5
|
+
platformStoreId: string;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
props: unknown;
|
|
8
|
+
theme: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export declare function getOllieConfig(): Promise<OllieConfig | null>;
|
|
11
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/utils/store.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CASlE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getOllieConfig = getOllieConfig;
|
|
7
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
async function getOllieConfig() {
|
|
10
|
+
try {
|
|
11
|
+
const configPath = node_path_1.default.join(process.cwd(), "ollie.json");
|
|
12
|
+
const raw = await promises_1.default.readFile(configPath, "utf-8");
|
|
13
|
+
const data = JSON.parse(raw);
|
|
14
|
+
return data;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ZodError } from "zod";
|
|
2
|
+
import type { CliConsole } from "./console";
|
|
3
|
+
export interface ValidationError {
|
|
4
|
+
field: string;
|
|
5
|
+
message: string;
|
|
6
|
+
suggestedValue?: string;
|
|
7
|
+
examples?: ValidationExample[];
|
|
8
|
+
}
|
|
9
|
+
export interface ValidationExample {
|
|
10
|
+
description: string;
|
|
11
|
+
command: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Format Zod errors into user-friendly validation errors
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatZodError(error: ZodError, context?: string): ValidationError[];
|
|
17
|
+
/**
|
|
18
|
+
* Display validation errors in a formatted way
|
|
19
|
+
*/
|
|
20
|
+
export declare function displayErrors(console: CliConsole, errors: ValidationError[], command?: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Suggest a command from available commands
|
|
23
|
+
*/
|
|
24
|
+
export declare function suggestCommand(input: string, availableCommands: string[]): string | undefined;
|
|
25
|
+
//# sourceMappingURL=validation-error-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-error-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/validation-error-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,KAAK,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsGD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,EACf,OAAO,CAAC,EAAE,MAAM,GACf,eAAe,EAAE,CAsBnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAyBN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,EAAE,GAC1B,MAAM,GAAG,SAAS,CAwCpB"}
|