@share-crm/sharedev-cli 0.0.4-rc.21 → 0.0.4-rc.22

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.
Files changed (2) hide show
  1. package/dist/sharedev.js +515 -384
  2. package/package.json +1 -1
package/dist/sharedev.js CHANGED
@@ -10582,15 +10582,18 @@ Examples:
10582
10582
  $ sharedev object-dev scene pull --objectApiName AccountObj --sceneApiName demo_scene
10583
10583
  $ sharedev object-dev scene push --objectApiName AccountObj --sceneApiNames demo_scene,test_scene
10584
10584
  $ sharedev object-dev scene update --objectApiName AccountObj --data "{}"
10585
- $ sharedev object-dev object-mapping pull --objectApiNames AccountObj,LeadsObj
10586
- $ sharedev object-dev object-mapping create --objectApiName AccountObj --data "{}"
10587
- $ sharedev object-dev object-mapping update --objectApiName AccountObj --data "{}"
10588
- $ sharedev object-dev object-mapping push --objectApiName AccountObj --ruleApiNames rule_xsh2__c,rule_xxa1__c
10589
- $ sharedev object-dev convert-rule list --objectApiName AccountObj
10590
- $ sharedev object-dev convert-rule pull --objectApiNames AccountObj,LeadsObj
10591
- $ sharedev object-dev convert-rule create --objectApiName AccountObj --data "{}"
10592
- $ sharedev object-dev convert-rule update --objectApiName AccountObj --data "{}"
10593
- $ sharedev object-dev convert-rule push --objectApiName AccountObj --ruleApiNames rule_xsh2__c,rule_xxa1__c
10585
+ $ sharedev object-dev object-mapping pull
10586
+ $ sharedev object-dev object-mapping create --data "{}"
10587
+ $ sharedev object-dev object-mapping update --data "{}"
10588
+ $ sharedev object-dev object-mapping push --ruleApiNames rule_xsh2__c,rule_xxa1__c
10589
+ $ sharedev object-dev object-mapping push
10590
+ $ sharedev object-dev convert-rule list
10591
+ $ sharedev object-dev convert-rule pull
10592
+ $ sharedev object-dev convert-rule create --data "{}"
10593
+ $ sharedev object-dev convert-rule update --data "{}"
10594
+ $ sharedev object-dev convert-rule push --ruleApiNames rule_xsh2__c,rule_xxa1__c
10595
+ $ sharedev object-dev email-template list
10596
+ $ sharedev object-dev email-template list --objDescApiName AccountObj
10594
10597
  `);
10595
10598
  const objectCommand = objectDev.command('object').description('Object describe operations');
10596
10599
  objectCommand
@@ -11032,7 +11035,8 @@ Examples:
11032
11035
  objectMappingCommand
11033
11036
  .command('pull')
11034
11037
  .description('Pull object-mapping rules from remote and save locally')
11035
- .requiredOption('--objectApiNames <apiNames>', 'Object apiNames, comma separated')
11038
+ .option('--status <number>', 'Filter by status (1=enabled, 0=disabled)')
11039
+ .option('--ruleName <name>', 'Filter by rule name')
11036
11040
  .option('--force', 'Force overwrite local metadata files regardless of local status')
11037
11041
  .option('--yes', 'Skip the force confirmation prompt')
11038
11042
  .option('--skipOverwriteConfirm', 'Skip overwrite confirm for local metadata not in unchanged status and keep local file')
@@ -11043,7 +11047,7 @@ Examples:
11043
11047
  objectMappingCommand
11044
11048
  .command('create')
11045
11049
  .description('Create local object-mapping rule draft without remote API call')
11046
- .requiredOption('--objectApiName <apiName>', 'Target object apiName')
11050
+ .option('--objectApiName <apiName>', 'Target object apiName (can also be set via data.describe_api_name)')
11047
11051
  .requiredOption('--data <json>', 'Object-mapping rule data (JSON string)')
11048
11052
  .option('--force', 'Force overwrite local metadata file if it already exists')
11049
11053
  .action((0, command_ts_1.createCommandAction)('object-dev', 'object-mapping.create', runtimeContext, async ({ options, context }) => {
@@ -11053,7 +11057,6 @@ Examples:
11053
11057
  objectMappingCommand
11054
11058
  .command('update')
11055
11059
  .description('Update local object-mapping rule draft without remote API call')
11056
- .requiredOption('--objectApiName <apiName>', 'Target object apiName')
11057
11060
  .requiredOption('--data <json>', 'Object-mapping rule data (JSON string)')
11058
11061
  .action((0, command_ts_1.createCommandAction)('object-dev', 'object-mapping.update', runtimeContext, async ({ options, context }) => {
11059
11062
  void context;
@@ -11062,8 +11065,7 @@ Examples:
11062
11065
  objectMappingCommand
11063
11066
  .command('push')
11064
11067
  .description('Push object-mapping rules to remote via shareCli execute (auto create or update)')
11065
- .requiredOption('--objectApiName <apiName>', 'Target object apiName')
11066
- .requiredOption('--ruleApiNames <ruleApiNames>', 'Target rule apiNames, comma separated')
11068
+ .option('--ruleApiNames <ruleApiNames>', 'Target rule apiNames, comma separated (push all if omitted)')
11067
11069
  .option('--skipOverwriteConfirm', 'Skip overwrite confirm when pre/post pull encounters local metadata not in unchanged status')
11068
11070
  .action((0, command_ts_1.createCommandAction)('object-dev', 'object-mapping.push', runtimeContext, async ({ options, context }) => {
11069
11071
  void context;
@@ -11073,7 +11075,7 @@ Examples:
11073
11075
  convertRuleCommand
11074
11076
  .command('list')
11075
11077
  .description('List convert rules via shareCli execute')
11076
- .requiredOption('--objectApiName <apiName>', 'Target object apiName')
11078
+ .option('--ruleName <name>', 'Filter by rule name')
11077
11079
  .action((0, command_ts_1.createCommandAction)('object-dev', 'convert-rule.list', runtimeContext, async ({ options, context }) => {
11078
11080
  void context;
11079
11081
  await (0, index_ts_1.objectDevConvertRuleListCommand)(options);
@@ -11081,7 +11083,7 @@ Examples:
11081
11083
  convertRuleCommand
11082
11084
  .command('pull')
11083
11085
  .description('Pull convert rules from remote and save locally')
11084
- .requiredOption('--objectApiNames <apiNames>', 'Object apiNames, comma separated')
11086
+ .option('--ruleName <name>', 'Filter by rule name')
11085
11087
  .option('--force', 'Force overwrite local metadata files regardless of local status')
11086
11088
  .option('--yes', 'Skip the force confirmation prompt')
11087
11089
  .option('--skipOverwriteConfirm', 'Skip overwrite confirm for local metadata not in unchanged status and keep local file')
@@ -11092,7 +11094,6 @@ Examples:
11092
11094
  convertRuleCommand
11093
11095
  .command('create')
11094
11096
  .description('Create local convert-rule draft without remote API call')
11095
- .requiredOption('--objectApiName <apiName>', 'Target object apiName')
11096
11097
  .requiredOption('--data <json>', 'Convert-rule data (JSON string)')
11097
11098
  .option('--force', 'Force overwrite local metadata file if it already exists')
11098
11099
  .action((0, command_ts_1.createCommandAction)('object-dev', 'convert-rule.create', runtimeContext, async ({ options, context }) => {
@@ -11102,7 +11103,6 @@ Examples:
11102
11103
  convertRuleCommand
11103
11104
  .command('update')
11104
11105
  .description('Update local convert-rule draft without remote API call')
11105
- .requiredOption('--objectApiName <apiName>', 'Target object apiName')
11106
11106
  .requiredOption('--data <json>', 'Convert-rule data (JSON string)')
11107
11107
  .action((0, command_ts_1.createCommandAction)('object-dev', 'convert-rule.update', runtimeContext, async ({ options, context }) => {
11108
11108
  void context;
@@ -11111,13 +11111,23 @@ Examples:
11111
11111
  convertRuleCommand
11112
11112
  .command('push')
11113
11113
  .description('Push convert rules to remote via shareCli execute (auto create or update)')
11114
- .requiredOption('--objectApiName <apiName>', 'Target object apiName')
11115
11114
  .requiredOption('--ruleApiNames <ruleApiNames>', 'Target rule apiNames, comma separated')
11116
11115
  .option('--skipOverwriteConfirm', 'Skip overwrite confirm when pre/post pull encounters local metadata not in unchanged status')
11117
11116
  .action((0, command_ts_1.createCommandAction)('object-dev', 'convert-rule.push', runtimeContext, async ({ options, context }) => {
11118
11117
  void context;
11119
11118
  await (0, index_ts_1.objectDevConvertRulePushCommand)(options);
11120
11119
  }));
11120
+ const emailTemplateCommand = objectDev.command('email-template').description('Email template operations');
11121
+ emailTemplateCommand
11122
+ .command('list')
11123
+ .description('List email templates via shareCli execute')
11124
+ .option('--objDescApiName <apiName>', 'Filter by object describe api name')
11125
+ .option('--pageNumber <number>', 'Page number (default: 1)')
11126
+ .option('--pageSize <number>', 'Page size (default: 2000)')
11127
+ .action((0, command_ts_1.createCommandAction)('object-dev', 'email-template.list', runtimeContext, async ({ options, context }) => {
11128
+ void context;
11129
+ await (0, index_ts_1.objectDevEmailTemplateListCommand)(options);
11130
+ }));
11121
11131
  }
11122
11132
 
11123
11133
 
@@ -12763,6 +12773,9 @@ const SHARE_CLI_COMMAND_PATH_MAP = {
12763
12773
  'create-rule': ['object-dev', 'convert-rule', 'create-rule'],
12764
12774
  'update-rule': ['object-dev', 'convert-rule', 'update-rule'],
12765
12775
  },
12776
+ emailTemplate: {
12777
+ 'template-page': ['object-dev', 'email-template', 'template-page'],
12778
+ },
12766
12779
  dataAuth: {
12767
12780
  getCommonPrivilegeList: ['access', 'data-auth', 'get-common-privilege-list'],
12768
12781
  batchUpdateCommonPrivilege: ['access', 'data-auth', 'batch-update-common-privilege'],
@@ -13757,13 +13770,13 @@ exports.XML_METADATA_RULES = {
13757
13770
  defaultOpenTag: '<CommonPrivilege xmlns="http://sharecrm.com/metadata">',
13758
13771
  },
13759
13772
  ObjectMapping: {
13760
- dirPathTemplate: 'tenant-config/objects/{objectApiName}/object-mappings',
13773
+ dirPathTemplate: 'tenant-config/object-mappings',
13761
13774
  fileNameTemplate: '{apiName}.object-mapping-meta.xml',
13762
13775
  apiNameVariable: 'apiName',
13763
13776
  defaultOpenTag: '<ObjectMapping xmlns="http://sharecrm.com/metadata">',
13764
13777
  },
13765
13778
  ConvertRule: {
13766
- dirPathTemplate: 'tenant-config/objects/{objectApiName}/convert-rules',
13779
+ dirPathTemplate: 'tenant-config/convert-rules',
13767
13780
  fileNameTemplate: '{apiName}.convert-rule-meta.xml',
13768
13781
  apiNameVariable: 'apiName',
13769
13782
  defaultOpenTag: '<ConvertRule xmlns="http://sharecrm.com/metadata">',
@@ -19792,23 +19805,28 @@ function printErrorMessages(errorMessages) {
19792
19805
  return true;
19793
19806
  }
19794
19807
  async function objectDevConvertRuleListCommand(options) {
19795
- const checkedObjectApiName = normalize_ts_1.default.normalizeString(options.objectApiName);
19796
- if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
19797
- throw new Error('Invalid arguments: objectApiName is required.');
19798
- }
19799
- const rules = await (0, index_ts_1.fetchConvertRuleList)(checkedObjectApiName, null);
19800
- logger_ts_1.loggerService.printTable(['apiName', 'label', 'ruleType', 'isActive'], rules.map((item) => [
19801
- normalize_ts_1.default.normalizeString(item.api_name)
19802
- ?? normalize_ts_1.default.normalizeString(item.apiName) ?? '',
19803
- normalize_ts_1.default.normalizeText(item.label),
19804
- normalize_ts_1.default.normalizeText(item.rule_type)
19805
- ?? normalize_ts_1.default.normalizeText(item.ruleType)
19806
- ?? '',
19807
- normalize_ts_1.default.normalizeText(item.is_active)
19808
- ?? normalize_ts_1.default.normalizeText(item.isActive)
19809
- ?? '',
19808
+ const items = await (0, index_ts_1.fetchConvertRuleList)({
19809
+ ruleName: options.ruleName,
19810
+ });
19811
+ // 展开 items[].ruleList[] 为扁平规则列表
19812
+ const rules = [];
19813
+ for (const item of items) {
19814
+ const ruleList = item.ruleList;
19815
+ if (ruleList) {
19816
+ rules.push(...ruleList);
19817
+ }
19818
+ }
19819
+ logger_ts_1.loggerService.printTable(['apiName', 'ruleName', 'sourceApiName', 'targetApiName', 'defineType'], rules.map((item) => [
19820
+ normalize_ts_1.default.normalizeString(item.rule_api_name) ?? '',
19821
+ normalize_ts_1.default.normalizeText(item.rule_name),
19822
+ normalize_ts_1.default.normalizeText(item.source_api_name)
19823
+ ?? normalize_ts_1.default.normalizeText(item.sourceApiName) ?? '',
19824
+ normalize_ts_1.default.normalizeText(item.target_api_name)
19825
+ ?? normalize_ts_1.default.normalizeText(item.targetApiName) ?? '',
19826
+ normalize_ts_1.default.normalizeText(item.define_type)
19827
+ ?? normalize_ts_1.default.normalizeText(item.defineType) ?? '',
19810
19828
  ]));
19811
- logger_ts_1.loggerService.success(`Convert-rule list completed: object=${checkedObjectApiName}, found=${rules.length}`);
19829
+ logger_ts_1.loggerService.success(`Convert-rule list completed: found=${rules.length}`);
19812
19830
  }
19813
19831
  async function objectDevConvertRulePullCommand(options) {
19814
19832
  if (options.force && options.skipOverwriteConfirm) {
@@ -19823,13 +19841,17 @@ async function objectDevConvertRulePullCommand(options) {
19823
19841
  throw new Error('Command cancelled.');
19824
19842
  }
19825
19843
  }
19826
- const { objectApiNames, found, written, skipped, errorMessages } = await (0, index_ts_1.convertRulePullService)(options.objectApiNames, options.force === true, options.skipOverwriteConfirm === true);
19844
+ const { found, written, skipped, errorMessages } = await (0, index_ts_1.convertRulePullService)({
19845
+ ruleName: options.ruleName,
19846
+ force: options.force === true,
19847
+ skipOverwriteConfirm: options.skipOverwriteConfirm === true,
19848
+ });
19827
19849
  if (printErrorMessages(errorMessages))
19828
19850
  return;
19829
- logger_ts_1.loggerService.success(`Convert-rule pull completed: objects=${objectApiNames.length}, found=${found}, written=${written}, skipped=${skipped}`);
19851
+ logger_ts_1.loggerService.success(`Convert-rule pull completed: found=${found}, written=${written}, skipped=${skipped}`);
19830
19852
  }
19831
19853
  async function objectDevConvertRuleCreateCommand(options) {
19832
- const result = await (0, index_ts_1.convertRuleCreateService)(options.objectApiName, options.data, options.force === true);
19854
+ const result = await (0, index_ts_1.convertRuleCreateService)(options.data, options.force === true);
19833
19855
  if (printErrorMessages(result.errorMessages))
19834
19856
  return;
19835
19857
  if (!result.filePath) {
@@ -19839,7 +19861,7 @@ async function objectDevConvertRuleCreateCommand(options) {
19839
19861
  logger_ts_1.loggerService.info(`Convert-rule metadata created: ${result.filePath}`);
19840
19862
  }
19841
19863
  async function objectDevConvertRuleUpdateCommand(options) {
19842
- const result = await (0, index_ts_1.convertRuleUpdateService)(options.objectApiName, options.data);
19864
+ const result = await (0, index_ts_1.convertRuleUpdateService)(options.data);
19843
19865
  if (!result.filePath) {
19844
19866
  throw new Error('Convert-rule metadata not updated.');
19845
19867
  }
@@ -19849,10 +19871,41 @@ async function objectDevConvertRuleUpdateCommand(options) {
19849
19871
  logger_ts_1.loggerService.info(`Convert-rule metadata updated: ${result.filePath}`);
19850
19872
  }
19851
19873
  async function objectDevConvertRulePushCommand(options) {
19852
- const pushed = await (0, index_ts_1.convertRulePushService)(options.objectApiName, options.ruleApiNames, options.skipOverwriteConfirm === true);
19874
+ const pushed = await (0, index_ts_1.convertRulePushService)(options.ruleApiNames, options.skipOverwriteConfirm === true);
19853
19875
  if (printErrorMessages(pushed.errorMessages))
19854
19876
  return;
19855
- logger_ts_1.loggerService.success(`Push completed successfully: convert-rule (${pushed.objectApiName}.${pushed.apiName})`);
19877
+ logger_ts_1.loggerService.success(`Push completed successfully: convert-rule (${pushed.apiName})`);
19878
+ }
19879
+
19880
+
19881
+ /***/ },
19882
+
19883
+ /***/ 1026
19884
+ (__unused_webpack_module, exports, __webpack_require__) {
19885
+
19886
+
19887
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19888
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19889
+ };
19890
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19891
+ exports.objectDevEmailTemplateListCommand = objectDevEmailTemplateListCommand;
19892
+ const index_ts_1 = __webpack_require__(285);
19893
+ const logger_ts_1 = __webpack_require__(3333);
19894
+ const normalize_ts_1 = __importDefault(__webpack_require__(9268));
19895
+ async function objectDevEmailTemplateListCommand(options) {
19896
+ const items = await (0, index_ts_1.fetchEmailTemplateList)({
19897
+ objDescApiName: options.objDescApiName,
19898
+ pageNumber: options.pageNumber ? Number(options.pageNumber) : undefined,
19899
+ pageSize: options.pageSize ? Number(options.pageSize) : undefined,
19900
+ });
19901
+ logger_ts_1.loggerService.printTable(['apiName', 'name', 'subject', 'objDescApiName', 'bindApl'], items.map((item) => [
19902
+ normalize_ts_1.default.normalizeString(item.apiName) ?? '',
19903
+ normalize_ts_1.default.normalizeText(item.name),
19904
+ normalize_ts_1.default.normalizeText(item.subject),
19905
+ normalize_ts_1.default.normalizeText(item.objDescApiName) ?? '',
19906
+ normalize_ts_1.default.normalizeText(item.bindAplApiname) ?? '',
19907
+ ]));
19908
+ logger_ts_1.loggerService.success(`Email-template list completed: found=${items.length}`);
19856
19909
  }
19857
19910
 
19858
19911
 
@@ -19928,7 +19981,7 @@ async function objectDevFieldPushCommand(options) {
19928
19981
 
19929
19982
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19930
19983
  exports.objectDevConvertRuleListCommand = exports.objectDevObjectMappingPushCommand = exports.objectDevObjectMappingUpdateCommand = exports.objectDevObjectMappingCreateCommand = exports.objectDevObjectMappingPullCommand = exports.objectDevButtonPushCommand = exports.objectDevButtonUpdateCommand = exports.objectDevButtonCreateCommand = exports.objectDevButtonPullCommand = exports.objectDevButtonListCommand = exports.objectDevValidateRuleUpdateCommand = exports.objectDevValidateRulePushCommand = exports.objectDevValidateRulePullCommand = exports.objectDevValidateRuleListCommand = exports.objectDevValidateRuleCreateCommand = exports.objectDevLayoutRuleUpdateCommand = exports.objectDevLayoutRulePushCommand = exports.objectDevLayoutRulePullCommand = exports.objectDevLayoutRuleListCommand = exports.objectDevLayoutRuleCreateCommand = exports.objectDevLayoutUpdateCommand = exports.objectDevLayoutPushCommand = exports.objectDevLayoutPullCommand = exports.objectDevLayoutListCommand = exports.objectDevLayoutEnableEditCommand = exports.objectDevLayoutEditStatusCommand = exports.objectDevLayoutCreateCommand = exports.objectDevFieldPushCommand = exports.objectDevFieldUpdateCommand = exports.objectDevFieldCreateCommand = exports.objectDevFieldListCommand = exports.objectDevObjectPushCommand = exports.objectDevObjectUpdateCommand = exports.objectDevObjectCreateCommand = exports.objectDevSceneUpdateCommand = exports.objectDevScenePushCommand = exports.objectDevScenePullCommand = exports.objectDevSceneListCommand = exports.objectDevSceneCreateCommand = exports.objectDevOptionSetUpdateCommand = exports.objectDevOptionSetPushCommand = exports.objectDevOptionSetPullCommand = exports.objectDevOptionSetListCommand = exports.objectDevOptionSetDeleteCommand = exports.objectDevOptionSetCreateCommand = exports.objectDevObjectRelatedPullCommand = exports.ObjectDevObjectPullOptions = exports.ObjectDevObjectListOptions = exports.objectDevObjectPullCommand = exports.objectDevObjectListCommand = void 0;
19931
- exports.objectDevConvertRulePushCommand = exports.objectDevConvertRuleUpdateCommand = exports.objectDevConvertRuleCreateCommand = exports.objectDevConvertRulePullCommand = void 0;
19984
+ exports.objectDevEmailTemplateListCommand = exports.objectDevConvertRulePushCommand = exports.objectDevConvertRuleUpdateCommand = exports.objectDevConvertRuleCreateCommand = exports.objectDevConvertRulePullCommand = void 0;
19932
19985
  var object_ts_1 = __webpack_require__(1268);
19933
19986
  Object.defineProperty(exports, "objectDevObjectListCommand", ({ enumerable: true, get: function () { return object_ts_1.objectDevObjectListCommand; } }));
19934
19987
  Object.defineProperty(exports, "objectDevObjectPullCommand", ({ enumerable: true, get: function () { return object_ts_1.objectDevObjectPullCommand; } }));
@@ -19995,6 +20048,8 @@ Object.defineProperty(exports, "objectDevConvertRulePullCommand", ({ enumerable:
19995
20048
  Object.defineProperty(exports, "objectDevConvertRuleCreateCommand", ({ enumerable: true, get: function () { return convert_rule_ts_1.objectDevConvertRuleCreateCommand; } }));
19996
20049
  Object.defineProperty(exports, "objectDevConvertRuleUpdateCommand", ({ enumerable: true, get: function () { return convert_rule_ts_1.objectDevConvertRuleUpdateCommand; } }));
19997
20050
  Object.defineProperty(exports, "objectDevConvertRulePushCommand", ({ enumerable: true, get: function () { return convert_rule_ts_1.objectDevConvertRulePushCommand; } }));
20051
+ var email_template_ts_1 = __webpack_require__(1026);
20052
+ Object.defineProperty(exports, "objectDevEmailTemplateListCommand", ({ enumerable: true, get: function () { return email_template_ts_1.objectDevEmailTemplateListCommand; } }));
19998
20053
 
19999
20054
 
20000
20055
  /***/ },
@@ -20259,10 +20314,15 @@ async function objectDevObjectMappingPullCommand(options) {
20259
20314
  throw new Error('Command cancelled.');
20260
20315
  }
20261
20316
  }
20262
- const { objectApiNames, found, written, skipped, errorMessages } = await (0, index_ts_1.objectMappingPullService)(options.objectApiNames, options.force === true, options.skipOverwriteConfirm === true);
20317
+ const { found, written, skipped, errorMessages } = await (0, index_ts_1.objectMappingPullService)({
20318
+ status: options.status ? Number(options.status) : undefined,
20319
+ ruleName: options.ruleName,
20320
+ force: options.force === true,
20321
+ skipOverwriteConfirm: options.skipOverwriteConfirm === true,
20322
+ });
20263
20323
  if (printErrorMessages(errorMessages))
20264
20324
  return;
20265
- logger_ts_1.loggerService.success(`Object-mapping pull completed: objects=${objectApiNames.length}, found=${found}, written=${written}, skipped=${skipped}`);
20325
+ logger_ts_1.loggerService.success(`Object-mapping pull completed: found=${found}, written=${written}, skipped=${skipped}`);
20266
20326
  }
20267
20327
  async function objectDevObjectMappingCreateCommand(options) {
20268
20328
  const result = await (0, index_ts_1.objectMappingCreateService)(options.objectApiName, options.data, options.force === true);
@@ -20275,7 +20335,7 @@ async function objectDevObjectMappingCreateCommand(options) {
20275
20335
  logger_ts_1.loggerService.info(`Object-mapping metadata created: ${result.filePath}`);
20276
20336
  }
20277
20337
  async function objectDevObjectMappingUpdateCommand(options) {
20278
- const result = await (0, index_ts_1.objectMappingUpdateService)(options.objectApiName, options.data);
20338
+ const result = await (0, index_ts_1.objectMappingUpdateService)(options.data);
20279
20339
  if (!result.filePath) {
20280
20340
  throw new Error('Object-mapping metadata not updated.');
20281
20341
  }
@@ -20285,10 +20345,10 @@ async function objectDevObjectMappingUpdateCommand(options) {
20285
20345
  logger_ts_1.loggerService.info(`Object-mapping metadata updated: ${result.filePath}`);
20286
20346
  }
20287
20347
  async function objectDevObjectMappingPushCommand(options) {
20288
- const pushed = await (0, index_ts_1.objectMappingPushService)(options.objectApiName, options.ruleApiNames, options.skipOverwriteConfirm === true);
20348
+ const pushed = await (0, index_ts_1.objectMappingPushService)(options.ruleApiNames, options.skipOverwriteConfirm === true);
20289
20349
  if (printErrorMessages(pushed.errorMessages))
20290
20350
  return;
20291
- logger_ts_1.loggerService.success(`Push completed successfully: object-mapping (${pushed.objectApiName}.${pushed.apiName})`);
20351
+ logger_ts_1.loggerService.success(`Push completed successfully: object-mapping (${pushed.apiName})`);
20292
20352
  }
20293
20353
 
20294
20354
 
@@ -21355,11 +21415,7 @@ const normalize_ts_1 = __importDefault(__webpack_require__(9268));
21355
21415
  const index_ts_1 = __webpack_require__(9985);
21356
21416
  const convert_rule_list_ts_1 = __webpack_require__(8031);
21357
21417
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
21358
- const convertRuleCreateService = async (objectApiName, data, force) => {
21359
- const checkedObjectApiName = normalize_ts_1.default.normalizeString(objectApiName);
21360
- if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
21361
- throw new Error('Invalid arguments: objectApiName is required.');
21362
- }
21418
+ const convertRuleCreateService = async (data, force) => {
21363
21419
  const raw = normalize_ts_1.default.normalizeString(data);
21364
21420
  if (!raw) {
21365
21421
  throw new Error('Invalid arguments: data is required.');
@@ -21368,35 +21424,52 @@ const convertRuleCreateService = async (objectApiName, data, force) => {
21368
21424
  if (!ruleData || typeof ruleData !== 'object' || Array.isArray(ruleData)) {
21369
21425
  throw new Error('data must be a JSON object.');
21370
21426
  }
21371
- const ruleApiName = normalize_ts_1.default.normalizeString(ruleData.api_name) ?? normalize_ts_1.default.normalizeString(ruleData.apiName);
21427
+ // 提取 ruleList
21428
+ const ruleList = ruleData.ruleList;
21429
+ if (!ruleList?.length) {
21430
+ throw new Error('data.ruleList is required and must be a non-empty array.');
21431
+ }
21432
+ // 从 ruleList 中找主规则 (master_rule_api_name 为空) 的 rule_api_name 作为文件名
21433
+ const mainRule = ruleList.find((r) => {
21434
+ const master = r.master_rule_api_name;
21435
+ return !master || master === '';
21436
+ }) ?? ruleList[0];
21437
+ const ruleApiName = normalize_ts_1.default.normalizeString(mainRule.rule_api_name)
21438
+ ?? normalize_ts_1.default.normalizeString(mainRule.ruleApiName);
21372
21439
  if (!ruleApiName) {
21373
- throw new Error('data.api_name or data.apiName is required.');
21440
+ throw new Error('Cannot determine rule_api_name from data.ruleList.');
21441
+ }
21442
+ // 远端查重
21443
+ const remoteItems = await (0, convert_rule_list_ts_1.fetchConvertRuleList)();
21444
+ const remoteNameSet = new Set();
21445
+ for (const item of remoteItems) {
21446
+ const ruleList = item.ruleList;
21447
+ if (ruleList) {
21448
+ for (const rule of ruleList) {
21449
+ const name = normalize_ts_1.default.normalizeString(rule.rule_api_name);
21450
+ if (name)
21451
+ remoteNameSet.add(name);
21452
+ }
21453
+ }
21374
21454
  }
21375
- const remoteRules = await (0, convert_rule_list_ts_1.fetchConvertRuleList)(checkedObjectApiName, null);
21376
- if (remoteRules.some((item) => {
21377
- const remoteName = normalize_ts_1.default.normalizeString(item.api_name)
21378
- ?? normalize_ts_1.default.normalizeString(item.apiName);
21379
- return remoteName === ruleApiName;
21380
- })) {
21381
- throw new Error('Convert-rule already exists remotely: ' + checkedObjectApiName + '.' + ruleApiName);
21455
+ if (remoteNameSet.has(ruleApiName)) {
21456
+ throw new Error('Convert-rule already exists remotely: ' + ruleApiName);
21382
21457
  }
21458
+ // 本地查重
21383
21459
  const existing = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21384
- objectApiName: checkedObjectApiName,
21385
21460
  fields: ['content'],
21386
21461
  });
21387
21462
  if (existing.content !== null && existing.content !== undefined) {
21388
21463
  if (!force) {
21389
- throw new Error('Convert-rule already exists locally: ' + checkedObjectApiName + '.' + ruleApiName + '. Use --force to overwrite.');
21464
+ throw new Error('Convert-rule already exists locally: ' + ruleApiName + '. Use --force to overwrite.');
21390
21465
  }
21391
21466
  }
21392
- const filePath = await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, ruleData, {
21393
- objectApiName: checkedObjectApiName,
21394
- status: 'new',
21395
- });
21396
- return {
21397
- filePath,
21398
- errorMessages: [],
21467
+ // 组装内容(对齐 create-rule API 格式)
21468
+ const fullContent = {
21469
+ ruleList: ruleList,
21399
21470
  };
21471
+ const filePath = await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, fullContent, { status: 'new' });
21472
+ return { filePath, errorMessages: [] };
21400
21473
  };
21401
21474
  exports.convertRuleCreateService = convertRuleCreateService;
21402
21475
 
@@ -21412,61 +21485,52 @@ exports.fetchConvertRuleDetailList = exports.fetchConvertRuleList = void 0;
21412
21485
  const request_execute_command_paths_ts_1 = __webpack_require__(2351);
21413
21486
  const request_ts_1 = __webpack_require__(3176);
21414
21487
  const types_ts_1 = __webpack_require__(7480);
21488
+ const SEARCH_QUERY_INFO = JSON.stringify({ offset: 0, limit: 2000 });
21415
21489
  /**
21416
21490
  * 调 list 接口获取转换规则轻量列表
21491
+ * 实际返回结构: { data: { items: [{ ...rule fields... }, ...] } } 或 { data: { ruleList: [...] } }
21417
21492
  */
21418
- const fetchConvertRuleList = async (objectApiName, ruleApiNames) => {
21493
+ const fetchConvertRuleList = async (options = {}) => {
21419
21494
  const response = await (0, request_ts_1.requestObjectDevExecute)((0, request_execute_command_paths_ts_1.getShareCliCommandPath)('convertRule', 'rule-list'), {
21420
- describeApiName: objectApiName,
21421
- ruleApiNames,
21422
- });
21423
- const result = await (0, request_ts_1.extractObjectDevServiceResult)(response, (res) => {
21424
- const data = (0, types_ts_1.narrowObjectDevResponse)(res.data);
21425
- if (!data)
21426
- throw new Error(`Invalid response data for object ${objectApiName}`);
21427
- const list = (0, types_ts_1.narrowObjectDevResponse)(data.convertRuleList)
21428
- ?? (0, types_ts_1.narrowObjectDevResponse)(data.ruleInfoList)
21429
- ?? (0, types_ts_1.narrowObjectDevResponse)(data.list);
21430
- return list ?? [];
21495
+ ruleName: options.ruleName ?? '',
21496
+ searchQueryInfo: SEARCH_QUERY_INFO,
21431
21497
  });
21498
+ const result = await (0, request_ts_1.extractObjectDevServiceResult)(response, (res) => parseContentToArray(res));
21432
21499
  if (!result.success) {
21433
21500
  throw new Error(result.errorMessage);
21434
21501
  }
21435
- return (result.data ?? []).filter((item) => Boolean(item) && typeof item === 'object').map((item) => {
21436
- const record = item;
21437
- const rule = record.rule;
21438
- return (rule && typeof rule === 'object' ? rule : record);
21439
- });
21502
+ return (result.data ?? []);
21440
21503
  };
21441
21504
  exports.fetchConvertRuleList = fetchConvertRuleList;
21442
21505
  /**
21443
21506
  * 调详情列表接口获取转换规则完整详情
21444
21507
  */
21445
- const fetchConvertRuleDetailList = async (objectApiName, ruleApiNames) => {
21508
+ const fetchConvertRuleDetailList = async (options = {}) => {
21446
21509
  const response = await (0, request_ts_1.requestObjectDevExecute)((0, request_execute_command_paths_ts_1.getShareCliCommandPath)('convertRule', 'rule-detail-list'), {
21447
- describeApiName: objectApiName,
21448
- ruleApiNames,
21449
- });
21450
- const result = await (0, request_ts_1.extractObjectDevServiceResult)(response, (res) => {
21451
- const data = (0, types_ts_1.narrowObjectDevResponse)(res.data);
21452
- if (!data)
21453
- throw new Error(`Invalid response data for object ${objectApiName}`);
21454
- const list = (0, types_ts_1.narrowObjectDevResponse)(data.convertRuleList)
21455
- ?? (0, types_ts_1.narrowObjectDevResponse)(data.ruleInfoList)
21456
- ?? (0, types_ts_1.narrowObjectDevResponse)(data.ruleDetailList)
21457
- ?? (0, types_ts_1.narrowObjectDevResponse)(data.list);
21458
- return list ?? [];
21510
+ ruleName: options.ruleName ?? '',
21511
+ searchQueryInfo: SEARCH_QUERY_INFO,
21459
21512
  });
21513
+ const result = await (0, request_ts_1.extractObjectDevServiceResult)(response, (res) => parseContentToArray(res));
21460
21514
  if (!result.success) {
21461
21515
  throw new Error(result.errorMessage);
21462
21516
  }
21463
- return (result.data ?? []).filter((item) => Boolean(item) && typeof item === 'object').map((item) => {
21464
- const record = item;
21465
- const rule = record.rule;
21466
- return (rule && typeof rule === 'object' ? rule : record);
21467
- });
21517
+ return (result.data ?? []);
21468
21518
  };
21469
21519
  exports.fetchConvertRuleDetailList = fetchConvertRuleDetailList;
21520
+ function parseContentToArray(res) {
21521
+ const data = (0, types_ts_1.narrowObjectDevResponse)(res.data);
21522
+ if (!data)
21523
+ throw new Error('Invalid response data');
21524
+ const items = data.items;
21525
+ if (Array.isArray(items)) {
21526
+ return items;
21527
+ }
21528
+ const ruleList = data.ruleList;
21529
+ if (Array.isArray(ruleList)) {
21530
+ return ruleList;
21531
+ }
21532
+ return [];
21533
+ }
21470
21534
 
21471
21535
 
21472
21536
  /***/ },
@@ -21480,74 +21544,77 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
21480
21544
  };
21481
21545
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21482
21546
  exports.convertRulePullService = void 0;
21547
+ const normalize_ts_1 = __importDefault(__webpack_require__(9268));
21483
21548
  const logger_ts_1 = __webpack_require__(3333);
21484
21549
  const index_ts_1 = __webpack_require__(9985);
21485
21550
  const convert_rule_list_ts_1 = __webpack_require__(8031);
21486
- const normalize_ts_1 = __importDefault(__webpack_require__(9268));
21487
21551
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
21488
- const convertRulePullService = async (objectApiNamesRaw, force = false, skipOverwriteConfirm = false) => {
21489
- const errorMessages = [];
21490
- const objectApiNames = (normalize_ts_1.default.normalizeString(objectApiNamesRaw) ?? '')
21491
- .split(',')
21492
- .map((item) => item.trim())
21493
- .filter(Boolean);
21494
- if (!objectApiNames.length) {
21495
- throw new Error('Invalid arguments: objectApiNames is required.');
21552
+ /**
21553
+ * item.ruleList 中找到主规则的 rule_api_name 作为文件名
21554
+ * 主规则: master_rule_api_name 为空字符串或 null/undefined
21555
+ */
21556
+ function resolveItemApiName(item) {
21557
+ const ruleList = item.ruleList;
21558
+ if (ruleList?.length) {
21559
+ const mainRule = ruleList.find((r) => {
21560
+ const master = r.master_rule_api_name;
21561
+ return !master || master === '';
21562
+ });
21563
+ if (mainRule) {
21564
+ return normalize_ts_1.default.normalizeString(mainRule.rule_api_name);
21565
+ }
21566
+ return normalize_ts_1.default.normalizeString(ruleList[0].rule_api_name);
21496
21567
  }
21568
+ return undefined;
21569
+ }
21570
+ const convertRulePullService = async (options = {}) => {
21571
+ const errorMessages = [];
21572
+ const force = options.force === true;
21573
+ const skipOverwriteConfirm = options.skipOverwriteConfirm === true;
21574
+ const items = await (0, convert_rule_list_ts_1.fetchConvertRuleDetailList)({
21575
+ ruleName: options.ruleName,
21576
+ });
21497
21577
  let written = 0;
21498
21578
  let skipped = 0;
21499
- let found = 0;
21500
- for (const objectApiName of objectApiNames) {
21579
+ const found = items.length;
21580
+ for (const item of items) {
21581
+ const ruleApiName = resolveItemApiName(item);
21582
+ if (!ruleApiName) {
21583
+ skipped += 1;
21584
+ continue;
21585
+ }
21501
21586
  try {
21502
- const rules = await (0, convert_rule_list_ts_1.fetchConvertRuleDetailList)(objectApiName, null);
21503
- found += rules.length;
21504
- for (const ruleRecord of rules) {
21505
- const ruleApiName = normalize_ts_1.default.normalizeString(ruleRecord.api_name)
21506
- ?? normalize_ts_1.default.normalizeString(ruleRecord.apiName);
21507
- if (!ruleApiName) {
21508
- skipped += 1;
21509
- continue;
21510
- }
21511
- try {
21512
- if (force) {
21513
- await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, ruleRecord, {
21514
- objectApiName,
21515
- status: 'unchanged',
21516
- });
21517
- written += 1;
21518
- continue;
21519
- }
21520
- const localStatus = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21521
- objectApiName,
21522
- fields: ['status'],
21523
- });
21524
- if (localStatus.status !== 'unchanged') {
21525
- if (skipOverwriteConfirm) {
21526
- logger_ts_1.loggerService.info(`Skipped ${objectApiName}.${ruleApiName}: local status is ${localStatus.status}. Use --force to overwrite local metadata.`);
21527
- }
21528
- else {
21529
- logger_ts_1.loggerService.info(`Convert-rule local status ${localStatus.status}, skip overwrite: ${objectApiName}.${ruleApiName}. Use --force to overwrite local metadata.`);
21530
- }
21531
- skipped += 1;
21532
- continue;
21533
- }
21534
- await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, ruleRecord, {
21535
- objectApiName,
21536
- status: 'unchanged',
21537
- });
21538
- written += 1;
21587
+ if (force) {
21588
+ await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, item, {
21589
+ status: 'unchanged',
21590
+ });
21591
+ written += 1;
21592
+ continue;
21593
+ }
21594
+ const localStatus = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21595
+ fields: ['status'],
21596
+ });
21597
+ if (localStatus.status !== 'unchanged') {
21598
+ if (skipOverwriteConfirm) {
21599
+ logger_ts_1.loggerService.info(`Skipped ${ruleApiName}: local status is ${localStatus.status}. Use --force to overwrite local metadata.`);
21539
21600
  }
21540
- catch (error) {
21541
- errorMessages.push(objectApiName + ' convert-rule ' + ruleApiName + ': ' + (error instanceof Error ? error.message : String(error)));
21601
+ else {
21602
+ logger_ts_1.loggerService.info(`Convert-rule local status ${localStatus.status}, skip overwrite: ${ruleApiName}. Use --force to overwrite local metadata.`);
21542
21603
  }
21604
+ skipped += 1;
21605
+ continue;
21543
21606
  }
21607
+ await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, item, {
21608
+ status: 'unchanged',
21609
+ });
21610
+ written += 1;
21544
21611
  }
21545
21612
  catch (error) {
21546
- errorMessages.push(objectApiName + ': ' + (error instanceof Error ? error.message : String(error)));
21613
+ errorMessages.push('convert-rule ' + ruleApiName + ': ' + (error instanceof Error ? error.message : String(error)));
21547
21614
  }
21548
21615
  }
21549
21616
  return {
21550
- objectApiNames,
21617
+ objectApiNames: [],
21551
21618
  found,
21552
21619
  written,
21553
21620
  skipped,
@@ -21577,12 +21644,8 @@ const request_ts_1 = __webpack_require__(3176);
21577
21644
  const logger_ts_1 = __webpack_require__(3333);
21578
21645
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
21579
21646
  const isRecord = normalize_ts_1.default.isRecord;
21580
- const convertRulePushService = async (objectApiName, ruleApiNames, skipOverwriteConfirm = false) => {
21647
+ const convertRulePushService = async (ruleApiNames, skipOverwriteConfirm = false) => {
21581
21648
  const errorMessages = [];
21582
- const checkedObjectApiName = normalize_ts_1.default.normalizeString(objectApiName);
21583
- if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
21584
- throw new Error('Invalid arguments: objectApiName is required.');
21585
- }
21586
21649
  const targetRuleApiNames = (ruleApiNames ?? '')
21587
21650
  .split(',')
21588
21651
  .map((item) => normalize_ts_1.default.normalizeString(item))
@@ -21592,109 +21655,99 @@ const convertRulePushService = async (objectApiName, ruleApiNames, skipOverwrite
21592
21655
  }
21593
21656
  for (const ruleApiName of targetRuleApiNames) {
21594
21657
  try {
21595
- let ruleMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21596
- objectApiName: checkedObjectApiName,
21597
- });
21658
+ let ruleMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName);
21598
21659
  if (!ruleMeta.content || !isRecord(ruleMeta.content)) {
21599
- throw new Error(`Invalid convert-rule content: ${checkedObjectApiName}.${ruleApiName}`);
21660
+ throw new Error(`Invalid convert-rule content: ${ruleApiName}`);
21600
21661
  }
21662
+ const content = ruleMeta.content;
21601
21663
  // pre-pull for non-new rules
21602
21664
  if (ruleMeta.status !== 'new') {
21603
- logger_ts_1.loggerService.startLoading('convert-rule push pre-pull: ' + checkedObjectApiName + '.' + ruleApiName);
21665
+ logger_ts_1.loggerService.startLoading('convert-rule push pre-pull: ' + ruleApiName);
21604
21666
  try {
21605
- const prePullResult = await (0, convert_rule_pull_ts_1.convertRulePullService)(checkedObjectApiName, false, skipOverwriteConfirm);
21667
+ const prePullResult = await (0, convert_rule_pull_ts_1.convertRulePullService)({
21668
+ skipOverwriteConfirm,
21669
+ });
21606
21670
  errorMessages.push(...prePullResult.errorMessages);
21607
21671
  }
21608
21672
  finally {
21609
21673
  logger_ts_1.loggerService.stopLoading();
21610
21674
  }
21611
21675
  }
21612
- // Check remote existence via rule-detail-list
21613
- logger_ts_1.loggerService.startLoading('convert-rule push check remote: ' + checkedObjectApiName + '.' + ruleApiName);
21676
+ // 远端存在性检查
21677
+ logger_ts_1.loggerService.startLoading('convert-rule push check remote: ' + ruleApiName);
21614
21678
  let existsRemotely = false;
21615
21679
  try {
21616
- const remoteRules = await (0, convert_rule_list_ts_1.fetchConvertRuleDetailList)(checkedObjectApiName, null);
21680
+ const remoteRules = await (0, convert_rule_list_ts_1.fetchConvertRuleDetailList)();
21617
21681
  existsRemotely = remoteRules.some((item) => {
21618
- const remoteName = normalize_ts_1.default.normalizeString(item.api_name)
21619
- ?? normalize_ts_1.default.normalizeString(item.apiName);
21620
- return remoteName === ruleApiName;
21682
+ const ruleList = item.ruleList;
21683
+ return ruleList?.some((rule) => {
21684
+ const remoteName = normalize_ts_1.default.normalizeString(rule.rule_api_name);
21685
+ return remoteName === ruleApiName;
21686
+ }) ?? false;
21621
21687
  });
21622
21688
  }
21623
21689
  finally {
21624
21690
  logger_ts_1.loggerService.stopLoading();
21625
21691
  }
21626
- // Fix local status based on remote
21692
+ // 状态修正
21627
21693
  if (ruleMeta.status === 'new' && existsRemotely) {
21628
- await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, ruleMeta.content, {
21629
- objectApiName: checkedObjectApiName,
21694
+ await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, content, {
21630
21695
  status: 'modified',
21631
21696
  features: ruleMeta.features,
21632
21697
  extra: ruleMeta.extra,
21633
21698
  });
21634
- logger_ts_1.loggerService.warn('Convert-rule exists remotely, local status changed from new to modified: ' + checkedObjectApiName + '.' + ruleApiName);
21635
- ruleMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21636
- objectApiName: checkedObjectApiName,
21637
- });
21699
+ logger_ts_1.loggerService.warn('Convert-rule exists remotely, local status changed from new to modified: ' + ruleApiName);
21700
+ ruleMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName);
21638
21701
  }
21639
21702
  if (ruleMeta.status !== 'new' && !existsRemotely) {
21640
- await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, ruleMeta.content, {
21641
- objectApiName: checkedObjectApiName,
21703
+ await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, content, {
21642
21704
  status: 'new',
21643
21705
  features: ruleMeta.features,
21644
21706
  extra: ruleMeta.extra,
21645
21707
  });
21646
- logger_ts_1.loggerService.warn('Convert-rule does not exist remotely, local status changed from ' + ruleMeta.status + ' to new: ' + checkedObjectApiName + '.' + ruleApiName);
21647
- ruleMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21648
- objectApiName: checkedObjectApiName,
21649
- });
21708
+ logger_ts_1.loggerService.warn('Convert-rule does not exist remotely, local status changed from ' + ruleMeta.status + ' to new: ' + ruleApiName);
21709
+ ruleMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName);
21650
21710
  }
21651
21711
  const isCreate = ruleMeta.status === 'new';
21652
- const ruleContent = { ...(ruleMeta.content && isRecord(ruleMeta.content)
21712
+ const updatedContent = { ...(ruleMeta.content && isRecord(ruleMeta.content)
21653
21713
  ? ruleMeta.content
21654
- : {}) };
21655
- if (!ruleContent.describe_api_name) {
21656
- ruleContent.describe_api_name = checkedObjectApiName;
21657
- }
21658
- if (!ruleContent.api_name) {
21659
- ruleContent.api_name = ruleApiName;
21660
- }
21661
- logger_ts_1.loggerService.startLoading('convert-rule push request: ' + checkedObjectApiName + '.' + ruleApiName + ' (' + (isCreate ? 'create' : 'update') + ')');
21714
+ : content) };
21715
+ logger_ts_1.loggerService.startLoading('convert-rule push request: ' + ruleApiName + ' (' + (isCreate ? 'create' : 'update') + ')');
21662
21716
  const raw = await (0, request_ts_1.requestObjectDevExecute)(isCreate
21663
21717
  ? (0, request_execute_command_paths_ts_1.getShareCliCommandPath)('convertRule', 'create-rule')
21664
- : (0, request_execute_command_paths_ts_1.getShareCliCommandPath)('convertRule', 'update-rule'), ruleContent);
21718
+ : (0, request_execute_command_paths_ts_1.getShareCliCommandPath)('convertRule', 'update-rule'), updatedContent);
21665
21719
  const response = raw;
21666
21720
  if (response.success !== true || normalize_ts_1.default.normalizeString(normalize_ts_1.default.asString(response.code)) !== 'OK') {
21667
21721
  logger_ts_1.loggerService.stopLoading();
21668
21722
  throw new Error('convert-rule push failed: ' + (normalize_ts_1.default.normalizeText(response.message) || 'Unknown error'));
21669
21723
  }
21670
21724
  logger_ts_1.loggerService.stopLoading();
21671
- // Write back status
21672
- const latestMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21673
- objectApiName: checkedObjectApiName,
21674
- });
21725
+ // 回写状态
21726
+ const latestMeta = await xmlMetadataManager.readXml('ConvertRule', ruleApiName);
21675
21727
  await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, latestMeta.content, {
21676
- objectApiName: checkedObjectApiName,
21677
21728
  status: 'unchanged',
21678
21729
  features: latestMeta.features,
21679
21730
  extra: latestMeta.extra,
21680
21731
  });
21681
21732
  // post-pull
21682
- logger_ts_1.loggerService.startLoading('convert-rule push post-pull: ' + checkedObjectApiName);
21733
+ logger_ts_1.loggerService.startLoading('convert-rule push post-pull');
21683
21734
  try {
21684
- const postPullResult = await (0, convert_rule_pull_ts_1.convertRulePullService)(checkedObjectApiName, false, skipOverwriteConfirm);
21735
+ const postPullResult = await (0, convert_rule_pull_ts_1.convertRulePullService)({
21736
+ skipOverwriteConfirm,
21737
+ });
21685
21738
  errorMessages.push(...postPullResult.errorMessages);
21686
21739
  }
21687
21740
  finally {
21688
21741
  logger_ts_1.loggerService.stopLoading();
21689
21742
  }
21690
- logger_ts_1.loggerService.info(`Convert-rule pushed: ${checkedObjectApiName}.${ruleApiName}`);
21743
+ logger_ts_1.loggerService.info(`Convert-rule pushed: ${ruleApiName}`);
21691
21744
  }
21692
21745
  catch (error) {
21693
- errorMessages.push(`Convert-rule push failed: ${checkedObjectApiName}.${ruleApiName}: ${error}`);
21746
+ errorMessages.push(`Convert-rule push failed: ${ruleApiName}: ${error}`);
21694
21747
  }
21695
21748
  }
21696
21749
  return {
21697
- objectApiName: checkedObjectApiName,
21750
+ objectApiName: '',
21698
21751
  apiName: targetRuleApiNames.join(','),
21699
21752
  errorMessages,
21700
21753
  };
@@ -21716,11 +21769,7 @@ exports.convertRuleUpdateService = void 0;
21716
21769
  const normalize_ts_1 = __importDefault(__webpack_require__(9268));
21717
21770
  const index_ts_1 = __webpack_require__(9985);
21718
21771
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
21719
- const convertRuleUpdateService = async (objectApiName, data) => {
21720
- const checkedObjectApiName = normalize_ts_1.default.normalizeString(objectApiName);
21721
- if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
21722
- throw new Error('Invalid arguments: objectApiName is required.');
21723
- }
21772
+ const convertRuleUpdateService = async (data) => {
21724
21773
  const raw = normalize_ts_1.default.normalizeString(data);
21725
21774
  if (!raw) {
21726
21775
  throw new Error('Invalid arguments: data is required.');
@@ -21729,30 +21778,76 @@ const convertRuleUpdateService = async (objectApiName, data) => {
21729
21778
  if (!ruleData || typeof ruleData !== 'object' || Array.isArray(ruleData)) {
21730
21779
  throw new Error('data must be a JSON object.');
21731
21780
  }
21732
- const ruleApiName = normalize_ts_1.default.normalizeString(normalize_ts_1.default.asString(ruleData.api_name))
21733
- ?? normalize_ts_1.default.normalizeString(normalize_ts_1.default.asString(ruleData.apiName));
21781
+ // ruleList 中找主规则的 rule_api_name 定位文件
21782
+ const ruleList = ruleData.ruleList;
21783
+ if (!ruleList?.length) {
21784
+ throw new Error('data.ruleList is required and must be a non-empty array.');
21785
+ }
21786
+ const mainRule = ruleList.find((r) => {
21787
+ const master = r.master_rule_api_name;
21788
+ return !master || master === '';
21789
+ }) ?? ruleList[0];
21790
+ const ruleApiName = normalize_ts_1.default.normalizeString(mainRule.rule_api_name)
21791
+ ?? normalize_ts_1.default.normalizeString(mainRule.ruleApiName)
21792
+ ?? '';
21734
21793
  if (!ruleApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(ruleApiName)) {
21735
- throw new Error('Invalid arguments: api_name or apiName is required in data.');
21794
+ throw new Error('Invalid arguments: cannot determine rule_api_name from data.ruleList.');
21736
21795
  }
21737
21796
  const current = await xmlMetadataManager.readXml('ConvertRule', ruleApiName, {
21738
- objectApiName: checkedObjectApiName,
21739
21797
  fields: ['content', 'status']
21740
21798
  });
21741
21799
  if (current.content === null || current.content === undefined) {
21742
- throw new Error(`Convert-rule metadata not found: ${checkedObjectApiName}.${ruleApiName}`);
21800
+ throw new Error(`Convert-rule metadata not found: ${ruleApiName}`);
21743
21801
  }
21744
21802
  const filePath = await xmlMetadataManager.writeXml('ConvertRule', ruleApiName, ruleData, {
21745
- objectApiName: checkedObjectApiName,
21746
21803
  status: current.status === 'new' ? 'new' : 'modified'
21747
21804
  });
21748
- return {
21749
- filePath,
21750
- errorMessages: []
21751
- };
21805
+ return { filePath, errorMessages: [] };
21752
21806
  };
21753
21807
  exports.convertRuleUpdateService = convertRuleUpdateService;
21754
21808
 
21755
21809
 
21810
+ /***/ },
21811
+
21812
+ /***/ 236
21813
+ (__unused_webpack_module, exports, __webpack_require__) {
21814
+
21815
+
21816
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
21817
+ exports.fetchEmailTemplateList = void 0;
21818
+ const request_execute_command_paths_ts_1 = __webpack_require__(2351);
21819
+ const request_ts_1 = __webpack_require__(3176);
21820
+ const types_ts_1 = __webpack_require__(7480);
21821
+ /**
21822
+ * 查询邮件模板列表
21823
+ */
21824
+ const fetchEmailTemplateList = async (options = {}) => {
21825
+ const response = await (0, request_ts_1.requestObjectDevExecute)((0, request_execute_command_paths_ts_1.getShareCliCommandPath)('emailTemplate', 'template-page'), {
21826
+ objDescApiName: options.objDescApiName ?? '',
21827
+ pageNumber: options.pageNumber ?? 1,
21828
+ pageSize: options.pageSize ?? 2000,
21829
+ SortField: options.sortField ?? '',
21830
+ SortType: options.sortType ?? '',
21831
+ QueryInfo: {},
21832
+ });
21833
+ const result = await (0, request_ts_1.extractObjectDevServiceResult)(response, (res) => {
21834
+ const data = (0, types_ts_1.narrowObjectDevResponse)(res.data);
21835
+ if (!data)
21836
+ throw new Error('Invalid response data');
21837
+ const list = data.list ?? data.items ?? data.records;
21838
+ if (Array.isArray(list)) {
21839
+ return list;
21840
+ }
21841
+ return [];
21842
+ });
21843
+ if (!result.success) {
21844
+ throw new Error(result.errorMessage);
21845
+ }
21846
+ return (result.data ?? []);
21847
+ };
21848
+ exports.fetchEmailTemplateList = fetchEmailTemplateList;
21849
+
21850
+
21756
21851
  /***/ },
21757
21852
 
21758
21853
  /***/ 3163
@@ -22103,7 +22198,7 @@ exports.fieldUpdateService = fieldUpdateService;
22103
22198
 
22104
22199
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22105
22200
  exports.fetchConvertRuleList = exports.objectMappingPushService = exports.objectMappingUpdateService = exports.objectMappingCreateService = exports.objectMappingListService = exports.fetchObjectMappingList = exports.objectMappingPullService = exports.buttonPushService = exports.buttonUpdateService = exports.buttonCreateService = exports.buttonListService = exports.buttonPullService = exports.validateRulePushService = exports.validateRuleUpdateService = exports.validateRuleCreateService = exports.validateRulePullService = exports.validateRuleListService = exports.layoutRulePushService = exports.layoutRulePullService = exports.layoutRuleUpdateService = exports.layoutRuleListService = exports.layoutRuleCreateService = exports.layoutPushService = exports.layoutPullService = exports.layoutUpdateService = exports.layoutListService = exports.layoutEnableEditService = exports.layoutEditStatusService = exports.layoutCreateService = exports.sceneUpdateService = exports.scenePushService = exports.scenePullService = exports.sceneListService = exports.sceneCreateService = exports.optionSetUpdateService = exports.optionSetPushService = exports.optionSetPullService = exports.optionSetListService = exports.optionSetDeleteService = exports.optionSetCreateService = exports.fieldPushService = exports.fieldUpdateService = exports.fieldListService = exports.fieldCreateService = exports.objectPushService = exports.objectUpdateService = exports.objectCreateService = exports.objectListService = exports.objectRelatedPullService = exports.objectPullService = void 0;
22106
- exports.extractObjectDevServiceResult = exports.requestObjectDevExecute = exports.convertRulePushService = exports.convertRuleUpdateService = exports.convertRuleCreateService = exports.convertRulePullService = exports.convertRuleListService = void 0;
22201
+ exports.extractObjectDevServiceResult = exports.requestObjectDevExecute = exports.emailTemplateListService = exports.fetchEmailTemplateList = exports.convertRulePushService = exports.convertRuleUpdateService = exports.convertRuleCreateService = exports.convertRulePullService = exports.convertRuleListService = void 0;
22107
22202
  var object_pull_ts_1 = __webpack_require__(9365);
22108
22203
  Object.defineProperty(exports, "objectPullService", ({ enumerable: true, get: function () { return object_pull_ts_1.objectPullService; } }));
22109
22204
  var object_related_pull_ts_1 = __webpack_require__(9711);
@@ -22212,6 +22307,9 @@ var convert_rule_update_ts_1 = __webpack_require__(8346);
22212
22307
  Object.defineProperty(exports, "convertRuleUpdateService", ({ enumerable: true, get: function () { return convert_rule_update_ts_1.convertRuleUpdateService; } }));
22213
22308
  var convert_rule_push_ts_1 = __webpack_require__(2771);
22214
22309
  Object.defineProperty(exports, "convertRulePushService", ({ enumerable: true, get: function () { return convert_rule_push_ts_1.convertRulePushService; } }));
22310
+ var email_template_list_ts_1 = __webpack_require__(236);
22311
+ Object.defineProperty(exports, "fetchEmailTemplateList", ({ enumerable: true, get: function () { return email_template_list_ts_1.fetchEmailTemplateList; } }));
22312
+ Object.defineProperty(exports, "emailTemplateListService", ({ enumerable: true, get: function () { return email_template_list_ts_1.fetchEmailTemplateList; } }));
22215
22313
  var request_ts_1 = __webpack_require__(3176);
22216
22314
  Object.defineProperty(exports, "requestObjectDevExecute", ({ enumerable: true, get: function () { return request_ts_1.requestObjectDevExecute; } }));
22217
22315
  Object.defineProperty(exports, "extractObjectDevServiceResult", ({ enumerable: true, get: function () { return request_ts_1.extractObjectDevServiceResult; } }));
@@ -23184,10 +23282,6 @@ const index_ts_1 = __webpack_require__(9985);
23184
23282
  const object_mapping_list_ts_1 = __webpack_require__(7244);
23185
23283
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
23186
23284
  const objectMappingCreateService = async (objectApiName, data, force) => {
23187
- const checkedObjectApiName = normalize_ts_1.default.normalizeString(objectApiName);
23188
- if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
23189
- throw new Error('Invalid arguments: objectApiName is required.');
23190
- }
23191
23285
  const raw = normalize_ts_1.default.normalizeString(data);
23192
23286
  if (!raw) {
23193
23287
  throw new Error('Invalid arguments: data is required.');
@@ -23196,35 +23290,54 @@ const objectMappingCreateService = async (objectApiName, data, force) => {
23196
23290
  if (!mappingData || typeof mappingData !== 'object' || Array.isArray(mappingData)) {
23197
23291
  throw new Error('data must be a JSON object.');
23198
23292
  }
23199
- const mappingApiName = normalize_ts_1.default.normalizeString(mappingData.api_name) ?? normalize_ts_1.default.normalizeString(mappingData.apiName);
23200
- if (!mappingApiName) {
23201
- throw new Error('data.api_name or data.apiName is required.');
23293
+ // describe_api_name: 优先从 data 取,其次 --objectApiName
23294
+ const checkedObjectApiName = normalize_ts_1.default.normalizeString(mappingData.describe_api_name) ?? normalize_ts_1.default.normalizeString(objectApiName);
23295
+ if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
23296
+ throw new Error('Invalid arguments: describe_api_name is required (via --objectApiName or data.describe_api_name).');
23297
+ }
23298
+ // 从 rule_list 中提取主规则的 rule_api_name 作为文件名
23299
+ const ruleList = mappingData.rule_list;
23300
+ const mainRule = ruleList?.find((r) => {
23301
+ const master = r.master_rule_api_name;
23302
+ return !master || master === '';
23303
+ });
23304
+ const mappingApiName = mainRule
23305
+ ? (normalize_ts_1.default.normalizeString(mainRule.rule_api_name) ?? checkedObjectApiName)
23306
+ : checkedObjectApiName;
23307
+ // 远端查重
23308
+ const remoteItems = await (0, object_mapping_list_ts_1.fetchObjectMappingList)();
23309
+ const remoteNameSet = new Set();
23310
+ for (const item of remoteItems) {
23311
+ const ruleList = item.ruleList;
23312
+ if (ruleList) {
23313
+ for (const rule of ruleList) {
23314
+ const name = normalize_ts_1.default.normalizeString(rule.rule_api_name);
23315
+ if (name)
23316
+ remoteNameSet.add(name);
23317
+ }
23318
+ }
23202
23319
  }
23203
- const remoteMappings = await (0, object_mapping_list_ts_1.fetchObjectMappingList)(checkedObjectApiName, null);
23204
- if (remoteMappings.some((item) => {
23205
- const remoteName = normalize_ts_1.default.normalizeString(item.api_name)
23206
- ?? normalize_ts_1.default.normalizeString(item.apiName);
23207
- return remoteName === mappingApiName;
23208
- })) {
23209
- throw new Error('Object-mapping already exists remotely: ' + checkedObjectApiName + '.' + mappingApiName);
23320
+ if (remoteNameSet.has(mappingApiName)) {
23321
+ throw new Error('Object-mapping already exists remotely: ' + mappingApiName);
23210
23322
  }
23323
+ // 本地查重
23211
23324
  const existing = await xmlMetadataManager.readXml('ObjectMapping', mappingApiName, {
23212
- objectApiName: checkedObjectApiName,
23213
23325
  fields: ['content'],
23214
23326
  });
23215
23327
  if (existing.content !== null && existing.content !== undefined) {
23216
23328
  if (!force) {
23217
- throw new Error('Object-mapping already exists locally: ' + checkedObjectApiName + '.' + mappingApiName + '. Use --force to overwrite.');
23329
+ throw new Error('Object-mapping already exists locally: ' + mappingApiName + '. Use --force to overwrite.');
23218
23330
  }
23219
23331
  }
23220
- const filePath = await xmlMetadataManager.writeXml('ObjectMapping', mappingApiName, mappingData, {
23221
- objectApiName: checkedObjectApiName,
23222
- status: 'new',
23223
- });
23224
- return {
23225
- filePath,
23226
- errorMessages: [],
23332
+ // 组装完整内容(匹配 create-rule API 格式)
23333
+ const fullContent = {
23334
+ rule_list: ruleList ?? [],
23335
+ button: mappingData.button ?? {},
23336
+ describe_api_name: checkedObjectApiName,
23337
+ roles: mappingData.roles ?? [],
23227
23338
  };
23339
+ const filePath = await xmlMetadataManager.writeXml('ObjectMapping', mappingApiName, fullContent, { status: 'new' });
23340
+ return { filePath, errorMessages: [] };
23228
23341
  };
23229
23342
  exports.objectMappingCreateService = objectMappingCreateService;
23230
23343
 
@@ -23241,30 +23354,29 @@ const request_execute_command_paths_ts_1 = __webpack_require__(2351);
23241
23354
  const request_ts_1 = __webpack_require__(3176);
23242
23355
  const types_ts_1 = __webpack_require__(7480);
23243
23356
  /**
23244
- * 调 list 接口获取指定对象下的对象映射规则列表
23357
+ * 调详情列表接口获取对象映射规则列表
23358
+ * 实际返回结构: { data: { items: [{ button, ruleList, roles }, ...] } }
23245
23359
  */
23246
- const fetchObjectMappingList = async (objectApiName, ruleApiNames) => {
23247
- const response = await (0, request_ts_1.requestObjectDevExecute)((0, request_execute_command_paths_ts_1.getShareCliCommandPath)('objectMapping', 'rule-detail-list'), {
23248
- describeApiName: objectApiName,
23249
- ruleApiNames,
23250
- });
23360
+ const fetchObjectMappingList = async (options = {}) => {
23361
+ const data = {
23362
+ status: options.status ?? 0,
23363
+ rule_name: options.ruleName ?? '',
23364
+ };
23365
+ const response = await (0, request_ts_1.requestObjectDevExecute)((0, request_execute_command_paths_ts_1.getShareCliCommandPath)('objectMapping', 'rule-detail-list'), data);
23251
23366
  const result = await (0, request_ts_1.extractObjectDevServiceResult)(response, (res) => {
23252
23367
  const data = (0, types_ts_1.narrowObjectDevResponse)(res.data);
23253
23368
  if (!data)
23254
- throw new Error(`Invalid response data for object ${objectApiName}`);
23255
- const list = (0, types_ts_1.narrowObjectDevResponse)(data.ruleInfoList)
23256
- ?? (0, types_ts_1.narrowObjectDevResponse)(data.objectMappingList)
23257
- ?? (0, types_ts_1.narrowObjectDevResponse)(data.list);
23258
- return list ?? [];
23369
+ throw new Error('Invalid response data');
23370
+ const items = data.items;
23371
+ if (Array.isArray(items)) {
23372
+ return items;
23373
+ }
23374
+ return [];
23259
23375
  });
23260
23376
  if (!result.success) {
23261
23377
  throw new Error(result.errorMessage);
23262
23378
  }
23263
- return (result.data ?? []).filter((item) => Boolean(item) && typeof item === 'object').map((item) => {
23264
- const record = item;
23265
- const rule = record.rule;
23266
- return (rule && typeof rule === 'object' ? rule : record);
23267
- });
23379
+ return (result.data ?? []);
23268
23380
  };
23269
23381
  exports.fetchObjectMappingList = fetchObjectMappingList;
23270
23382
 
@@ -23285,69 +23397,77 @@ const logger_ts_1 = __webpack_require__(3333);
23285
23397
  const index_ts_1 = __webpack_require__(9985);
23286
23398
  const object_mapping_list_ts_1 = __webpack_require__(7244);
23287
23399
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
23288
- const objectMappingPullService = async (objectApiNamesRaw, force = false, skipOverwriteConfirm = false) => {
23289
- const errorMessages = [];
23290
- const objectApiNames = (normalize_ts_1.default.normalizeString(objectApiNamesRaw) ?? '')
23291
- .split(',')
23292
- .map((item) => item.trim())
23293
- .filter(Boolean);
23294
- if (!objectApiNames.length) {
23295
- throw new Error('Invalid arguments: objectApiNames is required.');
23400
+ /**
23401
+ * item.ruleList 中找到主规则的 rule_api_name 作为文件名
23402
+ * 主规则: master_rule_api_name 为空字符串或 null/undefined
23403
+ * 没有主规则时回退到 button.api_name
23404
+ */
23405
+ function resolveItemApiName(item) {
23406
+ const ruleList = item.ruleList;
23407
+ if (ruleList?.length) {
23408
+ const mainRule = ruleList.find((r) => {
23409
+ const master = r.master_rule_api_name;
23410
+ return !master || master === '';
23411
+ });
23412
+ if (mainRule) {
23413
+ return normalize_ts_1.default.normalizeString(mainRule.rule_api_name);
23414
+ }
23415
+ // 没有主规则时用第一条的 rule_api_name
23416
+ return normalize_ts_1.default.normalizeString(ruleList[0].rule_api_name);
23296
23417
  }
23297
- let found = 0;
23418
+ // 回退到 button.api_name
23419
+ const button = item.button;
23420
+ return normalize_ts_1.default.normalizeString(button?.api_name);
23421
+ }
23422
+ const objectMappingPullService = async (options = {}) => {
23423
+ const errorMessages = [];
23424
+ const force = options.force === true;
23425
+ const skipOverwriteConfirm = options.skipOverwriteConfirm === true;
23426
+ const items = await (0, object_mapping_list_ts_1.fetchObjectMappingList)({
23427
+ status: options.status,
23428
+ ruleName: options.ruleName,
23429
+ });
23298
23430
  let written = 0;
23299
23431
  let skipped = 0;
23300
- for (const objectApiName of objectApiNames) {
23432
+ const found = items.length;
23433
+ for (const item of items) {
23434
+ const mappingApiName = resolveItemApiName(item);
23435
+ if (!mappingApiName) {
23436
+ skipped += 1;
23437
+ continue;
23438
+ }
23301
23439
  try {
23302
- const mappings = await (0, object_mapping_list_ts_1.fetchObjectMappingList)(objectApiName, null);
23303
- found += mappings.length;
23304
- for (const mappingRecord of mappings) {
23305
- const mappingApiName = normalize_ts_1.default.normalizeString(mappingRecord.api_name)
23306
- ?? normalize_ts_1.default.normalizeString(mappingRecord.apiName);
23307
- if (!mappingApiName) {
23308
- skipped += 1;
23309
- continue;
23310
- }
23311
- try {
23312
- if (force) {
23313
- await xmlMetadataManager.writeXml('ObjectMapping', mappingApiName, mappingRecord, {
23314
- objectApiName,
23315
- status: 'unchanged',
23316
- });
23317
- written += 1;
23318
- continue;
23319
- }
23320
- const localStatus = await xmlMetadataManager.readXml('ObjectMapping', mappingApiName, {
23321
- objectApiName,
23322
- fields: ['status'],
23323
- });
23324
- if (localStatus.status !== 'unchanged') {
23325
- if (skipOverwriteConfirm) {
23326
- logger_ts_1.loggerService.info(`Skipped ${objectApiName}.${mappingApiName}: local status is ${localStatus.status}. Use --force to overwrite local metadata.`);
23327
- }
23328
- else {
23329
- logger_ts_1.loggerService.info(`Object-mapping local status ${localStatus.status}, skip overwrite: ${objectApiName}.${mappingApiName}. Use --force to overwrite local metadata.`);
23330
- }
23331
- skipped += 1;
23332
- continue;
23333
- }
23334
- await xmlMetadataManager.writeXml('ObjectMapping', mappingApiName, mappingRecord, {
23335
- objectApiName,
23336
- status: 'unchanged',
23337
- });
23338
- written += 1;
23440
+ if (force) {
23441
+ await xmlMetadataManager.writeXml('ObjectMapping', mappingApiName, item, {
23442
+ status: 'unchanged',
23443
+ });
23444
+ written += 1;
23445
+ continue;
23446
+ }
23447
+ const localStatus = await xmlMetadataManager.readXml('ObjectMapping', mappingApiName, {
23448
+ fields: ['status'],
23449
+ });
23450
+ if (localStatus.status !== 'unchanged') {
23451
+ if (skipOverwriteConfirm) {
23452
+ logger_ts_1.loggerService.info(`Skipped ${mappingApiName}: local status is ${localStatus.status}. Use --force to overwrite local metadata.`);
23339
23453
  }
23340
- catch (error) {
23341
- errorMessages.push(objectApiName + ' object-mapping ' + mappingApiName + ': ' + (error instanceof Error ? error.message : String(error)));
23454
+ else {
23455
+ logger_ts_1.loggerService.info(`Object-mapping local status ${localStatus.status}, skip overwrite: ${mappingApiName}. Use --force to overwrite local metadata.`);
23342
23456
  }
23457
+ skipped += 1;
23458
+ continue;
23343
23459
  }
23460
+ await xmlMetadataManager.writeXml('ObjectMapping', mappingApiName, item, {
23461
+ status: 'unchanged',
23462
+ });
23463
+ written += 1;
23344
23464
  }
23345
23465
  catch (error) {
23346
- errorMessages.push(objectApiName + ': ' + (error instanceof Error ? error.message : String(error)));
23466
+ errorMessages.push('object-mapping ' + mappingApiName + ': ' + (error instanceof Error ? error.message : String(error)));
23347
23467
  }
23348
23468
  }
23349
23469
  return {
23350
- objectApiNames,
23470
+ objectApiNames: [],
23351
23471
  found,
23352
23472
  written,
23353
23473
  skipped,
@@ -23377,124 +23497,135 @@ const request_ts_1 = __webpack_require__(3176);
23377
23497
  const logger_ts_1 = __webpack_require__(3333);
23378
23498
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
23379
23499
  const isRecord = normalize_ts_1.default.isRecord;
23380
- const objectMappingPushService = async (objectApiName, ruleApiNames, skipOverwriteConfirm = false) => {
23500
+ const objectMappingPushService = async (ruleApiNames, skipOverwriteConfirm = false) => {
23381
23501
  const errorMessages = [];
23382
- const checkedObjectApiName = normalize_ts_1.default.normalizeString(objectApiName);
23383
- if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
23384
- throw new Error('Invalid arguments: objectApiName is required.');
23502
+ const targetRuleApiNames = [];
23503
+ if (ruleApiNames) {
23504
+ targetRuleApiNames.push(...(ruleApiNames
23505
+ .split(',')
23506
+ .map((item) => normalize_ts_1.default.normalizeString(item))
23507
+ .filter((item) => Boolean(item))));
23385
23508
  }
23386
- const targetRuleApiNames = (ruleApiNames ?? '')
23387
- .split(',')
23388
- .map((item) => normalize_ts_1.default.normalizeString(item))
23389
- .filter((item) => Boolean(item));
23390
23509
  if (!targetRuleApiNames.length) {
23391
- throw new Error('Invalid arguments: ruleApiNames is required.');
23510
+ // 未指定 ruleApiNames 扫描本地所有 object-mapping 文件
23511
+ const localIndex = await xmlMetadataManager.listLocalXmlApiName(undefined, ['ObjectMapping']);
23512
+ const mappingIndex = localIndex[''];
23513
+ if (mappingIndex?.ObjectMapping?.length) {
23514
+ targetRuleApiNames.push(...mappingIndex.ObjectMapping);
23515
+ }
23516
+ }
23517
+ if (!targetRuleApiNames.length) {
23518
+ throw new Error('No object-mapping metadata found. Use --ruleApiNames <apiNames> or create local object-mapping metadata first.');
23392
23519
  }
23393
23520
  for (const ruleApiName of targetRuleApiNames) {
23394
23521
  try {
23395
- let mappingMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName, {
23396
- objectApiName: checkedObjectApiName,
23397
- });
23522
+ let mappingMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName);
23398
23523
  if (!mappingMeta.content || !isRecord(mappingMeta.content)) {
23399
- throw new Error(`Invalid object-mapping content: ${checkedObjectApiName}.${ruleApiName}`);
23524
+ throw new Error(`Invalid object-mapping content: ${ruleApiName}`);
23400
23525
  }
23526
+ const content = mappingMeta.content;
23527
+ const button = content.button;
23528
+ const describeApiName = normalize_ts_1.default.normalizeString(content.describe_api_name)
23529
+ ?? normalize_ts_1.default.normalizeString(content.describeApiName)
23530
+ ?? normalize_ts_1.default.normalizeString(button?.describe_api_name)
23531
+ ?? '';
23401
23532
  // pre-pull for non-new rules
23402
23533
  if (mappingMeta.status !== 'new') {
23403
- logger_ts_1.loggerService.startLoading('object-mapping push pre-pull: ' + checkedObjectApiName + '.' + ruleApiName);
23534
+ logger_ts_1.loggerService.startLoading('object-mapping push pre-pull: ' + ruleApiName);
23404
23535
  try {
23405
- const prePullResult = await (0, object_mapping_pull_ts_1.objectMappingPullService)(checkedObjectApiName, false, skipOverwriteConfirm);
23536
+ const prePullResult = await (0, object_mapping_pull_ts_1.objectMappingPullService)({
23537
+ skipOverwriteConfirm,
23538
+ });
23406
23539
  errorMessages.push(...prePullResult.errorMessages);
23407
23540
  }
23408
23541
  finally {
23409
23542
  logger_ts_1.loggerService.stopLoading();
23410
23543
  }
23411
23544
  }
23412
- // Check remote existence
23413
- logger_ts_1.loggerService.startLoading('object-mapping push check remote: ' + checkedObjectApiName + '.' + ruleApiName);
23545
+ // 远端存在性检查
23546
+ logger_ts_1.loggerService.startLoading('object-mapping push check remote: ' + ruleApiName);
23414
23547
  let existsRemotely = false;
23415
23548
  try {
23416
- const remoteMappings = await (0, object_mapping_list_ts_1.fetchObjectMappingList)(checkedObjectApiName, null);
23417
- existsRemotely = remoteMappings.some((item) => {
23418
- const remoteName = normalize_ts_1.default.normalizeString(item.api_name)
23419
- ?? normalize_ts_1.default.normalizeString(item.apiName);
23420
- return remoteName === ruleApiName;
23549
+ const remoteItems = await (0, object_mapping_list_ts_1.fetchObjectMappingList)();
23550
+ existsRemotely = remoteItems.some((item) => {
23551
+ const ruleList = item.ruleList;
23552
+ return ruleList?.some((rule) => {
23553
+ const remoteName = normalize_ts_1.default.normalizeString(rule.rule_api_name);
23554
+ return remoteName === ruleApiName;
23555
+ }) ?? false;
23421
23556
  });
23422
23557
  }
23423
23558
  finally {
23424
23559
  logger_ts_1.loggerService.stopLoading();
23425
23560
  }
23426
- // Fix local status based on remote
23561
+ // 状态修正
23427
23562
  if (mappingMeta.status === 'new' && existsRemotely) {
23428
- await xmlMetadataManager.writeXml('ObjectMapping', ruleApiName, mappingMeta.content, {
23429
- objectApiName: checkedObjectApiName,
23563
+ await xmlMetadataManager.writeXml('ObjectMapping', ruleApiName, content, {
23430
23564
  status: 'modified',
23431
23565
  features: mappingMeta.features,
23432
23566
  extra: mappingMeta.extra,
23433
23567
  });
23434
- logger_ts_1.loggerService.warn('Object-mapping exists remotely, local status changed from new to modified: ' + checkedObjectApiName + '.' + ruleApiName);
23435
- mappingMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName, {
23436
- objectApiName: checkedObjectApiName,
23437
- });
23568
+ logger_ts_1.loggerService.warn('Object-mapping exists remotely, local status changed from new to modified: ' + ruleApiName);
23569
+ mappingMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName);
23438
23570
  }
23439
23571
  if (mappingMeta.status !== 'new' && !existsRemotely) {
23440
- await xmlMetadataManager.writeXml('ObjectMapping', ruleApiName, mappingMeta.content, {
23441
- objectApiName: checkedObjectApiName,
23572
+ await xmlMetadataManager.writeXml('ObjectMapping', ruleApiName, content, {
23442
23573
  status: 'new',
23443
23574
  features: mappingMeta.features,
23444
23575
  extra: mappingMeta.extra,
23445
23576
  });
23446
- logger_ts_1.loggerService.warn('Object-mapping does not exist remotely, local status changed from ' + mappingMeta.status + ' to new: ' + checkedObjectApiName + '.' + ruleApiName);
23447
- mappingMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName, {
23448
- objectApiName: checkedObjectApiName,
23449
- });
23577
+ logger_ts_1.loggerService.warn('Object-mapping does not exist remotely, local status changed from ' + mappingMeta.status + ' to new: ' + ruleApiName);
23578
+ mappingMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName);
23450
23579
  }
23451
23580
  const isCreate = mappingMeta.status === 'new';
23452
- const mappingContent = { ...(mappingMeta.content && isRecord(mappingMeta.content)
23581
+ // 组装 push payload(对齐 create-rule/update-rule API 格式)
23582
+ const updatedContent = { ...(mappingMeta.content && isRecord(mappingMeta.content)
23453
23583
  ? mappingMeta.content
23454
- : {}) };
23455
- if (!mappingContent.describe_api_name) {
23456
- mappingContent.describe_api_name = checkedObjectApiName;
23584
+ : content) };
23585
+ if (!updatedContent.describe_api_name) {
23586
+ updatedContent.describe_api_name = describeApiName;
23457
23587
  }
23458
- if (!mappingContent.api_name) {
23459
- mappingContent.api_name = ruleApiName;
23588
+ // ruleList(camelCase,pull 返回)→ rule_list(snake_case,create-rule/update-rule API 要求)
23589
+ if (updatedContent.ruleList && !updatedContent.rule_list) {
23590
+ updatedContent.rule_list = updatedContent.ruleList;
23591
+ delete updatedContent.ruleList;
23460
23592
  }
23461
- logger_ts_1.loggerService.startLoading('object-mapping push request: ' + checkedObjectApiName + '.' + ruleApiName + ' (' + (isCreate ? 'create' : 'update') + ')');
23593
+ logger_ts_1.loggerService.startLoading('object-mapping push request: ' + ruleApiName + ' (' + (isCreate ? 'create' : 'update') + ')');
23462
23594
  const raw = await (0, request_ts_1.requestObjectDevExecute)(isCreate
23463
23595
  ? (0, request_execute_command_paths_ts_1.getShareCliCommandPath)('objectMapping', 'create-rule')
23464
- : (0, request_execute_command_paths_ts_1.getShareCliCommandPath)('objectMapping', 'update-rule'), mappingContent);
23596
+ : (0, request_execute_command_paths_ts_1.getShareCliCommandPath)('objectMapping', 'update-rule'), updatedContent);
23465
23597
  const response = raw;
23466
23598
  if (response.success !== true || normalize_ts_1.default.normalizeString(normalize_ts_1.default.asString(response.code)) !== 'OK') {
23467
23599
  logger_ts_1.loggerService.stopLoading();
23468
23600
  throw new Error('object-mapping push failed: ' + (normalize_ts_1.default.normalizeText(response.message) || 'Unknown error'));
23469
23601
  }
23470
23602
  logger_ts_1.loggerService.stopLoading();
23471
- // Write back status
23472
- const latestMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName, {
23473
- objectApiName: checkedObjectApiName,
23474
- });
23603
+ // 回写状态
23604
+ const latestMeta = await xmlMetadataManager.readXml('ObjectMapping', ruleApiName);
23475
23605
  await xmlMetadataManager.writeXml('ObjectMapping', ruleApiName, latestMeta.content, {
23476
- objectApiName: checkedObjectApiName,
23477
23606
  status: 'unchanged',
23478
23607
  features: latestMeta.features,
23479
23608
  extra: latestMeta.extra,
23480
23609
  });
23481
23610
  // post-pull
23482
- logger_ts_1.loggerService.startLoading('object-mapping push post-pull: ' + checkedObjectApiName);
23611
+ logger_ts_1.loggerService.startLoading('object-mapping push post-pull');
23483
23612
  try {
23484
- const postPullResult = await (0, object_mapping_pull_ts_1.objectMappingPullService)(checkedObjectApiName, false, skipOverwriteConfirm);
23613
+ const postPullResult = await (0, object_mapping_pull_ts_1.objectMappingPullService)({
23614
+ skipOverwriteConfirm,
23615
+ });
23485
23616
  errorMessages.push(...postPullResult.errorMessages);
23486
23617
  }
23487
23618
  finally {
23488
23619
  logger_ts_1.loggerService.stopLoading();
23489
23620
  }
23490
- logger_ts_1.loggerService.info(`Object-mapping pushed: ${checkedObjectApiName}.${ruleApiName}`);
23621
+ logger_ts_1.loggerService.info(`Object-mapping pushed: ${ruleApiName}`);
23491
23622
  }
23492
23623
  catch (error) {
23493
- errorMessages.push(`Object-mapping push failed: ${checkedObjectApiName}.${ruleApiName}: ${error}`);
23624
+ errorMessages.push(`Object-mapping push failed: ${ruleApiName}: ${error}`);
23494
23625
  }
23495
23626
  }
23496
23627
  return {
23497
- objectApiName: checkedObjectApiName,
23628
+ objectApiName: '',
23498
23629
  apiName: targetRuleApiNames.join(','),
23499
23630
  errorMessages,
23500
23631
  };
@@ -23516,11 +23647,7 @@ exports.objectMappingUpdateService = void 0;
23516
23647
  const normalize_ts_1 = __importDefault(__webpack_require__(9268));
23517
23648
  const index_ts_1 = __webpack_require__(9985);
23518
23649
  const xmlMetadataManager = new index_ts_1.XmlMetadataManager();
23519
- const objectMappingUpdateService = async (objectApiName, data) => {
23520
- const checkedObjectApiName = normalize_ts_1.default.normalizeString(objectApiName);
23521
- if (!checkedObjectApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(checkedObjectApiName)) {
23522
- throw new Error('Invalid arguments: objectApiName is required.');
23523
- }
23650
+ const objectMappingUpdateService = async (data) => {
23524
23651
  const raw = normalize_ts_1.default.normalizeString(data);
23525
23652
  if (!raw) {
23526
23653
  throw new Error('Invalid arguments: data is required.');
@@ -23529,26 +23656,30 @@ const objectMappingUpdateService = async (objectApiName, data) => {
23529
23656
  if (!mappingData || typeof mappingData !== 'object' || Array.isArray(mappingData)) {
23530
23657
  throw new Error('data must be a JSON object.');
23531
23658
  }
23532
- const mappingApiName = normalize_ts_1.default.normalizeString(normalize_ts_1.default.asString(mappingData.api_name))
23533
- ?? normalize_ts_1.default.normalizeString(normalize_ts_1.default.asString(mappingData.apiName));
23659
+ // rule_list 中提取主规则的 rule_api_name 作为文件名
23660
+ const ruleList = mappingData.rule_list;
23661
+ const mainRule = ruleList?.find((r) => {
23662
+ const master = r.master_rule_api_name;
23663
+ return !master || master === '';
23664
+ });
23665
+ const mappingApiName = mainRule
23666
+ ? (normalize_ts_1.default.normalizeString(mainRule.rule_api_name) ?? '')
23667
+ : normalize_ts_1.default.normalizeString(mappingData.api_name)
23668
+ ?? normalize_ts_1.default.normalizeString(mappingData.apiName)
23669
+ ?? '';
23534
23670
  if (!mappingApiName || !/^[A-Za-z][A-Za-z0-9_]*$/.test(mappingApiName)) {
23535
- throw new Error('Invalid arguments: api_name or apiName is required in data.');
23671
+ throw new Error('Invalid arguments: cannot determine apiName from data (need rule_list with main rule or api_name/apiName).');
23536
23672
  }
23537
23673
  const current = await xmlMetadataManager.readXml('ObjectMapping', mappingApiName, {
23538
- objectApiName: checkedObjectApiName,
23539
23674
  fields: ['content', 'status']
23540
23675
  });
23541
23676
  if (current.content === null || current.content === undefined) {
23542
- throw new Error(`Object-mapping metadata not found: ${checkedObjectApiName}.${mappingApiName}`);
23677
+ throw new Error(`Object-mapping metadata not found: ${mappingApiName}`);
23543
23678
  }
23544
23679
  const filePath = await xmlMetadataManager.writeXml('ObjectMapping', mappingApiName, mappingData, {
23545
- objectApiName: checkedObjectApiName,
23546
23680
  status: current.status === 'new' ? 'new' : 'modified'
23547
23681
  });
23548
- return {
23549
- filePath,
23550
- errorMessages: []
23551
- };
23682
+ return { filePath, errorMessages: [] };
23552
23683
  };
23553
23684
  exports.objectMappingUpdateService = objectMappingUpdateService;
23554
23685
 
@@ -42991,7 +43122,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"application/1d-interleaved-parityfec
42991
43122
  /***/ 8330
42992
43123
  (module) {
42993
43124
 
42994
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@share-crm/sharedev-cli","version":"0.0.4-rc.21","private":false,"description":"sharedev command line tool","type":"module","main":"dist/sharedev.js","bin":{"sharedev":"./bin/cli.mjs"},"author":{"name":"sharecrm-npm"},"files":["dist","bin","README.md"],"scripts":{"build":"tsc --noEmit && webpack --config build/webpack/webpack.prod.cjs","build:debug":"tsc --noEmit && webpack --config build/webpack/webpack.debug.cjs","build:bin":"bun build --compile --target=bun-darwin-x64 src/cli.ts --outfile scripts/sharedev-darwin-x64 && bun build --compile --target=bun-darwin-arm64 src/cli.ts --outfile scripts/sharedev-darwin-arm64 && bun build --compile --target=bun-windows-x64 src/cli.ts --outfile scripts/sharedev-windows-x64.exe","build:all":"npm run build && npm run build:bin","dev":"tsc --noEmit --watch & webpack --config build/webpack/webpack.dev.cjs --watch","dev2":"node src/cli.ts","typecheck":"tsc --noEmit","prettier":"prettier --write ./src/**/*.ts","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"dependencies":{"@clack/prompts":"^1.1.0","@mariozechner/pi-coding-agent":"^0.62.0","axios":"~1.13.0","chalk":"^5.6.2","commander":"^14.0.1","extract-zip":"^2.0.1","fast-xml-parser":"^5.2.5","fs-extra":"^11.3.2","lodash-es":"^4.18.1","ora":"^9.3.0"},"devDependencies":{"@types/extract-zip":"^2.0.3","@types/fs-extra":"^11.0.4","@types/lodash-es":"^4.17.12","@types/node":"^24.3.0","@vitest/coverage-v8":"^4.1.8","ts-loader":"^9.5.4","typescript":"^5.9.2","vitest":"^3.2.6","webpack":"^5.101.3","webpack-cli":"^6.0.1","webpack-merge":"^6.0.1"},"packageManager":"pnpm@10.17.0"}');
43125
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@share-crm/sharedev-cli","version":"0.0.4-rc.22","private":false,"description":"sharedev command line tool","type":"module","main":"dist/sharedev.js","bin":{"sharedev":"./bin/cli.mjs"},"author":{"name":"sharecrm-npm"},"files":["dist","bin","README.md"],"scripts":{"build":"tsc --noEmit && webpack --config build/webpack/webpack.prod.cjs","build:debug":"tsc --noEmit && webpack --config build/webpack/webpack.debug.cjs","build:bin":"bun build --compile --target=bun-darwin-x64 src/cli.ts --outfile scripts/sharedev-darwin-x64 && bun build --compile --target=bun-darwin-arm64 src/cli.ts --outfile scripts/sharedev-darwin-arm64 && bun build --compile --target=bun-windows-x64 src/cli.ts --outfile scripts/sharedev-windows-x64.exe","build:all":"npm run build && npm run build:bin","dev":"tsc --noEmit --watch & webpack --config build/webpack/webpack.dev.cjs --watch","dev2":"node src/cli.ts","typecheck":"tsc --noEmit","prettier":"prettier --write ./src/**/*.ts","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"dependencies":{"@clack/prompts":"^1.1.0","@mariozechner/pi-coding-agent":"^0.62.0","axios":"~1.13.0","chalk":"^5.6.2","commander":"^14.0.1","extract-zip":"^2.0.1","fast-xml-parser":"^5.2.5","fs-extra":"^11.3.2","lodash-es":"^4.18.1","ora":"^9.3.0"},"devDependencies":{"@types/extract-zip":"^2.0.3","@types/fs-extra":"^11.0.4","@types/lodash-es":"^4.17.12","@types/node":"^24.3.0","@vitest/coverage-v8":"^4.1.8","ts-loader":"^9.5.4","typescript":"^5.9.2","vitest":"^3.2.6","webpack":"^5.101.3","webpack-cli":"^6.0.1","webpack-merge":"^6.0.1"},"packageManager":"pnpm@10.17.0"}');
42995
43126
 
42996
43127
  /***/ }
42997
43128