@sisense/sdk-modeling 1.4.1 → 1.6.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.
@@ -0,0 +1,2 @@
1
+ export declare type CodeType = 'ts' | 'js';
2
+ export declare function formatCode(code: string, codeType: CodeType): Promise<string>;
@@ -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
- function getWriter(item) {
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
- for (let i = 0; i < dm.metadata.length; i++) {
46
- writers.push(getWriter(dm.metadata[i]));
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
- // writing imports
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
- writers[i].write(stream, 0);
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 BaseWriter<T> {
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);
@@ -30,7 +30,7 @@ export function indent(ident) {
30
30
  // use two whitespaces for indentation
31
31
  return ' '.repeat(ident);
32
32
  }
33
- export class BaseWriter {
33
+ export class ElementWriter {
34
34
  constructor(element, name) {
35
35
  this.element = element;
36
36
  this.name = name;
@@ -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 { BaseWriter } from './base.js';
4
- export declare class DimensionWriter extends BaseWriter<Dimension> {
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 BaseWriter<DateDimension> {
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 BaseWriter<Attribute> {
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 BaseWriter<LevelAttribute> {
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, BaseWriter } from './base.js';
5
- export class DimensionWriter extends BaseWriter {
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 BaseWriter {
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 BaseWriter {
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 BaseWriter {
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,4 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ export interface Writer {
3
+ write(stream: NodeJS.WritableStream, ident: number): any;
4
+ }
@@ -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 { BaseWriter } from './base.js';
4
- export declare abstract class MeasureWriter<T> extends BaseWriter<T> {
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, BaseWriter } from './base.js';
7
- export class MeasureWriter extends BaseWriter {
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() ? `,${rnt(idnt + 1)}format:"${this.element.getFormat()}"` : ''}${this.element.description ? `,${rnt(idnt + 1)}description:"${this.element.description}"` : ''}})`, idnt);
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() ? `,${rnt(ident + 1)}format:"${this.element.getFormat()}"` : ''}${this.element.description
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.4.1",
14
+ "version": "1.6.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.4.1",
23
+ "@sisense/sdk-data": "^1.6.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"