@modularcore/registry 0.2.0 → 0.5.1
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/build-registry.d.ts.map +1 -1
- package/dist/build-registry.js +37 -2
- package/dist/build-registry.js.map +1 -1
- package/dist/client.d.ts +5 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +7 -0
- package/dist/client.js.map +1 -0
- package/dist/dependency-usage.d.ts +35 -0
- package/dist/dependency-usage.d.ts.map +1 -0
- package/dist/dependency-usage.js +67 -0
- package/dist/dependency-usage.js.map +1 -0
- package/dist/framework-catalog.d.ts +70 -0
- package/dist/framework-catalog.d.ts.map +1 -0
- package/dist/framework-catalog.js +143 -0
- package/dist/framework-catalog.js.map +1 -0
- package/dist/framework-files.d.ts +19 -0
- package/dist/framework-files.d.ts.map +1 -0
- package/dist/framework-files.js +73 -0
- package/dist/framework-files.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +35 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +0 -4
- package/dist/schema.js.map +1 -1
- package/dist/schema.zod.d.ts +87 -2
- package/dist/schema.zod.d.ts.map +1 -1
- package/dist/schema.zod.js +71 -2
- package/dist/schema.zod.js.map +1 -1
- package/dist/ui-coverage.d.ts +59 -0
- package/dist/ui-coverage.d.ts.map +1 -0
- package/dist/ui-coverage.js +143 -0
- package/dist/ui-coverage.js.map +1 -0
- package/package.json +11 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-registry.d.ts","sourceRoot":"","sources":["../src/build-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build-registry.d.ts","sourceRoot":"","sources":["../src/build-registry.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAIV,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AA6JD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,EAClC,YAAY,EACZ,SAAS,GACV,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiEtD"}
|
package/dist/build-registry.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, writeFile, } from 'node:fs/promises';
|
|
3
|
-
import { dirname, join, resolve, sep } from 'node:path';
|
|
2
|
+
import { copyFile, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, writeFile, } from 'node:fs/promises';
|
|
3
|
+
import { dirname, extname, join, resolve, sep } from 'node:path';
|
|
4
|
+
import { buildFrameworkCatalog } from './framework-catalog.js';
|
|
4
5
|
import { registryDescriptorSchema } from './schema.zod.js';
|
|
5
6
|
import { buildTarball } from './tarball.js';
|
|
6
7
|
async function findComponentDirs(packagesRoot) {
|
|
@@ -84,6 +85,30 @@ async function buildEntry(descriptor, componentDir) {
|
|
|
84
85
|
}
|
|
85
86
|
return { ...descriptor, files };
|
|
86
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Formatos admitidos para la captura. **SVG queda fuera a propósito**: servido desde nuestro
|
|
90
|
+
* dominio con su propio `Content-Type`, un SVG abierto directamente ejecuta el script que lleve
|
|
91
|
+
* dentro, y estas imágenes las aporta quien contribuye.
|
|
92
|
+
*/
|
|
93
|
+
const PREVIEW_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.webp'];
|
|
94
|
+
/**
|
|
95
|
+
* Copia la captura del componente junto a los demás artefactos y devuelve el `preview` con la URL
|
|
96
|
+
* ya servible, que es lo que el catálogo consume. El nombre de destino se deriva del componente,
|
|
97
|
+
* así que dos paquetes no pueden pisarse.
|
|
98
|
+
*/
|
|
99
|
+
async function copyPreview(descriptor, componentDir, tmpRoot) {
|
|
100
|
+
if (!descriptor.preview)
|
|
101
|
+
return undefined;
|
|
102
|
+
const extension = extname(descriptor.preview.image).toLowerCase();
|
|
103
|
+
if (!PREVIEW_EXTENSIONS.includes(extension)) {
|
|
104
|
+
throw new Error(`"${descriptor.name}": la captura debe ser ${PREVIEW_EXTENSIONS.join(', ')} y es "${extension || 'sin extensión'}"`);
|
|
105
|
+
}
|
|
106
|
+
const componentRealDir = await realpath(componentDir);
|
|
107
|
+
const source = await assertSafeSourcePath(componentRealDir, descriptor.preview.image);
|
|
108
|
+
const fileName = `${descriptor.name}-preview${extension}`;
|
|
109
|
+
await copyFile(source, join(tmpRoot, fileName));
|
|
110
|
+
return { image: `/registry/${fileName}`, alt: descriptor.preview.alt };
|
|
111
|
+
}
|
|
87
112
|
function toIndexEntry(descriptor) {
|
|
88
113
|
return {
|
|
89
114
|
name: descriptor.name,
|
|
@@ -91,6 +116,8 @@ function toIndexEntry(descriptor) {
|
|
|
91
116
|
category: descriptor.category,
|
|
92
117
|
version: descriptor.version,
|
|
93
118
|
frameworks: descriptor.frameworks,
|
|
119
|
+
...(descriptor.ui ? { ui: descriptor.ui } : {}),
|
|
120
|
+
...(descriptor.preview ? { preview: descriptor.preview } : {}),
|
|
94
121
|
description: descriptor.description,
|
|
95
122
|
};
|
|
96
123
|
}
|
|
@@ -124,12 +151,14 @@ export async function buildRegistry({ packagesRoot, outputDir, }) {
|
|
|
124
151
|
}
|
|
125
152
|
const entries = [];
|
|
126
153
|
const seenNames = new Set();
|
|
154
|
+
const componentDirByName = new Map();
|
|
127
155
|
for (const componentDir of componentDirs) {
|
|
128
156
|
const descriptor = await loadDescriptor(componentDir);
|
|
129
157
|
if (seenNames.has(descriptor.name)) {
|
|
130
158
|
throw new Error(`Duplicate component name "${descriptor.name}" across packages/*`);
|
|
131
159
|
}
|
|
132
160
|
seenNames.add(descriptor.name);
|
|
161
|
+
componentDirByName.set(descriptor.name, componentDir);
|
|
133
162
|
entries.push(await buildEntry(descriptor, componentDir));
|
|
134
163
|
}
|
|
135
164
|
// Stage on the same filesystem/volume as `outputDir` (not the OS tmpdir): the final
|
|
@@ -141,6 +170,9 @@ export async function buildRegistry({ packagesRoot, outputDir, }) {
|
|
|
141
170
|
try {
|
|
142
171
|
const publicIndex = [];
|
|
143
172
|
for (const entry of entries) {
|
|
173
|
+
const preview = await copyPreview(entry, componentDirByName.get(entry.name), tmpRoot);
|
|
174
|
+
if (preview)
|
|
175
|
+
entry.preview = preview;
|
|
144
176
|
await writeFile(join(tmpRoot, `${entry.name}.json`), JSON.stringify(entry, null, 2), 'utf8');
|
|
145
177
|
const tarball = await buildTarball(entry.files);
|
|
146
178
|
await writeFile(join(tmpRoot, `${entry.name}.tar.gz`), tarball);
|
|
@@ -149,6 +181,9 @@ export async function buildRegistry({ packagesRoot, outputDir, }) {
|
|
|
149
181
|
}
|
|
150
182
|
}
|
|
151
183
|
await writeFile(join(tmpRoot, 'index.json'), JSON.stringify(publicIndex, null, 2), 'utf8');
|
|
184
|
+
// El catálogo de frameworks, reunido de todos los componentes: es lo que permite a la CLI
|
|
185
|
+
// detectar y ofrecer un framework que ningún código nuestro conoce.
|
|
186
|
+
await writeFile(join(tmpRoot, 'frameworks.json'), JSON.stringify(buildFrameworkCatalog(entries), null, 2), 'utf8');
|
|
152
187
|
await validateBuildOutput(tmpRoot, entries.map((entry) => entry.name));
|
|
153
188
|
await rm(outputDir, { recursive: true, force: true });
|
|
154
189
|
await rename(tmpRoot, outputDir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-registry.js","sourceRoot":"","sources":["../src/build-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,MAAM,EACN,EAAE,EACF,IAAI,EACJ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"build-registry.js","sourceRoot":"","sources":["../src/build-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AGNOSTIC_FRAMEWORK, BUILTIN_FRAMEWORKS, FrameworkConflictError, buildFrameworkCatalog, frameworksKnownTo, isDefined, undefinedFrameworks, } from './framework-catalog.js';
|
|
2
|
+
export type { FrameworkDefinition } from './framework-catalog.js';
|
|
3
|
+
export { frameworkOfFile, selectFilesForFramework } from './framework-files.js';
|
|
4
|
+
export type { ComponentType, PreviewImage, EnvVariableDescriptor, FileEncoding, RegistryDescriptor, RegistryEntry, RegistryFileDescriptor, RegistryFileWithContent, RegistryIndexEntry, SupportedFramework, Visibility, } from './schema.js';
|
|
5
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,YAAY,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,GACX,MAAM,aAAa,CAAC"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Subconjunto de `./index.js` seguro para el navegador: nada de aquí importa `node:*` ni
|
|
2
|
+
// `tar-stream`. `buildTarball`/`buildRegistry` (en el índice principal) sí lo hacen, así que una
|
|
3
|
+
// página cliente que importe del índice arrastra ese código a su bundle — es lo que rompía
|
|
4
|
+
// `/c/[name]` en producción con "Class extends value undefined" (streamx sin su entorno Node).
|
|
5
|
+
export { AGNOSTIC_FRAMEWORK, BUILTIN_FRAMEWORKS, FrameworkConflictError, buildFrameworkCatalog, frameworksKnownTo, isDefined, undefinedFrameworks, } from './framework-catalog.js';
|
|
6
|
+
export { frameworkOfFile, selectFilesForFramework } from './framework-files.js';
|
|
7
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,iGAAiG;AACjG,2FAA2F;AAC3F,+FAA+F;AAC/F,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué dependencias npm necesita de verdad lo que se instala.
|
|
3
|
+
*
|
|
4
|
+
* Los ficheros se recortan al framework del proyecto (ver `framework-files.ts`), pero las
|
|
5
|
+
* dependencias no lo hacían: `media-picker` declara `bits-ui` —una librería de componentes que
|
|
6
|
+
* sólo existe para Svelte— y `@radix-ui/*` —sólo para React—, así que instalarlo en un proyecto
|
|
7
|
+
* React metía `bits-ui` en su `package.json` aunque ni un solo fichero de Svelte llegara a
|
|
8
|
+
* escribirse. Y como esos paquetes declaran su framework como peer, la instalación podía fallar
|
|
9
|
+
* con ERESOLVE justo después de que el usuario confirmara.
|
|
10
|
+
*
|
|
11
|
+
* La pertenencia no se declara en el descriptor: se deduce de quién importa qué, que es la
|
|
12
|
+
* verdad, no una etiqueta que alguien tenga que acordarse de mantener.
|
|
13
|
+
*/
|
|
14
|
+
export interface FileWithContent {
|
|
15
|
+
path: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
/** Paquetes npm que estos ficheros importan de forma estática. */
|
|
19
|
+
export declare function npmImportsOf(files: FileWithContent[]): Set<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Recorta `dependencies` a las que hacen falta para los ficheros que se van a escribir.
|
|
22
|
+
*
|
|
23
|
+
* Una dependencia que **ningún** fichero del componente importa se conserva: no hay forma de
|
|
24
|
+
* saber a quién sirve —puede cargarse dinámicamente, o ser una herramienta— y quitarla rompería
|
|
25
|
+
* la instalación. Ante la duda, sobra una dependencia antes que falte una, igual que con los
|
|
26
|
+
* ficheros.
|
|
27
|
+
*
|
|
28
|
+
* @param dependencies Las declaradas por el componente, con su rango (`bits-ui@^2.18.2`).
|
|
29
|
+
* @param selected Los ficheros que se van a escribir, ya recortados al framework del proyecto.
|
|
30
|
+
* @param all Todos los ficheros del componente, para distinguir «de otro framework» de «de nadie».
|
|
31
|
+
*/
|
|
32
|
+
export declare function dependenciesForFiles(dependencies: string[], selected: FileWithContent[], all: FileWithContent[]): string[];
|
|
33
|
+
/** `bits-ui@^2.18.2` → `bits-ui`; `@radix-ui/react-toggle@^1.1.18` → `@radix-ui/react-toggle`. */
|
|
34
|
+
export declare function dependencyNameOf(dependency: string): string;
|
|
35
|
+
//# sourceMappingURL=dependency-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-usage.d.ts","sourceRoot":"","sources":["../src/dependency-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAclE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,eAAe,EAAE,EAC3B,GAAG,EAAE,eAAe,EAAE,GACrB,MAAM,EAAE,CAQV;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG3D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué dependencias npm necesita de verdad lo que se instala.
|
|
3
|
+
*
|
|
4
|
+
* Los ficheros se recortan al framework del proyecto (ver `framework-files.ts`), pero las
|
|
5
|
+
* dependencias no lo hacían: `media-picker` declara `bits-ui` —una librería de componentes que
|
|
6
|
+
* sólo existe para Svelte— y `@radix-ui/*` —sólo para React—, así que instalarlo en un proyecto
|
|
7
|
+
* React metía `bits-ui` en su `package.json` aunque ni un solo fichero de Svelte llegara a
|
|
8
|
+
* escribirse. Y como esos paquetes declaran su framework como peer, la instalación podía fallar
|
|
9
|
+
* con ERESOLVE justo después de que el usuario confirmara.
|
|
10
|
+
*
|
|
11
|
+
* La pertenencia no se declara en el descriptor: se deduce de quién importa qué, que es la
|
|
12
|
+
* verdad, no una etiqueta que alguien tenga que acordarse de mantener.
|
|
13
|
+
*/
|
|
14
|
+
/** Import de un paquete npm: cualquiera que no empiece por `.` (relativo) ni sea `node:`. */
|
|
15
|
+
const BARE_IMPORT_PATTERN = /(?:from|import)\s+['"]([^.'"][^'"]*)['"]/g;
|
|
16
|
+
const BLOCK_COMMENT = /\/\*[\s\S]*?\*\//g;
|
|
17
|
+
const LINE_COMMENT = /(^|[^:])\/\/.*$/gm;
|
|
18
|
+
/** `@scope/pkg/sub/path` → `@scope/pkg`; `pkg/sub` → `pkg`. */
|
|
19
|
+
function packageNameOf(specifier) {
|
|
20
|
+
const segments = specifier.split('/');
|
|
21
|
+
return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];
|
|
22
|
+
}
|
|
23
|
+
/** Los ejemplos dentro de un JSDoc importan desde el punto de vista del proyecto de destino. */
|
|
24
|
+
function stripComments(source) {
|
|
25
|
+
return source.replace(BLOCK_COMMENT, '').replace(LINE_COMMENT, '$1');
|
|
26
|
+
}
|
|
27
|
+
/** Paquetes npm que estos ficheros importan de forma estática. */
|
|
28
|
+
export function npmImportsOf(files) {
|
|
29
|
+
const imported = new Set();
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
// Un `@import "tailwindcss"` de una hoja de estilo no es una dependencia npm del componente.
|
|
32
|
+
if (file.path.endsWith('.css'))
|
|
33
|
+
continue;
|
|
34
|
+
for (const [, specifier] of stripComments(file.content).matchAll(BARE_IMPORT_PATTERN)) {
|
|
35
|
+
if (!specifier || specifier.startsWith('node:'))
|
|
36
|
+
continue;
|
|
37
|
+
imported.add(packageNameOf(specifier));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return imported;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Recorta `dependencies` a las que hacen falta para los ficheros que se van a escribir.
|
|
44
|
+
*
|
|
45
|
+
* Una dependencia que **ningún** fichero del componente importa se conserva: no hay forma de
|
|
46
|
+
* saber a quién sirve —puede cargarse dinámicamente, o ser una herramienta— y quitarla rompería
|
|
47
|
+
* la instalación. Ante la duda, sobra una dependencia antes que falte una, igual que con los
|
|
48
|
+
* ficheros.
|
|
49
|
+
*
|
|
50
|
+
* @param dependencies Las declaradas por el componente, con su rango (`bits-ui@^2.18.2`).
|
|
51
|
+
* @param selected Los ficheros que se van a escribir, ya recortados al framework del proyecto.
|
|
52
|
+
* @param all Todos los ficheros del componente, para distinguir «de otro framework» de «de nadie».
|
|
53
|
+
*/
|
|
54
|
+
export function dependenciesForFiles(dependencies, selected, all) {
|
|
55
|
+
const neededHere = npmImportsOf(selected);
|
|
56
|
+
const usedAnywhere = npmImportsOf(all);
|
|
57
|
+
return dependencies.filter((dependency) => {
|
|
58
|
+
const name = dependencyNameOf(dependency);
|
|
59
|
+
return neededHere.has(name) || !usedAnywhere.has(name);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** `bits-ui@^2.18.2` → `bits-ui`; `@radix-ui/react-toggle@^1.1.18` → `@radix-ui/react-toggle`. */
|
|
63
|
+
export function dependencyNameOf(dependency) {
|
|
64
|
+
const at = dependency.lastIndexOf('@');
|
|
65
|
+
return at > 0 ? dependency.slice(0, at) : dependency;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=dependency-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-usage.js","sourceRoot":"","sources":["../src/dependency-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6FAA6F;AAC7F,MAAM,mBAAmB,GAAG,2CAA2C,CAAC;AACxE,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAC1C,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAOzC,+DAA+D;AAC/D,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;AACnF,CAAC;AAED,gGAAgG;AAChG,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,6FAA6F;QAC7F,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QAEzC,KAAK,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtF,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC1D,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAsB,EACtB,QAA2B,EAC3B,GAAsB;IAEtB,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAEvC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1C,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué frameworks existen, y qué sabe el registry de cada uno.
|
|
3
|
+
*
|
|
4
|
+
* Los seis de casa vienen definidos aquí, pero **la lista no es cerrada**: un componente puede
|
|
5
|
+
* traer el suyo en `frameworkDefs` y el registry lo entiende sin que nadie toque este fichero.
|
|
6
|
+
* Alguien que aporte un componente en Solid o Qwik no se topa con una lista blanca que sólo el
|
|
7
|
+
* mantenimiento puede ampliar; la revisión de su PR es el control, no el código.
|
|
8
|
+
*
|
|
9
|
+
* Lo que una definición aporta es lo que el registry y la CLI no pueden adivinar: en qué fichero
|
|
10
|
+
* se escribe su UI, cómo se reconoce un proyecto suyo, y dónde van las cosas al instalar.
|
|
11
|
+
*/
|
|
12
|
+
export interface FrameworkDefinition {
|
|
13
|
+
/** Nombre para mostrar en el catálogo y en los prompts. */
|
|
14
|
+
title: string;
|
|
15
|
+
/**
|
|
16
|
+
* Extensión de sus componentes de UI (`.tsx`, `.svelte`). Omitida, el framework no tiene UI de
|
|
17
|
+
* referencia propia y se sirve con snippets, como `blade` y `vanilla`.
|
|
18
|
+
*/
|
|
19
|
+
uiExtension?: string;
|
|
20
|
+
/** Dependencia que delata un proyecto suyo: `solid-js` para Solid, `react` para React. */
|
|
21
|
+
detect?: {
|
|
22
|
+
npm?: string;
|
|
23
|
+
composer?: string;
|
|
24
|
+
};
|
|
25
|
+
/** Peer que `add` exigirá al instalar en un proyecto suyo. */
|
|
26
|
+
peer?: string;
|
|
27
|
+
/** Rutas por defecto que `init` propone. */
|
|
28
|
+
paths?: {
|
|
29
|
+
components: string;
|
|
30
|
+
lib: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Framework cuyo *binding* hereda. `blade` se apoya en `vanilla` porque sus plantillas montan
|
|
34
|
+
* ese mismo código. Alcanza a `adapters/`, nunca a `snippets/`.
|
|
35
|
+
*/
|
|
36
|
+
basedOn?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Directorio bajo `snippets/` que le pertenece, cuando no coincide con su nombre: la isla de
|
|
39
|
+
* Astro vive en `snippets/astro/` y sirve al framework `vanilla`.
|
|
40
|
+
*/
|
|
41
|
+
snippetDirectory?: string;
|
|
42
|
+
}
|
|
43
|
+
/** Los que trae el registry de fábrica. Un componente puede añadir los suyos. */
|
|
44
|
+
export declare const BUILTIN_FRAMEWORKS: Record<string, FrameworkDefinition>;
|
|
45
|
+
/** Sirve a cualquier proyecto: `assertCompatible` lo trata como comodín. */
|
|
46
|
+
export declare const AGNOSTIC_FRAMEWORK = "agnostic";
|
|
47
|
+
export interface DescriptorWithFrameworks {
|
|
48
|
+
frameworks: string[];
|
|
49
|
+
frameworkDefs?: Record<string, FrameworkDefinition>;
|
|
50
|
+
}
|
|
51
|
+
export declare class FrameworkConflictError extends Error {
|
|
52
|
+
}
|
|
53
|
+
/** `Object.hasOwn` y no un acceso directo: `catalog['constructor']` sería siempre verdadero. */
|
|
54
|
+
export declare function isDefined(catalog: Record<string, FrameworkDefinition>, name: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Reúne los frameworks de casa con los que declaren los componentes.
|
|
57
|
+
*
|
|
58
|
+
* Las definiciones de casa mandan siempre: un componente no puede redefinir qué es React para
|
|
59
|
+
* todo el catálogo. Entre dos aportadas, en cambio, una discrepancia es un conflicto y se
|
|
60
|
+
* denuncia, porque resolverla por orden de llegada dejaría al perdedor con sus ficheros sin dueño.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildFrameworkCatalog(descriptors: DescriptorWithFrameworks[]): Record<string, FrameworkDefinition>;
|
|
63
|
+
/**
|
|
64
|
+
* Los frameworks que este descriptor puede usar: los de casa más los que él mismo declara. Es lo
|
|
65
|
+
* que necesita el recorte de ficheros para saber que `ui/solid/` es de alguien.
|
|
66
|
+
*/
|
|
67
|
+
export declare function frameworksKnownTo(descriptor: DescriptorWithFrameworks): Record<string, FrameworkDefinition>;
|
|
68
|
+
/** Frameworks declarados que nadie define: ni de casa, ni en el propio descriptor. */
|
|
69
|
+
export declare function undefinedFrameworks(descriptor: DescriptorWithFrameworks): string[];
|
|
70
|
+
//# sourceMappingURL=framework-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-catalog.d.ts","sourceRoot":"","sources":["../src/framework-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAgDlE,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACrD;AAED,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7F;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,wBAAwB,EAAE,GACtC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAiErC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,wBAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAErC;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAKlF"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué frameworks existen, y qué sabe el registry de cada uno.
|
|
3
|
+
*
|
|
4
|
+
* Los seis de casa vienen definidos aquí, pero **la lista no es cerrada**: un componente puede
|
|
5
|
+
* traer el suyo en `frameworkDefs` y el registry lo entiende sin que nadie toque este fichero.
|
|
6
|
+
* Alguien que aporte un componente en Solid o Qwik no se topa con una lista blanca que sólo el
|
|
7
|
+
* mantenimiento puede ampliar; la revisión de su PR es el control, no el código.
|
|
8
|
+
*
|
|
9
|
+
* Lo que una definición aporta es lo que el registry y la CLI no pueden adivinar: en qué fichero
|
|
10
|
+
* se escribe su UI, cómo se reconoce un proyecto suyo, y dónde van las cosas al instalar.
|
|
11
|
+
*/
|
|
12
|
+
/** Los que trae el registry de fábrica. Un componente puede añadir los suyos. */
|
|
13
|
+
export const BUILTIN_FRAMEWORKS = {
|
|
14
|
+
react: {
|
|
15
|
+
title: 'React',
|
|
16
|
+
uiExtension: '.tsx',
|
|
17
|
+
detect: { npm: 'react' },
|
|
18
|
+
peer: 'react',
|
|
19
|
+
paths: { components: 'src/components', lib: 'src/lib/modularcore' },
|
|
20
|
+
},
|
|
21
|
+
svelte: {
|
|
22
|
+
title: 'Svelte',
|
|
23
|
+
uiExtension: '.svelte',
|
|
24
|
+
detect: { npm: 'svelte' },
|
|
25
|
+
peer: 'svelte',
|
|
26
|
+
paths: { components: 'src/components', lib: 'src/lib/modularcore' },
|
|
27
|
+
},
|
|
28
|
+
vue: {
|
|
29
|
+
title: 'Vue',
|
|
30
|
+
uiExtension: '.vue',
|
|
31
|
+
detect: { npm: 'vue' },
|
|
32
|
+
peer: 'vue',
|
|
33
|
+
paths: { components: 'src/components', lib: 'src/lib/modularcore' },
|
|
34
|
+
},
|
|
35
|
+
angular: {
|
|
36
|
+
title: 'Angular',
|
|
37
|
+
uiExtension: '.component.ts',
|
|
38
|
+
detect: { npm: '@angular/core' },
|
|
39
|
+
peer: '@angular/core',
|
|
40
|
+
paths: { components: 'src/components', lib: 'src/lib/modularcore' },
|
|
41
|
+
},
|
|
42
|
+
blade: {
|
|
43
|
+
title: 'Blade',
|
|
44
|
+
detect: { composer: 'laravel/framework' },
|
|
45
|
+
basedOn: 'vanilla',
|
|
46
|
+
snippetDirectory: 'laravel',
|
|
47
|
+
paths: { components: 'resources/views/components', lib: 'resources/js/modularcore' },
|
|
48
|
+
},
|
|
49
|
+
vanilla: {
|
|
50
|
+
title: 'Sin framework (Astro, HTMX, Rails…)',
|
|
51
|
+
// A diferencia de `blade`, `vanilla` sí puede traer UI de referencia propia (DOM imperativo,
|
|
52
|
+
// sin JSX/plantillas) — la trae `auth-kit`. Sin esta extensión, `ui/vanilla/…` se confunde con
|
|
53
|
+
// la presentación «CSS plano» de los demás frameworks y se trata como fichero compartido: se
|
|
54
|
+
// escribía en toda instalación, incluida una de React, arrastrando un adaptador que esa
|
|
55
|
+
// instalación no tiene.
|
|
56
|
+
uiExtension: '.ts',
|
|
57
|
+
detect: { npm: 'astro' },
|
|
58
|
+
snippetDirectory: 'astro',
|
|
59
|
+
paths: { components: 'src/components', lib: 'src/lib/modularcore' },
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
/** Sirve a cualquier proyecto: `assertCompatible` lo trata como comodín. */
|
|
63
|
+
export const AGNOSTIC_FRAMEWORK = 'agnostic';
|
|
64
|
+
export class FrameworkConflictError extends Error {
|
|
65
|
+
}
|
|
66
|
+
/** `Object.hasOwn` y no un acceso directo: `catalog['constructor']` sería siempre verdadero. */
|
|
67
|
+
export function isDefined(catalog, name) {
|
|
68
|
+
return Object.hasOwn(catalog, name);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Reúne los frameworks de casa con los que declaren los componentes.
|
|
72
|
+
*
|
|
73
|
+
* Las definiciones de casa mandan siempre: un componente no puede redefinir qué es React para
|
|
74
|
+
* todo el catálogo. Entre dos aportadas, en cambio, una discrepancia es un conflicto y se
|
|
75
|
+
* denuncia, porque resolverla por orden de llegada dejaría al perdedor con sus ficheros sin dueño.
|
|
76
|
+
*/
|
|
77
|
+
export function buildFrameworkCatalog(descriptors) {
|
|
78
|
+
// Sin prototipo: así `catalog['toString']` no devuelve una función heredada y un descriptor no
|
|
79
|
+
// puede colar `constructor` como si fuera un framework definido.
|
|
80
|
+
const catalog = Object.assign(Object.create(null), BUILTIN_FRAMEWORKS);
|
|
81
|
+
// Los de casa reservan ya su carpeta: un framework aportado no puede quedarse con `laravel`
|
|
82
|
+
// ni con `astro`, que perderían sus snippets en favor de Blade o de `vanilla`.
|
|
83
|
+
const snippetOwners = new Map();
|
|
84
|
+
// Dos frameworks con el mismo marcador de detección hacen que `init` deje de auto-detectar y
|
|
85
|
+
// pregunte siempre; con el mismo peer, `assertCompatible` no sabría a cuál corresponde.
|
|
86
|
+
const markerOwners = new Map();
|
|
87
|
+
for (const [name, definition] of Object.entries(BUILTIN_FRAMEWORKS)) {
|
|
88
|
+
snippetOwners.set(definition.snippetDirectory ?? name, name);
|
|
89
|
+
for (const marker of [definition.detect?.npm, definition.detect?.composer, definition.peer]) {
|
|
90
|
+
if (marker)
|
|
91
|
+
markerOwners.set(marker, name);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (const descriptor of descriptors) {
|
|
95
|
+
for (const [name, definition] of Object.entries(descriptor.frameworkDefs ?? {})) {
|
|
96
|
+
// Un componente no redefine uno de casa: la definición de React es la misma para todos.
|
|
97
|
+
if (Object.hasOwn(BUILTIN_FRAMEWORKS, name))
|
|
98
|
+
continue;
|
|
99
|
+
const previous = catalog[name];
|
|
100
|
+
if (previous) {
|
|
101
|
+
// Dos componentes definiendo el mismo framework de forma distinta es un conflicto real,
|
|
102
|
+
// no algo que resolver en silencio por orden de llegada: el que pierda vería sus
|
|
103
|
+
// ficheros sin dueño y su UI dada por no cubierta.
|
|
104
|
+
if (JSON.stringify(previous) !== JSON.stringify(definition)) {
|
|
105
|
+
throw new FrameworkConflictError(`Dos componentes definen "${name}" de forma distinta. Unifica la definición en ambos descriptores.`);
|
|
106
|
+
}
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const directory = definition.snippetDirectory ?? name;
|
|
110
|
+
const owner = snippetOwners.get(directory);
|
|
111
|
+
if (owner) {
|
|
112
|
+
throw new FrameworkConflictError(`"${name}" y "${owner}" reclaman los snippets de "${directory}". Cada carpeta de snippets tiene un solo dueño.`);
|
|
113
|
+
}
|
|
114
|
+
snippetOwners.set(directory, name);
|
|
115
|
+
for (const marker of [definition.detect?.npm, definition.detect?.composer, definition.peer]) {
|
|
116
|
+
if (!marker)
|
|
117
|
+
continue;
|
|
118
|
+
const markerOwner = markerOwners.get(marker);
|
|
119
|
+
// Que un framework use el mismo paquete para detectarse y como peer es lo normal
|
|
120
|
+
// —Solid se reconoce por `solid-js` y lo exige como peer—, así que sólo choca con otros.
|
|
121
|
+
if (markerOwner && markerOwner !== name) {
|
|
122
|
+
throw new FrameworkConflictError(`"${name}" y "${markerOwner}" usan ambos "${marker}" para detectarse o como peer. Cada marcador identifica a un solo framework.`);
|
|
123
|
+
}
|
|
124
|
+
markerOwners.set(marker, name);
|
|
125
|
+
}
|
|
126
|
+
catalog[name] = definition;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return catalog;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Los frameworks que este descriptor puede usar: los de casa más los que él mismo declara. Es lo
|
|
133
|
+
* que necesita el recorte de ficheros para saber que `ui/solid/` es de alguien.
|
|
134
|
+
*/
|
|
135
|
+
export function frameworksKnownTo(descriptor) {
|
|
136
|
+
return buildFrameworkCatalog([descriptor]);
|
|
137
|
+
}
|
|
138
|
+
/** Frameworks declarados que nadie define: ni de casa, ni en el propio descriptor. */
|
|
139
|
+
export function undefinedFrameworks(descriptor) {
|
|
140
|
+
const known = frameworksKnownTo(descriptor);
|
|
141
|
+
return descriptor.frameworks.filter((framework) => framework !== AGNOSTIC_FRAMEWORK && !isDefined(known, framework));
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=framework-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-catalog.js","sourceRoot":"","sources":["../src/framework-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FrameworkDefinition } from './framework-catalog.js';
|
|
2
|
+
/**
|
|
3
|
+
* El framework al que pertenece un fichero del descriptor, o `null` si sirve a todos.
|
|
4
|
+
*
|
|
5
|
+
* Se lee del `path` —la estructura dentro del paquete— y no del `target`, que para los snippets
|
|
6
|
+
* apunta a un árbol distinto en el proyecto de destino.
|
|
7
|
+
*/
|
|
8
|
+
export declare function frameworkOfFile(path: string, catalog?: Record<string, FrameworkDefinition>): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Los ficheros que un proyecto de `framework` necesita: los compartidos más los suyos.
|
|
11
|
+
*
|
|
12
|
+
* Un componente `agnostic` no tiene adaptadores que separar, y un proyecto cuyo framework no
|
|
13
|
+
* conocemos recibe el descriptor entero: filtrar con información incompleta arriesga dejarlo sin
|
|
14
|
+
* ficheros que sí necesita.
|
|
15
|
+
*/
|
|
16
|
+
export declare function selectFilesForFramework<T extends {
|
|
17
|
+
path: string;
|
|
18
|
+
}>(files: T[], framework: string, catalog?: Record<string, FrameworkDefinition>): T[];
|
|
19
|
+
//# sourceMappingURL=framework-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-files.d.ts","sourceRoot":"","sources":["../src/framework-files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAelE;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAsB,GAChE,MAAM,GAAG,IAAI,CAiCf;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChE,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAsB,GAChE,CAAC,EAAE,CAeL"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { AGNOSTIC_FRAMEWORK, BUILTIN_FRAMEWORKS, isDefined } from './framework-catalog.js';
|
|
2
|
+
/**
|
|
3
|
+
* Un descriptor enumera los ficheros de todos sus adaptadores a la vez, porque el registry sirve
|
|
4
|
+
* un único catálogo para cualquier proyecto. Al instalar, en cambio, sólo tienen sentido los del
|
|
5
|
+
* framework elegido: escribir los demás deja en el proyecto módulos que importan runtimes que no
|
|
6
|
+
* están instalados, y el `tsc` del consumidor falla justo después de un `add` que terminó bien.
|
|
7
|
+
*
|
|
8
|
+
* Qué framework sirve cada fichero se deduce de la convención de rutas del monorepo, que los cinco
|
|
9
|
+
* descriptores actuales siguen sin excepción. Un fichero que no encaje en ninguna regla se
|
|
10
|
+
* considera compartido y se escribe siempre: ante la duda, sobra un fichero antes que falte uno.
|
|
11
|
+
*/
|
|
12
|
+
const FRAMEWORK_ROOTS = ['adapters', 'ui'];
|
|
13
|
+
/**
|
|
14
|
+
* El framework al que pertenece un fichero del descriptor, o `null` si sirve a todos.
|
|
15
|
+
*
|
|
16
|
+
* Se lee del `path` —la estructura dentro del paquete— y no del `target`, que para los snippets
|
|
17
|
+
* apunta a un árbol distinto en el proyecto de destino.
|
|
18
|
+
*/
|
|
19
|
+
export function frameworkOfFile(path, catalog = BUILTIN_FRAMEWORKS) {
|
|
20
|
+
const [root, second] = path.split('/');
|
|
21
|
+
if (!root || !second)
|
|
22
|
+
return null;
|
|
23
|
+
// Con sólo dos segmentos el segundo es el propio fichero (`ui/vanilla-styles.css`), no un
|
|
24
|
+
// directorio de framework. Ojo justamente con ese: es la presentación de estilo «CSS plano»,
|
|
25
|
+
// un eje distinto, y lo comparten las cuatro presentaciones de todos los frameworks.
|
|
26
|
+
if (path.split('/').length < 3)
|
|
27
|
+
return null;
|
|
28
|
+
if (root === 'snippets') {
|
|
29
|
+
// Un snippet toma el nombre de la herramienta a la que sirve —`snippets/laravel/` para
|
|
30
|
+
// Blade, `snippets/astro/` para una página sin framework—, así que el dueño se busca por
|
|
31
|
+
// ese directorio y no por el nombre del framework.
|
|
32
|
+
const owner = Object.entries(catalog).find(([name, definition]) => (definition.snippetDirectory ?? name) === second);
|
|
33
|
+
return owner?.[0] ?? null;
|
|
34
|
+
}
|
|
35
|
+
// `vanilla` nombra dos ejes distintos: un framework (una página sin ninguno) y una presentación
|
|
36
|
+
// de estilo (CSS plano). Bajo `ui/` manda el segundo, así que `ui/vanilla/…` es marcado
|
|
37
|
+
// compartido y no el framework: tratarlo como framework lo borraría de toda instalación de
|
|
38
|
+
// React o Svelte, que es justo donde se usa.
|
|
39
|
+
if (root === 'ui') {
|
|
40
|
+
// Sólo cuenta como framework quien tiene UI propia. `vanilla` no la tiene, así que
|
|
41
|
+
// `ui/vanilla/` es la presentación de CSS plano y no el framework sin framework.
|
|
42
|
+
return isDefined(catalog, second) && catalog[second]?.uiExtension ? second : null;
|
|
43
|
+
}
|
|
44
|
+
if (FRAMEWORK_ROOTS.includes(root)) {
|
|
45
|
+
return isDefined(catalog, second) ? second : null;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Los ficheros que un proyecto de `framework` necesita: los compartidos más los suyos.
|
|
51
|
+
*
|
|
52
|
+
* Un componente `agnostic` no tiene adaptadores que separar, y un proyecto cuyo framework no
|
|
53
|
+
* conocemos recibe el descriptor entero: filtrar con información incompleta arriesga dejarlo sin
|
|
54
|
+
* ficheros que sí necesita.
|
|
55
|
+
*/
|
|
56
|
+
export function selectFilesForFramework(files, framework, catalog = BUILTIN_FRAMEWORKS) {
|
|
57
|
+
if (framework === AGNOSTIC_FRAMEWORK)
|
|
58
|
+
return files;
|
|
59
|
+
// Un framework que este catálogo no conoce recibe el descriptor entero: recortar con
|
|
60
|
+
// información incompleta arriesga dejarlo sin ficheros que sí necesita.
|
|
61
|
+
if (!isDefined(catalog, framework))
|
|
62
|
+
return files;
|
|
63
|
+
const base = catalog[framework].basedOn;
|
|
64
|
+
const bases = new Set(base ? [base] : []);
|
|
65
|
+
return files.filter((file) => {
|
|
66
|
+
const owner = frameworkOfFile(file.path, catalog);
|
|
67
|
+
if (owner === null || owner === framework)
|
|
68
|
+
return true;
|
|
69
|
+
// Lo heredado se limita a los adaptadores del framework base.
|
|
70
|
+
return bases.has(owner) && file.path.startsWith('adapters/');
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=framework-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-files.js","sourceRoot":"","sources":["../src/framework-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAI3F;;;;;;;;;GASG;AAEH,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,UAA+C,kBAAkB;IAEjE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAElC,0FAA0F;IAC1F,6FAA6F;IAC7F,qFAAqF;IACrF,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,uFAAuF;QACvF,yFAAyF;QACzF,mDAAmD;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CACxC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,MAAM,CACzE,CAAC;QACF,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED,gGAAgG;IAChG,wFAAwF;IACxF,2FAA2F;IAC3F,6CAA6C;IAC7C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,mFAAmF;QACnF,iFAAiF;QACjF,OAAO,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,CAAC;IACD,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAU,EACV,SAAiB,EACjB,UAA+C,kBAAkB;IAEjE,IAAI,SAAS,KAAK,kBAAkB;QAAE,OAAO,KAAK,CAAC;IACnD,qFAAqF;IACrF,wEAAwE;IACxE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE1C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACvD,8DAA8D;QAC9D,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { AGNOSTIC_FRAMEWORK, BUILTIN_FRAMEWORKS, FrameworkConflictError, buildFrameworkCatalog, frameworksKnownTo, isDefined, undefinedFrameworks, } from './framework-catalog.js';
|
|
2
|
+
export type { FrameworkDefinition } from './framework-catalog.js';
|
|
3
|
+
export { dependenciesForFiles, dependencyNameOf, npmImportsOf } from './dependency-usage.js';
|
|
4
|
+
export type { FileWithContent } from './dependency-usage.js';
|
|
5
|
+
export { PRESENTATIONS, findCoverageMismatches, locateUiFile, readActualCoverage, } from './ui-coverage.js';
|
|
6
|
+
export type { Presentation, UiCoverage } from './ui-coverage.js';
|
|
7
|
+
export { frameworkOfFile, selectFilesForFramework } from './framework-files.js';
|
|
8
|
+
export type { ComponentType, PreviewImage, EnvVariableDescriptor, FileEncoding, RegistryDescriptor, RegistryEntry, RegistryFileDescriptor, RegistryFileWithContent, RegistryIndexEntry, SupportedFramework, Visibility, } from './schema.js';
|
|
9
|
+
export { frameworkCatalogSchema } from './schema.zod.js';
|
|
2
10
|
export { envVariableSchema, fileEncodingSchema, registryDescriptorSchema, registryEntrySchema, registryFileSchema, registryFileWithContentSchema, registryIndexEntrySchema, visibilitySchema, } from './schema.zod.js';
|
|
3
11
|
export type { RegistryDescriptorInput, RegistryDescriptorParsed } from './schema.zod.js';
|
|
4
12
|
export { buildRegistry } from './build-registry.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,6BAA6B,EAC7B,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACrF,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7F,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,YAAY,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,6BAA6B,EAC7B,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACrF,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export { AGNOSTIC_FRAMEWORK, BUILTIN_FRAMEWORKS, FrameworkConflictError, buildFrameworkCatalog, frameworksKnownTo, isDefined, undefinedFrameworks, } from './framework-catalog.js';
|
|
2
|
+
export { dependenciesForFiles, dependencyNameOf, npmImportsOf } from './dependency-usage.js';
|
|
3
|
+
export { PRESENTATIONS, findCoverageMismatches, locateUiFile, readActualCoverage, } from './ui-coverage.js';
|
|
4
|
+
export { frameworkOfFile, selectFilesForFramework } from './framework-files.js';
|
|
5
|
+
export { frameworkCatalogSchema } from './schema.zod.js';
|
|
1
6
|
export { envVariableSchema, fileEncodingSchema, registryDescriptorSchema, registryEntrySchema, registryFileSchema, registryFileWithContentSchema, registryIndexEntrySchema, visibilitySchema, } from './schema.zod.js';
|
|
2
7
|
export { buildRegistry } from './build-registry.js';
|
|
3
8
|
export { buildTarball } from './tarball.js';
|