@coopenomics/extension-kit 2026.9.16-1 → 2026.9.18

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/dist/index.cjs CHANGED
@@ -4,6 +4,7 @@ const common = require('@nestjs/common');
4
4
  const graphql = require('@nestjs/graphql');
5
5
  const core = require('@nestjs/core');
6
6
  const passport = require('@nestjs/passport');
7
+ const node_crypto = require('node:crypto');
7
8
  const zod = require('zod');
8
9
  const classValidator = require('class-validator');
9
10
  const classTransformer = require('class-transformer');
@@ -14,6 +15,7 @@ const moment = require('moment');
14
15
  const moment$1 = require('moment-timezone');
15
16
  require('moment/locale/ru');
16
17
  const crypto = require('crypto');
18
+ const cooptypes = require('cooptypes');
17
19
 
18
20
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
19
21
 
@@ -21,10 +23,17 @@ const moment__default = /*#__PURE__*/_interopDefaultCompat(moment);
21
23
  const moment__default$1 = /*#__PURE__*/_interopDefaultCompat(moment$1);
22
24
  const crypto__default = /*#__PURE__*/_interopDefaultCompat(crypto);
23
25
 
26
+ const ROLES_DENY_SELF_KEY = "roles_deny_self";
27
+ const ROLES_ANY_STATUS_KEY = "roles_any_status";
24
28
  function AuthRoles(roles, options = {}) {
25
29
  const self = options.self ?? [];
26
30
  const args = self.length ? `roles: ${JSON.stringify(roles)}, self: ${JSON.stringify(self)}` : `roles: ${JSON.stringify(roles)}`;
27
- return common.applyDecorators(common.SetMetadata("roles", roles), graphql.Directive(`@auth(${args})`));
31
+ const decorators = [common.SetMetadata("roles", roles), graphql.Directive(`@auth(${args})`)];
32
+ if (options.allowSelf === false)
33
+ decorators.push(common.SetMetadata(ROLES_DENY_SELF_KEY, true));
34
+ if (options.anyStatus === true)
35
+ decorators.push(common.SetMetadata(ROLES_ANY_STATUS_KEY, true));
36
+ return common.applyDecorators(...decorators);
28
37
  }
29
38
  const CurrentUser = common.createParamDecorator((data, context) => {
30
39
  const ctx = graphql.GqlExecutionContext.create(context);
@@ -48,7 +57,12 @@ function configureExtensionAuth(options) {
48
57
  function hasServerSecret(headers) {
49
58
  if (!serverSecret)
50
59
  return false;
51
- return headers?.["server-secret"] === serverSecret;
60
+ const provided = headers?.["server-secret"];
61
+ if (typeof provided !== "string")
62
+ return false;
63
+ const a = Buffer.from(provided);
64
+ const b = Buffer.from(serverSecret);
65
+ return a.length === b.length && node_crypto.timingSafeEqual(a, b);
52
66
  }
53
67
 
54
68
  var __defProp$g = Object.defineProperty;
@@ -63,6 +77,8 @@ var __decorateClass$g = (decorators, target, key, kind) => {
63
77
  return result;
64
78
  };
65
79
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
80
+ const ACTIVE_USER_STATUS = "active";
81
+ const PARTICIPANT_ROLE = "user";
66
82
  exports.GqlJwtAuthGuard = class GqlJwtAuthGuard extends passport.AuthGuard("jwt") {
67
83
  getRequest(context) {
68
84
  const ctx = graphql.GqlExecutionContext.create(context);
@@ -149,10 +165,15 @@ exports.RolesGuard = class RolesGuard {
149
165
  const args = ctx.getArgs();
150
166
  const data = args.data;
151
167
  const filter = args.filter;
152
- if (data && data.username && user.username === data.username || filter && filter.username && user.username === filter.username || args.username && user.username === args.username) {
168
+ const denySelf = this.reflector.get(ROLES_DENY_SELF_KEY, context.getHandler()) === true;
169
+ if (!denySelf && (data && data.username && user.username === data.username || filter && filter.username && user.username === filter.username || args.username && user.username === args.username)) {
153
170
  return true;
154
171
  }
155
172
  if (allowedRoles.includes(user.role)) {
173
+ const anyStatus = this.reflector.get(ROLES_ANY_STATUS_KEY, context.getHandler()) === true;
174
+ if (user.role === PARTICIPANT_ROLE && !anyStatus && user.status !== ACTIVE_USER_STATUS) {
175
+ throw new common.ForbiddenException("\u0414\u043E\u0441\u0442\u0443\u043F \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043F\u0430\u0439\u0449\u0438\u043A\u043E\u0432 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430");
176
+ }
156
177
  return true;
157
178
  }
158
179
  throw new common.UnauthorizedException(`\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430`);
@@ -162,7 +183,6 @@ exports.RolesGuard = __decorateClass$g([
162
183
  common.Injectable(),
163
184
  __decorateParam(0, common.Inject(core.Reflector))
164
185
  ], exports.RolesGuard);
165
- const ACTIVE_USER_STATUS = "active";
166
186
  exports.ActiveUserStatusGuard = class ActiveUserStatusGuard {
167
187
  canActivate(context) {
168
188
  const ctx = graphql.GqlExecutionContext.create(context);
@@ -1894,6 +1914,12 @@ function generateHashFromString(input) {
1894
1914
  return crypto__default.createHash("sha256").update(input).digest("hex");
1895
1915
  }
1896
1916
 
1917
+ function sanitizeUserText(value) {
1918
+ if (typeof value !== "string" || !value)
1919
+ return value;
1920
+ return cooptypes._Common.Text.sanitizeEditorMarkdown(value);
1921
+ }
1922
+
1897
1923
  function rethrowChainError(error) {
1898
1924
  const raw = error?.message ?? String(error);
1899
1925
  const match = raw.match(/assertion failure with message: (.+?)(?:\n|$)/);
@@ -1929,6 +1955,8 @@ exports.OptionalCurrentUser = OptionalCurrentUser;
1929
1955
  exports.PaginationResult = PaginationResult;
1930
1956
  exports.PaginationUtils = PaginationUtils;
1931
1957
  exports.QuantityUtils = QuantityUtils;
1958
+ exports.ROLES_ANY_STATUS_KEY = ROLES_ANY_STATUS_KEY;
1959
+ exports.ROLES_DENY_SELF_KEY = ROLES_DENY_SELF_KEY;
1932
1960
  exports.UseBucket = UseBucket;
1933
1961
  exports.bucketProvidersFor = bucketProvidersFor;
1934
1962
  exports.bucketTokenFor = bucketTokenFor;
@@ -1955,5 +1983,6 @@ exports.redactSecretConfig = redactSecretConfig;
1955
1983
  exports.registerExtensionEntities = registerExtensionEntities;
1956
1984
  exports.resetExtensionEntities = resetExtensionEntities;
1957
1985
  exports.rethrowChainError = rethrowChainError;
1986
+ exports.sanitizeUserText = sanitizeUserText;
1958
1987
  exports.verifySignedDocumentAgainstStoredDraft = verifySignedDocumentAgainstStoredDraft;
1959
1988
  exports.waitAfterTransactBeforeChainTableRead = waitAfterTransactBeforeChainTableRead;
package/dist/index.d.cts CHANGED
@@ -16,7 +16,28 @@ import { Cooperative } from 'cooptypes';
16
16
  */
17
17
  interface AuthRolesOptions {
18
18
  self?: string[];
19
+ /**
20
+ * Пускает ли `RolesGuard` пайщика без нужной роли, когда `username` в
21
+ * аргументах — он сам. По умолчанию да: так пайщик читает свои записи и
22
+ * подаёт свои заявления. Для полномочий совета, где `username` — адресат
23
+ * действия (подтвердить соглашение, внести данные, импортировать вклад),
24
+ * ставится `false`: иначе пайщик выполнил бы его над собой.
25
+ */
26
+ allowSelf?: boolean;
27
+ /**
28
+ * Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
29
+ * исключил). По умолчанию нет: `user` в списке ролей означает «принятый
30
+ * пайщик», и учётная запись со статусом вступления по роли не проходит —
31
+ * иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
32
+ * `true` — для того, что нужно и кандидату: входящие уведомления о ходе
33
+ * его же заявления.
34
+ */
35
+ anyStatus?: boolean;
19
36
  }
37
+ /** Ключ метаданных: самообход `RolesGuard` запрещён. */
38
+ declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
39
+ /** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
40
+ declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
20
41
  /**
21
42
  * Ограничение доступа к резолверу или к отдельному полю объекта.
22
43
  *
@@ -87,8 +108,14 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
87
108
  * 1. Валидный `server-secret` — доступ разрешён.
88
109
  * 2. Роли не заданы — доступ открыт.
89
110
  * 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
90
- * либо плоским аргументом совпадает с `user.username`) — разрешено.
91
- * 4. У пользователя есть одна из разрешённых ролей — разрешено.
111
+ * либо плоским аргументом совпадает с `user.username`) — разрешено, если
112
+ * операция не объявила `AuthRoles(..., { allowSelf: false })`.
113
+ * 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
114
+ * при этом означает принятого пайщика: учётная запись в статусе вступления
115
+ * или исключения по ней не проходит (если операция не объявила
116
+ * `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
117
+ * любом статусе: членов совета, заведённых при установке, цепь в
118
+ * `active` не переводит.
92
119
  * 5. Иначе — отказ.
93
120
  */
94
121
  declare class RolesGuard implements CanActivate {
@@ -822,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
822
849
  * Необязательное поле.
823
850
  */
824
851
  maxRows?: number;
852
+ /**
853
+ * Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
854
+ * растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
855
+ * что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
856
+ * Необязательное поле.
857
+ */
858
+ minRows?: number;
859
+ /**
860
+ * Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
861
+ * поле не выглядело пустым. Исчезает, как только человек начинает ввод.
862
+ * Необязательное поле.
863
+ */
864
+ placeholder?: string;
825
865
  /**
826
866
  * Добавляет текст после значения поля в интерфейсе (например, символ валюты).
827
867
  * Необязательное поле.
@@ -1494,6 +1534,21 @@ declare class CurrencyValidationUtil {
1494
1534
  static formatAmount(value: number, precision?: number): string;
1495
1535
  }
1496
1536
 
1537
+ /**
1538
+ * Очистка текста, который человек пишет в редакторе: описание проекта или
1539
+ * задачи, приглашение, краткое содержание звонка.
1540
+ *
1541
+ * Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
1542
+ * удобная точка вызова для расширений и обработка пустых значений. До
1543
+ * 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
1544
+ * клал в базу произвольную разметку, а она потом попадала в собираемые
1545
+ * документы.
1546
+ *
1547
+ * Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
1548
+ * схемами BPMN — убирается только исполняемое.
1549
+ */
1550
+ declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
1551
+
1497
1552
  /**
1498
1553
  * Ошибка API с кодом состояния HTTP.
1499
1554
  *
@@ -1520,5 +1575,5 @@ declare class HttpApiError extends HttpException {
1520
1575
  */
1521
1576
  declare function rethrowChainError(error: unknown): never;
1522
1577
 
1523
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1578
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1524
1579
  export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
package/dist/index.d.mts CHANGED
@@ -16,7 +16,28 @@ import { Cooperative } from 'cooptypes';
16
16
  */
17
17
  interface AuthRolesOptions {
18
18
  self?: string[];
19
+ /**
20
+ * Пускает ли `RolesGuard` пайщика без нужной роли, когда `username` в
21
+ * аргументах — он сам. По умолчанию да: так пайщик читает свои записи и
22
+ * подаёт свои заявления. Для полномочий совета, где `username` — адресат
23
+ * действия (подтвердить соглашение, внести данные, импортировать вклад),
24
+ * ставится `false`: иначе пайщик выполнил бы его над собой.
25
+ */
26
+ allowSelf?: boolean;
27
+ /**
28
+ * Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
29
+ * исключил). По умолчанию нет: `user` в списке ролей означает «принятый
30
+ * пайщик», и учётная запись со статусом вступления по роли не проходит —
31
+ * иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
32
+ * `true` — для того, что нужно и кандидату: входящие уведомления о ходе
33
+ * его же заявления.
34
+ */
35
+ anyStatus?: boolean;
19
36
  }
37
+ /** Ключ метаданных: самообход `RolesGuard` запрещён. */
38
+ declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
39
+ /** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
40
+ declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
20
41
  /**
21
42
  * Ограничение доступа к резолверу или к отдельному полю объекта.
22
43
  *
@@ -87,8 +108,14 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
87
108
  * 1. Валидный `server-secret` — доступ разрешён.
88
109
  * 2. Роли не заданы — доступ открыт.
89
110
  * 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
90
- * либо плоским аргументом совпадает с `user.username`) — разрешено.
91
- * 4. У пользователя есть одна из разрешённых ролей — разрешено.
111
+ * либо плоским аргументом совпадает с `user.username`) — разрешено, если
112
+ * операция не объявила `AuthRoles(..., { allowSelf: false })`.
113
+ * 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
114
+ * при этом означает принятого пайщика: учётная запись в статусе вступления
115
+ * или исключения по ней не проходит (если операция не объявила
116
+ * `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
117
+ * любом статусе: членов совета, заведённых при установке, цепь в
118
+ * `active` не переводит.
92
119
  * 5. Иначе — отказ.
93
120
  */
94
121
  declare class RolesGuard implements CanActivate {
@@ -822,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
822
849
  * Необязательное поле.
823
850
  */
824
851
  maxRows?: number;
852
+ /**
853
+ * Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
854
+ * растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
855
+ * что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
856
+ * Необязательное поле.
857
+ */
858
+ minRows?: number;
859
+ /**
860
+ * Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
861
+ * поле не выглядело пустым. Исчезает, как только человек начинает ввод.
862
+ * Необязательное поле.
863
+ */
864
+ placeholder?: string;
825
865
  /**
826
866
  * Добавляет текст после значения поля в интерфейсе (например, символ валюты).
827
867
  * Необязательное поле.
@@ -1494,6 +1534,21 @@ declare class CurrencyValidationUtil {
1494
1534
  static formatAmount(value: number, precision?: number): string;
1495
1535
  }
1496
1536
 
1537
+ /**
1538
+ * Очистка текста, который человек пишет в редакторе: описание проекта или
1539
+ * задачи, приглашение, краткое содержание звонка.
1540
+ *
1541
+ * Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
1542
+ * удобная точка вызова для расширений и обработка пустых значений. До
1543
+ * 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
1544
+ * клал в базу произвольную разметку, а она потом попадала в собираемые
1545
+ * документы.
1546
+ *
1547
+ * Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
1548
+ * схемами BPMN — убирается только исполняемое.
1549
+ */
1550
+ declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
1551
+
1497
1552
  /**
1498
1553
  * Ошибка API с кодом состояния HTTP.
1499
1554
  *
@@ -1520,5 +1575,5 @@ declare class HttpApiError extends HttpException {
1520
1575
  */
1521
1576
  declare function rethrowChainError(error: unknown): never;
1522
1577
 
1523
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1578
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1524
1579
  export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
package/dist/index.d.ts CHANGED
@@ -16,7 +16,28 @@ import { Cooperative } from 'cooptypes';
16
16
  */
17
17
  interface AuthRolesOptions {
18
18
  self?: string[];
19
+ /**
20
+ * Пускает ли `RolesGuard` пайщика без нужной роли, когда `username` в
21
+ * аргументах — он сам. По умолчанию да: так пайщик читает свои записи и
22
+ * подаёт свои заявления. Для полномочий совета, где `username` — адресат
23
+ * действия (подтвердить соглашение, внести данные, импортировать вклад),
24
+ * ставится `false`: иначе пайщик выполнил бы его над собой.
25
+ */
26
+ allowSelf?: boolean;
27
+ /**
28
+ * Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
29
+ * исключил). По умолчанию нет: `user` в списке ролей означает «принятый
30
+ * пайщик», и учётная запись со статусом вступления по роли не проходит —
31
+ * иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
32
+ * `true` — для того, что нужно и кандидату: входящие уведомления о ходе
33
+ * его же заявления.
34
+ */
35
+ anyStatus?: boolean;
19
36
  }
37
+ /** Ключ метаданных: самообход `RolesGuard` запрещён. */
38
+ declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
39
+ /** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
40
+ declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
20
41
  /**
21
42
  * Ограничение доступа к резолверу или к отдельному полю объекта.
22
43
  *
@@ -87,8 +108,14 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
87
108
  * 1. Валидный `server-secret` — доступ разрешён.
88
109
  * 2. Роли не заданы — доступ открыт.
89
110
  * 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
90
- * либо плоским аргументом совпадает с `user.username`) — разрешено.
91
- * 4. У пользователя есть одна из разрешённых ролей — разрешено.
111
+ * либо плоским аргументом совпадает с `user.username`) — разрешено, если
112
+ * операция не объявила `AuthRoles(..., { allowSelf: false })`.
113
+ * 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
114
+ * при этом означает принятого пайщика: учётная запись в статусе вступления
115
+ * или исключения по ней не проходит (если операция не объявила
116
+ * `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
117
+ * любом статусе: членов совета, заведённых при установке, цепь в
118
+ * `active` не переводит.
92
119
  * 5. Иначе — отказ.
93
120
  */
94
121
  declare class RolesGuard implements CanActivate {
@@ -822,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
822
849
  * Необязательное поле.
823
850
  */
824
851
  maxRows?: number;
852
+ /**
853
+ * Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
854
+ * растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
855
+ * что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
856
+ * Необязательное поле.
857
+ */
858
+ minRows?: number;
859
+ /**
860
+ * Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
861
+ * поле не выглядело пустым. Исчезает, как только человек начинает ввод.
862
+ * Необязательное поле.
863
+ */
864
+ placeholder?: string;
825
865
  /**
826
866
  * Добавляет текст после значения поля в интерфейсе (например, символ валюты).
827
867
  * Необязательное поле.
@@ -1494,6 +1534,21 @@ declare class CurrencyValidationUtil {
1494
1534
  static formatAmount(value: number, precision?: number): string;
1495
1535
  }
1496
1536
 
1537
+ /**
1538
+ * Очистка текста, который человек пишет в редакторе: описание проекта или
1539
+ * задачи, приглашение, краткое содержание звонка.
1540
+ *
1541
+ * Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
1542
+ * удобная точка вызова для расширений и обработка пустых значений. До
1543
+ * 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
1544
+ * клал в базу произвольную разметку, а она потом попадала в собираемые
1545
+ * документы.
1546
+ *
1547
+ * Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
1548
+ * схемами BPMN — убирается только исполняемое.
1549
+ */
1550
+ declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
1551
+
1497
1552
  /**
1498
1553
  * Ошибка API с кодом состояния HTTP.
1499
1554
  *
@@ -1520,5 +1575,5 @@ declare class HttpApiError extends HttpException {
1520
1575
  */
1521
1576
  declare function rethrowChainError(error: unknown): never;
1522
1577
 
1523
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1578
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1524
1579
  export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
package/dist/index.mjs CHANGED
@@ -1,7 +1,8 @@
1
- import { createParamDecorator, UnauthorizedException, applyDecorators, SetMetadata, Injectable, Inject, ForbiddenException, HttpException, HttpStatus, BadRequestException } from '@nestjs/common';
1
+ import { createParamDecorator, UnauthorizedException, SetMetadata, applyDecorators, Injectable, Inject, ForbiddenException, HttpException, HttpStatus, BadRequestException } from '@nestjs/common';
2
2
  import { GqlExecutionContext, Directive, Field, InputType, registerEnumType, Int, IntersectionType, OmitType, ObjectType } from '@nestjs/graphql';
3
3
  import { Reflector } from '@nestjs/core';
4
4
  import { AuthGuard } from '@nestjs/passport';
5
+ import { timingSafeEqual } from 'node:crypto';
5
6
  import { z } from 'zod';
6
7
  import { IsNumber, IsString, IsArray, ArrayMinSize, ValidateNested, IsEnum, IsInt, IsOptional, Matches, IsNotEmpty, IsObject } from 'class-validator';
7
8
  import { Type } from 'class-transformer';
@@ -12,11 +13,19 @@ import moment from 'moment';
12
13
  import moment$1 from 'moment-timezone';
13
14
  import 'moment/locale/ru';
14
15
  import crypto from 'crypto';
16
+ import { _Common } from 'cooptypes';
15
17
 
18
+ const ROLES_DENY_SELF_KEY = "roles_deny_self";
19
+ const ROLES_ANY_STATUS_KEY = "roles_any_status";
16
20
  function AuthRoles(roles, options = {}) {
17
21
  const self = options.self ?? [];
18
22
  const args = self.length ? `roles: ${JSON.stringify(roles)}, self: ${JSON.stringify(self)}` : `roles: ${JSON.stringify(roles)}`;
19
- return applyDecorators(SetMetadata("roles", roles), Directive(`@auth(${args})`));
23
+ const decorators = [SetMetadata("roles", roles), Directive(`@auth(${args})`)];
24
+ if (options.allowSelf === false)
25
+ decorators.push(SetMetadata(ROLES_DENY_SELF_KEY, true));
26
+ if (options.anyStatus === true)
27
+ decorators.push(SetMetadata(ROLES_ANY_STATUS_KEY, true));
28
+ return applyDecorators(...decorators);
20
29
  }
21
30
  const CurrentUser = createParamDecorator((data, context) => {
22
31
  const ctx = GqlExecutionContext.create(context);
@@ -40,7 +49,12 @@ function configureExtensionAuth(options) {
40
49
  function hasServerSecret(headers) {
41
50
  if (!serverSecret)
42
51
  return false;
43
- return headers?.["server-secret"] === serverSecret;
52
+ const provided = headers?.["server-secret"];
53
+ if (typeof provided !== "string")
54
+ return false;
55
+ const a = Buffer.from(provided);
56
+ const b = Buffer.from(serverSecret);
57
+ return a.length === b.length && timingSafeEqual(a, b);
44
58
  }
45
59
 
46
60
  var __defProp$g = Object.defineProperty;
@@ -55,6 +69,8 @@ var __decorateClass$g = (decorators, target, key, kind) => {
55
69
  return result;
56
70
  };
57
71
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
72
+ const ACTIVE_USER_STATUS = "active";
73
+ const PARTICIPANT_ROLE = "user";
58
74
  let GqlJwtAuthGuard = class extends AuthGuard("jwt") {
59
75
  getRequest(context) {
60
76
  const ctx = GqlExecutionContext.create(context);
@@ -141,10 +157,15 @@ let RolesGuard = class {
141
157
  const args = ctx.getArgs();
142
158
  const data = args.data;
143
159
  const filter = args.filter;
144
- if (data && data.username && user.username === data.username || filter && filter.username && user.username === filter.username || args.username && user.username === args.username) {
160
+ const denySelf = this.reflector.get(ROLES_DENY_SELF_KEY, context.getHandler()) === true;
161
+ if (!denySelf && (data && data.username && user.username === data.username || filter && filter.username && user.username === filter.username || args.username && user.username === args.username)) {
145
162
  return true;
146
163
  }
147
164
  if (allowedRoles.includes(user.role)) {
165
+ const anyStatus = this.reflector.get(ROLES_ANY_STATUS_KEY, context.getHandler()) === true;
166
+ if (user.role === PARTICIPANT_ROLE && !anyStatus && user.status !== ACTIVE_USER_STATUS) {
167
+ throw new ForbiddenException("\u0414\u043E\u0441\u0442\u0443\u043F \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043F\u0430\u0439\u0449\u0438\u043A\u043E\u0432 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430");
168
+ }
148
169
  return true;
149
170
  }
150
171
  throw new UnauthorizedException(`\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430`);
@@ -154,7 +175,6 @@ RolesGuard = __decorateClass$g([
154
175
  Injectable(),
155
176
  __decorateParam(0, Inject(Reflector))
156
177
  ], RolesGuard);
157
- const ACTIVE_USER_STATUS = "active";
158
178
  let ActiveUserStatusGuard = class {
159
179
  canActivate(context) {
160
180
  const ctx = GqlExecutionContext.create(context);
@@ -1886,6 +1906,12 @@ function generateHashFromString(input) {
1886
1906
  return crypto.createHash("sha256").update(input).digest("hex");
1887
1907
  }
1888
1908
 
1909
+ function sanitizeUserText(value) {
1910
+ if (typeof value !== "string" || !value)
1911
+ return value;
1912
+ return _Common.Text.sanitizeEditorMarkdown(value);
1913
+ }
1914
+
1889
1915
  function rethrowChainError(error) {
1890
1916
  const raw = error?.message ?? String(error);
1891
1917
  const match = raw.match(/assertion failure with message: (.+?)(?:\n|$)/);
@@ -1893,4 +1919,4 @@ function rethrowChainError(error) {
1893
1919
  throw new BadRequestException(clean);
1894
1920
  }
1895
1921
 
1896
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1922
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@coopenomics/extension-kit",
3
3
  "type": "module",
4
- "version": "2026.9.16-1",
4
+ "version": "2026.9.18",
5
5
  "description": "Служебный каркас расширения цифрового кооператива: базовый модуль, сущности и репозитории расширения, авторизация, каркас блокчейн-синхронизации, контракт миграций схемы, контракт реестра",
6
6
  "author": "Alex Ant <dacom.dark.sun@gmail.com>",
7
7
  "license": "MIT",
@@ -38,7 +38,7 @@
38
38
  "typecheck": "tsc --noEmit"
39
39
  },
40
40
  "peerDependencies": {
41
- "@coopenomics/sdk": "2026.9.16-1",
41
+ "@coopenomics/sdk": "2026.9.18",
42
42
  "@nestjs/common": "^10.0.0",
43
43
  "@nestjs/core": "^10.0.0",
44
44
  "@nestjs/graphql": "^12.2.1",
@@ -68,7 +68,7 @@
68
68
  "@wharfkit/session": "^1.4.0",
69
69
  "class-transformer": "^0.5.1",
70
70
  "class-validator": "^0.14.1",
71
- "cooptypes": "2026.9.16-1",
71
+ "cooptypes": "2026.9.18",
72
72
  "graphql": "^16.9.0",
73
73
  "graphql-type-json": "^0.3.2",
74
74
  "moment": "^2.30.1",
@@ -80,5 +80,5 @@
80
80
  "unbuild": "^2.0.0",
81
81
  "zod": "^3.0.0"
82
82
  },
83
- "gitHead": "ae6ac2b74cd63dce6e77ec5763defd5fc24d7af3"
83
+ "gitHead": "0f980a64f09af16c6ac217e5467be87a2d0ab634"
84
84
  }