@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.
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ npm run check:errors -- --staged
@@ -63,7 +63,7 @@ jobs:
63
63
  🕐 Commit timestamp: **${{ github.event.head_commit.timestamp }}**
64
64
 
65
65
  🔗 **Links:**
66
- <a href='${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'>View CI/CD Run</a>
66
+ [View CI/CD Run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})
67
67
  secrets: inherit
68
68
 
69
69
  publish:
@@ -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.67",
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.");