string.ts

This commit is contained in:
Xu Chang 2022-07-01 17:31:55 +08:00
parent 84c41f417a
commit c98a8868ba
8 changed files with 92 additions and 49 deletions

View File

@ -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')

View File

@ -2,14 +2,15 @@ import { RefAttr } from "./Demand";
import { Geo } from "./Geo";
export declare type RefOrExpression<A> = RefAttr<A> | Expression<A>;
declare type MathType<A> = RefOrExpression<A> | number;
declare type StringType<A> = RefOrExpression<A> | string;
interface Add<A> {
$add: [MathType<A>, MathType<A>];
$add: (MathType<A> | StringType<A>)[];
}
interface Subtract<A> {
$subtract: [MathType<A>, MathType<A>];
}
interface Multiply<A> {
$multiply: [MathType<A>, MathType<A>];
$multiply: (MathType<A>)[];
}
interface Divide<A> {
$divide: [MathType<A>, MathType<A>];

View File

@ -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];

2
lib/utils/string.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
export declare function firstLetterLowerCase(s: string): string;
export declare function firstLetterUpperCase(s: string): string;

11
lib/utils/string.js Normal file
View File

@ -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;

View File

@ -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<string, {
schemaAttrs: Array<ts.PropertySignature>;

View File

@ -9,14 +9,15 @@ export type RefOrExpression<A> = RefAttr<A> | Expression<A>;
// Math
type MathType<A> = RefOrExpression<A> | number;
type StringType<A> = RefOrExpression<A> | string
interface Add<A> {
$add: [MathType<A>, MathType<A>];
$add: (MathType<A> | StringType<A>)[];
};
interface Subtract<A> {
$subtract: [MathType<A>, MathType<A>];
};
interface Multiply<A> {
$multiply: [MathType<A>, MathType<A>];
$multiply: (MathType<A>)[];
};
interface Divide<A> {
$divide: [MathType<A>, MathType<A>];
@ -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];