@adminide-stack/marketplace-module-server 12.0.4-alpha.95 → 13.0.1-alpha.0

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 (175) hide show
  1. package/lib/containers/module.d.ts +4 -4
  2. package/lib/containers/module.d.ts.map +1 -1
  3. package/lib/containers/module.js +12 -7
  4. package/lib/containers/module.js.map +1 -1
  5. package/lib/dataloaders/index.d.ts +1 -1
  6. package/lib/dataloaders/index.d.ts.map +1 -1
  7. package/lib/dataloaders/publisher-data-loader.d.ts +6 -0
  8. package/lib/dataloaders/publisher-data-loader.d.ts.map +1 -0
  9. package/lib/demo/test-graphql-examples.d.ts +73 -0
  10. package/lib/demo/test-graphql-examples.d.ts.map +1 -0
  11. package/lib/graphql/resolvers/form-templates-resolver.d.ts +220 -0
  12. package/lib/graphql/resolvers/form-templates-resolver.d.ts.map +1 -0
  13. package/lib/graphql/resolvers/form-templates-resolver.js +170 -0
  14. package/lib/graphql/resolvers/form-templates-resolver.js.map +1 -0
  15. package/lib/graphql/resolvers/gallery-resolver.d.ts +15 -0
  16. package/lib/graphql/resolvers/gallery-resolver.d.ts.map +1 -0
  17. package/lib/graphql/resolvers/gallery-resolver.js +35 -0
  18. package/lib/graphql/resolvers/gallery-resolver.js.map +1 -0
  19. package/lib/graphql/resolvers/index.d.ts +247 -1
  20. package/lib/graphql/resolvers/index.d.ts.map +1 -1
  21. package/lib/graphql/resolvers/index.js +1 -1
  22. package/lib/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -1
  23. package/lib/graphql/resolvers/installed-extension-resolver.js +161 -35
  24. package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -1
  25. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts +13 -0
  26. package/lib/graphql/resolvers/marketplace-form-resolver.d.ts.map +1 -0
  27. package/lib/graphql/resolvers/marketplace-form-resolver.js +90 -0
  28. package/lib/graphql/resolvers/marketplace-form-resolver.js.map +1 -0
  29. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts +14 -0
  30. package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts.map +1 -0
  31. package/lib/graphql/resolvers/publisher-analytics-resolver.js +221 -0
  32. package/lib/graphql/resolvers/publisher-analytics-resolver.js.map +1 -0
  33. package/lib/graphql/resolvers/publisher-resolver.d.ts +5 -0
  34. package/lib/graphql/resolvers/publisher-resolver.d.ts.map +1 -0
  35. package/lib/graphql/resolvers/publisher-resolver.js +183 -0
  36. package/lib/graphql/resolvers/publisher-resolver.js.map +1 -0
  37. package/lib/graphql/resolvers/registry-extension-resolver.d.ts.map +1 -1
  38. package/lib/graphql/resolvers/registry-extension-resolver.js +34 -167
  39. package/lib/graphql/resolvers/registry-extension-resolver.js.map +1 -1
  40. package/lib/graphql/schemas/extension-pricing.graphql +546 -0
  41. package/lib/graphql/schemas/extension-pricing.graphql.js +1 -0
  42. package/lib/graphql/schemas/extension-pricing.graphql.js.map +1 -0
  43. package/lib/graphql/schemas/extension-registry.graphql +91 -58
  44. package/lib/graphql/schemas/extension-registry.graphql.js +1 -1
  45. package/lib/graphql/schemas/form-templates.graphql +269 -0
  46. package/lib/graphql/schemas/form-templates.graphql.js +1 -0
  47. package/lib/graphql/schemas/form-templates.graphql.js.map +1 -0
  48. package/lib/graphql/schemas/gallery-schema.graphql +247 -0
  49. package/lib/graphql/schemas/gallery-schema.graphql.js +1 -0
  50. package/lib/graphql/schemas/gallery-schema.graphql.js.map +1 -0
  51. package/lib/graphql/schemas/index.d.ts.map +1 -1
  52. package/lib/graphql/schemas/index.js +3 -1
  53. package/lib/graphql/schemas/index.js.map +1 -1
  54. package/lib/graphql/schemas/installed-extension.graphql +37 -7
  55. package/lib/graphql/schemas/installed-extension.graphql.js +1 -1
  56. package/lib/graphql/schemas/publisher-analytics.graphql +305 -0
  57. package/lib/graphql/schemas/publisher-analytics.graphql.js +1 -0
  58. package/lib/graphql/schemas/publisher-analytics.graphql.js.map +1 -0
  59. package/lib/graphql/schemas/publisher.graphql +584 -0
  60. package/lib/graphql/schemas/publisher.graphql.js +1 -0
  61. package/lib/graphql/schemas/publisher.graphql.js.map +1 -0
  62. package/lib/graphql/schemas/service.graphql +15 -0
  63. package/lib/index.d.ts +1 -1
  64. package/lib/index.js +1 -1
  65. package/lib/index.js.map +1 -1
  66. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts +20 -0
  67. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts.map +1 -0
  68. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js +61 -0
  69. package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js.map +1 -0
  70. package/lib/migrations/index.d.ts +2 -0
  71. package/lib/migrations/index.d.ts.map +1 -0
  72. package/lib/module.d.ts +1 -1
  73. package/lib/module.d.ts.map +1 -1
  74. package/lib/module.js +11 -26
  75. package/lib/module.js.map +1 -1
  76. package/lib/services/extension-gallery-repository.d.ts +17 -0
  77. package/lib/services/extension-gallery-repository.d.ts.map +1 -0
  78. package/lib/services/extension-gallery-repository.js +192 -0
  79. package/lib/services/extension-gallery-repository.js.map +1 -0
  80. package/lib/services/extension-gallery-service-new.d.ts +39 -0
  81. package/lib/services/extension-gallery-service-new.d.ts.map +1 -0
  82. package/lib/services/extension-gallery-service.d.ts +30 -0
  83. package/lib/services/extension-gallery-service.d.ts.map +1 -0
  84. package/lib/services/extension-gallery-service.js +334 -0
  85. package/lib/services/extension-gallery-service.js.map +1 -0
  86. package/lib/services/index.d.ts +4 -1
  87. package/lib/services/index.d.ts.map +1 -1
  88. package/lib/services/installed-extension-service-ext.d.ts +5 -2
  89. package/lib/services/installed-extension-service-ext.d.ts.map +1 -1
  90. package/lib/services/installed-extension-service-ext.js +364 -117
  91. package/lib/services/installed-extension-service-ext.js.map +1 -1
  92. package/lib/services/installed-extension-service.d.ts +30 -13
  93. package/lib/services/installed-extension-service.d.ts.map +1 -1
  94. package/lib/services/installed-extension-service.js +301 -68
  95. package/lib/services/installed-extension-service.js.map +1 -1
  96. package/lib/services/installed-extension-service.test.d.ts +0 -1
  97. package/lib/services/publisher-analytics-service.d.ts +128 -0
  98. package/lib/services/publisher-analytics-service.d.ts.map +1 -0
  99. package/lib/services/publisher-event-service.d.ts +48 -0
  100. package/lib/services/publisher-event-service.d.ts.map +1 -0
  101. package/lib/services/publisher-event-service.js +296 -0
  102. package/lib/services/publisher-event-service.js.map +1 -0
  103. package/lib/services/publisher-service-context.d.ts +1 -0
  104. package/lib/services/publisher-service-context.d.ts.map +1 -0
  105. package/lib/services/publisher-service.d.ts +62 -0
  106. package/lib/services/publisher-service.d.ts.map +1 -0
  107. package/lib/services/publisher-service.js +135 -0
  108. package/lib/services/publisher-service.js.map +1 -0
  109. package/lib/store/models/index.d.ts +1 -1
  110. package/lib/store/models/index.d.ts.map +1 -1
  111. package/lib/store/models/installed-extension-model.d.ts.map +1 -1
  112. package/lib/store/models/installed-extension-model.js +17 -45
  113. package/lib/store/models/installed-extension-model.js.map +1 -1
  114. package/lib/store/models/publisher-event-model.d.ts +11 -0
  115. package/lib/store/models/publisher-event-model.d.ts.map +1 -0
  116. package/lib/store/models/publisher-model.d.ts +5 -0
  117. package/lib/store/models/publisher-model.d.ts.map +1 -0
  118. package/lib/store/models/publisher-model.js +117 -0
  119. package/lib/store/models/publisher-model.js.map +1 -0
  120. package/lib/store/models/publisher-stats-model.d.ts +1 -0
  121. package/lib/store/models/publisher-stats-model.d.ts.map +1 -0
  122. package/lib/store/repositories/index.d.ts +1 -1
  123. package/lib/store/repositories/index.d.ts.map +1 -1
  124. package/lib/store/repositories/installed-extension-repository.d.ts +17 -11
  125. package/lib/store/repositories/installed-extension-repository.d.ts.map +1 -1
  126. package/lib/store/repositories/installed-extension-repository.js +123 -75
  127. package/lib/store/repositories/installed-extension-repository.js.map +1 -1
  128. package/lib/store/repositories/publisher-analytics-repository.d.ts +1 -0
  129. package/lib/store/repositories/publisher-analytics-repository.d.ts.map +1 -0
  130. package/lib/store/repositories/publisher-repository.d.ts +19 -0
  131. package/lib/store/repositories/publisher-repository.d.ts.map +1 -0
  132. package/lib/store/repositories/publisher-repository.js +87 -0
  133. package/lib/store/repositories/publisher-repository.js.map +1 -0
  134. package/lib/templates/constants/DB_COLL_NAMES.ts.template +1 -1
  135. package/lib/templates/constants/SERVER_TYPES.ts.template +8 -5
  136. package/lib/templates/repositories/ExtensionGalleryRepository.ts.template +44 -0
  137. package/lib/templates/repositories/InstalledExtensionRepository.ts.template +19 -14
  138. package/lib/templates/repositories/MarketplacePublisherRepository.ts.template +24 -0
  139. package/lib/templates/repositories/RegistryExtensionRepository.ts.template +2 -2
  140. package/lib/templates/services/ExtensionGalleryDataLoader.ts.template +2 -0
  141. package/lib/templates/services/ExtensionGalleryService.ts.template +79 -0
  142. package/lib/templates/services/InstalledExtensionService.ts.template +63 -32
  143. package/lib/templates/services/MarketplacePublisherService.ts.template +51 -0
  144. package/lib/templates/services/PublisherDataLoader.ts.template +3 -0
  145. package/lib/templates/services/PublisherEventService.ts.template +56 -0
  146. package/lib/templates/services/RegistryExtensionService.ts.template +46 -2
  147. package/lib/tests/extension-integration.test.d.ts +0 -1
  148. package/lib/tests/install-extension-graphql.test.d.ts +2 -0
  149. package/lib/tests/install-extension-graphql.test.d.ts.map +1 -0
  150. package/lib/utils/publisherValidation.d.ts +23 -0
  151. package/lib/utils/publisherValidation.d.ts.map +1 -0
  152. package/lib/utils/publisherValidation.js +144 -0
  153. package/lib/utils/publisherValidation.js.map +1 -0
  154. package/package.json +13 -9
  155. package/lib/constants/extension-events.d.ts +0 -136
  156. package/lib/constants/extension-events.d.ts.map +0 -1
  157. package/lib/dataloaders/registry-extension-data-loader.d.ts +0 -6
  158. package/lib/dataloaders/registry-extension-data-loader.d.ts.map +0 -1
  159. package/lib/dataloaders/registry-extension-data-loader.js +0 -6
  160. package/lib/dataloaders/registry-extension-data-loader.js.map +0 -1
  161. package/lib/graphql/schemas/service.graphql.js +0 -1
  162. package/lib/graphql/schemas/service.graphql.js.map +0 -1
  163. package/lib/services/extension-service.d.ts +0 -42
  164. package/lib/services/extension-service.d.ts.map +0 -1
  165. package/lib/services/extension-service.js +0 -60
  166. package/lib/services/extension-service.js.map +0 -1
  167. package/lib/store/models/registry-extension-model.d.ts +0 -5
  168. package/lib/store/models/registry-extension-model.d.ts.map +0 -1
  169. package/lib/store/models/registry-extension-model.js +0 -83
  170. package/lib/store/models/registry-extension-model.js.map +0 -1
  171. package/lib/store/repositories/registry-extension-repository.d.ts +0 -54
  172. package/lib/store/repositories/registry-extension-repository.d.ts.map +0 -1
  173. package/lib/store/repositories/registry-extension-repository.js +0 -137
  174. package/lib/store/repositories/registry-extension-repository.js.map +0 -1
  175. package/lib/templates/services/RegistryExtensionDataLoader.ts.template +0 -2
@@ -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,EAMb,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UAqO7E,CAAC"}
@@ -0,0 +1,183 @@
1
+ import {PublisherOrderBy}from'common/server';const publisherResolver = (pubsub, logger) => ({
2
+ Query: {
3
+ async publisherStats(root, args, {
4
+ marketplacePublisherService
5
+ }) {
6
+ if (logger) {
7
+ logger.debug('publisherStats query with args [%j]', args);
8
+ }
9
+ const stats = await marketplacePublisherService.getPublisherStats(args.publisherId);
10
+ // Cast service result to GraphQL interface - field resolvers will handle computed fields
11
+ return stats;
12
+ },
13
+ async publishers(root, args, {
14
+ marketplacePublisherService
15
+ }) {
16
+ if (logger) {
17
+ logger.debug('publishers query with args [%j]', args);
18
+ }
19
+ const {
20
+ first = 20,
21
+ skip = 0,
22
+ search,
23
+ orderBy = PublisherOrderBy.CreatedDesc
24
+ } = args;
25
+ // Note: verified filtering not implemented yet in service layer
26
+ // Convert GraphQL orderBy enum to service format
27
+ const serviceOrderBy = orderBy === PublisherOrderBy.CreatedDesc ? 'createdAt' : 'createdAt';
28
+ const serviceOrderDirection = orderBy === PublisherOrderBy.CreatedDesc ? 'DESC' : 'ASC';
29
+ try {
30
+ const result = await marketplacePublisherService.findPublishers(search, serviceOrderBy, serviceOrderDirection, first, skip);
31
+ return {
32
+ nodes: result.publishers,
33
+ totalCount: result.totalCount,
34
+ hasNextPage: skip + first < result.totalCount,
35
+ hasPreviousPage: skip > 0
36
+ };
37
+ } catch (error) {
38
+ if (logger) {
39
+ logger.error('publishers query error: %s', error.message);
40
+ }
41
+ // Return empty result instead of null to satisfy non-nullable schema
42
+ return {
43
+ nodes: [],
44
+ totalCount: 0,
45
+ hasNextPage: false,
46
+ hasPreviousPage: false
47
+ };
48
+ }
49
+ },
50
+ async publisher(root, args, {
51
+ marketplacePublisherService
52
+ }) {
53
+ if (logger) {
54
+ logger.debug('publisher query with args [%j]', args);
55
+ }
56
+ try {
57
+ const publisher = await marketplacePublisherService.findByPublisherName(args.name);
58
+ return publisher;
59
+ } catch (error) {
60
+ if (logger) {
61
+ logger.error('publisher query error: %s', error.message);
62
+ }
63
+ return null;
64
+ }
65
+ }
66
+ },
67
+ Mutation: {
68
+ async createPublisherMutation(root, args, {
69
+ marketplacePublisherService
70
+ }) {
71
+ if (logger) {
72
+ logger.debug('createPublisherMutation with args [%j]', args);
73
+ }
74
+ try {
75
+ const publisher = await marketplacePublisherService.createPublisher(args.input);
76
+ return {
77
+ publisher: publisher,
78
+ success: true,
79
+ error: null
80
+ };
81
+ } catch (error) {
82
+ const errorMessage = error instanceof Error ? error.message : String(error);
83
+ if (logger) {
84
+ logger.error('createPublisherMutation error: %s', errorMessage);
85
+ }
86
+ throw error;
87
+ }
88
+ },
89
+ async updatePublisherMutation(root, args, {
90
+ marketplacePublisherService
91
+ }) {
92
+ if (logger) {
93
+ logger.debug('updatePublisherMutation with args [%j]', args);
94
+ }
95
+ try {
96
+ const publisher = await marketplacePublisherService.updatePublisher(args.id, args.input);
97
+ return {
98
+ publisher: publisher ? publisher : null,
99
+ success: true,
100
+ error: null
101
+ };
102
+ } catch (error) {
103
+ if (logger) {
104
+ logger.error('updatePublisherMutation error: %s', error.message);
105
+ }
106
+ return {
107
+ publisher: null,
108
+ success: false,
109
+ error: error.message
110
+ };
111
+ }
112
+ },
113
+ async verifyPublisherMutation(root, args, {
114
+ marketplacePublisherService
115
+ }) {
116
+ if (logger) {
117
+ logger.debug('verifyPublisherMutation with args [%j]', args);
118
+ }
119
+ try {
120
+ const publisher = await marketplacePublisherService.verifyPublisher(args.id);
121
+ return {
122
+ publisher: publisher ? publisher : null,
123
+ success: true,
124
+ error: null
125
+ };
126
+ } catch (error) {
127
+ if (logger) {
128
+ logger.error('verifyPublisherMutation error: %s', error.message);
129
+ }
130
+ return {
131
+ publisher: null,
132
+ success: false,
133
+ error: error.message
134
+ };
135
+ }
136
+ }
137
+ },
138
+ ExtensionRegistry: {
139
+ // Publisher-related queries are now in root Query section
140
+ },
141
+ MarketplacePublisher: {
142
+ tenant: (parent, args, {
143
+ tenantDataLoader
144
+ }) => {
145
+ // Implement tenant resolver logic here
146
+ const tenantId = String(parent.tenant || '');
147
+ if (!tenantId) {
148
+ return null;
149
+ }
150
+ return tenantDataLoader.load(tenantId);
151
+ },
152
+ extensionCount: root => root.extensionCount || 0,
153
+ totalDownloads: root => root.totalDownloads || 0,
154
+ viewerCanManage: () => false,
155
+ // TODO: Implement proper authorization logic
156
+ // Analytics computed from time series collection
157
+ async stats(root, args, {
158
+ publisherEventService
159
+ }) {
160
+ if (logger) {
161
+ logger.debug('Computing publisher stats for publisherId [%s]', root.id);
162
+ }
163
+ return publisherEventService.getPublisherStats(root.id);
164
+ },
165
+ async analytics(root, args, {
166
+ publisherEventService
167
+ }) {
168
+ if (logger) {
169
+ logger.debug('Computing publisher analytics for publisherId [%s], period [%s - %s]', root.id, args.startDate, args.endDate);
170
+ }
171
+ return publisherEventService.getPublisherAnalytics(root.id, new Date(args.startDate), new Date(args.endDate), args.granularity);
172
+ },
173
+ async trends(root, args, {
174
+ publisherEventService
175
+ }) {
176
+ if (logger) {
177
+ logger.debug('Computing publisher trends for publisherId [%s], days [%d]', root.id, args.days);
178
+ }
179
+ const result = await publisherEventService.getPublisherTrends(root.id, args.days);
180
+ return result;
181
+ }
182
+ }
183
+ });export{publisherResolver};//# sourceMappingURL=publisher-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-resolver.js","sources":["../../../src/graphql/resolvers/publisher-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"6CACS,MAAA,mCAAoC,MAAA;AAC7C,EAAA,KAAO,EACH;AAQJ,IAAA,MAAA,cAAa,CAAA,IAAA,EAAA,IAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry-extension-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/registry-extension-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAsB,UAAU,EAAE,MAAM,eAAe,CAAC;AAK/D,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UA+LpE,CAAC"}
1
+ {"version":3,"file":"registry-extension-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/registry-extension-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAsB,UAAU,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UAsDpE,CAAC"}
@@ -1,178 +1,45 @@
1
- import*as url from'url';/* eslint-disable no-unused-expressions */
2
- const bundleUrlGenerator = (extensionSlug, version) => url.resolve(process.env.BACKEND_URL, `_registry/${extensionSlug}/${version}`);
3
1
  const resolver = (pubsub, logger) => ({
4
- Contributes: {
5
- menus: root => {
6
- let result;
7
- // const manifest = JSON.parse(root.manifest);
8
- // console.log('manifest======>', manifest);
9
- const {
10
- menus
11
- } = root;
12
- console.log('menus=========>', menus);
13
- try {
14
- result = {
15
- commandPalette: menus.commandPalette || [],
16
- explorer: {
17
- context: menus['explorer/context'] || []
18
- },
19
- editor: {
20
- context: menus['editor/context'] || [],
21
- title: {
22
- own: menus['editor/title'] || [],
23
- context: menus['editor/title/context'] || []
24
- }
25
- },
26
- debug: {
27
- callstack: {
28
- context: menus['debug/callstack/context'] || []
29
- },
30
- toolbar: menus['debug/toolbar'] || []
31
- },
32
- scm: {
33
- title: menus['scm/title'] || [],
34
- resourceGroup: {
35
- context: menus['scm/resourceGroup/context'] || []
36
- },
37
- resource: {
38
- context: menus['scm/resource/context'] || []
39
- },
40
- change: {
41
- title: menus['scm/change/title'] || []
42
- }
43
- },
44
- view: {
45
- title: menus['view/title'] || [],
46
- item: {
47
- context: menus['view/item/context'] || []
48
- }
49
- },
50
- touchBar: menus.touchBar || []
51
- };
52
- } catch (err) {
53
- console.log('err', err);
54
- }
55
- console.log('result====>', result, result.editor);
56
- return result;
57
- }
58
- },
59
- ExtensionRegistry: {
60
- async extensions(root, args, ctx) {
61
- logger && logger.debug('args [%j]', args);
62
- const nodes = await ctx.registryExtensionService.findExtensions(args.first, args.query, args.local, args.remote, args.prioritizeExtensionIDs);
63
- return {
64
- nodes: nodes,
65
- pageInfo: {
66
- hasNextPage: false,
67
- hasPreviousPage: false
68
- },
69
- totalCount: nodes.length
70
- };
71
- },
72
- async extension(root, args, ctx) {
73
- return ctx.registryExtensionService.findExtension(args.extensionSlug);
74
- },
75
- async releases(root, args, ctx) {
76
- return ctx.registryExtensionService.extensionReleases(args.extensionSlug);
77
- },
78
- async publishers(root, args, ctx) {
79
- return {
80
- nodes: [],
81
- pageInfo: {
82
- hasNextPage: false,
83
- hasPreviousPage: false
84
- },
85
- totalCount: 0
86
- };
87
- },
88
- async viewerPublishers(root, args, ctx) {
89
- return [];
90
- },
91
- async localExtensionIDPrefix(root, args, ctx) {
92
- return null;
93
- }
94
- },
95
- ExtensionRelease: {
96
- bundleURL: root => bundleUrlGenerator(root.extensionSlug, root.version)
97
- },
98
- ExtensionManifest: {
99
- bundleURL: ({
100
- version,
101
- extensionSlug
102
- }) => bundleUrlGenerator(extensionSlug, version)
103
- },
104
2
  RegistryExtension: {
3
+ // Resolve manifest from the current release
105
4
  manifest: root => {
106
- let result;
107
- // console.log('root=================>', JSON.parse(root.manifest));
5
+ if (!root.releases || root.releases.length === 0) {
6
+ return null;
7
+ }
8
+ // Find the current release that matches the extension's version
9
+ const currentRelease = root.releases.find(release => release.version === root.version);
10
+ if (!currentRelease || !currentRelease.manifest) {
11
+ return null;
12
+ }
108
13
  try {
109
- result = {
110
- ...root.manifest,
111
- extensionSlug: root.extensionSlug,
112
- raw: JSON.stringify(root.manifest)
14
+ // Parse the manifest from the release (stored as JSON string)
15
+ const parsedManifest = typeof currentRelease.manifest === 'string' ? JSON.parse(currentRelease.manifest) : currentRelease.manifest;
16
+ return {
17
+ ...parsedManifest,
18
+ raw: currentRelease.manifest // Keep the original raw JSON for backwards compatibility
19
+ };
20
+ } catch (error) {
21
+ logger?.warn('Failed to parse extension manifest for', root.extensionSlug, ':', error);
22
+ // Fallback to raw string format for backwards compatibility
23
+ return {
24
+ raw: currentRelease.manifest
113
25
  };
114
- } catch (err) {
115
- result = {};
116
26
  }
117
- return result;
118
- },
119
- url: root => bundleUrlGenerator(root.extensionSlug, root.version)
120
- },
121
- Query: {
122
- // namespace for running all extension registry queries
123
- extensionRegistry() {
124
- return {};
125
- },
126
- /// DEPRECATED: Remove all fo the following resolvers as they moved to namespace ExtensionRegistry
127
- async extensions(root, args, ctx) {
128
- logger && logger.debug('args [%j]', args);
129
- const nodes = await ctx.registryExtensionService.findExtensions(args.first, args.query, args.local, args.remote, args.prioritizeExtensionIDs);
130
- // const res = { nodes: {...nodes, manifest: JSON.parse(nodes[0].manifest)} };
131
- // console.log('nodes==>', nodes);
132
- // nodes = nodes.map(el => {
133
- // return {
134
- // ...JSON.parse(JSON.stringify(el)),
135
- // manifest: JSON.parse(el.manifest),
136
- // };
137
- // });
138
- // console.log('nodes=======after>', nodes);
139
- return {
140
- nodes: nodes,
141
- pageInfo: {
142
- hasNextPage: false,
143
- hasPreviousPage: false
144
- },
145
- totalCount: nodes.length
146
- };
147
- },
148
- async extension(root, args, ctx) {
149
- return ctx.registryExtensionService.findExtension(args.extensionSlug);
150
27
  },
151
- async releases(root, args, ctx) {
152
- return ctx.registryExtensionService.extensionReleases(args.extensionSlug);
153
- }
154
- },
155
- Mutation: {
156
- async createExtension(root, args, ctx) {
157
- const extension = await ctx.registryExtensionService.createExtension(args.publisher, args.name);
158
- return extension;
159
- },
160
- updateExtension(root, args, ctx) {
161
- return ctx.registryExtensionService.updateExtensionName(args.extension, args.name);
162
- },
163
- async deleteExtension(root, args, ctx) {
164
- const result = await ctx.registryExtensionService.deleteExtension(args.extension);
165
- return {
166
- success: !!result,
167
- message: 'Extension deleted successfully'
168
- };
169
- },
170
- async publishExtension(root, args, ctx) {
171
- const extension = await ctx.registryExtensionService.publishExtension({
172
- ...args
173
- });
28
+ // Resolve releases
29
+ releases: root => root.releases || [],
30
+ // Resolve the current version directly from the extension
31
+ version: root => root.version || null,
32
+ // Resolve publisher
33
+ publisher: (root, args, ctx) => {
34
+ if (!root.publisher) {
35
+ return null;
36
+ }
37
+ // For now, return a basic publisher object - this should be replaced with proper dataloader
174
38
  return {
175
- extension: extension
39
+ id: String(root.publisher),
40
+ name: 'Publisher Name',
41
+ // This should come from the actual publisher data
42
+ __typename: 'RegistryPublisher'
176
43
  };
177
44
  }
178
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry-extension-resolver.js","sources":["../../../src/graphql/resolvers/registry-extension-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"wBAEA;AAEA,MAAA,kBAAyC,GAAM,gBAAgB,OAAA,KAAA,GAAA,CAAA,OAAA,CAAA,OAAA,CAAA,GAAA,CAAA,WAAA,EAAA,CAAA,UAAA,EAAA,aAAA,CAAA,CAAA,EAAA,OAAA,CAAA,CAAA,CAAA;AAK/D,MAAA,QAAa,GAAA,CAAA,MAAY,EAAA,MAAA,MAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"registry-extension-resolver.js","sources":["../../../src/graphql/resolvers/registry-extension-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAES,MAAA,QAAQ;AACjB,EAAA,iBAAkB,EAAE;AACpB;AAEA,IAAA,QAAA,EAAA,IAAO,IAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}