@adobe/spacecat-shared-data-access 2.88.6 → 2.88.7

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/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [@adobe/spacecat-shared-data-access-v2.88.7](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v2.88.6...@adobe/spacecat-shared-data-access-v2.88.7) (2025-11-30)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * avoid static for esbuild ([#1195](https://github.com/adobe/spacecat-shared/issues/1195)) ([9ed69e3](https://github.com/adobe/spacecat-shared/commit/9ed69e3bb57d2f5fa84cb0ce60f4ab1a52a7bb70)), closes [#instance](https://github.com/adobe/spacecat-shared/issues/instance)
7
+
1
8
  # [@adobe/spacecat-shared-data-access-v2.88.6](https://github.com/adobe/spacecat-shared/compare/@adobe/spacecat-shared-data-access-v2.88.5...@adobe/spacecat-shared-data-access-v2.88.6) (2025-11-28)
2
9
 
3
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/spacecat-shared-data-access",
3
- "version": "2.88.6",
3
+ "version": "2.88.7",
4
4
  "description": "Shared modules of the Spacecat Services - Data Access",
5
5
  "type": "module",
6
6
  "engines": {
@@ -0,0 +1,122 @@
1
+ /*
2
+ * Copyright 2025 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ import { decapitalize } from '../../util/util.js';
14
+
15
+ // Import all schemas
16
+ import ApiKeySchema from '../api-key/api-key.schema.js';
17
+ import AsyncJobSchema from '../async-job/async-job.schema.js';
18
+ import AuditSchema from '../audit/audit.schema.js';
19
+ import ConfigurationSchema from '../configuration/configuration.schema.js';
20
+ import EntitlementSchema from '../entitlement/entitlement.schema.js';
21
+ import FixEntitySchema from '../fix-entity/fix-entity.schema.js';
22
+ import FixEntitySuggestionSchema from '../fix-entity-suggestion/fix-entity-suggestion.schema.js';
23
+ import ExperimentSchema from '../experiment/experiment.schema.js';
24
+ import ImportJobSchema from '../import-job/import-job.schema.js';
25
+ import ImportUrlSchema from '../import-url/import-url.schema.js';
26
+ import KeyEventSchema from '../key-event/key-event.schema.js';
27
+ import LatestAuditSchema from '../latest-audit/latest-audit.schema.js';
28
+ import OpportunitySchema from '../opportunity/opportunity.schema.js';
29
+ import OrganizationSchema from '../organization/organization.schema.js';
30
+ import ProjectSchema from '../project/project.schema.js';
31
+ import ScrapeJobSchema from '../scrape-job/scrape-job.schema.js';
32
+ import ScrapeUrlSchema from '../scrape-url/scrape-url.schema.js';
33
+ import SiteSchema from '../site/site.schema.js';
34
+ import SiteCandidateSchema from '../site-candidate/site-candidate.schema.js';
35
+ import SiteEnrollmentSchema from '../site-enrollment/site-enrollment.schema.js';
36
+ import SiteTopFormSchema from '../site-top-form/site-top-form.schema.js';
37
+ import SiteTopPageSchema from '../site-top-page/site-top-page.schema.js';
38
+ import SuggestionSchema from '../suggestion/suggestion.schema.js';
39
+ import PageIntentSchema from '../page-intent/page-intent.schema.js';
40
+ import ReportSchema from '../report/report.schema.js';
41
+ import TrialUserSchema from '../trial-user/trial-user.schema.js';
42
+ import TrialUserActivitySchema from '../trial-user-activity/trial-user-activity.schema.js';
43
+ import PageCitabilitySchema from '../page-citability/page-citability.schema.js';
44
+
45
+ // Import all collections
46
+ import ApiKeyCollection from '../api-key/api-key.collection.js';
47
+ import AsyncJobCollection from '../async-job/async-job.collection.js';
48
+ import AuditCollection from '../audit/audit.collection.js';
49
+ import ConfigurationCollection from '../configuration/configuration.collection.js';
50
+ import EntitlementCollection from '../entitlement/entitlement.collection.js';
51
+ import FixEntityCollection from '../fix-entity/fix-entity.collection.js';
52
+ import FixEntitySuggestionCollection from '../fix-entity-suggestion/fix-entity-suggestion.collection.js';
53
+ import ExperimentCollection from '../experiment/experiment.collection.js';
54
+ import ImportJobCollection from '../import-job/import-job.collection.js';
55
+ import ImportUrlCollection from '../import-url/import-url.collection.js';
56
+ import KeyEventCollection from '../key-event/key-event.collection.js';
57
+ import LatestAuditCollection from '../latest-audit/latest-audit.collection.js';
58
+ import OpportunityCollection from '../opportunity/opportunity.collection.js';
59
+ import OrganizationCollection from '../organization/organization.collection.js';
60
+ import ProjectCollection from '../project/project.collection.js';
61
+ import ScrapeJobCollection from '../scrape-job/scrape-job.collection.js';
62
+ import ScrapeUrlCollection from '../scrape-url/scrape-url.collection.js';
63
+ import SiteCollection from '../site/site.collection.js';
64
+ import SiteCandidateCollection from '../site-candidate/site-candidate.collection.js';
65
+ import SiteEnrollmentCollection from '../site-enrollment/site-enrollment.collection.js';
66
+ import SiteTopFormCollection from '../site-top-form/site-top-form.collection.js';
67
+ import SiteTopPageCollection from '../site-top-page/site-top-page.collection.js';
68
+ import SuggestionCollection from '../suggestion/suggestion.collection.js';
69
+ import PageIntentCollection from '../page-intent/page-intent.collection.js';
70
+ import ReportCollection from '../report/report.collection.js';
71
+ import TrialUserCollection from '../trial-user/trial-user.collection.js';
72
+ import TrialUserActivityCollection from '../trial-user-activity/trial-user-activity.collection.js';
73
+ import PageCitabilityCollection from '../page-citability/page-citability.collection.js';
74
+
75
+ /**
76
+ * Central registry of all entity definitions.
77
+ * This is a plain constant array with no side effects.
78
+ * Each entry pairs a schema with its collection class.
79
+ */
80
+ export const ENTITY_DEFINITIONS = [
81
+ { schema: ApiKeySchema, collection: ApiKeyCollection },
82
+ { schema: AsyncJobSchema, collection: AsyncJobCollection },
83
+ { schema: AuditSchema, collection: AuditCollection },
84
+ { schema: ConfigurationSchema, collection: ConfigurationCollection },
85
+ { schema: EntitlementSchema, collection: EntitlementCollection },
86
+ { schema: FixEntitySchema, collection: FixEntityCollection },
87
+ { schema: FixEntitySuggestionSchema, collection: FixEntitySuggestionCollection },
88
+ { schema: ExperimentSchema, collection: ExperimentCollection },
89
+ { schema: ImportJobSchema, collection: ImportJobCollection },
90
+ { schema: ImportUrlSchema, collection: ImportUrlCollection },
91
+ { schema: KeyEventSchema, collection: KeyEventCollection },
92
+ { schema: LatestAuditSchema, collection: LatestAuditCollection },
93
+ { schema: OpportunitySchema, collection: OpportunityCollection },
94
+ { schema: OrganizationSchema, collection: OrganizationCollection },
95
+ { schema: ProjectSchema, collection: ProjectCollection },
96
+ { schema: ScrapeJobSchema, collection: ScrapeJobCollection },
97
+ { schema: ScrapeUrlSchema, collection: ScrapeUrlCollection },
98
+ { schema: SiteSchema, collection: SiteCollection },
99
+ { schema: SiteCandidateSchema, collection: SiteCandidateCollection },
100
+ { schema: SiteEnrollmentSchema, collection: SiteEnrollmentCollection },
101
+ { schema: SiteTopFormSchema, collection: SiteTopFormCollection },
102
+ { schema: SiteTopPageSchema, collection: SiteTopPageCollection },
103
+ { schema: SuggestionSchema, collection: SuggestionCollection },
104
+ { schema: PageIntentSchema, collection: PageIntentCollection },
105
+ { schema: ReportSchema, collection: ReportCollection },
106
+ { schema: TrialUserSchema, collection: TrialUserCollection },
107
+ { schema: TrialUserActivitySchema, collection: TrialUserActivityCollection },
108
+ { schema: PageCitabilitySchema, collection: PageCitabilityCollection },
109
+ ];
110
+
111
+ /**
112
+ * Converts entity definitions to ElectroDB schema format.
113
+ * This is a pure function with no side effects.
114
+ *
115
+ * @returns {Object} Map of entity names to ElectroDB schemas
116
+ */
117
+ export function getEntitySchemas() {
118
+ return ENTITY_DEFINITIONS.reduce((acc, { schema }) => {
119
+ acc[decapitalize(schema.getEntityName())] = schema.toElectroDBSchema();
120
+ return acc;
121
+ }, {});
122
+ }
@@ -11,74 +11,17 @@
11
11
  */
12
12
 
13
13
  import { DataAccessError } from '../../errors/index.js';
14
- import { collectionNameToEntityName, decapitalize } from '../../util/util.js';
15
-
16
- import ApiKeyCollection from '../api-key/api-key.collection.js';
17
- import AsyncJobCollection from '../async-job/async-job.collection.js';
18
- import AuditCollection from '../audit/audit.collection.js';
19
- import ConfigurationCollection from '../configuration/configuration.collection.js';
20
- import ExperimentCollection from '../experiment/experiment.collection.js';
21
- import EntitlementCollection from '../entitlement/entitlement.collection.js';
22
- import FixEntityCollection from '../fix-entity/fix-entity.collection.js';
23
- import FixEntitySuggestionCollection from '../fix-entity-suggestion/fix-entity-suggestion.collection.js';
24
- import ImportJobCollection from '../import-job/import-job.collection.js';
25
- import ImportUrlCollection from '../import-url/import-url.collection.js';
26
- import KeyEventCollection from '../key-event/key-event.collection.js';
27
- import LatestAuditCollection from '../latest-audit/latest-audit.collection.js';
28
- import OpportunityCollection from '../opportunity/opportunity.collection.js';
29
- import OrganizationCollection from '../organization/organization.collection.js';
30
- import ProjectCollection from '../project/project.collection.js';
31
- import ScrapeJobCollection from '../scrape-job/scrape-job.collection.js';
32
- import ScrapeUrlCollection from '../scrape-url/scrape-url.collection.js';
33
- import SiteCandidateCollection from '../site-candidate/site-candidate.collection.js';
34
- import SiteCollection from '../site/site.collection.js';
35
- import SiteEnrollmentCollection from '../site-enrollment/site-enrollment.collection.js';
36
- import SiteTopFormCollection from '../site-top-form/site-top-form.collection.js';
37
- import SiteTopPageCollection from '../site-top-page/site-top-page.collection.js';
38
- import SuggestionCollection from '../suggestion/suggestion.collection.js';
39
- import PageIntentCollection from '../page-intent/page-intent.collection.js';
40
- import ReportCollection from '../report/report.collection.js';
41
- import TrialUserCollection from '../trial-user/trial-user.collection.js';
42
- import TrialUserActivityCollection from '../trial-user-activity/trial-user-activity.collection.js';
43
- import PageCitabilityCollection from '../page-citability/page-citability.collection.js';
44
-
45
- import ApiKeySchema from '../api-key/api-key.schema.js';
46
- import AsyncJobSchema from '../async-job/async-job.schema.js';
47
- import AuditSchema from '../audit/audit.schema.js';
48
- import ConfigurationSchema from '../configuration/configuration.schema.js';
49
- import EntitlementSchema from '../entitlement/entitlement.schema.js';
50
- import FixEntitySchema from '../fix-entity/fix-entity.schema.js';
51
- import FixEntitySuggestionSchema from '../fix-entity-suggestion/fix-entity-suggestion.schema.js';
52
- import ExperimentSchema from '../experiment/experiment.schema.js';
53
- import ImportJobSchema from '../import-job/import-job.schema.js';
54
- import ImportUrlSchema from '../import-url/import-url.schema.js';
55
- import KeyEventSchema from '../key-event/key-event.schema.js';
56
- import LatestAuditSchema from '../latest-audit/latest-audit.schema.js';
57
- import OpportunitySchema from '../opportunity/opportunity.schema.js';
58
- import OrganizationSchema from '../organization/organization.schema.js';
59
- import ProjectSchema from '../project/project.schema.js';
60
- import ScrapeJobSchema from '../scrape-job/scrape-job.schema.js';
61
- import ScrapeUrlSchema from '../scrape-url/scrape-url.schema.js';
62
- import SiteSchema from '../site/site.schema.js';
63
- import SiteCandidateSchema from '../site-candidate/site-candidate.schema.js';
64
- import SiteEnrollmentSchema from '../site-enrollment/site-enrollment.schema.js';
65
- import SiteTopFormSchema from '../site-top-form/site-top-form.schema.js';
66
- import SiteTopPageSchema from '../site-top-page/site-top-page.schema.js';
67
- import SuggestionSchema from '../suggestion/suggestion.schema.js';
68
- import PageIntentSchema from '../page-intent/page-intent.schema.js';
69
- import ReportSchema from '../report/report.schema.js';
70
- import TrialUserSchema from '../trial-user/trial-user.schema.js';
71
- import TrialUserActivitySchema from '../trial-user-activity/trial-user-activity.schema.js';
72
- import PageCitabilitySchema from '../page-citability/page-citability.schema.js';
14
+ import { collectionNameToEntityName } from '../../util/util.js';
15
+ import { ENTITY_DEFINITIONS } from './entity-definitions.js';
73
16
 
74
17
  /**
75
18
  * EntityRegistry - A registry class responsible for managing entities, their schema and collection.
19
+ * This implementation uses pure data structures (no static state) to be resilient
20
+ * to bundler duplication.
76
21
  *
77
22
  * @class EntityRegistry
78
23
  */
79
24
  class EntityRegistry {
80
- static entities = {};
81
-
82
25
  /**
83
26
  * Constructs an instance of EntityRegistry.
84
27
  * @constructor
@@ -99,7 +42,7 @@ class EntityRegistry {
99
42
  * @private
100
43
  */
101
44
  #initialize() {
102
- Object.values(EntityRegistry.entities).forEach(({ collection: Collection, schema }) => {
45
+ ENTITY_DEFINITIONS.forEach(({ schema, collection: Collection }) => {
103
46
  const collection = new Collection(this.service, this, schema, this.log);
104
47
  this.collections.set(Collection.COLLECTION_NAME, collection);
105
48
  });
@@ -127,46 +70,6 @@ class EntityRegistry {
127
70
  }
128
71
  return collections;
129
72
  }
130
-
131
- static getEntities() {
132
- return Object.keys(this.entities).reduce((acc, key) => {
133
- acc[key] = this.entities[key].schema.toElectroDBSchema();
134
- return acc;
135
- }, {});
136
- }
137
-
138
- static registerEntity(schema, collection) {
139
- this.entities[decapitalize(schema.getEntityName())] = { schema, collection };
140
- }
141
73
  }
142
74
 
143
- EntityRegistry.registerEntity(ApiKeySchema, ApiKeyCollection);
144
- EntityRegistry.registerEntity(AsyncJobSchema, AsyncJobCollection);
145
- EntityRegistry.registerEntity(AuditSchema, AuditCollection);
146
- EntityRegistry.registerEntity(ConfigurationSchema, ConfigurationCollection);
147
- EntityRegistry.registerEntity(EntitlementSchema, EntitlementCollection);
148
- EntityRegistry.registerEntity(FixEntitySchema, FixEntityCollection);
149
- EntityRegistry.registerEntity(FixEntitySuggestionSchema, FixEntitySuggestionCollection);
150
- EntityRegistry.registerEntity(ExperimentSchema, ExperimentCollection);
151
- EntityRegistry.registerEntity(ImportJobSchema, ImportJobCollection);
152
- EntityRegistry.registerEntity(ImportUrlSchema, ImportUrlCollection);
153
- EntityRegistry.registerEntity(KeyEventSchema, KeyEventCollection);
154
- EntityRegistry.registerEntity(LatestAuditSchema, LatestAuditCollection);
155
- EntityRegistry.registerEntity(OpportunitySchema, OpportunityCollection);
156
- EntityRegistry.registerEntity(OrganizationSchema, OrganizationCollection);
157
- EntityRegistry.registerEntity(ProjectSchema, ProjectCollection);
158
- EntityRegistry.registerEntity(ScrapeJobSchema, ScrapeJobCollection);
159
- EntityRegistry.registerEntity(ScrapeUrlSchema, ScrapeUrlCollection);
160
- EntityRegistry.registerEntity(SiteSchema, SiteCollection);
161
- EntityRegistry.registerEntity(SiteCandidateSchema, SiteCandidateCollection);
162
- EntityRegistry.registerEntity(SiteEnrollmentSchema, SiteEnrollmentCollection);
163
- EntityRegistry.registerEntity(SiteTopFormSchema, SiteTopFormCollection);
164
- EntityRegistry.registerEntity(SiteTopPageSchema, SiteTopPageCollection);
165
- EntityRegistry.registerEntity(SuggestionSchema, SuggestionCollection);
166
- EntityRegistry.registerEntity(PageIntentSchema, PageIntentCollection);
167
- EntityRegistry.registerEntity(ReportSchema, ReportCollection);
168
- EntityRegistry.registerEntity(TrialUserSchema, TrialUserCollection);
169
- EntityRegistry.registerEntity(TrialUserActivitySchema, TrialUserActivityCollection);
170
- EntityRegistry.registerEntity(PageCitabilitySchema, PageCitabilityCollection);
171
-
172
75
  export default EntityRegistry;
@@ -14,8 +14,6 @@ import { isNonEmptyObject } from '@adobe/spacecat-shared-utils';
14
14
  import crypto from 'crypto';
15
15
  import Joi from 'joi';
16
16
 
17
- import { getLogger } from '../../util/logger-registry.js';
18
-
19
17
  export const IMPORT_TYPES = {
20
18
  LLMO_QUESTIONS_IMPORT_TYPE: 'llmo-prompts-ahrefs',
21
19
  ORGANIC_KEYWORDS: 'organic-keywords',
@@ -406,13 +404,12 @@ export const Config = (data = {}) => {
406
404
  try {
407
405
  configData = validateConfiguration(data);
408
406
  } catch (error) {
409
- const logger = getLogger();
410
- if (logger && logger !== console) {
411
- logger.error('Site configuration validation failed, using provided data', {
412
- error: error.message,
413
- invalidConfig: data,
414
- });
415
- }
407
+ // Log validation errors to console as this is called from schema getters
408
+ // where we don't have access to the logger instance
409
+ console.error('Site configuration validation failed, using provided data', {
410
+ error: error.message,
411
+ invalidConfig: data,
412
+ });
416
413
  configData = { ...data };
417
414
  }
418
415
 
@@ -16,7 +16,7 @@ import { Service } from 'electrodb';
16
16
 
17
17
  import { instrumentAWSClient } from '@adobe/spacecat-shared-utils';
18
18
  import { EntityRegistry } from '../models/index.js';
19
- import { registerLogger } from '../util/logger-registry.js';
19
+ import { getEntitySchemas } from '../models/base/entity-definitions.js';
20
20
 
21
21
  export * from '../errors/index.js';
22
22
  export * from '../models/index.js';
@@ -56,7 +56,7 @@ const createElectroService = (client, config, log) => {
56
56
  /* c8 ignore end */
57
57
 
58
58
  return new Service(
59
- EntityRegistry.getEntities(),
59
+ getEntitySchemas(),
60
60
  {
61
61
  client,
62
62
  table,
@@ -74,8 +74,6 @@ const createElectroService = (client, config, log) => {
74
74
  * @returns {object} Data access collections for interacting with entities
75
75
  */
76
76
  export const createDataAccess = (config, log = console, client = undefined) => {
77
- registerLogger(log);
78
-
79
77
  const rawClient = createRawClient(client);
80
78
  const electroService = createElectroService(rawClient, config, log);
81
79
  const entityRegistry = new EntityRegistry(electroService, log);
package/src/util/index.js CHANGED
@@ -21,8 +21,3 @@ export {
21
21
  guardSet,
22
22
  guardString,
23
23
  } from './guards.js';
24
-
25
- export {
26
- registerLogger,
27
- getLogger,
28
- } from './logger-registry.js';
@@ -1,50 +0,0 @@
1
- /*
2
- * Copyright 2025 Adobe. All rights reserved.
3
- * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License. You may obtain a copy
5
- * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
- *
7
- * Unless required by applicable law or agreed to in writing, software distributed under
8
- * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- * OF ANY KIND, either express or implied. See the License for the specific language
10
- * governing permissions and limitations under the License.
11
- */
12
-
13
- class LoggerRegistry {
14
- static #instance = null;
15
-
16
- #logger = null;
17
-
18
- static getInstance() {
19
- if (!LoggerRegistry.#instance) {
20
- LoggerRegistry.#instance = new LoggerRegistry();
21
- }
22
- return LoggerRegistry.#instance;
23
- }
24
-
25
- setLogger(logger) {
26
- this.#logger = logger;
27
- }
28
-
29
- getLogger() {
30
- return this.#logger || console;
31
- }
32
- }
33
-
34
- /**
35
- * Registers a logger instance for global access.
36
- * This should be called during data access initialization.
37
- * @param {Object} logger - Logger instance
38
- */
39
- export function registerLogger(logger) {
40
- LoggerRegistry.getInstance().setLogger(logger);
41
- }
42
-
43
- /**
44
- * Gets the currently registered logger instance.
45
- * Falls back to console if no logger is registered.
46
- * @returns {Object} Logger instance
47
- */
48
- export function getLogger() {
49
- return LoggerRegistry.getInstance().getLogger();
50
- }