@mxpicture/build-api 0.3.4 → 0.3.6
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { mapPackagesToTyped } from "./exports.package.js";
|
|
2
1
|
import { mapRequestedsToNodes, validateRequesteds, } from "./exports.requested.js";
|
|
2
|
+
import { mapPackagesToTyped } from "./exports.package.js";
|
|
3
3
|
import { ExportsFinderBag } from "./ExportsFinderBag.js";
|
|
4
4
|
/**
|
|
5
5
|
* Lookup index for typed export nodes across multiple packages.
|
|
@@ -71,7 +71,7 @@ export class ExportsFinder {
|
|
|
71
71
|
return validateRequesteds(this._requesteds, this.bag, this.predictedBag);
|
|
72
72
|
}
|
|
73
73
|
get requestedNodes() {
|
|
74
|
-
return mapRequestedsToNodes(this.
|
|
74
|
+
return mapRequestedsToNodes(this._requesteds, this.bag, this.predictedBag);
|
|
75
75
|
}
|
|
76
76
|
requested(name, isValid) {
|
|
77
77
|
return (this.requesteds.find((req) => req.name === name && (!isValid || req.valid === true)) ?? null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportsFinder.js","sourceRoot":"","sources":["../../src/exp/ExportsFinder.ts"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"ExportsFinder.js","sourceRoot":"","sources":["../../src/exp/ExportsFinder.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ExportNodeTyped,\n ExportsCommonExcludes,\n ExportsRequestedItem,\n PackageAPI,\n} from \"../types/types.exports.js\";\nimport {\n mapRequestedsToNodes,\n validateRequesteds,\n} from \"./exports.requested.js\";\nimport { mapPackagesToTyped } from \"./exports.package.js\";\nimport { ExportsFinderBag } from \"./ExportsFinderBag.js\";\n\n/**\n * Lookup index for typed export nodes across multiple packages.\n *\n * @remarks\n * Provides O(1) access to export metadata by name and supports marking\n * specific exports as \"requested\" for downstream code-generation steps.\n */\nexport class ExportsFinder {\n public readonly bag: ExportsFinderBag;\n public readonly predictedBag: ExportsFinderBag;\n protected _requesteds: string[] = [];\n\n /**\n * Build a finder from an array of {@link PackageAPI} objects.\n *\n * @param pkgs - Packages whose exports are indexed.\n */\n public static createByPkgs(\n pkgs: PackageAPI[],\n excludes?: ExportsCommonExcludes,\n ): ExportsFinder {\n return new ExportsFinder(\n new ExportsFinderBag(mapPackagesToTyped(new Map(), pkgs, excludes)),\n );\n }\n\n /**\n * Build a finder from a pre-built node map (deep-cloned).\n *\n * @param nodes - Map of export names to typed nodes.\n */\n public static createByNodes(\n nodes: Map<string, ExportNodeTyped> | ExportsFinderBag,\n predicted?: Map<string, ExportNodeTyped> | ExportsFinderBag | null,\n ): ExportsFinder {\n const finder = new ExportsFinder(\n nodes instanceof ExportsFinderBag\n ? nodes\n : new ExportsFinderBag(structuredClone(nodes)),\n predicted instanceof ExportsFinderBag\n ? predicted\n : new ExportsFinderBag(structuredClone(predicted)),\n );\n\n return finder;\n }\n\n protected constructor(\n bag: ExportsFinderBag,\n predictedBag?: ExportsFinderBag,\n ) {\n this.bag = bag;\n this.predictedBag = predictedBag ?? new ExportsFinderBag();\n }\n\n /**\n * Mark an export as requested.\n *\n * @param name - Export name to flag.\n */\n public request(name: string): void {\n this._requesteds.push(name);\n }\n\n protected validateRequesteds(\n ...reqs: ExportsRequestedItem[]\n ): ExportsRequestedItem[] {\n return validateRequesteds(reqs, this.bag, this.predictedBag);\n }\n\n public addPrediction(node: ExportNodeTyped): void {\n if (!this.predictedBag.has(node.name)) this.predictedBag.add(node);\n }\n\n public validate(requesteds?: ExportsRequestedItem[]): void {\n const invalids = (requesteds ?? this.requesteds).filter(\n (req) => !req.valid,\n );\n if (invalids.length === 0) return;\n\n // throw error, not all predicted names were provided\n const firsts: string[] = [];\n const others: string[] = [];\n\n for (const { name } of invalids) {\n if (firsts.length < 3) firsts.push(name);\n else others.push(name);\n }\n\n throw new Error(\n `Predicted names missing: ${firsts.join(\", \")}${others.length > 0 ? \", ...\" : \"\"}`,\n );\n }\n\n public get requesteds(): ExportsRequestedItem[] {\n return validateRequesteds(this._requesteds, this.bag, this.predictedBag);\n }\n\n public get requestedNodes(): ExportNodeTyped[] {\n return mapRequestedsToNodes(this._requesteds, this.bag, this.predictedBag);\n }\n\n public requested(\n name: string,\n isValid?: boolean,\n ): ExportsRequestedItem | null {\n return (\n this.requesteds.find(\n (req) => req.name === name && (!isValid || req.valid === true),\n ) ?? null\n );\n }\n\n /**\n * Create a deep copy of this finder.\n *\n * prediction bag is not cloned --> needed for collecting\n */\n public link(): ExportsFinder {\n return ExportsFinder.createByNodes(this.bag, this.predictedBag);\n }\n}\n"]}
|
|
@@ -3,5 +3,5 @@ import type { ExportsFinderBag } from "./ExportsFinderBag.js";
|
|
|
3
3
|
export declare const isRequestedValid: (name: string, ...bags: (ExportsFinderBag | null | undefined)[]) => boolean;
|
|
4
4
|
export declare const validateRequested: (req: ExportsRequestedItem | string, ...bags: (ExportsFinderBag | null | undefined)[]) => ExportsRequestedItem;
|
|
5
5
|
export declare const validateRequesteds: (reqs: ExportsRequestedItem[] | string[], ...bags: (ExportsFinderBag | null | undefined)[]) => ExportsRequestedItem[];
|
|
6
|
-
export declare const mapRequestedsToNodes: (reqs: ExportsRequestedItem[], ...bags: (ExportsFinderBag | null | undefined)[]) => ExportNodeTyped[];
|
|
6
|
+
export declare const mapRequestedsToNodes: (reqs: ExportsRequestedItem[] | string[], ...bags: (ExportsFinderBag | null | undefined)[]) => ExportNodeTyped[];
|
|
7
7
|
//# sourceMappingURL=exports.requested.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.requested.d.ts","sourceRoot":"","sources":["../../src/exp/exports.requested.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,EACZ,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC/C,OAA+C,CAAC;AAEnD,eAAO,MAAM,iBAAiB,GAC5B,KAAK,oBAAoB,GAAG,MAAM,EAClC,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC/C,oBAMF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,oBAAoB,EAAE,GAAG,MAAM,EAAE,EACvC,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC/C,oBAAoB,EAYtB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,MAAM,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"exports.requested.d.ts","sourceRoot":"","sources":["../../src/exp/exports.requested.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,EACZ,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC/C,OAA+C,CAAC;AAEnD,eAAO,MAAM,iBAAiB,GAC5B,KAAK,oBAAoB,GAAG,MAAM,EAClC,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC/C,oBAMF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,oBAAoB,EAAE,GAAG,MAAM,EAAE,EACvC,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC/C,oBAAoB,EAYtB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,MAAM,oBAAoB,EAAE,GAAG,MAAM,EAAE,EACvC,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC/C,eAAe,EAKjB,CAAC"}
|
|
@@ -16,7 +16,7 @@ export const validateRequesteds = (reqs, ...bags) => {
|
|
|
16
16
|
return results;
|
|
17
17
|
};
|
|
18
18
|
export const mapRequestedsToNodes = (reqs, ...bags) => {
|
|
19
|
-
const requestedNames = reqs.map((req) => req.name);
|
|
19
|
+
const requestedNames = reqs.map((req) => typeof req === "string" ? req : req.name);
|
|
20
20
|
return bags.flatMap((bag) => bag?.gets(...requestedNames) ?? []);
|
|
21
21
|
};
|
|
22
22
|
//# sourceMappingURL=exports.requested.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.requested.js","sourceRoot":"","sources":["../../src/exp/exports.requested.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,GAAG,IAA6C,EACvC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,GAAkC,EAClC,GAAG,IAA6C,EAC1B,EAAE;IACxB,MAAM,MAAM,GACV,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAEhD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAuC,EACvC,GAAG,IAA6C,EACxB,EAAE;IAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,IAA+B,CAAC;IAEtE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,
|
|
1
|
+
{"version":3,"file":"exports.requested.js","sourceRoot":"","sources":["../../src/exp/exports.requested.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,GAAG,IAA6C,EACvC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,GAAkC,EAClC,GAAG,IAA6C,EAC1B,EAAE;IACxB,MAAM,MAAM,GACV,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAEhD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAuC,EACvC,GAAG,IAA6C,EACxB,EAAE;IAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,IAA+B,CAAC;IAEtE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAAuC,EACvC,GAAG,IAA6C,EAC7B,EAAE;IACrB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACtC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CACzC,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACnE,CAAC,CAAC","sourcesContent":["import type {\n ExportNodeTyped,\n ExportsRequestedItem,\n} from \"../types/types.exports.js\";\nimport type { ExportsFinderBag } from \"./ExportsFinderBag.js\";\n\nexport const isRequestedValid = (\n name: string,\n ...bags: (ExportsFinderBag | null | undefined)[]\n): boolean => !!bags.find((bag) => bag?.has(name));\n\nexport const validateRequested = (\n req: ExportsRequestedItem | string,\n ...bags: (ExportsFinderBag | null | undefined)[]\n): ExportsRequestedItem => {\n const result: ExportsRequestedItem =\n typeof req === \"string\" ? { name: req } : req;\n\n result.valid = !!bags.find((bag) => bag?.has(result.name));\n return result;\n};\n\nexport const validateRequesteds = (\n reqs: ExportsRequestedItem[] | string[],\n ...bags: (ExportsFinderBag | null | undefined)[]\n): ExportsRequestedItem[] => {\n if (reqs.length === 0) return [];\n\n const results: ExportsRequestedItem[] =\n typeof reqs[0] === \"string\" ? [] : (reqs as ExportsRequestedItem[]);\n\n for (const req of reqs) {\n const res = validateRequested(req, ...bags);\n if (typeof req === \"string\") results.push(res);\n }\n\n return results;\n};\n\nexport const mapRequestedsToNodes = (\n reqs: ExportsRequestedItem[] | string[],\n ...bags: (ExportsFinderBag | null | undefined)[]\n): ExportNodeTyped[] => {\n const requestedNames = reqs.map((req) =>\n typeof req === \"string\" ? req : req.name,\n );\n return bags.flatMap((bag) => bag?.gets(...requestedNames) ?? []);\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mxpicture/build-api",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"description": "Build utilities API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "MXPicture",
|
|
@@ -57,9 +57,7 @@
|
|
|
57
57
|
"simple-git": "^3.32.3",
|
|
58
58
|
"typescript": "^5.9.3",
|
|
59
59
|
"yaml": "^2.8.2",
|
|
60
|
-
"zod": "^4.3.6"
|
|
61
|
-
},
|
|
62
|
-
"devDependencies": {
|
|
60
|
+
"zod": "^4.3.6",
|
|
63
61
|
"@types/node": "^25.3.2"
|
|
64
62
|
}
|
|
65
63
|
}
|