diff --git a/modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts b/modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts index f928c3995..bbee6367f 100644 --- a/modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts +++ b/modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts @@ -13,6 +13,7 @@ import { IContainerInfo, } from '../../../types'; import { debug } from '../../../utils/debug'; +import { isJSExpressionFn } from '../../../utils/common'; export interface PluginConfig { fileType: string; @@ -49,6 +50,7 @@ const pluginFactory: BuilderComponentPluginFactory = (config?) => // 过滤掉非法数据(有些场景下会误传入空字符串或 null) if ( !isJSFunction(lifeCycles[lifeCycleName]) && + !isJSExpressionFn(lifeCycles[lifeCycleName]) && !isJSExpression(lifeCycles[lifeCycleName]) ) { return; diff --git a/modules/code-generator/src/plugins/component/rax/jsx.ts b/modules/code-generator/src/plugins/component/rax/jsx.ts index 98c80a492..ddae619cd 100644 --- a/modules/code-generator/src/plugins/component/rax/jsx.ts +++ b/modules/code-generator/src/plugins/component/rax/jsx.ts @@ -75,8 +75,7 @@ const pluginFactory: BuilderComponentPluginFactory = (config?) => // 注意:这里其实隐含了一个假设:schema 中的 componentName 应该是一个有效的 JS 标识符,而且是大写字母打头的 // FIXME: 为了快速修复临时加的逻辑,需要用 pre-process 的方式替代处理。 - const mapComponentNameToAliasOrKeepIt = (componentName: string) => - componentsNameAliasMap.get(componentName) || componentName; + const mapComponentNameToAliasOrKeepIt = (componentName: string) => componentsNameAliasMap.get(componentName) || componentName; // 然后过滤掉所有的别名 chunks next.chunks = next.chunks.filter((chunk) => !isImportAliasDefineChunk(chunk)); diff --git a/modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts b/modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts index bc5fa54ba..c4385017b 100644 --- a/modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts +++ b/modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts @@ -29,6 +29,7 @@ import { generateCompositeType } from '../../../utils/compositeType'; import { parseExpressionConvertThis2Context } from '../../../utils/expressionParser'; import { isValidContainerType } from '../../../utils/schema'; import { REACT_CHUNK_NAME } from './const'; +import { isJSExpressionFn } from '../../../utils/common'; export interface PluginConfig { fileType?: string; @@ -37,6 +38,7 @@ export interface PluginConfig { * 数据源配置 */ datasourceConfig?: { + /** 数据源引擎的版本 */ engineVersion?: string; @@ -188,15 +190,15 @@ const pluginFactory: BuilderComponentPluginFactory = (config?) => export default pluginFactory; function wrapAsFunction(value: IPublicTypeCompositeValue, scope: IScope): IPublicTypeCompositeValue { - if (isJSExpression(value) || isJSFunction(value)) { + if (isJSExpression(value) || isJSFunction(value) || isJSExpressionFn(value)) { return { type: 'JSExpression', - value: `function(){ return ((${value.value}))}`, + value: `function(){ return ((${value.value}))}.bind(this)`, }; } return { type: 'JSExpression', - value: `function(){return((${generateCompositeType(value, scope)}))}`, + value: `function(){return((${generateCompositeType(value, scope)}))}.bind(this)`, }; } diff --git a/modules/code-generator/src/plugins/project/i18n.ts b/modules/code-generator/src/plugins/project/i18n.ts index ae568f972..d1d32ff32 100644 --- a/modules/code-generator/src/plugins/project/i18n.ts +++ b/modules/code-generator/src/plugins/project/i18n.ts @@ -25,7 +25,8 @@ const pluginFactory: BuilderComponentPluginFactory = () => { content: ` const i18nConfig = ${i18nStr}; - let locale = typeof navigator === 'object' && typeof navigator.language === 'string' ? navigator.language : 'zh-CN'; + // let locale = typeof navigator === 'object' && typeof navigator.language === 'string' ? navigator.language : 'zh-CN'; + let locale = 'zh-CN'; const getLocale = () => locale; diff --git a/modules/code-generator/src/utils/common.ts b/modules/code-generator/src/utils/common.ts index cfba393e9..d822fdf81 100644 --- a/modules/code-generator/src/utils/common.ts +++ b/modules/code-generator/src/utils/common.ts @@ -1,3 +1,4 @@ +import type { IPublicTypeJSExpression, IPublicTypeJSFunction } from '@alilc/lowcode-types'; import changeCase from 'change-case'; import short from 'short-uuid'; @@ -39,3 +40,7 @@ export function getStaticExprValue(expr: string): T { // eslint-disable-next-line no-new-func return Function(`"use strict";return (${expr})`)(); } + +export function isJSExpressionFn(data: any): data is IPublicTypeJSFunction { + return data?.type === 'JSExpression' && data?.extType === 'function'; +} \ No newline at end of file diff --git a/modules/code-generator/src/utils/compositeType.ts b/modules/code-generator/src/utils/compositeType.ts index 2e09e2da0..0dd612641 100644 --- a/modules/code-generator/src/utils/compositeType.ts +++ b/modules/code-generator/src/utils/compositeType.ts @@ -16,6 +16,7 @@ import { generateExpression, generateFunction } from './jsExpression'; import { generateJsSlot } from './jsSlot'; import { executeFunctionStack } from './aopHelper'; import { parseExpressionGetKeywords } from './expressionParser'; +import { isJSExpressionFn } from './common'; interface ILegaoVariable { type: 'variable'; @@ -159,7 +160,7 @@ function generateUnknownType( return generateExpression(value, scope); } - if (isJSFunction(value)) { + if (isJSFunction(value) || isJSExpressionFn(value)) { if (options.handlers?.function) { return executeFunctionStack(value, scope, options.handlers.function, genFunction, options); } diff --git a/modules/code-generator/src/utils/dataSource.ts b/modules/code-generator/src/utils/dataSource.ts index cd1035162..5595b8def 100644 --- a/modules/code-generator/src/utils/dataSource.ts +++ b/modules/code-generator/src/utils/dataSource.ts @@ -2,14 +2,18 @@ import changeCase from 'change-case'; import type { IProjectInfo } from '../types/intermediate'; export interface DataSourceDependenciesConfig { + /** 数据源引擎的版本 */ engineVersion?: string; + /** 数据源引擎的包名 */ enginePackage?: string; + /** 数据源 handlers 的版本 */ handlersVersion?: { [key: string]: string; }; + /** 数据源 handlers 的包名 */ handlersPackages?: { [key: string]: string; diff --git a/modules/code-generator/src/utils/jsExpression.ts b/modules/code-generator/src/utils/jsExpression.ts index 1162d0820..40099b1e2 100644 --- a/modules/code-generator/src/utils/jsExpression.ts +++ b/modules/code-generator/src/utils/jsExpression.ts @@ -5,6 +5,7 @@ import * as t from '@babel/types'; import { IPublicTypeJSExpression, IPublicTypeJSFunction, isJSExpression, isJSFunction } from '@alilc/lowcode-types'; import { CodeGeneratorError, IScope } from '../types'; import { transformExpressionLocalRef, ParseError } from './expressionParser'; +import { isJSExpressionFn } from './common'; function parseFunction(content: string): t.FunctionExpression | null { try { @@ -79,7 +80,7 @@ function getBodyStatements(content: string) { } export function isJsCode(value: unknown): boolean { - return isJSExpression(value) || isJSFunction(value); + return isJSExpressionFn(value) || isJSFunction(value); } export function generateExpression(value: any, scope: IScope): string { @@ -96,6 +97,10 @@ export function generateExpression(value: any, scope: IScope): string { throw new CodeGeneratorError('Not a JSExpression'); } +function getFunctionSource(cfg: IPublicTypeJSFunction): string { + return cfg.source || cfg.value || cfg.compiled; +} + export function generateFunction( value: any, config: { @@ -114,19 +119,20 @@ export function generateFunction( ) { if (isJsCode(value)) { const functionCfg = value as IPublicTypeJSFunction; + const functionSource = getFunctionSource(functionCfg); if (config.isMember) { - return transformFuncExpr2MethodMember(config.name || '', functionCfg.value); + return transformFuncExpr2MethodMember(config.name || '', functionSource); } if (config.isBlock) { - return getBodyStatements(functionCfg.value); + return getBodyStatements(functionSource); } if (config.isArrow) { - return getArrowFunction(functionCfg.value); + return getArrowFunction(functionSource); } if (config.isBindExpr) { - return `(${functionCfg.value}).bind(this)`; + return `(${functionSource}).bind(this)`; } - return functionCfg.value; + return functionSource; } throw new CodeGeneratorError('Not a JSFunction or JSExpression'); diff --git a/modules/code-generator/src/utils/schema.ts b/modules/code-generator/src/utils/schema.ts index 509977277..0b8295aac 100644 --- a/modules/code-generator/src/utils/schema.ts +++ b/modules/code-generator/src/utils/schema.ts @@ -13,6 +13,7 @@ import { isJSFunction, } from '@alilc/lowcode-types'; import { CodeGeneratorError } from '../types/error'; +import { isJSExpressionFn } from './common'; export function isContainerSchema(x: any): x is IPublicTypeContainerSchema { return ( @@ -128,6 +129,7 @@ export function handleSubNodes( // IPublicTypeCompositeObject if ( !isJSExpression(value) && + !isJSExpressionFn(value) && !isJSFunction(value) && typeof value === 'object' && value !== null