@ttmg/cli 0.3.7-beta.2 → 0.3.7-beta.3

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 (43) hide show
  1. package/dist/index.js +307 -38
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +1 -1
  4. package/dist/public/assets/Detail-DZjhasKd.js +1 -0
  5. package/dist/public/assets/Detail-DZjhasKd.js.br +0 -0
  6. package/dist/public/assets/{baseForm-B7tArmif.js → baseForm-Dyl22bqB.js} +1 -1
  7. package/dist/public/assets/baseForm-Dyl22bqB.js.br +0 -0
  8. package/dist/public/assets/{index-TYa4eXxF.css → index-BBnWlodN.css} +1 -1
  9. package/dist/public/assets/index-BBnWlodN.css.br +0 -0
  10. package/dist/public/assets/{index-D35C4ac4.js → index-BKY0zDI7.js} +1 -1
  11. package/dist/public/assets/{index-aD1InxYk.js → index-BLRDSesS.js} +1 -1
  12. package/dist/public/assets/{index-BOiN8aIS.js → index-BUy8I0vu.js} +1 -1
  13. package/dist/public/assets/{index-DQqzytdw.js → index-BrSFFuip.js} +1 -1
  14. package/dist/public/assets/index-BrSFFuip.js.br +0 -0
  15. package/dist/public/assets/{index-BswgGVlz.js → index-C5pUkGpS.js} +1 -1
  16. package/dist/public/assets/index-C5pUkGpS.js.br +0 -0
  17. package/dist/public/assets/{index-tXDZpXMk.js → index-CBkk8KwT.js} +1 -1
  18. package/dist/public/assets/index-CBkk8KwT.js.br +0 -0
  19. package/dist/public/assets/{index-BVi9swz_.js → index-Cx35BU6U.js} +1 -1
  20. package/dist/public/assets/index-Cx35BU6U.js.br +0 -0
  21. package/dist/public/assets/{index-Sk6u8HWP.js → index-D48tyFsA.js} +1 -1
  22. package/dist/public/assets/{index-DkXWo3Jg.js → index-DD7xtDwI.js} +3 -3
  23. package/dist/public/assets/index-DD7xtDwI.js.br +0 -0
  24. package/dist/public/assets/{index-CDrq3KnY.js → index-HL2ryl1V.js} +1 -1
  25. package/dist/public/assets/{index-B0CT2rYr.js → index-KxEzggZ9.js} +1 -1
  26. package/dist/public/assets/{index-BlXhGm9R.js → index-_INIaBu0.js} +1 -1
  27. package/dist/public/assets/{index-DdH9Yin-.js → index-aXJ7ldcB.js} +1 -1
  28. package/dist/public/assets/{index-B-rc2X1H.js → index-bAz3gu-3.js} +1 -1
  29. package/dist/public/assets/{index-Cj-lTEG1.js → index-rDVdz60K.js} +1 -1
  30. package/dist/public/assets/index-rDVdz60K.js.br +0 -0
  31. package/dist/public/assets/{times-CCIAbLYL.js → times-Cue9NmYo.js} +1 -1
  32. package/dist/public/index.html +1 -1
  33. package/package.json +1 -1
  34. package/dist/public/assets/Detail-BInCTDTx.js +0 -1
  35. package/dist/public/assets/Detail-BInCTDTx.js.br +0 -0
  36. package/dist/public/assets/baseForm-B7tArmif.js.br +0 -0
  37. package/dist/public/assets/index-BVi9swz_.js.br +0 -0
  38. package/dist/public/assets/index-BswgGVlz.js.br +0 -0
  39. package/dist/public/assets/index-Cj-lTEG1.js.br +0 -0
  40. package/dist/public/assets/index-DQqzytdw.js.br +0 -0
  41. package/dist/public/assets/index-DkXWo3Jg.js.br +0 -0
  42. package/dist/public/assets/index-tXDZpXMk.js.br +0 -0
  43. /package/dist/public/assets/{index-OIQapQiA.js → index-4r0PC3Bk.js} +0 -0
package/dist/index.js CHANGED
@@ -6772,6 +6772,44 @@ function isAxiosError(e) {
6772
6772
  return !!e?.isAxiosError;
6773
6773
  }
6774
6774
 
6775
+ const CREATE_DIRECT_FEED_CARD_URL = 'https://developers.tiktok.com/tiktok/v4/devportal/mini_game/fyf_card/create_direct_feed_card';
6776
+ const DIRECT_FEED_CARD_HEADERS$2 = {
6777
+ 'Content-Type': 'application/json',
6778
+ 'x-use-ppe': '1',
6779
+ 'x-tt-env': 'ppe_feed_play',
6780
+ };
6781
+ async function createDirectFeedCard({ appId, clientKey, directFeedCard, }) {
6782
+ const payload = {
6783
+ app_id: appId,
6784
+ client_key: clientKey,
6785
+ direct_feed_card: directFeedCard,
6786
+ };
6787
+ return request({
6788
+ url: CREATE_DIRECT_FEED_CARD_URL,
6789
+ method: 'POST',
6790
+ headers: DIRECT_FEED_CARD_HEADERS$2,
6791
+ data: payload,
6792
+ });
6793
+ }
6794
+
6795
+ const GET_DIRECT_FEED_SCENARIOS_URL = 'https://developers.tiktok.com/tiktok/v4/devportal/mini_game/fyf_card/get_direct_feed_scenario';
6796
+ const DIRECT_FEED_CARD_HEADERS$1 = {
6797
+ 'Content-Type': 'application/json',
6798
+ 'x-use-ppe': '1',
6799
+ 'x-tt-env': 'ppe_feed_play',
6800
+ };
6801
+ async function fetchDirectFeedScenarios({ appId, clientKey, }) {
6802
+ return request({
6803
+ url: GET_DIRECT_FEED_SCENARIOS_URL,
6804
+ method: 'POST',
6805
+ headers: DIRECT_FEED_CARD_HEADERS$1,
6806
+ data: {
6807
+ app_id: appId,
6808
+ client_key: clientKey,
6809
+ },
6810
+ });
6811
+ }
6812
+
6775
6813
  const GET_GAME_ASSET_PREVIEW_URL = 'https://developers.tiktok.com/tiktok/v4/devportal/mini_game/asset/preview_url';
6776
6814
  async function fetchGameAssetPreviewUrl({ assetId, }) {
6777
6815
  return request({
@@ -9192,51 +9230,130 @@ const gameDirectFeedCardAssetPreviewRoute = {
9192
9230
  },
9193
9231
  };
9194
9232
 
9195
- function hasBlockingCardStatus(value) {
9196
- if (value === null || value === undefined || value === '') {
9197
- return false;
9233
+ async function resolveAppIdentity$2(body) {
9234
+ const clientKey = body?.clientKey?.trim() ||
9235
+ body?.client_key?.trim() ||
9236
+ getClientKey().clientKey?.trim();
9237
+ let appId = body?.appId?.trim() ||
9238
+ body?.app_id?.trim() ||
9239
+ store.getState().appId?.trim();
9240
+ if (!clientKey) {
9241
+ return {
9242
+ clientKey: '',
9243
+ appId,
9244
+ error: 'Missing client key. Please run `ttmg init` or pass `clientKey` from IDE.',
9245
+ };
9198
9246
  }
9199
- if (typeof value === 'number') {
9200
- return value <= 0;
9247
+ if (!appId) {
9248
+ const gameInfoResponse = await fetchGameInfo(clientKey);
9249
+ if (gameInfoResponse.error) {
9250
+ return {
9251
+ clientKey,
9252
+ appId: '',
9253
+ error: gameInfoResponse.error,
9254
+ };
9255
+ }
9256
+ appId = gameInfoResponse.data?.app_id?.trim() || '';
9257
+ if (appId) {
9258
+ store.setState({ appId });
9259
+ }
9201
9260
  }
9202
- const normalized = String(value).toLowerCase();
9203
- return [
9204
- 'pending',
9205
- 'review',
9206
- 'reviewing',
9207
- 'processing',
9208
- 'reject',
9209
- 'rejected',
9210
- 'fail',
9211
- 'failed',
9212
- 'disable',
9213
- 'disabled',
9214
- 'offline',
9215
- 'draft',
9216
- 'delete',
9217
- 'deleted',
9218
- ].some(keyword => normalized.includes(keyword));
9219
- }
9220
- function isUsableDirectFeedCard(card) {
9221
- if (!card?.content_id) {
9222
- return false;
9261
+ if (!appId) {
9262
+ return {
9263
+ clientKey,
9264
+ appId: '',
9265
+ error: 'Missing app id. Please open project detail first or pass `appId` from IDE.',
9266
+ };
9223
9267
  }
9224
- if (hasBlockingCardStatus(card.status)) {
9225
- return false;
9268
+ return {
9269
+ clientKey,
9270
+ appId,
9271
+ error: null,
9272
+ };
9273
+ }
9274
+ function normalizeDirectFeedCard(body) {
9275
+ const camelCard = body?.directFeedCard;
9276
+ const snakeCard = body?.direct_feed_card;
9277
+ const normalized = {
9278
+ card_name: camelCard?.cardName?.trim() || snakeCard?.card_name?.trim() || '',
9279
+ card_desc: camelCard?.cardDesc?.trim() || snakeCard?.card_desc?.trim() || '',
9280
+ card_type: Number(camelCard?.cardType ?? snakeCard?.card_type ?? 0),
9281
+ scenario: camelCard?.scenario?.trim() || snakeCard?.scenario?.trim() || '',
9282
+ sub_pkg: camelCard?.subPkg?.trim() || snakeCard?.sub_pkg?.trim() || '__GAME__',
9283
+ params: camelCard?.params?.trim() || snakeCard?.params?.trim() || '',
9284
+ };
9285
+ if (!normalized.card_name || !normalized.card_desc || !normalized.card_type || !normalized.scenario) {
9286
+ return {
9287
+ card: normalized,
9288
+ error: 'Missing required direct-play card fields.',
9289
+ };
9226
9290
  }
9227
- // Dev Portal returns numeric audit statuses; `1` is already usable in practice,
9228
- // so only block clearly invalid numeric values and known textual blocking states.
9229
- if (typeof card.audit_status === 'number') {
9230
- if (card.audit_status <= 0) {
9231
- return false;
9291
+ return {
9292
+ card: normalized,
9293
+ error: null,
9294
+ };
9295
+ }
9296
+ const gameDirectFeedCardCreateRoute = {
9297
+ method: 'post',
9298
+ path: '/game/direct-feed-card/create',
9299
+ handler: async (req, res) => {
9300
+ const identity = await resolveAppIdentity$2(req.body);
9301
+ if (identity.error) {
9302
+ res.send({
9303
+ code: errorCode,
9304
+ error: identity.error,
9305
+ data: null,
9306
+ });
9307
+ return;
9232
9308
  }
9233
- }
9234
- else if (hasBlockingCardStatus(card.audit_status)) {
9309
+ const directFeedCard = normalizeDirectFeedCard(req.body);
9310
+ if (directFeedCard.error) {
9311
+ res.send({
9312
+ code: errorCode,
9313
+ error: directFeedCard.error,
9314
+ data: null,
9315
+ });
9316
+ return;
9317
+ }
9318
+ const response = await createDirectFeedCard({
9319
+ appId: identity.appId,
9320
+ clientKey: identity.clientKey,
9321
+ directFeedCard: directFeedCard.card,
9322
+ });
9323
+ if (response.error) {
9324
+ res.send({
9325
+ code: errorCode,
9326
+ error: response.error,
9327
+ ctx: response.ctx,
9328
+ });
9329
+ return;
9330
+ }
9331
+ res.send({
9332
+ code: successCode,
9333
+ data: {
9334
+ ...(typeof response.data === 'object' && response.data ? response.data : {}),
9335
+ direct_feed_card: {
9336
+ ...(typeof response.data === 'object' &&
9337
+ response.data &&
9338
+ typeof response.data.direct_feed_card === 'object'
9339
+ ? (response.data.direct_feed_card ||
9340
+ {})
9341
+ : {}),
9342
+ ...directFeedCard.card,
9343
+ },
9344
+ },
9345
+ ctx: response.ctx,
9346
+ });
9347
+ },
9348
+ };
9349
+
9350
+ function isUsableDirectFeedCard(card) {
9351
+ if (!card?.content_id) {
9235
9352
  return false;
9236
9353
  }
9237
9354
  return true;
9238
9355
  }
9239
- async function resolveAppIdentity(body) {
9356
+ async function resolveAppIdentity$1(body) {
9240
9357
  const clientKey = body?.clientKey?.trim() ||
9241
9358
  body?.client_key?.trim() ||
9242
9359
  getClientKey().clientKey?.trim();
@@ -9281,7 +9398,7 @@ const gameDirectFeedCardListRoute = {
9281
9398
  method: 'post',
9282
9399
  path: '/game/direct-feed-card/list',
9283
9400
  handler: async (req, res) => {
9284
- const identity = await resolveAppIdentity(req.body);
9401
+ const identity = await resolveAppIdentity$1(req.body);
9285
9402
  if (identity.error) {
9286
9403
  res.send({
9287
9404
  code: errorCode,
@@ -9321,6 +9438,156 @@ const gameDirectFeedCardListRoute = {
9321
9438
  },
9322
9439
  };
9323
9440
 
9441
+ function getStringCandidate(value) {
9442
+ return typeof value === 'string' && value.trim() ? value.trim() : '';
9443
+ }
9444
+ function normalizeScenarioOption(item) {
9445
+ const value = getStringCandidate(item.value) ||
9446
+ getStringCandidate(item.key) ||
9447
+ getStringCandidate(item.scenario) ||
9448
+ getStringCandidate(item.scenario_key) ||
9449
+ getStringCandidate(item.scene) ||
9450
+ getStringCandidate(item.id) ||
9451
+ getStringCandidate(item.code);
9452
+ if (!value) {
9453
+ return null;
9454
+ }
9455
+ const label = getStringCandidate(item.label) ||
9456
+ getStringCandidate(item.name) ||
9457
+ getStringCandidate(item.title) ||
9458
+ getStringCandidate(item.desc) ||
9459
+ getStringCandidate(item.description) ||
9460
+ getStringCandidate(item.display_name) ||
9461
+ getStringCandidate(item.displayName) ||
9462
+ getStringCandidate(item.scenario_name) ||
9463
+ value;
9464
+ const cardTypeCandidate = item.card_type ?? item.cardType;
9465
+ const cardType = typeof cardTypeCandidate === 'number'
9466
+ ? cardTypeCandidate
9467
+ : typeof cardTypeCandidate === 'string' && cardTypeCandidate.trim()
9468
+ ? Number(cardTypeCandidate)
9469
+ : undefined;
9470
+ return {
9471
+ label,
9472
+ value,
9473
+ cardType: Number.isFinite(cardType) ? cardType : undefined,
9474
+ };
9475
+ }
9476
+ function extractScenarioOptions(data) {
9477
+ const dataRecord = data && typeof data === 'object' ? data : null;
9478
+ const candidateLists = [
9479
+ data,
9480
+ dataRecord?.data,
9481
+ dataRecord?.scenarios,
9482
+ dataRecord?.scenario_list,
9483
+ dataRecord?.scenario_infos,
9484
+ dataRecord?.scenario_info_list,
9485
+ dataRecord?.list,
9486
+ ];
9487
+ for (const candidate of candidateLists) {
9488
+ if (!Array.isArray(candidate)) {
9489
+ continue;
9490
+ }
9491
+ const normalized = candidate
9492
+ .map(item => item && typeof item === 'object'
9493
+ ? normalizeScenarioOption(item)
9494
+ : null)
9495
+ .filter((item) => Boolean(item));
9496
+ if (normalized.length > 0) {
9497
+ const deduped = new Map();
9498
+ normalized.forEach(item => {
9499
+ deduped.set(item.value, item);
9500
+ });
9501
+ return Array.from(deduped.values());
9502
+ }
9503
+ }
9504
+ return [];
9505
+ }
9506
+ async function resolveAppIdentity(body) {
9507
+ const clientKey = body?.clientKey?.trim() ||
9508
+ body?.client_key?.trim() ||
9509
+ getClientKey().clientKey?.trim();
9510
+ let appId = body?.appId?.trim() ||
9511
+ body?.app_id?.trim() ||
9512
+ store.getState().appId?.trim();
9513
+ if (!clientKey) {
9514
+ return {
9515
+ clientKey: '',
9516
+ appId,
9517
+ error: 'Missing client key. Please run `ttmg init` or pass `clientKey` from IDE.',
9518
+ };
9519
+ }
9520
+ if (!appId) {
9521
+ const gameInfoResponse = await fetchGameInfo(clientKey);
9522
+ if (gameInfoResponse.error) {
9523
+ return {
9524
+ clientKey,
9525
+ appId: '',
9526
+ error: gameInfoResponse.error,
9527
+ };
9528
+ }
9529
+ appId = gameInfoResponse.data?.app_id?.trim() || '';
9530
+ if (appId) {
9531
+ store.setState({ appId });
9532
+ }
9533
+ }
9534
+ if (!appId) {
9535
+ return {
9536
+ clientKey,
9537
+ appId: '',
9538
+ error: 'Missing app id. Please open project detail first or pass `appId` from IDE.',
9539
+ };
9540
+ }
9541
+ return {
9542
+ clientKey,
9543
+ appId,
9544
+ error: null,
9545
+ };
9546
+ }
9547
+ const gameDirectFeedCardScenariosRoute = {
9548
+ method: 'post',
9549
+ path: '/game/direct-feed-card/scenarios',
9550
+ handler: async (req, res) => {
9551
+ const identity = await resolveAppIdentity(req.body);
9552
+ if (identity.error) {
9553
+ res.send({
9554
+ code: errorCode,
9555
+ error: identity.error,
9556
+ data: null,
9557
+ });
9558
+ return;
9559
+ }
9560
+ const response = await fetchDirectFeedScenarios({
9561
+ appId: identity.appId,
9562
+ clientKey: identity.clientKey,
9563
+ });
9564
+ if (response.error) {
9565
+ res.send({
9566
+ code: errorCode,
9567
+ error: response.error,
9568
+ ctx: response.ctx,
9569
+ });
9570
+ return;
9571
+ }
9572
+ const scenarios = extractScenarioOptions(response.data);
9573
+ const data = response.data && typeof response.data === 'object'
9574
+ ? {
9575
+ ...response.data,
9576
+ scenarios,
9577
+ total: scenarios.length,
9578
+ }
9579
+ : {
9580
+ scenarios,
9581
+ total: scenarios.length,
9582
+ };
9583
+ res.send({
9584
+ code: successCode,
9585
+ data,
9586
+ ctx: response.ctx,
9587
+ });
9588
+ },
9589
+ };
9590
+
9324
9591
  const gameDetailRoute = {
9325
9592
  method: 'get',
9326
9593
  path: '/game/detail',
@@ -10707,7 +10974,9 @@ const routes = [
10707
10974
  gameDetailRoute,
10708
10975
  gameCheckRoute,
10709
10976
  gameDirectFeedCardAssetPreviewRoute,
10977
+ gameDirectFeedCardCreateRoute,
10710
10978
  gameDirectFeedCardListRoute,
10979
+ gameDirectFeedCardScenariosRoute,
10711
10980
  gameUploadRoute,
10712
10981
  gameWasmSplitConfigRoute,
10713
10982
  gameWasmSplitOptionsRoute,
@@ -11166,7 +11435,7 @@ async function upload({ clientKey, note = '--', dir, }) {
11166
11435
  }
11167
11436
  }
11168
11437
 
11169
- var version = "0.3.7-beta.2";
11438
+ var version = "0.3.7-beta.3";
11170
11439
  var pkg = {
11171
11440
  version: version};
11172
11441