tailar 0.2.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/LICENSE +22 -0
- package/README.md +183 -0
- package/README.npm.md +183 -0
- package/dist/api/client.d.ts +47 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +329 -0
- package/dist/api/client.js.map +1 -0
- package/dist/auth/browser.d.ts +11 -0
- package/dist/auth/browser.d.ts.map +1 -0
- package/dist/auth/browser.js +46 -0
- package/dist/auth/browser.js.map +1 -0
- package/dist/auth/flow.d.ts +28 -0
- package/dist/auth/flow.d.ts.map +1 -0
- package/dist/auth/flow.js +171 -0
- package/dist/auth/flow.js.map +1 -0
- package/dist/auth/storage.d.ts +30 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +112 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/commands/add.d.ts +8 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +285 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +230 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +8 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +176 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/installers/dependencies.d.ts +27 -0
- package/dist/installers/dependencies.d.ts.map +1 -0
- package/dist/installers/dependencies.js +185 -0
- package/dist/installers/dependencies.js.map +1 -0
- package/dist/installers/files.d.ts +50 -0
- package/dist/installers/files.d.ts.map +1 -0
- package/dist/installers/files.js +211 -0
- package/dist/installers/files.js.map +1 -0
- package/dist/installers/install-feature.d.ts +20 -0
- package/dist/installers/install-feature.d.ts.map +1 -0
- package/dist/installers/install-feature.js +169 -0
- package/dist/installers/install-feature.js.map +1 -0
- package/dist/installers/post-install.d.ts +18 -0
- package/dist/installers/post-install.d.ts.map +1 -0
- package/dist/installers/post-install.js +228 -0
- package/dist/installers/post-install.js.map +1 -0
- package/dist/installers/templates.d.ts +22 -0
- package/dist/installers/templates.d.ts.map +1 -0
- package/dist/installers/templates.js +62 -0
- package/dist/installers/templates.js.map +1 -0
- package/dist/registry/loader.d.ts +21 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +83 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/query.d.ts +55 -0
- package/dist/registry/query.d.ts.map +1 -0
- package/dist/registry/query.js +123 -0
- package/dist/registry/query.js.map +1 -0
- package/dist/types/config.d.ts +85 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/registry.d.ts +180 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +8 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/wizard.d.ts +43 -0
- package/dist/types/wizard.d.ts.map +1 -0
- package/dist/types/wizard.js +59 -0
- package/dist/types/wizard.js.map +1 -0
- package/dist/utils/clack-wizard.d.ts +9 -0
- package/dist/utils/clack-wizard.d.ts.map +1 -0
- package/dist/utils/clack-wizard.js +328 -0
- package/dist/utils/clack-wizard.js.map +1 -0
- package/dist/utils/config.d.ts +49 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +121 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +56 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +93 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.d.ts +41 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +118 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/prompts.d.ts +22 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +142 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/validation.d.ts +50 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +108 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-feature.js","sourceRoot":"","sources":["../../src/installers/install-feature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Install Handler
|
|
3
|
+
*
|
|
4
|
+
* Executes post-installation steps like code injection and running commands.
|
|
5
|
+
* Batches execution for better UX: runs commands first, then shows next steps.
|
|
6
|
+
*/
|
|
7
|
+
import { PostInstallStep, ProjectContext } from "../types/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Execute a single post-install step
|
|
10
|
+
*/
|
|
11
|
+
export declare function executePostInstallStep(projectPath: string, step: PostInstallStep): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Execute all post-install steps with batched execution
|
|
14
|
+
* 1. Run commands (deduplicated)
|
|
15
|
+
* 2. Display next steps section
|
|
16
|
+
*/
|
|
17
|
+
export declare function executePostInstallSteps(projectPath: string, steps: PostInstallStep[], context?: ProjectContext): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=post-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-install.d.ts","sourceRoot":"","sources":["../../src/installers/post-install.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGpE;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EAAE,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CA+Ef"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Install Handler
|
|
3
|
+
*
|
|
4
|
+
* Executes post-installation steps like code injection and running commands.
|
|
5
|
+
* Batches execution for better UX: runs commands first, then shows next steps.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile } from "fs/promises";
|
|
8
|
+
import { existsSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { execSync } from "child_process";
|
|
11
|
+
import { logger } from "../utils/logger.js";
|
|
12
|
+
/**
|
|
13
|
+
* Execute a single post-install step
|
|
14
|
+
*/
|
|
15
|
+
export async function executePostInstallStep(projectPath, step) {
|
|
16
|
+
logger.info(step.description);
|
|
17
|
+
switch (step.type) {
|
|
18
|
+
case "next-steps-env":
|
|
19
|
+
case "next-steps-instruction":
|
|
20
|
+
// These are handled in batched execution
|
|
21
|
+
break;
|
|
22
|
+
case "inject-code":
|
|
23
|
+
await injectCode(projectPath, step);
|
|
24
|
+
break;
|
|
25
|
+
case "update-config":
|
|
26
|
+
await updateConfig(projectPath, step);
|
|
27
|
+
break;
|
|
28
|
+
case "run-command":
|
|
29
|
+
await runCommand(projectPath, step);
|
|
30
|
+
break;
|
|
31
|
+
case "create-file":
|
|
32
|
+
await createFile(projectPath, step);
|
|
33
|
+
break;
|
|
34
|
+
default:
|
|
35
|
+
logger.warn(`Unknown post-install step type: ${step.type}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Execute all post-install steps with batched execution
|
|
40
|
+
* 1. Run commands (deduplicated)
|
|
41
|
+
* 2. Display next steps section
|
|
42
|
+
*/
|
|
43
|
+
export async function executePostInstallSteps(projectPath, steps, context) {
|
|
44
|
+
// Separate steps by type
|
|
45
|
+
const runCommands = [];
|
|
46
|
+
const envSteps = [];
|
|
47
|
+
const instructionSteps = [];
|
|
48
|
+
const otherSteps = [];
|
|
49
|
+
for (const step of steps) {
|
|
50
|
+
switch (step.type) {
|
|
51
|
+
case "run-command":
|
|
52
|
+
runCommands.push(step);
|
|
53
|
+
break;
|
|
54
|
+
case "next-steps-env":
|
|
55
|
+
envSteps.push(step);
|
|
56
|
+
break;
|
|
57
|
+
case "next-steps-instruction":
|
|
58
|
+
instructionSteps.push(step);
|
|
59
|
+
break;
|
|
60
|
+
default:
|
|
61
|
+
otherSteps.push(step);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Execute other steps first (inject-code, create-file, etc.)
|
|
66
|
+
for (const step of otherSteps) {
|
|
67
|
+
try {
|
|
68
|
+
await executePostInstallStep(projectPath, step);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
logger.error(`Failed to execute step: ${step.description}`);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Execute run-command steps (deduplicated)
|
|
76
|
+
const executedCommands = new Set();
|
|
77
|
+
for (const step of runCommands) {
|
|
78
|
+
if (!step.command)
|
|
79
|
+
continue;
|
|
80
|
+
// Skip if we've already run this exact command
|
|
81
|
+
if (executedCommands.has(step.command)) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
logger.info(step.description);
|
|
86
|
+
await runCommand(projectPath, step, context);
|
|
87
|
+
executedCommands.add(step.command);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.error(`Failed to execute command: ${step.command}`);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Display next steps section
|
|
95
|
+
if (envSteps.length > 0 || instructionSteps.length > 0) {
|
|
96
|
+
logger.info("\n");
|
|
97
|
+
logger.success("Next steps:\n");
|
|
98
|
+
let stepNumber = 1;
|
|
99
|
+
// Show environment variables section
|
|
100
|
+
if (envSteps.length > 0) {
|
|
101
|
+
logger.info(`${stepNumber}. Add these environment variables to your .env file:\n`);
|
|
102
|
+
for (const step of envSteps) {
|
|
103
|
+
console.log(step.description);
|
|
104
|
+
console.log("");
|
|
105
|
+
}
|
|
106
|
+
stepNumber++;
|
|
107
|
+
}
|
|
108
|
+
// Show instruction steps
|
|
109
|
+
for (const step of instructionSteps) {
|
|
110
|
+
logger.info(`${stepNumber}. ${step.description}\n`);
|
|
111
|
+
stepNumber++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Inject code into existing file
|
|
117
|
+
*/
|
|
118
|
+
async function injectCode(projectPath, step) {
|
|
119
|
+
if (!step.file || !step.content) {
|
|
120
|
+
throw new Error("inject-code requires file and content");
|
|
121
|
+
}
|
|
122
|
+
const filePath = join(projectPath, step.file);
|
|
123
|
+
// Check if file exists
|
|
124
|
+
if (!existsSync(filePath)) {
|
|
125
|
+
logger.warn(`File not found, skipping injection: ${step.file}`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Read existing content
|
|
129
|
+
let content = await readFile(filePath, "utf-8");
|
|
130
|
+
// Skip if content already exists
|
|
131
|
+
if (step.skipIfExists && content.includes(step.content)) {
|
|
132
|
+
logger.info("Code already present, skipping injection");
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Inject based on position
|
|
136
|
+
switch (step.position) {
|
|
137
|
+
case "before-export":
|
|
138
|
+
// Find default export and inject before it
|
|
139
|
+
content = content.replace(/export default/, `${step.content}\n\nexport default`);
|
|
140
|
+
break;
|
|
141
|
+
case "after-import":
|
|
142
|
+
// Find last import and inject after it
|
|
143
|
+
const lastImportIndex = content.lastIndexOf("import ");
|
|
144
|
+
if (lastImportIndex !== -1) {
|
|
145
|
+
const endOfLine = content.indexOf("\n", lastImportIndex);
|
|
146
|
+
content =
|
|
147
|
+
content.slice(0, endOfLine + 1) +
|
|
148
|
+
"\n" +
|
|
149
|
+
step.content +
|
|
150
|
+
"\n" +
|
|
151
|
+
content.slice(endOfLine + 1);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
content = step.content + "\n\n" + content;
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
case "end-of-file":
|
|
158
|
+
default:
|
|
159
|
+
// Append to end of file
|
|
160
|
+
content = content.trimEnd() + "\n\n" + step.content + "\n";
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
// Write updated content
|
|
164
|
+
await writeFile(filePath, content, "utf-8");
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Update configuration file
|
|
168
|
+
*/
|
|
169
|
+
async function updateConfig(projectPath, step) {
|
|
170
|
+
if (!step.file) {
|
|
171
|
+
throw new Error("update-config requires file");
|
|
172
|
+
}
|
|
173
|
+
logger.warn("Config update is a manual step - please update your config manually");
|
|
174
|
+
logger.info(`File: ${step.file}`);
|
|
175
|
+
if (step.content) {
|
|
176
|
+
logger.info(`Add: ${step.content}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Run a command
|
|
181
|
+
*/
|
|
182
|
+
async function runCommand(projectPath, step, context) {
|
|
183
|
+
if (!step.command) {
|
|
184
|
+
throw new Error("run-command requires command");
|
|
185
|
+
}
|
|
186
|
+
// Resolve template variables in command if context is provided
|
|
187
|
+
let command = step.command;
|
|
188
|
+
if (context) {
|
|
189
|
+
const srcDir = context.structure.hasSrcFolder ? "src" : "";
|
|
190
|
+
const appDir = context.structure.hasSrcFolder ? "src/app" : "app";
|
|
191
|
+
const variables = {
|
|
192
|
+
SRC_DIR: srcDir,
|
|
193
|
+
APP_DIR: appDir,
|
|
194
|
+
};
|
|
195
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
196
|
+
const placeholder = `{{${key}}}`;
|
|
197
|
+
command = command.replace(new RegExp(placeholder, "g"), value);
|
|
198
|
+
}
|
|
199
|
+
// Clean up empty path segments
|
|
200
|
+
command = command.replace(/\/+/g, "/").replace(/^\//, "");
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
execSync(command, {
|
|
204
|
+
cwd: projectPath,
|
|
205
|
+
stdio: "inherit",
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
throw new Error(`Command failed: ${command}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Create a new file
|
|
214
|
+
*/
|
|
215
|
+
async function createFile(projectPath, step) {
|
|
216
|
+
if (!step.file || !step.content) {
|
|
217
|
+
throw new Error("create-file requires file and content");
|
|
218
|
+
}
|
|
219
|
+
const filePath = join(projectPath, step.file);
|
|
220
|
+
// Skip if file exists and skipIfExists is true
|
|
221
|
+
if (step.skipIfExists && existsSync(filePath)) {
|
|
222
|
+
logger.info("File already exists, skipping creation");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Write file
|
|
226
|
+
await writeFile(filePath, step.content, "utf-8");
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=post-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-install.js","sourceRoot":"","sources":["../../src/installers/post-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Engine
|
|
3
|
+
*
|
|
4
|
+
* Handles template variable collection and substitution.
|
|
5
|
+
*/
|
|
6
|
+
import { TemplateVariable } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Collect template variable values from user
|
|
9
|
+
*/
|
|
10
|
+
export declare function collectTemplateVariables(templates: TemplateVariable[], options?: {
|
|
11
|
+
skipPrompts?: boolean;
|
|
12
|
+
defaults?: Record<string, string>;
|
|
13
|
+
}): Promise<Record<string, string>>;
|
|
14
|
+
/**
|
|
15
|
+
* Merge multiple variable sources
|
|
16
|
+
*/
|
|
17
|
+
export declare function mergeVariables(...sources: Record<string, string>[]): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Extract variables from answers
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractVariablesFromAnswers(answers: Record<string, any>): Record<string, string>;
|
|
22
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/installers/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,GACL,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoCjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Engine
|
|
3
|
+
*
|
|
4
|
+
* Handles template variable collection and substitution.
|
|
5
|
+
*/
|
|
6
|
+
import { input } from '../utils/prompts.js';
|
|
7
|
+
/**
|
|
8
|
+
* Collect template variable values from user
|
|
9
|
+
*/
|
|
10
|
+
export async function collectTemplateVariables(templates, options = {}) {
|
|
11
|
+
const variables = {};
|
|
12
|
+
for (const template of templates) {
|
|
13
|
+
const key = template.name;
|
|
14
|
+
// Use provided default or template default
|
|
15
|
+
const defaultValue = options.defaults?.[key] ?? template.default;
|
|
16
|
+
// Skip prompts if requested
|
|
17
|
+
if (options.skipPrompts) {
|
|
18
|
+
if (defaultValue) {
|
|
19
|
+
variables[key] = defaultValue;
|
|
20
|
+
}
|
|
21
|
+
else if (template.required) {
|
|
22
|
+
throw new Error(`Required template variable missing: ${template.name}`);
|
|
23
|
+
}
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
// Prompt user
|
|
27
|
+
const value = await input(template.description, defaultValue);
|
|
28
|
+
// Validate required
|
|
29
|
+
if (template.required && !value) {
|
|
30
|
+
throw new Error(`Required template variable: ${template.name}`);
|
|
31
|
+
}
|
|
32
|
+
if (value) {
|
|
33
|
+
variables[key] = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return variables;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Merge multiple variable sources
|
|
40
|
+
*/
|
|
41
|
+
export function mergeVariables(...sources) {
|
|
42
|
+
return Object.assign({}, ...sources);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Extract variables from answers
|
|
46
|
+
*/
|
|
47
|
+
export function extractVariablesFromAnswers(answers) {
|
|
48
|
+
const variables = {};
|
|
49
|
+
for (const [key, value] of Object.entries(answers)) {
|
|
50
|
+
if (typeof value === 'string') {
|
|
51
|
+
variables[key.toUpperCase()] = value;
|
|
52
|
+
}
|
|
53
|
+
else if (typeof value === 'boolean') {
|
|
54
|
+
variables[key.toUpperCase()] = value ? 'true' : 'false';
|
|
55
|
+
}
|
|
56
|
+
else if (value !== null && value !== undefined) {
|
|
57
|
+
variables[key.toUpperCase()] = String(value);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return variables;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/installers/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,SAA6B,EAC7B,UAGI,EAAE;IAEN,MAAM,SAAS,GAA2B,EAAE,CAAC;IAE7C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE1B,2CAA2C;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC;QAEjE,4BAA4B;QAC5B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,YAAY,EAAE,CAAC;gBACjB,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;YAChC,CAAC;iBAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,SAAS;QACX,CAAC;QAED,cAAc;QACd,MAAM,KAAK,GAAG,MAAM,KAAK,CACvB,QAAQ,CAAC,WAAW,EACpB,YAAY,CACb,CAAC;QAEF,oBAAoB;QACpB,IAAI,QAAQ,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAG,OAAiC;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAA4B;IAE5B,MAAM,SAAS,GAA2B,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;QACvC,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1D,CAAC;aAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACjD,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Loader
|
|
3
|
+
*
|
|
4
|
+
* Handles fetching and parsing the registry.json file from API endpoint.
|
|
5
|
+
*/
|
|
6
|
+
import { Registry } from "../types/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Load registry with caching
|
|
9
|
+
*
|
|
10
|
+
* @param options - Loading options
|
|
11
|
+
* @returns Registry object
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadRegistry(options?: {
|
|
14
|
+
forceRefresh?: boolean;
|
|
15
|
+
version?: string;
|
|
16
|
+
}): Promise<Registry>;
|
|
17
|
+
/**
|
|
18
|
+
* Clear registry cache (useful for testing)
|
|
19
|
+
*/
|
|
20
|
+
export declare function clearRegistryCache(): void;
|
|
21
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/registry/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA4B7C;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA0BpB;AAmCD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Loader
|
|
3
|
+
*
|
|
4
|
+
* Handles fetching and parsing the registry.json file from API endpoint.
|
|
5
|
+
*/
|
|
6
|
+
import { fetchRegistry as fetchRegistryFromAPI } from "../api/client.js";
|
|
7
|
+
/**
|
|
8
|
+
* Cache for loaded registry
|
|
9
|
+
*/
|
|
10
|
+
let cachedRegistry = null;
|
|
11
|
+
let cacheTimestamp = 0;
|
|
12
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
13
|
+
/**
|
|
14
|
+
* Load registry from API endpoint
|
|
15
|
+
*/
|
|
16
|
+
async function loadRegistryFromAPI(options) {
|
|
17
|
+
try {
|
|
18
|
+
return await fetchRegistryFromAPI(options);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error(`Failed to load registry from API: ${error instanceof Error ? error.message : String(error)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load registry with caching
|
|
26
|
+
*
|
|
27
|
+
* @param options - Loading options
|
|
28
|
+
* @returns Registry object
|
|
29
|
+
*/
|
|
30
|
+
export async function loadRegistry(options) {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
// Return cached registry if valid
|
|
33
|
+
if (cachedRegistry &&
|
|
34
|
+
!options?.forceRefresh &&
|
|
35
|
+
now - cacheTimestamp < CACHE_TTL) {
|
|
36
|
+
return cachedRegistry;
|
|
37
|
+
}
|
|
38
|
+
// Always load from API
|
|
39
|
+
const registry = await loadRegistryFromAPI({
|
|
40
|
+
forceRefresh: options?.forceRefresh,
|
|
41
|
+
version: options?.version,
|
|
42
|
+
});
|
|
43
|
+
// Validate registry
|
|
44
|
+
validateRegistry(registry);
|
|
45
|
+
// Update cache
|
|
46
|
+
cachedRegistry = registry;
|
|
47
|
+
cacheTimestamp = now;
|
|
48
|
+
return registry;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate registry structure
|
|
52
|
+
*/
|
|
53
|
+
function validateRegistry(registry) {
|
|
54
|
+
if (!registry || typeof registry !== "object") {
|
|
55
|
+
throw new Error("Invalid registry: must be an object");
|
|
56
|
+
}
|
|
57
|
+
if (!registry.version || typeof registry.version !== "string") {
|
|
58
|
+
throw new Error("Invalid registry: missing or invalid version");
|
|
59
|
+
}
|
|
60
|
+
if (!registry.metadata || typeof registry.metadata !== "object") {
|
|
61
|
+
throw new Error("Invalid registry: missing or invalid metadata");
|
|
62
|
+
}
|
|
63
|
+
if (!Array.isArray(registry.features)) {
|
|
64
|
+
throw new Error("Invalid registry: features must be an array");
|
|
65
|
+
}
|
|
66
|
+
if (!Array.isArray(registry.blocks)) {
|
|
67
|
+
throw new Error("Invalid registry: blocks must be an array");
|
|
68
|
+
}
|
|
69
|
+
if (!Array.isArray(registry.components)) {
|
|
70
|
+
throw new Error("Invalid registry: components must be an array");
|
|
71
|
+
}
|
|
72
|
+
if (registry.templates !== undefined && !Array.isArray(registry.templates)) {
|
|
73
|
+
throw new Error("Invalid registry: templates must be an array");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Clear registry cache (useful for testing)
|
|
78
|
+
*/
|
|
79
|
+
export function clearRegistryCache() {
|
|
80
|
+
cachedRegistry = null;
|
|
81
|
+
cacheTimestamp = 0;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/registry/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEzE;;GAEG;AACH,IAAI,cAAc,GAAoB,IAAI,CAAC;AAC3C,IAAI,cAAc,GAAW,CAAC,CAAC;AAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE7C;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAGlC;IACC,IAAI,CAAC;QACH,OAAO,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,qCACE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAGlC;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,kCAAkC;IAClC,IACE,cAAc;QACd,CAAC,OAAO,EAAE,YAAY;QACtB,GAAG,GAAG,cAAc,GAAG,SAAS,EAChC,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC;QACzC,YAAY,EAAE,OAAO,EAAE,YAAY;QACnC,OAAO,EAAE,OAAO,EAAE,OAAO;KAC1B,CAAC,CAAC;IAEH,oBAAoB;IACpB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3B,eAAe;IACf,cAAc,GAAG,QAAQ,CAAC;IAC1B,cAAc,GAAG,GAAG,CAAC;IAErB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAa;IACrC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,cAAc,GAAG,IAAI,CAAC;IACtB,cAAc,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Query
|
|
3
|
+
*
|
|
4
|
+
* Functions for querying and filtering registry entries.
|
|
5
|
+
*/
|
|
6
|
+
import { Registry, RegistryEntry } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get a feature by name
|
|
9
|
+
*/
|
|
10
|
+
export declare function getFeature(registry: Registry, name: string): RegistryEntry | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Get a block by name
|
|
13
|
+
*/
|
|
14
|
+
export declare function getBlock(registry: Registry, name: string): RegistryEntry | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get a component by name
|
|
17
|
+
*/
|
|
18
|
+
export declare function getComponent(registry: Registry, name: string): RegistryEntry | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Get a template by name
|
|
21
|
+
*/
|
|
22
|
+
export declare function getTemplate(registry: Registry, name: string): RegistryEntry | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Get any entry by name (searches all types)
|
|
25
|
+
*/
|
|
26
|
+
export declare function getEntry(registry: Registry, name: string): RegistryEntry | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Get all entries of a specific type
|
|
29
|
+
*/
|
|
30
|
+
export declare function getEntriesByType(registry: Registry, type: 'feature' | 'block' | 'component' | 'template'): RegistryEntry[];
|
|
31
|
+
/**
|
|
32
|
+
* Search entries by tag
|
|
33
|
+
*/
|
|
34
|
+
export declare function getEntriesByTag(registry: Registry, tag: string): RegistryEntry[];
|
|
35
|
+
/**
|
|
36
|
+
* Search entries by text (searches name, label, description)
|
|
37
|
+
*/
|
|
38
|
+
export declare function searchEntries(registry: Registry, query: string): RegistryEntry[];
|
|
39
|
+
/**
|
|
40
|
+
* Get all feature dependencies for an entry (recursive)
|
|
41
|
+
*/
|
|
42
|
+
export declare function getFeatureDependencies(registry: Registry, entryName: string, visited?: Set<string>): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Check if an entry has a specific variant
|
|
45
|
+
*/
|
|
46
|
+
export declare function hasVariant(entry: RegistryEntry, variantName: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Get variant from entry
|
|
49
|
+
*/
|
|
50
|
+
export declare function getVariant(entry: RegistryEntry, variantName: string): import("../types/registry.js").Variant | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* List all available variants for an entry
|
|
53
|
+
*/
|
|
54
|
+
export declare function listVariants(entry: RegistryEntry): string[];
|
|
55
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/registry/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEtF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEpF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAExF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEvF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAOpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GACnD,aAAa,EAAE,CAWjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAShF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAchF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,cAAoB,GAC1B,MAAM,EAAE,CAuBV;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sDAEnE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CAE3D"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Query
|
|
3
|
+
*
|
|
4
|
+
* Functions for querying and filtering registry entries.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get a feature by name
|
|
8
|
+
*/
|
|
9
|
+
export function getFeature(registry, name) {
|
|
10
|
+
return registry.features.find(f => f.name === name);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get a block by name
|
|
14
|
+
*/
|
|
15
|
+
export function getBlock(registry, name) {
|
|
16
|
+
return registry.blocks.find(b => b.name === name);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get a component by name
|
|
20
|
+
*/
|
|
21
|
+
export function getComponent(registry, name) {
|
|
22
|
+
return registry.components.find(c => c.name === name);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get a template by name
|
|
26
|
+
*/
|
|
27
|
+
export function getTemplate(registry, name) {
|
|
28
|
+
return registry.templates?.find(t => t.name === name);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get any entry by name (searches all types)
|
|
32
|
+
*/
|
|
33
|
+
export function getEntry(registry, name) {
|
|
34
|
+
return (getFeature(registry, name) ||
|
|
35
|
+
getBlock(registry, name) ||
|
|
36
|
+
getComponent(registry, name) ||
|
|
37
|
+
getTemplate(registry, name));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get all entries of a specific type
|
|
41
|
+
*/
|
|
42
|
+
export function getEntriesByType(registry, type) {
|
|
43
|
+
switch (type) {
|
|
44
|
+
case 'feature':
|
|
45
|
+
return registry.features;
|
|
46
|
+
case 'block':
|
|
47
|
+
return registry.blocks;
|
|
48
|
+
case 'component':
|
|
49
|
+
return registry.components;
|
|
50
|
+
case 'template':
|
|
51
|
+
return registry.templates ?? [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Search entries by tag
|
|
56
|
+
*/
|
|
57
|
+
export function getEntriesByTag(registry, tag) {
|
|
58
|
+
const allEntries = [
|
|
59
|
+
...registry.features,
|
|
60
|
+
...registry.blocks,
|
|
61
|
+
...registry.components,
|
|
62
|
+
...(registry.templates ?? []),
|
|
63
|
+
];
|
|
64
|
+
return allEntries.filter(entry => entry.tags?.includes(tag));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Search entries by text (searches name, label, description)
|
|
68
|
+
*/
|
|
69
|
+
export function searchEntries(registry, query) {
|
|
70
|
+
const allEntries = [
|
|
71
|
+
...registry.features,
|
|
72
|
+
...registry.blocks,
|
|
73
|
+
...registry.components,
|
|
74
|
+
...(registry.templates ?? []),
|
|
75
|
+
];
|
|
76
|
+
const lowerQuery = query.toLowerCase();
|
|
77
|
+
return allEntries.filter(entry => {
|
|
78
|
+
const searchText = `${entry.name} ${entry.label} ${entry.description}`.toLowerCase();
|
|
79
|
+
return searchText.includes(lowerQuery);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get all feature dependencies for an entry (recursive)
|
|
84
|
+
*/
|
|
85
|
+
export function getFeatureDependencies(registry, entryName, visited = new Set()) {
|
|
86
|
+
// Prevent circular dependencies
|
|
87
|
+
if (visited.has(entryName)) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
visited.add(entryName);
|
|
91
|
+
const entry = getEntry(registry, entryName);
|
|
92
|
+
if (!entry || !entry.featureDependencies) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const deps = [];
|
|
96
|
+
for (const depName of entry.featureDependencies) {
|
|
97
|
+
deps.push(depName);
|
|
98
|
+
// Recursively get dependencies of dependencies
|
|
99
|
+
const nestedDeps = getFeatureDependencies(registry, depName, visited);
|
|
100
|
+
deps.push(...nestedDeps);
|
|
101
|
+
}
|
|
102
|
+
// Return unique dependencies
|
|
103
|
+
return [...new Set(deps)];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if an entry has a specific variant
|
|
107
|
+
*/
|
|
108
|
+
export function hasVariant(entry, variantName) {
|
|
109
|
+
return entry.variants?.some(v => v.name === variantName) ?? false;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get variant from entry
|
|
113
|
+
*/
|
|
114
|
+
export function getVariant(entry, variantName) {
|
|
115
|
+
return entry.variants?.find(v => v.name === variantName);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* List all available variants for an entry
|
|
119
|
+
*/
|
|
120
|
+
export function listVariants(entry) {
|
|
121
|
+
return entry.variants?.map(v => v.name) ?? [];
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=query.js.map
|