diff --git a/lib/compiler/schemalBuilder.js b/lib/compiler/schemalBuilder.js index dd09082..abab16c 100644 --- a/lib/compiler/schemalBuilder.js +++ b/lib/compiler/schemalBuilder.js @@ -31,7 +31,7 @@ const lodash_1 = require("lodash"); const ts = __importStar(require("typescript")); const { factory } = ts; const env_1 = require("./env"); -const utils_1 = require("./utils"); +const string_1 = require("../utils/string"); const Schema = {}; const OneToMany = {}; const ManyToOne = {}; @@ -97,7 +97,7 @@ function pushStatementIntoActionAst(moduleName, node, sourceFile) { declarations.forEach((declaration) => { if (ts.isIdentifier(declaration.name) && declaration.name.text.endsWith('ActionDef')) { const { text } = declaration.name; - actionDefName = (0, utils_1.firstLetterLowerCase)(text.slice(0, text.length - 9)); + actionDefName = (0, string_1.firstLetterLowerCase)(text.slice(0, text.length - 9)); } }); } @@ -452,7 +452,7 @@ function analyzeEntity(filename, path, program) { (0, assert_1.default)(ele.literal.text.length < env_1.STRING_LITERAL_MAX_LENGTH, `Relation定义的字符串长度不长于${env_1.STRING_LITERAL_MAX_LENGTH}(${filename},${ele.literal.text})`); }); } - const entityLc = (0, utils_1.firstLetterLowerCase)(moduleName); + const entityLc = (0, string_1.firstLetterLowerCase)(moduleName); const relationEntityName = `User${moduleName}`; const relationSchemaAttrs = [ factory.createPropertySignature(undefined, factory.createIdentifier("user"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("User"), undefined)), @@ -473,7 +473,7 @@ function analyzeEntity(filename, path, program) { (0, assert_1.default)(!localeDef, `【${filename}】locale定义须在Action/State之后`); pushStatementIntoActionAst(moduleName, factory.updateTypeAliasDeclaration(node, node.decorators, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], node.name, node.typeParameters, node.type), sourceFile); if (node.name.text.endsWith('State')) { - states.push((0, utils_1.firstLetterLowerCase)(node.name.text)); + states.push((0, string_1.firstLetterLowerCase)(node.name.text)); } } else if (beforeSchema) { @@ -521,7 +521,7 @@ function analyzeEntity(filename, path, program) { pushStatementIntoActionAst(moduleName, node, sourceFile); const adName = declaration.name.text.slice(0, declaration.name.text.length - 9); const attr = adName.concat('State'); - schemaAttrs.push(factory.createPropertySignature(undefined, factory.createIdentifier((0, utils_1.firstLetterLowerCase)(attr)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(factory.createIdentifier(attr)))); + schemaAttrs.push(factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(attr)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(factory.createIdentifier(attr)))); } else if (declaration.type && (ts.isArrayTypeNode(declaration.type) && ts.isTypeReferenceNode(declaration.type.elementType) @@ -598,7 +598,7 @@ function analyzeEntity(filename, path, program) { throw new Error(`「${filename}」中索引「${indexName}」的属性「${indexAttrName}」定义非法`); } const { type, name } = schemaNode; - const entity = (0, utils_1.firstLetterLowerCase)(moduleName); + const entity = (0, string_1.firstLetterLowerCase)(moduleName); const { [entity]: manyToOneSet } = ManyToOne; if (ts.isTypeReferenceNode(type)) { const { typeName } = type; @@ -759,18 +759,18 @@ function constructSchema(statements, entity) { const foreignKey = `${attrName}Id`; members.push(factory.createPropertySignature(undefined, factory.createIdentifier(foreignKey), questionToken, questionToken ? factory.createUnionTypeNode([ factory.createTypeReferenceNode(factory.createIdentifier('ForeignKey'), [ - factory.createLiteralTypeNode(factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(text2))) + factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(text2))) ]), factory.createLiteralTypeNode(factory.createNull()) ]) : factory.createTypeReferenceNode(factory.createIdentifier('ForeignKey'), [ - factory.createLiteralTypeNode(factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(text2))) + factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(text2))) ]))); } else { // assert(types.includes(text), `${entity}中的属性${name.toString()}有非法的属性类型定义`); // 处理entity这种特殊情况 if (ReversePointerRelations[entity] && attrName === 'entity') { - const entityUnionTypeNode = ReversePointerRelations[entity].map(ele => factory.createLiteralTypeNode(factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(ele)))); + const entityUnionTypeNode = ReversePointerRelations[entity].map(ele => factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(ele)))); if (process.env.COMPLING_AS_LIB) { // 如果是建立 base-domain,还要容纳可能的其它对象引用 entityUnionTypeNode.push(factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)); @@ -806,7 +806,7 @@ function constructSchema(statements, entity) { if (reverseOnes) { reverseOnes.forEach((one) => { referenceEntities.push(one); - members2.push(factory.createPropertySignature(undefined, (0, utils_1.firstLetterLowerCase)(one), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'Schema')))); + members2.push(factory.createPropertySignature(undefined, (0, string_1.firstLetterLowerCase)(one), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'Schema')))); }); } const foreignKeySet = {}; @@ -824,7 +824,7 @@ function constructSchema(statements, entity) { } } for (const entityName in foreignKeySet) { - const entityNameLc = (0, utils_1.firstLetterLowerCase)(entityName); + const entityNameLc = (0, string_1.firstLetterLowerCase)(entityName); foreignKeySet[entityName].forEach((foreignKey) => { const identifier = `${entityNameLc}$${foreignKey}`; members2.push(factory.createPropertySignature(undefined, identifier, factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(factory.createIdentifier("Array"), [factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Schema'), undefined)]))); @@ -992,7 +992,7 @@ function constructFilter(statements, entity) { } } // type AttrFilter = {}; - const eumUnionTypeNode = ReversePointerRelations[entity] && ReversePointerRelations[entity].map(ele => factory.createLiteralTypeNode(factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(ele)))); + const eumUnionTypeNode = ReversePointerRelations[entity] && ReversePointerRelations[entity].map(ele => factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(ele)))); if (process.env.COMPLING_AS_LIB) { eumUnionTypeNode && eumUnionTypeNode.push(factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)); } @@ -1104,7 +1104,7 @@ function constructProjection(statements, entity) { if (ReversePointerRelations[entity]) { ReversePointerRelations[entity].forEach((one) => { const text2 = one === 'Schema' ? entity : one; - properties.push([(0, utils_1.firstLetterLowerCase)(one), false, factory.createTypeReferenceNode(createForeignRef(entity, one, 'Projection')), factory.createTypeReferenceNode(createForeignRef(entity, one, 'ExportProjection'))]); + properties.push([(0, string_1.firstLetterLowerCase)(one), false, factory.createTypeReferenceNode(createForeignRef(entity, one, 'Projection')), factory.createTypeReferenceNode(createForeignRef(entity, one, 'ExportProjection'))]); if (foreignKeyProperties.hasOwnProperty(one)) { foreignKeyProperties[text2].push('entity'); } @@ -1129,20 +1129,20 @@ function constructProjection(statements, entity) { } } for (const entityName in foreignKeySet) { - const entityNameLc = (0, utils_1.firstLetterLowerCase)(entityName); + const entityNameLc = (0, string_1.firstLetterLowerCase)(entityName); foreignKeySet[entityName].forEach((foreignKey) => { const identifier = `${entityNameLc}$${foreignKey}`; properties.push([identifier, false, factory.createIntersectionTypeNode([ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Selection'), undefined), factory.createTypeLiteralNode([ - factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(entityName)))) + factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(entityName)))) ]) ]), factory.createIntersectionTypeNode([ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Exportation'), undefined), factory.createTypeLiteralNode([ - factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(entityName)))) + factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(entityName)))) ]) ]) ]); @@ -1188,7 +1188,7 @@ function constructProjection(statements, entity) { * @param entity */ function constructQuery(statements, entity) { - const entityLc = (0, utils_1.firstLetterLowerCase)(entity); + const entityLc = (0, string_1.firstLetterLowerCase)(entity); /* statements.push( factory.createTypeAliasDeclaration( undefined, @@ -1368,7 +1368,7 @@ function constructSorter(statements, entity) { } if (ReversePointerRelations[entity]) { ReversePointerRelations[entity].forEach((one) => { - members.push(factory.createPropertySignature(undefined, (0, utils_1.firstLetterLowerCase)(one), undefined, factory.createTypeReferenceNode(createForeignRef(entity, one, 'SortAttr')))); + members.push(factory.createPropertySignature(undefined, (0, string_1.firstLetterLowerCase)(one), undefined, factory.createTypeReferenceNode(createForeignRef(entity, one, 'SortAttr')))); }); if (process.env.COMPLING_AS_LIB) { members.push(factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword))); @@ -1447,7 +1447,7 @@ function constructFullAttrs(statements, entity) { } const otmAttrs = []; for (const entityName in foreignKeySet) { - const entityNameLc = (0, utils_1.firstLetterLowerCase)(entityName); + const entityNameLc = (0, string_1.firstLetterLowerCase)(entityName); if (foreignKeySet[entityName].length > 1) { foreignKeySet[entityName].forEach((foreignKey) => { const head = `${entityNameLc}s$${foreignKey}`; @@ -1568,14 +1568,14 @@ function constructActions(statements, entity) { reverseOneNodes.push(factory.createTypeLiteralNode([ factory.createPropertySignature(undefined, factory.createIdentifier('entity'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword)), factory.createPropertySignature(undefined, factory.createIdentifier('entityId'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword)), - factory.createPropertySignature(undefined, factory.createIdentifier((0, utils_1.firstLetterLowerCase)(one)), undefined, // 反向指针好像不能为空,以后或许会有特例 by Xc + factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), undefined, // 反向指针好像不能为空,以后或许会有特例 by Xc factory.createTypeReferenceNode(createForeignRef(entity, one, 'CreateSingleOperation'))) ]), factory.createTypeLiteralNode([ factory.createPropertySignature(undefined, factory.createIdentifier('entity'), undefined, // 反向指针好像不能为空,以后或许会有特例 by Xc - factory.createLiteralTypeNode(factory.createStringLiteral(`${(0, utils_1.firstLetterLowerCase)(one)}`))), + factory.createLiteralTypeNode(factory.createStringLiteral(`${(0, string_1.firstLetterLowerCase)(one)}`))), factory.createPropertySignature(undefined, factory.createIdentifier('entityId'), undefined, // 反向指针好像不能为空,以后或许会有特例 by Xc factory.createTypeReferenceNode(factory.createIdentifier("String"), [factory.createLiteralTypeNode(factory.createNumericLiteral("64"))])), - factory.createPropertySignature(undefined, factory.createIdentifier((0, utils_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation'))) + factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation'))) ])); } if (process.env.COMPLING_AS_LIB) { @@ -1599,7 +1599,7 @@ function constructActions(statements, entity) { } if (oneToManySet) { for (const entityName in foreignKeySet) { - const entityNameLc = (0, utils_1.firstLetterLowerCase)(entityName); + const entityNameLc = (0, string_1.firstLetterLowerCase)(entityName); foreignKeySet[entityName].forEach((foreignKey) => { const identifier = `${entityNameLc}$${foreignKey}`; const otmCreateOperationDataNode = factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [ @@ -1714,9 +1714,9 @@ function constructActions(statements, entity) { if (ReversePointerRelations[entity]) { const refEntityLitrals = []; for (const one of ReversePointerRelations[entity]) { - refEntityLitrals.push(factory.createLiteralTypeNode(factory.createStringLiteral(`${(0, utils_1.firstLetterLowerCase)(one)}`))); + refEntityLitrals.push(factory.createLiteralTypeNode(factory.createStringLiteral(`${(0, string_1.firstLetterLowerCase)(one)}`))); reverseOneNodes.push(factory.createTypeLiteralNode([ - factory.createPropertySignature(undefined, factory.createIdentifier((0, utils_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([ + factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([ factory.createTypeReferenceNode(createForeignRef(entity, one, 'CreateSingleOperation')), factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation')), factory.createTypeReferenceNode(createForeignRef(entity, one, 'RemoveOperation')) @@ -1750,7 +1750,7 @@ function constructActions(statements, entity) { } if (oneToManySet) { for (const entityName in foreignKeySet) { - const entityNameLc = (0, utils_1.firstLetterLowerCase)(entityName); + const entityNameLc = (0, string_1.firstLetterLowerCase)(entityName); foreignKeySet[entityName].forEach((foreignKey) => { const identifier = `${entityNameLc}s$${foreignKey}`; const otmCreateOperationDataNode = factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [ @@ -1825,11 +1825,11 @@ function constructActions(statements, entity) { if (ReversePointerRelations[entity]) { const refEntityLitrals = []; for (const one of ReversePointerRelations[entity]) { - refEntityLitrals.push(factory.createLiteralTypeNode(factory.createStringLiteral(`${(0, utils_1.firstLetterLowerCase)(one)}`))); + refEntityLitrals.push(factory.createLiteralTypeNode(factory.createStringLiteral(`${(0, string_1.firstLetterLowerCase)(one)}`))); reverseOneNodes.push(factory.createTypeLiteralNode([ - factory.createPropertySignature(undefined, factory.createIdentifier((0, utils_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation'))) + factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation'))) ]), factory.createTypeLiteralNode([ - factory.createPropertySignature(undefined, factory.createIdentifier((0, utils_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'RemoveOperation'))) + factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'RemoveOperation'))) ])); } if (process.env.COMPLING_AS_LIB) { @@ -1996,7 +1996,7 @@ function outputSubQuery(outputDir, printer) { fromEntites.push(one); const inUnionTypeNode = fromEntites.map(ele => factory.createIntersectionTypeNode([ factory.createTypeReferenceNode(factory.createQualifiedName(factory.createIdentifier(ele), factory.createIdentifier(identifier)), undefined), - factory.createTypeLiteralNode([factory.createPropertySignature(undefined, factory.createIdentifier("entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(ele))))]) + factory.createTypeLiteralNode([factory.createPropertySignature(undefined, factory.createIdentifier("entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(ele))))]) ])); if (process.env.COMPLING_AS_LIB) { // 如果是建立 base,这里要加上额外可能的对象信息 @@ -2018,7 +2018,7 @@ function outputEntityDict(outputDir, printer) { for (const entity in Schema) { // import * as User from '../User/Schema'; statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, factory.createIdentifier("EntityDef"), factory.createIdentifier(entity))])), factory.createStringLiteral(`./${entity}/Schema`))); - const entityLc = (0, utils_1.firstLetterLowerCase)(entity); + const entityLc = (0, string_1.firstLetterLowerCase)(entity); propertySignatures.push(factory.createPropertySignature(undefined, factory.createIdentifier(entityLc), undefined, factory.createTypeReferenceNode(entity))); } if ( /* process.env.COMPLING_AS_LIB */false) { @@ -2046,10 +2046,10 @@ function outputSchema(outputDir, printer) { for (const a in importedFrom) { (0, assert_1.default)(a.endsWith('Action')); const s = a.slice(0, a.length - 6).concat('State'); - if (importedFrom[a] === 'local' && actionDefNames.includes((0, utils_1.firstLetterLowerCase)(a.slice(0, a.length - 6)))) { + if (importedFrom[a] === 'local' && actionDefNames.includes((0, string_1.firstLetterLowerCase)(a.slice(0, a.length - 6)))) { localActions.push(s); } - else if (actionDefNames.includes((0, utils_1.firstLetterLowerCase)(a.slice(0, a.length - 6)))) { + else if (actionDefNames.includes((0, string_1.firstLetterLowerCase)(a.slice(0, a.length - 6)))) { const { moduleSpecifier } = importedFrom[a]; statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([ factory.createImportSpecifier(false, undefined, factory.createIdentifier(s)) @@ -2114,7 +2114,7 @@ function outputAction(outputDir, printer) { if (actionDiff.length > 0) { throw new Error(`action not conform to actionDef: ${actionDiff.join(',')}, entity: ${entity}`); } */ - statements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("ActionDefDict"), undefined, undefined, factory.createObjectLiteralExpression(actionDefNames.map(ele => factory.createPropertyAssignment(factory.createIdentifier(`${ele}State`), factory.createIdentifier(`${(0, utils_1.firstLetterUpperCase)(ele)}ActionDef`))), true))], ts.NodeFlags.Const))); + statements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("ActionDefDict"), undefined, undefined, factory.createObjectLiteralExpression(actionDefNames.map(ele => factory.createPropertyAssignment(factory.createIdentifier(`${ele}State`), factory.createIdentifier(`${(0, string_1.firstLetterUpperCase)(ele)}ActionDef`))), true))], ts.NodeFlags.Const))); /* const result = printer.printNode( ts.EmitHint.Unspecified, factory.createSourceFile(statements, @@ -2127,7 +2127,7 @@ function outputAction(outputDir, printer) { const filename = path_1.default.join(outputDir, entity, 'Action.ts'); (0, fs_1.writeFileSync)(filename, result, { flag: 'w' }); actionDictStatements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, factory.createIdentifier("ActionDefDict"), factory.createIdentifier(entity))])), factory.createStringLiteral(`./${entity}/Action`))); - propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier((0, utils_1.firstLetterLowerCase)(entity)), factory.createIdentifier(entity))); + propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier((0, string_1.firstLetterLowerCase)(entity)), factory.createIdentifier(entity))); } actionDictStatements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("ActionDefDict"), undefined, undefined, factory.createObjectLiteralExpression(propertyAssignments, true))], ts.NodeFlags.Const))); const resultFile = ts.createSourceFile("someFileName.ts", "", ts.ScriptTarget.Latest, /*setParentNodes*/ false, ts.ScriptKind.TS); @@ -2207,7 +2207,7 @@ function constructAttributes(entity) { if (manyToOneItem) { // 外键 name2 = factory.createIdentifier(`${name.text}Id`); - attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("ref")), factory.createPropertyAssignment(factory.createIdentifier("ref"), factory.createStringLiteral((0, utils_1.firstLetterLowerCase)(text2)))); + attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("ref")), factory.createPropertyAssignment(factory.createIdentifier("ref"), factory.createStringLiteral((0, string_1.firstLetterLowerCase)(text2)))); } else { if (text.endsWith('State')) { @@ -2296,8 +2296,8 @@ function outputLocale(outputDir, printer) { const lack = (0, lodash_1.difference)(entities, locales[lng]); throw new Error(`${lng}语言定义中缺少了对象${lack.join(',')}的定义,请检查相应的定义文件`); } - const statements = locales[lng].map((entity) => factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, factory.createIdentifier((0, utils_1.firstLetterLowerCase)(entity)), undefined), factory.createStringLiteral(`../${entity}/locales/${lng}`), undefined)); - statements.push(factory.createExportAssignment(undefined, undefined, undefined, factory.createObjectLiteralExpression(locales[lng].map(ele => factory.createShorthandPropertyAssignment(factory.createIdentifier((0, utils_1.firstLetterLowerCase)(ele)), undefined)), true))); + const statements = locales[lng].map((entity) => factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, factory.createIdentifier((0, string_1.firstLetterLowerCase)(entity)), undefined), factory.createStringLiteral(`../${entity}/locales/${lng}`), undefined)); + statements.push(factory.createExportAssignment(undefined, undefined, undefined, factory.createObjectLiteralExpression(locales[lng].map(ele => factory.createShorthandPropertyAssignment(factory.createIdentifier((0, string_1.firstLetterLowerCase)(ele)), undefined)), true))); const result = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray(statements), ts.createSourceFile("someFileName.ts", "", ts.ScriptTarget.Latest, /*setParentNodes*/ false, ts.ScriptKind.TS)); const filename = path_1.default.join(outputDir, '_locales', `${lng}.ts`); (0, fs_1.writeFileSync)(filename, result, { flag: 'w' }); @@ -2332,9 +2332,9 @@ function outputStorage(outputDir, printer) { const filename = path_1.default.join(outputDir, entity, 'Storage.ts'); (0, fs_1.writeFileSync)(filename, result, { flag: 'w' }); importStatements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([ - factory.createImportSpecifier(false, factory.createIdentifier("desc"), factory.createIdentifier(`${(0, utils_1.firstLetterLowerCase)(entity)}Desc`)) + factory.createImportSpecifier(false, factory.createIdentifier("desc"), factory.createIdentifier(`${(0, string_1.firstLetterLowerCase)(entity)}Desc`)) ])), factory.createStringLiteral(`./${entity}/Storage`), undefined)); - entityAssignments.push(factory.createPropertyAssignment((0, utils_1.firstLetterLowerCase)(entity), factory.createIdentifier(`${(0, utils_1.firstLetterLowerCase)(entity)}Desc`))); + entityAssignments.push(factory.createPropertyAssignment((0, string_1.firstLetterLowerCase)(entity), factory.createIdentifier(`${(0, string_1.firstLetterLowerCase)(entity)}Desc`))); } importStatements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("storageSchema"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("StorageSchema"), [ factory.createTypeReferenceNode('EntityDict') diff --git a/lib/types/Expression.d.ts b/lib/types/Expression.d.ts index 784aae1..9c6b55b 100644 --- a/lib/types/Expression.d.ts +++ b/lib/types/Expression.d.ts @@ -2,14 +2,15 @@ import { RefAttr } from "./Demand"; import { Geo } from "./Geo"; export declare type RefOrExpression = RefAttr | Expression; declare type MathType = RefOrExpression | number; +declare type StringType = RefOrExpression | string; interface Add { - $add: [MathType, MathType]; + $add: (MathType | StringType)[]; } interface Subtract { $subtract: [MathType, MathType]; } interface Multiply { - $multiply: [MathType, MathType]; + $multiply: (MathType)[]; } interface Divide { $divide: [MathType, MathType]; diff --git a/lib/types/Expression.js b/lib/types/Expression.js index d5ec6cb..15d1b25 100644 --- a/lib/types/Expression.js +++ b/lib/types/Expression.js @@ -145,13 +145,24 @@ function execOp(op, params, obscure) { return params[0].includes(params[1]); } case '$add': { - return params[0] + params[1]; + if (typeof params[0] === 'number') { + let result = 0; + params.forEach((ele) => result += ele); + return result; + } + else { + let result = ''; + params.forEach((ele) => result += ele); + return result; + } } case '$subtract': { return params[0] - params[1]; } case '$multiply': { - return params[0] * params[1]; + let result = 1; + params.forEach((ele) => result = result * ele); + return result; } case '$divide': { return params[0] / params[1]; diff --git a/lib/utils/string.d.ts b/lib/utils/string.d.ts new file mode 100644 index 0000000..c75f310 --- /dev/null +++ b/lib/utils/string.d.ts @@ -0,0 +1,2 @@ +export declare function firstLetterLowerCase(s: string): string; +export declare function firstLetterUpperCase(s: string): string; diff --git a/lib/utils/string.js b/lib/utils/string.js new file mode 100644 index 0000000..8e3b992 --- /dev/null +++ b/lib/utils/string.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.firstLetterUpperCase = exports.firstLetterLowerCase = void 0; +function firstLetterLowerCase(s) { + return s.slice(0, 1).toLowerCase().concat(s.slice(1)); +} +exports.firstLetterLowerCase = firstLetterLowerCase; +function firstLetterUpperCase(s) { + return s.slice(0, 1).toUpperCase().concat(s.slice(1)); +} +exports.firstLetterUpperCase = firstLetterUpperCase; diff --git a/src/compiler/schemalBuilder.ts b/src/compiler/schemalBuilder.ts index 860076f..aa839d3 100644 --- a/src/compiler/schemalBuilder.ts +++ b/src/compiler/schemalBuilder.ts @@ -16,7 +16,7 @@ import { NUMERICAL_LITERL_DEFAULT_SCALE, INT_LITERL_DEFAULT_WIDTH, } from './env'; -import { firstLetterLowerCase, firstLetterUpperCase } from './utils'; +import { firstLetterLowerCase, firstLetterUpperCase } from '../utils/string'; const Schema: Record; diff --git a/src/types/Expression.ts b/src/types/Expression.ts index e7929e4..3f35b3f 100644 --- a/src/types/Expression.ts +++ b/src/types/Expression.ts @@ -9,14 +9,15 @@ export type RefOrExpression = RefAttr | Expression; // Math type MathType = RefOrExpression | number; +type StringType = RefOrExpression | string interface Add { - $add: [MathType, MathType]; + $add: (MathType | StringType)[]; }; interface Subtract { $subtract: [MathType, MathType]; }; interface Multiply { - $multiply: [MathType, MathType]; + $multiply: (MathType)[]; }; interface Divide { $divide: [MathType, MathType]; @@ -248,13 +249,30 @@ export function execOp(op: string, params: any, obscure?: boolean): ExpressionCo return params[0].includes(params[1]); } case '$add': { - return params[0] + params[1]; + if (typeof params[0] === 'number') { + let result = 0; + params.forEach( + (ele: number) => result += ele + ); + return result; + } + else { + let result = ''; + params.forEach( + (ele: string) => result += ele + ); + return result; + } } case '$subtract': { return params[0] - params[1]; } case '$multiply': { - return params[0] * params[1]; + let result = 1; + params.forEach( + (ele: number) => result = result * ele + ); + return result; } case '$divide': { return params[0] / params[1]; diff --git a/src/compiler/utils.ts b/src/utils/string.ts similarity index 100% rename from src/compiler/utils.ts rename to src/utils/string.ts