From 7088206b7420415bd472c808658a28b330d29714 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 17:56:51 +0800 Subject: [PATCH 01/42] implement basic lg apis --- .../packages/lib/shared/src/lgUtils/index.ts | 2 ++ .../shared/src/lgUtils/models/LgMetaData.ts | 31 +++++++++++++++++++ .../src/lgUtils/models/LgTemplateRef.ts | 24 ++++++++++++++ .../shared/src/lgUtils/models/stringTypes.ts | 17 ++++++++++ .../src/lgUtils/parsers/parseLgParamString.ts | 16 ++++++++++ .../lgUtils/parsers/parseLgTemplateName.ts | 17 ++++++++++ .../src/lgUtils/parsers/parseLgTemplateRef.ts | 21 +++++++++++++ .../shared/src/lgUtils/parsers/parseLgText.ts | 21 +++++++++++++ .../shared/src/lgUtils/parsers/patterns.ts | 8 +++++ 9 files changed, 157 insertions(+) create mode 100644 Composer/packages/lib/shared/src/lgUtils/index.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts new file mode 100644 index 0000000000..68ad7fa4c7 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -0,0 +1,2 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts new file mode 100644 index 0000000000..05d9555982 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgTemplateName, LgTemplateRefString, LgText } from './stringTypes'; +import LgTemplateRef from './LgTemplateRef'; + +export default class LgMetaData { + type: string; + designerId: string; + + constructor(lgType: string, designerId: string) { + this.type = lgType; + this.designerId = designerId; + } + + toLgTemplateName(): LgTemplateName { + return `bfd${this.type}-${this.designerId}`; + } + + toLgTemplateRef(lgParams?: string[]): LgTemplateRef { + return new LgTemplateRef(this.toLgTemplateName(), lgParams); + } + + toLgTemplateRefString(lgParams?: string[]): LgTemplateRefString { + return this.toLgTemplateRef(lgParams).toString(); + } + + toLgText(lgParams?: string[]): LgText { + return this.toLgTemplateRef(lgParams).toLgText(); + } +} diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts new file mode 100644 index 0000000000..3f6f90105f --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgTemplateName, LgTemplateRefString, LgText } from './stringTypes'; + +export default class LgTemplateRef { + name: LgTemplateName; + + parameters: string[] | undefined; + + constructor(name: LgTemplateName, parameters?: string[]) { + this.name = name; + this.parameters = parameters; + } + + toString(): LgTemplateRefString { + const paramsSuffix = Array.isArray(this.parameters) ? `(${this.parameters.join(',')})` : ''; + return `[${this.name}${paramsSuffix}]`; + } + + toLgText(): LgText { + return `- ${this.toString()}`; + } +} diff --git a/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts new file mode 100644 index 0000000000..a3b62c2f64 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +/** + * example: '- [bfdactivity-123456]' + */ +export type LgText = string; + +/** + * example: '[bfdactivity-123456()]' + */ +export type LgTemplateRefString = string; + +/** + * example: 'bfdactivity-123456' + */ +export type LgTemplateName = string; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts new file mode 100644 index 0000000000..601c551d35 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +/** + * @param input '(1,2,3)' + * @returns ['1', '2', '3'] + */ +export default function parseLgParamString(input: string): string[] | undefined { + if (!input) return undefined; + + const results = /^\((\w+)\)$/.exec(input); + if (Array.isArray(results) && results.length === 2) { + return results[1].split(','); + } + return undefined; +} diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts new file mode 100644 index 0000000000..14bae0bda0 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgTemplateName } from '../models/stringTypes'; +import LgMetaData from '../models/LgMetaData'; + +import { LgNamePattern } from './patterns'; + +export default function parseLgTemplateName(lgTemplateName: LgTemplateName): LgMetaData | null { + if (!lgTemplateName) return null; + + const results = lgTemplateName.match(LgNamePattern); + if (Array.isArray(results) && results.length === 3) { + return new LgMetaData(results[1], results[2]); + } + return null; +} diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts new file mode 100644 index 0000000000..6937e66294 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgTemplateRefString } from '../models/stringTypes'; +import LgTemplateRef from '../models/LgTemplateRef'; + +import { LgTemplateRefPattern } from './patterns'; +import parseLgParamString from './parseLgParamString'; + +export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { + if (!inputString) return null; + + const results = LgTemplateRefPattern.match(inputString); + if (Array.isArray(results) && results.length === 5) { + const name = results[1]; + const lgParams = parseLgParamString(results[4]); + + return new LgTemplateRef(name, lgParams); + } + return null; +} diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts new file mode 100644 index 0000000000..d5031ce885 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgText } from '../models/stringTypes'; +import LgTemplateRef from '../models/LgTemplateRef'; + +import { LgTextPattern } from './patterns'; +import parseLgParamString from './parseLgParamString'; + +export default function parseLgText(inputString: LgText): LgTemplateRef | null { + if (!inputString) return null; + + const results = LgTextPattern.match(inputString); + if (Array.isArray(results) && results.length === 5) { + const name = results[1]; + const lgParams = parseLgParamString(results[4]); + + return new LgTemplateRef(name, lgParams); + } + return null; +} diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts new file mode 100644 index 0000000000..060a489015 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +export const LgNamePattern = `bfd(\\w+)-(\\d+)`; + +export const LgTemplateRefPattern = `\\[(${LgNamePattern})(\\(\\w*\\))?\\]`; + +export const LgTextPattern = `- ${LgTemplateRefPattern}`; From e975f16f97c764674c8eb2ecd1af99c99aae3d49 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 18:06:54 +0800 Subject: [PATCH 02/42] expose them on 'shared' level --- Composer/packages/lib/shared/src/index.ts | 1 + Composer/packages/lib/shared/src/lgUtils/index.ts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/Composer/packages/lib/shared/src/index.ts b/Composer/packages/lib/shared/src/index.ts index 36c5633392..0c0d75b91e 100644 --- a/Composer/packages/lib/shared/src/index.ts +++ b/Composer/packages/lib/shared/src/index.ts @@ -12,3 +12,4 @@ export * from './promptTabs'; export * from './appschema'; export * from './types'; export * from './constant'; +export * from './lgUtils'; diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index 68ad7fa4c7..b1ce09120c 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -1,2 +1,11 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License + +/** models */ +export { default as LgMetaData } from './models/LgMetaData'; +export { default as LgTemplateRef } from './models/LgTemplateRef'; + +/** parsers */ +export { default as parseLgTemplateName } from './parsers/parseLgTemplateName'; +export { default as parseLgTemplateRef } from './parsers/parseLgTemplateRef'; +export { default as parseLgText } from './parsers/parseLgText'; From 531f317a6ae12e4b5f023ee871dbd5c6bb565549 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 18:41:49 +0800 Subject: [PATCH 03/42] UT + fix --- .../lgUtils/models/LgMetaData.test.ts | 30 ++++++++++++++++ .../lgUtils/models/LgTemplateRef.test.ts | 34 +++++++++++++++++++ .../parsers/parseLgParamString.test.ts | 16 +++++++++ .../parsers/parseLgTemplateName.test.ts | 18 ++++++++++ .../parsers/parseLgTemplateRef.test.ts | 18 ++++++++++ .../lgUtils/parsers/parseLgText.test.ts | 19 +++++++++++ .../src/lgUtils/parsers/parseLgParamString.ts | 4 +-- .../src/lgUtils/parsers/parseLgTemplateRef.ts | 2 +- .../shared/src/lgUtils/parsers/parseLgText.ts | 2 +- 9 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgParamString.test.ts create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts new file mode 100644 index 0000000000..88957ca4d5 --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgMetaData } from '../../../src'; + +describe('LgMetaData', () => { + it('can construct an instance via constructor', () => { + const instance = new LgMetaData('activity', '123456'); + + expect(instance.type).toEqual('activity'); + expect(instance.designerId).toEqual('123456'); + + expect(instance.toLgTemplateName).toBeDefined(); + expect(instance.toLgTemplateRef).toBeDefined(); + expect(instance.toLgTemplateRefString).toBeDefined(); + expect(instance.toLgText).toBeDefined(); + }); + + it('can generate correct output strings', () => { + const instance = new LgMetaData('activity', '123456'); + + expect(instance.toLgTemplateName()).toEqual('bfdactivity-123456'); + + expect(instance.toLgTemplateRefString()).toEqual('[bfdactivity-123456]'); + expect(instance.toLgTemplateRefString(['1', '2'])).toEqual('[bfdactivity-123456(1,2)]'); + + expect(instance.toLgText()).toEqual('- [bfdactivity-123456]'); + expect(instance.toLgText([])).toEqual('- [bfdactivity-123456()]'); + }); +}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts new file mode 100644 index 0000000000..0aa12836dd --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgTemplateRef } from '../../../src'; + +describe('LgTemplateRef', () => { + it('can construct an instance via constructor', () => { + const a = new LgTemplateRef('a', undefined); + expect(a.name).toEqual('a'); + expect(a.parameters).toEqual(undefined); + + const b = new LgTemplateRef('b', []); + expect(b.name).toEqual('b'); + expect(b.parameters).toEqual([]); + + const c = new LgTemplateRef('c', ['1', '2']); + expect(c.name).toEqual('c'); + expect(c.parameters).toEqual(['1', '2']); + }); + + it('can output correct strings', () => { + const a = new LgTemplateRef('a', undefined); + expect(a.toString()).toEqual('[a]'); + expect(a.toLgText()).toEqual('- [a]'); + + const b = new LgTemplateRef('b', []); + expect(b.toString()).toEqual('[b()]'); + expect(b.toLgText()).toEqual('- [b()]'); + + const c = new LgTemplateRef('c', ['1', '2']); + expect(c.toString()).toEqual('[c(1,2)]'); + expect(c.toLgText()).toEqual('- [c(1,2)]'); + }); +}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgParamString.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgParamString.test.ts new file mode 100644 index 0000000000..1330259054 --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgParamString.test.ts @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import parseLgParamString from '../../../src/lgUtils/parsers/parseLgParamString'; + +describe('parseLgParamString', () => { + it('should return undefined when no params detected', () => { + expect(parseLgParamString('')).toBeUndefined(); + expect(parseLgParamString('xxx')).toBeUndefined(); + }); + + it('should return params array when input valid strings', () => { + expect(parseLgParamString('()')).toEqual([]); + expect(parseLgParamString('(a,b)')).toEqual(['a', 'b']); + }); +}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts new file mode 100644 index 0000000000..f32e13eb1d --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { parseLgTemplateName, LgMetaData } from '../../../src'; + +describe('parseLgTemplateName', () => { + it('should return null when inputs are invalid', () => { + expect(parseLgTemplateName('')).toEqual(null); + expect(parseLgTemplateName('xxx')).toEqual(null); + }); + + it('should return LgMetaData when inputs are valid', () => { + const result = parseLgTemplateName('bfdactivity-123456'); + expect(result).toBeInstanceOf(LgMetaData); + expect((result as LgMetaData).designerId).toEqual('123456'); + expect((result as LgMetaData).type).toEqual('activity'); + }); +}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts new file mode 100644 index 0000000000..788c077355 --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { parseLgTemplateRef, LgTemplateRef } from '../../../src'; + +describe('parseLgTemplateRef', () => { + it('should return null when inputs are invalid', () => { + expect(parseLgTemplateRef('')).toEqual(null); + expect(parseLgTemplateRef('xxx')).toEqual(null); + }); + + it('should return LgTemplateRef when inputs are valid', () => { + const result = parseLgTemplateRef('[bfdactivity-123456]'); + expect(result).toBeInstanceOf(LgTemplateRef); + expect((result as LgTemplateRef).name).toEqual('bfdactivity-123456'); + expect((result as LgTemplateRef).parameters).toEqual(undefined); + }); +}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts new file mode 100644 index 0000000000..d96dfb9cb9 --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { parseLgText, LgTemplateRef } from '../../../src'; + +describe('parseLgText', () => { + it('should return null when inputs are invalid', () => { + expect(parseLgText('')).toEqual(null); + expect(parseLgText('xxx')).toEqual(null); + expect(parseLgText('[bfdactivity-1234]')).toEqual(null); + }); + + it('should return LgTemplateRef when inputs are valid', () => { + const result = parseLgText('- [bfdactivity-123456]'); + expect(result).toBeInstanceOf(LgTemplateRef); + expect((result as LgTemplateRef).name).toEqual('bfdactivity-123456'); + expect((result as LgTemplateRef).parameters).toEqual(undefined); + }); +}); diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts index 601c551d35..040cdfbe11 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgParamString.ts @@ -8,9 +8,9 @@ export default function parseLgParamString(input: string): string[] | undefined { if (!input) return undefined; - const results = /^\((\w+)\)$/.exec(input); + const results = /^\((.*)\)$/.exec(input); if (Array.isArray(results) && results.length === 2) { - return results[1].split(','); + return results[1] ? results[1].split(',') : []; } return undefined; } diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 6937e66294..baab5d6de4 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -10,7 +10,7 @@ import parseLgParamString from './parseLgParamString'; export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { if (!inputString) return null; - const results = LgTemplateRefPattern.match(inputString); + const results = inputString.match(LgTemplateRefPattern); if (Array.isArray(results) && results.length === 5) { const name = results[1]; const lgParams = parseLgParamString(results[4]); diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts index d5031ce885..31f1dc808d 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts @@ -10,7 +10,7 @@ import parseLgParamString from './parseLgParamString'; export default function parseLgText(inputString: LgText): LgTemplateRef | null { if (!inputString) return null; - const results = LgTextPattern.match(inputString); + const results = inputString.match(LgTextPattern); if (Array.isArray(results) && results.length === 5) { const name = results[1]; const lgParams = parseLgParamString(results[4]); From 9e7c5413aabc14943c96839d103e785521f4b316 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 18:48:32 +0800 Subject: [PATCH 04/42] add static `parse()` method to LgTemplateRef and LgMetaData --- .../lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts | 4 ++++ .../shared/__tests__/lgUtils/models/LgTemplateRef.test.ts | 4 ++++ .../packages/lib/shared/src/lgUtils/models/LgMetaData.ts | 6 ++++++ .../packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts index 88957ca4d5..e8ea3f0dbf 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts @@ -27,4 +27,8 @@ describe('LgMetaData', () => { expect(instance.toLgText()).toEqual('- [bfdactivity-123456]'); expect(instance.toLgText([])).toEqual('- [bfdactivity-123456()]'); }); + + it('can construct instance via `parse()` method', () => { + expect(LgMetaData.parse('bfdactivity-123456')).toBeInstanceOf(LgMetaData); + }); }); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts index 0aa12836dd..d7d603cb93 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts @@ -31,4 +31,8 @@ describe('LgTemplateRef', () => { expect(c.toString()).toEqual('[c(1,2)]'); expect(c.toLgText()).toEqual('- [c(1,2)]'); }); + + it('can construct instance via `parse()`', () => { + expect(LgTemplateRef.parse('[bfdactivity-123456]')).toBeInstanceOf(LgTemplateRef); + }); }); diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts index 05d9555982..a7c543bd4f 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License +import parseLgTemplateName from '../parsers/parseLgTemplateName'; + import { LgTemplateName, LgTemplateRefString, LgText } from './stringTypes'; import LgTemplateRef from './LgTemplateRef'; @@ -13,6 +15,10 @@ export default class LgMetaData { this.designerId = designerId; } + static parse(input: LgTemplateName): LgMetaData | null { + return parseLgTemplateName(input); + } + toLgTemplateName(): LgTemplateName { return `bfd${this.type}-${this.designerId}`; } diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts index 3f6f90105f..503de230b9 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License +import parseLgTemplateRef from '../parsers/parseLgTemplateRef'; + import { LgTemplateName, LgTemplateRefString, LgText } from './stringTypes'; export default class LgTemplateRef { @@ -13,6 +15,10 @@ export default class LgTemplateRef { this.parameters = parameters; } + static parse(input: LgTemplateRefString): LgTemplateRef | null { + return parseLgTemplateRef(input); + } + toString(): LgTemplateRefString { const paramsSuffix = Array.isArray(this.parameters) ? `(${this.parameters.join(',')})` : ''; return `[${this.name}${paramsSuffix}]`; From b55f845dc2d56af563cac86b381994362314e203 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 19:11:20 +0800 Subject: [PATCH 05/42] loose restriction on lg format --- .../lgUtils/parsers/parseLgTemplateRef.test.ts | 13 +++++++++---- .../src/lgUtils/parsers/parseLgTemplateRef.ts | 4 ++-- .../lib/shared/src/lgUtils/parsers/parseLgText.ts | 9 +++------ .../lib/shared/src/lgUtils/parsers/patterns.ts | 4 ++-- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts index 788c077355..7698765450 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts @@ -10,9 +10,14 @@ describe('parseLgTemplateRef', () => { }); it('should return LgTemplateRef when inputs are valid', () => { - const result = parseLgTemplateRef('[bfdactivity-123456]'); - expect(result).toBeInstanceOf(LgTemplateRef); - expect((result as LgTemplateRef).name).toEqual('bfdactivity-123456'); - expect((result as LgTemplateRef).parameters).toEqual(undefined); + const a = parseLgTemplateRef('[bfdactivity-123456]'); + expect(a).toBeInstanceOf(LgTemplateRef); + expect((a as LgTemplateRef).name).toEqual('bfdactivity-123456'); + expect((a as LgTemplateRef).parameters).toEqual(undefined); + + const b = parseLgTemplateRef('[greeting(1,2)]'); + expect(b).toBeInstanceOf(LgTemplateRef); + expect((b as LgTemplateRef).name).toEqual('greeting'); + expect((b as LgTemplateRef).parameters).toEqual(['1', '2']); }); }); diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index baab5d6de4..3d937772c6 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -11,9 +11,9 @@ export default function parseLgTemplateRef(inputString: LgTemplateRefString): Lg if (!inputString) return null; const results = inputString.match(LgTemplateRefPattern); - if (Array.isArray(results) && results.length === 5) { + if (Array.isArray(results) && results.length === 3) { const name = results[1]; - const lgParams = parseLgParamString(results[4]); + const lgParams = parseLgParamString(results[2]); return new LgTemplateRef(name, lgParams); } diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts index 31f1dc808d..e159a72eb4 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts @@ -5,17 +5,14 @@ import { LgText } from '../models/stringTypes'; import LgTemplateRef from '../models/LgTemplateRef'; import { LgTextPattern } from './patterns'; -import parseLgParamString from './parseLgParamString'; export default function parseLgText(inputString: LgText): LgTemplateRef | null { if (!inputString) return null; const results = inputString.match(LgTextPattern); - if (Array.isArray(results) && results.length === 5) { - const name = results[1]; - const lgParams = parseLgParamString(results[4]); - - return new LgTemplateRef(name, lgParams); + if (Array.isArray(results) && results.length === 2) { + const lgTemplateRefString = results[1]; + return LgTemplateRef.parse(lgTemplateRefString); } return null; } diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts index 060a489015..2e67844a37 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts @@ -3,6 +3,6 @@ export const LgNamePattern = `bfd(\\w+)-(\\d+)`; -export const LgTemplateRefPattern = `\\[(${LgNamePattern})(\\(\\w*\\))?\\]`; +export const LgTemplateRefPattern = `\\[(.+?)(\\(.*\\))?\\]`; -export const LgTextPattern = `- ${LgTemplateRefPattern}`; +export const LgTextPattern = `- (\\[.+\\])`; From aae1d7cbf4aaacb317c224ff3d67ac9b02ae299c Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 19:28:19 +0800 Subject: [PATCH 06/42] migrate: lgUtils --- Composer/packages/client/src/utils/lgUtil.ts | 3 ++- Composer/packages/lib/shared/src/lgUtils/index.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Composer/packages/client/src/utils/lgUtil.ts b/Composer/packages/client/src/utils/lgUtil.ts index 482a3f408e..0def26e280 100644 --- a/Composer/packages/client/src/utils/lgUtil.ts +++ b/Composer/packages/client/src/utils/lgUtil.ts @@ -9,6 +9,7 @@ import { LGParser, StaticChecker, DiagnosticSeverity, ImportResolver, Diagnostic, LGTemplate } from 'botbuilder-lg'; import get from 'lodash/get'; +import { LgTemplateRefPattern } from '@bfc/shared'; const lgStaticChecker = new StaticChecker(); @@ -139,7 +140,7 @@ export function extractTemplateNames(text: string): string[] { const templateNames: string[] = []; // match a template name match a temlate func e.g. `showDate()` // eslint-disable-next-line security/detect-unsafe-regex - const reg = /\[([A-Za-z_][-\w]+)(\(.*\))?\]/g; + const reg = new RegExp(LgTemplateRefPattern, 'g'); let matchResult; while ((matchResult = reg.exec(text)) !== null) { const templateName = matchResult[1]; diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index b1ce09120c..9bd198f1d6 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -4,6 +4,7 @@ /** models */ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; +export { LgTemplateRefPattern } from './parsers/patterns'; /** parsers */ export { default as parseLgTemplateName } from './parsers/parseLgTemplateName'; From 13ce6b3e3ee72a07a281da9ba2da6d93b13ab898 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 19:32:43 +0800 Subject: [PATCH 07/42] migrate: visual editor - hooks --- .../visual-designer/src/utils/hooks.ts | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/Composer/packages/extensions/visual-designer/src/utils/hooks.ts b/Composer/packages/extensions/visual-designer/src/utils/hooks.ts index eddd11f52d..901b6dbb23 100644 --- a/Composer/packages/extensions/visual-designer/src/utils/hooks.ts +++ b/Composer/packages/extensions/visual-designer/src/utils/hooks.ts @@ -3,33 +3,18 @@ import { useContext, useState, useEffect, useRef } from 'react'; import debounce from 'lodash/debounce'; +import { LgTemplateRef } from '@bfc/shared'; import { NodeRendererContext } from '../store/NodeRendererContext'; -// matches [bfd-123456] -const TEMPLATE_PATTERN = /^\[(bfd.+-\d{6})\]$/; - -const getTemplateId = (str?: string): string | null => { - if (!str) { - return null; - } - - const match = TEMPLATE_PATTERN.exec(str); - - if (!match || !match[1]) { - return null; - } - - return match[1]; -}; - export const useLgTemplate = (str?: string, dialogId?: string) => { const { getLgTemplates } = useContext(NodeRendererContext); const [templateText, setTemplateText] = useState(''); let cancelled = false; const updateTemplateText = async () => { - const templateId = getTemplateId(str); + const lgTemplateRef = LgTemplateRef.parse(str || ''); + const templateId = lgTemplateRef ? lgTemplateRef.name : ''; if (templateId && dialogId) { // this is an LG template, go get it's content From 1e6b5ea057bfa73a1e059b00f4c93c14df4dc129 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 19:44:11 +0800 Subject: [PATCH 08/42] move 'extractLgTemplateRefs' inside 'shared' lib --- Composer/packages/client/src/utils/lgUtil.ts | 20 --------------- .../lgUtils/extractLgTemplateRefs.test.ts | 11 ++++++++ .../src/lgUtils/extractLgTemplateNames.ts | 25 +++++++++++++++++++ .../packages/lib/shared/src/lgUtils/index.ts | 3 ++- 4 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts diff --git a/Composer/packages/client/src/utils/lgUtil.ts b/Composer/packages/client/src/utils/lgUtil.ts index 0def26e280..e7b97f7a8f 100644 --- a/Composer/packages/client/src/utils/lgUtil.ts +++ b/Composer/packages/client/src/utils/lgUtil.ts @@ -9,7 +9,6 @@ import { LGParser, StaticChecker, DiagnosticSeverity, ImportResolver, Diagnostic, LGTemplate } from 'botbuilder-lg'; import get from 'lodash/get'; -import { LgTemplateRefPattern } from '@bfc/shared'; const lgStaticChecker = new StaticChecker(); @@ -130,25 +129,6 @@ export function getTemplate(content: string, templateName: string): LGTemplate | return resource.Templates.find(t => t.Name === templateName); } -/** - * - * @param text string - * -[Greeting], I'm a fancy bot, [Bye] ---> ['Greeting', 'Bye'] - * - */ -export function extractTemplateNames(text: string): string[] { - const templateNames: string[] = []; - // match a template name match a temlate func e.g. `showDate()` - // eslint-disable-next-line security/detect-unsafe-regex - const reg = new RegExp(LgTemplateRefPattern, 'g'); - let matchResult; - while ((matchResult = reg.exec(text)) !== null) { - const templateName = matchResult[1]; - templateNames.push(templateName); - } - return templateNames; -} - export function removeTemplate(content: string, templateName: string): string { const resource = LGParser.parse(content); return resource.deleteTemplate(templateName).toString(); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts new file mode 100644 index 0000000000..cc2b40ee0b --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts @@ -0,0 +1,11 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { extractLgTemplateNames } from '../../src'; + +describe('extractLgTemplateRefs', () => { + it('can extract lg refs from input string', () => { + expect(extractLgTemplateNames('Hi')).toEqual([]); + expect(extractLgTemplateNames(`-[Greeting], I'm a fancy bot, [Bye]`)).toEqual(['Greeting', 'Bye']); + }); +}); diff --git a/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts b/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts new file mode 100644 index 0000000000..41482d8000 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgTemplateRefPattern } from './parsers/patterns'; +import { LgTemplateName } from './models/stringTypes'; + +/** + * + * @param text string + * -[Greeting], I'm a fancy bot, [Bye] ---> ['Greeting', 'Bye'] + * + */ +export default function extractLgTemplateNames(text: string): LgTemplateName[] { + const templateNames: string[] = []; + + // eslint-disable-next-line security/detect-non-literal-regexp + const reg = new RegExp(LgTemplateRefPattern, 'g'); + + let matchResult; + while ((matchResult = reg.exec(text)) !== null) { + const templateName = matchResult[1]; + templateNames.push(templateName); + } + return templateNames; +} diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index 9bd198f1d6..ac456e56a4 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -4,9 +4,10 @@ /** models */ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; -export { LgTemplateRefPattern } from './parsers/patterns'; /** parsers */ export { default as parseLgTemplateName } from './parsers/parseLgTemplateName'; export { default as parseLgTemplateRef } from './parsers/parseLgTemplateRef'; export { default as parseLgText } from './parsers/parseLgText'; + +export { default as extractLgTemplateNames } from './extractLgTemplateNames'; From ee68ddeee7d49a3dd9ad4f7d9d2b9cf582a727d6 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 19:57:03 +0800 Subject: [PATCH 09/42] migrate: dialogIndexer --- Composer/packages/lib/indexers/package.json | 1 + Composer/packages/lib/indexers/src/dialogIndexer.ts | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/Composer/packages/lib/indexers/package.json b/Composer/packages/lib/indexers/package.json index c6bacc6cf0..fbc481028f 100644 --- a/Composer/packages/lib/indexers/package.json +++ b/Composer/packages/lib/indexers/package.json @@ -25,6 +25,7 @@ "ts-jest": "^24.1.0" }, "dependencies": { + "@bfc/shared": "*", "botbuilder-expression-parser": "^4.5.11", "botbuilder-lg": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/botbuilder-lg/-/4.7.0-preview2.tgz", "lodash": "^4.17.15", diff --git a/Composer/packages/lib/indexers/src/dialogIndexer.ts b/Composer/packages/lib/indexers/src/dialogIndexer.ts index ec235de7ae..6df0035d2c 100644 --- a/Composer/packages/lib/indexers/src/dialogIndexer.ts +++ b/Composer/packages/lib/indexers/src/dialogIndexer.ts @@ -3,6 +3,7 @@ import has from 'lodash/has'; import uniq from 'lodash/uniq'; +import { extractLgTemplateNames } from '@bfc/shared'; import { ITrigger, DialogInfo, FileInfo } from './type'; import { DialogChecker } from './utils/dialogChecker'; @@ -37,14 +38,7 @@ function ExtractLgTemplates(dialog): string[] { return true; } targets.forEach(target => { - // match a template name match a temlate func e.g. `showDate()` - // eslint-disable-next-line security/detect-unsafe-regex - const reg = /\[([A-Za-z_][-\w]+)(\(.*\))?\]/g; - let matchResult; - while ((matchResult = reg.exec(target)) !== null) { - const templateName = matchResult[1]; - templates.push(templateName); - } + templates.push(...extractLgTemplateNames(target)); }); } return false; From 236b2e91e134edf0ccc6f160f9054f0ee91a5ecc Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 20:06:02 +0800 Subject: [PATCH 10/42] migrate: LgEditorWidget --- .../obiformeditor/src/Form/widgets/LgEditorWidget.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx index 0c12e8e9fc..a4ecc58170 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx @@ -3,6 +3,7 @@ import React, { useState, useMemo, useLayoutEffect } from 'react'; import { LgEditor } from '@bfc/code-editor'; +import { LgMetaData } from '@bfc/shared'; import debounce from 'lodash/debounce'; import * as monacoEditor from '@bfcomposer/monaco-editor/esm/vs/editor/editor.api'; @@ -35,7 +36,7 @@ export const LgEditorWidget: React.FC = props => { const { formContext, name, value, height = 250 } = props; const [errorMsg, setErrorMsg] = useState(''); const [editor, setEditor] = useState(); - const lgId = `bfd${name}-${formContext.dialogId}`; + const lgId = new LgMetaData(name, formContext.dialogId || '').toLgTemplateName(); const lgFileId = formContext.currentDialog.lgFile || 'common'; const lgFile = formContext.lgFiles.find(file => file.id === lgFileId); From 6049ebc6150c7a95e82cc6663406970ed0943283 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 20:20:48 +0800 Subject: [PATCH 11/42] migrate: ObiEditor --- .../visual-designer/src/editors/ObiEditor.tsx | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx b/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx index e71ab326cf..8e98e6302e 100644 --- a/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx +++ b/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx @@ -5,7 +5,7 @@ import { jsx } from '@emotion/core'; import { useContext, FC, useEffect, useState, useRef } from 'react'; import { MarqueeSelection, Selection } from 'office-ui-fabric-react/lib/MarqueeSelection'; -import { deleteAction, deleteActions } from '@bfc/shared'; +import { deleteAction, deleteActions, LgTemplateRef, LgMetaData } from '@bfc/shared'; import { NodeEventTypes } from '../constants/NodeEventTypes'; import { KeyboardCommandTypes, KeyboardPrimaryTypes } from '../constants/KeyboardCommandTypes'; @@ -49,12 +49,10 @@ export const ObiEditor: FC = ({ ); const deleteLgTemplates = (lgTemplates: string[]) => { - const lgPattern = /\[(bfd\w+-\d+)\]/; const normalizedLgTemplates = lgTemplates .map(x => { - const matches = lgPattern.exec(x); - if (matches && matches.length === 2) return matches[1]; - return ''; + const lgTemplateRef = LgTemplateRef.parse(x); + return lgTemplateRef ? lgTemplateRef.name : ''; }) .filter(x => !!x); return removeLgTemplates('common', normalizedLgTemplates); @@ -89,16 +87,19 @@ export const ObiEditor: FC = ({ if (eventData.$type === 'PASTE') { handler = e => { // TODO: clean this along with node deletion. - const copyLgTemplateToNewNode = async (lgTemplateName: string, newNodeId: string) => { - const matches = /\[(bfd\w+-(\d+))\]/.exec(lgTemplateName); - if (Array.isArray(matches) && matches.length === 3) { - const originLgId = matches[1]; - const originNodeId = matches[2]; - const newLgId = originLgId.replace(originNodeId, newNodeId); - await copyLgTemplate('common', originLgId, newLgId); - return `[${newLgId}]`; - } - return lgTemplateName; + const copyLgTemplateToNewNode = async (input: string, newNodeId: string) => { + const lgTemplateRef = LgTemplateRef.parse(input); + if (!lgTemplateRef) return input; + + const lgMetadata = LgMetaData.parse(lgTemplateRef.name); + if (!lgMetadata) return input; + + lgMetadata.designerId = newNodeId; + const newLgName = lgMetadata.toLgTemplateName(); + const newLgTemplateRefString = lgMetadata.toLgTemplateRefString(); + + await copyLgTemplate('common', lgTemplateRef.name, newLgName); + return newLgTemplateRefString; }; pasteNodes(data, e.id, e.position, clipboardActions, copyLgTemplateToNewNode).then(dialog => { onChange(dialog); From bd7390b5761bc01ebccd3e23705b4b7a18668066 Mon Sep 17 00:00:00 2001 From: zeye Date: Tue, 26 Nov 2019 20:43:14 +0800 Subject: [PATCH 12/42] let shared lib built before others --- Composer/packages/lib/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Composer/packages/lib/package.json b/Composer/packages/lib/package.json index 8a903bc33b..df559263c1 100644 --- a/Composer/packages/lib/package.json +++ b/Composer/packages/lib/package.json @@ -7,7 +7,7 @@ "build:code-editor": "cd code-editor && yarn build", "build:shared": "cd shared && yarn build", "build:indexers": "cd indexers && yarn build", - "build:all": "concurrently --kill-others-on-fail \"yarn:build:code-editor\" \"yarn:build:shared\" \"yarn:build:indexers\"" + "build:all": "yarn build:shared && concurrently --kill-others-on-fail \"yarn:build:code-editor\" \"yarn:build:indexers\"" }, "author": "", "license": "ISC" From 4a1c52c12682530088f032fa3af0f653eda6d432 Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 18:43:28 +0800 Subject: [PATCH 13/42] rename: patterns.ts -> lgPatterns.ts --- .../packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts | 2 +- .../shared/src/lgUtils/{parsers/patterns.ts => lgPatterns.ts} | 0 .../lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts | 3 +-- .../lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts | 2 +- .../packages/lib/shared/src/lgUtils/parsers/parseLgText.ts | 3 +-- 5 files changed, 4 insertions(+), 6 deletions(-) rename Composer/packages/lib/shared/src/lgUtils/{parsers/patterns.ts => lgPatterns.ts} (100%) diff --git a/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts b/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts index 41482d8000..50b612ed16 100644 --- a/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts +++ b/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License -import { LgTemplateRefPattern } from './parsers/patterns'; +import { LgTemplateRefPattern } from './lgPatterns'; import { LgTemplateName } from './models/stringTypes'; /** diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts b/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts similarity index 100% rename from Composer/packages/lib/shared/src/lgUtils/parsers/patterns.ts rename to Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts index 14bae0bda0..de2f827718 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts @@ -3,8 +3,7 @@ import { LgTemplateName } from '../models/stringTypes'; import LgMetaData from '../models/LgMetaData'; - -import { LgNamePattern } from './patterns'; +import { LgNamePattern } from '../lgPatterns'; export default function parseLgTemplateName(lgTemplateName: LgTemplateName): LgMetaData | null { if (!lgTemplateName) return null; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 3d937772c6..05ada89b94 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -3,8 +3,8 @@ import { LgTemplateRefString } from '../models/stringTypes'; import LgTemplateRef from '../models/LgTemplateRef'; +import { LgTemplateRefPattern } from '../lgPatterns'; -import { LgTemplateRefPattern } from './patterns'; import parseLgParamString from './parseLgParamString'; export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts index e159a72eb4..27413afefc 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts @@ -3,8 +3,7 @@ import { LgText } from '../models/stringTypes'; import LgTemplateRef from '../models/LgTemplateRef'; - -import { LgTextPattern } from './patterns'; +import { LgTextPattern } from '../lgPatterns'; export default function parseLgText(inputString: LgText): LgTemplateRef | null { if (!inputString) return null; From c5cfb5961f8c0c56535db8e5a35d44316d841cbc Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 18:50:42 +0800 Subject: [PATCH 14/42] fix ut: use the lg pattern in indexer file --- Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts b/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts index 2e67844a37..549bd3aab7 100644 --- a/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts +++ b/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts @@ -3,6 +3,6 @@ export const LgNamePattern = `bfd(\\w+)-(\\d+)`; -export const LgTemplateRefPattern = `\\[(.+?)(\\(.*\\))?\\]`; +export const LgTemplateRefPattern = `\\[([A-Za-z_][-\\w]+)(\\(.*\\))?\\]`; export const LgTextPattern = `- (\\[.+\\])`; From e3d30e65383d7b1d0827248a813025d932a2d83a Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 18:51:01 +0800 Subject: [PATCH 15/42] todo: mark up next pr's todo --- .../extensions/obiformeditor/src/Form/fields/TableField.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/Composer/packages/extensions/obiformeditor/src/Form/fields/TableField.tsx b/Composer/packages/extensions/obiformeditor/src/Form/fields/TableField.tsx index a693b0fd32..19ace0c609 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/fields/TableField.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/fields/TableField.tsx @@ -96,6 +96,7 @@ function ItemActions(props: ItemActionsProps) { const item = formData[index]; // @ts-ignore if (item.$type === 'Microsoft.SendActivity' && item.activity && item.activity.indexOf('bfdactivity-') !== -1) { + // TODO: (ze) 'removeLgTemplate' -> 'removeLgTemplateRef', it should accept inputs like '[bfdactivity-1234]' // @ts-ignore formContext.shellApi.removeLgTemplate('common', item.activity.slice(1, item.activity.length - 1)); } From 456d08f6aacfe4b690711e2b7c3166a4d92c0a7e Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 19:04:28 +0800 Subject: [PATCH 16/42] comments: explain lg strings --- .../shared/src/lgUtils/models/stringTypes.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts index a3b62c2f64..f400ad4594 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts @@ -15,3 +15,26 @@ export type LgTemplateRefString = string; * example: 'bfdactivity-123456' */ export type LgTemplateName = string; + +/** + * How we understand LG strings: + 1. LgText + { + "activity": "....", // LgText + "prompt": "....", // LgText + "invalidPrompt": "..." // LgText + } + + 2. LgTemplateRef + '[bfdactivity-1234]' + '[greeting]' + '[greeting(1)]' + + 3. LgTemplateName + 'bfdactivity-1234' in '[bfdactivity-1234]' + 'greeting' in '[greeting(1)]' + + 4. LgMetaData (Composer-only) + 'bfdactivity-1234' => { type: 'activity', designerId: '1234' } // LgMetaData + 'greeting' => NO meta data since its not created by Composer +*/ From e3a9b698a34d340275b8bb8cfa1b3c131af4fa19 Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 19:04:51 +0800 Subject: [PATCH 17/42] enhance ut of parseLgTemplateRef --- .../shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts index 7698765450..afd9238ba7 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts @@ -7,6 +7,7 @@ describe('parseLgTemplateRef', () => { it('should return null when inputs are invalid', () => { expect(parseLgTemplateRef('')).toEqual(null); expect(parseLgTemplateRef('xxx')).toEqual(null); + expect(parseLgTemplateRef('[0]')).toEqual(null); }); it('should return LgTemplateRef when inputs are valid', () => { From c2a69c7582f884322fc202a7686be7c679bce879 Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 20:00:39 +0800 Subject: [PATCH 18/42] do not export parsers --- .../__tests__/lgUtils/parsers/parseLgTemplateName.test.ts | 3 ++- .../__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts | 3 ++- .../shared/__tests__/lgUtils/parsers/parseLgText.test.ts | 3 ++- Composer/packages/lib/shared/src/lgUtils/index.ts | 6 +----- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts index f32e13eb1d..2ab93d2d6d 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateName.test.ts @@ -1,7 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License -import { parseLgTemplateName, LgMetaData } from '../../../src'; +import { LgMetaData } from '../../../src'; +import parseLgTemplateName from '../../../src/lgUtils/parsers/parseLgTemplateName'; describe('parseLgTemplateName', () => { it('should return null when inputs are invalid', () => { diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts index afd9238ba7..47a8ad6ec3 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts @@ -1,7 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License -import { parseLgTemplateRef, LgTemplateRef } from '../../../src'; +import { LgTemplateRef } from '../../../src'; +import parseLgTemplateRef from '../../../src/lgUtils/parsers/parseLgTemplateRef'; describe('parseLgTemplateRef', () => { it('should return null when inputs are invalid', () => { diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts index d96dfb9cb9..e24fdeb00e 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts @@ -1,7 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License -import { parseLgText, LgTemplateRef } from '../../../src'; +import parseLgText from '../../../src/lgUtils/parsers/parseLgText'; +import { LgTemplateRef } from '../../../src'; describe('parseLgText', () => { it('should return null when inputs are invalid', () => { diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index ac456e56a4..1858f950f2 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -5,9 +5,5 @@ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; -/** parsers */ -export { default as parseLgTemplateName } from './parsers/parseLgTemplateName'; -export { default as parseLgTemplateRef } from './parsers/parseLgTemplateRef'; -export { default as parseLgText } from './parsers/parseLgText'; - +/** utils */ export { default as extractLgTemplateNames } from './extractLgTemplateNames'; From 1353a50ef4d315f397a18e07243643e6debcd9c4 Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 20:10:02 +0800 Subject: [PATCH 19/42] clarify the concept of 'LgText' --- .../lgUtils/parsers/parseLgText.test.ts | 21 ++++++++++++------- .../lib/shared/src/lgUtils/lgPatterns.ts | 2 +- .../shared/src/lgUtils/parsers/parseLgText.ts | 8 +++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts index e24fdeb00e..aea673c89b 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts @@ -2,19 +2,26 @@ // Licensed under the MIT License import parseLgText from '../../../src/lgUtils/parsers/parseLgText'; -import { LgTemplateRef } from '../../../src'; describe('parseLgText', () => { it('should return null when inputs are invalid', () => { + expect(parseLgText(null as any)).toEqual(null); + expect(parseLgText({} as any)).toEqual(null); expect(parseLgText('')).toEqual(null); - expect(parseLgText('xxx')).toEqual(null); - expect(parseLgText('[bfdactivity-1234]')).toEqual(null); + expect(parseLgText('hello')).toEqual(null); }); it('should return LgTemplateRef when inputs are valid', () => { - const result = parseLgText('- [bfdactivity-123456]'); - expect(result).toBeInstanceOf(LgTemplateRef); - expect((result as LgTemplateRef).name).toEqual('bfdactivity-123456'); - expect((result as LgTemplateRef).parameters).toEqual(undefined); + expect(parseLgText('-')).toEqual(''); + expect(parseLgText('-hi')).toEqual('hi'); + expect(parseLgText('-[greeting()]')).toEqual('[greeting()]'); + expect(parseLgText('-[bfdactivity-1234]')).toEqual('[bfdactivity-1234]'); + expect(parseLgText('-Hi, [greeting()]')).toEqual('Hi, [greeting()]'); + + expect(parseLgText('- ')).toEqual(''); + expect(parseLgText('- hi')).toEqual('hi'); + expect(parseLgText('- [greeting()]')).toEqual('[greeting()]'); + expect(parseLgText('- [bfdactivity-1234]')).toEqual('[bfdactivity-1234]'); + expect(parseLgText('- Hi, [greeting()]')).toEqual('Hi, [greeting()]'); }); }); diff --git a/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts b/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts index 549bd3aab7..2fb6855a0f 100644 --- a/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts +++ b/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts @@ -5,4 +5,4 @@ export const LgNamePattern = `bfd(\\w+)-(\\d+)`; export const LgTemplateRefPattern = `\\[([A-Za-z_][-\\w]+)(\\(.*\\))?\\]`; -export const LgTextPattern = `- (\\[.+\\])`; +export const LgTextPattern = `^- ?(.*)$`; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts index 27413afefc..2ab2b9964d 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts @@ -2,16 +2,14 @@ // Licensed under the MIT License import { LgText } from '../models/stringTypes'; -import LgTemplateRef from '../models/LgTemplateRef'; import { LgTextPattern } from '../lgPatterns'; -export default function parseLgText(inputString: LgText): LgTemplateRef | null { - if (!inputString) return null; +export default function parseLgText(inputString: LgText): string | null { + if (typeof inputString !== 'string') return null; const results = inputString.match(LgTextPattern); if (Array.isArray(results) && results.length === 2) { - const lgTemplateRefString = results[1]; - return LgTemplateRef.parse(lgTemplateRefString); + return results[1]; } return null; } From f8b4d66c8de82ed753752064e68a8c2e2fd8ac0a Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 21:07:05 +0800 Subject: [PATCH 20/42] implement LgField with UT --- .../__tests__/lgUtils/models/LgField.test.ts | 54 ++++++++++++++++++ .../lgUtils/models/LgTemplateRef.test.ts | 3 - .../packages/lib/shared/src/lgUtils/index.ts | 1 + .../lib/shared/src/lgUtils/models/LgField.ts | 55 +++++++++++++++++++ .../src/lgUtils/models/LgTemplateRef.ts | 6 +- .../src/lgUtils/parsers/parseLgTemplateRef.ts | 2 +- 6 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/models/LgField.ts diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts new file mode 100644 index 0000000000..367056f7bb --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgField, LgTemplateRef } from '../../../src'; + +describe('LgField#', () => { + describe('parse() should work', () => { + it('when inputs a lg content string', () => { + const result = LgField.parse('- hello'); + + expect((result as LgField).type).toEqual('LgText'); + expect((result as LgField).content).toEqual('hello'); + }); + + it('when inputs a lg ref string', () => { + const inputTemplateRef = new LgTemplateRef('greeting'); + const result = LgField.parse(inputTemplateRef.toString()); + + expect((result as LgField).type).toEqual('LgTemplateRef'); + expect((result as LgField).content).toEqual(inputTemplateRef); + }); + + it('when input is plain string', () => { + const result = LgField.parse('hi'); + + expect((result as LgField).type).toEqual('LgText'); + expect((result as LgField).content).toEqual('hi'); + }); + }); + + describe('from() should work', () => { + it('when inputs a template ref object', () => { + const inputRef = new LgTemplateRef('greeting'); + const result = LgField.from(inputRef); + + expect((result as LgField).type).toEqual('LgTemplateRef'); + expect((result as LgField).content).toEqual(inputRef); + }); + }); + + it('toString() should be symmetric', () => { + expect(LgField.parse('').toString()).toEqual('- '); + expect(LgField.parse('-').toString()).toEqual('- '); + + expect(LgField.parse('- hi').toString()).toEqual('- hi'); + expect(LgField.parse('-hi').toString()).toEqual('- hi'); + + expect(LgField.parse('[greeting]').toString()).toEqual('- [greeting]'); + expect(LgField.parse('[bfdactivity-123456]').toString()).toEqual('- [bfdactivity-123456]'); + + expect(LgField.parse('- [greeting]').toString()).toEqual('- [greeting]'); + expect(LgField.parse('-[bfdactivity-123456]').toString()).toEqual('- [bfdactivity-123456]'); + }); +}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts index d7d603cb93..14f67e4c0d 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts @@ -21,15 +21,12 @@ describe('LgTemplateRef', () => { it('can output correct strings', () => { const a = new LgTemplateRef('a', undefined); expect(a.toString()).toEqual('[a]'); - expect(a.toLgText()).toEqual('- [a]'); const b = new LgTemplateRef('b', []); expect(b.toString()).toEqual('[b()]'); - expect(b.toLgText()).toEqual('- [b()]'); const c = new LgTemplateRef('c', ['1', '2']); expect(c.toString()).toEqual('[c(1,2)]'); - expect(c.toLgText()).toEqual('- [c(1,2)]'); }); it('can construct instance via `parse()`', () => { diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index 1858f950f2..c156aef8ec 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -4,6 +4,7 @@ /** models */ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; +export { default as LgField } from './models/LgField'; /** utils */ export { default as extractLgTemplateNames } from './extractLgTemplateNames'; diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts new file mode 100644 index 0000000000..919d57abd9 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import parseLgText from '../parsers/parseLgText'; +import parseLgTemplateRef from '../parsers/parseLgTemplateRef'; + +import LgTemplateRef from './LgTemplateRef'; + +enum LgFieldType { + Ref = 'LgTemplateRef', + LgText = 'LgText', +} + +export default class LgField { + content: string | LgTemplateRef; + type: LgFieldType; + + private constructor(content: string | LgTemplateRef, type: LgFieldType) { + this.content = content; + this.type = type; + } + + static parse(input: string): LgField { + const asLgText = parseLgText(input); + if (asLgText !== null) { + return new LgField(asLgText, LgFieldType.LgText); + } + + const asTemplateRef = parseLgTemplateRef(input); + if (asTemplateRef !== null) { + return new LgField(asTemplateRef, LgFieldType.Ref); + } + + return new LgField(input, LgFieldType.LgText); + } + + static from(lgTemplateRef: LgTemplateRef): LgField | null { + if (lgTemplateRef) { + return new LgField(lgTemplateRef, LgFieldType.Ref); + } + return null; + } + + toString(): string { + if (typeof this.content === 'string') { + return `- ${this.content}`; + } + + if (typeof this.content.toString === 'function') { + return `- ${this.content.toString()}`; + } + + return ''; + } +} diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts index 503de230b9..3fb934d9dc 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts @@ -3,7 +3,7 @@ import parseLgTemplateRef from '../parsers/parseLgTemplateRef'; -import { LgTemplateName, LgTemplateRefString, LgText } from './stringTypes'; +import { LgTemplateName, LgTemplateRefString } from './stringTypes'; export default class LgTemplateRef { name: LgTemplateName; @@ -23,8 +23,4 @@ export default class LgTemplateRef { const paramsSuffix = Array.isArray(this.parameters) ? `(${this.parameters.join(',')})` : ''; return `[${this.name}${paramsSuffix}]`; } - - toLgText(): LgText { - return `- ${this.toString()}`; - } } diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 05ada89b94..882b9d4a61 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -8,7 +8,7 @@ import { LgTemplateRefPattern } from '../lgPatterns'; import parseLgParamString from './parseLgParamString'; export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { - if (!inputString) return null; + if (typeof inputString !== 'string') return null; const results = inputString.match(LgTemplateRefPattern); if (Array.isArray(results) && results.length === 3) { From 82548708c1d5a0b93e6f2a6087f9bdcbc1dda4fc Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 21:30:39 +0800 Subject: [PATCH 21/42] add two judement method in LgField --- .../shared/__tests__/lgUtils/models/LgField.test.ts | 8 ++++---- .../packages/lib/shared/src/lgUtils/models/LgField.ts | 10 +++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts index 367056f7bb..ae0b3d395a 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts @@ -8,7 +8,7 @@ describe('LgField#', () => { it('when inputs a lg content string', () => { const result = LgField.parse('- hello'); - expect((result as LgField).type).toEqual('LgText'); + expect((result as LgField).isLgText()).toBeTruthy(); expect((result as LgField).content).toEqual('hello'); }); @@ -16,14 +16,14 @@ describe('LgField#', () => { const inputTemplateRef = new LgTemplateRef('greeting'); const result = LgField.parse(inputTemplateRef.toString()); - expect((result as LgField).type).toEqual('LgTemplateRef'); + expect((result as LgField).isTemplateRef()).toBeTruthy(); expect((result as LgField).content).toEqual(inputTemplateRef); }); it('when input is plain string', () => { const result = LgField.parse('hi'); - expect((result as LgField).type).toEqual('LgText'); + expect((result as LgField).isLgText()).toBeTruthy(); expect((result as LgField).content).toEqual('hi'); }); }); @@ -33,7 +33,7 @@ describe('LgField#', () => { const inputRef = new LgTemplateRef('greeting'); const result = LgField.from(inputRef); - expect((result as LgField).type).toEqual('LgTemplateRef'); + expect((result as LgField).isTemplateRef()).toBeTruthy(); expect((result as LgField).content).toEqual(inputRef); }); }); diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts index 919d57abd9..4bcdb94bd6 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts @@ -12,8 +12,8 @@ enum LgFieldType { } export default class LgField { + private type: LgFieldType; content: string | LgTemplateRef; - type: LgFieldType; private constructor(content: string | LgTemplateRef, type: LgFieldType) { this.content = content; @@ -52,4 +52,12 @@ export default class LgField { return ''; } + + isTemplateRef(): boolean { + return this.type === LgFieldType.Ref; + } + + isLgText(): boolean { + return this.type === LgFieldType.LgText; + } } From 490cc65a30b5a2df89c23ab75a00c1ed48f757c9 Mon Sep 17 00:00:00 2001 From: zeye Date: Wed, 27 Nov 2019 21:34:53 +0800 Subject: [PATCH 22/42] remove 'toLgText' method in LgMetaData --- .../lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts | 4 ---- .../packages/lib/shared/src/lgUtils/models/LgMetaData.ts | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts index e8ea3f0dbf..7ef0f8b0f2 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts @@ -13,7 +13,6 @@ describe('LgMetaData', () => { expect(instance.toLgTemplateName).toBeDefined(); expect(instance.toLgTemplateRef).toBeDefined(); expect(instance.toLgTemplateRefString).toBeDefined(); - expect(instance.toLgText).toBeDefined(); }); it('can generate correct output strings', () => { @@ -23,9 +22,6 @@ describe('LgMetaData', () => { expect(instance.toLgTemplateRefString()).toEqual('[bfdactivity-123456]'); expect(instance.toLgTemplateRefString(['1', '2'])).toEqual('[bfdactivity-123456(1,2)]'); - - expect(instance.toLgText()).toEqual('- [bfdactivity-123456]'); - expect(instance.toLgText([])).toEqual('- [bfdactivity-123456()]'); }); it('can construct instance via `parse()` method', () => { diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts index a7c543bd4f..f584bfc96f 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts @@ -3,7 +3,7 @@ import parseLgTemplateName from '../parsers/parseLgTemplateName'; -import { LgTemplateName, LgTemplateRefString, LgText } from './stringTypes'; +import { LgTemplateName, LgTemplateRefString } from './stringTypes'; import LgTemplateRef from './LgTemplateRef'; export default class LgMetaData { @@ -30,8 +30,4 @@ export default class LgMetaData { toLgTemplateRefString(lgParams?: string[]): LgTemplateRefString { return this.toLgTemplateRef(lgParams).toString(); } - - toLgText(lgParams?: string[]): LgText { - return this.toLgTemplateRef(lgParams).toLgText(); - } } From fb991d3226c25cbf36282f9ac66d4ee085bcc5b7 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 12:35:24 +0800 Subject: [PATCH 23/42] purify 'LgMetaData' --- .../__tests__/lgUtils/models/LgMetaData.test.ts | 10 ++-------- .../lib/shared/src/lgUtils/models/LgMetaData.ts | 17 ++++++----------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts index 7ef0f8b0f2..1d0061c5f1 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgMetaData.test.ts @@ -9,19 +9,13 @@ describe('LgMetaData', () => { expect(instance.type).toEqual('activity'); expect(instance.designerId).toEqual('123456'); - - expect(instance.toLgTemplateName).toBeDefined(); - expect(instance.toLgTemplateRef).toBeDefined(); - expect(instance.toLgTemplateRefString).toBeDefined(); + expect(instance.toString).toBeDefined(); }); it('can generate correct output strings', () => { const instance = new LgMetaData('activity', '123456'); - expect(instance.toLgTemplateName()).toEqual('bfdactivity-123456'); - - expect(instance.toLgTemplateRefString()).toEqual('[bfdactivity-123456]'); - expect(instance.toLgTemplateRefString(['1', '2'])).toEqual('[bfdactivity-123456(1,2)]'); + expect(instance.toString()).toEqual('bfdactivity-123456'); }); it('can construct instance via `parse()` method', () => { diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts index f584bfc96f..62a602b44e 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts @@ -3,9 +3,12 @@ import parseLgTemplateName from '../parsers/parseLgTemplateName'; -import { LgTemplateName, LgTemplateRefString } from './stringTypes'; -import LgTemplateRef from './LgTemplateRef'; +import { LgTemplateName } from './stringTypes'; +/** + * LgMetaData can be converted from & to Lg name. Such as 'bfdactivity-1234'. + * It's created by Composer, contains designerId and filed type. + */ export default class LgMetaData { type: string; designerId: string; @@ -19,15 +22,7 @@ export default class LgMetaData { return parseLgTemplateName(input); } - toLgTemplateName(): LgTemplateName { + toString(): LgTemplateName { return `bfd${this.type}-${this.designerId}`; } - - toLgTemplateRef(lgParams?: string[]): LgTemplateRef { - return new LgTemplateRef(this.toLgTemplateName(), lgParams); - } - - toLgTemplateRefString(lgParams?: string[]): LgTemplateRefString { - return this.toLgTemplateRef(lgParams).toString(); - } } From 06a591dab86755427a6075196b0ba351582c2f71 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 12:36:04 +0800 Subject: [PATCH 24/42] update LgMetaData usages --- .../visual-designer/src/editors/ObiEditor.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx b/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx index 8e98e6302e..b061cb56a0 100644 --- a/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx +++ b/Composer/packages/extensions/visual-designer/src/editors/ObiEditor.tsx @@ -87,18 +87,18 @@ export const ObiEditor: FC = ({ if (eventData.$type === 'PASTE') { handler = e => { // TODO: clean this along with node deletion. - const copyLgTemplateToNewNode = async (input: string, newNodeId: string) => { - const lgTemplateRef = LgTemplateRef.parse(input); - if (!lgTemplateRef) return input; + const copyLgTemplateToNewNode = async (lgText: string, newNodeId: string) => { + const inputLgRef = LgTemplateRef.parse(lgText); + if (!inputLgRef) return lgText; - const lgMetadata = LgMetaData.parse(lgTemplateRef.name); - if (!lgMetadata) return input; + const inputLgMetaData = LgMetaData.parse(inputLgRef.name); + if (!inputLgMetaData) return lgText; - lgMetadata.designerId = newNodeId; - const newLgName = lgMetadata.toLgTemplateName(); - const newLgTemplateRefString = lgMetadata.toLgTemplateRefString(); + inputLgMetaData.designerId = newNodeId; + const newLgName = inputLgMetaData.toString(); + const newLgTemplateRefString = new LgTemplateRef(newLgName).toString(); - await copyLgTemplate('common', lgTemplateRef.name, newLgName); + await copyLgTemplate('common', inputLgRef.name, newLgName); return newLgTemplateRefString; }; pasteNodes(data, e.id, e.position, clipboardActions, copyLgTemplateToNewNode).then(dialog => { From b7daa7244e4eb8724c047ad6dc7b975551aaa701 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 12:45:38 +0800 Subject: [PATCH 25/42] update stringTypes --- .../packages/lib/shared/src/lgUtils/models/stringTypes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts index f400ad4594..5053a1cdee 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License /** - * example: '- [bfdactivity-123456]' + * example: '- hello' | '[bfdactivity-123456]' */ export type LgText = string; @@ -34,7 +34,7 @@ export type LgTemplateName = string; 'bfdactivity-1234' in '[bfdactivity-1234]' 'greeting' in '[greeting(1)]' - 4. LgMetaData (Composer-only) + 4. LgMetaData (Composer-only, can be converted to LgTemplateName) 'bfdactivity-1234' => { type: 'activity', designerId: '1234' } // LgMetaData 'greeting' => NO meta data since its not created by Composer */ From 9c31854f663512aff3c2f77f2401a78d48491af3 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 12:47:10 +0800 Subject: [PATCH 26/42] remove LgFiled (over abstracted) --- .../__tests__/lgUtils/models/LgField.test.ts | 54 ---------------- .../packages/lib/shared/src/lgUtils/index.ts | 1 - .../lib/shared/src/lgUtils/models/LgField.ts | 63 ------------------- 3 files changed, 118 deletions(-) delete mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts delete mode 100644 Composer/packages/lib/shared/src/lgUtils/models/LgField.ts diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts deleted file mode 100644 index ae0b3d395a..0000000000 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgField.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import { LgField, LgTemplateRef } from '../../../src'; - -describe('LgField#', () => { - describe('parse() should work', () => { - it('when inputs a lg content string', () => { - const result = LgField.parse('- hello'); - - expect((result as LgField).isLgText()).toBeTruthy(); - expect((result as LgField).content).toEqual('hello'); - }); - - it('when inputs a lg ref string', () => { - const inputTemplateRef = new LgTemplateRef('greeting'); - const result = LgField.parse(inputTemplateRef.toString()); - - expect((result as LgField).isTemplateRef()).toBeTruthy(); - expect((result as LgField).content).toEqual(inputTemplateRef); - }); - - it('when input is plain string', () => { - const result = LgField.parse('hi'); - - expect((result as LgField).isLgText()).toBeTruthy(); - expect((result as LgField).content).toEqual('hi'); - }); - }); - - describe('from() should work', () => { - it('when inputs a template ref object', () => { - const inputRef = new LgTemplateRef('greeting'); - const result = LgField.from(inputRef); - - expect((result as LgField).isTemplateRef()).toBeTruthy(); - expect((result as LgField).content).toEqual(inputRef); - }); - }); - - it('toString() should be symmetric', () => { - expect(LgField.parse('').toString()).toEqual('- '); - expect(LgField.parse('-').toString()).toEqual('- '); - - expect(LgField.parse('- hi').toString()).toEqual('- hi'); - expect(LgField.parse('-hi').toString()).toEqual('- hi'); - - expect(LgField.parse('[greeting]').toString()).toEqual('- [greeting]'); - expect(LgField.parse('[bfdactivity-123456]').toString()).toEqual('- [bfdactivity-123456]'); - - expect(LgField.parse('- [greeting]').toString()).toEqual('- [greeting]'); - expect(LgField.parse('-[bfdactivity-123456]').toString()).toEqual('- [bfdactivity-123456]'); - }); -}); diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index c156aef8ec..1858f950f2 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -4,7 +4,6 @@ /** models */ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; -export { default as LgField } from './models/LgField'; /** utils */ export { default as extractLgTemplateNames } from './extractLgTemplateNames'; diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts deleted file mode 100644 index 4bcdb94bd6..0000000000 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgField.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import parseLgText from '../parsers/parseLgText'; -import parseLgTemplateRef from '../parsers/parseLgTemplateRef'; - -import LgTemplateRef from './LgTemplateRef'; - -enum LgFieldType { - Ref = 'LgTemplateRef', - LgText = 'LgText', -} - -export default class LgField { - private type: LgFieldType; - content: string | LgTemplateRef; - - private constructor(content: string | LgTemplateRef, type: LgFieldType) { - this.content = content; - this.type = type; - } - - static parse(input: string): LgField { - const asLgText = parseLgText(input); - if (asLgText !== null) { - return new LgField(asLgText, LgFieldType.LgText); - } - - const asTemplateRef = parseLgTemplateRef(input); - if (asTemplateRef !== null) { - return new LgField(asTemplateRef, LgFieldType.Ref); - } - - return new LgField(input, LgFieldType.LgText); - } - - static from(lgTemplateRef: LgTemplateRef): LgField | null { - if (lgTemplateRef) { - return new LgField(lgTemplateRef, LgFieldType.Ref); - } - return null; - } - - toString(): string { - if (typeof this.content === 'string') { - return `- ${this.content}`; - } - - if (typeof this.content.toString === 'function') { - return `- ${this.content.toString()}`; - } - - return ''; - } - - isTemplateRef(): boolean { - return this.type === LgFieldType.Ref; - } - - isLgText(): boolean { - return this.type === LgFieldType.LgText; - } -} From 02d4c151ac075f0a99a30748244d5dbdd8900027 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 12:49:56 +0800 Subject: [PATCH 27/42] fix the usage of LgMetaData --- .../obiformeditor/src/Form/widgets/LgEditorWidget.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx index a4ecc58170..834aea92af 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx @@ -36,7 +36,7 @@ export const LgEditorWidget: React.FC = props => { const { formContext, name, value, height = 250 } = props; const [errorMsg, setErrorMsg] = useState(''); const [editor, setEditor] = useState(); - const lgId = new LgMetaData(name, formContext.dialogId || '').toLgTemplateName(); + const lgId = new LgMetaData(name, formContext.dialogId || '').toString(); const lgFileId = formContext.currentDialog.lgFile || 'common'; const lgFile = formContext.lgFiles.find(file => file.id === lgFileId); From 8eb4f40afdf89560542f23929c74fd384e672fe1 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 14:27:09 +0800 Subject: [PATCH 28/42] rename param name to lgTemplateName --- Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts index 62a602b44e..ec23ec67db 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts @@ -18,8 +18,8 @@ export default class LgMetaData { this.designerId = designerId; } - static parse(input: LgTemplateName): LgMetaData | null { - return parseLgTemplateName(input); + static parse(lgTemplateName: LgTemplateName): LgMetaData | null { + return parseLgTemplateName(lgTemplateName); } toString(): LgTemplateName { From 67e091aec9077796d8a5917c7c5ba3cf19adbc91 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 14:30:06 +0800 Subject: [PATCH 29/42] refactor: apply LgTemplateRef to LgEditorWidget --- .../src/Form/widgets/LgEditorWidget.tsx | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx index 834aea92af..2bb16f12a1 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx @@ -3,7 +3,7 @@ import React, { useState, useMemo, useLayoutEffect } from 'react'; import { LgEditor } from '@bfc/code-editor'; -import { LgMetaData } from '@bfc/shared'; +import { LgMetaData, LgTemplateRef } from '@bfc/shared'; import debounce from 'lodash/debounce'; import * as monacoEditor from '@bfcomposer/monaco-editor/esm/vs/editor/editor.api'; @@ -12,16 +12,29 @@ import { FormContext } from '../types'; const LG_HELP = 'https://github.com/microsoft/BotBuilder-Samples/blob/master/experimental/language-generation/docs/lg-file-format.md'; +const tryGetLgMetaDataType = (lgText: string): string | null => { + const lgRef = LgTemplateRef.parse(lgText); + if (lgRef === null) return null; + + const lgMetaData = LgMetaData.parse(lgRef.name); + if (lgMetaData === null) return null; + + return lgMetaData.type; +}; + const getInitialTemplate = (fieldName: string, formData?: string): string => { - let newTemplate = formData || '- '; + let newTemplate = '- '; - if (newTemplate.includes(`bfd${fieldName}-`)) { + const lgText = formData || ''; + if (tryGetLgMetaDataType(lgText) === fieldName) { return ''; - } else if (newTemplate && !newTemplate.startsWith('-')) { - newTemplate = `-${newTemplate}`; } - return newTemplate; + if (lgText && !lgText.startsWith('-')) { + newTemplate = `-${lgText}`; + } + + return lgText; }; interface LgEditorWidgetProps { @@ -36,7 +49,7 @@ export const LgEditorWidget: React.FC = props => { const { formContext, name, value, height = 250 } = props; const [errorMsg, setErrorMsg] = useState(''); const [editor, setEditor] = useState(); - const lgId = new LgMetaData(name, formContext.dialogId || '').toString(); + const lgName = new LgMetaData(name, formContext.dialogId || '').toString(); const lgFileId = formContext.currentDialog.lgFile || 'common'; const lgFile = formContext.lgFiles.find(file => file.id === lgFileId); @@ -44,19 +57,19 @@ export const LgEditorWidget: React.FC = props => { () => debounce((body: string) => { formContext.shellApi - .updateLgTemplate(lgFileId, lgId, body) + .updateLgTemplate(lgFileId, lgName, body) .then(() => setErrorMsg('')) .catch(error => setErrorMsg(error)); }, 500), - [lgId, lgFileId] + [lgName, lgFileId] ); const template = (lgFile && lgFile.templates && lgFile.templates.find(template => { - return template.Name === lgId; + return template.Name === lgName; })) || { - Name: lgId, + Name: lgName, Body: getInitialTemplate(name, value), Parameters: [], Range: { @@ -75,7 +88,7 @@ export const LgEditorWidget: React.FC = props => { } return lgFile.templates.reduce((content, t) => { - if (t.Name === lgId) { + if (t.Name === lgName) { return content; } @@ -95,15 +108,15 @@ export const LgEditorWidget: React.FC = props => { }; const onChange = (newTemplate: string) => { - const [, body] = newTemplate.split(`# ${lgId}\n`); + const [, body] = newTemplate.split(`# ${lgName}\n`); if (formContext.dialogId) { if (body) { updateLgTemplate(body); - props.onChange(`[${lgId}]`); + props.onChange(new LgTemplateRef(lgName).toString()); } else { updateLgTemplate.flush(); - formContext.shellApi.removeLgTemplate(lgFileId, lgId); + formContext.shellApi.removeLgTemplate(lgFileId, lgName); props.onChange(); } } From 67c064f9a2c75da516abaa28bb5c431d608f5a1a Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 14:36:04 +0800 Subject: [PATCH 30/42] set LgRef default parameters to '[]' --- .../shared/__tests__/lgUtils/models/LgTemplateRef.test.ts | 5 +++-- .../__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts | 8 ++------ .../lib/shared/src/lgUtils/models/LgTemplateRef.ts | 6 +++--- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts index 14f67e4c0d..b78986af33 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts @@ -7,7 +7,7 @@ describe('LgTemplateRef', () => { it('can construct an instance via constructor', () => { const a = new LgTemplateRef('a', undefined); expect(a.name).toEqual('a'); - expect(a.parameters).toEqual(undefined); + expect(a.parameters).toEqual([]); const b = new LgTemplateRef('b', []); expect(b.name).toEqual('b'); @@ -20,7 +20,7 @@ describe('LgTemplateRef', () => { it('can output correct strings', () => { const a = new LgTemplateRef('a', undefined); - expect(a.toString()).toEqual('[a]'); + expect(a.toString()).toEqual('[a()]'); const b = new LgTemplateRef('b', []); expect(b.toString()).toEqual('[b()]'); @@ -31,5 +31,6 @@ describe('LgTemplateRef', () => { it('can construct instance via `parse()`', () => { expect(LgTemplateRef.parse('[bfdactivity-123456]')).toBeInstanceOf(LgTemplateRef); + expect(LgTemplateRef.parse('[bfdactivity-123456]')).toBeInstanceOf(LgTemplateRef); }); }); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts index 47a8ad6ec3..7b9fe86e09 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts @@ -13,13 +13,9 @@ describe('parseLgTemplateRef', () => { it('should return LgTemplateRef when inputs are valid', () => { const a = parseLgTemplateRef('[bfdactivity-123456]'); - expect(a).toBeInstanceOf(LgTemplateRef); - expect((a as LgTemplateRef).name).toEqual('bfdactivity-123456'); - expect((a as LgTemplateRef).parameters).toEqual(undefined); + expect(a).toEqual(new LgTemplateRef('bfdactivity-123456')); const b = parseLgTemplateRef('[greeting(1,2)]'); - expect(b).toBeInstanceOf(LgTemplateRef); - expect((b as LgTemplateRef).name).toEqual('greeting'); - expect((b as LgTemplateRef).parameters).toEqual(['1', '2']); + expect(b).toEqual(new LgTemplateRef('greeting', ['1', '2'])); }); }); diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts index 3fb934d9dc..1115454633 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts @@ -8,9 +8,9 @@ import { LgTemplateName, LgTemplateRefString } from './stringTypes'; export default class LgTemplateRef { name: LgTemplateName; - parameters: string[] | undefined; + parameters: string[]; - constructor(name: LgTemplateName, parameters?: string[]) { + constructor(name: LgTemplateName, parameters: string[] = []) { this.name = name; this.parameters = parameters; } @@ -20,7 +20,7 @@ export default class LgTemplateRef { } toString(): LgTemplateRefString { - const paramsSuffix = Array.isArray(this.parameters) ? `(${this.parameters.join(',')})` : ''; + const paramsSuffix = Array.isArray(this.parameters) ? `(${this.parameters.join(',')})` : '()'; return `[${this.name}${paramsSuffix}]`; } } From 31d6c997f308494d9f101a91f4e8fa8e62cc6252 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 14:48:55 +0800 Subject: [PATCH 31/42] refactor: simplify 'getInitialTemplate' --- .../obiformeditor/src/Form/widgets/LgEditorWidget.tsx | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx index 2bb16f12a1..380451df29 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx @@ -23,18 +23,13 @@ const tryGetLgMetaDataType = (lgText: string): string | null => { }; const getInitialTemplate = (fieldName: string, formData?: string): string => { - let newTemplate = '- '; - const lgText = formData || ''; + + // Field content is already a ref created by composer. if (tryGetLgMetaDataType(lgText) === fieldName) { return ''; } - - if (lgText && !lgText.startsWith('-')) { - newTemplate = `-${lgText}`; - } - - return lgText; + return lgText.startsWith('-') ? lgText : `-${lgText}`; }; interface LgEditorWidgetProps { From 48b910b9c13720930dd4da87d6a0a2d1e443e079 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 14:56:07 +0800 Subject: [PATCH 32/42] enrich LgTempateRef test cases --- .../lgUtils/models/LgTemplateRef.test.ts | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts index b78986af33..972e42438b 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/models/LgTemplateRef.test.ts @@ -3,7 +3,7 @@ import { LgTemplateRef } from '../../../src'; -describe('LgTemplateRef', () => { +describe('LgTemplateRef#', () => { it('can construct an instance via constructor', () => { const a = new LgTemplateRef('a', undefined); expect(a.name).toEqual('a'); @@ -29,8 +29,22 @@ describe('LgTemplateRef', () => { expect(c.toString()).toEqual('[c(1,2)]'); }); - it('can construct instance via `parse()`', () => { - expect(LgTemplateRef.parse('[bfdactivity-123456]')).toBeInstanceOf(LgTemplateRef); - expect(LgTemplateRef.parse('[bfdactivity-123456]')).toBeInstanceOf(LgTemplateRef); + describe('parse()', () => { + it('should return null when inputs are invalid', () => { + expect(LgTemplateRef.parse('')).toEqual(null); + expect(LgTemplateRef.parse('xxx')).toEqual(null); + expect(LgTemplateRef.parse('[0]')).toEqual(null); + }); + + it('should return LgTemplateRef when inputs are valid', () => { + const a = LgTemplateRef.parse('[bfdactivity-123456]'); + expect(a).toEqual(new LgTemplateRef('bfdactivity-123456')); + + const a2 = LgTemplateRef.parse('[bfdactivity-123456()]'); + expect(a2).toEqual(new LgTemplateRef('bfdactivity-123456')); + + const b = LgTemplateRef.parse('[greeting(1,2)]'); + expect(b).toEqual(new LgTemplateRef('greeting', ['1', '2'])); + }); }); }); From 284e8ce981e9527beb61c6208fd8660054375eec Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 15:00:15 +0800 Subject: [PATCH 33/42] folder structure --- Composer/packages/lib/shared/src/lgUtils/index.ts | 4 ++-- .../src/lgUtils/{ => parsers}/extractLgTemplateNames.ts | 3 ++- .../lib/shared/src/lgUtils/{ => parsers}/lgPatterns.ts | 0 .../lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts | 3 ++- .../lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts | 2 +- .../packages/lib/shared/src/lgUtils/parsers/parseLgText.ts | 3 ++- 6 files changed, 9 insertions(+), 6 deletions(-) rename Composer/packages/lib/shared/src/lgUtils/{ => parsers}/extractLgTemplateNames.ts (91%) rename Composer/packages/lib/shared/src/lgUtils/{ => parsers}/lgPatterns.ts (100%) diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index 1858f950f2..10016d2550 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -5,5 +5,5 @@ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; -/** utils */ -export { default as extractLgTemplateNames } from './extractLgTemplateNames'; +/** parsers */ +export { default as extractLgTemplateNames } from './parsers/extractLgTemplateNames'; diff --git a/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateNames.ts similarity index 91% rename from Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts rename to Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateNames.ts index 50b612ed16..23822936f9 100644 --- a/Composer/packages/lib/shared/src/lgUtils/extractLgTemplateNames.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateNames.ts @@ -1,8 +1,9 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License +import { LgTemplateName } from '../models/stringTypes'; + import { LgTemplateRefPattern } from './lgPatterns'; -import { LgTemplateName } from './models/stringTypes'; /** * diff --git a/Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/lgPatterns.ts similarity index 100% rename from Composer/packages/lib/shared/src/lgUtils/lgPatterns.ts rename to Composer/packages/lib/shared/src/lgUtils/parsers/lgPatterns.ts diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts index de2f827718..22ac4f8daa 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateName.ts @@ -3,7 +3,8 @@ import { LgTemplateName } from '../models/stringTypes'; import LgMetaData from '../models/LgMetaData'; -import { LgNamePattern } from '../lgPatterns'; + +import { LgNamePattern } from './lgPatterns'; export default function parseLgTemplateName(lgTemplateName: LgTemplateName): LgMetaData | null { if (!lgTemplateName) return null; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 882b9d4a61..4a46f70f7e 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -3,8 +3,8 @@ import { LgTemplateRefString } from '../models/stringTypes'; import LgTemplateRef from '../models/LgTemplateRef'; -import { LgTemplateRefPattern } from '../lgPatterns'; +import { LgTemplateRefPattern } from './lgPatterns'; import parseLgParamString from './parseLgParamString'; export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts index 2ab2b9964d..c656b9b506 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts @@ -2,7 +2,8 @@ // Licensed under the MIT License import { LgText } from '../models/stringTypes'; -import { LgTextPattern } from '../lgPatterns'; + +import { LgTextPattern } from './lgPatterns'; export default function parseLgText(inputString: LgText): string | null { if (typeof inputString !== 'string') return null; From 216d4135ec17ce238d185b80a940afda760d46e0 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 15:20:12 +0800 Subject: [PATCH 34/42] take out string logic into string builders --- .../lib/shared/src/lgUtils/models/LgMetaData.ts | 3 ++- .../shared/src/lgUtils/models/LgTemplateRef.ts | 4 ++-- .../lgUtils/stringBuilders/buildLgParamString.ts | 13 +++++++++++++ .../stringBuilders/buildLgTemplateName.ts | 16 ++++++++++++++++ .../stringBuilders/buildLgTemplateRefString.ts | 15 +++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgParamString.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateName.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateRefString.ts diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts index ec23ec67db..81bf2df7eb 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgMetaData.ts @@ -2,6 +2,7 @@ // Licensed under the MIT License import parseLgTemplateName from '../parsers/parseLgTemplateName'; +import buildLgTemplateName from '../stringBuilders/buildLgTemplateName'; import { LgTemplateName } from './stringTypes'; @@ -23,6 +24,6 @@ export default class LgMetaData { } toString(): LgTemplateName { - return `bfd${this.type}-${this.designerId}`; + return buildLgTemplateName(this); } } diff --git a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts index 1115454633..b784d199a4 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/LgTemplateRef.ts @@ -2,6 +2,7 @@ // Licensed under the MIT License import parseLgTemplateRef from '../parsers/parseLgTemplateRef'; +import buildLgTemplateRefString from '../stringBuilders/buildLgTemplateRefString'; import { LgTemplateName, LgTemplateRefString } from './stringTypes'; @@ -20,7 +21,6 @@ export default class LgTemplateRef { } toString(): LgTemplateRefString { - const paramsSuffix = Array.isArray(this.parameters) ? `(${this.parameters.join(',')})` : '()'; - return `[${this.name}${paramsSuffix}]`; + return buildLgTemplateRefString(this); } } diff --git a/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgParamString.ts b/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgParamString.ts new file mode 100644 index 0000000000..e25412808b --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgParamString.ts @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +/** + * ['1', '2'] => '(1, 2)' + */ +export default function buildLgParamString(parameters: string[]): string { + if (Array.isArray(parameters)) { + return `(${parameters.join(',')})`; + } else { + return '()'; + } +} diff --git a/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateName.ts b/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateName.ts new file mode 100644 index 0000000000..cd1c35cb50 --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateName.ts @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import LgMetaData from '../models/LgMetaData'; +import { LgTemplateName } from '../models/stringTypes'; + +/** + * { type: 'activity', designerId: '1234' } => 'bfdactivity-1234' + * + * @param lgMetaData input metadata + * @returns toString() result of the input object. + */ +export default function buildLgTemplateNameFromLgMetaData(lgMetaData: LgMetaData): LgTemplateName { + const { type, designerId } = lgMetaData; + return `bfd${type}-${designerId}`; +} diff --git a/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateRefString.ts b/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateRefString.ts new file mode 100644 index 0000000000..1ef13c74df --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/stringBuilders/buildLgTemplateRefString.ts @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import LgTemplateRef from '../models/LgTemplateRef'; +import { LgTemplateRefString } from '../models/stringTypes'; + +import buildLgParamString from './buildLgParamString'; + +/** + * { name: 'greeting', parameters: ['1'] } => '[greeting(1)]' + */ +export default function buildLgTemplateRefString(lgTemplateRef: LgTemplateRef): LgTemplateRefString { + const { name, parameters } = lgTemplateRef; + return `[${name}${buildLgParamString(parameters)}]`; +} From d4738e644a3c64a8dbb65cc60f9f9e1d94364336 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 15:29:59 +0800 Subject: [PATCH 35/42] clean: remove parseLgText since it's not referenced --- .../lgUtils/parsers/parseLgText.test.ts | 27 ------------------- .../shared/src/lgUtils/models/stringTypes.ts | 6 ++--- .../shared/src/lgUtils/parsers/lgPatterns.ts | 2 -- .../shared/src/lgUtils/parsers/parseLgText.ts | 16 ----------- 4 files changed, 3 insertions(+), 48 deletions(-) delete mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts delete mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts deleted file mode 100644 index aea673c89b..0000000000 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgText.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import parseLgText from '../../../src/lgUtils/parsers/parseLgText'; - -describe('parseLgText', () => { - it('should return null when inputs are invalid', () => { - expect(parseLgText(null as any)).toEqual(null); - expect(parseLgText({} as any)).toEqual(null); - expect(parseLgText('')).toEqual(null); - expect(parseLgText('hello')).toEqual(null); - }); - - it('should return LgTemplateRef when inputs are valid', () => { - expect(parseLgText('-')).toEqual(''); - expect(parseLgText('-hi')).toEqual('hi'); - expect(parseLgText('-[greeting()]')).toEqual('[greeting()]'); - expect(parseLgText('-[bfdactivity-1234]')).toEqual('[bfdactivity-1234]'); - expect(parseLgText('-Hi, [greeting()]')).toEqual('Hi, [greeting()]'); - - expect(parseLgText('- ')).toEqual(''); - expect(parseLgText('- hi')).toEqual('hi'); - expect(parseLgText('- [greeting()]')).toEqual('[greeting()]'); - expect(parseLgText('- [bfdactivity-1234]')).toEqual('[bfdactivity-1234]'); - expect(parseLgText('- Hi, [greeting()]')).toEqual('Hi, [greeting()]'); - }); -}); diff --git a/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts index 5053a1cdee..2bf9e52061 100644 --- a/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts +++ b/Composer/packages/lib/shared/src/lgUtils/models/stringTypes.ts @@ -2,17 +2,17 @@ // Licensed under the MIT License /** - * example: '- hello' | '[bfdactivity-123456]' + * example: 'hello' | '[bfdactivity-123456]' */ export type LgText = string; /** - * example: '[bfdactivity-123456()]' + * example: '[greetings()]' | '[bfdactivity-123456()]' */ export type LgTemplateRefString = string; /** - * example: 'bfdactivity-123456' + * example: 'greeting' | 'bfdactivity-123456' */ export type LgTemplateName = string; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/lgPatterns.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/lgPatterns.ts index 2fb6855a0f..0e28a41ca5 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/lgPatterns.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/lgPatterns.ts @@ -4,5 +4,3 @@ export const LgNamePattern = `bfd(\\w+)-(\\d+)`; export const LgTemplateRefPattern = `\\[([A-Za-z_][-\\w]+)(\\(.*\\))?\\]`; - -export const LgTextPattern = `^- ?(.*)$`; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts deleted file mode 100644 index c656b9b506..0000000000 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgText.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import { LgText } from '../models/stringTypes'; - -import { LgTextPattern } from './lgPatterns'; - -export default function parseLgText(inputString: LgText): string | null { - if (typeof inputString !== 'string') return null; - - const results = inputString.match(LgTextPattern); - if (Array.isArray(results) && results.length === 2) { - return results[1]; - } - return null; -} From 644ae1cf0d7ee1b3e8ba7252323c59f524dd0796 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 16:24:56 +0800 Subject: [PATCH 36/42] extractLgTemplateNames => extractLgTemplateRefs --- .../lib/indexers/src/dialogIndexer.ts | 4 +-- .../lgUtils/extractLgTemplateRefs.test.ts | 11 ------- .../parsers/extractLgTemplateRefs.test.ts | 16 ++++++++++ .../packages/lib/shared/src/lgUtils/index.ts | 2 +- .../lgUtils/parsers/extractLgTemplateNames.ts | 26 --------------- .../lgUtils/parsers/extractLgTemplateRefs.ts | 32 +++++++++++++++++++ 6 files changed, 51 insertions(+), 40 deletions(-) delete mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts create mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts delete mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateNames.ts create mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts diff --git a/Composer/packages/lib/indexers/src/dialogIndexer.ts b/Composer/packages/lib/indexers/src/dialogIndexer.ts index 6df0035d2c..fb7aa816a6 100644 --- a/Composer/packages/lib/indexers/src/dialogIndexer.ts +++ b/Composer/packages/lib/indexers/src/dialogIndexer.ts @@ -3,7 +3,7 @@ import has from 'lodash/has'; import uniq from 'lodash/uniq'; -import { extractLgTemplateNames } from '@bfc/shared'; +import { extractLgTemplateRefs } from '@bfc/shared'; import { ITrigger, DialogInfo, FileInfo } from './type'; import { DialogChecker } from './utils/dialogChecker'; @@ -38,7 +38,7 @@ function ExtractLgTemplates(dialog): string[] { return true; } targets.forEach(target => { - templates.push(...extractLgTemplateNames(target)); + templates.push(...extractLgTemplateRefs(target).map(x => x.name)); }); } return false; diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts deleted file mode 100644 index cc2b40ee0b..0000000000 --- a/Composer/packages/lib/shared/__tests__/lgUtils/extractLgTemplateRefs.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import { extractLgTemplateNames } from '../../src'; - -describe('extractLgTemplateRefs', () => { - it('can extract lg refs from input string', () => { - expect(extractLgTemplateNames('Hi')).toEqual([]); - expect(extractLgTemplateNames(`-[Greeting], I'm a fancy bot, [Bye]`)).toEqual(['Greeting', 'Bye']); - }); -}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts new file mode 100644 index 0000000000..de1575970e --- /dev/null +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import { LgTemplateRef } from '../../../src'; +import extractLgTemplateRefs from '../../../src/lgUtils/parsers/extractLgTemplateRefs'; + +describe('extractLgTemplateRefs', () => { + it('can extract lg refs from input string', () => { + expect(extractLgTemplateRefs('Hi')).toEqual([]); + expect(extractLgTemplateRefs('[bfdactivity-123456]')).toEqual([new LgTemplateRef('bfdactivity-123456')]); + expect(extractLgTemplateRefs(`-[Greeting], I'm a fancy bot, [Bye]`)).toEqual([ + new LgTemplateRef('Greeting'), + new LgTemplateRef('Bye'), + ]); + }); +}); diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index 10016d2550..8809643f47 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -6,4 +6,4 @@ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; /** parsers */ -export { default as extractLgTemplateNames } from './parsers/extractLgTemplateNames'; +export { default as extractLgTemplateRefs } from './parsers/extractLgTemplateRefs'; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateNames.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateNames.ts deleted file mode 100644 index 23822936f9..0000000000 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateNames.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import { LgTemplateName } from '../models/stringTypes'; - -import { LgTemplateRefPattern } from './lgPatterns'; - -/** - * - * @param text string - * -[Greeting], I'm a fancy bot, [Bye] ---> ['Greeting', 'Bye'] - * - */ -export default function extractLgTemplateNames(text: string): LgTemplateName[] { - const templateNames: string[] = []; - - // eslint-disable-next-line security/detect-non-literal-regexp - const reg = new RegExp(LgTemplateRefPattern, 'g'); - - let matchResult; - while ((matchResult = reg.exec(text)) !== null) { - const templateName = matchResult[1]; - templateNames.push(templateName); - } - return templateNames; -} diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts new file mode 100644 index 0000000000..4fdb1dee6a --- /dev/null +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License + +import LgTemplateRef from '../models/LgTemplateRef'; + +import { LgTemplateRefPattern } from './lgPatterns'; +import parseLgParamString from './parseLgParamString'; + +/** + * + * @param text string + * -[Greeting], I'm a fancy bot, [Bye] ---> ['Greeting', 'Bye'] + * + */ +export default function extractLgTemplateRefs(text: string): LgTemplateRef[] { + const templateRefs: LgTemplateRef[] = []; + + // eslint-disable-next-line security/detect-non-literal-regexp + const reg = new RegExp(LgTemplateRefPattern, 'g'); + + let matchResult; + while ((matchResult = reg.exec(text)) !== null) { + if (Array.isArray(matchResult) && matchResult.length === 3) { + const name = matchResult[1]; + const paramString = matchResult[2]; + + const parameters = parseLgParamString(paramString); + templateRefs.push(new LgTemplateRef(name, parameters)); + } + } + return templateRefs; +} From fc22977a54da63a2d8e30087d5e820b3adbf9697 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 16:30:50 +0800 Subject: [PATCH 37/42] fix a negative case in 'parseLgTemplateRef' --- .../__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts | 1 + .../lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts index 7b9fe86e09..02d96d8728 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts @@ -9,6 +9,7 @@ describe('parseLgTemplateRef', () => { expect(parseLgTemplateRef('')).toEqual(null); expect(parseLgTemplateRef('xxx')).toEqual(null); expect(parseLgTemplateRef('[0]')).toEqual(null); + expect(parseLgTemplateRef('hi, [greeting]. [greeting]')).toEqual(null); }); it('should return LgTemplateRef when inputs are valid', () => { diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 4a46f70f7e..9e28bda953 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -7,10 +7,12 @@ import LgTemplateRef from '../models/LgTemplateRef'; import { LgTemplateRefPattern } from './lgPatterns'; import parseLgParamString from './parseLgParamString'; +const BoundariedLgTemplateRefPattern = `^${LgTemplateRefPattern}$`; + export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { if (typeof inputString !== 'string') return null; - const results = inputString.match(LgTemplateRefPattern); + const results = inputString.match(BoundariedLgTemplateRefPattern); if (Array.isArray(results) && results.length === 3) { const name = results[1]; const lgParams = parseLgParamString(results[2]); From cd0aa328df9e6c2e7c8c56eefddee26d6f6018ae Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 16:34:41 +0800 Subject: [PATCH 38/42] merge extractLgTemplateRefs into 'parseLgTemplateRef' --- .../parsers/extractLgTemplateRefs.test.ts | 16 ---------- .../parsers/parseLgTemplateRef.test.ts | 13 +++++++- .../packages/lib/shared/src/lgUtils/index.ts | 2 +- .../lgUtils/parsers/extractLgTemplateRefs.ts | 32 ------------------- .../src/lgUtils/parsers/parseLgTemplateRef.ts | 25 +++++++++++++++ 5 files changed, 38 insertions(+), 50 deletions(-) delete mode 100644 Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts delete mode 100644 Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts deleted file mode 100644 index de1575970e..0000000000 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/extractLgTemplateRefs.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import { LgTemplateRef } from '../../../src'; -import extractLgTemplateRefs from '../../../src/lgUtils/parsers/extractLgTemplateRefs'; - -describe('extractLgTemplateRefs', () => { - it('can extract lg refs from input string', () => { - expect(extractLgTemplateRefs('Hi')).toEqual([]); - expect(extractLgTemplateRefs('[bfdactivity-123456]')).toEqual([new LgTemplateRef('bfdactivity-123456')]); - expect(extractLgTemplateRefs(`-[Greeting], I'm a fancy bot, [Bye]`)).toEqual([ - new LgTemplateRef('Greeting'), - new LgTemplateRef('Bye'), - ]); - }); -}); diff --git a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts index 02d96d8728..15dc759e62 100644 --- a/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts +++ b/Composer/packages/lib/shared/__tests__/lgUtils/parsers/parseLgTemplateRef.test.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License import { LgTemplateRef } from '../../../src'; -import parseLgTemplateRef from '../../../src/lgUtils/parsers/parseLgTemplateRef'; +import parseLgTemplateRef, { extractLgTemplateRefs } from '../../../src/lgUtils/parsers/parseLgTemplateRef'; describe('parseLgTemplateRef', () => { it('should return null when inputs are invalid', () => { @@ -20,3 +20,14 @@ describe('parseLgTemplateRef', () => { expect(b).toEqual(new LgTemplateRef('greeting', ['1', '2'])); }); }); + +describe('extractLgTemplateRefs', () => { + it('can extract lg refs from input string', () => { + expect(extractLgTemplateRefs('Hi')).toEqual([]); + expect(extractLgTemplateRefs('[bfdactivity-123456]')).toEqual([new LgTemplateRef('bfdactivity-123456')]); + expect(extractLgTemplateRefs(`-[Greeting], I'm a fancy bot, [Bye]`)).toEqual([ + new LgTemplateRef('Greeting'), + new LgTemplateRef('Bye'), + ]); + }); +}); diff --git a/Composer/packages/lib/shared/src/lgUtils/index.ts b/Composer/packages/lib/shared/src/lgUtils/index.ts index 8809643f47..34aa3f9dde 100644 --- a/Composer/packages/lib/shared/src/lgUtils/index.ts +++ b/Composer/packages/lib/shared/src/lgUtils/index.ts @@ -6,4 +6,4 @@ export { default as LgMetaData } from './models/LgMetaData'; export { default as LgTemplateRef } from './models/LgTemplateRef'; /** parsers */ -export { default as extractLgTemplateRefs } from './parsers/extractLgTemplateRefs'; +export { extractLgTemplateRefs } from './parsers/parseLgTemplateRef'; diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts deleted file mode 100644 index 4fdb1dee6a..0000000000 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/extractLgTemplateRefs.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License - -import LgTemplateRef from '../models/LgTemplateRef'; - -import { LgTemplateRefPattern } from './lgPatterns'; -import parseLgParamString from './parseLgParamString'; - -/** - * - * @param text string - * -[Greeting], I'm a fancy bot, [Bye] ---> ['Greeting', 'Bye'] - * - */ -export default function extractLgTemplateRefs(text: string): LgTemplateRef[] { - const templateRefs: LgTemplateRef[] = []; - - // eslint-disable-next-line security/detect-non-literal-regexp - const reg = new RegExp(LgTemplateRefPattern, 'g'); - - let matchResult; - while ((matchResult = reg.exec(text)) !== null) { - if (Array.isArray(matchResult) && matchResult.length === 3) { - const name = matchResult[1]; - const paramString = matchResult[2]; - - const parameters = parseLgParamString(paramString); - templateRefs.push(new LgTemplateRef(name, parameters)); - } - } - return templateRefs; -} diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 9e28bda953..9ccf77d9c8 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -21,3 +21,28 @@ export default function parseLgTemplateRef(inputString: LgTemplateRefString): Lg } return null; } + +/** + * + * @param text string + * -[Greeting], I'm a fancy bot, [Bye] ---> ['Greeting', 'Bye'] + * + */ +export function extractLgTemplateRefs(text: string): LgTemplateRef[] { + const templateRefs: LgTemplateRef[] = []; + + // eslint-disable-next-line security/detect-non-literal-regexp + const reg = new RegExp(LgTemplateRefPattern, 'g'); + + let matchResult; + while ((matchResult = reg.exec(text)) !== null) { + if (Array.isArray(matchResult) && matchResult.length === 3) { + const name = matchResult[1]; + const paramString = matchResult[2]; + + const parameters = parseLgParamString(paramString); + templateRefs.push(new LgTemplateRef(name, parameters)); + } + } + return templateRefs; +} From 6d1648b28ddb3a876230acd35ffac8ea907e7d6f Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 16:41:01 +0800 Subject: [PATCH 39/42] edit comments --- .../lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 9ccf77d9c8..117e3eab79 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -9,6 +9,10 @@ import parseLgParamString from './parseLgParamString'; const BoundariedLgTemplateRefPattern = `^${LgTemplateRefPattern}$`; +/** + * '[greetings()]' => { name: greetings, parameters: []} + * 'hi [greetings()]' => null + */ export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { if (typeof inputString !== 'string') return null; @@ -25,8 +29,7 @@ export default function parseLgTemplateRef(inputString: LgTemplateRefString): Lg /** * * @param text string - * -[Greeting], I'm a fancy bot, [Bye] ---> ['Greeting', 'Bye'] - * + * '-[Greeting], I'm a fancy bot, [Bye]' => [ LgTemplateRef('Greeting'), LgTemplateRef('Bye') ] */ export function extractLgTemplateRefs(text: string): LgTemplateRef[] { const templateRefs: LgTemplateRef[] = []; From 0bda79542ea4307380ba7f142ea11ce90c4e7c57 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 16:55:26 +0800 Subject: [PATCH 40/42] extract common code from parseLgTemplateRef --- .../src/lgUtils/parsers/parseLgTemplateRef.ts | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 117e3eab79..7a493d4a94 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -9,6 +9,17 @@ import parseLgParamString from './parseLgParamString'; const BoundariedLgTemplateRefPattern = `^${LgTemplateRefPattern}$`; +const mapMatchResultToTemplateRef = (matchResult: RegExpMatchArray): LgTemplateRef | null => { + if (matchResult.length !== 3) { + return null; + } + + const name = matchResult[1]; + const lgParams = parseLgParamString(matchResult[2]); + + return new LgTemplateRef(name, lgParams); +}; + /** * '[greetings()]' => { name: greetings, parameters: []} * 'hi [greetings()]' => null @@ -16,14 +27,10 @@ const BoundariedLgTemplateRefPattern = `^${LgTemplateRefPattern}$`; export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { if (typeof inputString !== 'string') return null; - const results = inputString.match(BoundariedLgTemplateRefPattern); - if (Array.isArray(results) && results.length === 3) { - const name = results[1]; - const lgParams = parseLgParamString(results[2]); + const matchResult = inputString.match(BoundariedLgTemplateRefPattern); + if (!matchResult) return null; - return new LgTemplateRef(name, lgParams); - } - return null; + return mapMatchResultToTemplateRef(matchResult); } /** @@ -39,13 +46,10 @@ export function extractLgTemplateRefs(text: string): LgTemplateRef[] { let matchResult; while ((matchResult = reg.exec(text)) !== null) { - if (Array.isArray(matchResult) && matchResult.length === 3) { - const name = matchResult[1]; - const paramString = matchResult[2]; + const ref = mapMatchResultToTemplateRef(matchResult); + if (!ref) continue; - const parameters = parseLgParamString(paramString); - templateRefs.push(new LgTemplateRef(name, parameters)); - } + templateRefs.push(ref); } return templateRefs; } From c7a289fa2a49311ed7f0a1b4d5d2f45a9151b070 Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 16:56:40 +0800 Subject: [PATCH 41/42] clean --- .../lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts index 7a493d4a94..51f60823c3 100644 --- a/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts +++ b/Composer/packages/lib/shared/src/lgUtils/parsers/parseLgTemplateRef.ts @@ -7,8 +7,6 @@ import LgTemplateRef from '../models/LgTemplateRef'; import { LgTemplateRefPattern } from './lgPatterns'; import parseLgParamString from './parseLgParamString'; -const BoundariedLgTemplateRefPattern = `^${LgTemplateRefPattern}$`; - const mapMatchResultToTemplateRef = (matchResult: RegExpMatchArray): LgTemplateRef | null => { if (matchResult.length !== 3) { return null; @@ -27,6 +25,7 @@ const mapMatchResultToTemplateRef = (matchResult: RegExpMatchArray): LgTemplateR export default function parseLgTemplateRef(inputString: LgTemplateRefString): LgTemplateRef | null { if (typeof inputString !== 'string') return null; + const BoundariedLgTemplateRefPattern = `^${LgTemplateRefPattern}$`; const matchResult = inputString.match(BoundariedLgTemplateRefPattern); if (!matchResult) return null; From 17f092909664387a47934e1f35cb09c6a8a0a41a Mon Sep 17 00:00:00 2001 From: zeye Date: Thu, 28 Nov 2019 16:59:24 +0800 Subject: [PATCH 42/42] add a single whitespace aftter '-' in LgEditorWIdget --- .../obiformeditor/src/Form/widgets/LgEditorWidget.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx index 380451df29..fcc073cbdd 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx @@ -29,7 +29,7 @@ const getInitialTemplate = (fieldName: string, formData?: string): string => { if (tryGetLgMetaDataType(lgText) === fieldName) { return ''; } - return lgText.startsWith('-') ? lgText : `-${lgText}`; + return lgText.startsWith('-') ? lgText : `- ${lgText}`; }; interface LgEditorWidgetProps {