@aigne/afs 1.11.0-beta → 1.11.0-beta.10
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/LICENSE.md +17 -84
- package/README.md +4 -13
- package/dist/_virtual/rolldown_runtime.mjs +7 -0
- package/dist/afs.cjs +1330 -0
- package/dist/afs.d.cts +275 -0
- package/dist/afs.d.cts.map +1 -0
- package/dist/afs.d.mts +275 -0
- package/dist/afs.d.mts.map +1 -0
- package/dist/afs.mjs +1331 -0
- package/dist/afs.mjs.map +1 -0
- package/dist/capabilities/index.d.mts +2 -0
- package/dist/capabilities/types.d.cts +100 -0
- package/dist/capabilities/types.d.cts.map +1 -0
- package/dist/capabilities/types.d.mts +100 -0
- package/dist/capabilities/types.d.mts.map +1 -0
- package/dist/capabilities/world-mapping.cjs +20 -0
- package/dist/capabilities/world-mapping.d.cts +139 -0
- package/dist/capabilities/world-mapping.d.cts.map +1 -0
- package/dist/capabilities/world-mapping.d.mts +139 -0
- package/dist/capabilities/world-mapping.d.mts.map +1 -0
- package/dist/capabilities/world-mapping.mjs +20 -0
- package/dist/capabilities/world-mapping.mjs.map +1 -0
- package/dist/error.cjs +63 -0
- package/dist/error.d.cts +39 -0
- package/dist/error.d.cts.map +1 -0
- package/dist/error.d.mts +39 -0
- package/dist/error.d.mts.map +1 -0
- package/dist/error.mjs +59 -0
- package/dist/error.mjs.map +1 -0
- package/dist/index.cjs +72 -345
- package/dist/index.d.cts +18 -300
- package/dist/index.d.mts +20 -300
- package/dist/index.mjs +16 -342
- package/dist/loader/index.cjs +110 -0
- package/dist/loader/index.d.cts +48 -0
- package/dist/loader/index.d.cts.map +1 -0
- package/dist/loader/index.d.mts +48 -0
- package/dist/loader/index.d.mts.map +1 -0
- package/dist/loader/index.mjs +110 -0
- package/dist/loader/index.mjs.map +1 -0
- package/dist/meta/index.cjs +4 -0
- package/dist/meta/index.mjs +6 -0
- package/dist/meta/kind.cjs +161 -0
- package/dist/meta/kind.d.cts +134 -0
- package/dist/meta/kind.d.cts.map +1 -0
- package/dist/meta/kind.d.mts +134 -0
- package/dist/meta/kind.d.mts.map +1 -0
- package/dist/meta/kind.mjs +157 -0
- package/dist/meta/kind.mjs.map +1 -0
- package/dist/meta/path.cjs +116 -0
- package/dist/meta/path.d.cts +43 -0
- package/dist/meta/path.d.cts.map +1 -0
- package/dist/meta/path.d.mts +43 -0
- package/dist/meta/path.d.mts.map +1 -0
- package/dist/meta/path.mjs +112 -0
- package/dist/meta/path.mjs.map +1 -0
- package/dist/meta/type.d.cts +96 -0
- package/dist/meta/type.d.cts.map +1 -0
- package/dist/meta/type.d.mts +96 -0
- package/dist/meta/type.d.mts.map +1 -0
- package/dist/meta/validation.cjs +77 -0
- package/dist/meta/validation.d.cts +19 -0
- package/dist/meta/validation.d.cts.map +1 -0
- package/dist/meta/validation.d.mts +19 -0
- package/dist/meta/validation.d.mts.map +1 -0
- package/dist/meta/validation.mjs +77 -0
- package/dist/meta/validation.mjs.map +1 -0
- package/dist/meta/well-known-kinds.cjs +228 -0
- package/dist/meta/well-known-kinds.d.cts +52 -0
- package/dist/meta/well-known-kinds.d.cts.map +1 -0
- package/dist/meta/well-known-kinds.d.mts +52 -0
- package/dist/meta/well-known-kinds.d.mts.map +1 -0
- package/dist/meta/well-known-kinds.mjs +219 -0
- package/dist/meta/well-known-kinds.mjs.map +1 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.cts +141 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.cts.map +1 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.mts +141 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.mts.map +1 -0
- package/dist/path.cjs +255 -0
- package/dist/path.d.cts +93 -0
- package/dist/path.d.cts.map +1 -0
- package/dist/path.d.mts +93 -0
- package/dist/path.d.mts.map +1 -0
- package/dist/path.mjs +249 -0
- package/dist/path.mjs.map +1 -0
- package/dist/provider/base.cjs +425 -0
- package/dist/provider/base.d.cts +175 -0
- package/dist/provider/base.d.cts.map +1 -0
- package/dist/provider/base.d.mts +175 -0
- package/dist/provider/base.d.mts.map +1 -0
- package/dist/provider/base.mjs +426 -0
- package/dist/provider/base.mjs.map +1 -0
- package/dist/provider/decorators.cjs +268 -0
- package/dist/provider/decorators.d.cts +244 -0
- package/dist/provider/decorators.d.cts.map +1 -0
- package/dist/provider/decorators.d.mts +244 -0
- package/dist/provider/decorators.d.mts.map +1 -0
- package/dist/provider/decorators.mjs +256 -0
- package/dist/provider/decorators.mjs.map +1 -0
- package/dist/provider/index.cjs +19 -0
- package/dist/provider/index.d.cts +5 -0
- package/dist/provider/index.d.mts +5 -0
- package/dist/provider/index.mjs +5 -0
- package/dist/provider/router.cjs +185 -0
- package/dist/provider/router.d.cts +50 -0
- package/dist/provider/router.d.cts.map +1 -0
- package/dist/provider/router.d.mts +50 -0
- package/dist/provider/router.d.mts.map +1 -0
- package/dist/provider/router.mjs +185 -0
- package/dist/provider/router.mjs.map +1 -0
- package/dist/provider/types.d.cts +113 -0
- package/dist/provider/types.d.cts.map +1 -0
- package/dist/provider/types.d.mts +113 -0
- package/dist/provider/types.d.mts.map +1 -0
- package/dist/registry.cjs +358 -0
- package/dist/registry.d.cts +96 -0
- package/dist/registry.d.cts.map +1 -0
- package/dist/registry.d.mts +96 -0
- package/dist/registry.d.mts.map +1 -0
- package/dist/registry.mjs +360 -0
- package/dist/registry.mjs.map +1 -0
- package/dist/type.cjs +34 -0
- package/dist/type.d.cts +420 -0
- package/dist/type.d.cts.map +1 -0
- package/dist/type.d.mts +420 -0
- package/dist/type.d.mts.map +1 -0
- package/dist/type.mjs +33 -0
- package/dist/type.mjs.map +1 -0
- package/dist/utils/camelize.d.cts.map +1 -1
- package/dist/utils/camelize.d.mts.map +1 -1
- package/dist/utils/schema.cjs +129 -0
- package/dist/utils/schema.d.cts +65 -0
- package/dist/utils/schema.d.cts.map +1 -0
- package/dist/utils/schema.d.mts +65 -0
- package/dist/utils/schema.d.mts.map +1 -0
- package/dist/utils/schema.mjs +124 -0
- package/dist/utils/schema.mjs.map +1 -0
- package/dist/utils/type-utils.d.cts.map +1 -1
- package/dist/utils/type-utils.d.mts.map +1 -1
- package/dist/utils/uri-template.cjs +123 -0
- package/dist/utils/uri-template.d.cts +48 -0
- package/dist/utils/uri-template.d.cts.map +1 -0
- package/dist/utils/uri-template.d.mts +48 -0
- package/dist/utils/uri-template.d.mts.map +1 -0
- package/dist/utils/uri-template.mjs +120 -0
- package/dist/utils/uri-template.mjs.map +1 -0
- package/dist/utils/uri.cjs +49 -0
- package/dist/utils/uri.d.cts +34 -0
- package/dist/utils/uri.d.cts.map +1 -0
- package/dist/utils/uri.d.mts +34 -0
- package/dist/utils/uri.d.mts.map +1 -0
- package/dist/utils/uri.mjs +49 -0
- package/dist/utils/uri.mjs.map +1 -0
- package/dist/utils/zod.cjs +6 -8
- package/dist/utils/zod.d.cts +2 -2
- package/dist/utils/zod.d.cts.map +1 -1
- package/dist/utils/zod.d.mts +2 -2
- package/dist/utils/zod.d.mts.map +1 -1
- package/dist/utils/zod.mjs +6 -8
- package/dist/utils/zod.mjs.map +1 -1
- package/package.json +27 -4
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
const require_path = require('../path.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/meta/path.ts
|
|
4
|
+
/**
|
|
5
|
+
* Meta Path Utilities for AFS
|
|
6
|
+
*
|
|
7
|
+
* Provides functions to work with .meta virtual paths:
|
|
8
|
+
* - /dir/.meta - directory metadata
|
|
9
|
+
* - /dir/.meta/icon.png - directory meta resource
|
|
10
|
+
* - /dir/file.txt/.meta - file metadata
|
|
11
|
+
* - /.meta/.kinds - provider kinds list
|
|
12
|
+
* - /.meta/.kinds/chamber:project - specific kind
|
|
13
|
+
*/
|
|
14
|
+
/** The .meta virtual path segment */
|
|
15
|
+
const META_SEGMENT = ".meta";
|
|
16
|
+
/** The .kinds virtual path segment (under .meta) */
|
|
17
|
+
const KINDS_SEGMENT = ".kinds";
|
|
18
|
+
/**
|
|
19
|
+
* Check if a path is a .meta virtual path.
|
|
20
|
+
*
|
|
21
|
+
* A path is considered a meta path if it contains "/.meta" as a path segment
|
|
22
|
+
* (not just a substring of a filename).
|
|
23
|
+
*
|
|
24
|
+
* @param path - Path to check
|
|
25
|
+
* @returns true if the path is a .meta path
|
|
26
|
+
*/
|
|
27
|
+
function isMetaPath(path) {
|
|
28
|
+
if (!path) return false;
|
|
29
|
+
let normalizedPath;
|
|
30
|
+
try {
|
|
31
|
+
const trimmedPath = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
32
|
+
if (!trimmedPath.startsWith("/")) return false;
|
|
33
|
+
normalizedPath = require_path.normalizePath(trimmedPath);
|
|
34
|
+
} catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const segments = normalizedPath.split("/");
|
|
38
|
+
for (let i = 0; i < segments.length; i++) if (segments[i] === META_SEGMENT) return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse a .meta virtual path into its components.
|
|
43
|
+
*
|
|
44
|
+
* @param path - Meta path to parse (must be absolute and contain .meta)
|
|
45
|
+
* @returns Parsed MetaPathInfo
|
|
46
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
47
|
+
*/
|
|
48
|
+
function parseMetaPath(path) {
|
|
49
|
+
if (!path || path.trim() === "") throw new require_path.AFSPathError("Meta path cannot be empty", path);
|
|
50
|
+
if (!path.startsWith("/")) throw new require_path.AFSPathError("Meta path must be absolute (start with /)", path);
|
|
51
|
+
let normalizedPath;
|
|
52
|
+
try {
|
|
53
|
+
normalizedPath = require_path.validatePath(path.endsWith("/") ? path.slice(0, -1) : path);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
if (e instanceof require_path.AFSPathError) throw e;
|
|
56
|
+
throw new require_path.AFSPathError(`Invalid meta path: ${path}`, path);
|
|
57
|
+
}
|
|
58
|
+
const segments = normalizedPath.split("/");
|
|
59
|
+
let metaIndex = -1;
|
|
60
|
+
for (let i = 0; i < segments.length; i++) if (segments[i] === META_SEGMENT) {
|
|
61
|
+
metaIndex = i;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
if (metaIndex === -1) throw new require_path.AFSPathError(`Path does not contain .meta: ${path}`, path);
|
|
65
|
+
const nodeSegments = segments.slice(0, metaIndex);
|
|
66
|
+
const nodePath = nodeSegments.length === 0 ? "/" : `/${nodeSegments.filter(Boolean).join("/")}`;
|
|
67
|
+
const afterMetaSegments = segments.slice(metaIndex + 1);
|
|
68
|
+
if (afterMetaSegments.length > 0 && afterMetaSegments[0] === KINDS_SEGMENT) {
|
|
69
|
+
const kindName = afterMetaSegments.length > 1 ? afterMetaSegments.slice(1).join("/") : null;
|
|
70
|
+
return {
|
|
71
|
+
nodePath: nodePath === "" ? "/" : nodePath,
|
|
72
|
+
resourcePath: null,
|
|
73
|
+
isKindsPath: true,
|
|
74
|
+
kindName: kindName || null
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const resourcePath = afterMetaSegments.length > 0 ? afterMetaSegments.join("/") : null;
|
|
78
|
+
return {
|
|
79
|
+
nodePath: nodePath === "" ? "/" : nodePath,
|
|
80
|
+
resourcePath,
|
|
81
|
+
isKindsPath: false,
|
|
82
|
+
kindName: null
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a path is a .meta/.kinds path.
|
|
87
|
+
*
|
|
88
|
+
* @param path - Path to check
|
|
89
|
+
* @returns true if the path is a kinds path
|
|
90
|
+
*/
|
|
91
|
+
function isKindsPath(path) {
|
|
92
|
+
if (!path || !isMetaPath(path)) return false;
|
|
93
|
+
try {
|
|
94
|
+
return parseMetaPath(path).isKindsPath;
|
|
95
|
+
} catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract the node path from a meta path.
|
|
101
|
+
*
|
|
102
|
+
* @param metaPath - Meta path
|
|
103
|
+
* @returns Node path (without .meta and after)
|
|
104
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
105
|
+
*/
|
|
106
|
+
function getNodePathFromMetaPath(metaPath) {
|
|
107
|
+
return parseMetaPath(metaPath).nodePath;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//#endregion
|
|
111
|
+
exports.KINDS_SEGMENT = KINDS_SEGMENT;
|
|
112
|
+
exports.META_SEGMENT = META_SEGMENT;
|
|
113
|
+
exports.getNodePathFromMetaPath = getNodePathFromMetaPath;
|
|
114
|
+
exports.isKindsPath = isKindsPath;
|
|
115
|
+
exports.isMetaPath = isMetaPath;
|
|
116
|
+
exports.parseMetaPath = parseMetaPath;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MetaPathInfo } from "./type.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/meta/path.d.ts
|
|
4
|
+
/** The .meta virtual path segment */
|
|
5
|
+
declare const META_SEGMENT = ".meta";
|
|
6
|
+
/** The .kinds virtual path segment (under .meta) */
|
|
7
|
+
declare const KINDS_SEGMENT = ".kinds";
|
|
8
|
+
/**
|
|
9
|
+
* Check if a path is a .meta virtual path.
|
|
10
|
+
*
|
|
11
|
+
* A path is considered a meta path if it contains "/.meta" as a path segment
|
|
12
|
+
* (not just a substring of a filename).
|
|
13
|
+
*
|
|
14
|
+
* @param path - Path to check
|
|
15
|
+
* @returns true if the path is a .meta path
|
|
16
|
+
*/
|
|
17
|
+
declare function isMetaPath(path: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Parse a .meta virtual path into its components.
|
|
20
|
+
*
|
|
21
|
+
* @param path - Meta path to parse (must be absolute and contain .meta)
|
|
22
|
+
* @returns Parsed MetaPathInfo
|
|
23
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
24
|
+
*/
|
|
25
|
+
declare function parseMetaPath(path: string): MetaPathInfo;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a path is a .meta/.kinds path.
|
|
28
|
+
*
|
|
29
|
+
* @param path - Path to check
|
|
30
|
+
* @returns true if the path is a kinds path
|
|
31
|
+
*/
|
|
32
|
+
declare function isKindsPath(path: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Extract the node path from a meta path.
|
|
35
|
+
*
|
|
36
|
+
* @param metaPath - Meta path
|
|
37
|
+
* @returns Node path (without .meta and after)
|
|
38
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
39
|
+
*/
|
|
40
|
+
declare function getNodePathFromMetaPath(metaPath: string): string;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { KINDS_SEGMENT, META_SEGMENT, getNodePathFromMetaPath, isKindsPath, isMetaPath, parseMetaPath };
|
|
43
|
+
//# sourceMappingURL=path.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.cts","names":[],"sources":["../../src/meta/path.ts"],"mappings":";;;;cAea,YAAA;AAcb;AAAA,cAXa,aAAA;;;;AAiDb;;;;;AAyEA;iBA/GgB,UAAA,CAAW,IAAA;;;;AAmI3B;;;;iBA7FgB,aAAA,CAAc,IAAA,WAAe,YAAA;;;;;;;iBAyE7B,WAAA,CAAY,IAAA;;;;;;;;iBAoBZ,uBAAA,CAAwB,QAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MetaPathInfo } from "./type.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/meta/path.d.ts
|
|
4
|
+
/** The .meta virtual path segment */
|
|
5
|
+
declare const META_SEGMENT = ".meta";
|
|
6
|
+
/** The .kinds virtual path segment (under .meta) */
|
|
7
|
+
declare const KINDS_SEGMENT = ".kinds";
|
|
8
|
+
/**
|
|
9
|
+
* Check if a path is a .meta virtual path.
|
|
10
|
+
*
|
|
11
|
+
* A path is considered a meta path if it contains "/.meta" as a path segment
|
|
12
|
+
* (not just a substring of a filename).
|
|
13
|
+
*
|
|
14
|
+
* @param path - Path to check
|
|
15
|
+
* @returns true if the path is a .meta path
|
|
16
|
+
*/
|
|
17
|
+
declare function isMetaPath(path: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Parse a .meta virtual path into its components.
|
|
20
|
+
*
|
|
21
|
+
* @param path - Meta path to parse (must be absolute and contain .meta)
|
|
22
|
+
* @returns Parsed MetaPathInfo
|
|
23
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
24
|
+
*/
|
|
25
|
+
declare function parseMetaPath(path: string): MetaPathInfo;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a path is a .meta/.kinds path.
|
|
28
|
+
*
|
|
29
|
+
* @param path - Path to check
|
|
30
|
+
* @returns true if the path is a kinds path
|
|
31
|
+
*/
|
|
32
|
+
declare function isKindsPath(path: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Extract the node path from a meta path.
|
|
35
|
+
*
|
|
36
|
+
* @param metaPath - Meta path
|
|
37
|
+
* @returns Node path (without .meta and after)
|
|
38
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
39
|
+
*/
|
|
40
|
+
declare function getNodePathFromMetaPath(metaPath: string): string;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { KINDS_SEGMENT, META_SEGMENT, getNodePathFromMetaPath, isKindsPath, isMetaPath, parseMetaPath };
|
|
43
|
+
//# sourceMappingURL=path.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.mts","names":[],"sources":["../../src/meta/path.ts"],"mappings":";;;;cAea,YAAA;AAcb;AAAA,cAXa,aAAA;;;;AAiDb;;;;;AAyEA;iBA/GgB,UAAA,CAAW,IAAA;;;;AAmI3B;;;;iBA7FgB,aAAA,CAAc,IAAA,WAAe,YAAA;;;;;;;iBAyE7B,WAAA,CAAY,IAAA;;;;;;;;iBAoBZ,uBAAA,CAAwB,QAAA"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { AFSPathError, normalizePath, validatePath } from "../path.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/meta/path.ts
|
|
4
|
+
/**
|
|
5
|
+
* Meta Path Utilities for AFS
|
|
6
|
+
*
|
|
7
|
+
* Provides functions to work with .meta virtual paths:
|
|
8
|
+
* - /dir/.meta - directory metadata
|
|
9
|
+
* - /dir/.meta/icon.png - directory meta resource
|
|
10
|
+
* - /dir/file.txt/.meta - file metadata
|
|
11
|
+
* - /.meta/.kinds - provider kinds list
|
|
12
|
+
* - /.meta/.kinds/chamber:project - specific kind
|
|
13
|
+
*/
|
|
14
|
+
/** The .meta virtual path segment */
|
|
15
|
+
const META_SEGMENT = ".meta";
|
|
16
|
+
/** The .kinds virtual path segment (under .meta) */
|
|
17
|
+
const KINDS_SEGMENT = ".kinds";
|
|
18
|
+
/**
|
|
19
|
+
* Check if a path is a .meta virtual path.
|
|
20
|
+
*
|
|
21
|
+
* A path is considered a meta path if it contains "/.meta" as a path segment
|
|
22
|
+
* (not just a substring of a filename).
|
|
23
|
+
*
|
|
24
|
+
* @param path - Path to check
|
|
25
|
+
* @returns true if the path is a .meta path
|
|
26
|
+
*/
|
|
27
|
+
function isMetaPath(path) {
|
|
28
|
+
if (!path) return false;
|
|
29
|
+
let normalizedPath;
|
|
30
|
+
try {
|
|
31
|
+
const trimmedPath = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
32
|
+
if (!trimmedPath.startsWith("/")) return false;
|
|
33
|
+
normalizedPath = normalizePath(trimmedPath);
|
|
34
|
+
} catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const segments = normalizedPath.split("/");
|
|
38
|
+
for (let i = 0; i < segments.length; i++) if (segments[i] === META_SEGMENT) return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse a .meta virtual path into its components.
|
|
43
|
+
*
|
|
44
|
+
* @param path - Meta path to parse (must be absolute and contain .meta)
|
|
45
|
+
* @returns Parsed MetaPathInfo
|
|
46
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
47
|
+
*/
|
|
48
|
+
function parseMetaPath(path) {
|
|
49
|
+
if (!path || path.trim() === "") throw new AFSPathError("Meta path cannot be empty", path);
|
|
50
|
+
if (!path.startsWith("/")) throw new AFSPathError("Meta path must be absolute (start with /)", path);
|
|
51
|
+
let normalizedPath;
|
|
52
|
+
try {
|
|
53
|
+
normalizedPath = validatePath(path.endsWith("/") ? path.slice(0, -1) : path);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
if (e instanceof AFSPathError) throw e;
|
|
56
|
+
throw new AFSPathError(`Invalid meta path: ${path}`, path);
|
|
57
|
+
}
|
|
58
|
+
const segments = normalizedPath.split("/");
|
|
59
|
+
let metaIndex = -1;
|
|
60
|
+
for (let i = 0; i < segments.length; i++) if (segments[i] === META_SEGMENT) {
|
|
61
|
+
metaIndex = i;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
if (metaIndex === -1) throw new AFSPathError(`Path does not contain .meta: ${path}`, path);
|
|
65
|
+
const nodeSegments = segments.slice(0, metaIndex);
|
|
66
|
+
const nodePath = nodeSegments.length === 0 ? "/" : `/${nodeSegments.filter(Boolean).join("/")}`;
|
|
67
|
+
const afterMetaSegments = segments.slice(metaIndex + 1);
|
|
68
|
+
if (afterMetaSegments.length > 0 && afterMetaSegments[0] === KINDS_SEGMENT) {
|
|
69
|
+
const kindName = afterMetaSegments.length > 1 ? afterMetaSegments.slice(1).join("/") : null;
|
|
70
|
+
return {
|
|
71
|
+
nodePath: nodePath === "" ? "/" : nodePath,
|
|
72
|
+
resourcePath: null,
|
|
73
|
+
isKindsPath: true,
|
|
74
|
+
kindName: kindName || null
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const resourcePath = afterMetaSegments.length > 0 ? afterMetaSegments.join("/") : null;
|
|
78
|
+
return {
|
|
79
|
+
nodePath: nodePath === "" ? "/" : nodePath,
|
|
80
|
+
resourcePath,
|
|
81
|
+
isKindsPath: false,
|
|
82
|
+
kindName: null
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a path is a .meta/.kinds path.
|
|
87
|
+
*
|
|
88
|
+
* @param path - Path to check
|
|
89
|
+
* @returns true if the path is a kinds path
|
|
90
|
+
*/
|
|
91
|
+
function isKindsPath(path) {
|
|
92
|
+
if (!path || !isMetaPath(path)) return false;
|
|
93
|
+
try {
|
|
94
|
+
return parseMetaPath(path).isKindsPath;
|
|
95
|
+
} catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract the node path from a meta path.
|
|
101
|
+
*
|
|
102
|
+
* @param metaPath - Meta path
|
|
103
|
+
* @returns Node path (without .meta and after)
|
|
104
|
+
* @throws AFSPathError if path is invalid or not a meta path
|
|
105
|
+
*/
|
|
106
|
+
function getNodePathFromMetaPath(metaPath) {
|
|
107
|
+
return parseMetaPath(metaPath).nodePath;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//#endregion
|
|
111
|
+
export { KINDS_SEGMENT, META_SEGMENT, getNodePathFromMetaPath, isKindsPath, isMetaPath, parseMetaPath };
|
|
112
|
+
//# sourceMappingURL=path.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.mjs","names":[],"sources":["../../src/meta/path.ts"],"sourcesContent":["/**\n * Meta Path Utilities for AFS\n *\n * Provides functions to work with .meta virtual paths:\n * - /dir/.meta - directory metadata\n * - /dir/.meta/icon.png - directory meta resource\n * - /dir/file.txt/.meta - file metadata\n * - /.meta/.kinds - provider kinds list\n * - /.meta/.kinds/chamber:project - specific kind\n */\n\nimport { AFSPathError, normalizePath, validatePath } from \"../path.js\";\nimport type { MetaPathInfo } from \"./type.js\";\n\n/** The .meta virtual path segment */\nexport const META_SEGMENT = \".meta\";\n\n/** The .kinds virtual path segment (under .meta) */\nexport const KINDS_SEGMENT = \".kinds\";\n\n/**\n * Check if a path is a .meta virtual path.\n *\n * A path is considered a meta path if it contains \"/.meta\" as a path segment\n * (not just a substring of a filename).\n *\n * @param path - Path to check\n * @returns true if the path is a .meta path\n */\nexport function isMetaPath(path: string): boolean {\n if (!path) {\n return false;\n }\n\n // Normalize the path to handle // and . and ..\n // But don't throw for invalid paths, just return false\n let normalizedPath: string;\n try {\n // Handle trailing slash\n const trimmedPath = path.endsWith(\"/\") ? path.slice(0, -1) : path;\n if (!trimmedPath.startsWith(\"/\")) {\n return false;\n }\n normalizedPath = normalizePath(trimmedPath);\n } catch {\n return false;\n }\n\n const segments = normalizedPath.split(\"/\");\n\n // Check if any segment is exactly .meta\n for (let i = 0; i < segments.length; i++) {\n if (segments[i] === META_SEGMENT) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Parse a .meta virtual path into its components.\n *\n * @param path - Meta path to parse (must be absolute and contain .meta)\n * @returns Parsed MetaPathInfo\n * @throws AFSPathError if path is invalid or not a meta path\n */\nexport function parseMetaPath(path: string): MetaPathInfo {\n if (!path || path.trim() === \"\") {\n throw new AFSPathError(\"Meta path cannot be empty\", path);\n }\n\n if (!path.startsWith(\"/\")) {\n throw new AFSPathError(\"Meta path must be absolute (start with /)\", path);\n }\n\n // Validate and normalize the path (checks for control characters)\n let normalizedPath: string;\n try {\n const trimmedPath = path.endsWith(\"/\") ? path.slice(0, -1) : path;\n // validatePath both validates and normalizes\n normalizedPath = validatePath(trimmedPath);\n } catch (e) {\n if (e instanceof AFSPathError) {\n throw e;\n }\n throw new AFSPathError(`Invalid meta path: ${path}`, path);\n }\n\n const segments = normalizedPath.split(\"/\");\n\n // Find the .meta segment index\n let metaIndex = -1;\n for (let i = 0; i < segments.length; i++) {\n if (segments[i] === META_SEGMENT) {\n metaIndex = i;\n break;\n }\n }\n\n if (metaIndex === -1) {\n throw new AFSPathError(`Path does not contain .meta: ${path}`, path);\n }\n\n // Node path is everything before .meta\n const nodeSegments = segments.slice(0, metaIndex);\n const nodePath = nodeSegments.length === 0 ? \"/\" : `/${nodeSegments.filter(Boolean).join(\"/\")}`;\n\n // Path after .meta\n const afterMetaSegments = segments.slice(metaIndex + 1);\n\n // Check for .kinds path\n if (afterMetaSegments.length > 0 && afterMetaSegments[0] === KINDS_SEGMENT) {\n // It's a kinds path\n const kindName = afterMetaSegments.length > 1 ? afterMetaSegments.slice(1).join(\"/\") : null;\n return {\n nodePath: nodePath === \"\" ? \"/\" : nodePath,\n resourcePath: null,\n isKindsPath: true,\n kindName: kindName || null,\n };\n }\n\n // Regular meta path or resource path\n const resourcePath = afterMetaSegments.length > 0 ? afterMetaSegments.join(\"/\") : null;\n\n return {\n nodePath: nodePath === \"\" ? \"/\" : nodePath,\n resourcePath,\n isKindsPath: false,\n kindName: null,\n };\n}\n\n/**\n * Check if a path is a .meta/.kinds path.\n *\n * @param path - Path to check\n * @returns true if the path is a kinds path\n */\nexport function isKindsPath(path: string): boolean {\n if (!path || !isMetaPath(path)) {\n return false;\n }\n\n try {\n const info = parseMetaPath(path);\n return info.isKindsPath;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the node path from a meta path.\n *\n * @param metaPath - Meta path\n * @returns Node path (without .meta and after)\n * @throws AFSPathError if path is invalid or not a meta path\n */\nexport function getNodePathFromMetaPath(metaPath: string): string {\n const info = parseMetaPath(metaPath);\n return info.nodePath;\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,MAAa,eAAe;;AAG5B,MAAa,gBAAgB;;;;;;;;;;AAW7B,SAAgB,WAAW,MAAuB;AAChD,KAAI,CAAC,KACH,QAAO;CAKT,IAAI;AACJ,KAAI;EAEF,MAAM,cAAc,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG;AAC7D,MAAI,CAAC,YAAY,WAAW,IAAI,CAC9B,QAAO;AAET,mBAAiB,cAAc,YAAY;SACrC;AACN,SAAO;;CAGT,MAAM,WAAW,eAAe,MAAM,IAAI;AAG1C,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,IACnC,KAAI,SAAS,OAAO,aAClB,QAAO;AAIX,QAAO;;;;;;;;;AAUT,SAAgB,cAAc,MAA4B;AACxD,KAAI,CAAC,QAAQ,KAAK,MAAM,KAAK,GAC3B,OAAM,IAAI,aAAa,6BAA6B,KAAK;AAG3D,KAAI,CAAC,KAAK,WAAW,IAAI,CACvB,OAAM,IAAI,aAAa,6CAA6C,KAAK;CAI3E,IAAI;AACJ,KAAI;AAGF,mBAAiB,aAFG,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,KAEnB;UACnC,GAAG;AACV,MAAI,aAAa,aACf,OAAM;AAER,QAAM,IAAI,aAAa,sBAAsB,QAAQ,KAAK;;CAG5D,MAAM,WAAW,eAAe,MAAM,IAAI;CAG1C,IAAI,YAAY;AAChB,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,IACnC,KAAI,SAAS,OAAO,cAAc;AAChC,cAAY;AACZ;;AAIJ,KAAI,cAAc,GAChB,OAAM,IAAI,aAAa,gCAAgC,QAAQ,KAAK;CAItE,MAAM,eAAe,SAAS,MAAM,GAAG,UAAU;CACjD,MAAM,WAAW,aAAa,WAAW,IAAI,MAAM,IAAI,aAAa,OAAO,QAAQ,CAAC,KAAK,IAAI;CAG7F,MAAM,oBAAoB,SAAS,MAAM,YAAY,EAAE;AAGvD,KAAI,kBAAkB,SAAS,KAAK,kBAAkB,OAAO,eAAe;EAE1E,MAAM,WAAW,kBAAkB,SAAS,IAAI,kBAAkB,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG;AACvF,SAAO;GACL,UAAU,aAAa,KAAK,MAAM;GAClC,cAAc;GACd,aAAa;GACb,UAAU,YAAY;GACvB;;CAIH,MAAM,eAAe,kBAAkB,SAAS,IAAI,kBAAkB,KAAK,IAAI,GAAG;AAElF,QAAO;EACL,UAAU,aAAa,KAAK,MAAM;EAClC;EACA,aAAa;EACb,UAAU;EACX;;;;;;;;AASH,SAAgB,YAAY,MAAuB;AACjD,KAAI,CAAC,QAAQ,CAAC,WAAW,KAAK,CAC5B,QAAO;AAGT,KAAI;AAEF,SADa,cAAc,KAAK,CACpB;SACN;AACN,SAAO;;;;;;;;;;AAWX,SAAgB,wBAAwB,UAA0B;AAEhE,QADa,cAAc,SAAS,CACxB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { JSONSchema7 } from "../node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/meta/type.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Constraint for a single node (file or directory) within a Kind.
|
|
6
|
+
* Supports exact paths, wildcards, and glob patterns.
|
|
7
|
+
*/
|
|
8
|
+
interface NodeConstraint {
|
|
9
|
+
/**
|
|
10
|
+
* Node name or path pattern.
|
|
11
|
+
* - Exact: "src", "README.md"
|
|
12
|
+
* - Wildcard: "*.md", "*.test.ts"
|
|
13
|
+
* - Glob: "test/**", "src/**\/*.tsx"
|
|
14
|
+
*/
|
|
15
|
+
path: string;
|
|
16
|
+
/** Kind that this node must conform to (optional) */
|
|
17
|
+
kind?: string;
|
|
18
|
+
/** Nested constraints for child nodes (recursive) */
|
|
19
|
+
nodes?: NodesConstraints;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Constraints for child nodes within a directory.
|
|
23
|
+
*/
|
|
24
|
+
interface NodesConstraints {
|
|
25
|
+
/** Nodes that must exist */
|
|
26
|
+
required?: NodeConstraint[];
|
|
27
|
+
/** Nodes that may exist (validated if present) */
|
|
28
|
+
optional?: NodeConstraint[];
|
|
29
|
+
/** Whether to allow nodes not listed in required/optional (default: true) */
|
|
30
|
+
allowOther?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Kind Schema definition.
|
|
34
|
+
* Uses JSON Schema for meta validation.
|
|
35
|
+
*/
|
|
36
|
+
interface KindSchema {
|
|
37
|
+
/** Unique name in format "provider:kind" (e.g., "afs:node", "chamber:project") */
|
|
38
|
+
name: string;
|
|
39
|
+
/** Parent kind name for inheritance (single inheritance) */
|
|
40
|
+
extends?: string;
|
|
41
|
+
/** Human-readable description */
|
|
42
|
+
description?: string;
|
|
43
|
+
/** Meta schema in JSON Schema format */
|
|
44
|
+
meta?: JSONSchema7;
|
|
45
|
+
/** Child node structure constraints */
|
|
46
|
+
nodes?: NodesConstraints;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Result of validating a node against its Kind Schema.
|
|
50
|
+
*/
|
|
51
|
+
interface ValidationResult {
|
|
52
|
+
/** Whether validation passed */
|
|
53
|
+
valid: boolean;
|
|
54
|
+
/** List of validation errors (empty if valid) */
|
|
55
|
+
errors: ValidationError[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A single validation error.
|
|
59
|
+
*/
|
|
60
|
+
interface ValidationError {
|
|
61
|
+
/** Path to the invalid property or node */
|
|
62
|
+
path: string;
|
|
63
|
+
/** Human-readable error message */
|
|
64
|
+
message: string;
|
|
65
|
+
/** Error code for programmatic handling */
|
|
66
|
+
code?: string;
|
|
67
|
+
/** Expected value or constraint */
|
|
68
|
+
expected?: unknown;
|
|
69
|
+
/** Actual value found */
|
|
70
|
+
actual?: unknown;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parsed information about a .meta virtual path.
|
|
74
|
+
*/
|
|
75
|
+
interface MetaPathInfo {
|
|
76
|
+
/** Path to the node (without .meta suffix) */
|
|
77
|
+
nodePath: string;
|
|
78
|
+
/** Resource path within .meta (e.g., "icon.png"), null for meta itself */
|
|
79
|
+
resourcePath: string | null;
|
|
80
|
+
/** Whether this is a .meta/.kinds path */
|
|
81
|
+
isKindsPath: boolean;
|
|
82
|
+
/** Specific kind name if accessing .meta/.kinds/{name} */
|
|
83
|
+
kindName: string | null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Result of explain() operation - LLM-friendly node description.
|
|
87
|
+
*/
|
|
88
|
+
interface AFSExplainResult {
|
|
89
|
+
/** Output format */
|
|
90
|
+
format: "markdown" | "text";
|
|
91
|
+
/** Human/LLM readable description */
|
|
92
|
+
content: string;
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { AFSExplainResult, KindSchema, MetaPathInfo, NodeConstraint, NodesConstraints, ValidationError, ValidationResult };
|
|
96
|
+
//# sourceMappingURL=type.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.cts","names":[],"sources":["../../src/meta/type.ts"],"mappings":";;;;;;;UAeiB,cAAA;EAWP;;;AAMV;;;EAVE,IAAA;EAYA;EAVA,IAAA;EAYA;EAVA,KAAA,GAAQ,gBAAA;AAAA;;;AAmBV;UAbiB,gBAAA;;EAEf,QAAA,GAAW,cAAA;EAaX;EAXA,QAAA,GAAW,cAAA;EAeX;EAbA,UAAA;AAAA;;;;;UAOe,UAAA;EAgBgB;EAd/B,IAAA;EAkBuB;EAhBvB,OAAA;EAgBA;EAdA,WAAA;EAcuB;EAZvB,IAAA,GAAO,WAAA;EAkBQ;EAhBf,KAAA,GAAQ,gBAAA;AAAA;;;;UAMO,gBAAA;EAkBf;EAhBA,KAAA;EAkBM;EAhBN,MAAA,EAAQ,eAAA;AAAA;;;;UAMO,eAAA;EAoBf;EAlBA,IAAA;EAsBA;EApBA,OAAA;EAoBQ;EAlBR,IAAA;EAwB+B;EAtB/B,QAAA;EAwBA;EAtBA,MAAA;AAAA;;;;UAMe,YAAA;;EAEf,QAAA;;EAEA,YAAA;;EAEA,WAAA;;EAEA,QAAA;AAAA;;;;UAMe,gBAAA;;EAEf,MAAA;;EAEA,OAAA;AAAA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { JSONSchema7 } from "../node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/meta/type.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Constraint for a single node (file or directory) within a Kind.
|
|
6
|
+
* Supports exact paths, wildcards, and glob patterns.
|
|
7
|
+
*/
|
|
8
|
+
interface NodeConstraint {
|
|
9
|
+
/**
|
|
10
|
+
* Node name or path pattern.
|
|
11
|
+
* - Exact: "src", "README.md"
|
|
12
|
+
* - Wildcard: "*.md", "*.test.ts"
|
|
13
|
+
* - Glob: "test/**", "src/**\/*.tsx"
|
|
14
|
+
*/
|
|
15
|
+
path: string;
|
|
16
|
+
/** Kind that this node must conform to (optional) */
|
|
17
|
+
kind?: string;
|
|
18
|
+
/** Nested constraints for child nodes (recursive) */
|
|
19
|
+
nodes?: NodesConstraints;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Constraints for child nodes within a directory.
|
|
23
|
+
*/
|
|
24
|
+
interface NodesConstraints {
|
|
25
|
+
/** Nodes that must exist */
|
|
26
|
+
required?: NodeConstraint[];
|
|
27
|
+
/** Nodes that may exist (validated if present) */
|
|
28
|
+
optional?: NodeConstraint[];
|
|
29
|
+
/** Whether to allow nodes not listed in required/optional (default: true) */
|
|
30
|
+
allowOther?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Kind Schema definition.
|
|
34
|
+
* Uses JSON Schema for meta validation.
|
|
35
|
+
*/
|
|
36
|
+
interface KindSchema {
|
|
37
|
+
/** Unique name in format "provider:kind" (e.g., "afs:node", "chamber:project") */
|
|
38
|
+
name: string;
|
|
39
|
+
/** Parent kind name for inheritance (single inheritance) */
|
|
40
|
+
extends?: string;
|
|
41
|
+
/** Human-readable description */
|
|
42
|
+
description?: string;
|
|
43
|
+
/** Meta schema in JSON Schema format */
|
|
44
|
+
meta?: JSONSchema7;
|
|
45
|
+
/** Child node structure constraints */
|
|
46
|
+
nodes?: NodesConstraints;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Result of validating a node against its Kind Schema.
|
|
50
|
+
*/
|
|
51
|
+
interface ValidationResult {
|
|
52
|
+
/** Whether validation passed */
|
|
53
|
+
valid: boolean;
|
|
54
|
+
/** List of validation errors (empty if valid) */
|
|
55
|
+
errors: ValidationError[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A single validation error.
|
|
59
|
+
*/
|
|
60
|
+
interface ValidationError {
|
|
61
|
+
/** Path to the invalid property or node */
|
|
62
|
+
path: string;
|
|
63
|
+
/** Human-readable error message */
|
|
64
|
+
message: string;
|
|
65
|
+
/** Error code for programmatic handling */
|
|
66
|
+
code?: string;
|
|
67
|
+
/** Expected value or constraint */
|
|
68
|
+
expected?: unknown;
|
|
69
|
+
/** Actual value found */
|
|
70
|
+
actual?: unknown;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parsed information about a .meta virtual path.
|
|
74
|
+
*/
|
|
75
|
+
interface MetaPathInfo {
|
|
76
|
+
/** Path to the node (without .meta suffix) */
|
|
77
|
+
nodePath: string;
|
|
78
|
+
/** Resource path within .meta (e.g., "icon.png"), null for meta itself */
|
|
79
|
+
resourcePath: string | null;
|
|
80
|
+
/** Whether this is a .meta/.kinds path */
|
|
81
|
+
isKindsPath: boolean;
|
|
82
|
+
/** Specific kind name if accessing .meta/.kinds/{name} */
|
|
83
|
+
kindName: string | null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Result of explain() operation - LLM-friendly node description.
|
|
87
|
+
*/
|
|
88
|
+
interface AFSExplainResult {
|
|
89
|
+
/** Output format */
|
|
90
|
+
format: "markdown" | "text";
|
|
91
|
+
/** Human/LLM readable description */
|
|
92
|
+
content: string;
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { AFSExplainResult, KindSchema, MetaPathInfo, NodeConstraint, NodesConstraints, ValidationError, ValidationResult };
|
|
96
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.mts","names":[],"sources":["../../src/meta/type.ts"],"mappings":";;;;;;;UAeiB,cAAA;EAWP;;;AAMV;;;EAVE,IAAA;EAYA;EAVA,IAAA;EAYA;EAVA,KAAA,GAAQ,gBAAA;AAAA;;;AAmBV;UAbiB,gBAAA;;EAEf,QAAA,GAAW,cAAA;EAaX;EAXA,QAAA,GAAW,cAAA;EAeX;EAbA,UAAA;AAAA;;;;;UAOe,UAAA;EAgBgB;EAd/B,IAAA;EAkBuB;EAhBvB,OAAA;EAgBA;EAdA,WAAA;EAcuB;EAZvB,IAAA,GAAO,WAAA;EAkBQ;EAhBf,KAAA,GAAQ,gBAAA;AAAA;;;;UAMO,gBAAA;EAkBf;EAhBA,KAAA;EAkBM;EAhBN,MAAA,EAAQ,eAAA;AAAA;;;;UAMO,eAAA;EAoBf;EAlBA,IAAA;EAsBA;EApBA,OAAA;EAoBQ;EAlBR,IAAA;EAwB+B;EAtB/B,QAAA;EAwBA;EAtBA,MAAA;AAAA;;;;UAMe,YAAA;;EAEf,QAAA;;EAEA,YAAA;;EAEA,WAAA;;EAEA,QAAA;AAAA;;;;UAMe,gBAAA;;EAEf,MAAA;;EAEA,OAAA;AAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
let minimatch = require("minimatch");
|
|
2
|
+
|
|
3
|
+
//#region src/meta/validation.ts
|
|
4
|
+
/**
|
|
5
|
+
* Validation utilities for AFS Meta System.
|
|
6
|
+
*
|
|
7
|
+
* Provides:
|
|
8
|
+
* - Node constraint validation (required/optional nodes, glob patterns)
|
|
9
|
+
* - Validation result types
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Validate a list of node names against NodesConstraints.
|
|
13
|
+
*
|
|
14
|
+
* @param basePath - Base path for error reporting (e.g., "/project")
|
|
15
|
+
* @param nodeNames - List of node names in the directory
|
|
16
|
+
* @param constraints - NodesConstraints to validate against
|
|
17
|
+
* @returns ValidationResult with valid flag and any errors
|
|
18
|
+
*/
|
|
19
|
+
function validateNodes(basePath, nodeNames, constraints) {
|
|
20
|
+
const errors = [];
|
|
21
|
+
if (!constraints) return {
|
|
22
|
+
valid: true,
|
|
23
|
+
errors: []
|
|
24
|
+
};
|
|
25
|
+
const matchedNodes = /* @__PURE__ */ new Set();
|
|
26
|
+
if (constraints.required) for (const constraint of constraints.required) {
|
|
27
|
+
const pattern = constraint.path;
|
|
28
|
+
let found = false;
|
|
29
|
+
for (const nodeName of nodeNames) if (matchesPattern(nodeName, pattern)) {
|
|
30
|
+
found = true;
|
|
31
|
+
matchedNodes.add(nodeName);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
if (!found) errors.push({
|
|
35
|
+
path: `${basePath}/${pattern}`,
|
|
36
|
+
message: `Required node "${pattern}" not found in ${basePath}`,
|
|
37
|
+
code: "REQUIRED_NODE_MISSING"
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (constraints.optional) for (const constraint of constraints.optional) {
|
|
41
|
+
const pattern = constraint.path;
|
|
42
|
+
for (const nodeName of nodeNames) if (matchesPattern(nodeName, pattern)) matchedNodes.add(nodeName);
|
|
43
|
+
}
|
|
44
|
+
if (constraints.allowOther === false) {
|
|
45
|
+
for (const nodeName of nodeNames) if (!matchedNodes.has(nodeName)) errors.push({
|
|
46
|
+
path: `${basePath}/${nodeName}`,
|
|
47
|
+
message: `Unexpected node "${nodeName}" in ${basePath} (allowOther is false)`,
|
|
48
|
+
code: "UNEXPECTED_NODE"
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
valid: errors.length === 0,
|
|
53
|
+
errors
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if a node name matches a pattern (supports glob).
|
|
58
|
+
*/
|
|
59
|
+
function matchesPattern(nodeName, pattern) {
|
|
60
|
+
if (nodeName === pattern) return true;
|
|
61
|
+
if (pattern.includes("*")) return (0, minimatch.minimatch)(nodeName, pattern, { dot: true });
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Combine multiple ValidationResults into one.
|
|
66
|
+
*/
|
|
67
|
+
function combineValidationResults(...results) {
|
|
68
|
+
const allErrors = results.flatMap((r) => r.errors);
|
|
69
|
+
return {
|
|
70
|
+
valid: allErrors.length === 0,
|
|
71
|
+
errors: allErrors
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
exports.combineValidationResults = combineValidationResults;
|
|
77
|
+
exports.validateNodes = validateNodes;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NodesConstraints, ValidationResult } from "./type.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/meta/validation.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Validate a list of node names against NodesConstraints.
|
|
6
|
+
*
|
|
7
|
+
* @param basePath - Base path for error reporting (e.g., "/project")
|
|
8
|
+
* @param nodeNames - List of node names in the directory
|
|
9
|
+
* @param constraints - NodesConstraints to validate against
|
|
10
|
+
* @returns ValidationResult with valid flag and any errors
|
|
11
|
+
*/
|
|
12
|
+
declare function validateNodes(basePath: string, nodeNames: string[], constraints: NodesConstraints | undefined): ValidationResult;
|
|
13
|
+
/**
|
|
14
|
+
* Combine multiple ValidationResults into one.
|
|
15
|
+
*/
|
|
16
|
+
declare function combineValidationResults(...results: ValidationResult[]): ValidationResult;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { combineValidationResults, validateNodes };
|
|
19
|
+
//# sourceMappingURL=validation.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.cts","names":[],"sources":["../../src/meta/validation.ts"],"mappings":";;;;;;;;;AA6GA;;iBA1FgB,aAAA,CACd,QAAA,UACA,SAAA,YACA,WAAA,EAAa,gBAAA,eACZ,gBAAA;;;;iBAsFa,wBAAA,CAAA,GAA4B,OAAA,EAAS,gBAAA,KAAqB,gBAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NodesConstraints, ValidationResult } from "./type.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/meta/validation.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Validate a list of node names against NodesConstraints.
|
|
6
|
+
*
|
|
7
|
+
* @param basePath - Base path for error reporting (e.g., "/project")
|
|
8
|
+
* @param nodeNames - List of node names in the directory
|
|
9
|
+
* @param constraints - NodesConstraints to validate against
|
|
10
|
+
* @returns ValidationResult with valid flag and any errors
|
|
11
|
+
*/
|
|
12
|
+
declare function validateNodes(basePath: string, nodeNames: string[], constraints: NodesConstraints | undefined): ValidationResult;
|
|
13
|
+
/**
|
|
14
|
+
* Combine multiple ValidationResults into one.
|
|
15
|
+
*/
|
|
16
|
+
declare function combineValidationResults(...results: ValidationResult[]): ValidationResult;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { combineValidationResults, validateNodes };
|
|
19
|
+
//# sourceMappingURL=validation.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.mts","names":[],"sources":["../../src/meta/validation.ts"],"mappings":";;;;;;;;;AA6GA;;iBA1FgB,aAAA,CACd,QAAA,UACA,SAAA,YACA,WAAA,EAAa,gBAAA,eACZ,gBAAA;;;;iBAsFa,wBAAA,CAAA,GAA4B,OAAA,EAAS,gBAAA,KAAqB,gBAAA"}
|