@adminide-stack/marketplace-module-server 12.0.4-alpha.4 → 12.0.4-alpha.402

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 (185) hide show
  1. package/Readme.md +321 -0
  2. package/lib/containers/module.d.ts +8 -0
  3. package/lib/containers/module.d.ts.map +1 -1
  4. package/lib/containers/module.js +15 -5
  5. package/lib/containers/module.js.map +1 -1
  6. package/lib/dataloaders/index.d.ts +1 -0
  7. package/lib/dataloaders/index.d.ts.map +1 -0
  8. package/lib/demo/test-graphql-examples.d.ts +73 -0
  9. package/lib/demo/test-graphql-examples.d.ts.map +1 -0
  10. package/lib/graphql/resolvers/form-templates-resolver.d.ts +220 -0
  11. package/lib/graphql/resolvers/form-templates-resolver.d.ts.map +1 -0
  12. package/lib/graphql/resolvers/form-templates-resolver.js +170 -0
  13. package/lib/graphql/resolvers/form-templates-resolver.js.map +1 -0
  14. package/lib/graphql/resolvers/gallery-resolver.d.ts +15 -0
  15. package/lib/graphql/resolvers/gallery-resolver.d.ts.map +1 -0
  16. package/lib/graphql/resolvers/gallery-resolver.js +35 -0
  17. package/lib/graphql/resolvers/gallery-resolver.js.map +1 -0
  18. package/lib/graphql/resolvers/index.d.ts +247 -1
  19. package/lib/graphql/resolvers/index.d.ts.map +1 -1
  20. package/lib/graphql/resolvers/index.js +1 -0
  21. package/lib/graphql/resolvers/index.js.map +1 -0
  22. package/lib/graphql/resolvers/installed-extension-resolver.d.ts +5 -0
  23. package/lib/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -0
  24. package/lib/graphql/resolvers/installed-extension-resolver.js +289 -0
  25. package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -0
  26. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts +13 -0
  27. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts.map +1 -0
  28. package/lib/graphql/resolvers/marketplace-form-resolver.js +90 -0
  29. package/lib/graphql/resolvers/marketplace-form-resolver.js.map +1 -0
  30. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts +14 -0
  31. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts.map +1 -0
  32. package/lib/graphql/resolvers/publisher-analytics-resolver.js +221 -0
  33. package/lib/graphql/resolvers/publisher-analytics-resolver.js.map +1 -0
  34. package/lib/graphql/resolvers/publisher-resolver.d.ts +5 -0
  35. package/lib/graphql/resolvers/publisher-resolver.d.ts.map +1 -0
  36. package/lib/graphql/resolvers/publisher-resolver.js +176 -0
  37. package/lib/graphql/resolvers/publisher-resolver.js.map +1 -0
  38. package/lib/graphql/resolvers/registry-extension-resolver.d.ts +5 -0
  39. package/lib/graphql/resolvers/registry-extension-resolver.d.ts.map +1 -0
  40. package/lib/graphql/resolvers/registry-extension-resolver.js +46 -0
  41. package/lib/graphql/resolvers/registry-extension-resolver.js.map +1 -0
  42. package/lib/graphql/schemas/extension-pricing.graphql +546 -0
  43. package/lib/graphql/schemas/extension-pricing.graphql.js +1 -0
  44. package/lib/graphql/schemas/extension-pricing.graphql.js.map +1 -0
  45. package/lib/graphql/schemas/extension-registry.graphql +107 -0
  46. package/lib/graphql/schemas/extension-registry.graphql.js +1 -0
  47. package/lib/graphql/schemas/extension-registry.graphql.js.map +1 -0
  48. package/lib/graphql/schemas/form-templates.graphql +269 -0
  49. package/lib/graphql/schemas/form-templates.graphql.js +1 -0
  50. package/lib/graphql/schemas/form-templates.graphql.js.map +1 -0
  51. package/lib/graphql/schemas/gallery-schema.graphql +247 -0
  52. package/lib/graphql/schemas/gallery-schema.graphql.js +1 -0
  53. package/lib/graphql/schemas/gallery-schema.graphql.js.map +1 -0
  54. package/lib/graphql/schemas/index.d.ts.map +1 -1
  55. package/lib/graphql/schemas/index.js +3 -4
  56. package/lib/graphql/schemas/index.js.map +1 -1
  57. package/lib/graphql/schemas/installed-extension.graphql +309 -0
  58. package/lib/graphql/schemas/installed-extension.graphql.js +1 -0
  59. package/lib/graphql/schemas/installed-extension.graphql.js.map +1 -0
  60. package/lib/graphql/schemas/publisher-analytics.graphql +305 -0
  61. package/lib/graphql/schemas/publisher-analytics.graphql.js +1 -0
  62. package/lib/graphql/schemas/publisher-analytics.graphql.js.map +1 -0
  63. package/lib/graphql/schemas/publisher.graphql +376 -0
  64. package/lib/graphql/schemas/publisher.graphql.js +1 -0
  65. package/lib/graphql/schemas/publisher.graphql.js.map +1 -0
  66. package/lib/graphql/schemas/service.graphql +196 -0
  67. package/lib/index.d.ts +3 -1
  68. package/lib/index.d.ts.map +1 -1
  69. package/lib/index.js +1 -1
  70. package/lib/index.js.map +1 -1
  71. package/lib/module.d.ts +1 -1
  72. package/lib/module.d.ts.map +1 -1
  73. package/lib/module.js +10 -23
  74. package/lib/module.js.map +1 -1
  75. package/lib/plugins/extension-moleculer-service.d.ts +86 -0
  76. package/lib/plugins/extension-moleculer-service.d.ts.map +1 -0
  77. package/lib/plugins/index.d.ts +2 -0
  78. package/lib/plugins/index.d.ts.map +1 -0
  79. package/lib/services/extension-gallery-repository.d.ts +17 -0
  80. package/lib/services/extension-gallery-repository.d.ts.map +1 -0
  81. package/lib/services/extension-gallery-repository.js +192 -0
  82. package/lib/services/extension-gallery-repository.js.map +1 -0
  83. package/lib/services/extension-gallery-service-new.d.ts +39 -0
  84. package/lib/services/extension-gallery-service-new.d.ts.map +1 -0
  85. package/lib/services/extension-gallery-service.d.ts +30 -0
  86. package/lib/services/extension-gallery-service.d.ts.map +1 -0
  87. package/lib/services/extension-gallery-service.js +311 -0
  88. package/lib/services/extension-gallery-service.js.map +1 -0
  89. package/lib/services/index.d.ts +6 -1
  90. package/lib/services/index.d.ts.map +1 -1
  91. package/lib/services/installed-extension-service-ext.d.ts +16 -0
  92. package/lib/services/installed-extension-service-ext.d.ts.map +1 -0
  93. package/lib/services/installed-extension-service-ext.js +485 -0
  94. package/lib/services/installed-extension-service-ext.js.map +1 -0
  95. package/lib/services/installed-extension-service.d.ts +96 -0
  96. package/lib/services/installed-extension-service.d.ts.map +1 -0
  97. package/lib/services/installed-extension-service.js +521 -0
  98. package/lib/services/installed-extension-service.js.map +1 -0
  99. package/lib/services/installed-extension-service.test.d.ts +1 -0
  100. package/lib/services/installed-extension-service.test.d.ts.map +1 -0
  101. package/lib/services/publisher-analytics-service.d.ts +128 -0
  102. package/lib/services/publisher-analytics-service.d.ts.map +1 -0
  103. package/lib/services/publisher-event-service.d.ts +48 -0
  104. package/lib/services/publisher-event-service.d.ts.map +1 -0
  105. package/lib/services/publisher-event-service.js +296 -0
  106. package/lib/services/publisher-event-service.js.map +1 -0
  107. package/lib/services/publisher-service-context.d.ts +1 -0
  108. package/lib/services/publisher-service-context.d.ts.map +1 -0
  109. package/lib/services/publisher-service.d.ts +60 -0
  110. package/lib/services/publisher-service.d.ts.map +1 -0
  111. package/lib/services/publisher-service.js +134 -0
  112. package/lib/services/publisher-service.js.map +1 -0
  113. package/lib/store/index.d.ts +1 -1
  114. package/lib/store/index.d.ts.map +1 -1
  115. package/lib/store/models/index.d.ts +2 -1
  116. package/lib/store/models/index.d.ts.map +1 -1
  117. package/lib/store/models/installed-extension-model.d.ts +4 -0
  118. package/lib/store/models/installed-extension-model.d.ts.map +1 -0
  119. package/lib/store/models/installed-extension-model.js +269 -0
  120. package/lib/store/models/installed-extension-model.js.map +1 -0
  121. package/lib/store/models/publisher-event-model.d.ts +11 -0
  122. package/lib/store/models/publisher-event-model.d.ts.map +1 -0
  123. package/lib/store/models/publisher-model.d.ts +5 -0
  124. package/lib/store/models/publisher-model.d.ts.map +1 -0
  125. package/lib/store/models/publisher-model.js +103 -0
  126. package/lib/store/models/publisher-model.js.map +1 -0
  127. package/lib/store/models/publisher-stats-model.d.ts +1 -0
  128. package/lib/store/models/publisher-stats-model.d.ts.map +1 -0
  129. package/lib/store/repositories/index.d.ts +3 -0
  130. package/lib/store/repositories/index.d.ts.map +1 -0
  131. package/lib/store/repositories/installed-extension-repository.d.ts +73 -0
  132. package/lib/store/repositories/installed-extension-repository.d.ts.map +1 -0
  133. package/lib/store/repositories/installed-extension-repository.js +442 -0
  134. package/lib/store/repositories/installed-extension-repository.js.map +1 -0
  135. package/lib/store/repositories/publisher-analytics-repository.d.ts +1 -0
  136. package/lib/store/repositories/publisher-analytics-repository.d.ts.map +1 -0
  137. package/lib/store/repositories/publisher-repository.d.ts +19 -0
  138. package/lib/store/repositories/publisher-repository.d.ts.map +1 -0
  139. package/lib/store/repositories/publisher-repository.js +87 -0
  140. package/lib/store/repositories/publisher-repository.js.map +1 -0
  141. package/lib/templates/constants/DB_COLL_NAMES.ts.template +5 -0
  142. package/lib/templates/constants/SERVER_TYPES.ts.template +10 -4
  143. package/lib/templates/repositories/ExtensionGalleryRepository.ts.template +44 -0
  144. package/lib/templates/repositories/InstalledExtensionRepository.ts.template +94 -0
  145. package/lib/templates/repositories/MarketplacePublisherRepository.ts.template +24 -0
  146. package/lib/templates/repositories/RegistryExtensionRepository.ts.template +10 -15
  147. package/lib/templates/services/ExtensionGalleryDataLoader.ts.template +2 -0
  148. package/lib/templates/services/ExtensionGalleryService.ts.template +79 -0
  149. package/lib/templates/services/InstalledExtensionDataLoader.ts.template +2 -0
  150. package/lib/templates/services/InstalledExtensionService.ts.template +181 -0
  151. package/lib/templates/services/MarketplacePublisherService.ts.template +49 -0
  152. package/lib/templates/services/PublisherEventService.ts.template +56 -0
  153. package/lib/templates/services/RegistryExtensionService.ts.template +62 -18
  154. package/lib/tests/extension-integration.test.d.ts +1 -0
  155. package/lib/tests/extension-integration.test.d.ts.map +1 -0
  156. package/lib/tests/install-extension-graphql.test.d.ts +2 -0
  157. package/lib/tests/install-extension-graphql.test.d.ts.map +1 -0
  158. package/lib/tests/test-extension-services.d.ts +1 -0
  159. package/lib/tests/test-extension-services.d.ts.map +1 -0
  160. package/lib/utils/publisherValidation.d.ts +23 -0
  161. package/lib/utils/publisherValidation.d.ts.map +1 -0
  162. package/lib/utils/publisherValidation.js +144 -0
  163. package/lib/utils/publisherValidation.js.map +1 -0
  164. package/package.json +15 -7
  165. package/lib/graphql/resolvers/resolvers.d.ts +0 -2
  166. package/lib/graphql/resolvers/resolvers.d.ts.map +0 -1
  167. package/lib/graphql/resolvers/resolvers.js +0 -167
  168. package/lib/graphql/resolvers/resolvers.js.map +0 -1
  169. package/lib/graphql/schemas/extension.graphql +0 -57
  170. package/lib/graphql/schemas/extension.graphql.js +0 -1
  171. package/lib/graphql/schemas/extension.graphql.js.map +0 -1
  172. package/lib/services/extension-service.d.ts +0 -54
  173. package/lib/services/extension-service.d.ts.map +0 -1
  174. package/lib/services/extension-service.js +0 -42
  175. package/lib/services/extension-service.js.map +0 -1
  176. package/lib/store/models/registry-extension-model.d.ts +0 -10
  177. package/lib/store/models/registry-extension-model.d.ts.map +0 -1
  178. package/lib/store/models/registry-extension-model.js +0 -62
  179. package/lib/store/models/registry-extension-model.js.map +0 -1
  180. package/lib/store/repository/index.d.ts +0 -2
  181. package/lib/store/repository/index.d.ts.map +0 -1
  182. package/lib/store/repository/registry-extension-repository.d.ts +0 -31
  183. package/lib/store/repository/registry-extension-repository.d.ts.map +0 -1
  184. package/lib/store/repository/registry-extension-repository.js +0 -135
  185. package/lib/store/repository/registry-extension-repository.js.map +0 -1
@@ -0,0 +1,289 @@
1
+ const resolver = (pubsub, logger) => ({
2
+ InstalledExtension: {
3
+ organization: (root, args, context, info) => {
4
+ const {
5
+ organizationDataLoader
6
+ } = context;
7
+ // The organization field from the model contains an ObjectId reference
8
+ if (!root.organization) {
9
+ return null;
10
+ }
11
+ // Convert ObjectId to string for the dataloader
12
+ const organizationId = String(root.organization);
13
+ return organizationDataLoader.load(organizationId);
14
+ },
15
+ extension: (root, args, {
16
+ registryExtensionDataLoader
17
+ }) => {
18
+ // The extension field contains an ObjectId reference
19
+ if (!root.extension) {
20
+ return null;
21
+ }
22
+ // Convert ObjectId to string for the dataloader
23
+ const extensionId = String(root.extension);
24
+ return registryExtensionDataLoader.load(extensionId);
25
+ },
26
+ sourceDocument: async (root, _args, ctx) => {
27
+ if (!root.sourceCollection || !root.sourceDocumentId) {
28
+ return null;
29
+ }
30
+ try {
31
+ return await ctx.extensionSourceDocumentDataLoader.load(root.sourceCollection, root.sourceDocumentId);
32
+ } catch (error) {
33
+ if (logger) {
34
+ logger.error('Error loading source document for InstalledExtension:', error);
35
+ }
36
+ return null;
37
+ }
38
+ }
39
+ },
40
+ Query: {
41
+ /**
42
+ * Get all installed extensions for the current user/organization
43
+ */
44
+ async installedExtensions(root, {
45
+ enabled,
46
+ orgName
47
+ }, {
48
+ userContext,
49
+ installedExtensionService,
50
+ slugService
51
+ }) {
52
+ const query = {};
53
+ // Map orgName to orgId using slugService for filtering
54
+ if (orgName) {
55
+ const orgId = await slugService.resolveOrganizationSlug(orgName);
56
+ if (orgId) {
57
+ query.orgId = orgId;
58
+ }
59
+ } else {
60
+ query.orgId = userContext.organization?.id;
61
+ }
62
+ if (enabled !== undefined) {
63
+ query['settings.effectiveEnabled'] = enabled;
64
+ }
65
+ const results = await installedExtensionService.getInstalledExtensions(query);
66
+ return results;
67
+ },
68
+ /**
69
+ * Get a specific installed extension
70
+ */
71
+ async installedExtension(root, args, {
72
+ userContext,
73
+ installedExtensionService,
74
+ slugService
75
+ }) {
76
+ let orgId;
77
+ if (args.orgName) {
78
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
79
+ }
80
+ const result = await installedExtensionService.getInstalledExtension(orgId, args.extensionSlug);
81
+ return result;
82
+ },
83
+ /**
84
+ * Get installed extensions that need attention (updates, deprecated, etc.)
85
+ */
86
+ async extensionsNeedingAttention(root, args, {
87
+ userContext,
88
+ installedExtensionService,
89
+ slugService
90
+ }) {
91
+ let orgId;
92
+ if (args.orgName) {
93
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
94
+ }
95
+ const result = await installedExtensionService.getExtensionsNeedingAttention(orgId);
96
+ return result;
97
+ },
98
+ /**
99
+ * Check for available updates
100
+ */
101
+ async extensionUpdates(root, args, {
102
+ userContext,
103
+ installedExtensionService,
104
+ slugService
105
+ }) {
106
+ let orgId;
107
+ if (args.orgName) {
108
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
109
+ }
110
+ return installedExtensionService.checkForUpdates(orgId, args.extensionSlug);
111
+ }
112
+ },
113
+ Mutation: {
114
+ /**
115
+ * Install an extension from the registry
116
+ */
117
+ async installExtension(root, args, {
118
+ userContext,
119
+ installedExtensionService,
120
+ registryExtensionService,
121
+ slugService
122
+ }) {
123
+ try {
124
+ // Map orgName to orgId using slugService if provided
125
+ let orgId;
126
+ if (args.input.orgName) {
127
+ orgId = await slugService.resolveOrganizationSlug(args.input.orgName);
128
+ if (!orgId) {
129
+ return {
130
+ success: false,
131
+ extension: null,
132
+ message: `Organization '${args.input.orgName}' not found`
133
+ };
134
+ }
135
+ }
136
+ const installData = {
137
+ ...args.input,
138
+ accountId: userContext.accountId,
139
+ orgId,
140
+ // This will be the mapped orgId from orgName
141
+ version: args.input.version,
142
+ // Ensure version is passed through
143
+ installedVersion: args.input.version,
144
+ installedBy: userContext.accountId
145
+ };
146
+ console.log('GraphQL Resolver - Install Data:', JSON.stringify(installData, null, 2));
147
+ console.log('Original args.input:', JSON.stringify(args.input, null, 2));
148
+ const installedExtension = await installedExtensionService.installExtension(installData, userContext.tenantId);
149
+ return {
150
+ success: true,
151
+ extension: installedExtension,
152
+ message: `Extension ${args.input.extensionSlug} installed successfully`
153
+ };
154
+ } catch (error) {
155
+ return {
156
+ success: false,
157
+ extension: null,
158
+ message: error.message || `Failed to install extension ${args.input.extensionSlug}`
159
+ };
160
+ }
161
+ },
162
+ /**
163
+ * Uninstall an extension
164
+ */
165
+ async uninstallExtension(root, args, {
166
+ userContext,
167
+ installedExtensionService,
168
+ registryExtensionService,
169
+ slugService
170
+ }) {
171
+ try {
172
+ let orgId;
173
+ if (args.orgName) {
174
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
175
+ }
176
+ const success = await installedExtensionService.uninstallExtension(orgId, args.extensionSlug, userContext.accountId, userContext.tenantId);
177
+ if (success) {
178
+ // Update the registry extension as uninstalled
179
+ await registryExtensionService.updateExtension(args.extensionSlug, {
180
+ installed: false
181
+ });
182
+ }
183
+ return {
184
+ success,
185
+ message: success ? `Extension ${args.extensionSlug} uninstalled successfully` : `Failed to uninstall extension ${args.extensionSlug}`
186
+ };
187
+ } catch (error) {
188
+ return {
189
+ success: false,
190
+ message: error.message || `Failed to uninstall extension ${args.extensionSlug}`
191
+ };
192
+ }
193
+ },
194
+ /**
195
+ * Enable or disable an extension
196
+ */
197
+ async toggleExtension(root, args, {
198
+ userContext,
199
+ installedExtensionService,
200
+ slugService
201
+ }) {
202
+ let orgId;
203
+ if (args.orgName) {
204
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
205
+ }
206
+ const extension = await installedExtensionService.toggleExtension(orgId, args.extensionSlug, args.enabled, userContext.accountId, userContext.tenantId);
207
+ return {
208
+ success: true,
209
+ extension: extension,
210
+ message: `Extension ${args.extensionSlug} ${args.enabled ? 'enabled' : 'disabled'} successfully`
211
+ };
212
+ },
213
+ /**
214
+ * Update extension settings
215
+ */
216
+ async updateExtensionSettings(root, args, {
217
+ userContext,
218
+ installedExtensionService,
219
+ slugService
220
+ }) {
221
+ let orgId;
222
+ if (args.orgName) {
223
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
224
+ }
225
+ const extension = await installedExtensionService.updateExtensionSettings(orgId, args.extensionSlug, args.settings, userContext.accountId, userContext.tenantId);
226
+ return {
227
+ success: true,
228
+ extension: extension,
229
+ message: `Extension ${args.extensionSlug} settings updated successfully`
230
+ };
231
+ },
232
+ /**
233
+ * Update an extension to a newer version
234
+ */
235
+ async updateExtensionVersion(root, args, {
236
+ userContext,
237
+ installedExtensionService,
238
+ slugService
239
+ }) {
240
+ let orgId;
241
+ if (args.orgName) {
242
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
243
+ }
244
+ const extension = await installedExtensionService.updateExtensionVersion(orgId, args.extensionSlug, args.version, userContext.accountId, userContext.tenantId);
245
+ return {
246
+ success: true,
247
+ extension: extension,
248
+ message: `Extension ${args.extensionSlug} updated to version ${args.version} successfully`
249
+ };
250
+ },
251
+ /**
252
+ * Sync installed extensions with registry
253
+ */
254
+ async syncExtensionsWithRegistry(root, args, {
255
+ userContext,
256
+ installedExtensionService,
257
+ slugService
258
+ }) {
259
+ let orgId;
260
+ if (args.orgName) {
261
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
262
+ }
263
+ await installedExtensionService.syncWithRegistry(orgId, userContext.tenantId);
264
+ return {
265
+ success: true,
266
+ message: 'Extensions synced with registry successfully'
267
+ };
268
+ },
269
+ /**
270
+ * Clean up deprecated or removed extensions
271
+ */
272
+ async cleanupExtensions(root, args, {
273
+ userContext,
274
+ installedExtensionService,
275
+ slugService
276
+ }) {
277
+ let orgId;
278
+ if (args.orgName) {
279
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
280
+ }
281
+ const result = await installedExtensionService.cleanupExtensions(orgId, userContext.tenantId, args.dryRun || false);
282
+ return {
283
+ success: true,
284
+ result,
285
+ message: args.dryRun ? 'Cleanup preview completed' : `Cleanup completed: ${result.removed.length} removed, ${result.deprecated.length} deprecated`
286
+ };
287
+ }
288
+ }
289
+ });export{resolver};//# sourceMappingURL=installed-extension-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-extension-resolver.js","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAES,MAAA,QAAQ;AACjB,EAAA,kBAAoB,EAAA;AACpB,IAAA,YAA8B,EAAA,CAAU,IAA0C,EAAA,mBAAsB,KAAA;AAExG,MAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ import { PubSub } from 'graphql-subscriptions';
2
+ import { CdmLogger } from '@cdm-logger/core';
3
+ import { IResolvers } from 'common/server';
4
+ /**
5
+ * Marketplace Form Submission Resolver
6
+ *
7
+ * Handles enhanced marketplace features for extension management:
8
+ * - Form submission processing
9
+ * - Extension validation
10
+ * - Enhanced extension publishing
11
+ */
12
+ export declare const marketplaceFormResolver: (pubsub: PubSub, logger?: CdmLogger.ILogger) => IResolvers;
13
+ //# sourceMappingURL=marketplace-form-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-form-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/marketplace-form-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAE/D;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UA+HnF,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Marketplace Form Submission Resolver
3
+ *
4
+ * Handles enhanced marketplace features for extension management:
5
+ * - Form submission processing
6
+ * - Extension validation
7
+ * - Enhanced extension publishing
8
+ */
9
+ const marketplaceFormResolver = (pubsub, logger) => ({
10
+ Mutation: {
11
+ /**
12
+ * Process marketplace form submissions
13
+ * Supports different submission types: extension-publish, extension-validate, extension-update
14
+ */
15
+ async marketplaceFormSubmission(root, args, ctx) {
16
+ if (logger) {
17
+ logger.debug('marketplaceFormSubmission args [%j]', args);
18
+ }
19
+ const result = await ctx.registryExtensionService.formSubmission({
20
+ extensionSlug: args.input.extensionSlug,
21
+ formData: args.input.formData,
22
+ submissionType: args.input.submissionType,
23
+ metadata: args.input.metadata
24
+ });
25
+ return {
26
+ success: result.success,
27
+ message: result.message,
28
+ errors: result.errors || [],
29
+ submissionId: result.submissionId,
30
+ data: result.data
31
+ };
32
+ },
33
+ /**
34
+ * Validate extension before publishing
35
+ * Checks manifest structure, version format, and extension conflicts
36
+ */
37
+ async marketplaceValidateExtension(root, args, ctx) {
38
+ if (logger) {
39
+ logger.debug('marketplaceValidateExtension args [%j]', args);
40
+ }
41
+ const result = await ctx.registryExtensionService.validateExtension({
42
+ manifest: args.input.manifest,
43
+ bundle: args.input.bundle,
44
+ sourceMap: args.input.sourceMap,
45
+ extensionSlug: args.input.extensionSlug,
46
+ version: args.input.version
47
+ });
48
+ return {
49
+ isValid: result.isValid,
50
+ errors: result.errors.map(e => ({
51
+ field: e.field,
52
+ message: e.message,
53
+ code: e.code
54
+ })),
55
+ warnings: result.warnings.map(w => ({
56
+ field: w.field,
57
+ message: w.message,
58
+ code: w.code
59
+ })),
60
+ metadata: result.metadata
61
+ };
62
+ },
63
+ /**
64
+ * Enhanced extension publishing with validation and pre-release support
65
+ * Includes force publishing and comprehensive error handling
66
+ */
67
+ async marketplacePublishExtension(root, args, ctx) {
68
+ if (logger) {
69
+ logger.debug('marketplacePublishExtension args [%j]', args);
70
+ }
71
+ const result = await ctx.registryExtensionService.publishExtensionEnhanced({
72
+ extensionSlug: args.input.extensionSlug,
73
+ manifest: args.input.manifest,
74
+ bundle: args.input.bundle,
75
+ sourceMap: args.input.sourceMap,
76
+ version: args.input.version,
77
+ releaseNotes: args.input.releaseNotes,
78
+ force: args.input.force,
79
+ preRelease: args.input.preRelease
80
+ });
81
+ return {
82
+ success: result.success,
83
+ extension: result.extension ? result.extension : null,
84
+ message: result.message,
85
+ errors: result.errors || [],
86
+ releaseId: result.releaseId
87
+ };
88
+ }
89
+ }
90
+ });export{marketplaceFormResolver};//# sourceMappingURL=marketplace-form-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-form-resolver.js","sources":["../../../src/graphql/resolvers/marketplace-form-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AAEA;;;;;;;AAOG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,14 @@
1
+ import { PubSub } from 'graphql-subscriptions';
2
+ import { CdmLogger } from '@cdm-logger/core';
3
+ import { IResolvers } from 'common/server';
4
+ /**
5
+ * Publisher Analytics Resolver
6
+ *
7
+ * Handles comprehensive analytics and insights for extension publishers:
8
+ * - Publisher analytics and metrics
9
+ * - Revenue analytics
10
+ * - Analytics event tracking
11
+ * - Real-time analytics subscriptions
12
+ */
13
+ export declare const publisherAnalyticsResolver: (pubsub: PubSub, logger?: CdmLogger.ILogger) => IResolvers;
14
+ //# sourceMappingURL=publisher-analytics-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-analytics-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/publisher-analytics-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UAwQ3E,CAAC"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Publisher Analytics Resolver
3
+ *
4
+ * Handles comprehensive analytics and insights for extension publishers:
5
+ * - Publisher analytics and metrics
6
+ * - Revenue analytics
7
+ * - Analytics event tracking
8
+ * - Real-time analytics subscriptions
9
+ */
10
+ const publisherAnalyticsResolver = (pubsub, logger) => ({
11
+ Query: {
12
+ /**
13
+ * Get comprehensive analytics for a publisher
14
+ */
15
+ publisherAnalytics: async (root, args,
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ ctx) => {
18
+ if (logger) {
19
+ logger.debug('publisherAnalytics args [%j]', args);
20
+ }
21
+ // Mock analytics data for now - in real implementation, this would use the analytics service
22
+ const mockAnalytics = {
23
+ publisherId: args.input.publisherId,
24
+ totalExtensions: Math.floor(Math.random() * 50) + 5,
25
+ totalDownloads: Math.floor(Math.random() * 100000) + 10000,
26
+ totalInstallations: Math.floor(Math.random() * 50000) + 5000,
27
+ averageRating: 4.2 + Math.random() * 0.8,
28
+ period: args.input.period,
29
+ extensions: [{
30
+ extensionSlug: 'sample-extension-1',
31
+ name: 'Sample Extension 1',
32
+ version: '1.0.0',
33
+ downloads: Math.floor(Math.random() * 10000),
34
+ installations: Math.floor(Math.random() * 5000),
35
+ rating: 4.0 + Math.random() * 1.0,
36
+ reviewCount: Math.floor(Math.random() * 100),
37
+ revenue: args.input.includeRevenue ? Math.random() * 1000 : null,
38
+ lastUpdated: new Date().toISOString(),
39
+ versionMetrics: [{
40
+ version: '1.0.0',
41
+ downloads: Math.floor(Math.random() * 1000),
42
+ installations: Math.floor(Math.random() * 500),
43
+ releasedAt: new Date().toISOString(),
44
+ adoptionRate: Math.random() * 100
45
+ }]
46
+ }],
47
+ downloadTrend: Array.from({
48
+ length: 30
49
+ }, (_, i) => ({
50
+ timestamp: new Date(Date.now() - i * 24 * 60 * 60 * 1000).toISOString(),
51
+ value: Math.floor(Math.random() * 1000),
52
+ secondaryValue: Math.floor(Math.random() * 100)
53
+ })),
54
+ installationTrend: Array.from({
55
+ length: 30
56
+ }, (_, i) => ({
57
+ timestamp: new Date(Date.now() - i * 24 * 60 * 60 * 1000).toISOString(),
58
+ value: Math.floor(Math.random() * 500),
59
+ secondaryValue: Math.floor(Math.random() * 50)
60
+ })),
61
+ popularRegions: args.input.includeRegions ? [{
62
+ region: 'US',
63
+ regionName: 'United States',
64
+ downloads: Math.floor(Math.random() * 10000),
65
+ installations: Math.floor(Math.random() * 5000),
66
+ percentage: Math.random() * 20
67
+ }, {
68
+ region: 'UK',
69
+ regionName: 'United Kingdom',
70
+ downloads: Math.floor(Math.random() * 8000),
71
+ installations: Math.floor(Math.random() * 4000),
72
+ percentage: Math.random() * 15
73
+ }] : []
74
+ };
75
+ return mockAnalytics;
76
+ },
77
+ /**
78
+ * Get revenue analytics for a publisher
79
+ */
80
+ publisherRevenueAnalytics: async (root, args,
81
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
82
+ ctx) => {
83
+ if (logger) {
84
+ logger.debug('publisherRevenueAnalytics args [%j]', args);
85
+ }
86
+ const mockRevenue = {
87
+ publisherId: args.input.publisherId,
88
+ totalRevenue: Math.random() * 10000,
89
+ currency: args.input.currency || 'USD',
90
+ extensionRevenue: [{
91
+ extensionSlug: 'sample-extension-1',
92
+ name: 'Sample Extension 1',
93
+ revenue: Math.random() * 500,
94
+ paidInstallations: Math.floor(Math.random() * 100),
95
+ arpu: Math.random() * 10
96
+ }],
97
+ revenueTrend: Array.from({
98
+ length: 30
99
+ }, (_, i) => ({
100
+ timestamp: new Date(Date.now() - i * 24 * 60 * 60 * 1000).toISOString(),
101
+ revenue: Math.random() * 100,
102
+ transactions: Math.floor(Math.random() * 20)
103
+ })),
104
+ topEarningExtensions: [{
105
+ extensionSlug: 'sample-extension-1',
106
+ name: 'Sample Extension 1',
107
+ revenue: Math.random() * 500,
108
+ paidInstallations: Math.floor(Math.random() * 100),
109
+ arpu: Math.random() * 10
110
+ }]
111
+ };
112
+ return mockRevenue;
113
+ },
114
+ /**
115
+ * Get recent analytics events
116
+ */
117
+ recentAnalyticsEvents: async (root, args,
118
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
119
+ ctx) => {
120
+ if (logger) {
121
+ logger.debug('recentAnalyticsEvents args [%j]', args);
122
+ }
123
+ const limit = args.limit || 50;
124
+ const eventTypes = ['download', 'install', 'uninstall', 'update', 'view'];
125
+ const regions = ['US', 'UK', 'DE', 'FR', 'JP'];
126
+ const mockEvents = Array.from({
127
+ length: Math.min(limit, 20)
128
+ }, () => ({
129
+ eventType: eventTypes[Math.floor(Math.random() * eventTypes.length)],
130
+ extensionSlug: `ext-${Math.floor(Math.random() * 10)}`,
131
+ publisherId: args.publisherId,
132
+ timestamp: new Date(Date.now() - Math.random() * 86400000).toISOString(),
133
+ metadata: JSON.stringify({
134
+ source: 'marketplace',
135
+ userAgent: 'VS Code'
136
+ }),
137
+ region: regions[Math.floor(Math.random() * regions.length)],
138
+ version: `1.${Math.floor(Math.random() * 10)}.${Math.floor(Math.random() * 10)}`
139
+ }));
140
+ return mockEvents.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
141
+ }
142
+ },
143
+ Mutation: {
144
+ /**
145
+ * Track an analytics event
146
+ */
147
+ trackAnalyticsEvent: async (root, args,
148
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
149
+ ctx) => {
150
+ if (logger) {
151
+ logger.debug('trackAnalyticsEvent args [%j]', args);
152
+ }
153
+ const eventId = `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
154
+ // Create analytics event for real-time subscriptions
155
+ const analyticsEvent = {
156
+ eventType: args.input.eventType,
157
+ extensionSlug: args.input.extensionSlug,
158
+ publisherId: 'publisher-id',
159
+ // Would be resolved from extension
160
+ timestamp: new Date().toISOString(),
161
+ metadata: args.input.metadata,
162
+ region: args.input.region,
163
+ version: args.input.version
164
+ };
165
+ // Emit to subscriptions
166
+ pubsub.publish('ANALYTICS_EVENT', {
167
+ analyticsEvents: analyticsEvent
168
+ });
169
+ if (args.input.eventType === 'download') {
170
+ pubsub.publish('DOWNLOAD_EVENT', {
171
+ downloadEvents: analyticsEvent
172
+ });
173
+ }
174
+ if (args.input.eventType === 'install') {
175
+ pubsub.publish('INSTALLATION_EVENT', {
176
+ installationEvents: analyticsEvent
177
+ });
178
+ }
179
+ return {
180
+ success: true,
181
+ message: `Analytics event '${args.input.eventType}' tracked successfully`,
182
+ eventId
183
+ };
184
+ }
185
+ },
186
+ Subscription: {
187
+ /**
188
+ * Subscribe to real-time analytics events
189
+ */
190
+ analyticsEvents: {
191
+ subscribe: (root, args) => {
192
+ if (logger) {
193
+ logger.debug('analyticsEvents subscription for publisher [%s]', args.publisherId);
194
+ }
195
+ return pubsub.asyncIterator('ANALYTICS_EVENT');
196
+ }
197
+ },
198
+ /**
199
+ * Subscribe to download events
200
+ */
201
+ downloadEvents: {
202
+ subscribe: (root, args) => {
203
+ if (logger) {
204
+ logger.debug('downloadEvents subscription for publisher [%s]', args.publisherId);
205
+ }
206
+ return pubsub.asyncIterator('DOWNLOAD_EVENT');
207
+ }
208
+ },
209
+ /**
210
+ * Subscribe to installation events
211
+ */
212
+ installationEvents: {
213
+ subscribe: (root, args) => {
214
+ if (logger) {
215
+ logger.debug('installationEvents subscription for publisher [%s]', args.publisherId);
216
+ }
217
+ return pubsub.asyncIterator('INSTALLATION_EVENT');
218
+ }
219
+ }
220
+ }
221
+ });export{publisherAnalyticsResolver};//# sourceMappingURL=publisher-analytics-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-analytics-resolver.js","sources":["../../../src/graphql/resolvers/publisher-analytics-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AAEA;;;;;;;;AAQG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,5 @@
1
+ import { PubSub } from 'graphql-subscriptions';
2
+ import { CdmLogger } from '@cdm-logger/core';
3
+ import { IResolvers } from 'common/server';
4
+ export declare const publisherResolver: (pubsub: PubSub, logger?: CdmLogger.ILogger) => IResolvers;
5
+ //# sourceMappingURL=publisher-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/publisher-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACH,UAAU,EAKb,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UA6N7E,CAAC"}