@adminide-stack/marketplace-module-server 12.0.4-alpha.417 → 12.0.4-alpha.423

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.
@@ -1 +1 @@
1
- {"version":3,"file":"installed-extension-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAuB,UAAU,EAA0C,MAAM,eAAe,CAAC;AAExG,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UAyVpE,CAAC"}
1
+ {"version":3,"file":"installed-extension-resolver.d.ts","sourceRoot":"","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAuB,UAAU,EAA0C,MAAM,eAAe,CAAC;AAExG,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,OAAO,KAAG,UAsXpE,CAAC"}
@@ -284,6 +284,26 @@ const resolver = (pubsub, logger) => ({
284
284
  result,
285
285
  message: args.dryRun ? 'Cleanup preview completed' : `Cleanup completed: ${result.removed.length} removed, ${result.deprecated.length} deprecated`
286
286
  };
287
+ },
288
+ /**
289
+ * Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry
290
+ */
291
+ async cleanupOrphanedExtensions(root, args, {
292
+ userContext,
293
+ installedExtensionService,
294
+ slugService
295
+ }) {
296
+ let orgId;
297
+ if (args.orgName) {
298
+ orgId = await slugService.resolveOrganizationSlug(args.orgName);
299
+ }
300
+ const result = await installedExtensionService.cleanupOrphanedExtensions(orgId, userContext.tenantId, args.dryRun || false);
301
+ return {
302
+ success: true,
303
+ removed: result.removed,
304
+ warnings: result.warnings,
305
+ message: args.dryRun ? `Preview: ${result.removed.length} orphaned extension(s) would be removed` : `Cleanup completed: ${result.removed.length} orphaned extension(s) removed`
306
+ };
287
307
  }
288
308
  }
289
309
  });export{resolver};//# sourceMappingURL=installed-extension-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installed-extension-resolver.js","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAES,MAAA,QAAQ;AACjB,EAAA,kBAAoB,EAAA;AACpB,IAAA,YAA8B,EAAA,CAAU,IAA0C,EAAA,mBAAsB,KAAA;AAExG,MAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"installed-extension-resolver.js","sources":["../../../src/graphql/resolvers/installed-extension-resolver.ts"],"sourcesContent":[null],"names":[],"mappings":"AAES,MAAA,QAAQ;AACjB,EAAA,kBAAoB,EAAA;AACpB,IAAA,YAA8B,EAAA,CAAU,IAA0C,EAAA,mBAAsB,KAAA;AAExG,MAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -249,6 +249,16 @@ type ExtensionSyncResponse {
249
249
  message: String!
250
250
  }
251
251
 
252
+ """
253
+ Response type for orphaned extension cleanup
254
+ """
255
+ type OrphanedExtensionCleanupResponse {
256
+ success: Boolean!
257
+ message: String!
258
+ removed: [String!]!
259
+ warnings: [String!]!
260
+ }
261
+
252
262
  extend type Query {
253
263
  """
254
264
  Get all installed extensions for the current tenant
@@ -306,4 +316,9 @@ extend type Mutation {
306
316
  Clean up deprecated or removed extensions
307
317
  """
308
318
  cleanupExtensions(dryRun: Boolean): ExtensionCleanupResponse!
319
+
320
+ """
321
+ Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry
322
+ """
323
+ cleanupOrphanedExtensions(dryRun: Boolean, orgName: String): OrphanedExtensionCleanupResponse!
309
324
  }
@@ -1 +1 @@
1
- var installedExtensionSchema = "\"\"\"\nInstalled extension status enumeration\n\"\"\"\nenum InstalledExtensionStatus {\n installed\n deprecated_installed\n suspended\n orphaned\n force_disabled\n}\n\n\"\"\"\nRegistry status cached from extensionRegistry\n\"\"\"\nenum ExtensionRegistryStatus {\n active\n deprecated\n suspended\n removed\n emergency_removed\n}\n\n\"\"\"\nRuntime activation state\n\"\"\"\nenum ExtensionActivationState {\n enabled\n disabled\n disabled_by_user\n disabled_by_admin\n disabled_by_policy\n}\n\n\"\"\"\nExtension lifecycle management information\n\"\"\"\ntype ExtensionLifecycle @entity(embedded: true) {\n registryStatus: ExtensionRegistryStatus! @column\n isOrphaned: Boolean! @column\n deprecationWarningShown: Boolean! @column\n autoUpdateBlocked: Boolean! @column\n lastRegistryCheck: String! @column\n}\n\n\"\"\"\nAdmin policies for extension behavior\n\"\"\"\ntype ExtensionPolicies @entity(embedded: true) {\n allowOrphanedExecution: Boolean! @column\n requireSecurityUpdates: Boolean! @column\n autoRemoveDeprecated: Boolean! @column\n deprecationGracePeriod: Int! @column\n}\n\n\"\"\"\nExtension settings for user preferences and system state\n\"\"\"\ntype ExtensionSettings @entity(embedded: true) {\n userEnabled: Boolean! @column\n systemEnabled: Boolean! @column\n effectiveEnabled: Boolean! @column\n userConfig: JSON @column\n systemConfig: JSON @column\n}\n\n\"\"\"\nRuntime activation error information\n\"\"\"\ntype ExtensionActivationError @entity(embedded: true) {\n message: String! @column\n code: String! @column\n timestamp: String! @column\n}\n\n\"\"\"\nPerformance metrics\n\"\"\"\ntype ExtensionMetrics @entity(embedded: true) {\n activationTime: Float! @column\n memoryUsage: Float! @column\n lastMeasured: String! @column\n}\n\n\"\"\"\nRuntime information about extension execution\n\"\"\"\ntype ExtensionRuntime @entity(embedded: true) {\n activationState: ExtensionActivationState! @column\n lastActivated: DateTime @column(overrideType: \"Date\")\n lastDeactivated: DateTime @column(overrideType: \"Date\")\n activationError: ExtensionActivationError @embedded\n metrics: ExtensionMetrics @embedded\n}\n\n\"\"\"\nAudit log entry for extension actions\n\"\"\"\ntype ExtensionAuditEntry @entity(embedded: true) {\n action: String! @column\n timestamp: DateTime! @column(overrideType: \"Date\")\n user: UserAccount! @column(overrideType: \"ObjectId\")\n details: JSON @column\n}\n\n\"\"\"\nMain installed extension type\n\"\"\"\ntype InstalledExtension implements Node @entity {\n id: ID! @id\n organization: Organization @column(overrideType: \"ObjectId\")\n extension: RegistryExtension! @column(overrideType: \"ObjectId\")\n installedVersion: String! @column\n status: InstalledExtensionStatus! @column\n lifecycle: ExtensionLifecycle! @embedded\n policies: ExtensionPolicies! @embedded\n settings: ExtensionSettings! @embedded\n runtime: ExtensionRuntime! @embedded\n installedAt: DateTime! @column(overrideType: \"Date\")\n installedBy: UserAccount! @column(overrideType: \"ObjectId\")\n lastUpdated: DateTime @column(overrideType: \"Date\")\n lastUpdatedBy: UserAccount @column(overrideType: \"ObjectId\")\n availableVersion: String @column\n dependencies: [String!] @column\n dependents: [String!] @column\n auditLog: [ExtensionAuditEntry!] @embedded\n \"\"\"The source database collection this installed extension references\"\"\"\n sourceCollection: String @column\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String @column\n \"\"\"Additional metadata for the installed extension\"\"\"\n metadata: JSON @column\n \"\"\"The actual document from the source collection (resolved via DataLoader, returns null if not found or no reference)\"\"\"\n sourceDocument: JSON\n}\n\n\"\"\"\nRegistry information for display\n\"\"\"\ntype ExtensionRegistryInfo {\n displayName: String!\n description: String!\n publisher: String!\n latestVersion: String!\n tags: [String!]!\n categories: [String!]!\n deprecation: JSON\n suspension: JSON\n}\n\n\"\"\"\nNotification action\n\"\"\"\ntype NotificationAction {\n label: String!\n action: String!\n url: String\n extensionSlug: String\n}\n\n\"\"\"\nExtension notification\n\"\"\"\ntype ExtensionNotification {\n type: String!\n severity: String!\n message: String!\n actions: [NotificationAction!]\n}\n\n\"\"\"\nExtension update information\n\"\"\"\ntype ExtensionUpdate {\n extensionSlug: String!\n currentVersion: String!\n availableVersion: String!\n isSecurityUpdate: Boolean!\n}\n\n\"\"\"\nExtension cleanup result\n\"\"\"\ntype ExtensionCleanupResult {\n removed: [String!]!\n deprecated: [String!]!\n warnings: [String!]!\n}\n\n\"\"\"\nInput for installing an extension\n\"\"\"\ninput InstallExtensionInput {\n extensionSlug: String!\n version: String!\n orgName: String\n policies: ExtensionPoliciesInput\n settings: ExtensionSettingsInput\n \"\"\"The source database collection this extension references\"\"\"\n sourceCollection: String\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String\n \"\"\"Additional metadata for the installation\"\"\"\n metadata: JSON\n}\n\n\"\"\"\nInput for extension policies\n\"\"\"\ninput ExtensionPoliciesInput {\n allowOrphanedExecution: Boolean\n requireSecurityUpdates: Boolean\n autoRemoveDeprecated: Boolean\n deprecationGracePeriod: Int\n}\n\n\"\"\"\nInput for extension settings\n\"\"\"\ninput ExtensionSettingsInput {\n userEnabled: Boolean\n systemEnabled: Boolean\n userConfig: JSON\n systemConfig: JSON\n}\n\n\"\"\"\nResponse type for extension mutations\n\"\"\"\ntype ExtensionMutationResponse {\n success: Boolean!\n extension: InstalledExtension\n message: String!\n}\n\n\"\"\"\nResponse type for cleanup operations\n\"\"\"\ntype ExtensionCleanupResponse {\n success: Boolean!\n result: ExtensionCleanupResult\n message: String!\n}\n\n\"\"\"\nResponse type for sync operations\n\"\"\"\ntype ExtensionSyncResponse {\n success: Boolean!\n message: String!\n}\n\nextend type Query {\n \"\"\"\n Get all installed extensions for the current tenant\n \"\"\"\n installedExtensions(enabled: Boolean, orgName: String): [InstalledExtension!]!\n\n \"\"\"\n Get a specific installed extension\n \"\"\"\n installedExtension(extensionSlug: String!): InstalledExtension\n\n \"\"\"\n Get installed extensions that need attention\n \"\"\"\n extensionsNeedingAttention: [InstalledExtension!]!\n\n \"\"\"\n Check for available updates\n \"\"\"\n extensionUpdates(extensionSlug: String): [ExtensionUpdate!]!\n}\n\nextend type Mutation {\n \"\"\"\n Install an extension from the registry\n \"\"\"\n installExtension(input: InstallExtensionInput!): ExtensionMutationResponse!\n\n \"\"\"\n Uninstall an extension\n \"\"\"\n uninstallExtension(extensionSlug: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Enable or disable an extension\n \"\"\"\n toggleExtension(extensionSlug: String!, enabled: Boolean!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update extension settings\n \"\"\"\n updateExtensionSettings(extensionSlug: String!, settings: JSON!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update an extension to a newer version\n \"\"\"\n updateExtensionVersion(extensionSlug: String!, version: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Sync installed extensions with registry\n \"\"\"\n syncExtensionsWithRegistry: ExtensionSyncResponse!\n\n \"\"\"\n Clean up deprecated or removed extensions\n \"\"\"\n cleanupExtensions(dryRun: Boolean): ExtensionCleanupResponse!\n}\n";export{installedExtensionSchema as default};//# sourceMappingURL=installed-extension.graphql.js.map
1
+ var installedExtensionSchema = "\"\"\"\nInstalled extension status enumeration\n\"\"\"\nenum InstalledExtensionStatus {\n installed\n deprecated_installed\n suspended\n orphaned\n force_disabled\n}\n\n\"\"\"\nRegistry status cached from extensionRegistry\n\"\"\"\nenum ExtensionRegistryStatus {\n active\n deprecated\n suspended\n removed\n emergency_removed\n}\n\n\"\"\"\nRuntime activation state\n\"\"\"\nenum ExtensionActivationState {\n enabled\n disabled\n disabled_by_user\n disabled_by_admin\n disabled_by_policy\n}\n\n\"\"\"\nExtension lifecycle management information\n\"\"\"\ntype ExtensionLifecycle @entity(embedded: true) {\n registryStatus: ExtensionRegistryStatus! @column\n isOrphaned: Boolean! @column\n deprecationWarningShown: Boolean! @column\n autoUpdateBlocked: Boolean! @column\n lastRegistryCheck: String! @column\n}\n\n\"\"\"\nAdmin policies for extension behavior\n\"\"\"\ntype ExtensionPolicies @entity(embedded: true) {\n allowOrphanedExecution: Boolean! @column\n requireSecurityUpdates: Boolean! @column\n autoRemoveDeprecated: Boolean! @column\n deprecationGracePeriod: Int! @column\n}\n\n\"\"\"\nExtension settings for user preferences and system state\n\"\"\"\ntype ExtensionSettings @entity(embedded: true) {\n userEnabled: Boolean! @column\n systemEnabled: Boolean! @column\n effectiveEnabled: Boolean! @column\n userConfig: JSON @column\n systemConfig: JSON @column\n}\n\n\"\"\"\nRuntime activation error information\n\"\"\"\ntype ExtensionActivationError @entity(embedded: true) {\n message: String! @column\n code: String! @column\n timestamp: String! @column\n}\n\n\"\"\"\nPerformance metrics\n\"\"\"\ntype ExtensionMetrics @entity(embedded: true) {\n activationTime: Float! @column\n memoryUsage: Float! @column\n lastMeasured: String! @column\n}\n\n\"\"\"\nRuntime information about extension execution\n\"\"\"\ntype ExtensionRuntime @entity(embedded: true) {\n activationState: ExtensionActivationState! @column\n lastActivated: DateTime @column(overrideType: \"Date\")\n lastDeactivated: DateTime @column(overrideType: \"Date\")\n activationError: ExtensionActivationError @embedded\n metrics: ExtensionMetrics @embedded\n}\n\n\"\"\"\nAudit log entry for extension actions\n\"\"\"\ntype ExtensionAuditEntry @entity(embedded: true) {\n action: String! @column\n timestamp: DateTime! @column(overrideType: \"Date\")\n user: UserAccount! @column(overrideType: \"ObjectId\")\n details: JSON @column\n}\n\n\"\"\"\nMain installed extension type\n\"\"\"\ntype InstalledExtension implements Node @entity {\n id: ID! @id\n organization: Organization @column(overrideType: \"ObjectId\")\n extension: RegistryExtension! @column(overrideType: \"ObjectId\")\n installedVersion: String! @column\n status: InstalledExtensionStatus! @column\n lifecycle: ExtensionLifecycle! @embedded\n policies: ExtensionPolicies! @embedded\n settings: ExtensionSettings! @embedded\n runtime: ExtensionRuntime! @embedded\n installedAt: DateTime! @column(overrideType: \"Date\")\n installedBy: UserAccount! @column(overrideType: \"ObjectId\")\n lastUpdated: DateTime @column(overrideType: \"Date\")\n lastUpdatedBy: UserAccount @column(overrideType: \"ObjectId\")\n availableVersion: String @column\n dependencies: [String!] @column\n dependents: [String!] @column\n auditLog: [ExtensionAuditEntry!] @embedded\n \"\"\"The source database collection this installed extension references\"\"\"\n sourceCollection: String @column\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String @column\n \"\"\"Additional metadata for the installed extension\"\"\"\n metadata: JSON @column\n \"\"\"The actual document from the source collection (resolved via DataLoader, returns null if not found or no reference)\"\"\"\n sourceDocument: JSON\n}\n\n\"\"\"\nRegistry information for display\n\"\"\"\ntype ExtensionRegistryInfo {\n displayName: String!\n description: String!\n publisher: String!\n latestVersion: String!\n tags: [String!]!\n categories: [String!]!\n deprecation: JSON\n suspension: JSON\n}\n\n\"\"\"\nNotification action\n\"\"\"\ntype NotificationAction {\n label: String!\n action: String!\n url: String\n extensionSlug: String\n}\n\n\"\"\"\nExtension notification\n\"\"\"\ntype ExtensionNotification {\n type: String!\n severity: String!\n message: String!\n actions: [NotificationAction!]\n}\n\n\"\"\"\nExtension update information\n\"\"\"\ntype ExtensionUpdate {\n extensionSlug: String!\n currentVersion: String!\n availableVersion: String!\n isSecurityUpdate: Boolean!\n}\n\n\"\"\"\nExtension cleanup result\n\"\"\"\ntype ExtensionCleanupResult {\n removed: [String!]!\n deprecated: [String!]!\n warnings: [String!]!\n}\n\n\"\"\"\nInput for installing an extension\n\"\"\"\ninput InstallExtensionInput {\n extensionSlug: String!\n version: String!\n orgName: String\n policies: ExtensionPoliciesInput\n settings: ExtensionSettingsInput\n \"\"\"The source database collection this extension references\"\"\"\n sourceCollection: String\n \"\"\"The ObjectId of the specific document in the source collection\"\"\"\n sourceDocumentId: String\n \"\"\"Additional metadata for the installation\"\"\"\n metadata: JSON\n}\n\n\"\"\"\nInput for extension policies\n\"\"\"\ninput ExtensionPoliciesInput {\n allowOrphanedExecution: Boolean\n requireSecurityUpdates: Boolean\n autoRemoveDeprecated: Boolean\n deprecationGracePeriod: Int\n}\n\n\"\"\"\nInput for extension settings\n\"\"\"\ninput ExtensionSettingsInput {\n userEnabled: Boolean\n systemEnabled: Boolean\n userConfig: JSON\n systemConfig: JSON\n}\n\n\"\"\"\nResponse type for extension mutations\n\"\"\"\ntype ExtensionMutationResponse {\n success: Boolean!\n extension: InstalledExtension\n message: String!\n}\n\n\"\"\"\nResponse type for cleanup operations\n\"\"\"\ntype ExtensionCleanupResponse {\n success: Boolean!\n result: ExtensionCleanupResult\n message: String!\n}\n\n\"\"\"\nResponse type for sync operations\n\"\"\"\ntype ExtensionSyncResponse {\n success: Boolean!\n message: String!\n}\n\n\"\"\"\nResponse type for orphaned extension cleanup\n\"\"\"\ntype OrphanedExtensionCleanupResponse {\n success: Boolean!\n message: String!\n removed: [String!]!\n warnings: [String!]!\n}\n\nextend type Query {\n \"\"\"\n Get all installed extensions for the current tenant\n \"\"\"\n installedExtensions(enabled: Boolean, orgName: String): [InstalledExtension!]!\n\n \"\"\"\n Get a specific installed extension\n \"\"\"\n installedExtension(extensionSlug: String!): InstalledExtension\n\n \"\"\"\n Get installed extensions that need attention\n \"\"\"\n extensionsNeedingAttention: [InstalledExtension!]!\n\n \"\"\"\n Check for available updates\n \"\"\"\n extensionUpdates(extensionSlug: String): [ExtensionUpdate!]!\n}\n\nextend type Mutation {\n \"\"\"\n Install an extension from the registry\n \"\"\"\n installExtension(input: InstallExtensionInput!): ExtensionMutationResponse!\n\n \"\"\"\n Uninstall an extension\n \"\"\"\n uninstallExtension(extensionSlug: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Enable or disable an extension\n \"\"\"\n toggleExtension(extensionSlug: String!, enabled: Boolean!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update extension settings\n \"\"\"\n updateExtensionSettings(extensionSlug: String!, settings: JSON!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Update an extension to a newer version\n \"\"\"\n updateExtensionVersion(extensionSlug: String!, version: String!, orgName: String): ExtensionMutationResponse!\n\n \"\"\"\n Sync installed extensions with registry\n \"\"\"\n syncExtensionsWithRegistry: ExtensionSyncResponse!\n\n \"\"\"\n Clean up deprecated or removed extensions\n \"\"\"\n cleanupExtensions(dryRun: Boolean): ExtensionCleanupResponse!\n \n \"\"\"\n Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry\n \"\"\"\n cleanupOrphanedExtensions(dryRun: Boolean, orgName: String): OrphanedExtensionCleanupResponse!\n}\n";export{installedExtensionSchema as default};//# sourceMappingURL=installed-extension.graphql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installed-extension-service-ext.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service-ext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAgBH,yBAAyB,EACzB,6BAA6B,EAO7B,YAAY,EACZ,kBAAkB,EACrB,MAAM,eAAe,CAAC;AAQvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AA0D1E;;;GAGG;AACH,qBACa,4BAA6B,SAAQ,yBAAyB;IAKnE,SAAS,CAAC,WAAW,EAAE,YAAY;IAEnC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,kBAAkB;gBALJ,UAAU,EAAE,6BAA6B,EAC7C,eAAe,EAAE,yBAAyB,EAEhF,WAAW,EAAE,YAAY,EAEhB,iBAAiB,EAAE,kBAAkB,EACnB,MAAM,EAAE,aAAa,EAC/B,MAAM,EAAE,SAAS,CAAC,OAAO;IAMxD,OAAO,CAAC,mBAAmB;YAoeb,SAAS;CA6C1B"}
1
+ {"version":3,"file":"installed-extension-service-ext.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service-ext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAgBH,yBAAyB,EACzB,6BAA6B,EAO7B,YAAY,EACZ,kBAAkB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AA0D1E;;;GAGG;AACH,qBACa,4BAA6B,SAAQ,yBAAyB;IAKnE,SAAS,CAAC,WAAW,EAAE,YAAY;IAEnC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,kBAAkB;gBALJ,UAAU,EAAE,6BAA6B,EAC7C,eAAe,EAAE,yBAAyB,EAEhF,WAAW,EAAE,YAAY,EAEhB,iBAAiB,EAAE,kBAAkB,EACnB,MAAM,EAAE,aAAa,EAC/B,MAAM,EAAE,SAAS,CAAC,OAAO;IAMxD,OAAO,CAAC,mBAAmB;YA6gBb,SAAS;CA8C1B"}
@@ -119,6 +119,7 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
119
119
  } else {
120
120
  console.log('No configuration contributions found in manifest');
121
121
  }
122
+ console.log('CONTRIBUTES========>', JSON.stringify(contributes));
122
123
  // Extract UILayout contributions if they exist (same structure as configuration)
123
124
  if (contributes && contributes.uiLayout) {
124
125
  console.log('UILayout contributions found, processing...');
@@ -160,29 +161,6 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
160
161
  } else {
161
162
  console.log('No extension found for:', event.extensionSlug);
162
163
  }
163
- // Add the extension's enabled/disabled state to configuration nodes
164
- // This tracks the extension status regardless of whether it has configuration contributions
165
- const extensionStatusNode = {
166
- id: ContributionFragmentName.Settings,
167
- title: `${registryExtension?.name || event.extensionSlug} Status`,
168
- description: `Extension enabled/disabled status for ${event.extensionSlug}`,
169
- properties: {
170
- [`extensions.${event.extensionSlug}`]: {
171
- type: 'boolean',
172
- default: true,
173
- // Default to enabled when installed
174
- description: `Enable/disable ${event.extensionSlug} extension`,
175
- scope: 3 /* ConfigurationScope.WINDOW */
176
- }
177
- },
178
- type: ['object'],
179
- extensionInfo: {
180
- id: event.extensionSlug,
181
- displayName: registryExtension?.name || event.extensionSlug
182
- }
183
- };
184
- // Add the extension status node to configurationNodes
185
- // configurationNodes.push(extensionStatusNode);
186
164
  // Create the configuration node data that configuration registry expects
187
165
  const configurationNode = {
188
166
  schemaId: ConfigurationSchemaId.Configuration,
@@ -208,14 +186,6 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
208
186
  });
209
187
  // STEP 1: MANDATORY - Register extension in system_extension FIRST (REQUIRED FOR ALL EXTENSIONS)
210
188
  console.log('\nšŸ”§ STEP 1: Registering extension in SYSTEM_EXTENSION (MANDATORY)');
211
- // Create separate configuration node for system extension status
212
- const systemExtensionNode = {
213
- schemaId: ConfigurationSchemaId.Configuration,
214
- tenantId: event.tenantId,
215
- extensionName: SystemContributionExtensionNames.SystemExtension,
216
- policyConfigs: null,
217
- configurationNodes: [extensionStatusNode]
218
- };
219
189
  const systemContext = {
220
190
  schemaId: ConfigurationSchemaId.Configuration,
221
191
  tenantId: event.tenantId,
@@ -224,13 +194,66 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
224
194
  };
225
195
  let systemExtensionRegistered = false;
226
196
  try {
227
- console.log('Broadcasting SYSTEM extension registry (MANDATORY)...');
228
- await this.broker.call('ConfigurationRegistryService.createConfigurationNodeRegistry', {
229
- data: systemExtensionNode,
197
+ console.log('Fetching current system_extension document...');
198
+ // Get existing system_extension document
199
+ const existingSystemDoc = await this.broker.call('ConfigurationRegistryService.getConfigurationNodeRegistry', {
200
+ context: systemContext
201
+ });
202
+ // Prepare the merged configuration node
203
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
204
+ const mergedNode = {
205
+ id: ContributionFragmentName.Settings,
206
+ type: ['object'],
207
+ properties: {},
208
+ restrictedProperties: []
209
+ };
210
+ // If document exists, merge existing properties
211
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
212
+ if (existingSystemDoc && existingSystemDoc.configurationNodes) {
213
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
214
+ const existingNodes = existingSystemDoc.configurationNodes || [];
215
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
216
+ const existingSettingsNode = existingNodes.find(
217
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
218
+ node => node.id === ContributionFragmentName.Settings);
219
+ if (existingSettingsNode?.properties) {
220
+ mergedNode.properties = {
221
+ ...existingSettingsNode.properties
222
+ };
223
+ const existingCount = Object.keys(existingSettingsNode.properties).length;
224
+ console.log(`šŸ“ Merging with ${existingCount} existing properties`);
225
+ }
226
+ } else {
227
+ console.log('šŸ“ Creating new system_extension document');
228
+ }
229
+ // Add/update the property for this extension
230
+ mergedNode.properties[`extensions.${event.extensionSlug}`] = {
231
+ type: 'boolean',
232
+ default: true,
233
+ description: `Enable/disable ${event.extensionSlug} extension`,
234
+ scope: 3 /* ConfigurationScope.WINDOW */
235
+ };
236
+ // Prepare final data
237
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
+ const finalSystemExtensionNode = {
239
+ schemaId: ConfigurationSchemaId.Configuration,
240
+ tenantId: event.tenantId,
241
+ extensionName: SystemContributionExtensionNames.SystemExtension,
242
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
243
+ policyConfigs: existingSystemDoc?.policyConfigs || null,
244
+ configurationNodes: [mergedNode],
245
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
246
+ configurationDefaults: existingSystemDoc?.configurationDefaults || []
247
+ };
248
+ // Use update if exists, create if new
249
+ const serviceMethod = existingSystemDoc ? 'ConfigurationRegistryService.updateConfigurationNodeRegistry' : 'ConfigurationRegistryService.createConfigurationNodeRegistry';
250
+ await this.broker.call(serviceMethod, {
251
+ data: finalSystemExtensionNode,
230
252
  context: systemContext
231
253
  });
232
254
  systemExtensionRegistered = true;
233
- console.log('āœ… STEP 1 SUCCESS: Extension registered in system_extension');
255
+ const totalExtensions = Object.keys(mergedNode.properties).length;
256
+ console.log(`āœ… STEP 1 SUCCESS: Extension registered (total: ${totalExtensions} extensions)`);
234
257
  } catch (systemError) {
235
258
  console.error('āŒ STEP 1 FAILED: System extension registration failed:', systemError);
236
259
  throw new Error(`Extension installation failed: Could not register in system (${systemError.message})`);
@@ -321,12 +344,21 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
321
344
  });
322
345
  if (currentSystemDoc && currentSystemDoc.configurationNodes) {
323
346
  const systemDoc = currentSystemDoc;
324
- // Filter out the specific extension's status node
347
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
325
348
  const configurationNodes = systemDoc.configurationNodes;
326
- const updatedConfigurationNodes = configurationNodes.filter(node => node.id !== ContributionFragmentName.Settings);
327
- console.log('Removing extension status node:', ContributionFragmentName.Settings);
328
- console.log(`Original nodes: ${configurationNodes.length}, After removal: ${updatedConfigurationNodes.length}`);
329
- // Update the system_extension document with the filtered nodes
349
+ // Find the settings node and remove the extension property
350
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
351
+ const settingsNode = configurationNodes.find(
352
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
353
+ node => node.id === ContributionFragmentName.Settings);
354
+ if (settingsNode?.properties) {
355
+ const propertyKey = `extensions.${event.extensionSlug}`;
356
+ delete settingsNode.properties[propertyKey];
357
+ console.log(`Removing extension property: ${propertyKey}`);
358
+ console.log(`Remaining properties: ${Object.keys(settingsNode.properties).length}`);
359
+ }
360
+ const updatedConfigurationNodes = configurationNodes;
361
+ // Update the system_extension document with the updated nodes
330
362
  const updatedSystemExtensionNode = {
331
363
  schemaId: ConfigurationSchemaId.Configuration,
332
364
  tenantId: event.tenantId,
@@ -453,6 +485,7 @@ let InstalledExtensionServiceExt = class InstalledExtensionServiceExt extends In
453
485
  console.log('Start dropping GraphQL query cache keys');
454
486
  try {
455
487
  // Get Redis client from redisCacheManager
488
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
456
489
  const {
457
490
  redisClient
458
491
  } = this.redisCacheManager;
@@ -1 +1 @@
1
- {"version":3,"file":"installed-extension-service-ext.js","sources":["../../src/services/installed-extension-service-ext.ts"],"sourcesContent":[null],"names":[],"mappings":"qbAmGG;AACH;;AAQQ;;AAQJ,EAAA,IAAA,OAAQ,KAAA,KAAA,QAAmB,EAAA;gBAoeb,CAAA;AA6CjB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"installed-extension-service-ext.js","sources":["../../src/services/installed-extension-service-ext.ts"],"sourcesContent":[null],"names":[],"mappings":"qbA4FG;AACH;;AAQQ;;AAQJ,EAAA,IAAA,OAAQ,KAAA,KAAA,QAAmB,EAAA;gBA6gBb,CAAA;AA8CjB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -88,6 +88,15 @@ export declare class InstalledExtensionService extends BaseService2<IInstalledEx
88
88
  deprecated: string[];
89
89
  warnings: string[];
90
90
  }>;
91
+ /**
92
+ * Sync installed_extensions with system_extension registry
93
+ * Removes extensions from installed_extensions and configuration_registries
94
+ * if they are not present in system_extension registry
95
+ */
96
+ cleanupOrphanedExtensions(orgId: string, tenantId: string, dryRun?: boolean): Promise<{
97
+ removed: string[];
98
+ warnings: string[];
99
+ }>;
91
100
  /**
92
101
  * Check if update is a security update (simplified logic)
93
102
  */
@@ -1 +1 @@
1
- {"version":3,"file":"installed-extension-service.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installed-extension-service.d.ts","sourceRoot":"","sources":["../../src/services/installed-extension-service.ts"],"names":[],"mappings":"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"}
@@ -509,6 +509,85 @@ let InstalledExtensionService = InstalledExtensionService_1 = class InstalledExt
509
509
  this.onExtensionCleanupCompleted.fire(event);
510
510
  return result;
511
511
  }
512
+ /**
513
+ * Sync installed_extensions with system_extension registry
514
+ * Removes extensions from installed_extensions and configuration_registries
515
+ * if they are not present in system_extension registry
516
+ */
517
+ async cleanupOrphanedExtensions(orgId, tenantId, dryRun) {
518
+ const result = {
519
+ removed: [],
520
+ warnings: []
521
+ };
522
+ console.log('šŸ” SYNC: Starting extension registry sync...');
523
+ console.log(` OrgId: ${orgId}, TenantId: ${tenantId}, DryRun: ${dryRun}`);
524
+ // Get all installed extensions
525
+ const extensions = await this.installedExtensionRepository.findExtensions({
526
+ orgId
527
+ });
528
+ console.log(` Found ${extensions.length} installed extensions`);
529
+ // Get system_extension document
530
+ const systemExtensionDoc = await this.broker.call('ConfigurationRegistryService.getConfigurationNodeRegistry', {
531
+ context: {
532
+ schemaId: 'configuration',
533
+ tenantId,
534
+ extensionName: 'system_extension'
535
+ }
536
+ });
537
+ // Get list of extensions in system_extension
538
+ const systemExtensionSlugs = new Set();
539
+ if (systemExtensionDoc && systemExtensionDoc.configurationNodes) {
540
+ const configNodes = systemExtensionDoc.configurationNodes || [];
541
+ const settingsNode = configNodes.find(node => node.id === 'settings');
542
+ if (settingsNode?.properties) {
543
+ Object.keys(settingsNode.properties).forEach(key => {
544
+ if (key.startsWith('extensions.')) {
545
+ const slug = key.replace('extensions.', '');
546
+ systemExtensionSlugs.add(slug);
547
+ }
548
+ });
549
+ }
550
+ }
551
+ console.log(` Found ${systemExtensionSlugs.size} extensions in system_extension registry`);
552
+ console.log(` System extensions:`, Array.from(systemExtensionSlugs));
553
+ // Check each installed extension
554
+ for (const extension of extensions) {
555
+ const extensionSlug = extension.extension?.extensionSlug || extension.extensionSlug;
556
+ // If extension is in installed_extensions but NOT in system_extension, it's orphaned
557
+ if (extensionSlug && !systemExtensionSlugs.has(extensionSlug)) {
558
+ console.log(`āš ļø Found orphaned installed_extension: ${extensionSlug} (not in system_extension)`);
559
+ if (!dryRun) {
560
+ try {
561
+ // Get the extension ID (registry reference) for deletion
562
+ const extensionId = String(extension.extension);
563
+ // Remove from installed_extensions
564
+ await this.installedExtensionRepository.deleteExtension(orgId, extensionId);
565
+ console.log(` āœ… Deleted from installed_extensions: ${extensionSlug}`);
566
+ // Remove uiLayout configuration from configuration_registries
567
+ await this.broker.call('ConfigurationRegistryService.removeConfigurationNodeRegistry', {
568
+ context: {
569
+ schemaId: 'uiLayout',
570
+ tenantId,
571
+ extensionName: extensionSlug
572
+ }
573
+ });
574
+ console.log(` āœ… Deleted uiLayout config: ${extensionSlug}`);
575
+ result.removed.push(extensionSlug);
576
+ } catch (cleanupError) {
577
+ console.error(` āŒ Failed to cleanup ${extensionSlug}:`, cleanupError);
578
+ result.warnings.push(`Failed to cleanup ${extensionSlug}: ${cleanupError.message}`);
579
+ }
580
+ } else {
581
+ console.log(` [DRY RUN] Would remove: ${extensionSlug}`);
582
+ result.removed.push(extensionSlug);
583
+ }
584
+ }
585
+ }
586
+ console.log('\nāœ… SYNC COMPLETE');
587
+ console.log(` Removed: ${result.removed.length} extensions`);
588
+ console.log(` Warnings: ${result.warnings.length} items`);
589
+ return result;
590
+ }
512
591
  /**
513
592
  * Check if update is a security update (simplified logic)
514
593
  */
@@ -1 +1 @@
1
- {"version":3,"file":"installed-extension-service.js","sources":["../../src/services/installed-extension-service.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installed-extension-service.js","sources":["../../src/services/installed-extension-service.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -178,4 +178,16 @@ export interface IInstalledExtensionService extends IBaseService<IInstalledExten
178
178
  deprecated: string[]; // Array of extension ObjectIds
179
179
  warnings: string[];
180
180
  }>;
181
+
182
+ /**
183
+ * Clean up orphaned extensions that exist in installed_extensions but not in system_extension registry
184
+ */
185
+ cleanupOrphanedExtensions(
186
+ orgId: string,
187
+ tenantId: string,
188
+ dryRun?: boolean,
189
+ ): Promise<{
190
+ removed: string[]; // Array of extension slugs
191
+ warnings: string[];
192
+ }>;
181
193
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/marketplace-module-server",
3
- "version": "12.0.4-alpha.417",
3
+ "version": "12.0.4-alpha.423",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "UNLICENSED",
6
6
  "author": "CDMBase LLC",
@@ -21,11 +21,11 @@
21
21
  "watch": "yarn build:lib:watch"
22
22
  },
23
23
  "dependencies": {
24
- "@adminide-stack/extension-api": "12.0.4-alpha.417",
24
+ "@adminide-stack/extension-api": "12.0.4-alpha.423",
25
25
  "nanoid": "^5.1.5"
26
26
  },
27
27
  "devDependencies": {
28
- "common": "12.0.4-alpha.417"
28
+ "common": "12.0.4-alpha.423"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "graphql-tag": ">=2.0.0"
@@ -57,5 +57,5 @@
57
57
  "typescript": {
58
58
  "definition": "lib/index.d.ts"
59
59
  },
60
- "gitHead": "837c9f8c7efd4fa22d1c6400feddea054e7df677"
60
+ "gitHead": "b3354cb147e8ed3a8c12b24a0304e97e82da23b8"
61
61
  }