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.
Files changed (104) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +183 -0
  3. package/README.npm.md +183 -0
  4. package/dist/api/client.d.ts +47 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +329 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/auth/browser.d.ts +11 -0
  9. package/dist/auth/browser.d.ts.map +1 -0
  10. package/dist/auth/browser.js +46 -0
  11. package/dist/auth/browser.js.map +1 -0
  12. package/dist/auth/flow.d.ts +28 -0
  13. package/dist/auth/flow.d.ts.map +1 -0
  14. package/dist/auth/flow.js +171 -0
  15. package/dist/auth/flow.js.map +1 -0
  16. package/dist/auth/storage.d.ts +30 -0
  17. package/dist/auth/storage.d.ts.map +1 -0
  18. package/dist/auth/storage.js +112 -0
  19. package/dist/auth/storage.js.map +1 -0
  20. package/dist/commands/add.d.ts +8 -0
  21. package/dist/commands/add.d.ts.map +1 -0
  22. package/dist/commands/add.js +285 -0
  23. package/dist/commands/add.js.map +1 -0
  24. package/dist/commands/init.d.ts +8 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +230 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/list.d.ts +8 -0
  29. package/dist/commands/list.d.ts.map +1 -0
  30. package/dist/commands/list.js +176 -0
  31. package/dist/commands/list.js.map +1 -0
  32. package/dist/index.d.ts +9 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +83 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/installers/dependencies.d.ts +27 -0
  37. package/dist/installers/dependencies.d.ts.map +1 -0
  38. package/dist/installers/dependencies.js +185 -0
  39. package/dist/installers/dependencies.js.map +1 -0
  40. package/dist/installers/files.d.ts +50 -0
  41. package/dist/installers/files.d.ts.map +1 -0
  42. package/dist/installers/files.js +211 -0
  43. package/dist/installers/files.js.map +1 -0
  44. package/dist/installers/install-feature.d.ts +20 -0
  45. package/dist/installers/install-feature.d.ts.map +1 -0
  46. package/dist/installers/install-feature.js +169 -0
  47. package/dist/installers/install-feature.js.map +1 -0
  48. package/dist/installers/post-install.d.ts +18 -0
  49. package/dist/installers/post-install.d.ts.map +1 -0
  50. package/dist/installers/post-install.js +228 -0
  51. package/dist/installers/post-install.js.map +1 -0
  52. package/dist/installers/templates.d.ts +22 -0
  53. package/dist/installers/templates.d.ts.map +1 -0
  54. package/dist/installers/templates.js +62 -0
  55. package/dist/installers/templates.js.map +1 -0
  56. package/dist/registry/loader.d.ts +21 -0
  57. package/dist/registry/loader.d.ts.map +1 -0
  58. package/dist/registry/loader.js +83 -0
  59. package/dist/registry/loader.js.map +1 -0
  60. package/dist/registry/query.d.ts +55 -0
  61. package/dist/registry/query.d.ts.map +1 -0
  62. package/dist/registry/query.js +123 -0
  63. package/dist/registry/query.js.map +1 -0
  64. package/dist/types/config.d.ts +85 -0
  65. package/dist/types/config.d.ts.map +1 -0
  66. package/dist/types/config.js +7 -0
  67. package/dist/types/config.js.map +1 -0
  68. package/dist/types/index.d.ts +9 -0
  69. package/dist/types/index.d.ts.map +1 -0
  70. package/dist/types/index.js +9 -0
  71. package/dist/types/index.js.map +1 -0
  72. package/dist/types/registry.d.ts +180 -0
  73. package/dist/types/registry.d.ts.map +1 -0
  74. package/dist/types/registry.js +8 -0
  75. package/dist/types/registry.js.map +1 -0
  76. package/dist/types/wizard.d.ts +43 -0
  77. package/dist/types/wizard.d.ts.map +1 -0
  78. package/dist/types/wizard.js +59 -0
  79. package/dist/types/wizard.js.map +1 -0
  80. package/dist/utils/clack-wizard.d.ts +9 -0
  81. package/dist/utils/clack-wizard.d.ts.map +1 -0
  82. package/dist/utils/clack-wizard.js +328 -0
  83. package/dist/utils/clack-wizard.js.map +1 -0
  84. package/dist/utils/config.d.ts +49 -0
  85. package/dist/utils/config.d.ts.map +1 -0
  86. package/dist/utils/config.js +121 -0
  87. package/dist/utils/config.js.map +1 -0
  88. package/dist/utils/logger.d.ts +56 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/dist/utils/logger.js +93 -0
  91. package/dist/utils/logger.js.map +1 -0
  92. package/dist/utils/package-manager.d.ts +41 -0
  93. package/dist/utils/package-manager.d.ts.map +1 -0
  94. package/dist/utils/package-manager.js +118 -0
  95. package/dist/utils/package-manager.js.map +1 -0
  96. package/dist/utils/prompts.d.ts +22 -0
  97. package/dist/utils/prompts.d.ts.map +1 -0
  98. package/dist/utils/prompts.js +142 -0
  99. package/dist/utils/prompts.js.map +1 -0
  100. package/dist/utils/validation.d.ts +50 -0
  101. package/dist/utils/validation.d.ts.map +1 -0
  102. package/dist/utils/validation.js +108 -0
  103. package/dist/utils/validation.js.map +1 -0
  104. 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