@aopslab/domain-kit-docman 0.1.4

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 (64) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +6 -0
  3. package/README.md +79 -0
  4. package/dist/config/config.d.ts +55 -0
  5. package/dist/config/config.js +176 -0
  6. package/dist/domain-services/index.d.ts +7 -0
  7. package/dist/domain-services/index.js +7 -0
  8. package/dist/domain-services/jwt.d.ts +1 -0
  9. package/dist/domain-services/jwt.js +5 -0
  10. package/dist/domain-services/metrics.d.ts +5 -0
  11. package/dist/domain-services/metrics.js +7 -0
  12. package/dist/domain-services/presets.d.ts +3 -0
  13. package/dist/domain-services/presets.js +4 -0
  14. package/dist/domain-services/provider.d.ts +2 -0
  15. package/dist/domain-services/provider.js +564 -0
  16. package/dist/domain-services/resilience.d.ts +6 -0
  17. package/dist/domain-services/resilience.js +19 -0
  18. package/dist/domain-services/types.d.ts +179 -0
  19. package/dist/domain-services/types.js +1 -0
  20. package/dist/domain-services/unified.d.ts +272 -0
  21. package/dist/domain-services/unified.js +210 -0
  22. package/dist/errors/error.map.d.ts +21 -0
  23. package/dist/errors/error.map.js +47 -0
  24. package/dist/errors/friendly.d.ts +31 -0
  25. package/dist/errors/friendly.js +407 -0
  26. package/dist/errors/i18n.d.ts +4 -0
  27. package/dist/errors/i18n.js +10 -0
  28. package/dist/errors/index.d.ts +3 -0
  29. package/dist/errors/index.js +3 -0
  30. package/dist/index.d.ts +9 -0
  31. package/dist/index.js +7 -0
  32. package/dist/operations/catalog.d.ts +11 -0
  33. package/dist/operations/catalog.js +299 -0
  34. package/dist/operations/contract.d.ts +31 -0
  35. package/dist/operations/contract.js +667 -0
  36. package/dist/operations/dcm.d.ts +58 -0
  37. package/dist/operations/dcm.js +168 -0
  38. package/dist/operations/definition.d.ts +6 -0
  39. package/dist/operations/definition.js +140 -0
  40. package/dist/operations/executor.d.ts +10 -0
  41. package/dist/operations/executor.js +269 -0
  42. package/dist/operations/host-projection.d.ts +11 -0
  43. package/dist/operations/host-projection.js +156 -0
  44. package/dist/operations/index.d.ts +10 -0
  45. package/dist/operations/index.js +10 -0
  46. package/dist/operations/io-types.d.ts +125 -0
  47. package/dist/operations/io-types.js +1 -0
  48. package/dist/operations/schemas.d.ts +10 -0
  49. package/dist/operations/schemas.js +872 -0
  50. package/dist/operations/scope-owned-create.d.ts +3 -0
  51. package/dist/operations/scope-owned-create.js +12 -0
  52. package/dist/operations/tool-input.d.ts +11 -0
  53. package/dist/operations/tool-input.js +357 -0
  54. package/dist/operations/types.d.ts +37 -0
  55. package/dist/operations/types.js +1 -0
  56. package/dist/resources/index.d.ts +1 -0
  57. package/dist/resources/index.js +1 -0
  58. package/dist/resources/resources.docman.server.errors.d.ts +14 -0
  59. package/dist/resources/resources.docman.server.errors.js +36 -0
  60. package/dist/shared/index.d.ts +5 -0
  61. package/dist/shared/index.js +1 -0
  62. package/dist/shared/tool-input-guard.d.ts +1 -0
  63. package/dist/shared/tool-input-guard.js +1 -0
  64. package/package.json +69 -0
@@ -0,0 +1,210 @@
1
+ import { Effect } from 'effect';
2
+ import { cacheKeyFromLocale, CountersMetricsCollector, LoggerMetricsCollector, MultiMetricsCollector, parseEnvConfig, } from '@aopslab/xf-dm-kits';
3
+ import { createDocmanKitProvider } from './provider.js';
4
+ function inferRepositoryType(url) {
5
+ const normalized = url.trim().toLowerCase();
6
+ if (!normalized)
7
+ return 'mongo';
8
+ if (normalized.startsWith('postgres://') || normalized.startsWith('postgresql://'))
9
+ return 'drizzle';
10
+ if (normalized === ':memory:')
11
+ return 'drizzle';
12
+ if (normalized.startsWith('sqlite:') || normalized.startsWith('file:'))
13
+ return 'drizzle';
14
+ if (normalized.endsWith('.db') || normalized.endsWith('.sqlite') || normalized.endsWith('.sqlite3'))
15
+ return 'drizzle';
16
+ return 'mongo';
17
+ }
18
+ export function createDocmanKit(options) {
19
+ const provider = createDocmanKitProvider({
20
+ ...options,
21
+ getCacheKey: options.getCacheKey ?? ((ctx) => cacheKeyFromLocale(ctx.locale, ctx.fallbackLocale)),
22
+ });
23
+ return {
24
+ getStaticConfig() {
25
+ return options.staticConfig;
26
+ },
27
+ getDocumentService: provider.getDocumentService,
28
+ createDocumentService: provider.createDocumentService,
29
+ getDocumentGroupService: provider.getDocumentGroupService,
30
+ createDocumentGroupService: provider.createDocumentGroupService,
31
+ getDocumentVersionService: provider.getDocumentVersionService,
32
+ createDocumentVersionService: provider.createDocumentVersionService,
33
+ getSectionService: provider.getSectionService,
34
+ createSectionService: provider.createSectionService,
35
+ getPageService: provider.getPageService,
36
+ createPageService: provider.createPageService,
37
+ getPageVersionService: provider.getPageVersionService,
38
+ createPageVersionService: provider.createPageVersionService,
39
+ getDocumentSectionLinkService: provider.getDocumentSectionLinkService,
40
+ createDocumentSectionLinkService: provider.createDocumentSectionLinkService,
41
+ getSectionPageLinkService: provider.getSectionPageLinkService,
42
+ createSectionPageLinkService: provider.createSectionPageLinkService,
43
+ getSnippetService: provider.getSnippetService,
44
+ createSnippetService: provider.createSnippetService,
45
+ getPageSnippetLinkService: provider.getPageSnippetLinkService,
46
+ createPageSnippetLinkService: provider.createPageSnippetLinkService,
47
+ getAssetService: provider.getAssetService,
48
+ createAssetService: provider.createAssetService,
49
+ getAssetVersionService: provider.getAssetVersionService,
50
+ createAssetVersionService: provider.createAssetVersionService,
51
+ getEmbedService: provider.getEmbedService,
52
+ createEmbedService: provider.createEmbedService,
53
+ getPageEmbedLinkService: provider.getPageEmbedLinkService,
54
+ createPageEmbedLinkService: provider.createPageEmbedLinkService,
55
+ getDocumentRepository: provider.getDocumentRepository,
56
+ getDocumentGroupRepository: provider.getDocumentGroupRepository,
57
+ getDocumentVersionRepository: provider.getDocumentVersionRepository,
58
+ getSectionRepository: provider.getSectionRepository,
59
+ getPageRepository: provider.getPageRepository,
60
+ getPageVersionRepository: provider.getPageVersionRepository,
61
+ getDocumentIndexEntryRepository: provider.getDocumentIndexEntryRepository,
62
+ getDocumentSectionLinkRepository: provider.getDocumentSectionLinkRepository,
63
+ getSectionPageLinkRepository: provider.getSectionPageLinkRepository,
64
+ getSnippetRepository: provider.getSnippetRepository,
65
+ getPageSnippetLinkRepository: provider.getPageSnippetLinkRepository,
66
+ getAssetRepository: provider.getAssetRepository,
67
+ getAssetVersionRepository: provider.getAssetVersionRepository,
68
+ getEmbedRepository: provider.getEmbedRepository,
69
+ getPageEmbedLinkRepository: provider.getPageEmbedLinkRepository,
70
+ getAll: provider.getAll,
71
+ createAll: provider.createAll,
72
+ clearServiceCache: provider.clearServiceCache,
73
+ clearDocumentServiceCache: provider.clearDocumentServiceCache,
74
+ clearDocumentGroupServiceCache: provider.clearDocumentGroupServiceCache,
75
+ clearDocumentVersionServiceCache: provider.clearDocumentVersionServiceCache,
76
+ clearSectionServiceCache: provider.clearSectionServiceCache,
77
+ clearPageServiceCache: provider.clearPageServiceCache,
78
+ clearPageVersionServiceCache: provider.clearPageVersionServiceCache,
79
+ clearDocumentSectionLinkServiceCache: provider.clearDocumentSectionLinkServiceCache,
80
+ clearSectionPageLinkServiceCache: provider.clearSectionPageLinkServiceCache,
81
+ clearSnippetServiceCache: provider.clearSnippetServiceCache,
82
+ clearPageSnippetLinkServiceCache: provider.clearPageSnippetLinkServiceCache,
83
+ clearAssetServiceCache: provider.clearAssetServiceCache,
84
+ clearAssetVersionServiceCache: provider.clearAssetVersionServiceCache,
85
+ clearEmbedServiceCache: provider.clearEmbedServiceCache,
86
+ clearPageEmbedLinkServiceCache: provider.clearPageEmbedLinkServiceCache,
87
+ reset: provider.reset,
88
+ getRegistryStats: provider.getRegistryStats,
89
+ resolveLogger: provider.resolveLogger,
90
+ withContext(overrides) {
91
+ return {
92
+ getStaticConfig() {
93
+ return options.staticConfig;
94
+ },
95
+ getDocumentService: (o) => provider.getDocumentService({ ...overrides, ...o }),
96
+ getDocumentGroupService: (o) => provider.getDocumentGroupService({ ...overrides, ...o }),
97
+ getDocumentVersionService: (o) => provider.getDocumentVersionService({ ...overrides, ...o }),
98
+ getSectionService: (o) => provider.getSectionService({ ...overrides, ...o }),
99
+ getPageService: (o) => provider.getPageService({ ...overrides, ...o }),
100
+ getPageVersionService: (o) => provider.getPageVersionService({ ...overrides, ...o }),
101
+ getDocumentSectionLinkService: (o) => provider.getDocumentSectionLinkService({ ...overrides, ...o }),
102
+ getSectionPageLinkService: (o) => provider.getSectionPageLinkService({ ...overrides, ...o }),
103
+ getSnippetService: (o) => provider.getSnippetService({ ...overrides, ...o }),
104
+ getPageSnippetLinkService: (o) => provider.getPageSnippetLinkService({ ...overrides, ...o }),
105
+ getAssetService: (o) => provider.getAssetService({ ...overrides, ...o }),
106
+ getAssetVersionService: (o) => provider.getAssetVersionService({ ...overrides, ...o }),
107
+ getEmbedService: (o) => provider.getEmbedService({ ...overrides, ...o }),
108
+ getPageEmbedLinkService: (o) => provider.getPageEmbedLinkService({ ...overrides, ...o }),
109
+ getDocumentRepository: (o) => provider.getDocumentRepository({ ...overrides, ...o }),
110
+ getDocumentGroupRepository: (o) => provider.getDocumentGroupRepository({ ...overrides, ...o }),
111
+ getDocumentVersionRepository: (o) => provider.getDocumentVersionRepository({ ...overrides, ...o }),
112
+ getSectionRepository: (o) => provider.getSectionRepository({ ...overrides, ...o }),
113
+ getPageRepository: (o) => provider.getPageRepository({ ...overrides, ...o }),
114
+ getPageVersionRepository: (o) => provider.getPageVersionRepository({ ...overrides, ...o }),
115
+ getDocumentIndexEntryRepository: (o) => provider.getDocumentIndexEntryRepository({ ...overrides, ...o }),
116
+ getDocumentSectionLinkRepository: (o) => provider.getDocumentSectionLinkRepository({ ...overrides, ...o }),
117
+ getSectionPageLinkRepository: (o) => provider.getSectionPageLinkRepository({ ...overrides, ...o }),
118
+ getSnippetRepository: (o) => provider.getSnippetRepository({ ...overrides, ...o }),
119
+ getPageSnippetLinkRepository: (o) => provider.getPageSnippetLinkRepository({ ...overrides, ...o }),
120
+ getAssetRepository: (o) => provider.getAssetRepository({ ...overrides, ...o }),
121
+ getAssetVersionRepository: (o) => provider.getAssetVersionRepository({ ...overrides, ...o }),
122
+ getEmbedRepository: (o) => provider.getEmbedRepository({ ...overrides, ...o }),
123
+ getPageEmbedLinkRepository: (o) => provider.getPageEmbedLinkRepository({ ...overrides, ...o }),
124
+ getAll: (o) => provider.getAll({ ...overrides, ...o }),
125
+ createAll: (o) => provider.createAll({ ...overrides, ...o }),
126
+ clearServiceCache: (cacheKey) => provider.clearServiceCache(cacheKey),
127
+ clearDocumentServiceCache: (cacheKey) => provider.clearDocumentServiceCache(cacheKey),
128
+ clearDocumentGroupServiceCache: (cacheKey) => provider.clearDocumentGroupServiceCache(cacheKey),
129
+ clearDocumentVersionServiceCache: (cacheKey) => provider.clearDocumentVersionServiceCache(cacheKey),
130
+ clearSectionServiceCache: (cacheKey) => provider.clearSectionServiceCache(cacheKey),
131
+ clearPageServiceCache: (cacheKey) => provider.clearPageServiceCache(cacheKey),
132
+ clearPageVersionServiceCache: (cacheKey) => provider.clearPageVersionServiceCache(cacheKey),
133
+ clearDocumentSectionLinkServiceCache: (cacheKey) => provider.clearDocumentSectionLinkServiceCache(cacheKey),
134
+ clearSectionPageLinkServiceCache: (cacheKey) => provider.clearSectionPageLinkServiceCache(cacheKey),
135
+ clearSnippetServiceCache: (cacheKey) => provider.clearSnippetServiceCache(cacheKey),
136
+ clearPageSnippetLinkServiceCache: (cacheKey) => provider.clearPageSnippetLinkServiceCache(cacheKey),
137
+ clearAssetServiceCache: (cacheKey) => provider.clearAssetServiceCache(cacheKey),
138
+ clearAssetVersionServiceCache: (cacheKey) => provider.clearAssetVersionServiceCache(cacheKey),
139
+ clearEmbedServiceCache: (cacheKey) => provider.clearEmbedServiceCache(cacheKey),
140
+ clearPageEmbedLinkServiceCache: (cacheKey) => provider.clearPageEmbedLinkServiceCache(cacheKey),
141
+ reset: (opts) => provider.reset(opts),
142
+ getRegistryStats: () => provider.getRegistryStats(),
143
+ resolveLogger: (o) => provider.resolveLogger({ ...overrides, ...o }),
144
+ };
145
+ },
146
+ };
147
+ }
148
+ export function buildDocmanKitStaticConfig(envConfig) {
149
+ return {
150
+ logLevel: envConfig.logLevel,
151
+ documentRepository: { repositoryType: inferRepositoryType(envConfig.documentRepoUrl), url: envConfig.documentRepoUrl },
152
+ documentGroupRepository: { repositoryType: inferRepositoryType(envConfig.documentGroupRepoUrl), url: envConfig.documentGroupRepoUrl },
153
+ documentVersionRepository: { repositoryType: inferRepositoryType(envConfig.documentVersionRepoUrl), url: envConfig.documentVersionRepoUrl },
154
+ sectionRepository: { repositoryType: inferRepositoryType(envConfig.sectionRepoUrl), url: envConfig.sectionRepoUrl },
155
+ pageRepository: { repositoryType: inferRepositoryType(envConfig.pageRepoUrl), url: envConfig.pageRepoUrl },
156
+ pageVersionRepository: { repositoryType: inferRepositoryType(envConfig.pageVersionRepoUrl), url: envConfig.pageVersionRepoUrl },
157
+ documentIndexEntryRepository: {
158
+ repositoryType: inferRepositoryType(envConfig.documentRepoUrl),
159
+ url: envConfig.documentRepoUrl,
160
+ },
161
+ documentSectionLinkRepository: { repositoryType: inferRepositoryType(envConfig.documentSectionLinkRepoUrl), url: envConfig.documentSectionLinkRepoUrl },
162
+ sectionPageLinkRepository: { repositoryType: inferRepositoryType(envConfig.sectionPageLinkRepoUrl), url: envConfig.sectionPageLinkRepoUrl },
163
+ snippetRepository: { repositoryType: inferRepositoryType(envConfig.snippetRepoUrl), url: envConfig.snippetRepoUrl },
164
+ pageSnippetLinkRepository: { repositoryType: inferRepositoryType(envConfig.pageSnippetLinkRepoUrl), url: envConfig.pageSnippetLinkRepoUrl },
165
+ assetRepository: { repositoryType: inferRepositoryType(envConfig.assetRepoUrl), url: envConfig.assetRepoUrl },
166
+ assetVersionRepository: { repositoryType: inferRepositoryType(envConfig.assetVersionRepoUrl), url: envConfig.assetVersionRepoUrl },
167
+ embedRepository: { repositoryType: inferRepositoryType(envConfig.embedRepoUrl), url: envConfig.embedRepoUrl },
168
+ pageEmbedLinkRepository: { repositoryType: inferRepositoryType(envConfig.pageEmbedLinkRepoUrl), url: envConfig.pageEmbedLinkRepoUrl },
169
+ };
170
+ }
171
+ export function createDocmanKitWithEnv(options) {
172
+ const staticConfig = buildDocmanKitStaticConfig(options.envConfig);
173
+ const envCfg = parseEnvConfig();
174
+ const statsEnabled = envCfg.statsEnabled === true;
175
+ const counters = statsEnabled ? new CountersMetricsCollector() : undefined;
176
+ const loggerMetrics = statsEnabled ? new LoggerMetricsCollector(undefined) : undefined;
177
+ const metricsCollector = options.metrics ?? (counters && loggerMetrics ? new MultiMetricsCollector([counters, loggerMetrics]) : counters ?? loggerMetrics);
178
+ const cacheMerged = (options.cache || envCfg.cacheGlobal)
179
+ ? { ...(options.cache ?? {}), ...(envCfg.cacheGlobal ?? {}) }
180
+ : undefined;
181
+ const resilienceMerged = (options.resilience || envCfg.resilience)
182
+ ? ({ ...(options.resilience ?? {}), ...(envCfg.resilience ?? {}) })
183
+ : undefined;
184
+ const kit = createDocmanKit({
185
+ name: options.name ?? 'docman-kit',
186
+ staticConfig,
187
+ getContext: (overrides) => ({
188
+ tenantId: options.baseContext.tenantId,
189
+ locale: options.baseContext.locale,
190
+ fallbackLocale: options.baseContext.fallbackLocale,
191
+ ...overrides,
192
+ logger: overrides?.logger ?? options.baseContext.logger,
193
+ }),
194
+ resolveLogger: (ctx) => options.resolveLogger?.(ctx) ?? ctx.logger ?? options.baseContext.logger,
195
+ getCacheKey: (ctx) => options.getCacheKey?.(ctx) ?? cacheKeyFromLocale(ctx.locale, ctx.fallbackLocale),
196
+ cache: cacheMerged,
197
+ metrics: metricsCollector,
198
+ resilience: resilienceMerged,
199
+ transformService: options.transformService,
200
+ });
201
+ return {
202
+ kit,
203
+ getMetricsSnapshot: () => (counters ? counters.snapshot() : null),
204
+ validate: async () => {
205
+ const svc = await kit.createAll();
206
+ void svc;
207
+ return Effect.succeed(true);
208
+ },
209
+ };
210
+ }
@@ -0,0 +1,21 @@
1
+ import { KeysOf } from '@aopslab/xf-i18n';
2
+ import { BmResourceInline } from '@aopslab/xf-i18n/bm';
3
+ import { type XfFriendlyError } from './friendly.js';
4
+ import { type ILabelsDocmanServerErrorsTags } from '../resources/index.js';
5
+ export type TranslateOptions = {
6
+ locale?: string;
7
+ defaultLocale?: string;
8
+ overrideResourceWith?: BmResourceInline<never, ILabelsDocmanServerErrorsTags>;
9
+ };
10
+ type DocmanErrorTagKey = KeysOf<ILabelsDocmanServerErrorsTags>;
11
+ export declare function mapErrorToFriendly(error: unknown, translateOpts?: TranslateOptions): XfFriendlyError & {
12
+ message: string;
13
+ };
14
+ export declare function mapErrorToFriendlyText(error: unknown, translateOpts?: TranslateOptions): {
15
+ translatedMessageText: string;
16
+ translationKey: DocmanErrorTagKey;
17
+ errorCode?: string;
18
+ domainTag?: string;
19
+ friendly: XfFriendlyError;
20
+ };
21
+ export {};
@@ -0,0 +1,47 @@
1
+ import { I18nBm } from '@aopslab/xf-i18n/bm';
2
+ import { toFriendlyError, } from './friendly.js';
3
+ import { docmanErrorsResources, } from '../resources/index.js';
4
+ const FALLBACK_KEY = 'error__unexpected';
5
+ function resolvePrimaryKey(friendly) {
6
+ const first = friendly.messages[0]?.key;
7
+ if (!first)
8
+ return FALLBACK_KEY;
9
+ const tags = docmanErrorsResources.tags ?? {};
10
+ if (first in tags)
11
+ return first;
12
+ return FALLBACK_KEY;
13
+ }
14
+ function translateKey(key, translateOpts) {
15
+ const locale = translateOpts?.locale ?? 'en';
16
+ const defaultLocale = translateOpts?.defaultLocale ?? 'en';
17
+ const i18nBm = new I18nBm({
18
+ inlineResources: translateOpts?.overrideResourceWith ?? docmanErrorsResources,
19
+ config: {
20
+ defaultLocale,
21
+ fallbackLocale: defaultLocale,
22
+ },
23
+ });
24
+ const t = i18nBm.getTagTranslator({ locale });
25
+ return t(key);
26
+ }
27
+ export function mapErrorToFriendly(error, translateOpts) {
28
+ const friendly = toFriendlyError(error);
29
+ const translationKey = resolvePrimaryKey(friendly);
30
+ const message = translateKey(translationKey, translateOpts);
31
+ return {
32
+ ...friendly,
33
+ message,
34
+ };
35
+ }
36
+ export function mapErrorToFriendlyText(error, translateOpts) {
37
+ const friendly = toFriendlyError(error);
38
+ const translationKey = resolvePrimaryKey(friendly);
39
+ const translatedMessageText = translateKey(translationKey, translateOpts);
40
+ return {
41
+ translatedMessageText,
42
+ translationKey,
43
+ errorCode: friendly.code,
44
+ domainTag: friendly.scope,
45
+ friendly,
46
+ };
47
+ }
@@ -0,0 +1,31 @@
1
+ import { XfResult } from '@aopslab/xf-core';
2
+ export type FriendlyMessageType = 'error' | 'validation';
3
+ export interface FriendlyMessage {
4
+ key: string;
5
+ field?: string;
6
+ params?: Record<string, string>;
7
+ type?: FriendlyMessageType;
8
+ }
9
+ export interface XfFriendlyError {
10
+ scope: string;
11
+ code: string;
12
+ status?: number;
13
+ severity: 'user' | 'system';
14
+ messages: FriendlyMessage[];
15
+ logLevel?: 'debug' | 'info' | 'warn' | 'error';
16
+ trace?: {
17
+ stage?: string;
18
+ operation?: string;
19
+ };
20
+ cause?: unknown;
21
+ }
22
+ export declare function toFriendlyError(inputError: unknown): XfFriendlyError;
23
+ export declare function friendlyErrorToResult<TData = unknown>(friendly: XfFriendlyError): XfResult<TData, XfFriendlyError>;
24
+ export declare function friendlyErrorToResultI18n<TData = unknown, TKey extends string = string>(friendly: XfFriendlyError, t: (key: TKey, params?: Record<string, string>) => string): XfResult<TData, XfFriendlyError>;
25
+ export declare function friendlyErrorToHttpBody(friendly: XfFriendlyError): {
26
+ ok: false;
27
+ code: string;
28
+ severity: "user" | "system";
29
+ messages: FriendlyMessage[];
30
+ };
31
+ export declare function errorToResult<TData = unknown>(error: unknown): XfResult<TData, XfFriendlyError>;