@sisense/sdk-modeling 1.4.1 → 1.5.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/typescript/utils/format-code.d.ts +2 -0
- package/dist/typescript/utils/format-code.js +25 -0
- package/dist/typescript/writer.js +19 -12
- package/dist/typescript/writers/base.d.ts +2 -1
- package/dist/typescript/writers/base.js +1 -1
- package/dist/typescript/writers/datasource.d.ts +8 -0
- package/dist/typescript/writers/datasource.js +20 -0
- package/dist/typescript/writers/dimensions.d.ts +5 -5
- package/dist/typescript/writers/dimensions.js +5 -5
- package/dist/typescript/writers/imports.d.ts +9 -0
- package/dist/typescript/writers/imports.js +16 -0
- package/dist/typescript/writers/interfaces.d.ts +4 -0
- package/dist/typescript/writers/interfaces.js +1 -0
- package/dist/typescript/writers/measures.d.ts +2 -2
- package/dist/typescript/writers/measures.js +10 -4
- package/package.json +4 -4
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import * as prettier from 'prettier';
|
|
11
|
+
const prettierConfig = {
|
|
12
|
+
semi: true,
|
|
13
|
+
trailingComma: 'all',
|
|
14
|
+
endOfLine: 'lf',
|
|
15
|
+
singleQuote: true,
|
|
16
|
+
printWidth: 100,
|
|
17
|
+
tabWidth: 4,
|
|
18
|
+
arrowParens: 'always',
|
|
19
|
+
};
|
|
20
|
+
export function formatCode(code, codeType) {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
const parser = codeType === 'ts' ? 'typescript' : 'babel';
|
|
23
|
+
return prettier.format(code, Object.assign(Object.assign({}, prettierConfig), { parser }));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -20,7 +20,10 @@ import { DimensionWriter, DateDimensionWriter } from './writers/dimensions.js';
|
|
|
20
20
|
import { NEWLINE } from './writers/base.js';
|
|
21
21
|
import { createInMemoryDuplexStream } from './utils/create-in-memory-duplex-stream.js';
|
|
22
22
|
import { compileTsCode } from './utils/compile-ts-code.js';
|
|
23
|
-
|
|
23
|
+
import { formatCode } from './utils/format-code.js';
|
|
24
|
+
import { DataSourceWriter } from './writers/datasource.js';
|
|
25
|
+
import { ImportsWriter } from './writers/imports.js';
|
|
26
|
+
function getMetadataWriter(item) {
|
|
24
27
|
if (MetadataTypes.isDateDimension(item.type)) {
|
|
25
28
|
return new DateDimensionWriter(item, false);
|
|
26
29
|
}
|
|
@@ -42,17 +45,14 @@ function fillStreamWithTsCode(stream, json, config) {
|
|
|
42
45
|
// generating a dimensional data model from the input json
|
|
43
46
|
const dm = DimensionalDataModel.fromConfig(json);
|
|
44
47
|
const writers = [];
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
writers.push(new ImportsWriter(dm.dataSource, config.datamodule));
|
|
49
|
+
writers.push(new DataSourceWriter(dm.dataSource));
|
|
50
|
+
for (const metadataItem of dm.metadata) {
|
|
51
|
+
writers.push(getMetadataWriter(metadataItem));
|
|
47
52
|
}
|
|
48
|
-
|
|
49
|
-
const datamodule = config.datamodule || '@sisense/sdk-data';
|
|
50
|
-
stream.write(`import type { Dimension, DateDimension, Attribute } from '${datamodule}';${NEWLINE}
|
|
51
|
-
import { createAttribute, createDateDimension, createDimension } from '${datamodule}';${NEWLINE}${NEWLINE}`);
|
|
52
|
-
stream.write(`export const DataSource = '${dm.dataSource}';${NEWLINE}`);
|
|
53
|
-
for (let i = 0; i < writers.length; i++) {
|
|
53
|
+
for (const writer of writers) {
|
|
54
54
|
stream.write(NEWLINE);
|
|
55
|
-
|
|
55
|
+
writer.write(stream, 0);
|
|
56
56
|
stream.write(NEWLINE);
|
|
57
57
|
}
|
|
58
58
|
return stream;
|
|
@@ -65,9 +65,12 @@ export function writeTypescript(json, config) {
|
|
|
65
65
|
const filePath = path.join(config.dir || '', `${config.filename}.ts`);
|
|
66
66
|
const fileStream = createWriteStream(filePath, { encoding: 'utf-8' });
|
|
67
67
|
const tsCodeStream = createInMemoryDuplexStream();
|
|
68
|
-
tsCodeStream.pipe(fileStream);
|
|
69
68
|
fillStreamWithTsCode(tsCodeStream, json, config);
|
|
70
69
|
tsCodeStream.end();
|
|
70
|
+
const unformattedTsCode = tsCodeStream.getStringData();
|
|
71
|
+
const tsCode = yield formatCode(unformattedTsCode, 'ts');
|
|
72
|
+
fileStream.write(tsCode);
|
|
73
|
+
fileStream.end();
|
|
71
74
|
return new Promise((resolve) => {
|
|
72
75
|
fileStream.on('finish', () => {
|
|
73
76
|
resolve();
|
|
@@ -88,7 +91,11 @@ export function writeJavascript(json, config) {
|
|
|
88
91
|
fillStreamWithTsCode(tsCodeStream, json, config);
|
|
89
92
|
tsCodeStream.end();
|
|
90
93
|
const tsCode = tsCodeStream.getStringData();
|
|
91
|
-
const { jsCode, typeDefs } = compileTsCode(tsCode);
|
|
94
|
+
const { jsCode: unformattedJsCode, typeDefs: unformattedTypeDefs } = compileTsCode(tsCode);
|
|
95
|
+
const [jsCode, typeDefs] = yield Promise.all([
|
|
96
|
+
formatCode(unformattedJsCode, 'js'),
|
|
97
|
+
formatCode(unformattedTypeDefs, 'ts'),
|
|
98
|
+
]);
|
|
92
99
|
jsFileStream.write(jsCode);
|
|
93
100
|
dtsFileStream.write(typeDefs);
|
|
94
101
|
jsFileStream.end();
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { Writer } from './interfaces.js';
|
|
2
3
|
export declare const NEWLINE = "\n";
|
|
3
4
|
export declare function writeIndented(stream: NodeJS.WritableStream, s: string, idnt: number): void;
|
|
4
5
|
export declare function template(strings: TemplateStringsArray, ...keys: string[]): any;
|
|
5
6
|
export declare function rnt(idnt: number): string;
|
|
6
7
|
export declare function indent(ident: number): string;
|
|
7
|
-
export declare abstract class
|
|
8
|
+
export declare abstract class ElementWriter<T> implements Writer {
|
|
8
9
|
readonly element: T;
|
|
9
10
|
readonly name: string;
|
|
10
11
|
constructor(element: T, name: string);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { DataSource } from '@sisense/sdk-data';
|
|
3
|
+
import { Writer } from './interfaces.js';
|
|
4
|
+
export declare class DataSourceWriter implements Writer {
|
|
5
|
+
private dataSource;
|
|
6
|
+
constructor(dataSource: DataSource);
|
|
7
|
+
write(stream: NodeJS.WritableStream): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NEWLINE } from './base.js';
|
|
2
|
+
export class DataSourceWriter {
|
|
3
|
+
constructor(dataSource) {
|
|
4
|
+
this.dataSource = dataSource;
|
|
5
|
+
}
|
|
6
|
+
write(stream) {
|
|
7
|
+
if (isDataSourceInfo(this.dataSource)) {
|
|
8
|
+
stream.write(`export const DataSource: DataSourceInfo = ${JSON.stringify(this.dataSource)};${NEWLINE}`);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
stream.write(`export const DataSource = '${this.dataSource}';${NEWLINE}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Function to check if the provided data source is a data source info object
|
|
17
|
+
*/
|
|
18
|
+
function isDataSourceInfo(dataSource) {
|
|
19
|
+
return typeof dataSource === 'object' && 'type' in dataSource && 'title' in dataSource;
|
|
20
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { Dimension, DateDimension, Attribute, LevelAttribute } from '@sisense/sdk-data';
|
|
3
|
-
import {
|
|
4
|
-
export declare class DimensionWriter extends
|
|
3
|
+
import { ElementWriter } from './base.js';
|
|
4
|
+
export declare class DimensionWriter extends ElementWriter<Dimension> {
|
|
5
5
|
readonly isMultiAtts: boolean;
|
|
6
6
|
readonly isCompound: boolean;
|
|
7
7
|
readonly attributes: AttributeWriter[];
|
|
@@ -14,7 +14,7 @@ export declare class DimensionWriter extends BaseWriter<Dimension> {
|
|
|
14
14
|
writeDef(stream: NodeJS.WritableStream, ident: number): void;
|
|
15
15
|
write(stream: NodeJS.WritableStream, ident: number): any;
|
|
16
16
|
}
|
|
17
|
-
export declare class DateDimensionWriter extends
|
|
17
|
+
export declare class DateDimensionWriter extends ElementWriter<DateDimension> {
|
|
18
18
|
readonly isNested: boolean;
|
|
19
19
|
private levels;
|
|
20
20
|
constructor(dimension: DateDimension, isNested: boolean);
|
|
@@ -24,11 +24,11 @@ export declare class DateDimensionWriter extends BaseWriter<DateDimension> {
|
|
|
24
24
|
writeDef(stream: NodeJS.WritableStream, ident: number): void;
|
|
25
25
|
write(stream: NodeJS.WritableStream, ident: number): any;
|
|
26
26
|
}
|
|
27
|
-
export declare class AttributeWriter extends
|
|
27
|
+
export declare class AttributeWriter extends ElementWriter<Attribute> {
|
|
28
28
|
constructor(attribute: Attribute);
|
|
29
29
|
write(stream: NodeJS.WritableStream, ident: number): any;
|
|
30
30
|
}
|
|
31
|
-
export declare class LevelWriter extends
|
|
31
|
+
export declare class LevelWriter extends ElementWriter<LevelAttribute> {
|
|
32
32
|
constructor(level: LevelAttribute);
|
|
33
33
|
write(stream: NodeJS.WritableStream, ident: number): any;
|
|
34
34
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
2
2
|
/* eslint-disable max-lines */
|
|
3
3
|
import { MetadataTypes, DateLevels, normalizeName, } from '@sisense/sdk-data';
|
|
4
|
-
import { NEWLINE, rnt, writeIndented
|
|
5
|
-
export class DimensionWriter extends
|
|
4
|
+
import { ElementWriter, NEWLINE, rnt, writeIndented } from './base.js';
|
|
5
|
+
export class DimensionWriter extends ElementWriter {
|
|
6
6
|
constructor(dimension, isNested) {
|
|
7
7
|
super(dimension, normalizeName(dimension.name));
|
|
8
8
|
this.isNested = isNested;
|
|
@@ -67,7 +67,7 @@ export class DimensionWriter extends BaseWriter {
|
|
|
67
67
|
this.writeDef(stream, ident);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
export class DateDimensionWriter extends
|
|
70
|
+
export class DateDimensionWriter extends ElementWriter {
|
|
71
71
|
constructor(dimension, isNested) {
|
|
72
72
|
super(dimension, normalizeName(dimension.name));
|
|
73
73
|
this.isNested = isNested;
|
|
@@ -112,7 +112,7 @@ export class DateDimensionWriter extends BaseWriter {
|
|
|
112
112
|
this.writeDef(stream, ident);
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
|
-
export class AttributeWriter extends
|
|
115
|
+
export class AttributeWriter extends ElementWriter {
|
|
116
116
|
constructor(attribute) {
|
|
117
117
|
super(attribute, normalizeName(attribute.name));
|
|
118
118
|
}
|
|
@@ -124,7 +124,7 @@ ${rnt(ident + 2)}expression: '${this.element.expression}',\
|
|
|
124
124
|
${rnt(ident + 1)}}),`, ident);
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
-
export class LevelWriter extends
|
|
127
|
+
export class LevelWriter extends ElementWriter {
|
|
128
128
|
constructor(level) {
|
|
129
129
|
super(level, normalizeName(level.name));
|
|
130
130
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { DataSource } from '@sisense/sdk-data';
|
|
3
|
+
import { Writer } from './interfaces.js';
|
|
4
|
+
export declare class ImportsWriter implements Writer {
|
|
5
|
+
private dataSource;
|
|
6
|
+
private dataModule;
|
|
7
|
+
constructor(dataSource: DataSource, dataModule?: string);
|
|
8
|
+
write(stream: NodeJS.WritableStream): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { isDataSourceInfo } from '@sisense/sdk-data';
|
|
2
|
+
import { NEWLINE } from './base.js';
|
|
3
|
+
export class ImportsWriter {
|
|
4
|
+
constructor(dataSource, dataModule = '@sisense/sdk-data') {
|
|
5
|
+
this.dataSource = dataSource;
|
|
6
|
+
this.dataModule = dataModule;
|
|
7
|
+
}
|
|
8
|
+
write(stream) {
|
|
9
|
+
const typesToImport = ['Dimension', 'DateDimension', 'Attribute'];
|
|
10
|
+
if (isDataSourceInfo(this.dataSource)) {
|
|
11
|
+
typesToImport.push('DataSourceInfo');
|
|
12
|
+
}
|
|
13
|
+
stream.write(`import type { ${typesToImport.join(', ')} } from '${this.dataModule}';${NEWLINE}${NEWLINE}`);
|
|
14
|
+
stream.write(`import { createAttribute, createDateDimension, createDimension } from '${this.dataModule}';${NEWLINE}${NEWLINE}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { BaseMeasure, MeasureTemplate } from '@sisense/sdk-data';
|
|
3
|
-
import {
|
|
4
|
-
export declare abstract class MeasureWriter<T> extends
|
|
3
|
+
import { ElementWriter } from './base.js';
|
|
4
|
+
export declare abstract class MeasureWriter<T> extends ElementWriter<T> {
|
|
5
5
|
readonly isNested: boolean;
|
|
6
6
|
constructor(measure: T, isNested: boolean);
|
|
7
7
|
abstract writeDef(stream: NodeJS.WritableStream, ident: number): void;
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-useless-constructor */
|
|
4
4
|
/* eslint-disable sonarjs/no-nested-template-literals */
|
|
5
5
|
import { normalizeName } from '@sisense/sdk-data';
|
|
6
|
-
import { NEWLINE, rnt, writeIndented,
|
|
7
|
-
export class MeasureWriter extends
|
|
6
|
+
import { NEWLINE, rnt, writeIndented, ElementWriter } from './base.js';
|
|
7
|
+
export class MeasureWriter extends ElementWriter {
|
|
8
8
|
constructor(measure, isNested) {
|
|
9
9
|
super(measure, normalizeName(measure.name));
|
|
10
10
|
this.isNested = isNested;
|
|
@@ -27,7 +27,11 @@ export class BaseMeasureWriter extends MeasureWriter {
|
|
|
27
27
|
writeIndented(stream, `<BaseMeasure>createMeasure({\
|
|
28
28
|
${rnt(idnt + 1)}name: "${this.name}", \
|
|
29
29
|
${rnt(idnt + 1)}expression: "${this.element.attribute.expression}", \
|
|
30
|
-
${rnt(idnt + 1)}agg: "${this.element.aggregation}"${this.element.getFormat()
|
|
30
|
+
${rnt(idnt + 1)}agg: "${this.element.aggregation}"${this.element.getFormat()
|
|
31
|
+
? `,${rnt(idnt + 1)}format:"${this.element.getFormat()}"`
|
|
32
|
+
: ''}${this.element.description
|
|
33
|
+
? `,${rnt(idnt + 1)}description:"${this.element.description}"`
|
|
34
|
+
: ''}})`, idnt);
|
|
31
35
|
}
|
|
32
36
|
}
|
|
33
37
|
// class SCalculatedMeasure extends SMeasure{
|
|
@@ -48,7 +52,9 @@ export class MeasureTemplateWriter extends MeasureWriter {
|
|
|
48
52
|
writeIndented(stream, `<MeasureTemplate>createMeasure({\
|
|
49
53
|
${rnt(ident + 1)}name: "${this.name}", \
|
|
50
54
|
${rnt(ident + 1)}expression: "${this.element.attribute.expression}", \
|
|
51
|
-
${rnt(ident + 1)}agg: "*"${this.element.getFormat()
|
|
55
|
+
${rnt(ident + 1)}agg: "*"${this.element.getFormat()
|
|
56
|
+
? `,${rnt(ident + 1)}format:"${this.element.getFormat()}"`
|
|
57
|
+
: ''}${this.element.description
|
|
52
58
|
? `,${rnt(ident + 1)}description:"${this.element.description}"`
|
|
53
59
|
: ''}})`, ident);
|
|
54
60
|
}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"Sisense",
|
|
12
12
|
"Compose SDK"
|
|
13
13
|
],
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.5.0",
|
|
15
15
|
"author": "Sisense",
|
|
16
16
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
17
17
|
"type": "module",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"module": "./dist/index.js",
|
|
21
21
|
"types": "./dist/index.d.ts",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@sisense/sdk-data": "^1.
|
|
23
|
+
"@sisense/sdk-data": "^1.5.0",
|
|
24
|
+
"prettier": "^3.2.5",
|
|
24
25
|
"typescript": "4.8.4"
|
|
25
26
|
},
|
|
26
27
|
"scripts": {
|
|
@@ -42,8 +43,7 @@
|
|
|
42
43
|
],
|
|
43
44
|
"devDependencies": {
|
|
44
45
|
"@babel/preset-env": "^7.20.2",
|
|
45
|
-
"eslint": "^8.40.0"
|
|
46
|
-
"prettier": "2.8.4"
|
|
46
|
+
"eslint": "^8.40.0"
|
|
47
47
|
},
|
|
48
48
|
"volta": {
|
|
49
49
|
"extends": "../../package.json"
|