@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.
@@ -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"}
@@ -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.1.3",
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
- "vitest": "^3.0.0",
36
+ "@types/js-yaml": "^4.0.9",
37
+ "@types/node": "^22.0.0",
37
38
  "typescript": "^5.7.0",
38
- "@types/node": "^22.0.0"
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",