@telorun/kernel 0.2.4
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 +17 -0
- package/dist/boot-context-registry.d.ts +47 -0
- package/dist/boot-context-registry.d.ts.map +1 -0
- package/dist/boot-context-registry.js +131 -0
- package/dist/boot-context-registry.js.map +1 -0
- package/dist/capabilities/capabilities/component.yaml +3 -0
- package/dist/capabilities/capabilities/executable.yaml +7 -0
- package/dist/capabilities/capabilities/handler.yaml +3 -0
- package/dist/capabilities/capabilities/listener.yaml +3 -0
- package/dist/capabilities/capabilities/provider.yaml +3 -0
- package/dist/capabilities/capabilities/template.yaml +3 -0
- package/dist/capabilities/capabilities/type.yaml +3 -0
- package/dist/capabilities/component.yaml +3 -0
- package/dist/capabilities/executable.yaml +7 -0
- package/dist/capabilities/handler.yaml +3 -0
- package/dist/capabilities/listener.yaml +3 -0
- package/dist/capabilities/provider.yaml +3 -0
- package/dist/capabilities/template.yaml +3 -0
- package/dist/capabilities/type.yaml +3 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +109 -0
- package/dist/cli.js.map +1 -0
- package/dist/controller-loader.d.ts +24 -0
- package/dist/controller-loader.d.ts.map +1 -0
- package/dist/controller-loader.js +265 -0
- package/dist/controller-loader.js.map +1 -0
- package/dist/controller-registry.d.ts +56 -0
- package/dist/controller-registry.d.ts.map +1 -0
- package/dist/controller-registry.js +169 -0
- package/dist/controller-registry.js.map +1 -0
- package/dist/controllers/capability/capability-controller.d.ts +37 -0
- package/dist/controllers/capability/capability-controller.d.ts.map +1 -0
- package/dist/controllers/capability/capability-controller.js +30 -0
- package/dist/controllers/capability/capability-controller.js.map +1 -0
- package/dist/controllers/module/module-controller.d.ts +16 -0
- package/dist/controllers/module/module-controller.d.ts.map +1 -0
- package/dist/controllers/module/module-controller.js +95 -0
- package/dist/controllers/module/module-controller.js.map +1 -0
- package/dist/controllers/module/module.json +48 -0
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts +33 -0
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -0
- package/dist/controllers/resource-definition/resource-definition-controller.js +44 -0
- package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -0
- package/dist/event-stream.d.ts +45 -0
- package/dist/event-stream.d.ts.map +1 -0
- package/dist/event-stream.js +98 -0
- package/dist/event-stream.js.map +1 -0
- package/dist/events.d.ts +13 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +89 -0
- package/dist/events.js.map +1 -0
- package/dist/expressions.d.ts +20 -0
- package/dist/expressions.d.ts.map +1 -0
- package/dist/expressions.js +253 -0
- package/dist/expressions.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +113 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +558 -0
- package/dist/kernel.js.map +1 -0
- package/dist/loader.d.ts +17 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +189 -0
- package/dist/loader.js.map +1 -0
- package/dist/manifest-adapters/http-adapter.d.ts +8 -0
- package/dist/manifest-adapters/http-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/http-adapter.js +29 -0
- package/dist/manifest-adapters/http-adapter.js.map +1 -0
- package/dist/manifest-adapters/local-file-adapter.d.ts +11 -0
- package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/local-file-adapter.js +51 -0
- package/dist/manifest-adapters/local-file-adapter.js.map +1 -0
- package/dist/manifest-adapters/manifest-adapter.d.ts +33 -0
- package/dist/manifest-adapters/manifest-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/manifest-adapter.js +2 -0
- package/dist/manifest-adapters/manifest-adapter.js.map +1 -0
- package/dist/manifest-adapters/registry-adapter.d.ts +9 -0
- package/dist/manifest-adapters/registry-adapter.d.ts.map +1 -0
- package/dist/manifest-adapters/registry-adapter.js +46 -0
- package/dist/manifest-adapters/registry-adapter.js.map +1 -0
- package/dist/manifest-schemas.d.ts +66 -0
- package/dist/manifest-schemas.d.ts.map +1 -0
- package/dist/manifest-schemas.js +55 -0
- package/dist/manifest-schemas.js.map +1 -0
- package/dist/registry.d.ts +41 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +122 -0
- package/dist/registry.js.map +1 -0
- package/dist/resource-context.d.ts +48 -0
- package/dist/resource-context.d.ts.map +1 -0
- package/dist/resource-context.js +146 -0
- package/dist/resource-context.js.map +1 -0
- package/dist/resource-uri.d.ts +80 -0
- package/dist/resource-uri.d.ts.map +1 -0
- package/dist/resource-uri.js +160 -0
- package/dist/resource-uri.js.map +1 -0
- package/dist/schema-valiator.d.ts +9 -0
- package/dist/schema-valiator.d.ts.map +1 -0
- package/dist/schema-valiator.js +43 -0
- package/dist/schema-valiator.js.map +1 -0
- package/dist/snapshot-serializer.d.ts +63 -0
- package/dist/snapshot-serializer.d.ts.map +1 -0
- package/dist/snapshot-serializer.js +164 -0
- package/dist/snapshot-serializer.js.map +1 -0
- package/dist/src/controllers/module/module.yaml +32 -0
- package/dist/template-definition.d.ts +38 -0
- package/dist/template-definition.d.ts.map +1 -0
- package/dist/template-definition.js +26 -0
- package/dist/template-definition.js.map +1 -0
- package/dist/template-expander.d.ts +19 -0
- package/dist/template-expander.d.ts.map +1 -0
- package/dist/template-expander.js +425 -0
- package/dist/template-expander.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { ResourceURI } from "./resource-uri.js";
|
|
2
|
+
import { RuntimeError } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Registry: Indexes resources by composite key of Kind and Name
|
|
5
|
+
* Maintains URI-based lookup for tracking resource origins and lineage
|
|
6
|
+
*/
|
|
7
|
+
export class ManifestRegistry {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.resources = new Map();
|
|
10
|
+
this.kindInheritance = new Map(); // derivedKind -> parentKind
|
|
11
|
+
this.uriIndex = new Map(); // URI -> Resource
|
|
12
|
+
this.sourceIndex = new Map(); // source path -> Resources
|
|
13
|
+
this.depthIndex = new Map(); // generation depth -> Resources
|
|
14
|
+
}
|
|
15
|
+
register(resource) {
|
|
16
|
+
const { kind, metadata } = resource;
|
|
17
|
+
const { name } = metadata;
|
|
18
|
+
console.log("Registering resource:", kind, name);
|
|
19
|
+
if (!this.resources.has(kind)) {
|
|
20
|
+
this.resources.set(kind, new Map());
|
|
21
|
+
}
|
|
22
|
+
const kindMap = this.resources.get(kind);
|
|
23
|
+
if (kindMap.has(name)) {
|
|
24
|
+
throw new RuntimeError("ERR_DUPLICATE_RESOURCE", `Duplicate resource: ${kind}.${name}`);
|
|
25
|
+
}
|
|
26
|
+
kindMap.set(name, resource);
|
|
27
|
+
// Index by URI if available
|
|
28
|
+
if (metadata.uri) {
|
|
29
|
+
this.uriIndex.set(metadata.uri, resource);
|
|
30
|
+
// Index by source file/path
|
|
31
|
+
try {
|
|
32
|
+
const uri = ResourceURI.parse(metadata.uri);
|
|
33
|
+
if (uri.isFileSource()) {
|
|
34
|
+
const sourcePath = uri.path;
|
|
35
|
+
if (!this.sourceIndex.has(sourcePath)) {
|
|
36
|
+
this.sourceIndex.set(sourcePath, []);
|
|
37
|
+
}
|
|
38
|
+
this.sourceIndex.get(sourcePath).push(resource);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// URI parsing failed, skip indexing
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Index by generation depth
|
|
46
|
+
const depth = metadata.generationDepth ?? 0;
|
|
47
|
+
if (!this.depthIndex.has(depth)) {
|
|
48
|
+
this.depthIndex.set(depth, []);
|
|
49
|
+
}
|
|
50
|
+
this.depthIndex.get(depth).push(resource);
|
|
51
|
+
// Check if this is a Runtime.KindDefinition that creates a new kind
|
|
52
|
+
// if (kind === 'Runtime.KindDefinition') {
|
|
53
|
+
// const newKind = name;
|
|
54
|
+
// const parentKind = resource?.extends;
|
|
55
|
+
// if (parentKind) {
|
|
56
|
+
// this.kindInheritance.set(newKind, parentKind);
|
|
57
|
+
// }
|
|
58
|
+
// }
|
|
59
|
+
}
|
|
60
|
+
getParentKind(kind) {
|
|
61
|
+
return this.kindInheritance.get(kind);
|
|
62
|
+
}
|
|
63
|
+
resolveKindChain(kind) {
|
|
64
|
+
const chain = [kind];
|
|
65
|
+
let current = kind;
|
|
66
|
+
while (this.kindInheritance.has(current)) {
|
|
67
|
+
current = this.kindInheritance.get(current);
|
|
68
|
+
chain.push(current);
|
|
69
|
+
}
|
|
70
|
+
return chain;
|
|
71
|
+
}
|
|
72
|
+
get(kind, name) {
|
|
73
|
+
return this.resources.get(kind)?.get(name);
|
|
74
|
+
}
|
|
75
|
+
getByKind(kind) {
|
|
76
|
+
const kindMap = this.resources.get(kind);
|
|
77
|
+
return kindMap ? Array.from(kindMap.values()) : [];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get resource by its URI
|
|
81
|
+
*/
|
|
82
|
+
getByUri(uri) {
|
|
83
|
+
return this.uriIndex.get(uri);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get all resources from a specific source file
|
|
87
|
+
*/
|
|
88
|
+
getBySourceFile(sourceFilePath) {
|
|
89
|
+
return this.sourceIndex.get(sourceFilePath) ?? [];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get all resources at a specific generation depth
|
|
93
|
+
* 0 = directly from files, 1+ = template-generated
|
|
94
|
+
*/
|
|
95
|
+
getByGenerationDepth(depth) {
|
|
96
|
+
return this.depthIndex.get(depth) ?? [];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get all template-generated resources (depth > 0)
|
|
100
|
+
*/
|
|
101
|
+
getTemplateGenerated() {
|
|
102
|
+
const results = [];
|
|
103
|
+
for (const [depth, resources] of this.depthIndex) {
|
|
104
|
+
if (depth > 0) {
|
|
105
|
+
results.push(...resources);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return results;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get all directly-loaded resources (depth = 0)
|
|
112
|
+
*/
|
|
113
|
+
getDirectlyLoaded() {
|
|
114
|
+
return this.depthIndex.get(0) ?? [];
|
|
115
|
+
}
|
|
116
|
+
getAll() {
|
|
117
|
+
return Array.from(this.resources.values())
|
|
118
|
+
.map((kindMap) => Array.from(kindMap.values()))
|
|
119
|
+
.flat();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ResourceContext, RuntimeResource } from "@telorun/sdk";
|
|
2
|
+
import { Kernel } from "./kernel.js";
|
|
3
|
+
import { SchemaValidator } from "./schema-valiator.js";
|
|
4
|
+
export declare class ResourceContextImpl implements ResourceContext {
|
|
5
|
+
readonly kernel: Kernel;
|
|
6
|
+
private readonly metadata;
|
|
7
|
+
private readonly validator;
|
|
8
|
+
private readonly resourceKey?;
|
|
9
|
+
constructor(kernel: Kernel, metadata: Record<string, any>, validator?: SchemaValidator, resourceKey?: string | undefined);
|
|
10
|
+
createSchemaValidator(schema: any): import("@telorun/sdk").DataValidator;
|
|
11
|
+
registerSchema(name: string, schema: object): void;
|
|
12
|
+
lookupSchema(name: string): object | undefined;
|
|
13
|
+
validateSchema(value: any, schema: any): void;
|
|
14
|
+
invoke(kind: string, name: string, ...args: any[]): Promise<any>;
|
|
15
|
+
registerManifest(resource: any): void;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves a resource into a normalized {kind, name} reference.
|
|
18
|
+
* If the resource contains a definition (kind + properties), registers it as a manifest.
|
|
19
|
+
* Returns the normalized reference in all cases.
|
|
20
|
+
*
|
|
21
|
+
* @param resource Resource definition or reference object with 'kind' property
|
|
22
|
+
* @param resourceName Optional name to assign if not present in resource
|
|
23
|
+
* @returns Normalized {kind, name} reference
|
|
24
|
+
* @throws RuntimeError if 'kind' is missing
|
|
25
|
+
*/
|
|
26
|
+
resolveChildren(resource: any, resourceName?: string): {
|
|
27
|
+
kind: string;
|
|
28
|
+
name: string;
|
|
29
|
+
};
|
|
30
|
+
teardownResource(kind: string, name: string): Promise<void>;
|
|
31
|
+
getResources(kind: string): RuntimeResource[];
|
|
32
|
+
getResourcesByName(kind: string, name: string): RuntimeResource | null;
|
|
33
|
+
registerController(moduleName: string, kindName: string, controllerInstance: any): Promise<void>;
|
|
34
|
+
registerDefinition(def: any): void;
|
|
35
|
+
registerCapability(name: string, schema?: Record<string, any>): void;
|
|
36
|
+
isCapabilityRegistered(name: string): boolean;
|
|
37
|
+
getCapabilitySchema(name: string): Record<string, any> | null | undefined;
|
|
38
|
+
on(event: string, handler: (payload?: any) => void | Promise<void>): void;
|
|
39
|
+
once(event: string, handler: (payload?: any) => void | Promise<void>): void;
|
|
40
|
+
off(event: string, handler: (payload?: any) => void | Promise<void>): void;
|
|
41
|
+
emit(event: string, payload?: any): Promise<void>;
|
|
42
|
+
acquireHold(reason?: string): () => void;
|
|
43
|
+
requestExit(code: number): void;
|
|
44
|
+
evaluateCel(expression: string, context: Record<string, any>): unknown;
|
|
45
|
+
expandValue(value: any, context: Record<string, any>): any;
|
|
46
|
+
emitEvent(event: string, payload?: any): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=resource-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-context.d.ts","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { NoopValidator } from "@telorun/sdk";
|
|
2
|
+
import AjvModule from "ajv";
|
|
3
|
+
import { expandValue } from "./expressions.js";
|
|
4
|
+
import { formatAjvErrors } from "./manifest-schemas.js";
|
|
5
|
+
import { SchemaValidator } from "./schema-valiator.js";
|
|
6
|
+
import { RuntimeError } from "./types.js";
|
|
7
|
+
const Ajv = AjvModule.default ?? AjvModule;
|
|
8
|
+
export class ResourceContextImpl {
|
|
9
|
+
constructor(kernel, metadata, validator = new SchemaValidator(), resourceKey) {
|
|
10
|
+
this.kernel = kernel;
|
|
11
|
+
this.metadata = metadata;
|
|
12
|
+
this.validator = validator;
|
|
13
|
+
this.resourceKey = resourceKey;
|
|
14
|
+
}
|
|
15
|
+
createSchemaValidator(schema) {
|
|
16
|
+
if (!schema) {
|
|
17
|
+
return new NoopValidator();
|
|
18
|
+
}
|
|
19
|
+
return this.validator.compile(schema);
|
|
20
|
+
}
|
|
21
|
+
registerSchema(name, schema) {
|
|
22
|
+
this.validator.addSchema(name, schema);
|
|
23
|
+
}
|
|
24
|
+
lookupSchema(name) {
|
|
25
|
+
return this.validator.getSchema(name);
|
|
26
|
+
}
|
|
27
|
+
validateSchema(value, schema) {
|
|
28
|
+
const ajv = new Ajv();
|
|
29
|
+
const validate = ajv.compile("type" in schema && typeof schema.type === "string"
|
|
30
|
+
? schema
|
|
31
|
+
: {
|
|
32
|
+
type: "object",
|
|
33
|
+
properties: schema,
|
|
34
|
+
required: Object.keys(schema),
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
});
|
|
37
|
+
const isValid = validate(value);
|
|
38
|
+
if (!isValid) {
|
|
39
|
+
throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Invalid value passed: ${JSON.stringify(value)}. Error: ${formatAjvErrors(validate.errors)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
invoke(kind, name, ...args) {
|
|
43
|
+
const parts = kind.split(".");
|
|
44
|
+
if (parts.length > 2) {
|
|
45
|
+
return this.kernel.invoke(parts[0], parts.slice(1).join("."), name, ...args);
|
|
46
|
+
}
|
|
47
|
+
return this.kernel.invoke(this.metadata.module, kind, name, ...args);
|
|
48
|
+
}
|
|
49
|
+
registerManifest(resource) {
|
|
50
|
+
if (this.resourceKey) {
|
|
51
|
+
this.kernel.registerChildManifest(this.resourceKey, resource);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this.kernel.registerManifest(resource);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolves a resource into a normalized {kind, name} reference.
|
|
59
|
+
* If the resource contains a definition (kind + properties), registers it as a manifest.
|
|
60
|
+
* Returns the normalized reference in all cases.
|
|
61
|
+
*
|
|
62
|
+
* @param resource Resource definition or reference object with 'kind' property
|
|
63
|
+
* @param resourceName Optional name to assign if not present in resource
|
|
64
|
+
* @returns Normalized {kind, name} reference
|
|
65
|
+
* @throws RuntimeError if 'kind' is missing
|
|
66
|
+
*/
|
|
67
|
+
resolveChildren(resource, resourceName) {
|
|
68
|
+
if (!resource || typeof resource !== "object") {
|
|
69
|
+
throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Resource must be an object. Got: ${typeof resource}`);
|
|
70
|
+
}
|
|
71
|
+
if (!resource.kind) {
|
|
72
|
+
throw new RuntimeError("ERR_INVALID_VALUE", `[${this.metadata.name}] Resource must have 'kind' property. Got: ${JSON.stringify(resource)}`);
|
|
73
|
+
}
|
|
74
|
+
const kind = resource.kind;
|
|
75
|
+
const name = resource.name ?? resourceName ?? "Unnamed";
|
|
76
|
+
// If resource has properties beyond kind/name, it's a definition - register it
|
|
77
|
+
const definitionKeys = Object.keys(resource).filter((k) => k !== "kind" && k !== "name" && k !== "metadata");
|
|
78
|
+
if (definitionKeys.length > 0) {
|
|
79
|
+
this.registerManifest({
|
|
80
|
+
...resource,
|
|
81
|
+
metadata: {
|
|
82
|
+
name,
|
|
83
|
+
module: this.metadata.module,
|
|
84
|
+
...resource.metadata,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return { kind, name };
|
|
89
|
+
}
|
|
90
|
+
teardownResource(kind, name) {
|
|
91
|
+
const parts = kind.split(".");
|
|
92
|
+
if (parts.length > 2) {
|
|
93
|
+
return this.kernel.teardownResource(parts[0], parts.slice(1).join("."), name);
|
|
94
|
+
}
|
|
95
|
+
return this.kernel.teardownResource(this.metadata.module, kind, name);
|
|
96
|
+
}
|
|
97
|
+
getResources(kind) {
|
|
98
|
+
return this.kernel.getResourcesByKind(kind);
|
|
99
|
+
}
|
|
100
|
+
getResourcesByName(kind, name) {
|
|
101
|
+
return this.kernel.getResourceByName(this.metadata.module, kind, name);
|
|
102
|
+
}
|
|
103
|
+
async registerController(moduleName, kindName, controllerInstance) {
|
|
104
|
+
await this.kernel.registerController(moduleName, kindName, controllerInstance);
|
|
105
|
+
}
|
|
106
|
+
registerDefinition(def) {
|
|
107
|
+
this.kernel.registerResourceDefinition(def);
|
|
108
|
+
}
|
|
109
|
+
registerCapability(name, schema) {
|
|
110
|
+
this.kernel.registerCapability(name, schema);
|
|
111
|
+
}
|
|
112
|
+
isCapabilityRegistered(name) {
|
|
113
|
+
return this.kernel.isCapabilityRegistered(name);
|
|
114
|
+
}
|
|
115
|
+
getCapabilitySchema(name) {
|
|
116
|
+
return this.kernel.getCapabilitySchema(name);
|
|
117
|
+
}
|
|
118
|
+
on(event, handler) {
|
|
119
|
+
this.kernel.on(event, handler);
|
|
120
|
+
}
|
|
121
|
+
once(event, handler) {
|
|
122
|
+
throw new Error("Method once not implemented.");
|
|
123
|
+
}
|
|
124
|
+
off(event, handler) {
|
|
125
|
+
throw new Error("Method off not implemented.");
|
|
126
|
+
}
|
|
127
|
+
async emit(event, payload) {
|
|
128
|
+
await this.kernel.emitRuntimeEvent(event, payload);
|
|
129
|
+
}
|
|
130
|
+
acquireHold(reason) {
|
|
131
|
+
return this.kernel.acquireHold(reason);
|
|
132
|
+
}
|
|
133
|
+
requestExit(code) {
|
|
134
|
+
this.kernel.requestExit(code);
|
|
135
|
+
}
|
|
136
|
+
evaluateCel(expression, context) {
|
|
137
|
+
throw new Error("Method evaluateCel not implemented.");
|
|
138
|
+
}
|
|
139
|
+
expandValue(value, context) {
|
|
140
|
+
return expandValue(value, context);
|
|
141
|
+
}
|
|
142
|
+
async emitEvent(event, payload) {
|
|
143
|
+
await this.kernel.emitRuntimeEvent(event, payload);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=resource-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-context.js","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoC,MAAM,cAAc,CAAC;AAC/E,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC;AAE3C,MAAM,OAAO,mBAAmB;IAC9B,YACW,MAAc,EACN,QAA6B,EAC7B,YAA6B,IAAI,eAAe,EAAE,EAClD,WAAoB;QAH5B,WAAM,GAAN,MAAM,CAAQ;QACN,aAAQ,GAAR,QAAQ,CAAqB;QAC7B,cAAS,GAAT,SAAS,CAAyC;QAClD,gBAAW,GAAX,WAAW,CAAS;IACpC,CAAC;IAEJ,qBAAqB,CAAC,MAAW;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,MAAc;QACzC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,cAAc,CAAC,KAAU,EAAE,MAAW;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAC1B,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YACjD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7B,oBAAoB,EAAE,KAAK;aAC5B,CACN,CAAC;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,YAAY,CACpB,mBAAmB,EACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CACrH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY,EAAE,GAAG,IAAW;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,gBAAgB,CAAC,QAAa;QAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,eAAe,CAAC,QAAa,EAAE,YAAqB;QAClD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,YAAY,CACpB,mBAAmB,EACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,sCAAsC,OAAO,QAAQ,EAAE,CAC9E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,YAAY,CACpB,mBAAmB,EACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,8CAA8C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,YAAY,IAAI,SAAS,CAAC;QAExD,+EAA+E;QAC/E,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,CACxD,CAAC;QAEF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC;gBACpB,GAAG,QAAQ;gBACX,QAAQ,EAAE;oBACR,IAAI;oBACJ,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;oBAC5B,GAAG,QAAQ,CAAC,QAAQ;iBACrB;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,gBAAgB,CAAC,IAAY,EAAE,IAAY;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,IAAY;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,UAAkB,EAClB,QAAgB,EAChB,kBAAuB;QAEvB,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACjF,CAAC;IAED,kBAAkB,CAAC,GAAQ;QACzB,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,MAA4B;QAC3D,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,sBAAsB,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,mBAAmB,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,KAAa,EAAE,OAAgD;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,OAAgD;QAClE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,OAAgD;QACjE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,OAAa;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,WAAW,CAAC,MAAe;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,UAAkB,EAAE,OAA4B;QAC1D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,WAAW,CAAC,KAAU,EAAE,OAA4B;QAClD,OAAO,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,OAAa;QAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;CACF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResourceURI: Parses and builds standard URIs for resources
|
|
3
|
+
*
|
|
4
|
+
* Format: scheme://host/path#kind.name[/kind.child/kind.child/...]
|
|
5
|
+
* Examples:
|
|
6
|
+
* file:///path/to/file.yaml#Http.Server.Example
|
|
7
|
+
* http://localhost/template/ApiServer#Http.Server/api-us-east
|
|
8
|
+
* https://example.com/resources.yaml#Data.Type.User
|
|
9
|
+
*/
|
|
10
|
+
export declare class ResourceURI {
|
|
11
|
+
readonly scheme: string;
|
|
12
|
+
readonly host: string;
|
|
13
|
+
readonly path: string;
|
|
14
|
+
readonly fragment: string;
|
|
15
|
+
private constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Parse a URI string into components
|
|
18
|
+
* Format: scheme://host/path#fragment
|
|
19
|
+
*/
|
|
20
|
+
static parse(uri: string): ResourceURI;
|
|
21
|
+
/**
|
|
22
|
+
* Build a file:// URI from an absolute file path and kind.name
|
|
23
|
+
*/
|
|
24
|
+
static fromFile(absolutePath: string, kind: string, name: string): ResourceURI;
|
|
25
|
+
/**
|
|
26
|
+
* Build a template URI from template definition name and kind.name
|
|
27
|
+
* Used for resources generated by template expansion
|
|
28
|
+
*/
|
|
29
|
+
static fromTemplate(templateDefinitionName: string, kind: string, resourceId: string): ResourceURI;
|
|
30
|
+
/**
|
|
31
|
+
* Create a child URI by appending kind.name to the fragment path
|
|
32
|
+
* Used when a template generates child resources
|
|
33
|
+
*/
|
|
34
|
+
withChild(kind: string, name: string): ResourceURI;
|
|
35
|
+
/**
|
|
36
|
+
* Get the full URI as a string
|
|
37
|
+
*/
|
|
38
|
+
toString(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get just the resource identifier part (kind.name)
|
|
41
|
+
*/
|
|
42
|
+
getResourceId(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Get the kind and name from the last fragment component
|
|
45
|
+
*/
|
|
46
|
+
getResourceKindName(): {
|
|
47
|
+
kind: string;
|
|
48
|
+
name: string;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Get the full fragment path as array of kind.name pairs
|
|
52
|
+
*/
|
|
53
|
+
getFragmentPath(): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Check if this URI is from a file source
|
|
56
|
+
*/
|
|
57
|
+
isFileSource(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Check if this URI is from a template source
|
|
60
|
+
*/
|
|
61
|
+
isTemplateSource(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Check if this URI represents a generated/nested resource (has multiple fragment components)
|
|
64
|
+
*/
|
|
65
|
+
isNested(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Get the depth of nesting (number of / in fragment)
|
|
68
|
+
*/
|
|
69
|
+
getDepth(): number;
|
|
70
|
+
/**
|
|
71
|
+
* Get the parent URI by removing the last fragment component
|
|
72
|
+
* Returns undefined if already at root level
|
|
73
|
+
*/
|
|
74
|
+
getParent(): ResourceURI | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Get template name if this is a template-generated resource
|
|
77
|
+
*/
|
|
78
|
+
getTemplateName(): string | undefined;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=resource-uri.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-uri.d.ts","sourceRoot":"","sources":["../src/resource-uri.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,OAAO;IAYP;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IA4CtC;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,WAAW;IAMd;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,sBAAsB,EAAE,MAAM,EAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,WAAW;IAMd;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW;IAKlD;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,aAAa,IAAI,MAAM;IAKvB;;OAEG;IACH,mBAAmB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAYrD;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;;OAGG;IACH,SAAS,IAAI,WAAW,GAAG,SAAS;IASpC;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,SAAS;CAOtC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResourceURI: Parses and builds standard URIs for resources
|
|
3
|
+
*
|
|
4
|
+
* Format: scheme://host/path#kind.name[/kind.child/kind.child/...]
|
|
5
|
+
* Examples:
|
|
6
|
+
* file:///path/to/file.yaml#Http.Server.Example
|
|
7
|
+
* http://localhost/template/ApiServer#Http.Server/api-us-east
|
|
8
|
+
* https://example.com/resources.yaml#Data.Type.User
|
|
9
|
+
*/
|
|
10
|
+
export class ResourceURI {
|
|
11
|
+
constructor(scheme, host, path, fragment) {
|
|
12
|
+
this.scheme = scheme;
|
|
13
|
+
this.host = host;
|
|
14
|
+
this.path = path;
|
|
15
|
+
this.fragment = fragment;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse a URI string into components
|
|
19
|
+
* Format: scheme://host/path#fragment
|
|
20
|
+
*/
|
|
21
|
+
static parse(uri) {
|
|
22
|
+
const schemeMatch = uri.match(/^([a-z][a-z0-9+.-]*):\/\//);
|
|
23
|
+
if (!schemeMatch) {
|
|
24
|
+
throw new Error(`Invalid URI format: ${uri}. Expected "scheme://host/path#fragment"`);
|
|
25
|
+
}
|
|
26
|
+
const scheme = schemeMatch[1];
|
|
27
|
+
const rest = uri.slice(schemeMatch[0].length);
|
|
28
|
+
// Split host/path from fragment
|
|
29
|
+
const hashIndex = rest.indexOf('#');
|
|
30
|
+
if (hashIndex === -1) {
|
|
31
|
+
throw new Error(`Invalid URI format: ${uri}. Missing fragment after "#"`);
|
|
32
|
+
}
|
|
33
|
+
const hostPath = rest.slice(0, hashIndex);
|
|
34
|
+
const fragment = rest.slice(hashIndex + 1);
|
|
35
|
+
if (!fragment) {
|
|
36
|
+
throw new Error(`Invalid URI format: ${uri}. Fragment cannot be empty`);
|
|
37
|
+
}
|
|
38
|
+
// Split host from path
|
|
39
|
+
const pathIndex = hostPath.indexOf('/');
|
|
40
|
+
let host;
|
|
41
|
+
let path;
|
|
42
|
+
if (pathIndex === -1) {
|
|
43
|
+
host = hostPath;
|
|
44
|
+
path = '';
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
host = hostPath.slice(0, pathIndex);
|
|
48
|
+
path = hostPath.slice(pathIndex);
|
|
49
|
+
}
|
|
50
|
+
if (!host) {
|
|
51
|
+
throw new Error(`Invalid URI format: ${uri}. Host cannot be empty`);
|
|
52
|
+
}
|
|
53
|
+
return new ResourceURI(scheme, host, path, fragment);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build a file:// URI from an absolute file path and kind.name
|
|
57
|
+
*/
|
|
58
|
+
static fromFile(absolutePath, kind, name) {
|
|
59
|
+
const normalizedPath = absolutePath.replace(/\\/g, '/');
|
|
60
|
+
const fragment = `${kind}.${name}`;
|
|
61
|
+
return new ResourceURI('file', 'localhost', normalizedPath, fragment);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build a template URI from template definition name and kind.name
|
|
65
|
+
* Used for resources generated by template expansion
|
|
66
|
+
*/
|
|
67
|
+
static fromTemplate(templateDefinitionName, kind, resourceId) {
|
|
68
|
+
const path = `/template/${templateDefinitionName}`;
|
|
69
|
+
const fragment = `${kind}.${resourceId}`;
|
|
70
|
+
return new ResourceURI('http', 'localhost', path, fragment);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a child URI by appending kind.name to the fragment path
|
|
74
|
+
* Used when a template generates child resources
|
|
75
|
+
*/
|
|
76
|
+
withChild(kind, name) {
|
|
77
|
+
const newFragment = `${this.fragment}/${kind}.${name}`;
|
|
78
|
+
return new ResourceURI(this.scheme, this.host, this.path, newFragment);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the full URI as a string
|
|
82
|
+
*/
|
|
83
|
+
toString() {
|
|
84
|
+
return `${this.scheme}://${this.host}${this.path}#${this.fragment}`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get just the resource identifier part (kind.name)
|
|
88
|
+
*/
|
|
89
|
+
getResourceId() {
|
|
90
|
+
const parts = this.fragment.split('/');
|
|
91
|
+
return parts[parts.length - 1];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the kind and name from the last fragment component
|
|
95
|
+
*/
|
|
96
|
+
getResourceKindName() {
|
|
97
|
+
const resourceId = this.getResourceId();
|
|
98
|
+
const lastDot = resourceId.lastIndexOf('.');
|
|
99
|
+
if (lastDot === -1) {
|
|
100
|
+
throw new Error(`Invalid resource identifier in URI: ${this.toString()}`);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
kind: resourceId.slice(0, lastDot),
|
|
104
|
+
name: resourceId.slice(lastDot + 1),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get the full fragment path as array of kind.name pairs
|
|
109
|
+
*/
|
|
110
|
+
getFragmentPath() {
|
|
111
|
+
return this.fragment.split('/');
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check if this URI is from a file source
|
|
115
|
+
*/
|
|
116
|
+
isFileSource() {
|
|
117
|
+
return this.scheme === 'file';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check if this URI is from a template source
|
|
121
|
+
*/
|
|
122
|
+
isTemplateSource() {
|
|
123
|
+
return this.scheme === 'http' && this.path.startsWith('/template/');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check if this URI represents a generated/nested resource (has multiple fragment components)
|
|
127
|
+
*/
|
|
128
|
+
isNested() {
|
|
129
|
+
return this.fragment.includes('/');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the depth of nesting (number of / in fragment)
|
|
133
|
+
*/
|
|
134
|
+
getDepth() {
|
|
135
|
+
return this.fragment.split('/').length - 1;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the parent URI by removing the last fragment component
|
|
139
|
+
* Returns undefined if already at root level
|
|
140
|
+
*/
|
|
141
|
+
getParent() {
|
|
142
|
+
const parts = this.fragment.split('/');
|
|
143
|
+
if (parts.length === 1) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
const parentFragment = parts.slice(0, -1).join('/');
|
|
147
|
+
return new ResourceURI(this.scheme, this.host, this.path, parentFragment);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get template name if this is a template-generated resource
|
|
151
|
+
*/
|
|
152
|
+
getTemplateName() {
|
|
153
|
+
if (!this.isTemplateSource()) {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
const match = this.path.match(/^\/template\/(.+)$/);
|
|
157
|
+
return match ? match[1] : undefined;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=resource-uri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-uri.js","sourceRoot":"","sources":["../src/resource-uri.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DataValidator } from "@telorun/sdk";
|
|
2
|
+
export declare class SchemaValidator {
|
|
3
|
+
private ajv;
|
|
4
|
+
constructor();
|
|
5
|
+
addSchema(name: string, schema: object): void;
|
|
6
|
+
getSchema(name: string): object | undefined;
|
|
7
|
+
compile(schema: any): DataValidator;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=schema-valiator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-valiator.d.ts","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM7C,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAA2B;;IAUtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa;CA2BpC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import AjvModule from "ajv";
|
|
2
|
+
import { formatAjvErrors } from "./manifest-schemas.js";
|
|
3
|
+
import { RuntimeError } from "./types.js";
|
|
4
|
+
const Ajv = AjvModule.default ?? AjvModule;
|
|
5
|
+
export class SchemaValidator {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.ajv = new Ajv({
|
|
8
|
+
strict: false,
|
|
9
|
+
removeAdditional: false,
|
|
10
|
+
useDefaults: true,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
addSchema(name, schema) {
|
|
14
|
+
if (!this.ajv.getSchema(name)) {
|
|
15
|
+
this.ajv.addSchema(schema, name);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
getSchema(name) {
|
|
19
|
+
return this.ajv.getSchema(name);
|
|
20
|
+
}
|
|
21
|
+
compile(schema) {
|
|
22
|
+
const validate = this.ajv.compile("type" in schema && typeof schema.type === "string"
|
|
23
|
+
? schema
|
|
24
|
+
: {
|
|
25
|
+
type: "object",
|
|
26
|
+
properties: schema,
|
|
27
|
+
required: Object.keys(schema),
|
|
28
|
+
additionalProperties: false,
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
validate: (data) => {
|
|
32
|
+
const isValid = validate(data);
|
|
33
|
+
if (!isValid) {
|
|
34
|
+
throw new RuntimeError("ERR_RESOURCE_NOT_FOUND", `Invalid value passed: ${JSON.stringify(data)}. Error: ${formatAjvErrors(validate.errors)}`);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
isValid: (data) => {
|
|
38
|
+
return validate(data);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=schema-valiator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-valiator.js","sourceRoot":"","sources":["../src/schema-valiator.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC;AAE3C,MAAM,OAAO,eAAe;IAG1B;QACE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;YACjB,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,MAAc;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAuB,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,MAAW;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAC/B,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YACjD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7B,oBAAoB,EAAE,KAAK;aAC5B,CACN,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,CAAC,IAAS,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,YAAY,CACpB,wBAAwB,EACxB,yBAAyB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAC5F,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC,IAAS,EAAE,EAAE;gBACrB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|