@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.
- package/Readme.md +321 -0
- package/lib/containers/module.d.ts +8 -0
- package/lib/containers/module.d.ts.map +1 -1
- package/lib/containers/module.js +15 -5
- package/lib/containers/module.js.map +1 -1
- package/lib/dataloaders/index.d.ts +1 -0
- package/lib/dataloaders/index.d.ts.map +1 -0
- package/lib/demo/test-graphql-examples.d.ts +73 -0
- package/lib/demo/test-graphql-examples.d.ts.map +1 -0
- package/lib/graphql/resolvers/form-templates-resolver.d.ts +220 -0
- package/lib/graphql/resolvers/form-templates-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/form-templates-resolver.js +170 -0
- package/lib/graphql/resolvers/form-templates-resolver.js.map +1 -0
- package/lib/graphql/resolvers/gallery-resolver.d.ts +15 -0
- package/lib/graphql/resolvers/gallery-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/gallery-resolver.js +35 -0
- package/lib/graphql/resolvers/gallery-resolver.js.map +1 -0
- package/lib/graphql/resolvers/index.d.ts +247 -1
- package/lib/graphql/resolvers/index.d.ts.map +1 -1
- package/lib/graphql/resolvers/index.js +1 -0
- package/lib/graphql/resolvers/index.js.map +1 -0
- package/lib/graphql/resolvers/installed-extension-resolver.d.ts +5 -0
- package/lib/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/installed-extension-resolver.js +289 -0
- package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -0
- package/lib/graphql/resolvers/marketplace-form-resolver.d.ts +13 -0
- package/lib/graphql/resolvers/marketplace-form-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/marketplace-form-resolver.js +90 -0
- package/lib/graphql/resolvers/marketplace-form-resolver.js.map +1 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts +14 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.js +221 -0
- package/lib/graphql/resolvers/publisher-analytics-resolver.js.map +1 -0
- package/lib/graphql/resolvers/publisher-resolver.d.ts +5 -0
- package/lib/graphql/resolvers/publisher-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/publisher-resolver.js +176 -0
- package/lib/graphql/resolvers/publisher-resolver.js.map +1 -0
- package/lib/graphql/resolvers/registry-extension-resolver.d.ts +5 -0
- package/lib/graphql/resolvers/registry-extension-resolver.d.ts.map +1 -0
- package/lib/graphql/resolvers/registry-extension-resolver.js +46 -0
- package/lib/graphql/resolvers/registry-extension-resolver.js.map +1 -0
- package/lib/graphql/schemas/extension-pricing.graphql +546 -0
- package/lib/graphql/schemas/extension-pricing.graphql.js +1 -0
- package/lib/graphql/schemas/extension-pricing.graphql.js.map +1 -0
- package/lib/graphql/schemas/extension-registry.graphql +107 -0
- package/lib/graphql/schemas/extension-registry.graphql.js +1 -0
- package/lib/graphql/schemas/extension-registry.graphql.js.map +1 -0
- package/lib/graphql/schemas/form-templates.graphql +269 -0
- package/lib/graphql/schemas/form-templates.graphql.js +1 -0
- package/lib/graphql/schemas/form-templates.graphql.js.map +1 -0
- package/lib/graphql/schemas/gallery-schema.graphql +247 -0
- package/lib/graphql/schemas/gallery-schema.graphql.js +1 -0
- package/lib/graphql/schemas/gallery-schema.graphql.js.map +1 -0
- package/lib/graphql/schemas/index.d.ts.map +1 -1
- package/lib/graphql/schemas/index.js +3 -4
- package/lib/graphql/schemas/index.js.map +1 -1
- package/lib/graphql/schemas/installed-extension.graphql +309 -0
- package/lib/graphql/schemas/installed-extension.graphql.js +1 -0
- package/lib/graphql/schemas/installed-extension.graphql.js.map +1 -0
- package/lib/graphql/schemas/publisher-analytics.graphql +305 -0
- package/lib/graphql/schemas/publisher-analytics.graphql.js +1 -0
- package/lib/graphql/schemas/publisher-analytics.graphql.js.map +1 -0
- package/lib/graphql/schemas/publisher.graphql +376 -0
- package/lib/graphql/schemas/publisher.graphql.js +1 -0
- package/lib/graphql/schemas/publisher.graphql.js.map +1 -0
- package/lib/graphql/schemas/service.graphql +196 -0
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/module.d.ts +1 -1
- package/lib/module.d.ts.map +1 -1
- package/lib/module.js +10 -23
- package/lib/module.js.map +1 -1
- package/lib/plugins/extension-moleculer-service.d.ts +86 -0
- package/lib/plugins/extension-moleculer-service.d.ts.map +1 -0
- package/lib/plugins/index.d.ts +2 -0
- package/lib/plugins/index.d.ts.map +1 -0
- package/lib/services/extension-gallery-repository.d.ts +17 -0
- package/lib/services/extension-gallery-repository.d.ts.map +1 -0
- package/lib/services/extension-gallery-repository.js +192 -0
- package/lib/services/extension-gallery-repository.js.map +1 -0
- package/lib/services/extension-gallery-service-new.d.ts +39 -0
- package/lib/services/extension-gallery-service-new.d.ts.map +1 -0
- package/lib/services/extension-gallery-service.d.ts +30 -0
- package/lib/services/extension-gallery-service.d.ts.map +1 -0
- package/lib/services/extension-gallery-service.js +311 -0
- package/lib/services/extension-gallery-service.js.map +1 -0
- package/lib/services/index.d.ts +6 -1
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/installed-extension-service-ext.d.ts +16 -0
- package/lib/services/installed-extension-service-ext.d.ts.map +1 -0
- package/lib/services/installed-extension-service-ext.js +485 -0
- package/lib/services/installed-extension-service-ext.js.map +1 -0
- package/lib/services/installed-extension-service.d.ts +96 -0
- package/lib/services/installed-extension-service.d.ts.map +1 -0
- package/lib/services/installed-extension-service.js +521 -0
- package/lib/services/installed-extension-service.js.map +1 -0
- package/lib/services/installed-extension-service.test.d.ts +1 -0
- package/lib/services/installed-extension-service.test.d.ts.map +1 -0
- package/lib/services/publisher-analytics-service.d.ts +128 -0
- package/lib/services/publisher-analytics-service.d.ts.map +1 -0
- package/lib/services/publisher-event-service.d.ts +48 -0
- package/lib/services/publisher-event-service.d.ts.map +1 -0
- package/lib/services/publisher-event-service.js +296 -0
- package/lib/services/publisher-event-service.js.map +1 -0
- package/lib/services/publisher-service-context.d.ts +1 -0
- package/lib/services/publisher-service-context.d.ts.map +1 -0
- package/lib/services/publisher-service.d.ts +60 -0
- package/lib/services/publisher-service.d.ts.map +1 -0
- package/lib/services/publisher-service.js +134 -0
- package/lib/services/publisher-service.js.map +1 -0
- package/lib/store/index.d.ts +1 -1
- package/lib/store/index.d.ts.map +1 -1
- package/lib/store/models/index.d.ts +2 -1
- package/lib/store/models/index.d.ts.map +1 -1
- package/lib/store/models/installed-extension-model.d.ts +4 -0
- package/lib/store/models/installed-extension-model.d.ts.map +1 -0
- package/lib/store/models/installed-extension-model.js +269 -0
- package/lib/store/models/installed-extension-model.js.map +1 -0
- package/lib/store/models/publisher-event-model.d.ts +11 -0
- package/lib/store/models/publisher-event-model.d.ts.map +1 -0
- package/lib/store/models/publisher-model.d.ts +5 -0
- package/lib/store/models/publisher-model.d.ts.map +1 -0
- package/lib/store/models/publisher-model.js +103 -0
- package/lib/store/models/publisher-model.js.map +1 -0
- package/lib/store/models/publisher-stats-model.d.ts +1 -0
- package/lib/store/models/publisher-stats-model.d.ts.map +1 -0
- package/lib/store/repositories/index.d.ts +3 -0
- package/lib/store/repositories/index.d.ts.map +1 -0
- package/lib/store/repositories/installed-extension-repository.d.ts +73 -0
- package/lib/store/repositories/installed-extension-repository.d.ts.map +1 -0
- package/lib/store/repositories/installed-extension-repository.js +442 -0
- package/lib/store/repositories/installed-extension-repository.js.map +1 -0
- package/lib/store/repositories/publisher-analytics-repository.d.ts +1 -0
- package/lib/store/repositories/publisher-analytics-repository.d.ts.map +1 -0
- package/lib/store/repositories/publisher-repository.d.ts +19 -0
- package/lib/store/repositories/publisher-repository.d.ts.map +1 -0
- package/lib/store/repositories/publisher-repository.js +87 -0
- package/lib/store/repositories/publisher-repository.js.map +1 -0
- package/lib/templates/constants/DB_COLL_NAMES.ts.template +5 -0
- package/lib/templates/constants/SERVER_TYPES.ts.template +10 -4
- package/lib/templates/repositories/ExtensionGalleryRepository.ts.template +44 -0
- package/lib/templates/repositories/InstalledExtensionRepository.ts.template +94 -0
- package/lib/templates/repositories/MarketplacePublisherRepository.ts.template +24 -0
- package/lib/templates/repositories/RegistryExtensionRepository.ts.template +10 -15
- package/lib/templates/services/ExtensionGalleryDataLoader.ts.template +2 -0
- package/lib/templates/services/ExtensionGalleryService.ts.template +79 -0
- package/lib/templates/services/InstalledExtensionDataLoader.ts.template +2 -0
- package/lib/templates/services/InstalledExtensionService.ts.template +181 -0
- package/lib/templates/services/MarketplacePublisherService.ts.template +49 -0
- package/lib/templates/services/PublisherEventService.ts.template +56 -0
- package/lib/templates/services/RegistryExtensionService.ts.template +62 -18
- package/lib/tests/extension-integration.test.d.ts +1 -0
- package/lib/tests/extension-integration.test.d.ts.map +1 -0
- package/lib/tests/install-extension-graphql.test.d.ts +2 -0
- package/lib/tests/install-extension-graphql.test.d.ts.map +1 -0
- package/lib/tests/test-extension-services.d.ts +1 -0
- package/lib/tests/test-extension-services.d.ts.map +1 -0
- package/lib/utils/publisherValidation.d.ts +23 -0
- package/lib/utils/publisherValidation.d.ts.map +1 -0
- package/lib/utils/publisherValidation.js +144 -0
- package/lib/utils/publisherValidation.js.map +1 -0
- package/package.json +15 -7
- package/lib/graphql/resolvers/resolvers.d.ts +0 -2
- package/lib/graphql/resolvers/resolvers.d.ts.map +0 -1
- package/lib/graphql/resolvers/resolvers.js +0 -167
- package/lib/graphql/resolvers/resolvers.js.map +0 -1
- package/lib/graphql/schemas/extension.graphql +0 -57
- package/lib/graphql/schemas/extension.graphql.js +0 -1
- package/lib/graphql/schemas/extension.graphql.js.map +0 -1
- package/lib/services/extension-service.d.ts +0 -54
- package/lib/services/extension-service.d.ts.map +0 -1
- package/lib/services/extension-service.js +0 -42
- package/lib/services/extension-service.js.map +0 -1
- package/lib/store/models/registry-extension-model.d.ts +0 -10
- package/lib/store/models/registry-extension-model.d.ts.map +0 -1
- package/lib/store/models/registry-extension-model.js +0 -62
- package/lib/store/models/registry-extension-model.js.map +0 -1
- package/lib/store/repository/index.d.ts +0 -2
- package/lib/store/repository/index.d.ts.map +0 -1
- package/lib/store/repository/registry-extension-repository.d.ts +0 -31
- package/lib/store/repository/registry-extension-repository.d.ts.map +0 -1
- package/lib/store/repository/registry-extension-repository.js +0 -135
- 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 @@
|
|
|
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"}
|