@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.
- package/lib/containers/module.d.ts +4 -4
- package/lib/containers/module.d.ts.map +1 -1
- package/lib/containers/module.js +12 -7
- package/lib/containers/module.js.map +1 -1
- package/lib/dataloaders/index.d.ts +1 -1
- package/lib/dataloaders/index.d.ts.map +1 -1
- package/lib/dataloaders/publisher-data-loader.d.ts +6 -0
- package/lib/dataloaders/publisher-data-loader.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 -1
- package/lib/graphql/resolvers/installed-extension-resolver.d.ts.map +1 -1
- package/lib/graphql/resolvers/installed-extension-resolver.js +161 -35
- package/lib/graphql/resolvers/installed-extension-resolver.js.map +1 -1
- 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 +183 -0
- package/lib/graphql/resolvers/publisher-resolver.js.map +1 -0
- package/lib/graphql/resolvers/registry-extension-resolver.d.ts.map +1 -1
- package/lib/graphql/resolvers/registry-extension-resolver.js +34 -167
- package/lib/graphql/resolvers/registry-extension-resolver.js.map +1 -1
- 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 +91 -58
- package/lib/graphql/schemas/extension-registry.graphql.js +1 -1
- 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 -1
- package/lib/graphql/schemas/index.js.map +1 -1
- package/lib/graphql/schemas/installed-extension.graphql +37 -7
- package/lib/graphql/schemas/installed-extension.graphql.js +1 -1
- 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 +584 -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 +15 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts +20 -0
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.d.ts.map +1 -0
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js +61 -0
- package/lib/migrations/dbMigrations/DropOldPublisherIndexMigration.js.map +1 -0
- package/lib/migrations/index.d.ts +2 -0
- package/lib/migrations/index.d.ts.map +1 -0
- package/lib/module.d.ts +1 -1
- package/lib/module.d.ts.map +1 -1
- package/lib/module.js +11 -26
- package/lib/module.js.map +1 -1
- 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 +334 -0
- package/lib/services/extension-gallery-service.js.map +1 -0
- package/lib/services/index.d.ts +4 -1
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/installed-extension-service-ext.d.ts +5 -2
- package/lib/services/installed-extension-service-ext.d.ts.map +1 -1
- package/lib/services/installed-extension-service-ext.js +364 -117
- package/lib/services/installed-extension-service-ext.js.map +1 -1
- package/lib/services/installed-extension-service.d.ts +30 -13
- package/lib/services/installed-extension-service.d.ts.map +1 -1
- package/lib/services/installed-extension-service.js +301 -68
- package/lib/services/installed-extension-service.js.map +1 -1
- package/lib/services/installed-extension-service.test.d.ts +0 -1
- 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 +62 -0
- package/lib/services/publisher-service.d.ts.map +1 -0
- package/lib/services/publisher-service.js +135 -0
- package/lib/services/publisher-service.js.map +1 -0
- package/lib/store/models/index.d.ts +1 -1
- package/lib/store/models/index.d.ts.map +1 -1
- package/lib/store/models/installed-extension-model.d.ts.map +1 -1
- package/lib/store/models/installed-extension-model.js +17 -45
- package/lib/store/models/installed-extension-model.js.map +1 -1
- 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 +117 -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 +1 -1
- package/lib/store/repositories/index.d.ts.map +1 -1
- package/lib/store/repositories/installed-extension-repository.d.ts +17 -11
- package/lib/store/repositories/installed-extension-repository.d.ts.map +1 -1
- package/lib/store/repositories/installed-extension-repository.js +123 -75
- package/lib/store/repositories/installed-extension-repository.js.map +1 -1
- 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 +1 -1
- package/lib/templates/constants/SERVER_TYPES.ts.template +8 -5
- package/lib/templates/repositories/ExtensionGalleryRepository.ts.template +44 -0
- package/lib/templates/repositories/InstalledExtensionRepository.ts.template +19 -14
- package/lib/templates/repositories/MarketplacePublisherRepository.ts.template +24 -0
- package/lib/templates/repositories/RegistryExtensionRepository.ts.template +2 -2
- package/lib/templates/services/ExtensionGalleryDataLoader.ts.template +2 -0
- package/lib/templates/services/ExtensionGalleryService.ts.template +79 -0
- package/lib/templates/services/InstalledExtensionService.ts.template +63 -32
- package/lib/templates/services/MarketplacePublisherService.ts.template +51 -0
- package/lib/templates/services/PublisherDataLoader.ts.template +3 -0
- package/lib/templates/services/PublisherEventService.ts.template +56 -0
- package/lib/templates/services/RegistryExtensionService.ts.template +46 -2
- package/lib/tests/extension-integration.test.d.ts +0 -1
- 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/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 +13 -9
- package/lib/constants/extension-events.d.ts +0 -136
- package/lib/constants/extension-events.d.ts.map +0 -1
- package/lib/dataloaders/registry-extension-data-loader.d.ts +0 -6
- package/lib/dataloaders/registry-extension-data-loader.d.ts.map +0 -1
- package/lib/dataloaders/registry-extension-data-loader.js +0 -6
- package/lib/dataloaders/registry-extension-data-loader.js.map +0 -1
- package/lib/graphql/schemas/service.graphql.js +0 -1
- package/lib/graphql/schemas/service.graphql.js.map +0 -1
- package/lib/services/extension-service.d.ts +0 -42
- package/lib/services/extension-service.d.ts.map +0 -1
- package/lib/services/extension-service.js +0 -60
- package/lib/services/extension-service.js.map +0 -1
- package/lib/store/models/registry-extension-model.d.ts +0 -5
- package/lib/store/models/registry-extension-model.d.ts.map +0 -1
- package/lib/store/models/registry-extension-model.js +0 -83
- package/lib/store/models/registry-extension-model.js.map +0 -1
- package/lib/store/repositories/registry-extension-repository.d.ts +0 -54
- package/lib/store/repositories/registry-extension-repository.d.ts.map +0 -1
- package/lib/store/repositories/registry-extension-repository.js +0 -137
- package/lib/store/repositories/registry-extension-repository.js.map +0 -1
- 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 @@
|
|
|
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
package/lib/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"
|
|
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 {
|
|
2
|
-
container.get(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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: [
|
|
15
|
-
|
|
16
|
-
|
|
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"}
|