@duckcodeailabs/dql-core 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/semantic/index.d.ts +1 -0
- package/dist/semantic/index.d.ts.map +1 -1
- package/dist/semantic/index.js +1 -0
- package/dist/semantic/index.js.map +1 -1
- package/dist/semantic/yaml-loader.d.ts +26 -0
- package/dist/semantic/yaml-loader.d.ts.map +1 -0
- package/dist/semantic/yaml-loader.js +80 -0
- package/dist/semantic/yaml-loader.js.map +1 -0
- package/package.json +7 -3
package/dist/semantic/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { SemanticAnalyzer, analyze } from './analyzer.js';
|
|
2
2
|
export { SemanticLayer, parseMetricDefinition, parseDimensionDefinition, parseHierarchyDefinition, parseBlockCompanionDefinition, parseCubeDefinition, } from './semantic-layer.js';
|
|
3
3
|
export type { MetricDefinition, DimensionDefinition, HierarchyDefinition, BlockCompanionDefinition, HierarchyLevelDefinition, HierarchyDrillPathDefinition, HierarchyRollupType, SemanticLayerConfig, JoinDefinition, TimeDimensionDefinition, CubeDefinition, ComposeQueryOptions, ComposeQueryResult, } from './semantic-layer.js';
|
|
4
|
+
export { loadSemanticLayerFromDir, loadSemanticLayerFromConfig, } from './yaml-loader.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC"}
|
package/dist/semantic/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { SemanticAnalyzer, analyze } from './analyzer.js';
|
|
2
2
|
export { SemanticLayer, parseMetricDefinition, parseDimensionDefinition, parseHierarchyDefinition, parseBlockCompanionDefinition, parseCubeDefinition, } from './semantic-layer.js';
|
|
3
|
+
export { loadSemanticLayerFromDir, loadSemanticLayerFromConfig, } from './yaml-loader.js';
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAgB7B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML-based semantic layer loader.
|
|
3
|
+
* Reads metric, dimension, hierarchy, cube, and block-companion YAML files
|
|
4
|
+
* from a project's semantic-layer/ directory and returns a populated SemanticLayer.
|
|
5
|
+
*/
|
|
6
|
+
import { SemanticLayer } from './semantic-layer.js';
|
|
7
|
+
/**
|
|
8
|
+
* Load a SemanticLayer from a directory on disk.
|
|
9
|
+
* Expected structure:
|
|
10
|
+
* semanticLayerDir/
|
|
11
|
+
* metrics/ → *.yaml metric definitions
|
|
12
|
+
* dimensions/ → *.yaml dimension definitions
|
|
13
|
+
* hierarchies/ → *.yaml hierarchy definitions
|
|
14
|
+
* cubes/ → *.yaml cube definitions
|
|
15
|
+
* blocks/ → *.yaml block companion definitions (metadata only, not loaded into layer)
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadSemanticLayerFromDir(semanticLayerDir: string): SemanticLayer;
|
|
18
|
+
/**
|
|
19
|
+
* Load a SemanticLayer from pre-read file contents (no filesystem access needed).
|
|
20
|
+
* Useful for browser contexts or when files are already loaded.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadSemanticLayerFromConfig(files: Array<{
|
|
23
|
+
path: string;
|
|
24
|
+
content: string;
|
|
25
|
+
}>): SemanticLayer;
|
|
26
|
+
//# sourceMappingURL=yaml-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-loader.d.ts","sourceRoot":"","sources":["../../src/semantic/yaml-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EACL,aAAa,EAKd,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,aAAa,CA4BhF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,aAAa,CAwBf"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML-based semantic layer loader.
|
|
3
|
+
* Reads metric, dimension, hierarchy, cube, and block-companion YAML files
|
|
4
|
+
* from a project's semantic-layer/ directory and returns a populated SemanticLayer.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
7
|
+
import { join, extname } from 'node:path';
|
|
8
|
+
import * as yaml from 'js-yaml';
|
|
9
|
+
import { SemanticLayer, parseMetricDefinition, parseDimensionDefinition, parseHierarchyDefinition, parseCubeDefinition, } from './semantic-layer.js';
|
|
10
|
+
/**
|
|
11
|
+
* Load a SemanticLayer from a directory on disk.
|
|
12
|
+
* Expected structure:
|
|
13
|
+
* semanticLayerDir/
|
|
14
|
+
* metrics/ → *.yaml metric definitions
|
|
15
|
+
* dimensions/ → *.yaml dimension definitions
|
|
16
|
+
* hierarchies/ → *.yaml hierarchy definitions
|
|
17
|
+
* cubes/ → *.yaml cube definitions
|
|
18
|
+
* blocks/ → *.yaml block companion definitions (metadata only, not loaded into layer)
|
|
19
|
+
*/
|
|
20
|
+
export function loadSemanticLayerFromDir(semanticLayerDir) {
|
|
21
|
+
const layer = new SemanticLayer();
|
|
22
|
+
const subdirs = [
|
|
23
|
+
{ folder: 'metrics', loader: (raw) => layer.addMetric(parseMetricDefinition(raw)) },
|
|
24
|
+
{ folder: 'dimensions', loader: (raw) => layer.addDimension(parseDimensionDefinition(raw)) },
|
|
25
|
+
{ folder: 'hierarchies', loader: (raw) => layer.addHierarchy(parseHierarchyDefinition(raw)) },
|
|
26
|
+
{ folder: 'cubes', loader: (raw) => layer.addCube(parseCubeDefinition(raw)) },
|
|
27
|
+
];
|
|
28
|
+
for (const { folder, loader } of subdirs) {
|
|
29
|
+
const dir = join(semanticLayerDir, folder);
|
|
30
|
+
if (!existsSync(dir))
|
|
31
|
+
continue;
|
|
32
|
+
for (const file of readdirSync(dir)) {
|
|
33
|
+
if (extname(file) !== '.yaml' && extname(file) !== '.yml')
|
|
34
|
+
continue;
|
|
35
|
+
try {
|
|
36
|
+
const content = readFileSync(join(dir, file), 'utf-8');
|
|
37
|
+
const raw = yaml.load(content);
|
|
38
|
+
if (raw && typeof raw === 'object') {
|
|
39
|
+
loader(raw);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Skip malformed YAML files
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return layer;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load a SemanticLayer from pre-read file contents (no filesystem access needed).
|
|
51
|
+
* Useful for browser contexts or when files are already loaded.
|
|
52
|
+
*/
|
|
53
|
+
export function loadSemanticLayerFromConfig(files) {
|
|
54
|
+
const layer = new SemanticLayer();
|
|
55
|
+
for (const file of files) {
|
|
56
|
+
try {
|
|
57
|
+
const raw = yaml.load(file.content);
|
|
58
|
+
if (!raw || typeof raw !== 'object')
|
|
59
|
+
continue;
|
|
60
|
+
const pathLower = file.path.toLowerCase();
|
|
61
|
+
if (pathLower.includes('/metrics/') || pathLower.includes('\\metrics\\')) {
|
|
62
|
+
layer.addMetric(parseMetricDefinition(raw));
|
|
63
|
+
}
|
|
64
|
+
else if (pathLower.includes('/dimensions/') || pathLower.includes('\\dimensions\\')) {
|
|
65
|
+
layer.addDimension(parseDimensionDefinition(raw));
|
|
66
|
+
}
|
|
67
|
+
else if (pathLower.includes('/hierarchies/') || pathLower.includes('\\hierarchies\\')) {
|
|
68
|
+
layer.addHierarchy(parseHierarchyDefinition(raw));
|
|
69
|
+
}
|
|
70
|
+
else if (pathLower.includes('/cubes/') || pathLower.includes('\\cubes\\')) {
|
|
71
|
+
layer.addCube(parseCubeDefinition(raw));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Skip malformed files
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return layer;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=yaml-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-loader.js","sourceRoot":"","sources":["../../src/semantic/yaml-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duckcodeailabs/dql-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "DQL language core: lexer, parser, AST, semantic analysis",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -33,13 +33,17 @@
|
|
|
33
33
|
"access": "public"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"
|
|
36
|
+
"@types/js-yaml": "^4.0.9",
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
37
38
|
"typescript": "^5.7.0",
|
|
38
|
-
"
|
|
39
|
+
"vitest": "^3.0.0"
|
|
39
40
|
},
|
|
40
41
|
"engines": {
|
|
41
42
|
"node": ">=18.0.0"
|
|
42
43
|
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"js-yaml": "^4.1.1"
|
|
46
|
+
},
|
|
43
47
|
"scripts": {
|
|
44
48
|
"build": "rm -rf dist tsconfig.tsbuildinfo && tsc",
|
|
45
49
|
"test": "vitest run",
|