diff --git a/extensions/iceworks-app/CHANGELOG.md b/extensions/iceworks-app/CHANGELOG.md index 867b15c54..ac7d3a337 100644 --- a/extensions/iceworks-app/CHANGELOG.md +++ b/extensions/iceworks-app/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 0.4.10 + +- docs: update text for find component and generate page + ## 0.4.9 - feat: add create component to quick entry diff --git a/extensions/iceworks-app/package.json b/extensions/iceworks-app/package.json index 5ba8941c3..1ad41d782 100644 --- a/extensions/iceworks-app/package.json +++ b/extensions/iceworks-app/package.json @@ -3,7 +3,7 @@ "displayName": "Iceworks Application Viewer", "description": "Quick view your Universal Application(React/Rax/Vue, etc).", "publisher": "iceworks-team", - "version": "0.4.9", + "version": "0.4.10", "engines": { "vscode": "^1.41.0" }, diff --git a/extensions/iceworks-app/src/locales/en-US.json b/extensions/iceworks-app/src/locales/en-US.json index cd441c032..1c8ce6ddf 100644 --- a/extensions/iceworks-app/src/locales/en-US.json +++ b/extensions/iceworks-app/src/locales/en-US.json @@ -13,7 +13,7 @@ "extension.iceworksApp.showEntriesQuickPick.createComponent.detail": "Download coomponent materials to local", "extension.iceworksApp.showEntriesQuickPick.openSettings.label": "Settings", "extension.iceworksApp.showEntriesQuickPick.openSettings.detail": "Set the related functions provided by Iceworks", - "extension.iceworksApp.showEntriesQuickPick.showMaterialDocs.label": "Component Document", + "extension.iceworksApp.showEntriesQuickPick.showMaterialDocs.label": "Find Component", "extension.iceworksApp.showEntriesQuickPick.showMaterialDocs.detail": "Quickly search and browse component documents", "extension.iceworksApp.showEntriesQuickPick.runDebug.label": "Debug", "extension.iceworksApp.showEntriesQuickPick.runDebug.detail": "Debug and Preview the application through VS Code", diff --git a/extensions/iceworks-app/src/locales/zh-CN.json b/extensions/iceworks-app/src/locales/zh-CN.json index ffbb7baeb..d5578bf54 100644 --- a/extensions/iceworks-app/src/locales/zh-CN.json +++ b/extensions/iceworks-app/src/locales/zh-CN.json @@ -3,8 +3,8 @@ "extension.iceworksApp.showEntriesQuickPick.projectCreater.detail": "快速创建多端应用(例如:React/Rax/Vue...)", "extension.iceworksApp.showEntriesQuickPick.generatePage.label": "使用区块组装页面", "extension.iceworksApp.showEntriesQuickPick.generatePage.detail": "通过区块组装的方式生成页面", - "extension.iceworksApp.showEntriesQuickPick.createPage.label": "使用模板配置生成页面", - "extension.iceworksApp.showEntriesQuickPick.createPage.detail": "通过使用模板可视化配置的方式生成页面", + "extension.iceworksApp.showEntriesQuickPick.createPage.label": "使用模板生成页面", + "extension.iceworksApp.showEntriesQuickPick.createPage.detail": "通过可视化配置模板的方式生成页面", "extension.iceworksApp.showEntriesQuickPick.generateComponent.label": "可视化搭建组件", "extension.iceworksApp.showEntriesQuickPick.generateComponent.detail": "通过可视化方式搭建生成组件", "extension.iceworksApp.showEntriesQuickPick.createComponent.label": "下载区块物料到本地", @@ -13,7 +13,7 @@ "extension.iceworksApp.showEntriesQuickPick.materialImport.detail": "通过可视化操作添加组件到应用代码", "extension.iceworksApp.showEntriesQuickPick.openSettings.label": "设置", "extension.iceworksApp.showEntriesQuickPick.openSettings.detail": "设置 Iceworks 提供的相关功能", - "extension.iceworksApp.showEntriesQuickPick.showMaterialDocs.label": "组件文档", + "extension.iceworksApp.showEntriesQuickPick.showMaterialDocs.label": "查找组件", "extension.iceworksApp.showEntriesQuickPick.showMaterialDocs.detail": "快速搜索组件文档并进行浏览", "extension.iceworksApp.showEntriesQuickPick.runDebug.label": "启动调试", "extension.iceworksApp.showEntriesQuickPick.runDebug.detail": "通过 VS Code 调试并预览应用", diff --git a/extensions/iceworks-material-helper/package.nls.json b/extensions/iceworks-material-helper/package.nls.json index 7408cab69..a879f40e9 100644 --- a/extensions/iceworks-material-helper/package.nls.json +++ b/extensions/iceworks-material-helper/package.nls.json @@ -1,6 +1,6 @@ { "iceworksMaterialHelper.commands.start.title": "Iceworks: Import Material", - "iceworksMaterialHelper.commands.showAllMaterialQuickPicks.title": "Iceworks: Search Material Docs", - "iceworksMaterialHelper.commands.showDocumentMaterialQuickPicks.title": "Iceworks: Show Compoents Docs In Current File", + "iceworksMaterialHelper.commands.showAllMaterialQuickPicks.title": "Iceworks: Find Component", + "iceworksMaterialHelper.commands.showDocumentMaterialQuickPicks.title": "Iceworks: Find Components In Current File", "iceworksMaterialHelper.configuration.openInBrowserDescription": "Whether open doc url inside VSCode, this function relys on 「Browser Preview」 extension,you need to install it manually before you can use this function" } diff --git a/extensions/iceworks-material-helper/package.nls.zh-cn.json b/extensions/iceworks-material-helper/package.nls.zh-cn.json index a3871192e..5974a2c88 100644 --- a/extensions/iceworks-material-helper/package.nls.zh-cn.json +++ b/extensions/iceworks-material-helper/package.nls.zh-cn.json @@ -1,6 +1,6 @@ { "iceworksMaterialHelper.commands.start.title": "Iceworks: 添加组件", "iceworksMaterialHelper.commands.showAllMaterialQuickPicks.title": "Iceworks: 查找组件", - "iceworksMaterialHelper.commands.showDocumentMaterialQuickPicks.title": "Iceworks: 展示当前文件的组件文档", + "iceworksMaterialHelper.commands.showDocumentMaterialQuickPicks.title": "Iceworks: 查找当前文件的组件", "iceworksMaterialHelper.configuration.openInBrowserDescription": "是否在 VSCode 中打开网页,这个功能的实现依赖于 「Browser Preview」 插件,您需要手动安装此插件后才能使用这个功能。" } diff --git a/extensions/iceworks-material-helper/src/locales/en-US.json b/extensions/iceworks-material-helper/src/locales/en-US.json index 69311c9c2..5b4e5fbcb 100644 --- a/extensions/iceworks-material-helper/src/locales/en-US.json +++ b/extensions/iceworks-material-helper/src/locales/en-US.json @@ -3,7 +3,7 @@ "extension.iceworksMaterialHelper.getAllDocsInfo.sourceLoading": "Source Loading... Please try again later。", "extension.iceworksMaterialHelper.getComponentQuickPicks.noMaterial": "No material matching this project。", "extension.iceworksMaterialHelper.getComponentQuickPicks.more.label": "More", - "extension.iceworksMaterialHelper.getComponentQuickPicks.more.detail": "Display All Materials Doc", + "extension.iceworksMaterialHelper.getComponentQuickPicks.more.detail": "Display All Components", "extension.iceworksMaterialHelper.getHoverItem.hoverItemLink": "[Docs for <%= componentName %> ](<%= commandUri %>)", "extension.iceworksMaterialHelper.openInBorwser.noBrowserPreview": "You must install「vscode-browser-preview Extension」 to open url in vscode." } diff --git a/extensions/iceworks-material-helper/src/locales/zh-CN.json b/extensions/iceworks-material-helper/src/locales/zh-CN.json index 098f40506..5e17ca21f 100644 --- a/extensions/iceworks-material-helper/src/locales/zh-CN.json +++ b/extensions/iceworks-material-helper/src/locales/zh-CN.json @@ -2,8 +2,8 @@ "extension.iceworksMaterialHelper.extension.title": "添加组件 - Iceworks", "extension.iceworksMaterialHelper.getAllDocsInfo.sourceLoading": "正在加载资源中... 请稍后再试。", "extension.iceworksMaterialHelper.getComponentQuickPicks.noMaterial": "没有找到符合此项目的物料库。", - "extension.iceworksMaterialHelper.getComponentQuickPicks.more.label": "更多物料", - "extension.iceworksMaterialHelper.getComponentQuickPicks.more.detail": "展示所有物料的文档", + "extension.iceworksMaterialHelper.getComponentQuickPicks.more.label": "更多组件", + "extension.iceworksMaterialHelper.getComponentQuickPicks.more.detail": "展示所有的组件", "extension.iceworksMaterialHelper.getHoverItem.hoverItemLink": "[<%= componentName %> 文档](<%= commandUri %>)", "extension.iceworksMaterialHelper.openInBorwser.noBrowserPreview": "你必须先安装 「vscode-browser-preview 插件」 才能在 vscode 内部浏览器中打开。" } diff --git a/extensions/iceworks-ui-builder/CHANGELOG.md b/extensions/iceworks-ui-builder/CHANGELOG.md index ce4e98410..90f951a5c 100644 --- a/extensions/iceworks-ui-builder/CHANGELOG.md +++ b/extensions/iceworks-ui-builder/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 0.1.13 + +- docs: update text for find component and generate page + ## 0.1.12 - fix: fix form style. diff --git a/extensions/iceworks-ui-builder/package.json b/extensions/iceworks-ui-builder/package.json index 60ef39afd..66863a124 100644 --- a/extensions/iceworks-ui-builder/package.json +++ b/extensions/iceworks-ui-builder/package.json @@ -3,7 +3,7 @@ "displayName": "Iceworks UI Builder", "description": "Build UI by low-code way", "publisher": "iceworks-team", - "version": "0.1.12", + "version": "0.1.13", "engines": { "vscode": "^1.41.0" }, diff --git a/extensions/iceworks-ui-builder/package.nls.json b/extensions/iceworks-ui-builder/package.nls.json index 1436ed804..c1d3f5d42 100644 --- a/extensions/iceworks-ui-builder/package.nls.json +++ b/extensions/iceworks-ui-builder/package.nls.json @@ -5,5 +5,5 @@ "iceworksUIBuilder.commands.generateComponent.title": "Iceworks: Generate Component by visualization", "iceworksUIBuilder.commands.createComponent.title": "Iceworks: Download Component Materials", "iceworksUIBuilder.commands.generatePage.title": "Iceworks: Generate Page by assembling", - "iceworksUIBuilder.commands.createPage.title": "Iceworks: Create Page By Templates" + "iceworksUIBuilder.commands.createPage.title": "Iceworks: Generate Page by configure" } diff --git a/extensions/iceworks-ui-builder/package.nls.zh-cn.json b/extensions/iceworks-ui-builder/package.nls.zh-cn.json index d882b7765..8f58dc1b6 100644 --- a/extensions/iceworks-ui-builder/package.nls.zh-cn.json +++ b/extensions/iceworks-ui-builder/package.nls.zh-cn.json @@ -5,5 +5,5 @@ "iceworksUIBuilder.commands.generateComponent.title": "Iceworks: 可视化搭建组件", "iceworksUIBuilder.commands.createComponent.title": "Iceworks: 下载物料到本地", "iceworksUIBuilder.commands.generatePage.title": "Iceworks: 使用区块组装页面", - "iceworksUIBuilder.commands.createPage.title": "Iceworks: 使用模板创建页面" + "iceworksUIBuilder.commands.createPage.title": "Iceworks: 使用模板生成页面" } diff --git a/extensions/iceworks-ui-builder/src/locales/en-US.json b/extensions/iceworks-ui-builder/src/locales/en-US.json index bd72d7f41..6b831c54a 100644 --- a/extensions/iceworks-ui-builder/src/locales/en-US.json +++ b/extensions/iceworks-ui-builder/src/locales/en-US.json @@ -1,6 +1,6 @@ { - "extension.iceworksComponentGenerator.extension.webviewTitle": "Generate Component - Iceworks", - "extension.iceworksComponentBuilder.extension.webviewTitle": "Create Component - Iceworks", - "extension.iceworksPageBuilder.extensnion.webViewTitle": "Generate Page - Iceworks", - "extension.iceworksPageCreator.extensnion.webViewTitle": "Create Page - Iceworks" + "extension.iceworksComponentGenerator.extension.webviewTitle": "Generate Component by visualization - Iceworks", + "extension.iceworksComponentBuilder.extension.webviewTitle": "Download Component Materials - Iceworks", + "extension.iceworksPageBuilder.extensnion.webViewTitle": "Generate Page by assembling - Iceworks", + "extension.iceworksPageCreator.extensnion.webViewTitle": "Generate Page by configure - Iceworks" } diff --git a/extensions/iceworks-ui-builder/src/locales/zh-CN.json b/extensions/iceworks-ui-builder/src/locales/zh-CN.json index e27a7b0df..8203a07cc 100644 --- a/extensions/iceworks-ui-builder/src/locales/zh-CN.json +++ b/extensions/iceworks-ui-builder/src/locales/zh-CN.json @@ -1,6 +1,6 @@ { - "extension.iceworksComponentGenerator.extension.webviewTitle": "生成组件 - Iceworks", - "extension.iceworksComponentBuilder.extension.webviewTitle": "创建组件 - Iceworks", - "extension.iceworksPageBuilder.extensnion.webViewTitle": "生成页面 - Iceworks", - "extension.iceworksPageCreator.extensnion.webViewTitle": "创建页面 - Iceworks" + "extension.iceworksComponentGenerator.extension.webviewTitle": "可视化搭建组件 - Iceworks", + "extension.iceworksComponentBuilder.extension.webviewTitle": "下载区块物料到本地 - Iceworks", + "extension.iceworksPageBuilder.extensnion.webViewTitle": "使用区块组装页面 - Iceworks", + "extension.iceworksPageCreator.extensnion.webViewTitle": "使用模板生成页面 - Iceworks" } diff --git a/extensions/iceworks-ui-builder/web/mocks/page/getTemplateSchema.json b/extensions/iceworks-ui-builder/web/mocks/page/getTemplateSchema.json index 5938e2401..c28b9daab 100644 --- a/extensions/iceworks-ui-builder/web/mocks/page/getTemplateSchema.json +++ b/extensions/iceworks-ui-builder/web/mocks/page/getTemplateSchema.json @@ -1,21 +1,32 @@ { "schema": { - "title": "用户任务列表", - "description": "显示用户信息和用户持有的任务", "type": "object", - "required": ["isShowUser"], + "x-component-props": { + "size": "medium", + "labelAlign": "top", + "labelCol": 7, + "wrapperCol": 12 + }, "properties": { - "isShowUser": { + "invisible": { + "key": "bb", + "type": "string", + "name": "bb", + "visible": false, + "title": "不可见的属性", + "x-component": "input" + }, + "boolean": { "type": "boolean", "title": "布尔值" }, - "title": { + "string": { "type": "string", "title": "字符串", "description": "描述", "x-component": "Input" }, - "userTitle": { + "number": { "type": "number", "title": "数字" }, @@ -24,7 +35,27 @@ "title": "下拉选择", "enum": [1, 2, 3, 4] }, - "datarange": { + "selectWithValue": { + "key": "aa", + "type": "string", + "enum": [ + { + "label": "visible", + "value": true, + "otherInfo": "123" + }, + { + "label": "hidden", + "value": false, + "otherInfo": "321" + } + ], + "default": false, + "name": "aa", + "title": "enum", + "x-component": "select" + }, + "daterange": { "type": "daterange", "title": "日期选择" }, @@ -47,30 +78,429 @@ } } }, + "uri": { + "key": "uri", + "x-component": "input", + "type": "string", + "title": "带有提示的输入框", + "x-component-props": { + "placeholder": "place holder", + "addonTextBefore": "", + "addonTextAfter": "" + }, + "children": [] + }, + "formatter": { + "key": "formatter", + "x-component": "input", + "type": "string", + "title": "带有格式化的输入框", + "x-component-props": { + "placeholder": "", + "addonTextBefore": "", + "addonTextAfter": "", + "trim": true, + "hasClear": true + }, + "children": [] + }, + "password": { + "key": "password", + "type": "password", + "name": "password", + "title": "带密码级别的组件", + "x-props": { + "checkStrength": true + } + }, "array": { "type": "array", - "title": "数组", + "title": "简单数组", + "x-component": "arraytable", + "items": { + "type": "object", + "properties": { + "string": { + "type": "string", + "title": "字符串" + } + } + } + }, + "actionSchema": { + "key": "actionSchema", + "x-component": "arraytable", + "type": "array", + "title": "带有嵌套对象的列表", + "children": [ + { + "type": "object", + "properties": { + "buttonText": { + "x-component": "input", + "type": "string", + "title": "按钮文本", + "key": "buttonText", + "x-component-props": { + "placeholder": "", + "addonTextBefore": "", + "addonTextAfter": "", + "trim": true, + "hasClear": true + }, + "x-rules": [] + }, + "buttonProps": { + "type": "object", + "key": "buttonProps", + "title": "按钮属性", + "x-component-props": { + "size": "medium", + "labelAlign": "left", + "labelTextAlign": "right", + "labelCol": 7, + "wrapperCol": 12 + }, + "properties": { + "stringProp": { + "type": "string" + }, + "numberProp": { + "type": "number" + } + }, + "x-rules": [] + }, + "onClick": { + "x-component": "input", + "type": "string", + "key": "onClick", + "title": "点击动作", + "x-index": 2, + "x-component-props": { + "placeholder": "", + "addonTextBefore": "", + "addonTextAfter": "", + "trim": true, + "hasClear": true + }, + "x-rules": [] + } + } + } + ], + "x-component-props": { + "renderAddition": "添加", + "renderRemove": "删除", + "renderEmpty": "暂无数据" + }, + "x-rules": [], "items": { "type": "object", + "children": [ + { + "x-component": "input", + "type": "string", + "title": "按钮文本", + "key": "buttonText", + "x-component-props": { + "placeholder": "", + "addonTextBefore": "", + "addonTextAfter": "", + "trim": true, + "hasClear": true + }, + "x-rules": [] + }, + { + "type": "object", + "key": "buttonProps", + "title": "按钮属性", + "x-component-props": { + "size": "medium", + "labelAlign": "left", + "labelTextAlign": "right", + "labelCol": 7, + "wrapperCol": 12 + }, + "properties": { + "stringProp": { + "type": "string", + "title": "stringProp" + }, + "numberProp": { + "type": "number", + "title": "numberProp" + } + }, + "x-rules": [] + }, + { + "x-component": "input", + "type": "string", + "key": "onClick", + "title": "点击动作", + "x-component-props": { + "placeholder": "", + "addonTextBefore": "", + "addonTextAfter": "", + "trim": true, + "hasClear": true + }, + "x-rules": [] + } + ], "properties": { - "NO_NAME_FIELD_$0": { - "key": "NO_NAME_FIELD_$0", + "buttonText": { + "key": "buttonText", + "x-component": "input", + "type": "string", + "title": "按钮文本", + "children": [], + "x-component-props": { + "placeholder": "", + "addonTextBefore": "", + "addonTextAfter": "", + "trim": true, + "hasClear": true + }, + "x-rules": [] + }, + "buttonProps": { + "key": "buttonProps", "type": "object", - "name": "NO_NAME_FIELD_$0", + "title": "按钮属性", + "children": [], "x-component-props": { - "labelCol": 6, - "wrapperCol": 8 + "size": "medium", + "labelAlign": "top", + "labelTextAlign": "right", + "labelCol": 7, + "wrapperCol": 12 }, "properties": { - "foo1": { + "stringProp": { "type": "string", - "title": "字段1" + "title": "stringProp", + "x-component-props": { + "labelAlign": "top" + } }, - "userTitle": { + "numberProp": { "type": "number", - "title": "字段2" + "title": "numberProp", + "x-component-props": { + "labelAlign": "top" + } } + }, + "x-rules": [] + }, + "onClick": { + "key": "onClick", + "x-component": "input", + "type": "string", + "title": "点击动作", + "children": [], + "x-component-props": { + "placeholder": "", + "addonTextBefore": "", + "addonTextAfter": "", + "trim": true, + "hasClear": true + }, + "x-rules": [] + } + } + } + }, + "ManyactionSchema": { + "key": "actionSchema", + "x-component": "arraytable", + "type": "array", + "title": "非常多的属性", + "children": [ + { + "type": "object", + "properties": { + "prop1": { + "type": "string", + "key": "prop1" + }, + "prop2": { + "type": "string", + "key": "prop1" + }, + "prop3": { + "type": "string", + "key": "prop1" + }, + "prop4": { + "type": "string", + "key": "prop1" + }, + "prop5": { + "type": "string", + "key": "prop1" + }, + "prop6": { + "type": "string", + "key": "prop1" + }, + "prop7": { + "type": "string", + "key": "prop1" + }, + "prop8": { + "type": "string", + "key": "prop1" + }, + "prop9": { + "type": "string", + "key": "prop1" + }, + "prop10": { + "type": "string", + "key": "prop1" + }, + "prop11": { + "type": "string", + "key": "prop1" + } + } + } + ], + "x-component-props": { + "renderAddition": "添加", + "renderRemove": "删除", + "renderEmpty": "暂无数据" + }, + "x-rules": [], + "items": { + "type": "object", + "children": [ + { + "prop1": { + "type": "string", + "key": "prop1" + } + }, + { + "prop2": { + "type": "string", + "key": "prop1" + } + }, + { + "prop3": { + "type": "string", + "key": "prop1" } + }, + { + "prop4": { + "type": "string", + "key": "prop1" + } + }, + { + "prop5": { + "type": "string", + "key": "prop1" + } + }, + { + "prop6": { + "type": "string", + "key": "prop1" + } + }, + { + "prop7": { + "type": "string", + "key": "prop1" + } + }, + { + "prop8": { + "type": "string", + "key": "prop1" + } + }, + { + "prop9": { + "type": "string", + "key": "prop1" + } + }, + { + "prop10": { + "type": "string", + "key": "prop1" + } + }, + { + "prop11": { + "type": "string", + "key": "prop1" + } + } + ], + "properties": { + "prop1": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop2": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop3": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop4": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop5": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop6": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop7": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop8": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop9": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop10": { + "type": "string", + "key": "prop1", + "title": "props" + }, + "prop11": { + "type": "string", + "key": "prop1", + "title": "props" } } } diff --git a/extensions/iceworks-ui-builder/web/src/pages/PageCreator/configForm.tsx b/extensions/iceworks-ui-builder/web/src/pages/PageCreator/configForm.tsx index bb4243bb8..e4aae407c 100644 --- a/extensions/iceworks-ui-builder/web/src/pages/PageCreator/configForm.tsx +++ b/extensions/iceworks-ui-builder/web/src/pages/PageCreator/configForm.tsx @@ -11,6 +11,13 @@ import callService from '../../callService'; nextComponents.setup(); +const tmpComponents = {}; +forIn(nextComponents, (value, key) => { + if (key !== 'setup') { + tmpComponents[key] = value; + } +}); + export default ({ templateSchema, originResetData, @@ -26,16 +33,8 @@ export default ({ const [routerConfig, setRouterConfig] = useState([]); const [isConfigurableRouter, setIsConfigurableRouter] = useState(true); const [templateData, setTemplateData] = useState({}); - const [components, setComponents] = useState({}); useEffect(() => { - const tmpComponents = {}; - forIn(nextComponents, (value, key) => { - if (key !== 'setup') { - tmpComponents[key] = value; - } - }); - setComponents(tmpComponents); setLoading(false); }, []); @@ -159,7 +158,7 @@ export default ({ intl.formatMessage({ id: 'web.iceworksUIBuilder.pageCreator.defaultDescription' })}

{ getRouterForm(setting); diff --git a/packages/doctor/README.md b/packages/doctor/README.md index cbcea86cd..d674b3355 100644 --- a/packages/doctor/README.md +++ b/packages/doctor/README.md @@ -34,7 +34,7 @@ $ iceworks-doctor -s ./ ## Options -* ignoreDirs, string[] Ignore directories, example ['mock'] . +* ignore, string[] Ignore directories, example ['mock'] . * supportExts, string[] Support file exts, example ['css'] . ## CLI @@ -51,5 +51,5 @@ iceworks-doctor -s ./ Options ```shell -iceworks-doctor -s ./ --ignoreDir types mock --supportExts css json +iceworks-doctor -s ./ --ignore types mock --supportExts css json ``` diff --git a/packages/doctor/bin/iceworks-doctor b/packages/doctor/bin/iceworks-doctor index 87217fbb4..d2adb1a1d 100755 --- a/packages/doctor/bin/iceworks-doctor +++ b/packages/doctor/bin/iceworks-doctor @@ -35,8 +35,8 @@ if (args.help) { if (args.scan) { const options = {}; - if (Array.isArray(args.ignoreDir)) { - options.ignoreDir = args.ignoreDir; + if (Array.isArray(args.ignore)) { + options.ignore = args.ignore; } if (Array.isArray(args.supportExts)) { diff --git a/packages/doctor/bin/options.json b/packages/doctor/bin/options.json index 08042024f..ffb771cab 100644 --- a/packages/doctor/bin/options.json +++ b/packages/doctor/bin/options.json @@ -14,7 +14,7 @@ "desc": "Scan target project directory.", "type": "string" }, - "ignoreDirs": { + "ignore": { "desc": "Ignore directories when scan.", "type": "array" }, diff --git a/packages/doctor/package.json b/packages/doctor/package.json index 472bfe65a..ede9e77d5 100644 --- a/packages/doctor/package.json +++ b/packages/doctor/package.json @@ -1,7 +1,7 @@ { "name": "@iceworks/doctor", "description": "Analyse react/rax projects, troubleshooting and automatically fixing errors", - "version": "0.1.1", + "version": "0.1.3", "keywords": [ "doctor", "analysis", @@ -12,6 +12,7 @@ "iceworks-doctor": "bin/iceworks-doctor" }, "files": [ + "bin/", "lib/" ], "main": "lib/index.js", diff --git a/packages/doctor/src/Scanner.ts b/packages/doctor/src/Scanner.ts index b5dead209..abb274812 100644 --- a/packages/doctor/src/Scanner.ts +++ b/packages/doctor/src/Scanner.ts @@ -1,7 +1,7 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import Scorer from './Scorer'; -import { IScannerOptions, IFileInfo, IScannerReports } from './types/Scanner'; +import { IScannerOptions, IScanOptions, IFileInfo, IScannerReports } from './types/Scanner'; import getEslintReports from './getEslintReports'; import getMaintainabilityReports from './getMaintainabilityReports'; import getRepeatabilityReports from './getRepeatabilityReports'; @@ -16,86 +16,100 @@ export default class Scanner { } // Entry - public async scan(directory: string): Promise { + public async scan(directory: string, options?: IScanOptions): Promise { const reports = {} as IScannerReports; try { - const files: IFileInfo[] = getFiles(directory, this.options.supportExts, this.options.ignoreDirs); - const totalLoc = files.reduce((total, file) => { - return total + file.LoC; - }, 0); - - reports.filesInfo = { - count: files.length, - lines: totalLoc, - }; + const files: IFileInfo[] = getFiles(directory, this.options.supportExts, this.options.ignore); // Calculate Ali eslint - // level waring minus 0.3 point - // level error minus 0.7 point - reports.aliEslint = getEslintReports('eslint-config-ali', 0.3, 0.7, files); + if (!options || options.disableAliEslint !== true) { + reports.aliEslint = getEslintReports( + 'eslint-config-ali', + 0.3, // level waring minus 0.3 point + 0.7, // level error minus 0.7 point + files, + options && options.fix + ); + } - // Process package.json file + // Ali eslint don't check package.json. + // Process package.json file after Ali eslint calculate. let packageObj; - const packageFile = path.join(directory, 'package.json'); - if (fs.existsSync(packageFile)) { - packageObj = fs.readJSONSync(packageFile); - const packageSource = fs.readFileSync(packageFile, 'utf-8'); - files.push({ - path: packageFile, - source: packageSource, - // lines of code - LoC: (packageSource.match(/\n/g) || '').length + 1, - }); + const packageFileInfo = getFiles(path.join(directory, 'package.json'), ['json'])[0]; + if (packageFileInfo) { + packageObj = fs.readJSONSync(packageFileInfo.path); + files.push(packageFileInfo); } + // Set files info + reports.filesInfo = { + count: files.length, + lines: files.reduce((total, file) => total + file.LoC, 0), + }; + // Calculate best practices - // level waring minus 1 point - // level error minus 3 point - reports.bestPractices = getEslintReports('plugin:@iceworks/best-practices/recommended', 1, 3, files); + if (!options || options.disableBestPractices !== true) { + reports.bestPractices = getEslintReports( + 'plugin:@iceworks/best-practices/recommended', + 1, // level waring minus 1 point + 3, // level error minus 3 point + files, + options && options.fix + ); + + // Calculate bonus + const bonus = 2; + if (packageObj) { + const bestPracticesScore = new Scorer({ start: reports.bestPractices.score }); + // recommend-deps-fusion-design + if (packageObj.dependencies && packageObj.dependencies['@alifd/next']) { + bestPracticesScore.plus(bonus); + } + // recommend-typescript + if (packageObj.dependencies && packageObj.dependencies.typescript) { + bestPracticesScore.plus(bonus); + } + // recommend-eslint-config-rax + if (packageObj.devDependencies && packageObj.devDependencies['eslint-config-rax']) { + bestPracticesScore.plus(bonus); + } + + reports.bestPractices.score = bestPracticesScore.getScore(); + } + } // Calculate security practices - // level waring minus 1 point - // level error minus 5 point - reports.securityPractices = getEslintReports('plugin:@iceworks/security-practices/recommended', 1, 5, files); + if (!options || options.disableSecurityPractices !== true) { + reports.securityPractices = getEslintReports( + 'plugin:@iceworks/security-practices/recommended', + 1, // level waring minus 1 point + 5, // level error minus 5 point + files, + options && options.fix + ); + } // Calculate maintainability - reports.maintainability = getMaintainabilityReports(files); - // Calculate repeatability - reports.repeatability = await getRepeatabilityReports( - directory, - this.options.supportExts, - this.options.ignoreDirs - ); - - // Calculate bonus - const bonus = 2; - if (packageObj) { - const bestPracticesScore = new Scorer({ start: reports.bestPractices.score }); - // recommend-deps-fusion-design - if (packageObj.dependencies['@alifd/next']) { - bestPracticesScore.plus(bonus); - } - // recommend-typescript - if (packageObj.dependencies.typescript) { - bestPracticesScore.plus(bonus); - } - // recommend-eslint-config-rax - if (packageObj.devDependencies['eslint-config-rax']) { - bestPracticesScore.plus(bonus); - } + if (!options || options.disableMaintainability !== true) { + reports.maintainability = getMaintainabilityReports(files); + } - reports.bestPractices.score = bestPracticesScore.getScore(); + // Calculate repeatability + if (!options || options.disableRepeatability !== true) { + reports.repeatability = await getRepeatabilityReports(directory, this.options.supportExts, this.options.ignore); } // Calculate total score - reports.score = getFinalScore([ - reports.aliEslint.score, - reports.bestPractices.score, - reports.securityPractices.score, - reports.maintainability.score, - reports.repeatability.score, - ]); + reports.score = getFinalScore( + [ + (reports.aliEslint || {}).score, + (reports.bestPractices || {}).score, + (reports.securityPractices || {}).score, + (reports.maintainability || {}).score, + (reports.repeatability || {}).score, + ].filter((score) => !isNaN(score)) + ); } catch (error) { // ignore console.log(error); diff --git a/packages/doctor/src/Scorer.ts b/packages/doctor/src/Scorer.ts index 57fb1a589..ec09da746 100644 --- a/packages/doctor/src/Scorer.ts +++ b/packages/doctor/src/Scorer.ts @@ -11,7 +11,7 @@ export default class Scanner { constructor(options = {} as IScorerOptions) { this.highestScore = options.highestScore || 100; - this.lowestScore = options.lowestScore || 0; + this.lowestScore = options.lowestScore || 30; this.digits = options.digits || 2; this.currentScore = options.start || this.highestScore; @@ -28,16 +28,19 @@ export default class Scanner { } public getAverage(list: number[]): number { - let sum = 0; - - // Calculate average without max and min - list.sort((a, b) => a - b); - list.pop(); - list.shift(); - - list.forEach((num) => (sum += num)); - this.currentScore = sum / list.length; - + if (list.length) { + let sum = 0; + + if (list.length > 3) { + // Calculate average without max and min + list.sort((a, b) => a - b); + list.pop(); + list.shift(); + } + + list.forEach((num) => (sum += num)); + this.currentScore = sum / list.length; + } return this.getScore(); } diff --git a/packages/doctor/src/getEslintReports.ts b/packages/doctor/src/getEslintReports.ts index 6e55176ea..45c311240 100644 --- a/packages/doctor/src/getEslintReports.ts +++ b/packages/doctor/src/getEslintReports.ts @@ -6,7 +6,8 @@ export default function getBestPracticesReports( extendsConfigName: string, warningWeight: number, errorWeight: number, - files: IFileInfo[] + files: IFileInfo[], + fix?: boolean ): IEslintReports { let warningScore = 0; let errorScore = 0; @@ -17,6 +18,8 @@ export default function getBestPracticesReports( baseConfig: { extends: extendsConfigName, }, + cwd: __dirname, + fix: !!fix, useEslintrc: false, }); diff --git a/packages/doctor/src/getFiles.ts b/packages/doctor/src/getFiles.ts index fa53223ce..87ea8e7f4 100644 --- a/packages/doctor/src/getFiles.ts +++ b/packages/doctor/src/getFiles.ts @@ -2,28 +2,44 @@ import * as fs from 'fs-extra'; import { glob } from 'glob'; import { IFileInfo } from './types/Scanner'; -// https://www.npmjs.com/package/glob -export default function getFiles(directory: string, supportExts: string[], ignoreDirs?: string[]): IFileInfo[] { +function getFileInfo(filePath: string): IFileInfo { + let source = fs.readFileSync(filePath).toString().trim(); + + // if begins with shebang + if (source[0] === '#' && source[1] === '!') { + source = `//${source}`; + } + + return { + path: filePath, + source, + LoC: (source.match(/\n/g) || '').length + 1, + }; +} + +export default function getFiles(directory: string, supportExts: string[], ignore?: string[]): IFileInfo[] { const options: any = { nodir: true, }; - if (ignoreDirs) { - options.ignore = ignoreDirs.map((ignoreDir) => `${directory}/**/${ignoreDir}/**`); + if (ignore) { + options.ignore = ignore.map((ignoreDir) => `${directory}/**/${ignoreDir}/**`); } - return glob.sync(`${directory}/**/*.+(${supportExts.join('|')})`, options).map((filePath) => { - let source = fs.readFileSync(filePath).toString().trim(); + if (!fs.existsSync(directory)) { + return []; + } - // if begins with shebang - if (source[0] === '#' && source[1] === '!') { - source = `//${source}`; + try { + const stat = fs.statSync(directory); + if (stat.isFile()) { + return [getFileInfo(directory)]; } - return { - path: filePath, - source, - LoC: (source.match(/\n/g) || '').length + 1, - }; - }); + // https://www.npmjs.com/package/glob + return glob.sync(`${directory}/**/*.+(${supportExts.join('|')})`, options).map(getFileInfo); + } catch (e) { + console.log('Get files failed!', e); + return []; + } } diff --git a/packages/doctor/src/getFinalScore.ts b/packages/doctor/src/getFinalScore.ts index 7a5c5c495..fa94b164e 100644 --- a/packages/doctor/src/getFinalScore.ts +++ b/packages/doctor/src/getFinalScore.ts @@ -1,3 +1,5 @@ +import Scorer from './Scorer'; + function getTwoMinNums(arr: number[]): number[] { let a = arr[0]; let b = arr[1]; @@ -17,15 +19,23 @@ function getTwoMinNums(arr: number[]): number[] { return [a, b]; } -// Weighted Average +// Case1: calculate dimensions is 5 +// Weighted Average: // 0.8 (fixed weight, divided equally by 5 dimensions) + 0.2 (dynamic weight, divided equally by the 2 dimensions with the lowest score) // For example, the scores are: 90, 90, 20, 100, 75 (the lowest score is 20 and 75) // 90*0.16+90*0.16+20*0.16+100*0.16+75*0.16 + 20*0.1+75*0.1 = 69.5 +// +// Case2: calculate dimensions less than 5 +// return average export default function getFinalScore(arr: number[]): number { let finalScore = 0; - finalScore += arr.reduce((total, score) => total + score) * 0.16; - finalScore += getTwoMinNums(arr).reduce((total, score) => total + score) * 0.1; + if (arr.length === 5) { + finalScore += arr.reduce((total, score) => total + score) * 0.16; + finalScore += getTwoMinNums(arr).reduce((total, score) => total + score) * 0.1; + } else { + finalScore = new Scorer().getAverage(arr); + } return Number(finalScore.toFixed(2)); } diff --git a/packages/doctor/src/getRepeatabilityReports.ts b/packages/doctor/src/getRepeatabilityReports.ts index 79c2a0cb1..a9b4c1e6c 100644 --- a/packages/doctor/src/getRepeatabilityReports.ts +++ b/packages/doctor/src/getRepeatabilityReports.ts @@ -12,7 +12,7 @@ const tempDir = path.join(__dirname, 'tmp/'); export default async function getRepeatabilityReports( directory: string, supportExts: string[], - ignoreDirs: string[] + ignore: string[] ): Promise { let clones: IClone[] = []; let repetitionPercentage = 0; @@ -23,7 +23,7 @@ export default async function getRepeatabilityReports( supportExts.join(','), directory, '--ignore', - `"${ignoreDirs.map((ignoreDir) => `${path.join(directory, '/')}**/${ignoreDir}/**`).join(',')}"`, + `"${ignore.map((ignoreDir) => `${path.join(directory, '/')}**/${ignoreDir}/**`).join(',')}"`, '--reporters', 'json', '--output', diff --git a/packages/doctor/src/index.ts b/packages/doctor/src/index.ts index cb08ffe6a..8f61f296b 100644 --- a/packages/doctor/src/index.ts +++ b/packages/doctor/src/index.ts @@ -1,9 +1,9 @@ import Scanner from './Scanner'; import { IDoctorOptions } from './types/Doctor'; -import { IScannerReports } from './types/Scanner'; +import { IScanOptions, IScannerReports } from './types/Scanner'; // Ignore directories -const defaultIgnoreDirs = ['build', 'es', 'dist', 'lib', 'node_modules', 'public', 'test', '__tests__']; +const defaultignore = ['build', 'es', 'dist', 'lib', 'node_modules', 'public', 'test', '__tests__']; // Support file exts const defaultSupportExts = ['js', 'jsx', 'ts', 'tsx']; @@ -15,13 +15,13 @@ class Doctor { constructor(options: IDoctorOptions) { this.options = options || {}; this.scanner = new Scanner({ - ignoreDirs: defaultIgnoreDirs.concat(this.options.ignoreDirs || []), + ignore: defaultignore.concat(this.options.ignore || []), supportExts: defaultSupportExts.concat(this.options.supportExts || []), }); } - scan(directory: string): Promise { - return this.scanner.scan(directory); + scan(directory: string, options?: IScanOptions): Promise { + return this.scanner.scan(directory, options); } } diff --git a/packages/doctor/src/types/Doctor.ts b/packages/doctor/src/types/Doctor.ts index 2b087c6f6..80c91e4b2 100644 --- a/packages/doctor/src/types/Doctor.ts +++ b/packages/doctor/src/types/Doctor.ts @@ -1,4 +1,4 @@ export interface IDoctorOptions { - ignoreDirs?: string[]; + ignore?: string[]; supportExts?: string[]; } diff --git a/packages/doctor/src/types/Scanner.ts b/packages/doctor/src/types/Scanner.ts index 305d75e36..345d50872 100644 --- a/packages/doctor/src/types/Scanner.ts +++ b/packages/doctor/src/types/Scanner.ts @@ -1,10 +1,19 @@ import { IClone } from '@jscpd/core'; export interface IScannerOptions { - ignoreDirs: string[]; + ignore: string[]; supportExts: string[]; } +export interface IScanOptions { + fix?: boolean; + disableAliEslint?: boolean; + disableBestPractices?: boolean; + disableSecurityPractices?: boolean; + disableMaintainability?: boolean; + disableRepeatability?: boolean; +} + export interface IFileInfo { path: string; source: string; diff --git a/packages/eslint-plugin-best-practices/package.json b/packages/eslint-plugin-best-practices/package.json index 73515c353..cd401e51b 100644 --- a/packages/eslint-plugin-best-practices/package.json +++ b/packages/eslint-plugin-best-practices/package.json @@ -1,6 +1,6 @@ { "name": "@iceworks/eslint-plugin-best-practices", - "version": "0.1.0", + "version": "0.1.1", "description": "Iceworks doctor best practices eslint plugin.", "files": [ "docs/", diff --git a/packages/eslint-plugin-best-practices/src/rules/recommend-functional-component.ts b/packages/eslint-plugin-best-practices/src/rules/recommend-functional-component.ts index 4f6881c8e..10ebc25b8 100644 --- a/packages/eslint-plugin-best-practices/src/rules/recommend-functional-component.ts +++ b/packages/eslint-plugin-best-practices/src/rules/recommend-functional-component.ts @@ -20,12 +20,14 @@ module.exports = { ClassDeclaration: function handleRequires(node: any) { const name = node.id.name; let superName = ''; - if (node.superClass.name) { - // class xxx extends Component - superName = node.superClass.name; - } else if (node.superClass.property && node.superClass.property.name) { - // class xxx extends React.Component - superName = node.superClass.property.name; + if (node.superClass) { + if (node.superClass.name) { + // class xxx extends Component + superName = node.superClass.name; + } else if (node.superClass.property && node.superClass.property.name) { + // class xxx extends React.Component + superName = node.superClass.property.name; + } } // Class Component diff --git a/packages/eslint-plugin-security-practices/package.json b/packages/eslint-plugin-security-practices/package.json index e4ee3d38b..f66ad6ba5 100644 --- a/packages/eslint-plugin-security-practices/package.json +++ b/packages/eslint-plugin-security-practices/package.json @@ -1,6 +1,6 @@ { "name": "@iceworks/eslint-plugin-security-practices", - "version": "0.1.1", + "version": "0.1.2", "description": "Iceworks doctor security practices eslint plugin.", "files": [ "docs/", diff --git a/packages/eslint-plugin-security-practices/src/configs/recommended.ts b/packages/eslint-plugin-security-practices/src/configs/recommended.ts index ad04dc38d..2409c9cd1 100644 --- a/packages/eslint-plugin-security-practices/src/configs/recommended.ts +++ b/packages/eslint-plugin-security-practices/src/configs/recommended.ts @@ -26,5 +26,17 @@ module.exports = deepmerge(defaultEslintConfig, { '@iceworks/security-practices/no-internal-url': ['warn', ['taobao.net']], '@iceworks/security-practices/no-secret-info': 'error', '@iceworks/security-practices/no-sensitive-word': ['warn', ['fuck']], + // Ignore these rules when check security practices + camelcase: 0, + 'dot-notation': 0, + indent: 0, + 'no-empty': 0, + 'no-var': 0, + 'no-underscore-dangle': 0, + 'object-shorthand': 0, + 'prefer-template': 0, + quotes: 0, + 'spaced-comment': 0, + 'vars-on-top': 0, }, }); diff --git a/packages/material-ui/package.json b/packages/material-ui/package.json index cec139d0f..218dd2b67 100644 --- a/packages/material-ui/package.json +++ b/packages/material-ui/package.json @@ -1,6 +1,6 @@ { "name": "@iceworks/material-ui", - "version": "0.1.10", + "version": "0.1.11", "description": "Material panel for display and select materials.", "files": [ "demo/", @@ -54,6 +54,6 @@ "access": "public" }, "license": "MIT", - "homepage": "https://unpkg.com/@iceworks/material-ui@0.1.10/build/index.html", + "homepage": "https://unpkg.com/@iceworks/material-ui@0.1.11/build/index.html", "gitHead": "fc5b35f95ab4cc24898845916acf598c2f34d576" } diff --git a/packages/material-ui/src/components/page.module.scss b/packages/material-ui/src/components/page.module.scss index fa30fbebf..62d582994 100644 --- a/packages/material-ui/src/components/page.module.scss +++ b/packages/material-ui/src/components/page.module.scss @@ -6,7 +6,7 @@ cursor: pointer; overflow: hidden; position: relative; - height: 120px; + height: 100%; padding: 5px 20px; margin-bottom: 24px; background-color: #252422; @@ -20,6 +20,15 @@ &.selected { border-color: $color-line1-3; + + .selectedIcon { + position: absolute; + top: 6px; + right: 6px; + border: 1px solid $color-line1-3; + border-radius: 50%; + padding: 4px; + } } } @@ -43,10 +52,6 @@ padding: 10px 0; } -.desc { - color: $color-text1-2; -} - .actions { position: absolute; bottom: 0;