openyida 2026.7.13 → 2026.7.14-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 +15 -22
- package/bin/yida.js +72 -220
- package/lib/agent-center/api.js +2 -2
- package/lib/aggregate-table/aggregate-table.js +2 -2
- package/lib/ai/ai.js +7 -12
- package/lib/app/canvas-compile.js +2 -2
- package/lib/app/create-app.js +5 -19
- package/lib/app/create-form.js +54 -76
- package/lib/app/create-page.js +4 -19
- package/lib/app/er.js +11 -8
- package/lib/app/export-app.js +2 -2
- package/lib/app/externalize-form.js +12 -10
- package/lib/app/get-schema.js +12 -10
- package/lib/app/import-app.js +6 -22
- package/lib/app/list-forms.js +3 -19
- package/lib/app/nav-group.js +6 -19
- package/lib/app/publish.js +60 -198
- package/lib/app/update-app.js +4 -18
- package/lib/app/update-form-config.js +20 -113
- package/lib/app-permission/app-permission.js +2 -2
- package/lib/auth/oauth-loopback.js +156 -0
- package/lib/auth/org.js +169 -322
- package/lib/auth/token-auth.js +346 -0
- package/lib/auth/token-store.js +174 -0
- package/lib/basic-info/basic-info.js +11 -12
- package/lib/bridge/bridge.js +29 -27
- package/lib/connector/api.js +4 -4
- package/lib/core/agent-capabilities.js +92 -8
- package/lib/core/batch.js +8 -8
- package/lib/core/check-data.js +2 -2
- package/lib/core/command-manifest.js +3 -3
- package/lib/core/doctor.js +19 -22
- package/lib/core/env-cmd.js +1 -3
- package/lib/core/env-manager.js +8 -121
- package/lib/core/env.js +30 -72
- package/lib/core/locales/ar.js +5 -5
- package/lib/core/locales/de.js +5 -5
- package/lib/core/locales/en.js +26 -26
- package/lib/core/locales/es.js +5 -5
- package/lib/core/locales/fr.js +5 -5
- package/lib/core/locales/hi.js +5 -5
- package/lib/core/locales/ja.js +14 -14
- package/lib/core/locales/ko.js +5 -5
- package/lib/core/locales/pt.js +5 -5
- package/lib/core/locales/vi.js +5 -5
- package/lib/core/locales/zh-HK.js +15 -15
- package/lib/core/locales/zh.js +26 -26
- package/lib/core/query-data.js +2 -2
- package/lib/core/task-center.js +2 -2
- package/lib/core/utils.js +156 -400
- package/lib/core/yida-client.js +57 -22
- package/lib/corp-efficiency/corp-efficiency.js +3 -3
- package/lib/corp-manager/api.js +2 -2
- package/lib/db/db-seq-fix.js +20 -25
- package/lib/flash-note/flash-to-prd.js +2 -2
- package/lib/i18n-management/i18n-management.js +2 -2
- package/lib/integration/integration-check.js +10 -7
- package/lib/integration/integration-create.js +11 -8
- package/lib/integration/integration-list.js +11 -8
- package/lib/mcp/server.js +5 -54
- package/lib/page-config/get-page-config.js +2 -2
- package/lib/page-config/save-share-config.js +2 -2
- package/lib/page-config/verify-short-url.js +2 -2
- package/lib/permission/get-permission.js +2 -2
- package/lib/permission/save-permission.js +2 -2
- package/lib/process/ai-form-setting.js +2 -2
- package/lib/process/create-process.js +2 -2
- package/lib/process/preview-process.js +2 -2
- package/lib/report/append.js +3 -3
- package/lib/report/index.js +3 -3
- package/package.json +1 -1
- package/scripts/check-syntax.js +6 -0
- package/scripts/e2e-real/full-runner.js +2 -10
- package/scripts/e2e-real/runner.js +0 -31
- package/scripts/eval/screenshot.js +27 -69
- package/scripts/nightly-smoke.js +16 -34
- package/scripts/postinstall.js +6 -2
- package/yida-skills/SKILL.md +10 -6
- package/yida-skills/references/development-rules.md +2 -2
- package/yida-skills/references/setup-and-env.md +10 -9
- package/yida-skills/skills/sls-log-workbench/SKILL.md +2 -2
- package/yida-skills/skills/sls-log-workbench/sls-query.js +27 -54
- package/yida-skills/skills/yida-flash-note-to-prd/SKILL.md +1 -1
- package/yida-skills/skills/yida-integration/SKILL.md +3 -3
- package/yida-skills/skills/yida-login/SKILL.md +56 -74
- package/yida-skills/skills/yida-logout/SKILL.md +13 -12
- package/yida-skills/skills/yida-process-rule/SKILL.md +1 -1
- package/yida-skills/skills/yida-publish-page/SKILL.md +1 -1
- package/yida-skills/skills/yida-report/references/report-api-guide.md +4 -20
- package/yida-skills/skills-index.json +4 -4
- package/lib/auth/auth.js +0 -313
- package/lib/auth/cdp-browser-login.js +0 -390
- package/lib/auth/codex-login.js +0 -71
- package/lib/auth/login.js +0 -550
- package/lib/auth/qr-login.js +0 -1575
package/lib/app/list-forms.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const {
|
|
4
|
-
loadCookieData,
|
|
5
|
-
triggerLogin,
|
|
6
|
-
resolveBaseUrl,
|
|
7
|
-
} = require('../core/utils');
|
|
3
|
+
const { createAuthRef } = require('../core/yida-client');
|
|
8
4
|
const { t } = require('../core/i18n');
|
|
9
5
|
const { fetchFormPageList } = require('./form-navigation');
|
|
10
6
|
|
|
@@ -60,23 +56,11 @@ async function run(args) {
|
|
|
60
56
|
}
|
|
61
57
|
|
|
62
58
|
console.error(t('common.step_login', 1));
|
|
63
|
-
|
|
64
|
-
if (!
|
|
65
|
-
console.error(t('common.login_no_cache'));
|
|
66
|
-
cookieData = triggerLogin();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (!cookieData || !cookieData.cookies) {
|
|
59
|
+
const authRef = createAuthRef();
|
|
60
|
+
if (!authRef || !authRef.csrfToken) {
|
|
70
61
|
console.error(t('list_forms.no_login'));
|
|
71
62
|
process.exit(1);
|
|
72
63
|
}
|
|
73
|
-
|
|
74
|
-
const authRef = {
|
|
75
|
-
csrfToken: cookieData.csrf_token,
|
|
76
|
-
cookies: cookieData.cookies,
|
|
77
|
-
baseUrl: resolveBaseUrl(cookieData),
|
|
78
|
-
cookieData,
|
|
79
|
-
};
|
|
80
64
|
console.error(t('common.login_ready', authRef.baseUrl));
|
|
81
65
|
|
|
82
66
|
console.error(t('list_forms.step_get'));
|
package/lib/app/nav-group.js
CHANGED
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
const querystring = require('querystring');
|
|
4
4
|
const {
|
|
5
|
-
loadCookieData,
|
|
6
|
-
triggerLogin,
|
|
7
|
-
resolveBaseUrl,
|
|
8
5
|
httpGet,
|
|
9
6
|
httpPost,
|
|
10
7
|
requestWithAutoLogin,
|
|
11
8
|
} = require('../core/utils');
|
|
9
|
+
const { createAuthRef } = require('../core/yida-client');
|
|
12
10
|
|
|
13
11
|
const ROOT_NAV_UUID = 'NAV-SYSTEM-PARENT-UUID';
|
|
14
12
|
const FORM_UUID_FALLBACK = 'NAV-SYSTEM-FROM-ME-UUID';
|
|
@@ -365,21 +363,11 @@ function countChildren(list, navUuid) {
|
|
|
365
363
|
}
|
|
366
364
|
|
|
367
365
|
function loadAuthRef() {
|
|
368
|
-
|
|
369
|
-
if (!
|
|
370
|
-
cookieData = triggerLogin();
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
if (!cookieData || !cookieData.cookies) {
|
|
366
|
+
const authRef = createAuthRef();
|
|
367
|
+
if (!authRef || !authRef.csrfToken) {
|
|
374
368
|
throw new Error('No valid Yida login cache found. Run openyida login first.');
|
|
375
369
|
}
|
|
376
|
-
|
|
377
|
-
return {
|
|
378
|
-
csrfToken: cookieData.csrf_token,
|
|
379
|
-
cookies: cookieData.cookies,
|
|
380
|
-
baseUrl: resolveBaseUrl(cookieData),
|
|
381
|
-
cookieData,
|
|
382
|
-
};
|
|
370
|
+
return authRef;
|
|
383
371
|
}
|
|
384
372
|
|
|
385
373
|
async function fetchNavigationList(appType, authRef) {
|
|
@@ -393,8 +381,7 @@ async function fetchNavigationList(appType, authRef) {
|
|
|
393
381
|
_csrf_token: auth.csrfToken,
|
|
394
382
|
_locale_time_zone_offset: 28800000,
|
|
395
383
|
_stamp: Date.now(),
|
|
396
|
-
}
|
|
397
|
-
auth.cookies
|
|
384
|
+
}
|
|
398
385
|
);
|
|
399
386
|
}, authRef);
|
|
400
387
|
|
|
@@ -430,7 +417,7 @@ async function postNavAction(appType, action, payload, authRef) {
|
|
|
430
417
|
`?_api=${encodeURIComponent(apiNames[action])}` +
|
|
431
418
|
`&_mock=false&_csrf_token=${encodeURIComponent(auth.csrfToken)}` +
|
|
432
419
|
`&_stamp=${Date.now()}`;
|
|
433
|
-
return httpPost(auth.baseUrl, path, querystring.stringify(payload)
|
|
420
|
+
return httpPost(auth.baseUrl, path, querystring.stringify(payload));
|
|
434
421
|
}, authRef);
|
|
435
422
|
|
|
436
423
|
if (!result || result.success === false) {
|
package/lib/app/publish.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* 流程:
|
|
12
12
|
* 1. 读取源文件,通过内置 babel-transform 编译 + UglifyJS 压缩
|
|
13
13
|
* 2. 用代码动态构建 Schema,将 source/compiled 填入 actions.module
|
|
14
|
-
* 3. 读取本地
|
|
14
|
+
* 3. 读取本地 token session 获取登录态;若未登录或 token 失效,则提示重新执行 openyida login
|
|
15
15
|
* 4. 通过 HTTP POST 调用 saveFormSchema 接口发布 Schema
|
|
16
16
|
*/
|
|
17
17
|
|
|
@@ -22,11 +22,9 @@ const http = require('http');
|
|
|
22
22
|
const querystring = require('querystring');
|
|
23
23
|
const {
|
|
24
24
|
findProjectRoot,
|
|
25
|
-
|
|
26
|
-
isCsrfTokenExpired,
|
|
27
|
-
loadCookieData,
|
|
25
|
+
loadAuthData,
|
|
28
26
|
triggerLogin,
|
|
29
|
-
|
|
27
|
+
httpPost,
|
|
30
28
|
httpGet,
|
|
31
29
|
requestWithAutoLogin,
|
|
32
30
|
} = require('../core/utils');
|
|
@@ -106,8 +104,8 @@ function parseArgs(argv = process.argv.slice(2)) {
|
|
|
106
104
|
|
|
107
105
|
// ── 从登录态解析 baseUrl ─────────────────────────────
|
|
108
106
|
|
|
109
|
-
function resolveBaseUrl(
|
|
110
|
-
return (
|
|
107
|
+
function resolveBaseUrl(authData) {
|
|
108
|
+
return (authData.base_url || DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
111
109
|
}
|
|
112
110
|
|
|
113
111
|
// ── ID 生成工具 ──────────────────────────────────────
|
|
@@ -320,8 +318,7 @@ async function fetchExistingSchemaContent(appType, formUuid, authRef) {
|
|
|
320
318
|
return httpGet(
|
|
321
319
|
auth.baseUrl,
|
|
322
320
|
`/alibaba/web/${appType}/${PREFIX}/query/formdesign/getFormSchema.json`,
|
|
323
|
-
{ formUuid, schemaVersion: SCHEMA_VERSION }
|
|
324
|
-
auth.cookies
|
|
321
|
+
{ formUuid, schemaVersion: SCHEMA_VERSION }
|
|
325
322
|
);
|
|
326
323
|
}, authRef);
|
|
327
324
|
|
|
@@ -658,148 +655,32 @@ function buildCanvasSchemaContent(sourceCode, runtimeCode, importedModules, form
|
|
|
658
655
|
|
|
659
656
|
// ── 4. 发送 saveFormSchema 请求 ──────────────────────
|
|
660
657
|
|
|
661
|
-
function sendSaveRequest(csrfToken,
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
domainCode: DOMAIN_CODE,
|
|
672
|
-
importSchema: true,
|
|
673
|
-
});
|
|
674
|
-
|
|
675
|
-
const cookieHeader = cookies
|
|
676
|
-
.map((cookie) => `${cookie.name}=${cookie.value}`)
|
|
677
|
-
.join('; ');
|
|
678
|
-
|
|
679
|
-
const parsedUrl = new URL(baseUrl);
|
|
680
|
-
const isHttps = parsedUrl.protocol === 'https:';
|
|
681
|
-
const requestModule = isHttps ? https : http;
|
|
682
|
-
|
|
683
|
-
const requestOptions = {
|
|
684
|
-
hostname: parsedUrl.hostname,
|
|
685
|
-
port: parsedUrl.port || (isHttps ? 443 : 80),
|
|
686
|
-
path: saveSchemaPath,
|
|
687
|
-
method: 'POST',
|
|
688
|
-
headers: {
|
|
689
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
690
|
-
'Content-Length': Buffer.byteLength(postData),
|
|
691
|
-
Origin: baseUrl,
|
|
692
|
-
Referer: `${baseUrl}/`,
|
|
693
|
-
Cookie: cookieHeader,
|
|
694
|
-
},
|
|
695
|
-
};
|
|
696
|
-
|
|
697
|
-
const request = requestModule.request(requestOptions, (response) => {
|
|
698
|
-
let responseData = '';
|
|
699
|
-
response.on('data', (chunk) => { responseData += chunk; });
|
|
700
|
-
response.on('end', () => {
|
|
701
|
-
info(t('common.http_status', response.statusCode));
|
|
702
|
-
let parsed;
|
|
703
|
-
try {
|
|
704
|
-
parsed = JSON.parse(responseData);
|
|
705
|
-
} catch (parseError) {
|
|
706
|
-
warn(t('common.response_body', responseData.substring(0, 500)));
|
|
707
|
-
resolve({ success: false, errorMsg: 'HTTP ' + response.statusCode + ': ' + t('common.response_not_json') });
|
|
708
|
-
return;
|
|
709
|
-
}
|
|
710
|
-
// 检测登录过期(errorCode: "307")
|
|
711
|
-
if (isLoginExpired(parsed)) {
|
|
712
|
-
warn(t('common.login_expired', parsed.errorMsg));
|
|
713
|
-
resolve({ __needLogin: true });
|
|
714
|
-
return;
|
|
715
|
-
}
|
|
716
|
-
// 检测 csrf_token 过期(errorCode: "TIANSHU_000030")
|
|
717
|
-
if (isCsrfTokenExpired(parsed)) {
|
|
718
|
-
warn(t('common.csrf_expired', parsed.errorMsg));
|
|
719
|
-
resolve({ __csrfExpired: true });
|
|
720
|
-
return;
|
|
721
|
-
}
|
|
722
|
-
resolve(parsed);
|
|
723
|
-
});
|
|
724
|
-
});
|
|
725
|
-
|
|
726
|
-
request.on('error', (requestError) => { reject(requestError); });
|
|
727
|
-
|
|
728
|
-
request.write(postData);
|
|
729
|
-
request.end();
|
|
658
|
+
function sendSaveRequest(csrfToken, schemaContent, baseUrl, appType, formUuid) {
|
|
659
|
+
const saveSchemaPath = `/alibaba/web/${appType}/${PREFIX}/query/formdesign/saveFormSchema.json?_stamp=${Date.now()}`;
|
|
660
|
+
const postData = querystring.stringify({
|
|
661
|
+
_csrf_token: csrfToken,
|
|
662
|
+
prefix: PREFIX,
|
|
663
|
+
content: schemaContent,
|
|
664
|
+
formUuid: formUuid,
|
|
665
|
+
schemaVersion: SCHEMA_VERSION,
|
|
666
|
+
domainCode: DOMAIN_CODE,
|
|
667
|
+
importSchema: true,
|
|
730
668
|
});
|
|
669
|
+
return httpPost(baseUrl, saveSchemaPath, postData);
|
|
731
670
|
}
|
|
732
671
|
|
|
733
672
|
// ── 5. 发送 updateFormConfig 请求 ────────────────────
|
|
734
673
|
|
|
735
|
-
function sendUpdateConfigRequest(csrfToken,
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
configType: 'MINI_RESOURCE',
|
|
744
|
-
value: value,
|
|
745
|
-
});
|
|
746
|
-
|
|
747
|
-
const cookieHeader = cookies
|
|
748
|
-
.map((cookie) => `${cookie.name}=${cookie.value}`)
|
|
749
|
-
.join('; ');
|
|
750
|
-
|
|
751
|
-
const parsedUrl = new URL(baseUrl);
|
|
752
|
-
const isHttps = parsedUrl.protocol === 'https:';
|
|
753
|
-
const requestModule = isHttps ? https : http;
|
|
754
|
-
|
|
755
|
-
const requestOptions = {
|
|
756
|
-
hostname: parsedUrl.hostname,
|
|
757
|
-
port: parsedUrl.port || (isHttps ? 443 : 80),
|
|
758
|
-
path: updateConfigPath,
|
|
759
|
-
method: 'POST',
|
|
760
|
-
headers: {
|
|
761
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
762
|
-
'Content-Length': Buffer.byteLength(postData),
|
|
763
|
-
Origin: baseUrl,
|
|
764
|
-
Referer: `${baseUrl}/`,
|
|
765
|
-
Cookie: cookieHeader,
|
|
766
|
-
},
|
|
767
|
-
};
|
|
768
|
-
|
|
769
|
-
const request = requestModule.request(requestOptions, (response) => {
|
|
770
|
-
let responseData = '';
|
|
771
|
-
response.on('data', (chunk) => { responseData += chunk; });
|
|
772
|
-
response.on('end', () => {
|
|
773
|
-
info(t('common.http_status', response.statusCode));
|
|
774
|
-
let parsed;
|
|
775
|
-
try {
|
|
776
|
-
parsed = JSON.parse(responseData);
|
|
777
|
-
} catch (parseError) {
|
|
778
|
-
warn(t('common.response_body', responseData.substring(0, 500)));
|
|
779
|
-
resolve({ success: false, errorMsg: 'HTTP ' + response.statusCode + ': ' + t('common.response_not_json') });
|
|
780
|
-
return;
|
|
781
|
-
}
|
|
782
|
-
// 检测登录过期(errorCode: "307")
|
|
783
|
-
if (isLoginExpired(parsed)) {
|
|
784
|
-
warn(t('common.login_expired', parsed.errorMsg));
|
|
785
|
-
resolve({ __needLogin: true });
|
|
786
|
-
return;
|
|
787
|
-
}
|
|
788
|
-
// 检测 csrf_token 过期(errorCode: "TIANSHU_000030")
|
|
789
|
-
if (isCsrfTokenExpired(parsed)) {
|
|
790
|
-
warn(t('common.csrf_expired', parsed.errorMsg));
|
|
791
|
-
resolve({ __csrfExpired: true });
|
|
792
|
-
return;
|
|
793
|
-
}
|
|
794
|
-
resolve(parsed);
|
|
795
|
-
});
|
|
796
|
-
});
|
|
797
|
-
|
|
798
|
-
request.on('error', (requestError) => { reject(requestError); });
|
|
799
|
-
|
|
800
|
-
request.write(postData);
|
|
801
|
-
request.end();
|
|
674
|
+
function sendUpdateConfigRequest(csrfToken, baseUrl, appType, formUuid, version, value) {
|
|
675
|
+
const updateConfigPath = `/dingtalk/web/${appType}/query/formdesign/updateFormConfig.json`;
|
|
676
|
+
const postData = querystring.stringify({
|
|
677
|
+
_csrf_token: csrfToken,
|
|
678
|
+
formUuid: formUuid,
|
|
679
|
+
version: version,
|
|
680
|
+
configType: 'MINI_RESOURCE',
|
|
681
|
+
value: value,
|
|
802
682
|
});
|
|
683
|
+
return httpPost(baseUrl, updateConfigPath, postData);
|
|
803
684
|
}
|
|
804
685
|
|
|
805
686
|
function walkFiles(dir, results, limit) {
|
|
@@ -940,14 +821,13 @@ async function ensurePublishTargetOrExit(appType, formUuid, authRef, options = {
|
|
|
940
821
|
return null;
|
|
941
822
|
}
|
|
942
823
|
|
|
943
|
-
function sendHealthCheckRequest(pageUrl
|
|
824
|
+
async function sendHealthCheckRequest(pageUrl) {
|
|
825
|
+
const { getAccessToken } = require('../auth/token-auth');
|
|
826
|
+
const accessToken = await getAccessToken();
|
|
944
827
|
return new Promise((resolve) => {
|
|
945
828
|
const parsedUrl = new URL(pageUrl);
|
|
946
829
|
const isHttps = parsedUrl.protocol === 'https:';
|
|
947
830
|
const requestModule = isHttps ? https : http;
|
|
948
|
-
const cookieHeader = cookies
|
|
949
|
-
.map((cookie) => `${cookie.name}=${cookie.value}`)
|
|
950
|
-
.join('; ');
|
|
951
831
|
const requestOptions = {
|
|
952
832
|
hostname: parsedUrl.hostname,
|
|
953
833
|
port: parsedUrl.port || (isHttps ? 443 : 80),
|
|
@@ -955,7 +835,7 @@ function sendHealthCheckRequest(pageUrl, cookies) {
|
|
|
955
835
|
method: 'GET',
|
|
956
836
|
headers: {
|
|
957
837
|
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
958
|
-
|
|
838
|
+
Authorization: `Bearer ${accessToken}`,
|
|
959
839
|
},
|
|
960
840
|
timeout: 30000,
|
|
961
841
|
};
|
|
@@ -1061,22 +941,24 @@ async function main(argv) {
|
|
|
1061
941
|
const compiledPath = path.join(findProjectRoot(), 'pages', 'dist', `${parsedSource.name}.js`);
|
|
1062
942
|
|
|
1063
943
|
step(2, t('common.step_login', 2));
|
|
1064
|
-
let
|
|
1065
|
-
if (!
|
|
944
|
+
let authData = loadAuthData();
|
|
945
|
+
if (!authData || !authData.csrf_token) {
|
|
1066
946
|
warn(t('common.login_no_cache'));
|
|
1067
|
-
|
|
947
|
+
authData = triggerLogin();
|
|
1068
948
|
}
|
|
1069
|
-
let
|
|
1070
|
-
let baseUrl = resolveBaseUrl(
|
|
949
|
+
let csrfToken = authData.csrf_token;
|
|
950
|
+
let baseUrl = resolveBaseUrl(authData);
|
|
1071
951
|
const authRef = {
|
|
1072
952
|
csrfToken,
|
|
1073
|
-
cookies,
|
|
1074
953
|
baseUrl,
|
|
1075
|
-
|
|
954
|
+
authData,
|
|
955
|
+
authMode: authData.auth_mode || '',
|
|
956
|
+
authSource: authData.auth_source || '',
|
|
957
|
+
corpId: authData.corp_id || '',
|
|
958
|
+
userId: authData.user_id || '',
|
|
1076
959
|
};
|
|
1077
960
|
await ensurePublishTargetOrExit(appType, formUuid, authRef, { force });
|
|
1078
961
|
csrfToken = authRef.csrfToken;
|
|
1079
|
-
cookies = authRef.cookies;
|
|
1080
962
|
baseUrl = authRef.baseUrl;
|
|
1081
963
|
|
|
1082
964
|
let schemaContent;
|
|
@@ -1092,7 +974,6 @@ async function main(argv) {
|
|
|
1092
974
|
process.exit(1);
|
|
1093
975
|
}
|
|
1094
976
|
csrfToken = authRef.csrfToken;
|
|
1095
|
-
cookies = authRef.cookies;
|
|
1096
977
|
baseUrl = authRef.baseUrl;
|
|
1097
978
|
schemaContent = buildSchemaContent(sourceCode, compiledCode, formUuid, { existingDataSource });
|
|
1098
979
|
}
|
|
@@ -1105,25 +986,15 @@ async function main(argv) {
|
|
|
1105
986
|
label('Source:', sourcePath);
|
|
1106
987
|
label('Compiled:', compiledPath);
|
|
1107
988
|
step(3, t('publish.step_publish'));
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
}
|
|
1118
|
-
|
|
1119
|
-
if (response && response.__needLogin) {
|
|
1120
|
-
cookieData = triggerLogin();
|
|
1121
|
-
csrfToken = cookieData.csrf_token;
|
|
1122
|
-
cookies = cookieData.cookies;
|
|
1123
|
-
baseUrl = resolveBaseUrl(cookieData);
|
|
1124
|
-
info(t('publish.resend_save'));
|
|
1125
|
-
response = await sendSaveRequest(csrfToken, cookies, schemaContent, baseUrl, appType, formUuid);
|
|
1126
|
-
}
|
|
989
|
+
const response = await requestWithAutoLogin((ref) => sendSaveRequest(
|
|
990
|
+
ref.csrfToken,
|
|
991
|
+
schemaContent,
|
|
992
|
+
ref.baseUrl,
|
|
993
|
+
appType,
|
|
994
|
+
formUuid
|
|
995
|
+
), authRef);
|
|
996
|
+
csrfToken = authRef.csrfToken;
|
|
997
|
+
baseUrl = authRef.baseUrl;
|
|
1127
998
|
|
|
1128
999
|
if (!response || !response.success) {
|
|
1129
1000
|
const errorMsg = response ? response.errorMsg || t('common.unknown_error') : t('common.request_failed');
|
|
@@ -1143,31 +1014,22 @@ async function main(argv) {
|
|
|
1143
1014
|
|
|
1144
1015
|
step(4, t('publish.step_config'));
|
|
1145
1016
|
info(t('publish.sending_config'));
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
if (configResponse && configResponse.__needLogin) {
|
|
1158
|
-
cookieData = triggerLogin();
|
|
1159
|
-
csrfToken = cookieData.csrf_token;
|
|
1160
|
-
cookies = cookieData.cookies;
|
|
1161
|
-
baseUrl = resolveBaseUrl(cookieData);
|
|
1162
|
-
info(t('publish.resend_config'));
|
|
1163
|
-
configResponse = await sendUpdateConfigRequest(csrfToken, cookies, baseUrl, appType, savedFormUuid, version, 8);
|
|
1164
|
-
}
|
|
1017
|
+
const configResponse = await requestWithAutoLogin((ref) => sendUpdateConfigRequest(
|
|
1018
|
+
ref.csrfToken,
|
|
1019
|
+
ref.baseUrl,
|
|
1020
|
+
appType,
|
|
1021
|
+
savedFormUuid,
|
|
1022
|
+
version,
|
|
1023
|
+
8
|
|
1024
|
+
), authRef);
|
|
1025
|
+
csrfToken = authRef.csrfToken;
|
|
1026
|
+
baseUrl = authRef.baseUrl;
|
|
1165
1027
|
|
|
1166
1028
|
const pageUrl = `${baseUrl}/${appType}/workbench/${savedFormUuid}`;
|
|
1167
1029
|
let healthCheckResult = null;
|
|
1168
1030
|
if (healthCheck) {
|
|
1169
1031
|
step(5, t('publish.step_health_check'));
|
|
1170
|
-
healthCheckResult = await sendHealthCheckRequest(pageUrl
|
|
1032
|
+
healthCheckResult = await sendHealthCheckRequest(pageUrl);
|
|
1171
1033
|
if (healthCheckResult.ok) {
|
|
1172
1034
|
success(t('publish.health_check_ok', healthCheckResult.statusCode));
|
|
1173
1035
|
} else {
|
package/lib/app/update-app.js
CHANGED
|
@@ -8,12 +8,10 @@
|
|
|
8
8
|
|
|
9
9
|
const querystring = require('querystring');
|
|
10
10
|
const {
|
|
11
|
-
loadCookieData,
|
|
12
|
-
triggerLogin,
|
|
13
|
-
resolveBaseUrl,
|
|
14
11
|
httpPost,
|
|
15
12
|
requestWithAutoLogin,
|
|
16
13
|
} = require('../core/utils');
|
|
14
|
+
const { createAuthRef } = require('../core/yida-client');
|
|
17
15
|
const { t } = require('../core/i18n');
|
|
18
16
|
const { buildYidaI18n } = require('../core/yida-i18n');
|
|
19
17
|
|
|
@@ -113,7 +111,7 @@ async function run(args) {
|
|
|
113
111
|
const params = parseArgs(args);
|
|
114
112
|
|
|
115
113
|
// 验证必填参数
|
|
116
|
-
const { c, banner, step, label,
|
|
114
|
+
const { c, banner, step, label, warn, success: chalkSuccess, result: chalkResult, error: chalkError } = require('../core/chalk');
|
|
117
115
|
|
|
118
116
|
if (!params.appType) {
|
|
119
117
|
chalkError(t('update_app.missing_app_type'), { exit: false });
|
|
@@ -138,18 +136,7 @@ async function run(args) {
|
|
|
138
136
|
|
|
139
137
|
// Step 1: 读取登录态
|
|
140
138
|
step(1, t('common.step_login', 1));
|
|
141
|
-
|
|
142
|
-
if (!cookieData) {
|
|
143
|
-
info(t('common.login_no_cache'));
|
|
144
|
-
cookieData = triggerLogin();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const authRef = {
|
|
148
|
-
csrfToken: cookieData.csrf_token,
|
|
149
|
-
cookies: cookieData.cookies,
|
|
150
|
-
baseUrl: resolveBaseUrl(cookieData),
|
|
151
|
-
cookieData,
|
|
152
|
-
};
|
|
139
|
+
const authRef = createAuthRef();
|
|
153
140
|
chalkSuccess(t('common.login_ready', authRef.baseUrl));
|
|
154
141
|
|
|
155
142
|
// Step 2: 更新应用
|
|
@@ -199,8 +186,7 @@ async function run(args) {
|
|
|
199
186
|
return httpPost(
|
|
200
187
|
auth.baseUrl,
|
|
201
188
|
`/query/app/updateAppName.json?_api=Form.updateAppName&_mock=false&_stamp=${Date.now()}`,
|
|
202
|
-
postData
|
|
203
|
-
auth.cookies
|
|
189
|
+
postData
|
|
204
190
|
);
|
|
205
191
|
}, authRef);
|
|
206
192
|
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
const https = require('https');
|
|
2
|
-
const http = require('http');
|
|
3
1
|
const querystring = require('querystring');
|
|
4
2
|
|
|
5
|
-
const {
|
|
3
|
+
const { loadAuthData, triggerLogin, resolveBaseUrl, httpPost, requestWithAutoLogin } = require('../core/utils');
|
|
6
4
|
const { t } = require('../core/i18n');
|
|
7
5
|
const { buildYidaTitleI18n, normalizeYidaLocale, resolveContentLocale } = require('../core/yida-i18n');
|
|
8
6
|
const { banner, step, label, success, fail, warn, info, error, result, usage } = require('../core/chalk');
|
|
@@ -75,72 +73,8 @@ function buildPostData(csrfToken, formUuid, isRenderNav, title) {
|
|
|
75
73
|
}
|
|
76
74
|
|
|
77
75
|
|
|
78
|
-
function sendPostRequest(baseUrl,
|
|
79
|
-
return
|
|
80
|
-
const cookieHeader = cookies
|
|
81
|
-
.map((cookie) => `${cookie.name}=${cookie.value}`)
|
|
82
|
-
.join('; ');
|
|
83
|
-
|
|
84
|
-
const parsedUrl = new URL(baseUrl);
|
|
85
|
-
const isHttps = parsedUrl.protocol === 'https:';
|
|
86
|
-
const requestModule = isHttps ? https : http;
|
|
87
|
-
|
|
88
|
-
const requestOptions = {
|
|
89
|
-
hostname: parsedUrl.hostname,
|
|
90
|
-
port: parsedUrl.port || (isHttps ? 443 : 80),
|
|
91
|
-
path: requestPath,
|
|
92
|
-
method: 'POST',
|
|
93
|
-
headers: {
|
|
94
|
-
Origin: baseUrl,
|
|
95
|
-
Referer: baseUrl + '/',
|
|
96
|
-
Cookie: cookieHeader,
|
|
97
|
-
Accept: 'application/json, text/json',
|
|
98
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
99
|
-
'x-requested-with': 'XMLHttpRequest',
|
|
100
|
-
},
|
|
101
|
-
timeout: 30000,
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const request = requestModule.request(requestOptions, (response) => {
|
|
105
|
-
let responseData = '';
|
|
106
|
-
response.on('data', (chunk) => { responseData += chunk; });
|
|
107
|
-
response.on('end', () => {
|
|
108
|
-
info(t('common.http_status', response.statusCode));
|
|
109
|
-
let parsed;
|
|
110
|
-
try {
|
|
111
|
-
parsed = JSON.parse(responseData);
|
|
112
|
-
} catch (parseError) {
|
|
113
|
-
warn(t('common.response_body', responseData.substring(0, 500)));
|
|
114
|
-
resolve({ success: false, errorMsg: 'HTTP ' + response.statusCode + ': ' + t('common.response_not_json') });
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
if (isLoginExpired(parsed)) {
|
|
118
|
-
warn(t('common.login_expired', parsed.errorMsg));
|
|
119
|
-
resolve({ __needLogin: true });
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
if (isCsrfTokenExpired(parsed)) {
|
|
123
|
-
warn(t('common.csrf_expired', parsed.errorMsg));
|
|
124
|
-
resolve({ __csrfExpired: true });
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
resolve(parsed);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
request.on('timeout', () => {
|
|
132
|
-
warn(t('common.request_timeout'));
|
|
133
|
-
request.destroy();
|
|
134
|
-
reject(new Error(t('common.request_timeout')));
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
request.on('error', (requestError) => {
|
|
138
|
-
reject(requestError);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
request.write(postData);
|
|
142
|
-
request.end();
|
|
143
|
-
});
|
|
76
|
+
function sendPostRequest(baseUrl, requestPath, postData) {
|
|
77
|
+
return httpPost(baseUrl, requestPath, postData);
|
|
144
78
|
}
|
|
145
79
|
|
|
146
80
|
async function main() {
|
|
@@ -153,58 +87,31 @@ async function main() {
|
|
|
153
87
|
label('Title:', title);
|
|
154
88
|
|
|
155
89
|
step(1, t('common.step_login_label'));
|
|
156
|
-
let
|
|
157
|
-
if (!
|
|
90
|
+
let authData = loadAuthData();
|
|
91
|
+
if (!authData) {
|
|
158
92
|
warn(t('common.no_login_cache'));
|
|
159
|
-
|
|
93
|
+
authData = triggerLogin();
|
|
160
94
|
}
|
|
161
|
-
|
|
162
|
-
|
|
95
|
+
const authRef = {
|
|
96
|
+
csrfToken: authData.csrf_token,
|
|
97
|
+
baseUrl: resolveBaseUrl(authData),
|
|
98
|
+
authData,
|
|
99
|
+
authMode: authData.auth_mode || '',
|
|
100
|
+
authSource: authData.auth_source || '',
|
|
101
|
+
corpId: authData.corp_id || '',
|
|
102
|
+
userId: authData.user_id || '',
|
|
103
|
+
};
|
|
104
|
+
const baseUrl = authRef.baseUrl;
|
|
163
105
|
success(t('common.login_ready', baseUrl));
|
|
164
106
|
label('Locale:', resolveContentLocale({ locale, baseUrl }));
|
|
165
107
|
|
|
166
108
|
step(2, t('update_form_config.step_update'));
|
|
167
109
|
info(t('update_form_config.sending_request'));
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const postData = buildPostData(csrfToken, formUuid, isRenderNav, title);
|
|
171
|
-
|
|
172
|
-
let apiResult = await sendPostRequest(
|
|
173
|
-
baseUrl,
|
|
174
|
-
cookies,
|
|
110
|
+
const apiResult = await requestWithAutoLogin((ref) => sendPostRequest(
|
|
111
|
+
ref.baseUrl,
|
|
175
112
|
`/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
|
|
176
|
-
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
if (apiResult && apiResult.__csrfExpired) {
|
|
180
|
-
cookieData = refreshCsrfToken();
|
|
181
|
-
csrfToken = cookieData.csrf_token;
|
|
182
|
-
cookies = cookieData.cookies;
|
|
183
|
-
baseUrl = resolveBaseUrl(cookieData);
|
|
184
|
-
const newPostData = buildPostData(csrfToken, formUuid, isRenderNav, title);
|
|
185
|
-
info(t('common.resend_csrf'));
|
|
186
|
-
apiResult = await sendPostRequest(
|
|
187
|
-
baseUrl,
|
|
188
|
-
cookies,
|
|
189
|
-
`/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
|
|
190
|
-
newPostData
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if (apiResult && apiResult.__needLogin) {
|
|
195
|
-
cookieData = triggerLogin();
|
|
196
|
-
csrfToken = cookieData.csrf_token;
|
|
197
|
-
cookies = cookieData.cookies;
|
|
198
|
-
baseUrl = resolveBaseUrl(cookieData);
|
|
199
|
-
const newPostData = buildPostData(csrfToken, formUuid, isRenderNav, title);
|
|
200
|
-
info(t('common.resend'));
|
|
201
|
-
apiResult = await sendPostRequest(
|
|
202
|
-
baseUrl,
|
|
203
|
-
cookies,
|
|
204
|
-
`/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
|
|
205
|
-
newPostData
|
|
206
|
-
);
|
|
207
|
-
}
|
|
113
|
+
buildPostData(ref.csrfToken, formUuid, isRenderNav, title)
|
|
114
|
+
), authRef);
|
|
208
115
|
|
|
209
116
|
if (apiResult && !apiResult.__needLogin && !apiResult.__csrfExpired) {
|
|
210
117
|
if (apiResult.success) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const { createAuthRef, createYidaClient } = require('../core/yida-client');
|
|
3
|
+
const { createAuthRef, createYidaClient, isAuthRefReady } = require('../core/yida-client');
|
|
4
4
|
const { CliError } = require('../core/cli-error');
|
|
5
5
|
const { searchUsers } = require('../corp-manager/api');
|
|
6
6
|
|
|
@@ -81,7 +81,7 @@ function printJson(payload) {
|
|
|
81
81
|
|
|
82
82
|
function getAuthRef() {
|
|
83
83
|
const authRef = createAuthRef();
|
|
84
|
-
if (!authRef
|
|
84
|
+
if (!isAuthRefReady(authRef)) {
|
|
85
85
|
throw new Error('无法获取有效登录态或 CSRF Token');
|
|
86
86
|
}
|
|
87
87
|
return authRef;
|