@purpleschool/rugpt-lib-common 0.0.67 → 0.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.githooks/pre-commit +3 -0
- package/.github/workflows/deploy-lib.yml +1 -1
- package/build/errors/errors.js +76 -60
- package/errors/errors.ts +81 -67
- package/package.json +2 -1
- package/scripts/check-errors-structure.js +149 -0
|
@@ -63,7 +63,7 @@ jobs:
|
|
|
63
63
|
🕐 Commit timestamp: **${{ github.event.head_commit.timestamp }}**
|
|
64
64
|
|
|
65
65
|
🔗 **Links:**
|
|
66
|
-
|
|
66
|
+
[View CI/CD Run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
|
|
67
67
|
secrets: inherit
|
|
68
68
|
|
|
69
69
|
publish:
|
package/build/errors/errors.js
CHANGED
|
@@ -1591,6 +1591,82 @@ exports.ERRORS = {
|
|
|
1591
1591
|
message: "Пресет генерации изображения не найден",
|
|
1592
1592
|
},
|
|
1593
1593
|
},
|
|
1594
|
+
IMAGE_RECOGNITION: {
|
|
1595
|
+
AI_REQUEST_ERROR: {
|
|
1596
|
+
code: "IMAGE_RECOGNITION.AI_REQUEST_ERROR",
|
|
1597
|
+
httpCode: 500,
|
|
1598
|
+
message: "Произошла ошибка при обработке запроса ИИ",
|
|
1599
|
+
},
|
|
1600
|
+
IMAGE_ATTACHMENT_INVALID_TYPE: {
|
|
1601
|
+
code: "IMAGE_RECOGNITION.IMAGE_ATTACHMENT_INVALID_TYPE",
|
|
1602
|
+
httpCode: 400,
|
|
1603
|
+
message: "Недопустимый тип файла изображения",
|
|
1604
|
+
},
|
|
1605
|
+
IMAGE_ATTACHMENT_REQUIRED: {
|
|
1606
|
+
code: "IMAGE_RECOGNITION.IMAGE_ATTACHMENT_REQUIRED",
|
|
1607
|
+
httpCode: 400,
|
|
1608
|
+
message: "Для распознавания необходимо приложить ровно одно изображение",
|
|
1609
|
+
},
|
|
1610
|
+
IMAGE_MODERATION_REJECTED: {
|
|
1611
|
+
code: "IMAGE_RECOGNITION.IMAGE_MODERATION_REJECTED",
|
|
1612
|
+
httpCode: 400,
|
|
1613
|
+
message: "Изображение содержит недопустимый контент и отклонено модерацией",
|
|
1614
|
+
},
|
|
1615
|
+
PROMPT_MODERATION_REJECTED: {
|
|
1616
|
+
code: "IMAGE_RECOGNITION.PROMPT_MODERATION_REJECTED",
|
|
1617
|
+
httpCode: 400,
|
|
1618
|
+
message: "Текст запроса отклонён модерацией",
|
|
1619
|
+
},
|
|
1620
|
+
},
|
|
1621
|
+
IMAGE_RECOGNITION_JOB: {
|
|
1622
|
+
FIND_ERROR: {
|
|
1623
|
+
code: "IMAGE_RECOGNITION_JOB.FIND_ERROR",
|
|
1624
|
+
httpCode: 500,
|
|
1625
|
+
message: "Произошла ошибка при поиске задачи распознавания изображений",
|
|
1626
|
+
},
|
|
1627
|
+
NOT_AN_OWNER: {
|
|
1628
|
+
code: "IMAGE_RECOGNITION_JOB.NOT_AN_OWNER",
|
|
1629
|
+
httpCode: 403,
|
|
1630
|
+
message: "Вы не являетесь владельцем этой задачи распознавания изображений",
|
|
1631
|
+
},
|
|
1632
|
+
NOT_FOUND: {
|
|
1633
|
+
code: "IMAGE_RECOGNITION_JOB.NOT_FOUND",
|
|
1634
|
+
httpCode: 404,
|
|
1635
|
+
message: "Задача распознавания изображений не найдена",
|
|
1636
|
+
},
|
|
1637
|
+
NOT_IN_FAILED_STATE_TO_RETRY: {
|
|
1638
|
+
code: "IMAGE_RECOGNITION_JOB.NOT_IN_FAILED_STATE_TO_RETRY",
|
|
1639
|
+
httpCode: 400,
|
|
1640
|
+
message: 'Повторить можно только задачу в статусе "ошибка"',
|
|
1641
|
+
},
|
|
1642
|
+
SAVE_ERROR: {
|
|
1643
|
+
code: "IMAGE_RECOGNITION_JOB.SAVE_ERROR",
|
|
1644
|
+
httpCode: 500,
|
|
1645
|
+
message: "Произошла ошибка при сохранении задачи распознавания изображений",
|
|
1646
|
+
},
|
|
1647
|
+
SOFT_DELETE_ERROR: {
|
|
1648
|
+
code: "IMAGE_RECOGNITION_JOB.SOFT_DELETE_ERROR",
|
|
1649
|
+
httpCode: 500,
|
|
1650
|
+
message: "Произошла ошибка при удалении задачи распознавания изображений",
|
|
1651
|
+
},
|
|
1652
|
+
},
|
|
1653
|
+
IMAGE_RECOGNITION_MODEL: {
|
|
1654
|
+
FIND_ERROR: {
|
|
1655
|
+
code: "IMAGE_RECOGNITION_MODEL.FIND_ERROR",
|
|
1656
|
+
httpCode: 500,
|
|
1657
|
+
message: "Произошла ошибка при поиске модели распознавания изображений",
|
|
1658
|
+
},
|
|
1659
|
+
INACTIVE: {
|
|
1660
|
+
code: "IMAGE_RECOGNITION_MODEL.INACTIVE",
|
|
1661
|
+
httpCode: 400,
|
|
1662
|
+
message: "Модель распознавания изображений недоступна",
|
|
1663
|
+
},
|
|
1664
|
+
NOT_FOUND: {
|
|
1665
|
+
code: "IMAGE_RECOGNITION_MODEL.NOT_FOUND",
|
|
1666
|
+
httpCode: 404,
|
|
1667
|
+
message: "Модель распознавания изображений не найдена",
|
|
1668
|
+
},
|
|
1669
|
+
},
|
|
1594
1670
|
KEY_VALUE: {
|
|
1595
1671
|
ALREADY_EXISTS: {
|
|
1596
1672
|
code: "KEY_VALUE.ALREADY_EXISTS",
|
|
@@ -5305,66 +5381,6 @@ exports.ERRORS = {
|
|
|
5305
5381
|
httpCode: 500,
|
|
5306
5382
|
},
|
|
5307
5383
|
},
|
|
5308
|
-
INTERIOR_DESIGN_CONFIG_ERROR: {
|
|
5309
|
-
code: "A569",
|
|
5310
|
-
message: "Произошла ошибка при получении конфигурации инструмента для редактирования дизайна интерьера",
|
|
5311
|
-
httpCode: 500,
|
|
5312
|
-
},
|
|
5313
|
-
INTERIOR_DESIGN_SEND_REQUEST_ERROR: {
|
|
5314
|
-
code: "A570",
|
|
5315
|
-
message: "Произошла ошибка при отправке запроса на редактирование дизайна интерьера",
|
|
5316
|
-
httpCode: 500,
|
|
5317
|
-
},
|
|
5318
|
-
INTERIOR_DESIGN_MODEL_NOT_FOUND: {
|
|
5319
|
-
code: "A571",
|
|
5320
|
-
message: "Не удалось найти указанную модель для редактирования дизайна интерьера",
|
|
5321
|
-
httpCode: 400,
|
|
5322
|
-
},
|
|
5323
|
-
INTERIOR_DESIGN_MAX_SYMBOLS_EXCEEDED: {
|
|
5324
|
-
code: "A572",
|
|
5325
|
-
message: "Превышена максимальная количество символов",
|
|
5326
|
-
httpCode: 400,
|
|
5327
|
-
},
|
|
5328
|
-
INTERIOR_DESIGN_SET_REACTION_ERROR: {
|
|
5329
|
-
code: "A573",
|
|
5330
|
-
message: "Произошла ошибка при установке оценке сообщения",
|
|
5331
|
-
httpCode: 500,
|
|
5332
|
-
},
|
|
5333
|
-
INTERIOR_DESIGN_UPDATE_TITLE_ERROR: {
|
|
5334
|
-
code: "A574",
|
|
5335
|
-
message: "Произошла ошибка при обновлении названия чата",
|
|
5336
|
-
httpCode: 500,
|
|
5337
|
-
},
|
|
5338
|
-
INTERIOR_DESIGN_JOB_DELETE_ERROR: {
|
|
5339
|
-
code: "A575",
|
|
5340
|
-
message: "Произошла ошибка при удалении сообщения",
|
|
5341
|
-
httpCode: 500,
|
|
5342
|
-
},
|
|
5343
|
-
INTERIOR_DESIGN_RETRY_REQUEST_ERROR: {
|
|
5344
|
-
code: "A576",
|
|
5345
|
-
message: "Произошла ошибка при повторном запросе на редактирование дизайна интерьера",
|
|
5346
|
-
httpCode: 500,
|
|
5347
|
-
},
|
|
5348
|
-
INTERIOR_DESIGN_MODEL_NOT_AVAILABLE: {
|
|
5349
|
-
code: "A577",
|
|
5350
|
-
message: "Данная модель для редактирования дизайна интерьера недоступна",
|
|
5351
|
-
httpCode: 401,
|
|
5352
|
-
},
|
|
5353
|
-
INTERIOR_DESIGN_MODEL_INACTIVE: {
|
|
5354
|
-
code: "A578",
|
|
5355
|
-
message: "Модель редактирования дизайна интерьера архивирована и недоступна для пользования",
|
|
5356
|
-
httpCode: 403,
|
|
5357
|
-
},
|
|
5358
|
-
INTERIOR_DESIGN_MODEL_FIND_ERROR: {
|
|
5359
|
-
code: "A579",
|
|
5360
|
-
message: "Произошла ошибка при получении модели для редактирования дизайна интерьера",
|
|
5361
|
-
httpCode: 500,
|
|
5362
|
-
},
|
|
5363
|
-
INTERIOR_DESIGN_PRICE_ERROR: {
|
|
5364
|
-
code: "A580",
|
|
5365
|
-
message: "Произошла ошибка при получении цены для редактирования дизайна интерьера",
|
|
5366
|
-
httpCode: 500,
|
|
5367
|
-
},
|
|
5368
5384
|
WATERMARK: {
|
|
5369
5385
|
APPLY_ERROR: {
|
|
5370
5386
|
code: "WATERMARK.APPLY_ERROR",
|
package/errors/errors.ts
CHANGED
|
@@ -1646,6 +1646,87 @@ export const ERRORS = {
|
|
|
1646
1646
|
message: "Пресет генерации изображения не найден",
|
|
1647
1647
|
},
|
|
1648
1648
|
},
|
|
1649
|
+
IMAGE_RECOGNITION: {
|
|
1650
|
+
AI_REQUEST_ERROR: {
|
|
1651
|
+
code: "IMAGE_RECOGNITION.AI_REQUEST_ERROR",
|
|
1652
|
+
httpCode: 500,
|
|
1653
|
+
message: "Произошла ошибка при обработке запроса ИИ",
|
|
1654
|
+
},
|
|
1655
|
+
IMAGE_ATTACHMENT_INVALID_TYPE: {
|
|
1656
|
+
code: "IMAGE_RECOGNITION.IMAGE_ATTACHMENT_INVALID_TYPE",
|
|
1657
|
+
httpCode: 400,
|
|
1658
|
+
message: "Недопустимый тип файла изображения",
|
|
1659
|
+
},
|
|
1660
|
+
IMAGE_ATTACHMENT_REQUIRED: {
|
|
1661
|
+
code: "IMAGE_RECOGNITION.IMAGE_ATTACHMENT_REQUIRED",
|
|
1662
|
+
httpCode: 400,
|
|
1663
|
+
message: "Для распознавания необходимо приложить ровно одно изображение",
|
|
1664
|
+
},
|
|
1665
|
+
IMAGE_MODERATION_REJECTED: {
|
|
1666
|
+
code: "IMAGE_RECOGNITION.IMAGE_MODERATION_REJECTED",
|
|
1667
|
+
httpCode: 400,
|
|
1668
|
+
message:
|
|
1669
|
+
"Изображение содержит недопустимый контент и отклонено модерацией",
|
|
1670
|
+
},
|
|
1671
|
+
PROMPT_MODERATION_REJECTED: {
|
|
1672
|
+
code: "IMAGE_RECOGNITION.PROMPT_MODERATION_REJECTED",
|
|
1673
|
+
httpCode: 400,
|
|
1674
|
+
message: "Текст запроса отклонён модерацией",
|
|
1675
|
+
},
|
|
1676
|
+
},
|
|
1677
|
+
IMAGE_RECOGNITION_JOB: {
|
|
1678
|
+
FIND_ERROR: {
|
|
1679
|
+
code: "IMAGE_RECOGNITION_JOB.FIND_ERROR",
|
|
1680
|
+
httpCode: 500,
|
|
1681
|
+
message: "Произошла ошибка при поиске задачи распознавания изображений",
|
|
1682
|
+
},
|
|
1683
|
+
NOT_AN_OWNER: {
|
|
1684
|
+
code: "IMAGE_RECOGNITION_JOB.NOT_AN_OWNER",
|
|
1685
|
+
httpCode: 403,
|
|
1686
|
+
message:
|
|
1687
|
+
"Вы не являетесь владельцем этой задачи распознавания изображений",
|
|
1688
|
+
},
|
|
1689
|
+
NOT_FOUND: {
|
|
1690
|
+
code: "IMAGE_RECOGNITION_JOB.NOT_FOUND",
|
|
1691
|
+
httpCode: 404,
|
|
1692
|
+
message: "Задача распознавания изображений не найдена",
|
|
1693
|
+
},
|
|
1694
|
+
NOT_IN_FAILED_STATE_TO_RETRY: {
|
|
1695
|
+
code: "IMAGE_RECOGNITION_JOB.NOT_IN_FAILED_STATE_TO_RETRY",
|
|
1696
|
+
httpCode: 400,
|
|
1697
|
+
message: 'Повторить можно только задачу в статусе "ошибка"',
|
|
1698
|
+
},
|
|
1699
|
+
SAVE_ERROR: {
|
|
1700
|
+
code: "IMAGE_RECOGNITION_JOB.SAVE_ERROR",
|
|
1701
|
+
httpCode: 500,
|
|
1702
|
+
message:
|
|
1703
|
+
"Произошла ошибка при сохранении задачи распознавания изображений",
|
|
1704
|
+
},
|
|
1705
|
+
SOFT_DELETE_ERROR: {
|
|
1706
|
+
code: "IMAGE_RECOGNITION_JOB.SOFT_DELETE_ERROR",
|
|
1707
|
+
httpCode: 500,
|
|
1708
|
+
message:
|
|
1709
|
+
"Произошла ошибка при удалении задачи распознавания изображений",
|
|
1710
|
+
},
|
|
1711
|
+
},
|
|
1712
|
+
IMAGE_RECOGNITION_MODEL: {
|
|
1713
|
+
FIND_ERROR: {
|
|
1714
|
+
code: "IMAGE_RECOGNITION_MODEL.FIND_ERROR",
|
|
1715
|
+
httpCode: 500,
|
|
1716
|
+
message:
|
|
1717
|
+
"Произошла ошибка при поиске модели распознавания изображений",
|
|
1718
|
+
},
|
|
1719
|
+
INACTIVE: {
|
|
1720
|
+
code: "IMAGE_RECOGNITION_MODEL.INACTIVE",
|
|
1721
|
+
httpCode: 400,
|
|
1722
|
+
message: "Модель распознавания изображений недоступна",
|
|
1723
|
+
},
|
|
1724
|
+
NOT_FOUND: {
|
|
1725
|
+
code: "IMAGE_RECOGNITION_MODEL.NOT_FOUND",
|
|
1726
|
+
httpCode: 404,
|
|
1727
|
+
message: "Модель распознавания изображений не найдена",
|
|
1728
|
+
},
|
|
1729
|
+
},
|
|
1649
1730
|
KEY_VALUE: {
|
|
1650
1731
|
ALREADY_EXISTS: {
|
|
1651
1732
|
code: "KEY_VALUE.ALREADY_EXISTS",
|
|
@@ -5455,73 +5536,6 @@ export const ERRORS = {
|
|
|
5455
5536
|
httpCode: 500,
|
|
5456
5537
|
},
|
|
5457
5538
|
},
|
|
5458
|
-
INTERIOR_DESIGN_CONFIG_ERROR: {
|
|
5459
|
-
code: "A569",
|
|
5460
|
-
message:
|
|
5461
|
-
"Произошла ошибка при получении конфигурации инструмента для редактирования дизайна интерьера",
|
|
5462
|
-
httpCode: 500,
|
|
5463
|
-
},
|
|
5464
|
-
INTERIOR_DESIGN_SEND_REQUEST_ERROR: {
|
|
5465
|
-
code: "A570",
|
|
5466
|
-
message:
|
|
5467
|
-
"Произошла ошибка при отправке запроса на редактирование дизайна интерьера",
|
|
5468
|
-
httpCode: 500,
|
|
5469
|
-
},
|
|
5470
|
-
INTERIOR_DESIGN_MODEL_NOT_FOUND: {
|
|
5471
|
-
code: "A571",
|
|
5472
|
-
message:
|
|
5473
|
-
"Не удалось найти указанную модель для редактирования дизайна интерьера",
|
|
5474
|
-
httpCode: 400,
|
|
5475
|
-
},
|
|
5476
|
-
INTERIOR_DESIGN_MAX_SYMBOLS_EXCEEDED: {
|
|
5477
|
-
code: "A572",
|
|
5478
|
-
message: "Превышена максимальная количество символов",
|
|
5479
|
-
httpCode: 400,
|
|
5480
|
-
},
|
|
5481
|
-
INTERIOR_DESIGN_SET_REACTION_ERROR: {
|
|
5482
|
-
code: "A573",
|
|
5483
|
-
message: "Произошла ошибка при установке оценке сообщения",
|
|
5484
|
-
httpCode: 500,
|
|
5485
|
-
},
|
|
5486
|
-
INTERIOR_DESIGN_UPDATE_TITLE_ERROR: {
|
|
5487
|
-
code: "A574",
|
|
5488
|
-
message: "Произошла ошибка при обновлении названия чата",
|
|
5489
|
-
httpCode: 500,
|
|
5490
|
-
},
|
|
5491
|
-
INTERIOR_DESIGN_JOB_DELETE_ERROR: {
|
|
5492
|
-
code: "A575",
|
|
5493
|
-
message: "Произошла ошибка при удалении сообщения",
|
|
5494
|
-
httpCode: 500,
|
|
5495
|
-
},
|
|
5496
|
-
INTERIOR_DESIGN_RETRY_REQUEST_ERROR: {
|
|
5497
|
-
code: "A576",
|
|
5498
|
-
message:
|
|
5499
|
-
"Произошла ошибка при повторном запросе на редактирование дизайна интерьера",
|
|
5500
|
-
httpCode: 500,
|
|
5501
|
-
},
|
|
5502
|
-
INTERIOR_DESIGN_MODEL_NOT_AVAILABLE: {
|
|
5503
|
-
code: "A577",
|
|
5504
|
-
message: "Данная модель для редактирования дизайна интерьера недоступна",
|
|
5505
|
-
httpCode: 401,
|
|
5506
|
-
},
|
|
5507
|
-
INTERIOR_DESIGN_MODEL_INACTIVE: {
|
|
5508
|
-
code: "A578",
|
|
5509
|
-
message:
|
|
5510
|
-
"Модель редактирования дизайна интерьера архивирована и недоступна для пользования",
|
|
5511
|
-
httpCode: 403,
|
|
5512
|
-
},
|
|
5513
|
-
INTERIOR_DESIGN_MODEL_FIND_ERROR: {
|
|
5514
|
-
code: "A579",
|
|
5515
|
-
message:
|
|
5516
|
-
"Произошла ошибка при получении модели для редактирования дизайна интерьера",
|
|
5517
|
-
httpCode: 500,
|
|
5518
|
-
},
|
|
5519
|
-
INTERIOR_DESIGN_PRICE_ERROR: {
|
|
5520
|
-
code: "A580",
|
|
5521
|
-
message:
|
|
5522
|
-
"Произошла ошибка при получении цены для редактирования дизайна интерьера",
|
|
5523
|
-
httpCode: 500,
|
|
5524
|
-
},
|
|
5525
5539
|
WATERMARK: {
|
|
5526
5540
|
APPLY_ERROR: {
|
|
5527
5541
|
code: "WATERMARK.APPLY_ERROR",
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@purpleschool/rugpt-lib-common",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.69",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
+
"check:errors": "node scripts/check-errors-structure.js",
|
|
8
9
|
"prepublish": "rm -rf build && tsc",
|
|
9
10
|
"build": "tsc"
|
|
10
11
|
},
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
const { execFileSync } = require("child_process");
|
|
4
|
+
const ts = require("typescript");
|
|
5
|
+
|
|
6
|
+
const repoRoot = path.resolve(__dirname, "..");
|
|
7
|
+
const errorsPath = path.join(repoRoot, "errors", "errors.ts");
|
|
8
|
+
const relativeErrorsPath = "errors/errors.ts";
|
|
9
|
+
const useStaged = process.argv.includes("--staged");
|
|
10
|
+
|
|
11
|
+
function hasStagedErrorsFile() {
|
|
12
|
+
try {
|
|
13
|
+
const stagedFiles = execFileSync(
|
|
14
|
+
"git",
|
|
15
|
+
["diff", "--cached", "--name-only", "--diff-filter=ACMR", "--", relativeErrorsPath],
|
|
16
|
+
{ cwd: repoRoot, encoding: "utf8" }
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
return stagedFiles
|
|
20
|
+
.split(/\r?\n/)
|
|
21
|
+
.map((file) => file.trim())
|
|
22
|
+
.includes(relativeErrorsPath);
|
|
23
|
+
} catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function readErrorsSource() {
|
|
29
|
+
if (useStaged) {
|
|
30
|
+
if (!hasStagedErrorsFile()) {
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return execFileSync("git", ["show", `:${relativeErrorsPath}`], {
|
|
35
|
+
cwd: repoRoot,
|
|
36
|
+
encoding: "utf8",
|
|
37
|
+
maxBuffer: 20 * 1024 * 1024,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return fs.readFileSync(errorsPath, "utf8");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function getPropertyName(name) {
|
|
45
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
|
|
46
|
+
return name.text;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return name.getText();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function getObjectPropertyNames(objectLiteral) {
|
|
53
|
+
return new Set(
|
|
54
|
+
objectLiteral.properties
|
|
55
|
+
.filter(ts.isPropertyAssignment)
|
|
56
|
+
.map((property) => getPropertyName(property.name))
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function isErrorObject(objectLiteral) {
|
|
61
|
+
const propertyNames = getObjectPropertyNames(objectLiteral);
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
propertyNames.has("code") &&
|
|
65
|
+
propertyNames.has("message") &&
|
|
66
|
+
propertyNames.has("httpCode")
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function findErrorsObject(sourceFile) {
|
|
71
|
+
let errorsObject = null;
|
|
72
|
+
|
|
73
|
+
function visit(node) {
|
|
74
|
+
if (
|
|
75
|
+
ts.isVariableDeclaration(node) &&
|
|
76
|
+
ts.isIdentifier(node.name) &&
|
|
77
|
+
node.name.text === "ERRORS" &&
|
|
78
|
+
node.initializer &&
|
|
79
|
+
ts.isObjectLiteralExpression(node.initializer)
|
|
80
|
+
) {
|
|
81
|
+
errorsObject = node.initializer;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
ts.forEachChild(node, visit);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
visit(sourceFile);
|
|
89
|
+
return errorsObject;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const sourceText = readErrorsSource();
|
|
93
|
+
const sourceFile = ts.createSourceFile(
|
|
94
|
+
relativeErrorsPath,
|
|
95
|
+
sourceText,
|
|
96
|
+
ts.ScriptTarget.Latest,
|
|
97
|
+
true,
|
|
98
|
+
ts.ScriptKind.TS
|
|
99
|
+
);
|
|
100
|
+
const errorsObject = findErrorsObject(sourceFile);
|
|
101
|
+
|
|
102
|
+
if (!errorsObject) {
|
|
103
|
+
console.error("Cannot find top-level ERRORS object in errors/errors.ts");
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const topLevelErrors = errorsObject.properties
|
|
108
|
+
.filter(ts.isPropertyAssignment)
|
|
109
|
+
.filter((property) => ts.isObjectLiteralExpression(property.initializer))
|
|
110
|
+
.filter((property) => isErrorObject(property.initializer))
|
|
111
|
+
.map((property) => {
|
|
112
|
+
const position = sourceFile.getLineAndCharacterOfPosition(property.name.getStart(sourceFile));
|
|
113
|
+
const name = getPropertyName(property.name);
|
|
114
|
+
const codeProperty = property.initializer.properties.find(
|
|
115
|
+
(nestedProperty) =>
|
|
116
|
+
ts.isPropertyAssignment(nestedProperty) &&
|
|
117
|
+
getPropertyName(nestedProperty.name) === "code"
|
|
118
|
+
);
|
|
119
|
+
const code =
|
|
120
|
+
codeProperty &&
|
|
121
|
+
ts.isPropertyAssignment(codeProperty) &&
|
|
122
|
+
ts.isStringLiteralLike(codeProperty.initializer)
|
|
123
|
+
? codeProperty.initializer.text
|
|
124
|
+
: null;
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
name,
|
|
128
|
+
code,
|
|
129
|
+
line: position.line + 1,
|
|
130
|
+
character: position.character + 1,
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
if (topLevelErrors.length > 0) {
|
|
135
|
+
console.error("Top-level errors are not allowed in errors/errors.ts.");
|
|
136
|
+
console.error("Put every error object inside a group, for example ERRORS.SPELL_CORRECTOR_JOB.NOT_FOUND.");
|
|
137
|
+
console.error("");
|
|
138
|
+
|
|
139
|
+
for (const error of topLevelErrors) {
|
|
140
|
+
const codeSuffix = error.code ? `, code: ${error.code}` : "";
|
|
141
|
+
console.error(
|
|
142
|
+
`- ${relativeErrorsPath}:${error.line}:${error.character} ${error.name}${codeSuffix}`
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
console.log("errors/errors.ts structure is valid.");
|