初始化时处理dependency

This commit is contained in:
Xu Chang 2024-04-17 14:57:26 +08:00
parent 9f217284a1
commit 04a2d1147d
11 changed files with 170 additions and 130 deletions

View File

@ -2,6 +2,9 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.update = exports.create = void 0; exports.update = exports.create = void 0;
const tslib_1 = require("tslib"); const tslib_1 = require("tslib");
const ts = tslib_1.__importStar(require("typescript"));
const fs_1 = require("fs");
const { factory } = ts;
const file_handle_1 = require("./file-handle"); const file_handle_1 = require("./file-handle");
const enum_1 = require("./enum"); const enum_1 = require("./enum");
const config_1 = require("./config"); const config_1 = require("./config");
@ -12,6 +15,7 @@ const axios_1 = tslib_1.__importDefault(require("axios"));
const tip_style_1 = require("./tip-style"); const tip_style_1 = require("./tip-style");
const shelljs_1 = tslib_1.__importDefault(require("shelljs")); const shelljs_1 = tslib_1.__importDefault(require("shelljs"));
const rename_1 = require("./rename"); const rename_1 = require("./rename");
const assert_1 = tslib_1.__importDefault(require("assert"));
const DEFAULT_PROJECT_NAME = 'oak_template'; const DEFAULT_PROJECT_NAME = 'oak_template';
const DEFAULT_PROJECT_TITLE = 'oak template project'; const DEFAULT_PROJECT_TITLE = 'oak template project';
const prompt = [ const prompt = [
@ -32,6 +36,30 @@ const prompt = [
message: 'description', message: 'description',
}, },
]; ];
/**
* 将项目的依赖关系加入
*/
function addDependencies(dependencies) {
const dependencyFile = (0, path_1.join)(process.cwd(), 'src', 'configuration', 'dependency.ts');
const program = ts.createProgram([
dependencyFile,
], {});
const sourceFile = program.getSourceFile(dependencyFile);
const { statements } = sourceFile;
const stmt1 = statements[1];
(0, assert_1.default)(ts.isVariableStatement(stmt1));
const { declarationList: { declarations: [vd] } } = stmt1;
const { name, initializer } = vd;
(0, assert_1.default)(ts.isIdentifier(name) && name.text === 'dependencyConfiguration');
(0, assert_1.default)(ts.isArrayLiteralExpression(initializer));
Object.assign(initializer, {
elements: dependencies.map(ele => factory.createStringLiteral(ele))
});
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
const result = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray(statements), sourceFile);
(0, fs_1.writeFileSync)(dependencyFile, result, { flag: 'w' });
(0, tip_style_1.Success)((0, tip_style_1.success)(`${dependencyFile} has been built.`));
}
/** /**
* @name 检查项目名是否已存在 * @name 检查项目名是否已存在
* @param dirName * @param dirName
@ -60,12 +88,18 @@ async function getOakCliVersion() {
* @returns * @returns
*/ */
async function getMiniVersion() { async function getMiniVersion() {
const res = await axios_1.default.get(config_1.MINI_VERSION_URL); try {
const versions = JSON.parse(res.data['json_data'])['total']; const res = await axios_1.default.get(config_1.MINI_VERSION_URL);
const versionsSort = versions.sort((a, b) => { const versions = JSON.parse(res.data['json_data'])['total'];
return b['percentage'] - a['percentage']; const versionsSort = versions.sort((a, b) => {
}); return b['percentage'] - a['percentage'];
return versionsSort[0]['sdkVer']; });
return versionsSort[0]['sdkVer'];
}
catch (err) {
(0, tip_style_1.Warn)((0, tip_style_1.warn)(`can't access a-o-s weixin mini version, using 3.4.1`));
return '3.4.1';
}
} }
async function createWechatMpBoilplate(dir, isDev, isUpdate) { async function createWechatMpBoilplate(dir, isDev, isUpdate) {
// 获取微信小程序稳定基础版本库 // 获取微信小程序稳定基础版本库
@ -176,6 +210,29 @@ async function create(dirName, cmd) {
shell.cd(dirName).exec('npm install'); */ shell.cd(dirName).exec('npm install'); */
(0, rename_1.renameProject)(rootPath, name, title, DEFAULT_PROJECT_NAME, DEFAULT_PROJECT_TITLE); (0, rename_1.renameProject)(rootPath, name, title, DEFAULT_PROJECT_NAME, DEFAULT_PROJECT_TITLE);
(0, tip_style_1.Success)(`${(0, tip_style_1.success)(`Successfully created project ${(0, tip_style_1.primary)(name)}, directory name is ${(0, tip_style_1.primary)(dirName)}`)}`); (0, tip_style_1.Success)(`${(0, tip_style_1.success)(`Successfully created project ${(0, tip_style_1.primary)(name)}, directory name is ${(0, tip_style_1.primary)(dirName)}`)}`);
const { useOgb, moreDeps } = await inquirer_1.default.prompt([{
name: 'useOgb',
type: 'confirm',
message: 'add oak-general-business into dependency?',
default: true,
}, {
name: 'moreDeps',
type: 'input',
message: 'do you have more dependent oak-family libraries? type their names, use comma as separator.',
default: '',
}]);
const deps = [];
if (useOgb) {
deps.push('oak-general-business');
}
if (moreDeps) {
deps.push(...(moreDeps.split(',').map(ele => ele.trim()).filter(ele => !!ele)));
}
if (deps.length > 0) {
shelljs_1.default.cd(dirName);
addDependencies(deps);
}
(0, tip_style_1.Success)(`${(0, tip_style_1.success)(`Ok, type 'npm install' to install libs, then start!`)}`);
} }
catch (err) { catch (err) {
(0, tip_style_1.Error)((0, tip_style_1.error)('create error')); (0, tip_style_1.Error)((0, tip_style_1.error)('create error'));

View File

@ -1,3 +1,7 @@
import * as ts from 'typescript';
import { writeFileSync } from 'fs';
const { factory } = ts;
import { import {
copyFolder, copyFolder,
checkFileExistsAndCreate, checkFileExistsAndCreate,
@ -39,8 +43,9 @@ import {
warn, warn,
Warn, Warn,
} from './tip-style'; } from './tip-style';
import shell from 'shelljs'; import shell, { cat } from 'shelljs';
import { renameProject } from './rename'; import { renameProject } from './rename';
import assert from 'assert';
const DEFAULT_PROJECT_NAME = 'oak_template'; const DEFAULT_PROJECT_NAME = 'oak_template';
const DEFAULT_PROJECT_TITLE = 'oak template project'; const DEFAULT_PROJECT_TITLE = 'oak template project';
@ -63,6 +68,41 @@ const prompt = [
}, },
]; ];
/**
*
*/
function addDependencies(dependencies: string[]) {
const dependencyFile = join(process.cwd(), 'src', 'configuration', 'dependency.ts');
const program = ts.createProgram([
dependencyFile,
], {});
const sourceFile = program.getSourceFile(dependencyFile);
const { statements } = sourceFile!;
const stmt1 = statements[1];
assert(ts.isVariableStatement(stmt1));
const { declarationList: { declarations: [ vd ]}} = stmt1;
const { name, initializer } = vd;
assert(ts.isIdentifier(name) && name.text === 'dependencyConfiguration');
assert(ts.isArrayLiteralExpression(initializer!));
Object.assign(initializer, {
elements: dependencies.map(
ele => factory.createStringLiteral(ele)
)
});
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
const result = printer.printList(
ts.ListFormat.SourceFileStatements,
factory.createNodeArray(statements),
sourceFile!);
writeFileSync(dependencyFile, result, { flag: 'w' });
Success(success(`${dependencyFile} has been built.`));
}
/** /**
* @name * @name
* @param dirName * @param dirName
@ -95,12 +135,18 @@ async function getOakCliVersion() {
* @returns * @returns
*/ */
async function getMiniVersion() { async function getMiniVersion() {
const res = await axios.get(MINI_VERSION_URL); try {
const versions: Array<any> = JSON.parse(res.data['json_data'])['total']; const res = await axios.get(MINI_VERSION_URL);
const versionsSort = versions.sort((a: any, b: any) => { const versions: Array<any> = JSON.parse(res.data['json_data'])['total'];
return b['percentage'] - a['percentage']; const versionsSort = versions.sort((a: any, b: any) => {
}); return b['percentage'] - a['percentage'];
return versionsSort[0]['sdkVer']; });
return versionsSort[0]['sdkVer'];
}
catch (err) {
Warn(warn(`can't access a-o-s weixin mini version, using 3.4.1`));
return '3.4.1';
}
} }
@ -277,11 +323,13 @@ export async function create(dirName: string, cmd: any) {
Warn(warn('Sorry, this script requires npm! Please install npm!')); Warn(warn('Sorry, this script requires npm! Please install npm!'));
shell.exit(1); shell.exit(1);
} }
/* Success(`${success(`Waiting...`)}`); /* Success(`${success(`Waiting...`)}`);
Success(`${success(`Dependencies are now being installed`)}`); Success(`${success(`Dependencies are now being installed`)}`);
shell.cd(dirName).exec('npm install'); */ shell.cd(dirName).exec('npm install'); */
renameProject(rootPath, name, title, DEFAULT_PROJECT_NAME, DEFAULT_PROJECT_TITLE); renameProject(rootPath, name, title, DEFAULT_PROJECT_NAME, DEFAULT_PROJECT_TITLE);
Success( Success(
`${success( `${success(
`Successfully created project ${primary( `Successfully created project ${primary(
@ -289,6 +337,41 @@ export async function create(dirName: string, cmd: any) {
)}, directory name is ${primary(dirName)}` )}, directory name is ${primary(dirName)}`
)}` )}`
); );
const { useOgb, moreDeps } = await inquirer.prompt([{
name: 'useOgb',
type: 'confirm',
message: 'add oak-general-business into dependency?',
default: true,
}, {
name: 'moreDeps',
type: 'input',
message: 'do you have more dependent oak-family libraries? type their names, use comma as separator.',
default: '',
}]);
const deps = [] as string[];
if (useOgb) {
deps.push('oak-general-business');
}
if (moreDeps) {
deps.push(
...((<string>moreDeps).split(',').map(
ele => ele.trim()
).filter(
ele => !!ele
))
);
}
if (deps.length > 0) {
shell.cd(dirName);
addDependencies(deps);
}
Success(
`${success(
`Ok, type 'npm install' to install libs, then start!`
)}`
);
} catch (err) { } catch (err) {
Error(error('create error')); Error(error('create error'));
Error(error(err)); Error(error(err));

View File

@ -1,5 +1,5 @@
import { DependencyConfiguration } from 'oak-domain/lib/types/Configuration'; import { DependencyConfiguration } from 'oak-domain/lib/types/Configuration';
const dependencyConfiguration: DependencyConfiguration = ['oak-general-business']; const dependencyConfiguration: DependencyConfiguration = [];
export default dependencyConfiguration; export default dependencyConfiguration;

View File

@ -10,4 +10,10 @@ export const selectFreeEntities = [
]; ];
export const updateFreeDict: UpdateFreeDict<EntityDict> = { export const updateFreeDict: UpdateFreeDict<EntityDict> = {
};
export default {
authDeduceRelationMap,
selectFreeEntities,
updateFreeDict,
}; };

View File

@ -6,16 +6,16 @@ import {
SingleGeo, SingleGeo,
} from 'oak-domain/lib/types/DataType'; } from 'oak-domain/lib/types/DataType';
import { ActionDef, EntityDesc } from 'oak-domain/lib/types'; import { ActionDef, EntityDesc } from 'oak-domain/lib/types';
import { Schema as Area } from 'oak-general-business/lib/entities/Area'; // import { Schema as Area } from 'oak-general-business/lib/entities/Area';
import { Schema as ExtraFile } from 'oak-general-business/lib/entities/ExtraFile'; // import { Schema as ExtraFile } from 'oak-general-business/lib/entities/ExtraFile';
import { EntityShape } from 'oak-domain/lib/types/Entity'; import { EntityShape } from 'oak-domain/lib/types/Entity';
export interface Schema extends EntityShape { export interface Schema extends EntityShape {
coordinate: SingleGeo; //坐标 coordinate: SingleGeo; //坐标
area: Area; //地区 // area: Area; //地区
name: String<32>; //名称 name: String<32>; //名称
addrDetail: String<32>; //地址详情 addrDetail: String<32>; //地址详情
files: Array<ExtraFile>; //封面图 // files: Array<ExtraFile>; //封面图
} }
type IAction = 'online' | 'offline' | 'disable'; type IAction = 'online' | 'offline' | 'disable';
@ -58,10 +58,10 @@ const entityDesc: EntityDesc<
name: '门店', name: '门店',
attr: { attr: {
coordinate: '位置', coordinate: '位置',
area: '地区', // area: '地区',
name: '名称', name: '名称',
addrDetail: '地址详情', addrDetail: '地址详情',
files: '照片', // files: '照片',
iState: '状态', iState: '状态',
}, },
action: { action: {

View File

@ -1,9 +1,3 @@
import {
OakTokenExpiredException,
OakMobileUnsetException,
OakUserInfoUncompletedException,
OakUserInfoLoadingException,
} from 'oak-general-business';
import { import {
OakException, OakException,
OakUnloggedInException, OakUnloggedInException,
@ -35,42 +29,7 @@ export const handler = async (reason: any, features: AFD) => {
{ isGoBack: true }, { isGoBack: true },
true true
); );
} else if (reason instanceof OakTokenExpiredException) { } else if (reason instanceof OakInputIllegalException) {
await features.token.logout();
features.navigator.navigateTo(
{
url: '/login',
},
{ isGoBack: true },
true
);
} /* else if (reason instanceof OakUserUnpermittedException) {
features.navigator.redirectTo(
{
url: '/result/403',
},
undefined,
true
);
} */ else if (reason instanceof OakMobileUnsetException) {
features.navigator.navigateTo(
{
url: '/mobile/me',
},
undefined,
true
);
} else if (reason instanceof OakUserInfoUncompletedException) {
const userId = features.token.getUserId();
features.navigator.navigateTo(
{
url: '/user/manager/upsert',
oakId: userId,
},
undefined,
true
);
} else if (reason instanceof OakInputIllegalException) {
features.message.setMessage({ features.message.setMessage({
content: reason.message, content: reason.message,
type: 'error', type: 'error',
@ -80,9 +39,6 @@ export const handler = async (reason: any, features: AFD) => {
content: reason.message, content: reason.message,
type: 'error', type: 'error',
}); });
} else if (reason instanceof OakUserInfoLoadingException) {
// 暂不处理在oak-general-business的page的生命周期里等token加载完成了会刷新页面的
console.warn(reason);
} else if (reason instanceof ExampleException) { } else if (reason instanceof ExampleException) {
console.log('在此处理ExampleException'); console.log('在此处理ExampleException');
} else { } else {

View File

@ -7,10 +7,9 @@ import {
OakNetworkException, OakNetworkException,
OakServerProxyException, OakServerProxyException,
} from 'oak-domain/lib/types/Exception'; } from 'oak-domain/lib/types/Exception';
import { OakTokenExpiredException } from 'oak-general-business'; import { ECode } from 'oak-frontend-base/es/types/ErrorPage';
import { ECode } from 'oak-general-business/es/types/ErrorPage';
const ErrorPage = lazy( const ErrorPage = lazy(
() => import('oak-general-business/es/components/common/errorPage') () => import('oak-frontend-base/es/components/errorPage')
); );
interface ErrorProps { interface ErrorProps {
@ -21,27 +20,6 @@ function Error(props: ErrorProps) {
const { error } = props; const { error } = props;
if (error instanceof OakException) { if (error instanceof OakException) {
if (error instanceof OakTokenExpiredException) {
return (
<ErrorPage
code={ECode.error}
title="登录失效"
desc="抱歉,登录信息失效,请点击【重新加载】"
>
<Space>
<Button
type="primary"
onClick={async () => {
(global as any).features.token.removeToken();
window.location.reload();
}}
>
</Button>
</Space>
</ErrorPage>
);
}
if (error instanceof OakNetworkException) { if (error instanceof OakNetworkException) {
// 网络中断出现的异常 // 网络中断出现的异常
return ( return (

View File

@ -1,4 +0,0 @@
{
"theme": {
}
}

View File

@ -44,7 +44,7 @@ type RoutePath = string | undefined | null;
type IsFirst = boolean; type IsFirst = boolean;
// 项目路径别名 // 项目路径别名
export type Project = '@project' | '@oak-general-business' | '@oak-frontend-base'; export type Project = '@project';
// [项目别名, 文件path[嵌套路由顶层path],设置根路由, 路由path] // [项目别名, 文件path[嵌套路由顶层path],设置根路由, 路由path]

View File

@ -1,36 +0,0 @@
import {
String,
Text,
Price
} from 'oak-domain/lib/types/DataType';
import { EntityShape } from 'oak-domain/lib/types/Entity';
import { Schema as System } from 'oak-general-business/lib/entities/System';
import { Schema as ArticleMenu } from 'oak-general-business/lib/entities/ArticleMenu';
import { EntityDesc } from 'oak-domain/lib/types';
export interface Schema extends EntityShape {
name: String<32>;
system: System;
systems?: System[];
articleMenus?: ArticleMenu[];
};
export type Relation = 'owner' | 'manager';
const entityDesc: EntityDesc<Schema, '', Relation> = {
locales: {
zh_CN: {
name: '系统供应商',
attr: {
name: '名称',
system: '系统',
systems: '系统',
articleMenus: '文章分类',
},
r: {
owner: '所有者',
manager: '管理员',
},
},
}
}