@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.
- package/dist/commands/add.d.ts +15 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +66 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/diff.d.ts +14 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +40 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +48 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +11 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/search.d.ts +4 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +9 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/update.d.ts +19 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +56 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +53 -0
- package/dist/config.js.map +1 -0
- package/dist/deps.d.ts +36 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +93 -0
- package/dist/deps.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +23 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +124 -0
- package/dist/files.js.map +1 -0
- package/dist/format-error.d.ts +11 -0
- package/dist/format-error.d.ts.map +1 -0
- package/dist/format-error.js +18 -0
- package/dist/format-error.js.map +1 -0
- package/dist/framework-detect.d.ts +23 -0
- package/dist/framework-detect.d.ts.map +1 -0
- package/dist/framework-detect.js +70 -0
- package/dist/framework-detect.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +10 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +38 -0
- package/dist/install.js.map +1 -0
- package/dist/prompts.d.ts +19 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +39 -0
- package/dist/prompts.js.map +1 -0
- package/dist/registry-client.d.ts +8 -0
- package/dist/registry-client.d.ts.map +1 -0
- package/dist/registry-client.js +68 -0
- package/dist/registry-client.js.map +1 -0
- 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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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
|
package/dist/deps.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -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"}
|