@autofleet/sadot 1.2.16 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,42 @@
1
+ # Sadot - Custom Fields Package
2
+
3
+ Sadot provides custom field enrichment capabilities for Autofleet models.
4
+
5
+ ## Health Check Integration
6
+
7
+ Sadot provides built-in health check integration for use with HealthManager (from `@autofleet/nitur`).
8
+
9
+ ### Basic Usage
10
+
11
+ ```typescript
12
+ import useCustomFields, { sadotInitState } from '@autofleet/sadot';
13
+ import { HealthManager } from '@autofleet/nitur';
14
+
15
+ // Start sadot initialization
16
+ useCustomFields(app, getModel, sadotOptions);
17
+
18
+ // Register with HealthManager
19
+ const healthManager = new HealthManager({
20
+ logger,
21
+ clients: {
22
+ // Simply pass the sadotInitState - defaults are applied automatically
23
+ sadot: { connection: sadotInitState },
24
+ // ... other clients (sequelize, redis, etc.)
25
+ },
26
+ });
27
+ // Readiness probe will wait for sadot to initialize
28
+ ```
29
+
30
+ ### Benefits
31
+
32
+ - ✅ Prevents race conditions between initialization and readiness checks
33
+ - ✅ Catches initialization failures before routing traffic
34
+ - ✅ Keeps pods alive on failure for debugging
35
+ - ✅ Zero changes to existing `useCustomFields()` API
36
+ - ✅ Backward compatible with servers not using HealthManager
37
+
38
+ ---
39
+
1
40
  # V1 migration
2
41
 
3
42
  The breaking change in this version is the change of the minimum required version of `zehut` from `^3` to `^4`.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,`__esModule`,{value:!0});const e=require(`./utils/logger/index.cjs`),t=require(`./utils/constants/index.cjs`),n=require(`./models/CustomFieldValue.cjs`),r=require(`./models/CustomFieldDefinition.cjs`),i=require(`./models/CustomFieldEntries.cjs`),a=require(`./models/CustomValidator.cjs`),o=require(`./models/index.cjs`),s=require(`./api/index.cjs`),c=require(`./utils/db/index.cjs`),l=require(`./utils/helpers/index.cjs`),u=require(`./scopes/filter.cjs`),d=require(`./utils/init.cjs`),f=require(`./utils/validations/schema/custom-fields.cjs`),p=async(t,n,r)=>{e.tryAddingTraceIdMiddleware();let{models:i,useCustomFieldsEntries:a,useModelTypeMapping:l}=r;t&&t.use(`/api`,s.default);let u=r.sequelize??c.default(r.databaseConfig);return process.env.NODE_ENV===`test`&&await o.initTestModels(u),d.addHooks(i,n,{useCustomFieldsEntries:a}),await o.initTables(u,r.getUser,{useCustomFieldsEntries:a,useModelTypeMapping:l}),d.addScopes(i,n,{useCustomFieldsEntries:a}),d.applyCustomAssociation(i),e.default.debug(`sadot - custom fields finished initializing with models`,i),u};var m=p;const h=(e,t)=>{d.removeHooks(e,t)};exports.CUSTOM_FIELDS_FILTER_SCOPE=t.CUSTOM_FIELDS_FILTER_SCOPE,exports.CustomFieldDefinition=r.default,exports.CustomFieldDefinitionType=t.CustomFieldDefinitionType,exports.CustomFieldEntries=i.default,exports.CustomFieldValue=n.default,exports.CustomFieldsSchema=f.CustomFieldsSchema,exports.CustomValidator=a.default,exports.customFieldsSortScope=u.customFieldsSortScope,exports.default=m,exports.disableCustomFields=h,exports.generateCustomFieldSearchQueryPayload=l.generateCustomFieldSearchQueryPayload,exports.generateRandomString=l.generateRandomString,exports.supportedEntities=t.supportedEntities;
1
+ Object.defineProperty(exports,`__esModule`,{value:!0});const e=require(`./utils/logger/index.cjs`),t=require(`./utils/constants/index.cjs`),n=require(`./models/CustomFieldValue.cjs`),r=require(`./models/CustomFieldDefinition.cjs`),i=require(`./models/CustomFieldEntries.cjs`),a=require(`./models/CustomValidator.cjs`),o=require(`./models/index.cjs`),s=require(`./api/index.cjs`),c=require(`./utils/db/index.cjs`),l=require(`./utils/helpers/index.cjs`),u=require(`./scopes/filter.cjs`),d=require(`./utils/init.cjs`),f=require(`./init-state.cjs`),p=require(`./utils/validations/schema/custom-fields.cjs`),m=new f.SadotInitializationState,h=async(t,n,r)=>{e.tryAddingTraceIdMiddleware();let{models:i,useCustomFieldsEntries:a,useModelTypeMapping:l}=r;t&&t.use(`/api`,s.default);let u=r.sequelize??c.default(r.databaseConfig);return process.env.NODE_ENV===`test`&&await o.initTestModels(u),d.addHooks(i,n,{useCustomFieldsEntries:a}),await o.initTables(u,r.getUser,{useCustomFieldsEntries:a,useModelTypeMapping:l}),d.addScopes(i,n,{useCustomFieldsEntries:a}),d.applyCustomAssociation(i),e.default.debug(`sadot - custom fields finished initializing with models`,i),u},g=async(e,t,n)=>{let r=h(e,t,n);return m.setInitPromise(r,!n.sequelize),await r};var _=g;const v=(e,t)=>{d.removeHooks(e,t)};exports.CUSTOM_FIELDS_FILTER_SCOPE=t.CUSTOM_FIELDS_FILTER_SCOPE,exports.CustomFieldDefinition=r.default,exports.CustomFieldDefinitionType=t.CustomFieldDefinitionType,exports.CustomFieldEntries=i.default,exports.CustomFieldValue=n.default,exports.CustomFieldsSchema=p.CustomFieldsSchema,exports.CustomValidator=a.default,exports.customFieldsSortScope=u.customFieldsSortScope,exports.default=_,exports.disableCustomFields=v,exports.generateCustomFieldSearchQueryPayload=l.generateCustomFieldSearchQueryPayload,exports.generateRandomString=l.generateRandomString,exports.sadotInitState=m,exports.supportedEntities=t.supportedEntities;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["api","initDB","initTestModels","initTables"],"sources":["../src/index.ts"],"sourcesContent":["import type { Application } from 'express';\nimport type { Sequelize } from 'sequelize-typescript';\nimport {\n initTables, initTestModels,\n} from './models';\nimport api from './api';\nimport initDB from './utils/db';\nimport logger, { tryAddingTraceIdMiddleware } from './utils/logger';\nimport type { CustomFieldOptions, ModelFetcher, Models } from './types';\nimport {\n addHooks, addScopes, applyCustomAssociation, removeHooks,\n} from './utils/init';\n\nexport * from './utils/validations/schema/custom-fields';\n\nexport * from './utils/constants';\n\nexport * from './utils/helpers';\n\nexport { customFieldsSortScope } from './scopes/filter';\nexport {\n CustomFieldDefinition,\n CustomFieldEntries,\n CustomFieldValue,\n CustomValidator,\n} from './models';\n\n/**\n * Adding custom fields enrichment to the models inside the MODELS_FILE_NAME json file\n * @see {@link 'custom-fields/config'} for configurations\n */\nconst useCustomFields = async (\n app: Pick<Application, 'use'> | null,\n getModel: ModelFetcher,\n options: CustomFieldOptions,\n): Promise<Sequelize> => {\n tryAddingTraceIdMiddleware();\n const { models, useCustomFieldsEntries, useModelTypeMapping } = options;\n if (app) {\n app.use('/api', api);\n }\n const sequelize = options.sequelize ?? initDB(options.databaseConfig);\n if (process.env.NODE_ENV === 'test') {\n await initTestModels(sequelize);\n }\n // The order is important\n addHooks(models, getModel, { useCustomFieldsEntries });\n await initTables(sequelize, options.getUser, { useCustomFieldsEntries, useModelTypeMapping });\n addScopes(models, getModel, { useCustomFieldsEntries });\n applyCustomAssociation(models);\n\n logger.debug('sadot - custom fields finished initializing with models', models);\n return sequelize;\n};\n\nexport default useCustomFields;\n\nexport const disableCustomFields = (models: Models[], getModel: ModelFetcher): void => {\n removeHooks(models, getModel);\n};\n"],"mappings":"6jBA+BM,EAAkB,MACtB,EACA,EACA,IACuB,CACvB,EAAA,4BAA4B,CAC5B,GAAM,CAAE,SAAQ,yBAAwB,uBAAwB,EAC5D,GACF,EAAI,IAAI,OAAQA,EAAAA,QAAI,CAEtB,IAAM,EAAY,EAAQ,WAAaC,EAAAA,QAAO,EAAQ,eAAe,CAWrE,OAVI,QAAQ,IAAI,WAAa,QAC3B,MAAMC,EAAAA,eAAe,EAAU,CAGjC,EAAA,SAAS,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACtD,MAAMC,EAAAA,WAAW,EAAW,EAAQ,QAAS,CAAE,yBAAwB,sBAAqB,CAAC,CAC7F,EAAA,UAAU,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACvD,EAAA,uBAAuB,EAAO,CAE9B,EAAA,QAAO,MAAM,0DAA2D,EAAO,CACxE,GAGT,IAAA,EAAe,EAEf,MAAa,GAAuB,EAAkB,IAAiC,CACrF,EAAA,YAAY,EAAQ,EAAS"}
1
+ {"version":3,"file":"index.cjs","names":["sadotInitState: SadotInitializationState","SadotInitializationState","api","initDB","initTestModels","initTables"],"sources":["../src/index.ts"],"sourcesContent":["import type { Application } from 'express';\nimport type { Sequelize } from 'sequelize-typescript';\nimport {\n initTables, initTestModels,\n} from './models';\nimport api from './api';\nimport initDB from './utils/db';\nimport logger, { tryAddingTraceIdMiddleware } from './utils/logger';\nimport type { CustomFieldOptions, ModelFetcher, Models } from './types';\nimport {\n addHooks, addScopes, applyCustomAssociation, removeHooks,\n} from './utils/init';\nimport { SadotInitializationState } from './init-state';\n\nexport * from './utils/validations/schema/custom-fields';\n\nexport * from './utils/constants';\n\nexport * from './utils/helpers';\n\nexport { customFieldsSortScope } from './scopes/filter';\nexport {\n CustomFieldDefinition,\n CustomFieldEntries,\n CustomFieldValue,\n CustomValidator,\n} from './models';\n\nexport const sadotInitState: SadotInitializationState = new SadotInitializationState();\n\n/**\n * Internal implementation of custom fields initialization\n * Contains all the business logic without state tracking\n */\nconst internalUseCustomFields = async (\n app: Pick<Application, 'use'> | null,\n getModel: ModelFetcher,\n options: CustomFieldOptions,\n): Promise<Sequelize> => {\n tryAddingTraceIdMiddleware();\n const { models, useCustomFieldsEntries, useModelTypeMapping } = options;\n if (app) {\n app.use('/api', api);\n }\n const sequelize = options.sequelize ?? initDB(options.databaseConfig);\n if (process.env.NODE_ENV === 'test') {\n await initTestModels(sequelize);\n }\n // The order is important\n addHooks(models, getModel, { useCustomFieldsEntries });\n await initTables(sequelize, options.getUser, { useCustomFieldsEntries, useModelTypeMapping });\n addScopes(models, getModel, { useCustomFieldsEntries });\n applyCustomAssociation(models);\n\n logger.debug('sadot - custom fields finished initializing with models', models);\n return sequelize;\n};\n\n/**\n * Adding custom fields enrichment to the models inside the MODELS_FILE_NAME json file\n * @see {@link 'custom-fields/config'} for configurations\n */\nconst useCustomFields = async (\n app: Pick<Application, 'use'> | null,\n getModel: ModelFetcher,\n options: CustomFieldOptions,\n): Promise<Sequelize> => {\n const initPromise = internalUseCustomFields(app, getModel, options);\n\n sadotInitState.setInitPromise(initPromise, !options.sequelize);\n\n return await initPromise;\n};\n\nexport default useCustomFields;\n\nexport const disableCustomFields = (models: Models[], getModel: ModelFetcher): void => {\n removeHooks(models, getModel);\n};\n"],"mappings":"2lBA4BaA,EAA2C,IAAIC,EAAAA,yBAMtD,EAA0B,MAC9B,EACA,EACA,IACuB,CACvB,EAAA,4BAA4B,CAC5B,GAAM,CAAE,SAAQ,yBAAwB,uBAAwB,EAC5D,GACF,EAAI,IAAI,OAAQC,EAAAA,QAAI,CAEtB,IAAM,EAAY,EAAQ,WAAaC,EAAAA,QAAO,EAAQ,eAAe,CAWrE,OAVI,QAAQ,IAAI,WAAa,QAC3B,MAAMC,EAAAA,eAAe,EAAU,CAGjC,EAAA,SAAS,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACtD,MAAMC,EAAAA,WAAW,EAAW,EAAQ,QAAS,CAAE,yBAAwB,sBAAqB,CAAC,CAC7F,EAAA,UAAU,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACvD,EAAA,uBAAuB,EAAO,CAE9B,EAAA,QAAO,MAAM,0DAA2D,EAAO,CACxE,GAOH,EAAkB,MACtB,EACA,EACA,IACuB,CACvB,IAAM,EAAc,EAAwB,EAAK,EAAU,EAAQ,CAInE,OAFA,EAAe,eAAe,EAAa,CAAC,EAAQ,UAAU,CAEvD,MAAM,GAGf,IAAA,EAAe,EAEf,MAAa,GAAuB,EAAkB,IAAiC,CACrF,EAAA,YAAY,EAAQ,EAAS"}
package/dist/index.d.cts CHANGED
@@ -3,6 +3,7 @@ import { CustomFieldValue } from "./models/CustomFieldValue.cjs";
3
3
  import { CustomFieldDefinition } from "./models/CustomFieldDefinition.cjs";
4
4
  import { CustomValidator } from "./models/CustomValidator.cjs";
5
5
  import { CustomFieldOptions, ModelFetcher, Models } from "./types/index.cjs";
6
+ import { SadotInitializationState } from "./init-state.cjs";
6
7
  import { CustomFieldsSchema } from "./utils/validations/schema/custom-fields.cjs";
7
8
  import { generateCustomFieldSearchQueryPayload, generateRandomString } from "./utils/helpers/index.cjs";
8
9
  import { customFieldsSortScope } from "./scopes/filter.cjs";
@@ -12,6 +13,7 @@ import { Application } from "express";
12
13
  import { Sequelize } from "sequelize-typescript";
13
14
 
14
15
  //#region src/index.d.ts
16
+ declare const sadotInitState: SadotInitializationState;
15
17
  /**
16
18
  * Adding custom fields enrichment to the models inside the MODELS_FILE_NAME json file
17
19
  * @see {@link 'custom-fields/config'} for configurations
@@ -19,5 +21,5 @@ import { Sequelize } from "sequelize-typescript";
19
21
  declare const useCustomFields: (app: Pick<Application, "use"> | null, getModel: ModelFetcher, options: CustomFieldOptions) => Promise<Sequelize>;
20
22
  declare const disableCustomFields: (models: Models[], getModel: ModelFetcher) => void;
21
23
  //#endregion
22
- export { CUSTOM_FIELDS_FILTER_SCOPE, CustomFieldDefinition, CustomFieldDefinitionType, CustomFieldEntries, CustomFieldValue, CustomFieldsSchema, CustomValidator, customFieldsSortScope, useCustomFields as default, disableCustomFields, generateCustomFieldSearchQueryPayload, generateRandomString, supportedEntities };
24
+ export { CUSTOM_FIELDS_FILTER_SCOPE, CustomFieldDefinition, CustomFieldDefinitionType, CustomFieldEntries, CustomFieldValue, CustomFieldsSchema, CustomValidator, customFieldsSortScope, useCustomFields as default, disableCustomFields, generateCustomFieldSearchQueryPayload, generateRandomString, sadotInitState, supportedEntities };
23
25
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ import { CustomFieldValue } from "./models/CustomFieldValue.js";
3
3
  import { CustomFieldDefinition } from "./models/CustomFieldDefinition.js";
4
4
  import { CustomValidator } from "./models/CustomValidator.js";
5
5
  import { CustomFieldOptions, ModelFetcher, Models } from "./types/index.js";
6
+ import { SadotInitializationState } from "./init-state.js";
6
7
  import { CustomFieldsSchema } from "./utils/validations/schema/custom-fields.js";
7
8
  import { generateCustomFieldSearchQueryPayload, generateRandomString } from "./utils/helpers/index.js";
8
9
  import { customFieldsSortScope } from "./scopes/filter.js";
@@ -12,6 +13,7 @@ import { Sequelize } from "sequelize-typescript";
12
13
  import { Application } from "express";
13
14
 
14
15
  //#region src/index.d.ts
16
+ declare const sadotInitState: SadotInitializationState;
15
17
  /**
16
18
  * Adding custom fields enrichment to the models inside the MODELS_FILE_NAME json file
17
19
  * @see {@link 'custom-fields/config'} for configurations
@@ -19,5 +21,5 @@ import { Application } from "express";
19
21
  declare const useCustomFields: (app: Pick<Application, "use"> | null, getModel: ModelFetcher, options: CustomFieldOptions) => Promise<Sequelize>;
20
22
  declare const disableCustomFields: (models: Models[], getModel: ModelFetcher) => void;
21
23
  //#endregion
22
- export { CUSTOM_FIELDS_FILTER_SCOPE, CustomFieldDefinition, CustomFieldDefinitionType, CustomFieldEntries, CustomFieldValue, CustomFieldsSchema, CustomValidator, customFieldsSortScope, useCustomFields as default, disableCustomFields, generateCustomFieldSearchQueryPayload, generateRandomString, supportedEntities };
24
+ export { CUSTOM_FIELDS_FILTER_SCOPE, CustomFieldDefinition, CustomFieldDefinitionType, CustomFieldEntries, CustomFieldValue, CustomFieldsSchema, CustomValidator, customFieldsSortScope, useCustomFields as default, disableCustomFields, generateCustomFieldSearchQueryPayload, generateRandomString, sadotInitState, supportedEntities };
23
25
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e,{tryAddingTraceIdMiddleware as t}from"./utils/logger/index.js";import{CUSTOM_FIELDS_FILTER_SCOPE as n,CustomFieldDefinitionType as r,supportedEntities as i}from"./utils/constants/index.js";import a from"./models/CustomFieldValue.js";import o from"./models/CustomFieldDefinition.js";import s from"./models/CustomFieldEntries.js";import c from"./models/CustomValidator.js";import{initTables as l,initTestModels as u}from"./models/index.js";import d from"./api/index.js";import f from"./utils/db/index.js";import{generateCustomFieldSearchQueryPayload as p,generateRandomString as m}from"./utils/helpers/index.js";import{customFieldsSortScope as h}from"./scopes/filter.js";import{addHooks as g,addScopes as _,applyCustomAssociation as v,removeHooks as y}from"./utils/init.js";import{CustomFieldsSchema as b}from"./utils/validations/schema/custom-fields.js";var x=async(n,r,i)=>{t();let{models:a,useCustomFieldsEntries:o,useModelTypeMapping:s}=i;n&&n.use(`/api`,d);let c=i.sequelize??f(i.databaseConfig);return process.env.NODE_ENV===`test`&&await u(c),g(a,r,{useCustomFieldsEntries:o}),await l(c,i.getUser,{useCustomFieldsEntries:o,useModelTypeMapping:s}),_(a,r,{useCustomFieldsEntries:o}),v(a),e.debug(`sadot - custom fields finished initializing with models`,a),c};const S=(e,t)=>{y(e,t)};export{n as CUSTOM_FIELDS_FILTER_SCOPE,o as CustomFieldDefinition,r as CustomFieldDefinitionType,s as CustomFieldEntries,a as CustomFieldValue,b as CustomFieldsSchema,c as CustomValidator,h as customFieldsSortScope,x as default,S as disableCustomFields,p as generateCustomFieldSearchQueryPayload,m as generateRandomString,i as supportedEntities};
1
+ import e,{tryAddingTraceIdMiddleware as t}from"./utils/logger/index.js";import{CUSTOM_FIELDS_FILTER_SCOPE as n,CustomFieldDefinitionType as r,supportedEntities as i}from"./utils/constants/index.js";import a from"./models/CustomFieldValue.js";import o from"./models/CustomFieldDefinition.js";import s from"./models/CustomFieldEntries.js";import c from"./models/CustomValidator.js";import{initTables as l,initTestModels as u}from"./models/index.js";import d from"./api/index.js";import f from"./utils/db/index.js";import{generateCustomFieldSearchQueryPayload as p,generateRandomString as m}from"./utils/helpers/index.js";import{customFieldsSortScope as h}from"./scopes/filter.js";import{addHooks as g,addScopes as _,applyCustomAssociation as v,removeHooks as y}from"./utils/init.js";import{SadotInitializationState as b}from"./init-state.js";import{CustomFieldsSchema as x}from"./utils/validations/schema/custom-fields.js";const S=new b,C=async(n,r,i)=>{t();let{models:a,useCustomFieldsEntries:o,useModelTypeMapping:s}=i;n&&n.use(`/api`,d);let c=i.sequelize??f(i.databaseConfig);return process.env.NODE_ENV===`test`&&await u(c),g(a,r,{useCustomFieldsEntries:o}),await l(c,i.getUser,{useCustomFieldsEntries:o,useModelTypeMapping:s}),_(a,r,{useCustomFieldsEntries:o}),v(a),e.debug(`sadot - custom fields finished initializing with models`,a),c};var w=async(e,t,n)=>{let r=C(e,t,n);return S.setInitPromise(r,!n.sequelize),await r};const T=(e,t)=>{y(e,t)};export{n as CUSTOM_FIELDS_FILTER_SCOPE,o as CustomFieldDefinition,r as CustomFieldDefinitionType,s as CustomFieldEntries,a as CustomFieldValue,x as CustomFieldsSchema,c as CustomValidator,h as customFieldsSortScope,w as default,T as disableCustomFields,p as generateCustomFieldSearchQueryPayload,m as generateRandomString,S as sadotInitState,i as supportedEntities};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["api","initDB"],"sources":["../src/index.ts"],"sourcesContent":["import type { Application } from 'express';\nimport type { Sequelize } from 'sequelize-typescript';\nimport {\n initTables, initTestModels,\n} from './models';\nimport api from './api';\nimport initDB from './utils/db';\nimport logger, { tryAddingTraceIdMiddleware } from './utils/logger';\nimport type { CustomFieldOptions, ModelFetcher, Models } from './types';\nimport {\n addHooks, addScopes, applyCustomAssociation, removeHooks,\n} from './utils/init';\n\nexport * from './utils/validations/schema/custom-fields';\n\nexport * from './utils/constants';\n\nexport * from './utils/helpers';\n\nexport { customFieldsSortScope } from './scopes/filter';\nexport {\n CustomFieldDefinition,\n CustomFieldEntries,\n CustomFieldValue,\n CustomValidator,\n} from './models';\n\n/**\n * Adding custom fields enrichment to the models inside the MODELS_FILE_NAME json file\n * @see {@link 'custom-fields/config'} for configurations\n */\nconst useCustomFields = async (\n app: Pick<Application, 'use'> | null,\n getModel: ModelFetcher,\n options: CustomFieldOptions,\n): Promise<Sequelize> => {\n tryAddingTraceIdMiddleware();\n const { models, useCustomFieldsEntries, useModelTypeMapping } = options;\n if (app) {\n app.use('/api', api);\n }\n const sequelize = options.sequelize ?? initDB(options.databaseConfig);\n if (process.env.NODE_ENV === 'test') {\n await initTestModels(sequelize);\n }\n // The order is important\n addHooks(models, getModel, { useCustomFieldsEntries });\n await initTables(sequelize, options.getUser, { useCustomFieldsEntries, useModelTypeMapping });\n addScopes(models, getModel, { useCustomFieldsEntries });\n applyCustomAssociation(models);\n\n logger.debug('sadot - custom fields finished initializing with models', models);\n return sequelize;\n};\n\nexport default useCustomFields;\n\nexport const disableCustomFields = (models: Models[], getModel: ModelFetcher): void => {\n removeHooks(models, getModel);\n};\n"],"mappings":"81BAuDA,IAAA,EAxBwB,MACtB,EACA,EACA,IACuB,CACvB,GAA4B,CAC5B,GAAM,CAAE,SAAQ,yBAAwB,uBAAwB,EAC5D,GACF,EAAI,IAAI,OAAQA,EAAI,CAEtB,IAAM,EAAY,EAAQ,WAAaC,EAAO,EAAQ,eAAe,CAWrE,OAVI,QAAQ,IAAI,WAAa,QAC3B,MAAM,EAAe,EAAU,CAGjC,EAAS,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACtD,MAAM,EAAW,EAAW,EAAQ,QAAS,CAAE,yBAAwB,sBAAqB,CAAC,CAC7F,EAAU,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACvD,EAAuB,EAAO,CAE9B,EAAO,MAAM,0DAA2D,EAAO,CACxE,GAKT,MAAa,GAAuB,EAAkB,IAAiC,CACrF,EAAY,EAAQ,EAAS"}
1
+ {"version":3,"file":"index.js","names":["sadotInitState: SadotInitializationState","api","initDB"],"sources":["../src/index.ts"],"sourcesContent":["import type { Application } from 'express';\nimport type { Sequelize } from 'sequelize-typescript';\nimport {\n initTables, initTestModels,\n} from './models';\nimport api from './api';\nimport initDB from './utils/db';\nimport logger, { tryAddingTraceIdMiddleware } from './utils/logger';\nimport type { CustomFieldOptions, ModelFetcher, Models } from './types';\nimport {\n addHooks, addScopes, applyCustomAssociation, removeHooks,\n} from './utils/init';\nimport { SadotInitializationState } from './init-state';\n\nexport * from './utils/validations/schema/custom-fields';\n\nexport * from './utils/constants';\n\nexport * from './utils/helpers';\n\nexport { customFieldsSortScope } from './scopes/filter';\nexport {\n CustomFieldDefinition,\n CustomFieldEntries,\n CustomFieldValue,\n CustomValidator,\n} from './models';\n\nexport const sadotInitState: SadotInitializationState = new SadotInitializationState();\n\n/**\n * Internal implementation of custom fields initialization\n * Contains all the business logic without state tracking\n */\nconst internalUseCustomFields = async (\n app: Pick<Application, 'use'> | null,\n getModel: ModelFetcher,\n options: CustomFieldOptions,\n): Promise<Sequelize> => {\n tryAddingTraceIdMiddleware();\n const { models, useCustomFieldsEntries, useModelTypeMapping } = options;\n if (app) {\n app.use('/api', api);\n }\n const sequelize = options.sequelize ?? initDB(options.databaseConfig);\n if (process.env.NODE_ENV === 'test') {\n await initTestModels(sequelize);\n }\n // The order is important\n addHooks(models, getModel, { useCustomFieldsEntries });\n await initTables(sequelize, options.getUser, { useCustomFieldsEntries, useModelTypeMapping });\n addScopes(models, getModel, { useCustomFieldsEntries });\n applyCustomAssociation(models);\n\n logger.debug('sadot - custom fields finished initializing with models', models);\n return sequelize;\n};\n\n/**\n * Adding custom fields enrichment to the models inside the MODELS_FILE_NAME json file\n * @see {@link 'custom-fields/config'} for configurations\n */\nconst useCustomFields = async (\n app: Pick<Application, 'use'> | null,\n getModel: ModelFetcher,\n options: CustomFieldOptions,\n): Promise<Sequelize> => {\n const initPromise = internalUseCustomFields(app, getModel, options);\n\n sadotInitState.setInitPromise(initPromise, !options.sequelize);\n\n return await initPromise;\n};\n\nexport default useCustomFields;\n\nexport const disableCustomFields = (models: Models[], getModel: ModelFetcher): void => {\n removeHooks(models, getModel);\n};\n"],"mappings":"y5BA4BA,MAAaA,EAA2C,IAAI,EAMtD,EAA0B,MAC9B,EACA,EACA,IACuB,CACvB,GAA4B,CAC5B,GAAM,CAAE,SAAQ,yBAAwB,uBAAwB,EAC5D,GACF,EAAI,IAAI,OAAQC,EAAI,CAEtB,IAAM,EAAY,EAAQ,WAAaC,EAAO,EAAQ,eAAe,CAWrE,OAVI,QAAQ,IAAI,WAAa,QAC3B,MAAM,EAAe,EAAU,CAGjC,EAAS,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACtD,MAAM,EAAW,EAAW,EAAQ,QAAS,CAAE,yBAAwB,sBAAqB,CAAC,CAC7F,EAAU,EAAQ,EAAU,CAAE,yBAAwB,CAAC,CACvD,EAAuB,EAAO,CAE9B,EAAO,MAAM,0DAA2D,EAAO,CACxE,GAmBT,IAAA,EAZwB,MACtB,EACA,EACA,IACuB,CACvB,IAAM,EAAc,EAAwB,EAAK,EAAU,EAAQ,CAInE,OAFA,EAAe,eAAe,EAAa,CAAC,EAAQ,UAAU,CAEvD,MAAM,GAKf,MAAa,GAAuB,EAAkB,IAAiC,CACrF,EAAY,EAAQ,EAAS"}
@@ -0,0 +1,2 @@
1
+ var e=class{constructor(){this.initPromise=null,this.initError=null,this.isInitialized=!1,this.sequelizeInstance=null,this.ownsSequelizeInstance=!1}setInitPromise(e,t){this.initPromise=e,this.ownsSequelizeInstance=t,e.then(e=>{this.sequelizeInstance=e,this.isInitialized=!0},e=>this.initError=e)}get sequelize(){return this.sequelizeInstance}async waitForInitialization(){if(this.isInitialized&&this.sequelizeInstance)return this.ownsSequelizeInstance?this.sequelizeInstance:void 0;if(this.initError)throw this.initError;if(!this.initPromise)throw Error(`Sadot initialization has not started`);let e=await this.initPromise;if(this.initError)throw this.initError;return this.ownsSequelizeInstance?e:void 0}get isReady(){return this.isInitialized&&!this.initError}get error(){return this.initError}};exports.SadotInitializationState=e;
2
+ //# sourceMappingURL=init-state.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-state.cjs","names":[],"sources":["../src/init-state.ts"],"sourcesContent":["import type { Sequelize } from 'sequelize-typescript';\n\n/**\n * Tracks the initialization state of sadot's useCustomFields function\n * Allows HealthManager to wait for initialization before passing readiness checks\n */\nexport class SadotInitializationState {\n private initPromise: Promise<Sequelize> | null = null;\n private initError: Error | null = null;\n private isInitialized = false;\n private sequelizeInstance: Sequelize | null = null;\n private ownsSequelizeInstance = false;\n\n /** Set the initialization promise */\n setInitPromise(promise: Promise<Sequelize>, ownsSequelize: boolean): void {\n this.initPromise = promise;\n this.ownsSequelizeInstance = ownsSequelize;\n\n promise.then((sequelize) => {\n this.sequelizeInstance = sequelize;\n this.isInitialized = true;\n }, error => this.initError = error);\n }\n\n /**\n * Get the Sequelize instance\n * Returns null if initialization hasn't completed yet, or in cases where it failed.\n */\n get sequelize(): Sequelize | null {\n return this.sequelizeInstance;\n }\n\n /**\n * Wait for initialization to complete and return the Sequelize instance\n * Returns the Sequelize instance only if Sadot created it (owns it)\n * Returns undefined if the Sequelize instance was provided externally\n * Rejects when initialization fails\n */\n async waitForInitialization(): Promise<Sequelize | undefined> {\n if (this.isInitialized && this.sequelizeInstance) {\n return this.ownsSequelizeInstance ? this.sequelizeInstance : undefined;\n }\n\n if (this.initError) {\n throw this.initError;\n }\n\n if (!this.initPromise) {\n throw new Error('Sadot initialization has not started');\n }\n\n const sequelize = await this.initPromise;\n\n if (this.initError) {\n throw this.initError as Error; // Since line 47 checked the truthiness, TS thinks `initError` can't be true, as it doesn't account for the async nature of the function.\n }\n\n return this.ownsSequelizeInstance ? sequelize : undefined;\n }\n\n /** Check if initialization is complete and successful */\n get isReady(): boolean {\n return this.isInitialized && !this.initError;\n }\n\n /** Get the initialization error if one occurred */\n get error(): Error | null {\n return this.initError;\n }\n}\n"],"mappings":"AAMA,IAAa,EAAb,KAAsC,gCACa,oBACf,wBACV,0BACsB,gCACd,GAGhC,eAAe,EAA6B,EAA8B,CACxE,KAAK,YAAc,EACnB,KAAK,sBAAwB,EAE7B,EAAQ,KAAM,GAAc,CAC1B,KAAK,kBAAoB,EACzB,KAAK,cAAgB,IACpB,GAAS,KAAK,UAAY,EAAM,CAOrC,IAAI,WAA8B,CAChC,OAAO,KAAK,kBASd,MAAM,uBAAwD,CAC5D,GAAI,KAAK,eAAiB,KAAK,kBAC7B,OAAO,KAAK,sBAAwB,KAAK,kBAAoB,IAAA,GAG/D,GAAI,KAAK,UACP,MAAM,KAAK,UAGb,GAAI,CAAC,KAAK,YACR,MAAU,MAAM,uCAAuC,CAGzD,IAAM,EAAY,MAAM,KAAK,YAE7B,GAAI,KAAK,UACP,MAAM,KAAK,UAGb,OAAO,KAAK,sBAAwB,EAAY,IAAA,GAIlD,IAAI,SAAmB,CACrB,OAAO,KAAK,eAAiB,CAAC,KAAK,UAIrC,IAAI,OAAsB,CACxB,OAAO,KAAK"}
@@ -0,0 +1,36 @@
1
+ import { Sequelize } from "sequelize-typescript";
2
+
3
+ //#region src/init-state.d.ts
4
+
5
+ /**
6
+ * Tracks the initialization state of sadot's useCustomFields function
7
+ * Allows HealthManager to wait for initialization before passing readiness checks
8
+ */
9
+ declare class SadotInitializationState {
10
+ private initPromise;
11
+ private initError;
12
+ private isInitialized;
13
+ private sequelizeInstance;
14
+ private ownsSequelizeInstance;
15
+ /** Set the initialization promise */
16
+ setInitPromise(promise: Promise<Sequelize>, ownsSequelize: boolean): void;
17
+ /**
18
+ * Get the Sequelize instance
19
+ * Returns null if initialization hasn't completed yet, or in cases where it failed.
20
+ */
21
+ get sequelize(): Sequelize | null;
22
+ /**
23
+ * Wait for initialization to complete and return the Sequelize instance
24
+ * Returns the Sequelize instance only if Sadot created it (owns it)
25
+ * Returns undefined if the Sequelize instance was provided externally
26
+ * Rejects when initialization fails
27
+ */
28
+ waitForInitialization(): Promise<Sequelize | undefined>;
29
+ /** Check if initialization is complete and successful */
30
+ get isReady(): boolean;
31
+ /** Get the initialization error if one occurred */
32
+ get error(): Error | null;
33
+ }
34
+ //#endregion
35
+ export { SadotInitializationState };
36
+ //# sourceMappingURL=init-state.d.cts.map
@@ -0,0 +1,36 @@
1
+ import { Sequelize } from "sequelize-typescript";
2
+
3
+ //#region src/init-state.d.ts
4
+
5
+ /**
6
+ * Tracks the initialization state of sadot's useCustomFields function
7
+ * Allows HealthManager to wait for initialization before passing readiness checks
8
+ */
9
+ declare class SadotInitializationState {
10
+ private initPromise;
11
+ private initError;
12
+ private isInitialized;
13
+ private sequelizeInstance;
14
+ private ownsSequelizeInstance;
15
+ /** Set the initialization promise */
16
+ setInitPromise(promise: Promise<Sequelize>, ownsSequelize: boolean): void;
17
+ /**
18
+ * Get the Sequelize instance
19
+ * Returns null if initialization hasn't completed yet, or in cases where it failed.
20
+ */
21
+ get sequelize(): Sequelize | null;
22
+ /**
23
+ * Wait for initialization to complete and return the Sequelize instance
24
+ * Returns the Sequelize instance only if Sadot created it (owns it)
25
+ * Returns undefined if the Sequelize instance was provided externally
26
+ * Rejects when initialization fails
27
+ */
28
+ waitForInitialization(): Promise<Sequelize | undefined>;
29
+ /** Check if initialization is complete and successful */
30
+ get isReady(): boolean;
31
+ /** Get the initialization error if one occurred */
32
+ get error(): Error | null;
33
+ }
34
+ //#endregion
35
+ export { SadotInitializationState };
36
+ //# sourceMappingURL=init-state.d.ts.map
@@ -0,0 +1,2 @@
1
+ var e=class{constructor(){this.initPromise=null,this.initError=null,this.isInitialized=!1,this.sequelizeInstance=null,this.ownsSequelizeInstance=!1}setInitPromise(e,t){this.initPromise=e,this.ownsSequelizeInstance=t,e.then(e=>{this.sequelizeInstance=e,this.isInitialized=!0},e=>this.initError=e)}get sequelize(){return this.sequelizeInstance}async waitForInitialization(){if(this.isInitialized&&this.sequelizeInstance)return this.ownsSequelizeInstance?this.sequelizeInstance:void 0;if(this.initError)throw this.initError;if(!this.initPromise)throw Error(`Sadot initialization has not started`);let e=await this.initPromise;if(this.initError)throw this.initError;return this.ownsSequelizeInstance?e:void 0}get isReady(){return this.isInitialized&&!this.initError}get error(){return this.initError}};export{e as SadotInitializationState};
2
+ //# sourceMappingURL=init-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-state.js","names":[],"sources":["../src/init-state.ts"],"sourcesContent":["import type { Sequelize } from 'sequelize-typescript';\n\n/**\n * Tracks the initialization state of sadot's useCustomFields function\n * Allows HealthManager to wait for initialization before passing readiness checks\n */\nexport class SadotInitializationState {\n private initPromise: Promise<Sequelize> | null = null;\n private initError: Error | null = null;\n private isInitialized = false;\n private sequelizeInstance: Sequelize | null = null;\n private ownsSequelizeInstance = false;\n\n /** Set the initialization promise */\n setInitPromise(promise: Promise<Sequelize>, ownsSequelize: boolean): void {\n this.initPromise = promise;\n this.ownsSequelizeInstance = ownsSequelize;\n\n promise.then((sequelize) => {\n this.sequelizeInstance = sequelize;\n this.isInitialized = true;\n }, error => this.initError = error);\n }\n\n /**\n * Get the Sequelize instance\n * Returns null if initialization hasn't completed yet, or in cases where it failed.\n */\n get sequelize(): Sequelize | null {\n return this.sequelizeInstance;\n }\n\n /**\n * Wait for initialization to complete and return the Sequelize instance\n * Returns the Sequelize instance only if Sadot created it (owns it)\n * Returns undefined if the Sequelize instance was provided externally\n * Rejects when initialization fails\n */\n async waitForInitialization(): Promise<Sequelize | undefined> {\n if (this.isInitialized && this.sequelizeInstance) {\n return this.ownsSequelizeInstance ? this.sequelizeInstance : undefined;\n }\n\n if (this.initError) {\n throw this.initError;\n }\n\n if (!this.initPromise) {\n throw new Error('Sadot initialization has not started');\n }\n\n const sequelize = await this.initPromise;\n\n if (this.initError) {\n throw this.initError as Error; // Since line 47 checked the truthiness, TS thinks `initError` can't be true, as it doesn't account for the async nature of the function.\n }\n\n return this.ownsSequelizeInstance ? sequelize : undefined;\n }\n\n /** Check if initialization is complete and successful */\n get isReady(): boolean {\n return this.isInitialized && !this.initError;\n }\n\n /** Get the initialization error if one occurred */\n get error(): Error | null {\n return this.initError;\n }\n}\n"],"mappings":"AAMA,IAAa,EAAb,KAAsC,gCACa,oBACf,wBACV,0BACsB,gCACd,GAGhC,eAAe,EAA6B,EAA8B,CACxE,KAAK,YAAc,EACnB,KAAK,sBAAwB,EAE7B,EAAQ,KAAM,GAAc,CAC1B,KAAK,kBAAoB,EACzB,KAAK,cAAgB,IACpB,GAAS,KAAK,UAAY,EAAM,CAOrC,IAAI,WAA8B,CAChC,OAAO,KAAK,kBASd,MAAM,uBAAwD,CAC5D,GAAI,KAAK,eAAiB,KAAK,kBAC7B,OAAO,KAAK,sBAAwB,KAAK,kBAAoB,IAAA,GAG/D,GAAI,KAAK,UACP,MAAM,KAAK,UAGb,GAAI,CAAC,KAAK,YACR,MAAU,MAAM,uCAAuC,CAGzD,IAAM,EAAY,MAAM,KAAK,YAE7B,GAAI,KAAK,UACP,MAAM,KAAK,UAGb,OAAO,KAAK,sBAAwB,EAAY,IAAA,GAIlD,IAAI,SAAmB,CACrB,OAAO,KAAK,eAAiB,CAAC,KAAK,UAIrC,IAAI,OAAsB,CACxB,OAAO,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/sadot",
3
- "version": "1.2.16",
3
+ "version": "1.3.1",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -52,8 +52,8 @@
52
52
  "express": "^4.21.2",
53
53
  "npm-watch": "^0.11.0",
54
54
  "supertest": "^7.0.0",
55
- "@autofleet/errors": "^3.1.41",
56
55
  "@autofleet/logger": "^4.2.45",
56
+ "@autofleet/errors": "^3.1.41",
57
57
  "@autofleet/node-common": "^4.2.23",
58
58
  "@autofleet/zehut": "^4.8.0"
59
59
  },