@kaskad/core 0.0.7 → 0.0.9
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.
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { readFileSync, promises } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { DefinitionStore, registerPlugins, sys, common, browser, forms, initRuntime, templateRegistry, loadTemplates, unfoldNodeSchema, createRootNode, activateNode, ComponentTreeApi, activateStructure } from '@kaskad/core';
|
|
4
|
+
import { vi } from 'vitest';
|
|
5
|
+
import { parse } from 'yaml';
|
|
6
|
+
|
|
7
|
+
/// <reference types="node" />
|
|
8
|
+
let currentComponentId;
|
|
9
|
+
async function createView(rawSchema) {
|
|
10
|
+
vi.useFakeTimers();
|
|
11
|
+
const defStore = DefinitionStore.getInstance();
|
|
12
|
+
// Register common definitions if not already registered (for YAML schema tests)
|
|
13
|
+
// Core tests register these in beforeEach
|
|
14
|
+
if (Object.keys(defStore.components).length === 0) {
|
|
15
|
+
registerPlugins(sys, common, browser, forms);
|
|
16
|
+
initRuntime();
|
|
17
|
+
}
|
|
18
|
+
const url = 'my-schema';
|
|
19
|
+
const componentTypes = new Set();
|
|
20
|
+
const dependencies = new Set();
|
|
21
|
+
templateRegistry.set(url, rawSchema, componentTypes, dependencies);
|
|
22
|
+
await loadTemplates(rawSchema);
|
|
23
|
+
const schema = unfoldNodeSchema(rawSchema, { type: 'component' });
|
|
24
|
+
const root = createRootNode(url, schema, null, null, url);
|
|
25
|
+
activateNode(root);
|
|
26
|
+
await vi.runAllTimersAsync();
|
|
27
|
+
currentComponentId = root.extractedValue;
|
|
28
|
+
}
|
|
29
|
+
function loadYamlSchema(absolutePath) {
|
|
30
|
+
try {
|
|
31
|
+
const content = readFileSync(absolutePath, 'utf-8');
|
|
32
|
+
return parse(content);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error.code === 'ENOENT') {
|
|
36
|
+
throw new Error(`YAML schema not found: ${absolutePath}`);
|
|
37
|
+
}
|
|
38
|
+
throw new Error(`Failed to load YAML schema ${absolutePath}: ${error}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function loadYamlSchemaFrom(baseDir, relativePath) {
|
|
42
|
+
const fullPath = join(baseDir, relativePath);
|
|
43
|
+
return loadYamlSchema(fullPath);
|
|
44
|
+
}
|
|
45
|
+
async function createViewFromFile(baseDir, relativePath) {
|
|
46
|
+
const schema = loadYamlSchemaFrom(baseDir, relativePath);
|
|
47
|
+
await createView(schema);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Sets up a fetch mock that resolves `/recipes/{path}.yml` URLs to actual files.
|
|
51
|
+
* Use this when testing recipes that use `templateUrl` to load external templates.
|
|
52
|
+
*
|
|
53
|
+
* @param recipesBaseDir - The base directory where recipe files are located
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* // In your test file
|
|
58
|
+
* import { setupRecipeFetch } from '@kaskad/core/testing';
|
|
59
|
+
* import * as path from 'node:path';
|
|
60
|
+
*
|
|
61
|
+
* setupRecipeFetch(path.resolve(__dirname, '../..'));
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
function setupRecipeFetch(recipesBaseDir) {
|
|
65
|
+
vi.stubGlobal('fetch', vi.fn(async (url) => {
|
|
66
|
+
// Handle /recipes/{path}.yml URLs
|
|
67
|
+
if (url.startsWith('/recipes/')) {
|
|
68
|
+
const recipePath = url.replace('/recipes/', '');
|
|
69
|
+
const filePath = join(recipesBaseDir, recipePath);
|
|
70
|
+
try {
|
|
71
|
+
const raw = await promises.readFile(filePath);
|
|
72
|
+
return new Response(raw, {
|
|
73
|
+
status: 200,
|
|
74
|
+
headers: { 'Content-Type': 'text/yaml' },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {
|
|
79
|
+
return new Response(`File not found: ${url}`, {
|
|
80
|
+
status: 404,
|
|
81
|
+
statusText: 'Not Found',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return new Response('Not found', { status: 404 });
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
function setCurrent(selector) {
|
|
91
|
+
const component = ComponentTreeApi.findComponent(currentComponentId, selector);
|
|
92
|
+
if (!component) {
|
|
93
|
+
throw new Error(`Component not found: ${selector}`);
|
|
94
|
+
}
|
|
95
|
+
currentComponentId = component.id;
|
|
96
|
+
}
|
|
97
|
+
function get(selector) {
|
|
98
|
+
const node = ComponentTreeApi.findNode(currentComponentId, selector);
|
|
99
|
+
return (node?.extractedValue ?? null);
|
|
100
|
+
}
|
|
101
|
+
function set(selector, value) {
|
|
102
|
+
ComponentTreeApi.setNodeRawSchema(currentComponentId, selector, value);
|
|
103
|
+
const node = ComponentTreeApi.findNode(currentComponentId, selector);
|
|
104
|
+
if (node) {
|
|
105
|
+
activateStructure(node);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function run(selector, ...args) {
|
|
109
|
+
const commandPromise = ComponentTreeApi.runCommandNode(currentComponentId, selector, ...args);
|
|
110
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
111
|
+
commandPromise.catch(() => { });
|
|
112
|
+
await vi.runAllTimersAsync();
|
|
113
|
+
return commandPromise;
|
|
114
|
+
}
|
|
115
|
+
function select(selector) {
|
|
116
|
+
const component = ComponentTreeApi.findComponent(currentComponentId, selector);
|
|
117
|
+
if (!component) {
|
|
118
|
+
throw new Error(`Component not found: ${selector}`);
|
|
119
|
+
}
|
|
120
|
+
return component;
|
|
121
|
+
}
|
|
122
|
+
function selectAll(selector) {
|
|
123
|
+
const components = selector.split(',').flatMap((s) => ComponentTreeApi.findComponents(currentComponentId, s.trim()));
|
|
124
|
+
if (!components.length) {
|
|
125
|
+
throw new Error(`Components not found: ${selector}`);
|
|
126
|
+
}
|
|
127
|
+
return components;
|
|
128
|
+
}
|
|
129
|
+
function evaluating(selector) {
|
|
130
|
+
const node = ComponentTreeApi.findNode(currentComponentId, selector);
|
|
131
|
+
return node?.evaluating ?? false;
|
|
132
|
+
}
|
|
133
|
+
function settled(selector) {
|
|
134
|
+
const node = ComponentTreeApi.findNode(currentComponentId, selector);
|
|
135
|
+
return node?.settled ?? false;
|
|
136
|
+
}
|
|
137
|
+
function ready(selector) {
|
|
138
|
+
const node = ComponentTreeApi.findNode(currentComponentId, selector);
|
|
139
|
+
if (!node)
|
|
140
|
+
return false;
|
|
141
|
+
return node.settled && !node.evaluating && !node.failed;
|
|
142
|
+
}
|
|
143
|
+
function error(selector) {
|
|
144
|
+
const node = ComponentTreeApi.findNode(currentComponentId, selector);
|
|
145
|
+
return node?.error ?? null;
|
|
146
|
+
}
|
|
147
|
+
function running(selector) {
|
|
148
|
+
return ComponentTreeApi.isCommandRunning(currentComponentId, selector);
|
|
149
|
+
}
|
|
150
|
+
function getComponentType(selector) {
|
|
151
|
+
const component = ComponentTreeApi.findComponent(currentComponentId, selector);
|
|
152
|
+
if (!component) {
|
|
153
|
+
throw new Error(`Component not found: ${selector}`);
|
|
154
|
+
}
|
|
155
|
+
return component.componentType;
|
|
156
|
+
}
|
|
157
|
+
function getId(selector) {
|
|
158
|
+
const component = ComponentTreeApi.findComponent(currentComponentId, selector);
|
|
159
|
+
if (!component) {
|
|
160
|
+
throw new Error(`Component not found: ${selector}`);
|
|
161
|
+
}
|
|
162
|
+
return component.id;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Generated bundle index. Do not edit.
|
|
167
|
+
*/
|
|
168
|
+
|
|
169
|
+
export { createView, createViewFromFile, error, evaluating, get, getComponentType, getId, loadYamlSchema, loadYamlSchemaFrom, ready, run, running, select, selectAll, set, setCurrent, settled, setupRecipeFetch };
|
|
170
|
+
//# sourceMappingURL=kaskad-core-testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kaskad-core-testing.mjs","sources":["../../../../libs/core/testing/src/index.ts","../../../../libs/core/testing/src/kaskad-core-testing.ts"],"sourcesContent":["/// <reference types=\"node\" />\nimport { promises as fs, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n activateNode,\n activateStructure,\n browser,\n common,\n ComponentId,\n ComponentRecipe,\n ComponentTreeApi,\n createRootNode,\n DefinitionStore,\n forms,\n initRuntime,\n loadTemplates,\n registerPlugins,\n sys,\n TComponent,\n templateRegistry,\n unfoldNodeSchema,\n} from '@kaskad/core';\nimport { vi } from 'vitest';\nimport { parse } from 'yaml';\n\nlet currentComponentId: ComponentId;\n\nexport async function createView(rawSchema: ComponentRecipe): Promise<void> {\n vi.useFakeTimers();\n\n const defStore = DefinitionStore.getInstance();\n\n // Register common definitions if not already registered (for YAML schema tests)\n // Core tests register these in beforeEach\n if (Object.keys(defStore.components).length === 0) {\n registerPlugins(sys, common, browser, forms);\n initRuntime();\n }\n\n const url = 'my-schema';\n const componentTypes = new Set<string>();\n const dependencies = new Set<string>();\n templateRegistry.set(url, rawSchema, componentTypes, dependencies);\n\n await loadTemplates(rawSchema);\n\n const schema = unfoldNodeSchema(rawSchema, { type: 'component' });\n const root = createRootNode(url, schema, null, null, url);\n\n activateNode(root);\n await vi.runAllTimersAsync();\n\n currentComponentId = root.extractedValue as ComponentId;\n}\n\nexport function loadYamlSchema(absolutePath: string): ComponentRecipe {\n try {\n const content = readFileSync(absolutePath, 'utf-8');\n return parse(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`YAML schema not found: ${absolutePath}`);\n }\n throw new Error(`Failed to load YAML schema ${absolutePath}: ${error}`);\n }\n}\n\nexport function loadYamlSchemaFrom(baseDir: string, relativePath: string): ComponentRecipe {\n const fullPath = join(baseDir, relativePath);\n return loadYamlSchema(fullPath);\n}\n\nexport async function createViewFromFile(baseDir: string, relativePath: string): Promise<void> {\n const schema = loadYamlSchemaFrom(baseDir, relativePath);\n await createView(schema);\n}\n\n/**\n * Sets up a fetch mock that resolves `/recipes/{path}.yml` URLs to actual files.\n * Use this when testing recipes that use `templateUrl` to load external templates.\n *\n * @param recipesBaseDir - The base directory where recipe files are located\n *\n * @example\n * ```typescript\n * // In your test file\n * import { setupRecipeFetch } from '@kaskad/core/testing';\n * import * as path from 'node:path';\n *\n * setupRecipeFetch(path.resolve(__dirname, '../..'));\n * ```\n */\nexport function setupRecipeFetch(recipesBaseDir: string): void {\n vi.stubGlobal(\n 'fetch',\n vi.fn(async (url: string) => {\n // Handle /recipes/{path}.yml URLs\n if (url.startsWith('/recipes/')) {\n const recipePath = url.replace('/recipes/', '');\n const filePath = join(recipesBaseDir, recipePath);\n\n try {\n const raw = await fs.readFile(filePath);\n return new Response(raw, {\n status: 200,\n headers: { 'Content-Type': 'text/yaml' },\n });\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {\n return new Response(`File not found: ${url}`, {\n status: 404,\n statusText: 'Not Found',\n });\n }\n throw err;\n }\n }\n\n return new Response('Not found', { status: 404 });\n }),\n );\n}\n\nexport function setCurrent(selector: string): void {\n const component = ComponentTreeApi.findComponent(currentComponentId, selector);\n if (!component) {\n throw new Error(`Component not found: ${selector}`);\n }\n currentComponentId = component.id;\n}\n\nexport function get<T = unknown>(selector: string): T {\n const node = ComponentTreeApi.findNode(currentComponentId, selector);\n return (node?.extractedValue ?? null) as T;\n}\n\nexport function set<T = unknown>(selector: string, value: T): void {\n ComponentTreeApi.setNodeRawSchema(currentComponentId, selector, value);\n const node = ComponentTreeApi.findNode(currentComponentId, selector);\n if (node) {\n activateStructure(node);\n }\n}\n\nexport async function run(selector: string, ...args: unknown[]): Promise<unknown> {\n const commandPromise = ComponentTreeApi.runCommandNode(currentComponentId, selector, ...args) as Promise<unknown>;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n commandPromise.catch(() => {});\n await vi.runAllTimersAsync();\n return commandPromise;\n}\n\nexport function select(selector: string): TComponent {\n const component = ComponentTreeApi.findComponent(currentComponentId, selector);\n if (!component) {\n throw new Error(`Component not found: ${selector}`);\n }\n return component;\n}\n\nexport function selectAll(selector: string): TComponent[] {\n const components = selector.split(',').flatMap((s) => ComponentTreeApi.findComponents(currentComponentId, s.trim()));\n if (!components.length) {\n throw new Error(`Components not found: ${selector}`);\n }\n return components;\n}\n\nexport function evaluating(selector: string): boolean {\n const node = ComponentTreeApi.findNode(currentComponentId, selector);\n return node?.evaluating ?? false;\n}\n\nexport function settled(selector: string): boolean {\n const node = ComponentTreeApi.findNode(currentComponentId, selector);\n return node?.settled ?? false;\n}\n\nexport function ready(selector: string): boolean {\n const node = ComponentTreeApi.findNode(currentComponentId, selector);\n if (!node) return false;\n return node.settled && !node.evaluating && !node.failed;\n}\n\nexport function error(selector: string): unknown {\n const node = ComponentTreeApi.findNode(currentComponentId, selector);\n return node?.error ?? null;\n}\n\nexport function running(selector: string): boolean {\n return ComponentTreeApi.isCommandRunning(currentComponentId, selector);\n}\n\nexport function getComponentType(selector: string): string {\n const component = ComponentTreeApi.findComponent(currentComponentId, selector);\n if (!component) {\n throw new Error(`Component not found: ${selector}`);\n }\n return component.componentType;\n}\n\nexport function getId(selector: string): ComponentId {\n const component = ComponentTreeApi.findComponent(currentComponentId, selector);\n if (!component) {\n throw new Error(`Component not found: ${selector}`);\n }\n return component.id;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["fs"],"mappings":"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"}
|