@modularcore/cli 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 (65) hide show
  1. package/dist/commands/add.d.ts +15 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +66 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/diff.d.ts +14 -0
  6. package/dist/commands/diff.d.ts.map +1 -0
  7. package/dist/commands/diff.js +40 -0
  8. package/dist/commands/diff.js.map +1 -0
  9. package/dist/commands/init.d.ts +13 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +48 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/list.d.ts +5 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +11 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/search.d.ts +4 -0
  18. package/dist/commands/search.d.ts.map +1 -0
  19. package/dist/commands/search.js +9 -0
  20. package/dist/commands/search.js.map +1 -0
  21. package/dist/commands/update.d.ts +19 -0
  22. package/dist/commands/update.d.ts.map +1 -0
  23. package/dist/commands/update.js +56 -0
  24. package/dist/commands/update.js.map +1 -0
  25. package/dist/config.d.ts +12 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +53 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/deps.d.ts +36 -0
  30. package/dist/deps.d.ts.map +1 -0
  31. package/dist/deps.js +93 -0
  32. package/dist/deps.js.map +1 -0
  33. package/dist/errors.d.ts +19 -0
  34. package/dist/errors.d.ts.map +1 -0
  35. package/dist/errors.js +31 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/files.d.ts +23 -0
  38. package/dist/files.d.ts.map +1 -0
  39. package/dist/files.js +124 -0
  40. package/dist/files.js.map +1 -0
  41. package/dist/format-error.d.ts +11 -0
  42. package/dist/format-error.d.ts.map +1 -0
  43. package/dist/format-error.js +18 -0
  44. package/dist/format-error.js.map +1 -0
  45. package/dist/framework-detect.d.ts +23 -0
  46. package/dist/framework-detect.d.ts.map +1 -0
  47. package/dist/framework-detect.js +70 -0
  48. package/dist/framework-detect.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +116 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/install.d.ts +10 -0
  54. package/dist/install.d.ts.map +1 -0
  55. package/dist/install.js +38 -0
  56. package/dist/install.js.map +1 -0
  57. package/dist/prompts.d.ts +19 -0
  58. package/dist/prompts.d.ts.map +1 -0
  59. package/dist/prompts.js +39 -0
  60. package/dist/prompts.js.map +1 -0
  61. package/dist/registry-client.d.ts +8 -0
  62. package/dist/registry-client.d.ts.map +1 -0
  63. package/dist/registry-client.js +68 -0
  64. package/dist/registry-client.js.map +1 -0
  65. package/package.json +37 -0
@@ -0,0 +1,15 @@
1
+ import type { RegistryClient } from '@modularcore/registry-client';
2
+ import type { PromptAdapter } from '../prompts.js';
3
+ import type { WriteResult } from '@modularcore/registry';
4
+ export interface AddOptions {
5
+ cwd: string;
6
+ client: RegistryClient;
7
+ prompts: PromptAdapter;
8
+ }
9
+ export interface AddResult {
10
+ installedComponents: string[];
11
+ filesWritten: WriteResult[];
12
+ envKeysAdded: string[];
13
+ }
14
+ export declare function runAdd(name: string, { cwd, client, prompts }: AddOptions): Promise<AddResult>;
15
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,UAAU,GACnC,OAAO,CAAC,SAAS,CAAC,CAyEpB"}
@@ -0,0 +1,66 @@
1
+ import { assertCompatible, collectNpmDependencies, resolveRegistryDependencies } from '../deps.js';
2
+ import { readProjectConfig, writeProjectConfig } from '../config.js';
3
+ import { detectPackageManager, installedPeerVersion, readPackageJson, } from '../framework-detect.js';
4
+ import { appendEnvExample, remapTarget } from '../files.js';
5
+ import { installNpmDependencies } from '../install.js';
6
+ import { CliError } from '../errors.js';
7
+ import { isTrackedWriteError, writeFilesTracked } from '@modularcore/registry-client';
8
+ export async function runAdd(name, { cwd, client, prompts }) {
9
+ const config = await readProjectConfig(cwd);
10
+ const packageManager = await detectPackageManager(cwd);
11
+ const projectPackageJson = await readPackageJson(cwd);
12
+ const entries = await resolveRegistryDependencies(client, name);
13
+ for (const entry of entries) {
14
+ assertCompatible(entry, config.framework, (peerName) => installedPeerVersion(projectPackageJson, peerName));
15
+ }
16
+ const npmDeps = collectNpmDependencies(entries);
17
+ if (npmDeps.length > 0) {
18
+ prompts.note(npmDeps.map((dep) => `${dep.name}@${dep.version}`).join('\n'), 'Se instalarán las siguientes dependencias npm (--ignore-scripts)');
19
+ const confirmed = await prompts.confirm(`¿Instalar ${npmDeps.length} dependencia(s) con ${packageManager} y escribir los archivos de "${name}"?`);
20
+ if (!confirmed) {
21
+ throw new CliError('Operación cancelada por el usuario. No se escribió ningún archivo.');
22
+ }
23
+ }
24
+ else {
25
+ const confirmed = await prompts.confirm(`¿Escribir los archivos de "${name}" en este proyecto?`);
26
+ if (!confirmed) {
27
+ throw new CliError('Operación cancelada por el usuario. No se escribió ningún archivo.');
28
+ }
29
+ }
30
+ await installNpmDependencies(cwd, packageManager, npmDeps);
31
+ const filesWritten = [];
32
+ try {
33
+ for (const entry of entries) {
34
+ const remappedFiles = entry.files.map((file) => ({
35
+ ...file,
36
+ target: remapTarget(file.target, config.paths),
37
+ }));
38
+ const written = await writeFilesTracked(remappedFiles, cwd);
39
+ filesWritten.push(...written);
40
+ }
41
+ }
42
+ catch (error) {
43
+ if (isTrackedWriteError(error)) {
44
+ filesWritten.push(...error.filesWritten);
45
+ throw new CliError(`${error.message}\nArchivos ya escritos antes del fallo:\n${filesWritten
46
+ .map((result) => `- ${result.target}`)
47
+ .join('\n')}`);
48
+ }
49
+ throw error;
50
+ }
51
+ const envKeysAdded = [];
52
+ for (const entry of entries) {
53
+ const { added } = await appendEnvExample(cwd, entry.envVariables);
54
+ envKeysAdded.push(...added);
55
+ }
56
+ for (const entry of entries) {
57
+ config.installed[entry.name] = entry.version;
58
+ }
59
+ await writeProjectConfig(cwd, config);
60
+ return {
61
+ installedComponents: entries.map((entry) => entry.name),
62
+ filesWritten,
63
+ envKeysAdded,
64
+ };
65
+ }
66
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DiffLine } from '../files.js';
2
+ import type { RegistryClient } from '@modularcore/registry-client';
3
+ export interface FileDiffResult {
4
+ target: string;
5
+ status: 'missing-locally' | 'unchanged' | 'changed' | 'binary-changed';
6
+ lines?: DiffLine[];
7
+ }
8
+ export interface DiffResult {
9
+ name: string;
10
+ files: FileDiffResult[];
11
+ }
12
+ export declare function runDiff(client: RegistryClient, name: string, cwd: string): Promise<DiffResult>;
13
+ export declare function formatDiffLines(lines: DiffLine[]): string;
14
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,gBAAgB,CAAC;IACvE,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAOzD"}
@@ -0,0 +1,40 @@
1
+ import { decodeFileContent, diffLines, readLocalFileBuffer, remapTarget } from '../files.js';
2
+ import { readProjectConfig } from '../config.js';
3
+ import { resolveTargetPath } from '@modularcore/registry-client';
4
+ export async function runDiff(client, name, cwd) {
5
+ const config = await readProjectConfig(cwd);
6
+ const entry = await client.getDescriptor(name);
7
+ const files = [];
8
+ for (const file of entry.files) {
9
+ const localPath = resolveTargetPath(cwd, remapTarget(file.target, config.paths));
10
+ const localBuffer = await readLocalFileBuffer(localPath);
11
+ if (localBuffer === undefined) {
12
+ files.push({ target: localPath, status: 'missing-locally' });
13
+ continue;
14
+ }
15
+ const registryBuffer = decodeFileContent(file);
16
+ if (registryBuffer.equals(localBuffer)) {
17
+ files.push({ target: localPath, status: 'unchanged' });
18
+ continue;
19
+ }
20
+ if (file.encoding === 'base64') {
21
+ files.push({ target: localPath, status: 'binary-changed' });
22
+ continue;
23
+ }
24
+ files.push({
25
+ target: localPath,
26
+ status: 'changed',
27
+ lines: diffLines(localBuffer.toString('utf8'), registryBuffer.toString('utf8')),
28
+ });
29
+ }
30
+ return { name: entry.name, files };
31
+ }
32
+ export function formatDiffLines(lines) {
33
+ return lines
34
+ .map((line) => {
35
+ const prefix = line.kind === 'added' ? '+' : line.kind === 'removed' ? '-' : ' ';
36
+ return `${prefix} ${line.text}`;
37
+ })
38
+ .join('\n');
39
+ }
40
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAgBjE,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAsB,EACtB,IAAY,EACZ,GAAW;IAEX,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAChF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACjF,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ProjectConfig } from '../config.js';
2
+ import type { PromptAdapter } from '../prompts.js';
3
+ export interface InitOptions {
4
+ cwd: string;
5
+ prompts: PromptAdapter;
6
+ }
7
+ /**
8
+ * AD2: only auto-picks the framework when detection is unambiguous (exactly one match,
9
+ * cwd isn't a workspace root). Anything else — 0 matches, >1 matches, or a monorepo
10
+ * root — prompts explicitly instead of guessing.
11
+ */
12
+ export declare function runInit({ cwd, prompts }: InitOptions): Promise<ProjectConfig>;
13
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AASnD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA2CnF"}
@@ -0,0 +1,48 @@
1
+ import { detectFrameworks, detectPackageManager, isWorkspaceRoot } from '../framework-detect.js';
2
+ import { writeProjectConfig } from '../config.js';
3
+ const FRAMEWORK_OPTIONS = ['react', 'svelte', 'vue', 'angular'];
4
+ const DEFAULT_REGISTRY_URL = 'http://localhost:5173/registry';
5
+ const DEFAULT_PATHS = {
6
+ components: 'src/components',
7
+ lib: 'src/lib/modularcore',
8
+ };
9
+ /**
10
+ * AD2: only auto-picks the framework when detection is unambiguous (exactly one match,
11
+ * cwd isn't a workspace root). Anything else — 0 matches, >1 matches, or a monorepo
12
+ * root — prompts explicitly instead of guessing.
13
+ */
14
+ export async function runInit({ cwd, prompts }) {
15
+ prompts.intro('modularcore init');
16
+ const [{ frameworks }, workspaceRoot, packageManager] = await Promise.all([
17
+ detectFrameworks(cwd),
18
+ isWorkspaceRoot(cwd),
19
+ detectPackageManager(cwd),
20
+ ]);
21
+ let framework;
22
+ if (frameworks.length === 1 && !workspaceRoot) {
23
+ framework = frameworks[0];
24
+ prompts.note(`Framework detectado: ${framework}`, 'Detección');
25
+ }
26
+ else {
27
+ const reason = workspaceRoot
28
+ ? 'este directorio parece la raíz de un workspace'
29
+ : frameworks.length === 0
30
+ ? 'no se detectó ningún framework soportado'
31
+ : `se detectaron varios frameworks (${frameworks.join(', ')})`;
32
+ prompts.note(reason, 'Selección manual requerida');
33
+ framework = await prompts.select('¿Qué framework usa este proyecto?', FRAMEWORK_OPTIONS.map((value) => ({ value, label: value })));
34
+ }
35
+ const componentsPath = await prompts.text('Ruta para componentes (paths.components)', DEFAULT_PATHS.components);
36
+ const libPath = await prompts.text('Ruta para librería (paths.lib)', DEFAULT_PATHS.lib);
37
+ const registryUrl = await prompts.text('URL del registry', DEFAULT_REGISTRY_URL);
38
+ const config = {
39
+ registryUrl,
40
+ framework,
41
+ paths: { components: componentsPath, lib: libPath },
42
+ installed: {},
43
+ };
44
+ await writeProjectConfig(cwd, config);
45
+ prompts.outro(`modularcore.json escrito. Package manager detectado: ${packageManager}.`);
46
+ return config;
47
+ }
48
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAMlD,MAAM,iBAAiB,GAAwB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AACrF,MAAM,oBAAoB,GAAG,gCAAgC,CAAC;AAC9D,MAAM,aAAa,GAA2B;IAC5C,UAAU,EAAE,gBAAgB;IAC5B,GAAG,EAAE,qBAAqB;CAC3B,CAAC;AAOF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAe;IACzD,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAElC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxE,gBAAgB,CAAC,GAAG,CAAC;QACrB,eAAe,CAAC,GAAG,CAAC;QACpB,oBAAoB,CAAC,GAAG,CAAC;KAC1B,CAAC,CAAC;IAEH,IAAI,SAAiB,CAAC;IACtB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9C,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,aAAa;YAC1B,CAAC,CAAC,gDAAgD;YAClD,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;gBACvB,CAAC,CAAC,0CAA0C;gBAC5C,CAAC,CAAC,oCAAoC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;QACnD,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,CAC9B,mCAAmC,EACnC,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CACvC,0CAA0C,EAC1C,aAAa,CAAC,UAAU,CACzB,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IACxF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;IAEjF,MAAM,MAAM,GAAkB;QAC5B,WAAW;QACX,SAAS;QACT,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE;QACnD,SAAS,EAAE,EAAE;KACd,CAAC;IACF,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO,CAAC,KAAK,CAAC,wDAAwD,cAAc,GAAG,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RegistryClient } from '@modularcore/registry-client';
2
+ import type { RegistryIndexEntry } from '@modularcore/registry';
3
+ export declare function runList(client: RegistryClient): Promise<RegistryIndexEntry[]>;
4
+ export declare function formatIndexEntries(entries: RegistryIndexEntry[]): string;
5
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,wBAAsB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAEnF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAKxE"}
@@ -0,0 +1,11 @@
1
+ export async function runList(client) {
2
+ return client.getIndex();
3
+ }
4
+ export function formatIndexEntries(entries) {
5
+ if (entries.length === 0)
6
+ return '(sin componentes públicos)';
7
+ return entries
8
+ .map((entry) => `${entry.name}@${entry.version} [${entry.category}] ${entry.title}`)
9
+ .join('\n');
10
+ }
11
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAsB;IAClD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,4BAA4B,CAAC;IAC9D,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,QAAQ,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;SACrF,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RegistryClient } from '@modularcore/registry-client';
2
+ import type { RegistryIndexEntry } from '@modularcore/registry';
3
+ export declare function runSearch(client: RegistryClient, query: string): Promise<RegistryIndexEntry[]>;
4
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,wBAAsB,SAAS,CAC7B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAS/B"}
@@ -0,0 +1,9 @@
1
+ export async function runSearch(client, query) {
2
+ const index = await client.getIndex();
3
+ const needle = query.toLowerCase();
4
+ return index.filter((entry) => [entry.name, entry.title, entry.category, entry.description ?? '']
5
+ .join(' ')
6
+ .toLowerCase()
7
+ .includes(needle));
8
+ }
9
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAsB,EACtB,KAAa;IAEb,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;SAC/D,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE;SACb,QAAQ,CAAC,MAAM,CAAC,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { RegistryClient } from '@modularcore/registry-client';
2
+ import type { PromptAdapter } from '../prompts.js';
3
+ export interface UpdateOptions {
4
+ cwd: string;
5
+ client: RegistryClient;
6
+ prompts: PromptAdapter;
7
+ }
8
+ export interface UpdateFileOutcome {
9
+ target: string;
10
+ action: 'written' | 'skipped' | 'unchanged';
11
+ backedUp: boolean;
12
+ }
13
+ export interface UpdateResult {
14
+ name: string;
15
+ version: string;
16
+ files: UpdateFileOutcome[];
17
+ }
18
+ export declare function runUpdate(name: string | undefined, options: UpdateOptions): Promise<UpdateResult[]>;
19
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAkDD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAczB"}
@@ -0,0 +1,56 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { backupExisting, decodeFileContent, diffLines, readLocalFileBuffer, remapTarget, } from '../files.js';
4
+ import { readProjectConfig, writeProjectConfig } from '../config.js';
5
+ import { formatDiffLines } from './diff.js';
6
+ import { resolveTargetPath } from '@modularcore/registry-client';
7
+ /**
8
+ * Re-injects a single component's files with per-file confirmation: shows a diff before
9
+ * each overwrite, backs up the pre-existing file to `.orig`, and only writes when the
10
+ * user confirms — never silently clobbers local edits.
11
+ */
12
+ async function updateComponent(name, { cwd, client, prompts }, paths) {
13
+ const entry = await client.getDescriptor(name);
14
+ const outcomes = [];
15
+ for (const file of entry.files) {
16
+ const localPath = resolveTargetPath(cwd, remapTarget(file.target, paths));
17
+ const localBuffer = await readLocalFileBuffer(localPath);
18
+ const registryBuffer = decodeFileContent(file);
19
+ if (localBuffer !== undefined && registryBuffer.equals(localBuffer)) {
20
+ outcomes.push({ target: localPath, action: 'unchanged', backedUp: false });
21
+ continue;
22
+ }
23
+ if (localBuffer !== undefined && file.encoding !== 'base64') {
24
+ prompts.note(formatDiffLines(diffLines(localBuffer.toString('utf8'), registryBuffer.toString('utf8'))), localPath);
25
+ }
26
+ else {
27
+ prompts.note(localBuffer === undefined ? '(archivo nuevo)' : '(contenido binario cambiado)', localPath);
28
+ }
29
+ const confirmed = await prompts.confirm(`¿Sobrescribir "${localPath}"?`, false);
30
+ if (!confirmed) {
31
+ outcomes.push({ target: localPath, action: 'skipped', backedUp: false });
32
+ continue;
33
+ }
34
+ const backedUp = await backupExisting(localPath);
35
+ await mkdir(dirname(localPath), { recursive: true });
36
+ await writeFile(localPath, registryBuffer);
37
+ outcomes.push({ target: localPath, action: 'written', backedUp });
38
+ }
39
+ return { name: entry.name, version: entry.version, files: outcomes };
40
+ }
41
+ export async function runUpdate(name, options) {
42
+ const config = await readProjectConfig(options.cwd);
43
+ const targets = name ? [name] : Object.keys(config.installed);
44
+ if (targets.length === 0) {
45
+ return [];
46
+ }
47
+ const results = [];
48
+ for (const target of targets) {
49
+ const result = await updateComponent(target, options, config.paths);
50
+ results.push(result);
51
+ config.installed[result.name] = result.version;
52
+ }
53
+ await writeProjectConfig(options.cwd, config);
54
+ return results;
55
+ }
56
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const PROJECT_CONFIG_FILENAME = "modularcore.json";
2
+ export interface ProjectConfig {
3
+ registryUrl: string;
4
+ framework: string;
5
+ paths: Record<string, string>;
6
+ installed: Record<string, string>;
7
+ }
8
+ export declare function projectConfigPath(cwd: string): string;
9
+ export declare function readProjectConfig(cwd: string): Promise<ProjectConfig>;
10
+ export declare function writeProjectConfig(cwd: string, config: ProjectConfig): Promise<void>;
11
+ export declare function projectConfigExists(cwd: string): Promise<boolean>;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,qBAAqB,CAAC;AAE1D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAeD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAsB3E;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1F;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE"}
package/dist/config.js ADDED
@@ -0,0 +1,53 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { CliError } from './errors.js';
4
+ export const PROJECT_CONFIG_FILENAME = 'modularcore.json';
5
+ function isProjectConfig(value) {
6
+ if (typeof value !== 'object' || value === null)
7
+ return false;
8
+ const record = value;
9
+ return (typeof record.registryUrl === 'string' &&
10
+ typeof record.framework === 'string' &&
11
+ typeof record.paths === 'object' &&
12
+ record.paths !== null &&
13
+ typeof record.installed === 'object' &&
14
+ record.installed !== null);
15
+ }
16
+ export function projectConfigPath(cwd) {
17
+ return join(cwd, PROJECT_CONFIG_FILENAME);
18
+ }
19
+ export async function readProjectConfig(cwd) {
20
+ const path = projectConfigPath(cwd);
21
+ let raw;
22
+ try {
23
+ raw = await readFile(path, 'utf8');
24
+ }
25
+ catch {
26
+ throw new CliError(`No se encontró "${PROJECT_CONFIG_FILENAME}" en ${cwd}. Corre \`modularcore init\` primero.`);
27
+ }
28
+ let parsed;
29
+ try {
30
+ parsed = JSON.parse(raw);
31
+ }
32
+ catch (error) {
33
+ throw new CliError(`"${path}" no es JSON válido: ${error.message}`);
34
+ }
35
+ if (!isProjectConfig(parsed)) {
36
+ throw new CliError(`"${path}" no tiene el formato esperado (registryUrl/framework/paths/installed).`);
37
+ }
38
+ return parsed;
39
+ }
40
+ export async function writeProjectConfig(cwd, config) {
41
+ const path = projectConfigPath(cwd);
42
+ await writeFile(path, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
43
+ }
44
+ export async function projectConfigExists(cwd) {
45
+ try {
46
+ await readFile(projectConfigPath(cwd), 'utf8');
47
+ return true;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAS1D,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,CACL,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;QACtC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAChC,MAAM,CAAC,KAAK,KAAK,IAAI;QACrB,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,MAAM,CAAC,SAAS,KAAK,IAAI,CAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,mBAAmB,uBAAuB,QAAQ,GAAG,uCAAuC,CAC7F,CAAC;IACJ,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,IAAI,IAAI,wBAAyB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAChB,IAAI,IAAI,yEAAyE,CAClF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,MAAqB;IACzE,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACnD,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/deps.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ import type { RegistryClient } from '@modularcore/registry-client';
2
+ import type { RegistryEntry } from '@modularcore/registry';
3
+ /**
4
+ * AD2: rejects before any file is written if the project's framework isn't declared
5
+ * by the component, or if an installed peer (React/Svelte/...) doesn't satisfy the
6
+ * semver range the component requires.
7
+ */
8
+ export declare function assertCompatible(entry: RegistryEntry, projectFramework: string, installedPeerVersion: (peerName: string) => string | undefined): void;
9
+ /**
10
+ * Recursively resolves `registryDependencies`, depth-first, detecting cycles explicitly
11
+ * (rather than looping forever or silently dropping the second visit). Returns entries
12
+ * ordered dependencies-first so files can be written in a safe order, deduplicated by name.
13
+ */
14
+ export declare function resolveRegistryDependencies(client: RegistryClient, rootName: string): Promise<RegistryEntry[]>;
15
+ export interface NpmDependencySpec {
16
+ name: string;
17
+ version: string;
18
+ raw: string;
19
+ }
20
+ /**
21
+ * SA2: the descriptor's `dependencies` are plain strings, so a pinned/semver version is
22
+ * enforced by convention (`name@range`) rather than the schema. Rejects bare package
23
+ * names (no `@range`) so `add` never installs an unpinned, unreviewed version.
24
+ */
25
+ export declare function parseNpmDependencySpec(raw: string): NpmDependencySpec;
26
+ /**
27
+ * SA2 allowlist (single-maintainer MVP): the only "allowlist" that exists is the set of
28
+ * `dependencies` the registry descriptor itself declares — the descriptor is authored and
29
+ * reviewed as part of this monorepo's `packages/*`, so no separate external allowlist file
30
+ * exists yet. The real gate is that `add` never installs anything beyond what the fetched
31
+ * descriptor(s) declare, and always asks for explicit user confirmation before invoking the
32
+ * package manager (see commands/add.ts). This function also fails loudly on a same-name
33
+ * conflicting version range across entries instead of silently picking one.
34
+ */
35
+ export declare function collectNpmDependencies(entries: RegistryEntry[]): NpmDependencySpec[];
36
+ //# sourceMappingURL=deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,EACpB,gBAAgB,EAAE,MAAM,EACxB,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAC7D,IAAI,CAwBN;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,EAAE,CAAC,CAuB1B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAerE;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,iBAAiB,EAAE,CAgBpF"}
package/dist/deps.js ADDED
@@ -0,0 +1,93 @@
1
+ import semver from 'semver';
2
+ import { CompatibilityError, DependencyCycleError } from './errors.js';
3
+ /**
4
+ * AD2: rejects before any file is written if the project's framework isn't declared
5
+ * by the component, or if an installed peer (React/Svelte/...) doesn't satisfy the
6
+ * semver range the component requires.
7
+ */
8
+ export function assertCompatible(entry, projectFramework, installedPeerVersion) {
9
+ if (!entry.frameworks.includes('agnostic') && !entry.frameworks.includes(projectFramework)) {
10
+ throw new CompatibilityError(`"${entry.name}" no soporta el framework de este proyecto ("${projectFramework}"). ` +
11
+ `Frameworks soportados: ${entry.frameworks.join(', ')}.`);
12
+ }
13
+ for (const [peerName, range] of Object.entries(entry.peerDependencies)) {
14
+ const installedRange = installedPeerVersion(peerName);
15
+ if (!installedRange) {
16
+ throw new CompatibilityError(`"${entry.name}" requiere el peer dependency "${peerName}" (${range}), ` +
17
+ `pero no está declarado en el package.json de este proyecto.`);
18
+ }
19
+ const satisfiable = semver.validRange(installedRange) !== null &&
20
+ semver.intersects(installedRange, range, { includePrerelease: true });
21
+ if (!satisfiable) {
22
+ throw new CompatibilityError(`"${entry.name}" requiere "${peerName}" ${range}, pero este proyecto declara "${peerName}" ${installedRange}.`);
23
+ }
24
+ }
25
+ }
26
+ /**
27
+ * Recursively resolves `registryDependencies`, depth-first, detecting cycles explicitly
28
+ * (rather than looping forever or silently dropping the second visit). Returns entries
29
+ * ordered dependencies-first so files can be written in a safe order, deduplicated by name.
30
+ */
31
+ export async function resolveRegistryDependencies(client, rootName) {
32
+ const resolved = new Map();
33
+ const order = [];
34
+ async function visit(name, chain) {
35
+ if (chain.includes(name)) {
36
+ throw new DependencyCycleError(`Ciclo detectado en registryDependencies: ${[...chain, name].join(' -> ')}`);
37
+ }
38
+ if (resolved.has(name))
39
+ return;
40
+ const entry = await client.getDescriptor(name);
41
+ for (const dep of entry.registryDependencies) {
42
+ await visit(dep, [...chain, name]);
43
+ }
44
+ if (!resolved.has(name)) {
45
+ resolved.set(name, entry);
46
+ order.push(name);
47
+ }
48
+ }
49
+ await visit(rootName, []);
50
+ return order.map((name) => resolved.get(name));
51
+ }
52
+ /**
53
+ * SA2: the descriptor's `dependencies` are plain strings, so a pinned/semver version is
54
+ * enforced by convention (`name@range`) rather than the schema. Rejects bare package
55
+ * names (no `@range`) so `add` never installs an unpinned, unreviewed version.
56
+ */
57
+ export function parseNpmDependencySpec(raw) {
58
+ const separatorIndex = raw.lastIndexOf('@');
59
+ if (separatorIndex <= 0) {
60
+ throw new CompatibilityError(`Dependencia "${raw}" no declara versión pineada/semver (formato esperado "nombre@rango").`);
61
+ }
62
+ const name = raw.slice(0, separatorIndex);
63
+ const version = raw.slice(separatorIndex + 1);
64
+ if (!semver.validRange(version)) {
65
+ throw new CompatibilityError(`Dependencia "${raw}" tiene un rango semver inválido: "${version}".`);
66
+ }
67
+ return { name, version, raw };
68
+ }
69
+ /**
70
+ * SA2 allowlist (single-maintainer MVP): the only "allowlist" that exists is the set of
71
+ * `dependencies` the registry descriptor itself declares — the descriptor is authored and
72
+ * reviewed as part of this monorepo's `packages/*`, so no separate external allowlist file
73
+ * exists yet. The real gate is that `add` never installs anything beyond what the fetched
74
+ * descriptor(s) declare, and always asks for explicit user confirmation before invoking the
75
+ * package manager (see commands/add.ts). This function also fails loudly on a same-name
76
+ * conflicting version range across entries instead of silently picking one.
77
+ */
78
+ export function collectNpmDependencies(entries) {
79
+ const byName = new Map();
80
+ for (const entry of entries) {
81
+ for (const raw of entry.dependencies) {
82
+ const spec = parseNpmDependencySpec(raw);
83
+ const existing = byName.get(spec.name);
84
+ if (existing && existing.version !== spec.version) {
85
+ throw new CompatibilityError(`Conflicto de versiones para "${spec.name}": "${existing.version}" vs "${spec.version}" ` +
86
+ `entre componentes resueltos. Resuélvelo manualmente en los descriptores.`);
87
+ }
88
+ byName.set(spec.name, spec);
89
+ }
90
+ }
91
+ return [...byName.values()];
92
+ }
93
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Base for every error the CLI raises deliberately (validation gates, network,
3
+ * config). Kept distinct from unexpected exceptions so `index.ts` can print a
4
+ * clean message instead of a stack trace for known failure modes.
5
+ */
6
+ export declare class CliError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export declare class CompatibilityError extends CliError {
10
+ constructor(message: string);
11
+ }
12
+ export declare class DependencyCycleError extends CliError {
13
+ constructor(message: string);
14
+ }
15
+ /** Raised when a Clack prompt is cancelled (Ctrl+C / Esc) so callers can abort cleanly. */
16
+ export declare class PromptCancelledError extends CliError {
17
+ constructor();
18
+ }
19
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,2FAA2F;AAC3F,qBAAa,oBAAqB,SAAQ,QAAQ;;CAKjD"}