@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,86 @@
1
+ import { Service, ServiceBroker } from 'moleculer';
2
+ import { Container } from 'inversify';
3
+ /**
4
+ * Extension Moleculer Service Plugin
5
+ * Handles incoming Moleculer broadcasts for extension events and manages
6
+ * configuration registry for contributions and extensions
7
+ */
8
+ export declare class ExtensionMoleculerService extends Service {
9
+ private container;
10
+ constructor(broker: ServiceBroker, { container }: {
11
+ container: Container;
12
+ });
13
+ /**
14
+ * Register extension contributions to configuration registry
15
+ */
16
+ private registerExtensionContributions;
17
+ /**
18
+ * Unregister extension contributions from configuration registry
19
+ */
20
+ private unregisterExtensionContributions;
21
+ /**
22
+ * Activate extension contributions
23
+ */
24
+ private activateExtensionContributions;
25
+ /**
26
+ * Deactivate extension contributions
27
+ */
28
+ private deactivateExtensionContributions;
29
+ /**
30
+ * Update contribution state in registry
31
+ */
32
+ private updateContributionState;
33
+ /**
34
+ * Update extension configuration in registry
35
+ */
36
+ private updateExtensionConfiguration;
37
+ /**
38
+ * Refresh contribution configuration
39
+ */
40
+ private refreshContributionConfiguration;
41
+ /**
42
+ * Refresh extension contributions for new version
43
+ */
44
+ private refreshExtensionContributions;
45
+ /**
46
+ * Update contribution version in registry
47
+ */
48
+ private updateContributionVersion;
49
+ /**
50
+ * Handle orphaned extensions
51
+ */
52
+ private handleOrphanedExtensions;
53
+ /**
54
+ * Handle deprecated extensions
55
+ */
56
+ private handleDeprecatedExtensions;
57
+ /**
58
+ * Clean up contribution registry entries
59
+ */
60
+ private cleanupContributionRegistry;
61
+ /**
62
+ * Mark contributions as failed
63
+ */
64
+ private markContributionsAsFailed;
65
+ /**
66
+ * Mark contributions as deprecated
67
+ */
68
+ private markContributionsAsDeprecated;
69
+ /**
70
+ * Mark contributions as orphaned
71
+ */
72
+ private markContributionsAsOrphaned;
73
+ /**
74
+ * Get extension configuration
75
+ */
76
+ private getExtensionConfiguration;
77
+ /**
78
+ * Get extension contributions
79
+ */
80
+ private getExtensionContributions;
81
+ /**
82
+ * Get all active contributions for tenant
83
+ */
84
+ private getActiveContributions;
85
+ }
86
+ //# sourceMappingURL=extension-moleculer-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-moleculer-service.d.ts","sourceRoot":"","sources":["../../src/plugins/extension-moleculer-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAiBtC;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,OAAO;IAClD,OAAO,CAAC,SAAS,CAAY;gBAEjB,MAAM,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE;IA6Q1E;;OAEG;YACW,8BAA8B;IAc5C;;OAEG;YACW,gCAAgC;IAM9C;;OAEG;YACW,8BAA8B;IAM5C;;OAEG;YACW,gCAAgC;IAM9C;;OAEG;YACW,uBAAuB;IAMrC;;OAEG;YACW,4BAA4B;IAM1C;;OAEG;YACW,gCAAgC;IAM9C;;OAEG;YACW,6BAA6B;IAM3C;;OAEG;YACW,yBAAyB;IAMvC;;OAEG;YACW,wBAAwB;IAMtC;;OAEG;YACW,0BAA0B;IAMxC;;OAEG;YACW,2BAA2B;IAMzC;;OAEG;YACW,yBAAyB;IAMvC;;OAEG;YACW,6BAA6B;IAM3C;;OAEG;YACW,2BAA2B;IAMzC;;OAEG;YACW,yBAAyB;IAOvC;;OAEG;YACW,yBAAyB;IAOvC;;OAEG;YACW,sBAAsB;CAMvC"}
@@ -0,0 +1,2 @@
1
+ export * from './extension-moleculer-service';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { CdmLogger } from '@cdm-logger/core';
2
+ import { IGalleryExtension, IExtensionGalleryRepository, IGalleryQueryResult } from 'common/server';
3
+ export declare class ExtensionGalleryRepository implements IExtensionGalleryRepository {
4
+ private readonly logger;
5
+ constructor(logger: CdmLogger.ILogger);
6
+ asset<T>(extensionSlug: string, version: string, asset: string): Promise<T>;
7
+ private buildAssetUrl;
8
+ private fetchHttpAsset;
9
+ private readLocalAsset;
10
+ get(id: string, fields: string[]): Promise<IGalleryExtension[]>;
11
+ private validateFields;
12
+ download(extension: IGalleryExtension): Promise<boolean>;
13
+ private verifyDownloadUrl;
14
+ query(query: Record<string, unknown>): Promise<IGalleryQueryResult>;
15
+ private extractFilters;
16
+ }
17
+ //# sourceMappingURL=extension-gallery-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-gallery-repository.d.ts","sourceRoot":"","sources":["../../src/services/extension-gallery-repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAKpG,qBACa,0BAA2B,YAAW,2BAA2B;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,SAAS,CAAC,OAAO;IAI3D,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBxF,OAAO,CAAC,aAAa;YAOP,cAAc;YAoCd,cAAc;IAmBf,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA8B5E,OAAO,CAAC,cAAc;IA2BT,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;YA+BvD,iBAAiB;IAqBlB,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkChF,OAAO,CAAC,cAAc;CAYzB"}
@@ -0,0 +1,192 @@
1
+ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject}from'inversify';import'@cdm-logger/core';import*as fs from'fs';import*as https from'https';import*as http from'http';let ExtensionGalleryRepository = class ExtensionGalleryRepository {
2
+ logger;
3
+ constructor(logger) {
4
+ this.logger = logger;
5
+ this.logger = logger;
6
+ }
7
+ async asset(extensionSlug, version, asset) {
8
+ this.logger.trace('ExtensionGalleryRepository.asset: %s@%s/%s', extensionSlug, version, asset);
9
+ try {
10
+ // Try to fetch asset from different sources
11
+ const assetUrl = this.buildAssetUrl(extensionSlug, version, asset);
12
+ if (assetUrl.startsWith('http')) {
13
+ // Fetch from remote URL
14
+ return await this.fetchHttpAsset(assetUrl);
15
+ }
16
+ // Try to read from local filesystem
17
+ return await this.readLocalAsset(assetUrl);
18
+ } catch (error) {
19
+ this.logger.warn('Failed to fetch asset %s@%s/%s: %s', extensionSlug, version, asset, error.message);
20
+ return null;
21
+ }
22
+ }
23
+ buildAssetUrl(extensionSlug, version, asset) {
24
+ // Build URL based on common extension repository patterns
25
+ const baseUrl = process.env.EXTENSION_REGISTRY_URL || 'https://marketplace.visualstudio.com/_apis/public/gallery';
26
+ return `${baseUrl}/publishers/${extensionSlug}/vsextensions/${version}/vspackage/${asset}`;
27
+ }
28
+ async fetchHttpAsset(url) {
29
+ return new Promise((resolve, reject) => {
30
+ const client = url.startsWith('https') ? https : http;
31
+ const req = client.get(url, response => {
32
+ if (response.statusCode !== 200) {
33
+ reject(new Error(`HTTP ${response.statusCode}: ${response.statusMessage}`));
34
+ return;
35
+ }
36
+ let data = '';
37
+ response.setEncoding('utf8');
38
+ response.on('data', chunk => {
39
+ data += chunk;
40
+ });
41
+ response.on('end', () => {
42
+ try {
43
+ // Try to parse as JSON first, fallback to string
44
+ const result = data.startsWith('{') || data.startsWith('[') ? JSON.parse(data) : data;
45
+ resolve(result);
46
+ } catch (parseError) {
47
+ resolve(data);
48
+ }
49
+ });
50
+ });
51
+ req.on('error', error => {
52
+ reject(error);
53
+ });
54
+ req.setTimeout(10000, () => {
55
+ req.destroy();
56
+ reject(new Error('Request timeout'));
57
+ });
58
+ });
59
+ }
60
+ async readLocalAsset(filePath) {
61
+ return new Promise((resolve, reject) => {
62
+ fs.readFile(filePath, 'utf8', (err, data) => {
63
+ if (err) {
64
+ reject(err);
65
+ return;
66
+ }
67
+ try {
68
+ // Try to parse as JSON first, fallback to string
69
+ const result = data.startsWith('{') || data.startsWith('[') ? JSON.parse(data) : data;
70
+ resolve(result);
71
+ } catch (parseError) {
72
+ resolve(data);
73
+ }
74
+ });
75
+ });
76
+ }
77
+ async get(id, fields) {
78
+ this.logger.trace('ExtensionGalleryRepository.get: %s fields: %j', id, fields);
79
+ try {
80
+ // In a real implementation, this would:
81
+ // 1. Parse the ID (could be extension slug, UUID, etc.)
82
+ // 2. Query the database/registry for matching extensions
83
+ // 3. Apply field filtering to optimize response size
84
+ // 4. Handle multiple IDs if the id parameter supports it
85
+ // For now, we validate the inputs and return empty result
86
+ if (!id || !id.trim()) {
87
+ throw new Error('Extension ID is required');
88
+ }
89
+ // Validate fields array
90
+ const validFields = this.validateFields(fields);
91
+ this.logger.info('Looking for extension with ID: %s, fields: %j', id, validFields);
92
+ // This would be replaced with actual database/API query
93
+ const extensions = [];
94
+ return extensions;
95
+ } catch (error) {
96
+ this.logger.error('Failed to get extension %s: %s', id, error.message);
97
+ return [];
98
+ }
99
+ }
100
+ validateFields(fields) {
101
+ if (!fields || fields.length === 0) {
102
+ // Return default fields if none specified
103
+ return ['id', 'name', 'version', 'displayName', 'description', 'publisher'];
104
+ }
105
+ // Define allowed fields to prevent data leakage
106
+ const allowedFields = ['id', 'name', 'version', 'displayName', 'description', 'publisher', 'assets', 'categories', 'tags', 'statistics', 'releaseDate', 'lastUpdated', 'shortDescription', 'installCount'];
107
+ return fields.filter(field => allowedFields.includes(field));
108
+ }
109
+ async download(extension) {
110
+ this.logger.trace('ExtensionGalleryRepository.download: %s', extension.id);
111
+ try {
112
+ // Get download URL from extension assets
113
+ const downloadAsset = extension.assets?.download;
114
+ if (!downloadAsset?.uri) {
115
+ throw new Error('No download URL available');
116
+ }
117
+ // Verify the download is accessible
118
+ const isAccessible = await this.verifyDownloadUrl(downloadAsset.uri);
119
+ if (!isAccessible) {
120
+ throw new Error('Download URL is not accessible');
121
+ }
122
+ // In a real implementation, you might:
123
+ // 1. Download the file to a local cache
124
+ // 2. Verify the package integrity
125
+ // 3. Store download metrics
126
+ // 4. Return download stream or file path
127
+ this.logger.info('Extension %s download verified successfully', extension.id);
128
+ return true;
129
+ } catch (error) {
130
+ this.logger.error('Download failed for %s: %s', extension.id, error.message);
131
+ return false;
132
+ }
133
+ }
134
+ async verifyDownloadUrl(url) {
135
+ return new Promise(resolve => {
136
+ const client = url.startsWith('https') ? https : http;
137
+ const req = client.request(url, {
138
+ method: 'HEAD'
139
+ }, response => {
140
+ const isSuccess = response.statusCode >= 200 && response.statusCode < 300;
141
+ resolve(isSuccess);
142
+ });
143
+ req.on('error', () => {
144
+ resolve(false);
145
+ });
146
+ req.setTimeout(5000, () => {
147
+ req.destroy();
148
+ resolve(false);
149
+ });
150
+ req.end();
151
+ });
152
+ }
153
+ async query(query) {
154
+ this.logger.trace('ExtensionGalleryRepository.query: %j', query);
155
+ try {
156
+ // Extract common query parameters
157
+ const pageSize = Math.min(query.pageSize || 50, 100); // Cap at 100
158
+ // In a real implementation, this would:
159
+ // 1. Query a search engine (Elasticsearch, etc.)
160
+ // 2. Query a database with proper indexing
161
+ // 3. Call external APIs like VS Code Marketplace
162
+ // 4. Apply filters like: query.search, query.category, query.publisher, etc.
163
+ // For now, return a structured empty result with proper pagination
164
+ const mockResult = {
165
+ results: [],
166
+ total: 0,
167
+ pageSize
168
+ };
169
+ this.logger.info('Extension query completed: %d results', mockResult.total);
170
+ return mockResult;
171
+ } catch (error) {
172
+ this.logger.error('Extension query failed: %s', error.message);
173
+ // Return empty result on error
174
+ return {
175
+ results: [],
176
+ total: 0,
177
+ pageSize: 50
178
+ };
179
+ }
180
+ }
181
+ extractFilters(query) {
182
+ const filters = {};
183
+ // Extract common filter parameters
184
+ if (query.category) filters.category = query.category;
185
+ if (query.publisher) filters.publisher = query.publisher;
186
+ if (query.featured) filters.featured = query.featured;
187
+ if (query.verified) filters.verified = query.verified;
188
+ if (query.targetPlatform) filters.targetPlatform = query.targetPlatform;
189
+ return filters;
190
+ }
191
+ };
192
+ ExtensionGalleryRepository = __decorate([injectable(), __param(0, inject('Logger')), __metadata("design:paramtypes", [Object])], ExtensionGalleryRepository);export{ExtensionGalleryRepository};//# sourceMappingURL=extension-gallery-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-gallery-repository.js","sources":["../../src/services/extension-gallery-repository.ts"],"sourcesContent":[null],"names":[],"mappings":"iMAgCI,IAAA,0BAAqB,GAAA,MAAA,0BAAA,CAAA;;aA2CP,CAAA,MAAA,EAAA;AAmBD,IAAA,IAAI,CAAA,MAAI,GAAM,MAAE;AA8B7B,IAAA,IAAA,CAAA,MAAQ,GAAA,MAAA;;aA0DM,CAAA,aAAA,EAAiB,OAAA,EAAA,KAAA,EAAA;AAqBlB,IAAA,IAAA,CAAK,MAAM,CAAA,KAAE,CAAA,2DAAsD,EAAA,OAAA,EAAA,KAAA,CAAA;AAkChF,IAAA,IAAA;AAYH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,39 @@
1
+ import { CdmLogger } from '@cdm-logger/core';
2
+ import { IMarketplacePublisherService, IRegistryExtensionService, IGalleryExtension, IExtensionIdentifier, IExtensionManifest } from 'common/server';
3
+ export interface IExtensionGalleryService {
4
+ isEnabled(): boolean;
5
+ query(options?: any): Promise<any>;
6
+ getExtension(identifier: IExtensionIdentifier | string, version?: string): Promise<IGalleryExtension | null>;
7
+ download(extension: IGalleryExtension, operation: any): Promise<string>;
8
+ getReadme(extension: IGalleryExtension, token?: unknown): Promise<string>;
9
+ getManifest(extension: IGalleryExtension, token?: unknown): Promise<IExtensionManifest | null>;
10
+ getChangelog(extension: IGalleryExtension, token?: unknown): Promise<string>;
11
+ getLicense(extension: IGalleryExtension, token?: unknown): Promise<string>;
12
+ loadCompatibleVersion(extension: IGalleryExtension): Promise<IGalleryExtension>;
13
+ }
14
+ export declare class ExtensionGalleryService implements IExtensionGalleryService {
15
+ private readonly logger;
16
+ private readonly registryExtensionService;
17
+ private readonly publisherService;
18
+ private readonly disposables;
19
+ private readonly _onDidChange;
20
+ readonly onDidChange: import("@adminide-stack/core").Event<void>;
21
+ constructor(logger: CdmLogger.ILogger, registryExtensionService: IRegistryExtensionService, publisherService: IMarketplacePublisherService);
22
+ isEnabled(): boolean;
23
+ query(options?: any): Promise<any>;
24
+ getExtension(identifier: IExtensionIdentifier | string, version?: string): Promise<IGalleryExtension | null>;
25
+ download(extension: IGalleryExtension, operation: any): Promise<string>;
26
+ getReadme(extension: IGalleryExtension, token?: unknown): Promise<string>;
27
+ getManifest(extension: IGalleryExtension, token?: unknown): Promise<IExtensionManifest | null>;
28
+ getChangelog(extension: IGalleryExtension, token?: unknown): Promise<string>;
29
+ getLicense(extension: IGalleryExtension, token?: unknown): Promise<string>;
30
+ loadCompatibleVersion(extension: IGalleryExtension): Promise<IGalleryExtension>;
31
+ private toGalleryExtension;
32
+ /**
33
+ * Helper method to get manifest from the current release
34
+ * Since manifests are stored in releases, not directly in the registry extension
35
+ */
36
+ private getManifestFromRelease;
37
+ dispose(): void;
38
+ }
39
+ //# sourceMappingURL=extension-gallery-service-new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-gallery-service-new.d.ts","sourceRoot":"","sources":["../../src/services/extension-gallery-service-new.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACH,4BAA4B,EAC5B,yBAAyB,EAGzB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAIrB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,wBAAwB;IACrC,SAAS,IAAI,OAAO,CAAC;IACrB,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,YAAY,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC7G,QAAQ,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,SAAS,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,WAAW,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAC/F,YAAY,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,UAAU,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnF;AAED,qBACa,uBAAwB,YAAW,wBAAwB;IAO9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEzC,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IAEzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAVrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAEpD,SAAgB,WAAW,6CAA2B;gBAGf,MAAM,EAAE,SAAS,CAAC,OAAO,EAE3C,wBAAwB,EAAE,yBAAyB,EAEnD,gBAAgB,EAAE,4BAA4B;IAK5D,SAAS,IAAI,OAAO;IAId,KAAK,CAAC,OAAO,GAAE,GAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAkCtC,YAAY,CACrB,UAAU,EAAE,oBAAoB,GAAG,MAAM,EACzC,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAqBvB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvE,SAAS,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAOzE,WAAW,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAK9F,YAAY,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAO5E,UAAU,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAO1E,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAI9E,kBAAkB;IAwIhC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAoEvB,OAAO,IAAI,IAAI;CAGzB"}
@@ -0,0 +1,30 @@
1
+ import { CdmLogger } from '@cdm-logger/core';
2
+ import { IMarketplacePublisherService, IRegistryExtensionService, IGalleryExtension, IExtensionIdentifier, IExtensionManifest, IGalleryPager, IExtensionGalleryService, IQueryOptions, IExtensionGalleryRepository } from 'common/server';
3
+ export declare class ExtensionGalleryService implements IExtensionGalleryService {
4
+ private readonly logger;
5
+ private readonly registryExtensionService;
6
+ private readonly publisherService;
7
+ private readonly galleryRepository;
8
+ private readonly disposables;
9
+ private readonly _onDidChange;
10
+ readonly onDidChange: import("@adminide-stack/core").Event<void>;
11
+ constructor(logger: CdmLogger.ILogger, registryExtensionService: IRegistryExtensionService, publisherService: IMarketplacePublisherService, galleryRepository: IExtensionGalleryRepository);
12
+ isEnabled(): boolean;
13
+ query(options?: IQueryOptions): Promise<IGalleryPager>;
14
+ getExtension(identifier: IExtensionIdentifier | string): Promise<IGalleryExtension | null>;
15
+ download(extension: IGalleryExtension): Promise<string>;
16
+ getReadme(extension: IGalleryExtension): Promise<string>;
17
+ getManifest(extension: IGalleryExtension): Promise<IExtensionManifest | null>;
18
+ getChangelog(extension: IGalleryExtension): Promise<string>;
19
+ getLicense(extension: IGalleryExtension): Promise<string>;
20
+ loadCompatibleVersion(extension: IGalleryExtension): Promise<IGalleryExtension>;
21
+ private toGalleryExtension;
22
+ getAllVersions(extension: IGalleryExtension): Promise<IGalleryExtension[]>;
23
+ /**
24
+ * Helper method to get manifest from the current release
25
+ * Since manifests are stored in releases, not directly in the registry extension
26
+ */
27
+ private getManifestFromRelease;
28
+ dispose(): void;
29
+ }
30
+ //# sourceMappingURL=extension-gallery-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-gallery-service.d.ts","sourceRoot":"","sources":["../../src/services/extension-gallery-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACH,4BAA4B,EAC5B,yBAAyB,EAGzB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EAGb,wBAAwB,EACxB,aAAa,EACb,2BAA2B,EAC9B,MAAM,eAAe,CAAC;AAEvB,qBACa,uBAAwB,YAAW,wBAAwB;IAQ9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEzC,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IAEzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAbtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAE1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAEpD,SAAgB,WAAW,6CAA2B;gBAGf,MAAM,EAAE,SAAS,CAAC,OAAO,EAE3C,wBAAwB,EAAE,yBAAyB,EAEnD,gBAAgB,EAAE,4BAA4B,EAE9C,iBAAiB,EAAE,2BAA2B;IAK5D,SAAS,IAAI,OAAO;IAId,KAAK,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAkC1D,YAAY,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAqB1F,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBvD,SAAS,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBxD,WAAW,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAuB7E,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsB3D,UAAU,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBzD,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAsC9E,kBAAkB;IAwHnB,cAAc,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA2BvF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA2BvB,OAAO,IAAI,IAAI;CAGzB"}