@nasl/cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -5
- package/build/index.html +23 -0
- package/build/index.js +109 -0
- package/build/nasl.bundle.js +8 -0
- package/build/platformConfig.js +41 -0
- package/build/webpack.config.js +59 -0
- package/out/bin/nasl.js +21 -1
- package/out/bin/nasl.js.map +1 -1
- package/out/commands/check copy.d.ts +5 -0
- package/out/commands/check copy.d.ts.map +1 -0
- package/out/commands/check copy.js +30 -0
- package/out/commands/check copy.js.map +1 -0
- package/out/commands/check.d.ts.map +1 -1
- package/out/commands/check.js +3 -1
- package/out/commands/check.js.map +1 -1
- package/out/commands/compile.d.ts.map +1 -1
- package/out/commands/compile.js +3 -1
- package/out/commands/compile.js.map +1 -1
- package/out/commands/dep.d.ts +5 -0
- package/out/commands/dep.d.ts.map +1 -0
- package/out/commands/dep.js +13 -0
- package/out/commands/dep.js.map +1 -0
- package/out/commands/dev.d.ts.map +1 -1
- package/out/commands/dev.js +36 -1
- package/out/commands/dev.js.map +1 -1
- package/out/services/compose.d.ts +2 -0
- package/out/services/compose.d.ts.map +1 -1
- package/out/services/compose.js +4 -2
- package/out/services/compose.js.map +1 -1
- package/out/services/resolve.d.ts +3 -2
- package/out/services/resolve.d.ts.map +1 -1
- package/out/services/resolve.js +169 -13
- package/out/services/resolve.js.map +1 -1
- package/package.json +16 -3
- package/out/bin/nasl-compile.d.ts +0 -3
- package/out/bin/nasl-compile.d.ts.map +0 -1
- package/out/bin/nasl-compile.js +0 -22
- package/out/bin/nasl-compile.js.map +0 -1
- package/out/commands/transpile.d.ts +0 -5
- package/out/commands/transpile.d.ts.map +0 -1
- package/out/commands/transpile.js +0 -123
- package/out/commands/transpile.js.map +0 -1
- package/out/services/resolveFiles.d.ts +0 -18
- package/out/services/resolveFiles.d.ts.map +0 -1
- package/out/services/resolveFiles.js +0 -103
- package/out/services/resolveFiles.js.map +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export const platformConfig = {
|
|
2
|
+
appConfig: {
|
|
3
|
+
id: '5b4eb835-8471-4397-9cff-d48703de7174',
|
|
4
|
+
project: 'zyscustomer222',
|
|
5
|
+
domainName: 'zyscustomer222',
|
|
6
|
+
nuimsDomain: undefined,
|
|
7
|
+
lowcodeDomain: 'lcap.codewave-test.163yun.com',
|
|
8
|
+
envNuimsDomain: undefined,
|
|
9
|
+
tenantType: undefined,
|
|
10
|
+
tenantLevel: undefined,
|
|
11
|
+
extendedConfig: null,
|
|
12
|
+
envConfig: {
|
|
13
|
+
lowcodeDomain: 'lcap.codewave-test.163yun.com'
|
|
14
|
+
},
|
|
15
|
+
tenant: 'cstest',
|
|
16
|
+
documentTitle: null,
|
|
17
|
+
basePath: '',
|
|
18
|
+
frontendName: 'pc',
|
|
19
|
+
sysPrefixPath: '',
|
|
20
|
+
appTimeZone: 'user',
|
|
21
|
+
i18nInfo: {
|
|
22
|
+
enabled: false,
|
|
23
|
+
locale: 'zh-CN',
|
|
24
|
+
messages: {},
|
|
25
|
+
I18nList: []
|
|
26
|
+
},
|
|
27
|
+
rootViewData: undefined
|
|
28
|
+
},
|
|
29
|
+
dnsAddr: 'https://zyscustomer222-cstest.user.lcap.codewave-test.163yun.com',
|
|
30
|
+
tenant: 'cstest',
|
|
31
|
+
env: undefined,
|
|
32
|
+
hasUserCenter: true,
|
|
33
|
+
hasAuth: true,
|
|
34
|
+
basePath: '',
|
|
35
|
+
sysPrefixPath: '',
|
|
36
|
+
frontendName: 'pc',
|
|
37
|
+
isPreviewFe: false,
|
|
38
|
+
authResourcePaths: [],
|
|
39
|
+
baseResourcePaths: ['/dashboard', '/notFound', '/index']
|
|
40
|
+
};
|
|
41
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
3
|
+
const { VueLoaderPlugin } = require('vue-loader');
|
|
4
|
+
|
|
5
|
+
const outDir = process.cwd();
|
|
6
|
+
|
|
7
|
+
module.exports = {
|
|
8
|
+
mode: 'development',
|
|
9
|
+
entry: path.resolve(__dirname, './index.js'),
|
|
10
|
+
output: {
|
|
11
|
+
path: path.resolve(outDir, '../dist'),
|
|
12
|
+
filename: 'bundle.js',
|
|
13
|
+
clean: true
|
|
14
|
+
},
|
|
15
|
+
resolve: {
|
|
16
|
+
extensions: ['.js', '.vue', '.json'],
|
|
17
|
+
alias: {
|
|
18
|
+
'@': outDir,
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
externals: {
|
|
22
|
+
'vue': 'Vue',
|
|
23
|
+
'vue-router': 'VueRouter',
|
|
24
|
+
'vue-i18n': '$i18n',
|
|
25
|
+
'@/hooks': '$hooks',
|
|
26
|
+
'@/libraries': '$libraries',
|
|
27
|
+
'@/global-variables': '$globalVariables'
|
|
28
|
+
},
|
|
29
|
+
externalsType: 'window',
|
|
30
|
+
module: {
|
|
31
|
+
rules: [
|
|
32
|
+
{
|
|
33
|
+
test: /\.vue$/,
|
|
34
|
+
loader: 'vue-loader'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
test: /\.css$/,
|
|
38
|
+
use: ['style-loader', 'css-loader']
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
plugins: [
|
|
43
|
+
new VueLoaderPlugin(),
|
|
44
|
+
new HtmlWebpackPlugin({
|
|
45
|
+
template: path.resolve(__dirname, './index.html'),
|
|
46
|
+
inject: 'body'
|
|
47
|
+
})
|
|
48
|
+
],
|
|
49
|
+
devServer: {
|
|
50
|
+
static: {
|
|
51
|
+
directory: path.join(__dirname),
|
|
52
|
+
},
|
|
53
|
+
port: 3000,
|
|
54
|
+
hot: true,
|
|
55
|
+
open: true,
|
|
56
|
+
historyApiFallback: true
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
package/out/bin/nasl.js
CHANGED
|
@@ -8,10 +8,18 @@ const commander_1 = require("commander");
|
|
|
8
8
|
const commands_1 = require("../commands");
|
|
9
9
|
const logger_1 = require("../utils/logger");
|
|
10
10
|
const package_json_1 = __importDefault(require("../../package.json"));
|
|
11
|
+
const dep_1 = require("../commands/dep");
|
|
11
12
|
const program = new commander_1.Command();
|
|
13
|
+
const entryDescription = `是相对于项目根目录的路径,支持 glob 模式(注意要用引号包裹),例如:
|
|
14
|
+
- src/app.enums.Status.ts 支持具体文件
|
|
15
|
+
- "src/app.enums.*.ts" 表示所有枚举
|
|
16
|
+
- "src/app.{*.entities.*.ts,structures.*.ts,enums.*.ts}" 表示所有实体、数据结构和枚举,即全部用户自定义类型
|
|
17
|
+
- "src/app.logics.*.ts" 表示所有逻辑文件
|
|
18
|
+
- "src/*.tsx" 表示所有页面文件`;
|
|
12
19
|
program.name('nasl').description(`NASL 语言的命令行工具,提供编译、检查、开发服务等功能。
|
|
13
20
|
目前只支持 NaturalTS 表示的 NASL 代码,编译为 Vue 和 JS。
|
|
14
|
-
|
|
21
|
+
|
|
22
|
+
下面命令中的 [entry] 参数表示入口文件,${entryDescription}`).version(package_json_1.default.version).usage('[command] [options]');
|
|
15
23
|
program
|
|
16
24
|
.command('init')
|
|
17
25
|
.description('初始化 NASL 配置文件')
|
|
@@ -34,6 +42,18 @@ program
|
|
|
34
42
|
process.exit(1);
|
|
35
43
|
}
|
|
36
44
|
});
|
|
45
|
+
program
|
|
46
|
+
.command('dep [entry]')
|
|
47
|
+
.description('从入口文件开始进行依赖分析')
|
|
48
|
+
.action(async (entry) => {
|
|
49
|
+
try {
|
|
50
|
+
await (0, dep_1.depCommand)(entry);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
logger_1.Logger.error(`查找依赖过程发生错误:${error.message}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
37
57
|
program
|
|
38
58
|
.command('dev [entry]')
|
|
39
59
|
.description('启动开发服务')
|
package/out/bin/nasl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nasl.js","sourceRoot":"","sources":["../../src/bin/nasl.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,0CAAuG;AACvG,4CAAyC;AACzC,sEAAqC;
|
|
1
|
+
{"version":3,"file":"nasl.js","sourceRoot":"","sources":["../../src/bin/nasl.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,0CAAuG;AACvG,4CAAyC;AACzC,sEAAqC;AACrC,yCAA6C;AAE7C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAG9B,MAAM,gBAAgB,GAAG;;;;;yBAKA,CAAC;AAE1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;;;0BAGP,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAChG,OAAO;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,eAAe,CAAC;KAC5B,MAAM,CAAC,GAAG,EAAE;IACT,IAAA,sBAAW,GAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,4BAAiB,CAAC,CAAC;AAE/B,OAAO;KACF,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;IAC7B,IAAI,CAAC;QACD,MAAM,IAAA,uBAAY,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,eAAe,CAAC;KAC5B,MAAM,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;IAC7B,IAAI,CAAC;QACD,MAAM,IAAA,gBAAU,EAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,cAAe,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,QAAQ,CAAC;KACrB,MAAM,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;IAC7B,IAAI,CAAC;QACD,MAAM,IAAA,qBAAU,EAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,oBAAoB;AACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,CAAC,UAAU,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check copy.d.ts","sourceRoot":"","sources":["../../src/commands/check copy.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkCommand = checkCommand;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const apis_1 = require("../apis");
|
|
6
|
+
const compose_1 = require("../services/compose");
|
|
7
|
+
const resolve_1 = require("../services/resolve");
|
|
8
|
+
/**
|
|
9
|
+
* 检查命令 - 检查 NASL 代码的语法和语义
|
|
10
|
+
*/
|
|
11
|
+
async function checkCommand(entry) {
|
|
12
|
+
utils_1.Logger.info('开始检查 NASL 代码...');
|
|
13
|
+
// 收集需要检查的文件
|
|
14
|
+
const { inputFiles, config } = await (0, resolve_1.resolveNASLFiles)(entry);
|
|
15
|
+
// 调用检查 API
|
|
16
|
+
utils_1.Logger.newLine();
|
|
17
|
+
utils_1.Logger.info('正在调用检查服务,对语法和语义进行检查...');
|
|
18
|
+
const result = await (0, apis_1.check)((0, compose_1.composeToString)(inputFiles), {
|
|
19
|
+
serverBaseURL: config.serverBaseURL,
|
|
20
|
+
ideVersion: config.ideVersion,
|
|
21
|
+
});
|
|
22
|
+
if (result) {
|
|
23
|
+
utils_1.Logger.error('\n' + result);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Logger.debug('检查通过!');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=check%20copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check copy.js","sourceRoot":"","sources":["../../src/commands/check copy.ts"],"names":[],"mappings":";;AAQA,oCAoBC;AA5BD,oCAAkC;AAClC,kCAAgC;AAChC,iDAAsD;AACtD,iDAAuD;AAEvD;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,KAAc;IAC7C,cAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE/B,YAAY;IACZ,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,CAAC;IAE7D,WAAW;IACX,cAAM,CAAC,OAAO,EAAE,CAAC;IACjB,cAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,IAAA,YAAK,EAAC,IAAA,yBAAe,EAAC,UAAU,CAAC,EAAE;QACpD,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC,CAAC;IAEH,IAAI,MAAM,EAAE,CAAC;QACT,cAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACJ,yBAAyB;IAC7B,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBhE"}
|
package/out/commands/check.js
CHANGED
|
@@ -15,7 +15,9 @@ async function checkCommand(entry) {
|
|
|
15
15
|
// 调用检查 API
|
|
16
16
|
utils_1.Logger.newLine();
|
|
17
17
|
utils_1.Logger.info('正在调用检查服务,对语法和语义进行检查...');
|
|
18
|
-
const
|
|
18
|
+
const fullNaturalTS = (0, compose_1.composeToString)(inputFiles);
|
|
19
|
+
utils_1.Logger.debug(fullNaturalTS);
|
|
20
|
+
const result = await (0, apis_1.check)(fullNaturalTS, {
|
|
19
21
|
serverBaseURL: config.serverBaseURL,
|
|
20
22
|
ideVersion: config.ideVersion,
|
|
21
23
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":";;AAQA,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":";;AAQA,oCAsBC;AA9BD,oCAAkC;AAClC,kCAAgC;AAChC,iDAAsD;AACtD,iDAAuD;AAEvD;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,KAAc;IAC7C,cAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE/B,YAAY;IACZ,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,CAAC;IAE7D,WAAW;IACX,cAAM,CAAC,OAAO,EAAE,CAAC;IACjB,cAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,IAAA,yBAAe,EAAC,UAAU,CAAC,CAAC;IAClD,cAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,IAAA,YAAK,EAAC,aAAa,EAAE;QACtC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC,CAAC;IAEH,IAAI,MAAM,EAAE,CAAC;QACT,cAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACJ,yBAAyB;IAC7B,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM;;;
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM;;;GAoClD;AAED,wBAAsB,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,iBAOrD"}
|
package/out/commands/compile.js
CHANGED
|
@@ -53,7 +53,9 @@ async function compileCommand(entry) {
|
|
|
53
53
|
utils_1.Logger.newLine();
|
|
54
54
|
utils_1.Logger.info('正在调用编译服务...');
|
|
55
55
|
try {
|
|
56
|
-
const
|
|
56
|
+
const fullNaturalTS = (0, compose_1.composeToString)(inputFiles);
|
|
57
|
+
utils_1.Logger.debug(fullNaturalTS);
|
|
58
|
+
const outputFiles = await (0, apis_1.compile)(fullNaturalTS, {
|
|
57
59
|
serverBaseURL: config.serverBaseURL,
|
|
58
60
|
ideVersion: config.ideVersion,
|
|
59
61
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,wCAoCC;AAED,8CAOC;AAtDD,2CAA6B;AAC7B,oCAAoD;AACpD,kCAAkC;AAClC,iDAAsD;AACtD,iDAAuD;AAEvD;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,KAAc;IAC/C,cAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE/B,YAAY;IACZ,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,CAAC;IAE1E,cAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAErD,WAAW;IACX,cAAM,CAAC,OAAO,EAAE,CAAC;IACjB,cAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,IAAI,CAAC;QACD,MAAM,aAAa,GAAG,IAAA,yBAAe,EAAC,UAAU,CAAC,CAAC;QAClD,cAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,MAAM,IAAA,cAAO,EAAC,aAAa,EAAE;YAC7C,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,UAAU,EAAE,MAAM,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,cAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExB,SAAS;QACT,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAA,wBAAgB,EAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,cAAM,CAAC,KAAK,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,cAAM,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,MAAM,MAAM,CAAC,CAAC;QAC5C,cAAM,CAAC,OAAO,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,cAAM,CAAC,KAAK,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,KAAc;IAClD,IAAI,CAAC;QACD,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,cAAM,CAAC,KAAK,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep.d.ts","sourceRoot":"","sources":["../../src/commands/dep.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.depCommand = depCommand;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const resolve_1 = require("../services/resolve");
|
|
6
|
+
/**
|
|
7
|
+
* 检查命令 - 检查 NASL 代码的语法和语义
|
|
8
|
+
*/
|
|
9
|
+
async function depCommand(entry) {
|
|
10
|
+
utils_1.Logger.info('开始进行依赖分析...');
|
|
11
|
+
await (0, resolve_1.resolveNASLFiles)(entry, true);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=dep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep.js","sourceRoot":"","sources":["../../src/commands/dep.ts"],"names":[],"mappings":";;AAMA,gCAIC;AAVD,oCAAkC;AAClC,iDAAuD;AAEvD;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,KAAc;IAC3C,cAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE3B,MAAM,IAAA,0BAAgB,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9D"}
|
package/out/commands/dev.js
CHANGED
|
@@ -1,9 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.devCommand = devCommand;
|
|
4
37
|
const exec_1 = require("../utils/exec");
|
|
5
38
|
const logger_1 = require("../utils/logger");
|
|
6
39
|
const compile_1 = require("./compile");
|
|
40
|
+
const path = __importStar(require("path"));
|
|
7
41
|
/**
|
|
8
42
|
* 编译命令 - 将 NASL 编译为 Vue 和 JS
|
|
9
43
|
*/
|
|
@@ -11,6 +45,7 @@ async function devCommand(entry) {
|
|
|
11
45
|
const { outDir } = await (0, compile_1.compileCommand)(entry);
|
|
12
46
|
logger_1.Logger.newLine();
|
|
13
47
|
logger_1.Logger.info('正在启动开发服务...');
|
|
14
|
-
|
|
48
|
+
const configRelativePath = path.relative(outDir, path.resolve(__dirname, '../../build/webpack.config.js'));
|
|
49
|
+
await (0, exec_1.justExecCommandSync)(`npx webpack serve --config ${configRelativePath}`, outDir);
|
|
15
50
|
}
|
|
16
51
|
//# sourceMappingURL=dev.js.map
|
package/out/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,gCAOC;AAfD,wCAAoD;AACpD,4CAAyC;AACzC,uCAA2C;AAC3C,2CAA6B;AAE7B;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,KAAc;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,wBAAc,EAAC,KAAK,CAAC,CAAC;IAC/C,eAAM,CAAC,OAAO,EAAE,CAAC;IACjB,eAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE3B,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC,CAAC;IAC3G,MAAM,IAAA,0BAAmB,EAAC,8BAA8B,kBAAkB,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { FileInfo } from "../types";
|
|
2
|
+
export declare function createSorter(): (a: string, b: string) => number;
|
|
3
|
+
export declare const sorter: (a: string, b: string) => number;
|
|
2
4
|
export declare function composeToString(files: FileInfo[]): string;
|
|
3
5
|
//# sourceMappingURL=compose.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/services/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/services/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,wBAAgB,YAAY,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CA0B/D;AACD,eAAO,MAAM,MAAM,MA3BiB,MAAM,KAAK,MAAM,KAAK,MA2BtB,CAAC;AAErC,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAOzD"}
|
package/out/services/compose.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sorter = void 0;
|
|
4
|
+
exports.createSorter = createSorter;
|
|
3
5
|
exports.composeToString = composeToString;
|
|
4
6
|
function createSorter() {
|
|
5
7
|
const priorityOrder = ['app.dataSources', 'app.enums', 'app.structures', 'app.logics', 'app.frontendTypes'];
|
|
@@ -25,9 +27,9 @@ function createSorter() {
|
|
|
25
27
|
}
|
|
26
28
|
};
|
|
27
29
|
}
|
|
30
|
+
exports.sorter = createSorter();
|
|
28
31
|
function composeToString(files) {
|
|
29
|
-
|
|
30
|
-
files.sort((a, b) => sorter(a.path, b.path));
|
|
32
|
+
files.sort((a, b) => (0, exports.sorter)(a.path, b.path));
|
|
31
33
|
return files.map((file) => {
|
|
32
34
|
const namespace = file.path.split('.').slice(0, -2).join('.');
|
|
33
35
|
return `namespace ${namespace} {\n${file.content}\n}\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/services/compose.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/services/compose.ts"],"names":[],"mappings":";;;AAEA,oCA0BC;AAGD,0CAOC;AApCD,SAAgB,YAAY;IACxB,MAAM,aAAa,GAAG,CAAC,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAE5G,UAAU;IACV,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;QACxC,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;IAC7D,CAAC,CAAC;IAEF,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;QAC5B,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAEjC,WAAW;QACX,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,SAAS,GAAG,SAAS,CAAC;QACjC,CAAC;QAED,2BAA2B;QAC3B,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACJ,YAAY;YACZ,OAAO,CAAC,CAAC;QACb,CAAC;IACL,CAAC,CAAC;AACN,CAAC;AACY,QAAA,MAAM,GAAG,YAAY,EAAE,CAAC;AAErC,SAAgB,eAAe,CAAC,KAAiB;IAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,cAAM,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,OAAO,aAAa,SAAS,OAAO,IAAI,CAAC,OAAO,OAAO,CAAC;IAC5D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import type { FileInfo, NASLRepresentation, NASLConfig } from '../types';
|
|
|
3
3
|
* 扫描目录下的所有 NASL 文件
|
|
4
4
|
*/
|
|
5
5
|
export declare function scanNASLFiles(srcDir: string, representation: NASLRepresentation): Promise<string[]>;
|
|
6
|
+
export declare function scanEntryFiles(projectRoot: string, patterns: string[]): Promise<string[]>;
|
|
6
7
|
export interface ResolveFilesResult {
|
|
7
8
|
inputFiles: FileInfo[];
|
|
8
9
|
config: NASLConfig;
|
|
@@ -11,8 +12,8 @@ export interface ResolveFilesResult {
|
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* 解析需要处理的文件(包含配置加载和目录设置)
|
|
14
|
-
* @param entry
|
|
15
|
+
* @param entry 入口文件路径或 glob 模式(可选,相对于 src 目录)
|
|
15
16
|
* @returns 文件信息、配置和目录信息
|
|
16
17
|
*/
|
|
17
|
-
export declare function resolveNASLFiles(entry?: string): Promise<ResolveFilesResult>;
|
|
18
|
+
export declare function resolveNASLFiles(entry?: string, depMode?: boolean): Promise<ResolveFilesResult>;
|
|
18
19
|
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/services/resolve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/services/resolve.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIzE;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAazG;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAa/F;AAoKD,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqDrG"}
|
package/out/services/resolve.js
CHANGED
|
@@ -34,17 +34,20 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.scanNASLFiles = scanNASLFiles;
|
|
37
|
+
exports.scanEntryFiles = scanEntryFiles;
|
|
37
38
|
exports.resolveNASLFiles = resolveNASLFiles;
|
|
38
39
|
const path = __importStar(require("path"));
|
|
39
40
|
const globby = require("globby");
|
|
40
41
|
const utils_1 = require("../utils");
|
|
42
|
+
const chalk = require("chalk");
|
|
43
|
+
const compose_1 = require("./compose");
|
|
41
44
|
/**
|
|
42
45
|
* 扫描目录下的所有 NASL 文件
|
|
43
46
|
*/
|
|
44
47
|
async function scanNASLFiles(srcDir, representation) {
|
|
45
48
|
try {
|
|
46
49
|
const pattern = representation === 'NaturalTS' ? '**/*.{ts,tsx}' : '**/*.nasl';
|
|
47
|
-
const files = await globby(pattern, {
|
|
50
|
+
const files = await globby([pattern, '!**/*.css'], {
|
|
48
51
|
cwd: srcDir,
|
|
49
52
|
onlyFiles: true,
|
|
50
53
|
absolute: false,
|
|
@@ -56,12 +59,160 @@ async function scanNASLFiles(srcDir, representation) {
|
|
|
56
59
|
throw error;
|
|
57
60
|
}
|
|
58
61
|
}
|
|
62
|
+
async function scanEntryFiles(projectRoot, patterns) {
|
|
63
|
+
try {
|
|
64
|
+
patterns.push('!**/*.css');
|
|
65
|
+
const files = await globby(patterns, {
|
|
66
|
+
cwd: projectRoot,
|
|
67
|
+
onlyFiles: true,
|
|
68
|
+
absolute: false,
|
|
69
|
+
});
|
|
70
|
+
return files;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
utils_1.Logger.error(`扫描入口文件失败: ${error.message}`);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 从文件内容中提取 app.* 格式的依赖引用
|
|
79
|
+
* @param content 文件内容
|
|
80
|
+
* @returns 依赖的 app.* 路径列表
|
|
81
|
+
*/
|
|
82
|
+
function extractDeps(content) {
|
|
83
|
+
const deps = new Set();
|
|
84
|
+
const allMatches = content.matchAll(/app\.\w+\.[\w.]+/g); // 起码要2个点
|
|
85
|
+
for (const match of allMatches) {
|
|
86
|
+
let dep = match[0];
|
|
87
|
+
if (/Entity$|Entity\./.test(dep)) {
|
|
88
|
+
dep = dep.replace(/Entity(\..*)?$/, '');
|
|
89
|
+
}
|
|
90
|
+
else if (/\.enums\.(\w+)\.(\w+)/.test(dep)) {
|
|
91
|
+
dep = dep.replace(/\.enums\.(\w+).+$/, '.enums.$1');
|
|
92
|
+
}
|
|
93
|
+
dep = `${dep}.${dep.includes('.views.') ? 'tsx' : 'ts'}`;
|
|
94
|
+
deps.add(dep);
|
|
95
|
+
}
|
|
96
|
+
return Array.from(deps);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 提取页面文件的签名,移除函数体
|
|
100
|
+
* @param content 页面文件内容
|
|
101
|
+
* @returns 只包含签名的内容
|
|
102
|
+
*/
|
|
103
|
+
function replaceViewAsSignature(content) {
|
|
104
|
+
return content.replace(/export function ((\w+)\([^)]*\)) \{[\s\S]+$/, 'export declare function $1;');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 处理单个文件的依赖
|
|
108
|
+
* @param pathRelativeToSrc 文件相对路径
|
|
109
|
+
* @param srcDir 源代码目录
|
|
110
|
+
* @param matchedFiles 入口文件列表
|
|
111
|
+
* @param processedFileMap 已处理的文件集合
|
|
112
|
+
* @returns 文件信息和新发现的依赖文件列表
|
|
113
|
+
*/
|
|
114
|
+
function processFileDeps(pathRelativeToSrc, srcDir, matchedFileSet, processedFileMap, verbose) {
|
|
115
|
+
const absoluteFilePath = path.join(srcDir, pathRelativeToSrc);
|
|
116
|
+
const fileInfo = { path: pathRelativeToSrc, content: '' };
|
|
117
|
+
try {
|
|
118
|
+
fileInfo.content = (0, utils_1.readFileWithLog)(absoluteFilePath);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
utils_1.Logger.warn(`无法读取文件 ${pathRelativeToSrc},跳过`);
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
const isView = pathRelativeToSrc.endsWith('.tsx');
|
|
125
|
+
const isEntryFile = matchedFileSet.has(pathRelativeToSrc);
|
|
126
|
+
// 如果是页面文件且不是入口文件,只保留签名,但要继续分析依赖
|
|
127
|
+
if (isView && !isEntryFile) {
|
|
128
|
+
// Logger.debug(`提取页面签名: ${pathRelativeToSrc}`);
|
|
129
|
+
fileInfo.content = replaceViewAsSignature(fileInfo.content);
|
|
130
|
+
}
|
|
131
|
+
processedFileMap.set(pathRelativeToSrc, fileInfo);
|
|
132
|
+
// 提取依赖
|
|
133
|
+
const deps = extractDeps(fileInfo.content);
|
|
134
|
+
if (verbose || process.env.DEBUG) {
|
|
135
|
+
console.log(`${isEntryFile ? chalk.magenta('[Entry]') : chalk.green('[ Dep ]')} ${pathRelativeToSrc}${deps.map((dep) => `\n├── ${dep}`).join('')}`);
|
|
136
|
+
}
|
|
137
|
+
// 查找依赖文件
|
|
138
|
+
if (isView && !isEntryFile) {
|
|
139
|
+
const pathArr = pathRelativeToSrc.split('.');
|
|
140
|
+
pathArr.pop(); // 移除 .tsx
|
|
141
|
+
do {
|
|
142
|
+
pathArr.pop();
|
|
143
|
+
pathArr.pop();
|
|
144
|
+
const namespace = pathArr.join('.') + '.tsx';
|
|
145
|
+
deps.push(namespace);
|
|
146
|
+
} while (pathArr.length > 0 && pathArr[pathArr.length - 1] !== 'pc' && pathArr.includes('views'));
|
|
147
|
+
}
|
|
148
|
+
const newDeps = [];
|
|
149
|
+
for (const dep of deps) {
|
|
150
|
+
if (processedFileMap.has(dep))
|
|
151
|
+
continue;
|
|
152
|
+
newDeps.push(dep);
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
fileInfo,
|
|
156
|
+
newDeps,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 收集入口文件及其依赖
|
|
161
|
+
* @param patterns 入口文件的 glob 模式数组
|
|
162
|
+
* @param srcDir 源代码目录绝对路径
|
|
163
|
+
* @param representation NASL 表示形式
|
|
164
|
+
* @returns 文件信息列表
|
|
165
|
+
*/
|
|
166
|
+
async function collectDeps(patterns, projectRoot, srcDir, representation, verbose) {
|
|
167
|
+
const processedFileMap = new Map(); // 已处理的文件(相对路径)
|
|
168
|
+
const filesToProcess = []; // 待处理的文件队列
|
|
169
|
+
const result = [];
|
|
170
|
+
// 1. 使用 glob 匹配入口文件
|
|
171
|
+
utils_1.Logger.newLine();
|
|
172
|
+
utils_1.Logger.info(`匹配入口文件: ${patterns.join(', ')}`);
|
|
173
|
+
const matchedFiles = await scanEntryFiles(projectRoot, patterns); // src/..
|
|
174
|
+
if (matchedFiles.length === 0) {
|
|
175
|
+
utils_1.Logger.error(`未找到匹配的入口文件: ${patterns.join(', ')}`);
|
|
176
|
+
throw new Error('未找到匹配的入口文件');
|
|
177
|
+
}
|
|
178
|
+
utils_1.Logger.info(`找到 ${matchedFiles.length} 个入口文件`);
|
|
179
|
+
const absoluteSrcDir = path.resolve(srcDir);
|
|
180
|
+
const matchedFileSet = new Set();
|
|
181
|
+
matchedFiles.forEach((pathRelativeToRoot) => {
|
|
182
|
+
// 统一使用相对于 src 的路径
|
|
183
|
+
const absoluteFilePath = path.resolve(projectRoot, pathRelativeToRoot);
|
|
184
|
+
// 判断 file 是否超出 srcDir 目录(支持相对路径和绝对路径)
|
|
185
|
+
if (!absoluteFilePath.startsWith(absoluteSrcDir))
|
|
186
|
+
throw new Error(`入口文件 ${absoluteFilePath} 超出了源代码目录 ${srcDir}`);
|
|
187
|
+
const pathRelativeToSrc = path.relative(srcDir, absoluteFilePath);
|
|
188
|
+
filesToProcess.push(pathRelativeToSrc);
|
|
189
|
+
matchedFileSet.add(pathRelativeToSrc);
|
|
190
|
+
});
|
|
191
|
+
filesToProcess.sort(compose_1.sorter);
|
|
192
|
+
// 2. 广度优先遍历依赖
|
|
193
|
+
while (filesToProcess.length > 0) {
|
|
194
|
+
const pathRelativeToSrc = filesToProcess.shift();
|
|
195
|
+
if (processedFileMap.has(pathRelativeToSrc))
|
|
196
|
+
continue; // 跳过已处理的文件
|
|
197
|
+
try {
|
|
198
|
+
const { fileInfo, newDeps } = processFileDeps(pathRelativeToSrc, srcDir, matchedFileSet, processedFileMap, verbose);
|
|
199
|
+
result.push(fileInfo);
|
|
200
|
+
filesToProcess.push(...newDeps);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
// 文件读取失败,已经在 processFileDeps 中记录日志
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
utils_1.Logger.info(`依赖分析完成,共收集到 ${result.length} 个文件`);
|
|
208
|
+
return result;
|
|
209
|
+
}
|
|
59
210
|
/**
|
|
60
211
|
* 解析需要处理的文件(包含配置加载和目录设置)
|
|
61
|
-
* @param entry
|
|
212
|
+
* @param entry 入口文件路径或 glob 模式(可选,相对于 src 目录)
|
|
62
213
|
* @returns 文件信息、配置和目录信息
|
|
63
214
|
*/
|
|
64
|
-
async function resolveNASLFiles(entry) {
|
|
215
|
+
async function resolveNASLFiles(entry, depMode) {
|
|
65
216
|
// 加载配置
|
|
66
217
|
const config = (0, utils_1.loadConfig)();
|
|
67
218
|
const projectRoot = (0, utils_1.getProjectRoot)();
|
|
@@ -70,22 +221,27 @@ async function resolveNASLFiles(entry) {
|
|
|
70
221
|
const srcDir = path.join(projectRoot, config.srcDir);
|
|
71
222
|
// 收集需要处理的文件
|
|
72
223
|
let inputFiles = [];
|
|
224
|
+
if (!entry && depMode)
|
|
225
|
+
entry = 'src/**/*.{ts,tsx}';
|
|
73
226
|
if (entry) {
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
227
|
+
// 检查入口路径是否在源代码目录外面
|
|
228
|
+
// if (entry.startsWith('..')) throw new Error('入口路径不能在源代码目录外面');
|
|
229
|
+
// entry 是相对于项目根目录的路径,例如:src/app.enums.Status.ts, src/app.enums.*.ts, src/app.{*.entities.*.ts,enums.*.ts}, src/**/*.tsx
|
|
230
|
+
// 具体路径也转换为 glob 模式统一处理
|
|
231
|
+
// 使用依赖分析收集文件
|
|
232
|
+
try {
|
|
233
|
+
inputFiles = await collectDeps([entry], projectRoot, srcDir, config.representation, depMode);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
utils_1.Logger.error(`依赖分析失败: ${error.message}`);
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
84
239
|
}
|
|
85
240
|
else {
|
|
86
241
|
// 扫描整个 src 目录
|
|
87
242
|
utils_1.Logger.info('扫描整个源代码目录...');
|
|
88
243
|
const filePaths = await scanNASLFiles(srcDir, config.representation);
|
|
244
|
+
filePaths.sort(compose_1.sorter);
|
|
89
245
|
utils_1.Logger.debug(filePaths);
|
|
90
246
|
inputFiles = filePaths.map((filePath) => ({
|
|
91
247
|
path: filePath,
|