@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,61 @@
1
+ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject}from'inversify';import'@cdm-logger/core';import {DB_COLL_NAMES}from'common/server';var DropOldPublisherNameIndexMigration_1;
2
+ /**
3
+ * Migration to drop the old publisherName_1 index from MarketplacePublisher collection.
4
+ *
5
+ * Ensures:
6
+ * - No duplicate index issues
7
+ * - Safe to run multiple times
8
+ * - Works across all tenant databases
9
+ */
10
+ let DropOldPublisherNameIndexMigration = DropOldPublisherNameIndexMigration_1 = class DropOldPublisherNameIndexMigration {
11
+ db;
12
+ // Unique migration ID (important: DO NOT change once deployed)
13
+ id = `${DropOldPublisherNameIndexMigration_1.name}_20251117`;
14
+ logger;
15
+ constructor(db, logger) {
16
+ this.db = db;
17
+ this.logger = logger.child({
18
+ className: DropOldPublisherNameIndexMigration_1.name
19
+ });
20
+ }
21
+ async up() {
22
+ this.logger.info('Starting DropOldPublisherNameIndexMigration...');
23
+ try {
24
+ const collection = this.db.collection(DB_COLL_NAMES.MarketplacePublisher);
25
+ // Fetch all indexes
26
+ const indexes = await collection.listIndexes().toArray();
27
+ const oldIndex = indexes.find(idx => idx.name === 'publisherName_1');
28
+ if (oldIndex) {
29
+ this.logger.info('Found old index publisherName_1. Dropping...');
30
+ await collection.dropIndex('publisherName_1');
31
+ this.logger.info('Successfully dropped publisherName_1 index.');
32
+ } else {
33
+ this.logger.info('No old index publisherName_1 found. Nothing to remove.');
34
+ }
35
+ } catch (error) {
36
+ this.logger.error('Failed to drop publisherName_1 index:', error);
37
+ throw error;
38
+ }
39
+ this.logger.info('DropOldPublisherNameIndexMigration completed successfully.');
40
+ }
41
+ async down() {
42
+ this.logger.info('Rollback for DropOldPublisherNameIndexMigration...');
43
+ try {
44
+ const collection = this.db.collection(DB_COLL_NAMES.MarketplacePublisher);
45
+ // Restore the old index (optional)
46
+ this.logger.info('Recreating publisherName_1 index...');
47
+ await collection.createIndex({
48
+ publisherName: 1
49
+ }, {
50
+ name: 'publisherName_1',
51
+ background: false
52
+ });
53
+ this.logger.info('publisherName_1 index recreated successfully.');
54
+ } catch (error) {
55
+ this.logger.error('Failed to recreate publisherName_1 index:', error);
56
+ throw error;
57
+ }
58
+ this.logger.info('Rollback completed.');
59
+ }
60
+ };
61
+ DropOldPublisherNameIndexMigration = DropOldPublisherNameIndexMigration_1 = __decorate([injectable(), __param(0, inject('MongoDBConnection')), __param(1, inject('Logger')), __metadata("design:paramtypes", [Function, Object])], DropOldPublisherNameIndexMigration);export{DropOldPublisherNameIndexMigration};//# sourceMappingURL=DropOldPublisherIndexMigration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropOldPublisherIndexMigration.js","sources":["../../../src/migrations/dbMigrations/DropOldPublisherIndexMigration.ts"],"sourcesContent":[null],"names":[],"mappings":"+JAAA,IAAA;;;;;;AAaG;AACH;;AAGI,IAAA,kCAA2D,GAAA,oCAAA,GAAA,MAAA,kCAAA,CAAA;AAE3D,EAAA,EAAA;AAIqB;AAOR,EAAA,EAAA,GAAE,CAAA,EAAI,oCAAa,CAAA,IAAA,CAAA,SAAA,CAAA;AA4BnB,EAAA,MAAI;AAyBpB,EAAA,WAAA,CAAA,EAAA,EAAA,MAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from './dbMigrations/DropOldPublisherIndexMigration';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,cAAc,+CAA+C,CAAC"}
package/lib/module.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { Feature } from '@common-stack/server-core';
2
- declare const _default: Feature<import("@common-stack/server-core").ConfigurationScope, any>;
2
+ declare const _default: Feature<any, any>;
3
3
  export default _default;
4
4
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;;AAiBpD,wBAuBG"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;;AAmBpD,wBAWG"}
package/lib/module.js CHANGED
@@ -1,31 +1,16 @@
1
- import {find,get}from'lodash-es';import {Feature}from'@common-stack/server-core';import {SERVER_TYPES}from'common/server';import {resolvers}from'./graphql/resolvers/index.js';import {schema}from'./graphql/schemas/index.js';import {extensionModule}from'./containers/module.js';const extensionServiceGen = container => {
2
- container.get('Environment');
3
- return {
4
- registryExtensionService: container.get(SERVER_TYPES.IRegistryExtensionService),
5
- installedExtensionService: container.get(SERVER_TYPES.IInstalledExtensionService),
6
- registryExtensionDataLoader: container.get(SERVER_TYPES.IRegistryExtensionDataLoader)
7
- };
8
- };
9
- var module = new Feature({
1
+ import {Feature}from'@common-stack/server-core';import {SERVER_TYPES}from'common/server';import {resolvers}from'./graphql/resolvers/index.js';import {schema}from'./graphql/schemas/index.js';import {extensionModule}from'./containers/module.js';const extensionServiceGen = container => ({
2
+ installedExtensionService: container.get(SERVER_TYPES.IInstalledExtensionService),
3
+ publisherEventService: container.get(SERVER_TYPES.IPublisherEventService),
4
+ marketplacePublisherService: container.get(SERVER_TYPES.IMarketplacePublisherService),
5
+ extensionGalleryService: container.get(SERVER_TYPES.IExtensionGalleryService)
6
+ });
7
+ var module$1 = new Feature({
10
8
  schema,
11
9
  createResolversFunc: resolvers,
12
10
  createContainerFunc: [extensionModule],
13
11
  createServiceFunc: extensionServiceGen,
14
- middleware: [app => {
15
- app.get('/_registry/:accountName/:extension/:version?', (req, res) => {
16
- // TODO: Add validation of all params exist or not.
17
- // for example, if `extension` is missing we should throw some valid error.
18
- req.services.registryExtensionService.findExtension(`${req.params.accountName}/${req.params.extension}`, req.params.version).then(data => {
19
- const release = find(data.releases, {
20
- version: req.params.version || data.version
21
- });
22
- const bundle = get(release, 'bundle');
23
- res.set('content-type', 'text/javascript');
24
- res.send(bundle);
25
- }).catch(err => res.status(500).json({
26
- ok: false,
27
- error: err.stack
28
- }));
29
- });
12
+ middleware: [() => {
13
+ // Registry extension middleware has been moved to the extension module
14
+ // This marketplace module now focuses on marketplace-specific functionality
30
15
  }]
31
- });export{module as default};//# sourceMappingURL=module.js.map
16
+ });export{module$1 as default};//# sourceMappingURL=module.js.map
package/lib/module.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"module.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
@@ -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;IA0InB,cAAc,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA2BvF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA8CvB,OAAO,IAAI,IAAI;CAGzB"}