@strapi/database 5.37.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connection.js.map +1 -1
- package/dist/connection.mjs.map +1 -1
- package/dist/dialects/dialect.js.map +1 -1
- package/dist/dialects/dialect.mjs.map +1 -1
- package/dist/dialects/index.js.map +1 -1
- package/dist/dialects/index.mjs.map +1 -1
- package/dist/dialects/mysql/database-inspector.js.map +1 -1
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -1
- package/dist/dialects/mysql/index.js.map +1 -1
- package/dist/dialects/mysql/index.mjs.map +1 -1
- package/dist/dialects/mysql/schema-inspector.js.map +1 -1
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -1
- package/dist/dialects/postgresql/index.js.map +1 -1
- package/dist/dialects/postgresql/index.mjs.map +1 -1
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -1
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -1
- package/dist/dialects/sqlite/index.js.map +1 -1
- package/dist/dialects/sqlite/index.mjs.map +1 -1
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -1
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -1
- package/dist/entity-manager/entity-repository.js.map +1 -1
- package/dist/entity-manager/entity-repository.mjs.map +1 -1
- package/dist/entity-manager/index.js.map +1 -1
- package/dist/entity-manager/index.mjs +4 -4
- package/dist/entity-manager/index.mjs.map +1 -1
- package/dist/entity-manager/morph-relations.js.map +1 -1
- package/dist/entity-manager/morph-relations.mjs.map +1 -1
- package/dist/entity-manager/regular-relations.js.map +1 -1
- package/dist/entity-manager/regular-relations.mjs +1 -1
- package/dist/entity-manager/regular-relations.mjs.map +1 -1
- package/dist/entity-manager/relations-orderer.js.map +1 -1
- package/dist/entity-manager/relations-orderer.mjs.map +1 -1
- package/dist/errors/database.js.map +1 -1
- package/dist/errors/database.mjs.map +1 -1
- package/dist/errors/invalid-date.js.map +1 -1
- package/dist/errors/invalid-date.mjs.map +1 -1
- package/dist/errors/invalid-datetime.js.map +1 -1
- package/dist/errors/invalid-datetime.mjs.map +1 -1
- package/dist/errors/invalid-relation.js.map +1 -1
- package/dist/errors/invalid-relation.mjs.map +1 -1
- package/dist/errors/invalid-time.js.map +1 -1
- package/dist/errors/invalid-time.mjs.map +1 -1
- package/dist/errors/not-null.js.map +1 -1
- package/dist/errors/not-null.mjs.map +1 -1
- package/dist/fields/biginteger.js.map +1 -1
- package/dist/fields/biginteger.mjs.map +1 -1
- package/dist/fields/boolean.js.map +1 -1
- package/dist/fields/boolean.mjs.map +1 -1
- package/dist/fields/date.js.map +1 -1
- package/dist/fields/date.mjs.map +1 -1
- package/dist/fields/datetime.js.map +1 -1
- package/dist/fields/datetime.mjs.map +1 -1
- package/dist/fields/field.js.map +1 -1
- package/dist/fields/field.mjs.map +1 -1
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/index.mjs.map +1 -1
- package/dist/fields/json.js.map +1 -1
- package/dist/fields/json.mjs.map +1 -1
- package/dist/fields/number.js.map +1 -1
- package/dist/fields/number.mjs.map +1 -1
- package/dist/fields/shared/parsers.js.map +1 -1
- package/dist/fields/shared/parsers.mjs +1 -1
- package/dist/fields/shared/parsers.mjs.map +1 -1
- package/dist/fields/string.js.map +1 -1
- package/dist/fields/string.mjs.map +1 -1
- package/dist/fields/time.js.map +1 -1
- package/dist/fields/time.mjs.map +1 -1
- package/dist/fields/timestamp.js.map +1 -1
- package/dist/fields/timestamp.mjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.js.map +1 -1
- package/dist/lifecycles/index.mjs.map +1 -1
- package/dist/lifecycles/subscribers/index.js.map +1 -1
- package/dist/lifecycles/subscribers/index.mjs.map +1 -1
- package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -1
- package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -1
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -1
- package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -1
- package/dist/metadata/index.js.map +1 -1
- package/dist/metadata/index.mjs.map +1 -1
- package/dist/metadata/metadata.js.map +1 -1
- package/dist/metadata/metadata.mjs.map +1 -1
- package/dist/metadata/relations.js +2 -6
- package/dist/metadata/relations.js.map +1 -1
- package/dist/metadata/relations.mjs +2 -6
- package/dist/metadata/relations.mjs.map +1 -1
- package/dist/migrations/common.js.map +1 -1
- package/dist/migrations/common.mjs.map +1 -1
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-06-add-document-id-indexes.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-06-add-document-id-indexes.mjs.map +1 -1
- package/dist/migrations/internal-migrations/index.js.map +1 -1
- package/dist/migrations/internal-migrations/index.mjs.map +1 -1
- package/dist/migrations/internal.js.map +1 -1
- package/dist/migrations/internal.mjs.map +1 -1
- package/dist/migrations/logger.js.map +1 -1
- package/dist/migrations/logger.mjs.map +1 -1
- package/dist/migrations/storage.js.map +1 -1
- package/dist/migrations/storage.mjs.map +1 -1
- package/dist/migrations/users.js.map +1 -1
- package/dist/migrations/users.mjs.map +1 -1
- package/dist/query/helpers/join.js.map +1 -1
- package/dist/query/helpers/join.mjs.map +1 -1
- package/dist/query/helpers/order-by.js.map +1 -1
- package/dist/query/helpers/order-by.mjs.map +1 -1
- package/dist/query/helpers/populate/apply.js +3 -9
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs +3 -9
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/populate/process.js.map +1 -1
- package/dist/query/helpers/populate/process.mjs.map +1 -1
- package/dist/query/helpers/search.js.map +1 -1
- package/dist/query/helpers/search.mjs.map +1 -1
- package/dist/query/helpers/streams/readable.js.map +1 -1
- package/dist/query/helpers/streams/readable.mjs.map +1 -1
- package/dist/query/helpers/transform.js.map +1 -1
- package/dist/query/helpers/transform.mjs.map +1 -1
- package/dist/query/helpers/where.js.map +1 -1
- package/dist/query/helpers/where.mjs.map +1 -1
- package/dist/query/query-builder.js.map +1 -1
- package/dist/query/query-builder.mjs +4 -4
- package/dist/query/query-builder.mjs.map +1 -1
- package/dist/repairs/index.js.map +1 -1
- package/dist/repairs/index.mjs.map +1 -1
- package/dist/repairs/operations/process-unidirectional-join-tables.js.map +1 -1
- package/dist/repairs/operations/process-unidirectional-join-tables.mjs.map +1 -1
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -1
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -1
- package/dist/schema/builder.js.map +1 -1
- package/dist/schema/builder.mjs +1 -1
- package/dist/schema/builder.mjs.map +1 -1
- package/dist/schema/diff.js.map +1 -1
- package/dist/schema/diff.mjs.map +1 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/index.mjs.map +1 -1
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/schema.mjs.map +1 -1
- package/dist/schema/storage.js.map +1 -1
- package/dist/schema/storage.mjs.map +1 -1
- package/dist/transaction-context.js.map +1 -1
- package/dist/transaction-context.mjs.map +1 -1
- package/dist/utils/async-curry.js.map +1 -1
- package/dist/utils/async-curry.mjs.map +1 -1
- package/dist/utils/identifiers/hash.js.map +1 -1
- package/dist/utils/identifiers/hash.mjs.map +1 -1
- package/dist/utils/identifiers/index.js.map +1 -1
- package/dist/utils/identifiers/index.mjs.map +1 -1
- package/dist/utils/knex.js.map +1 -1
- package/dist/utils/knex.mjs.map +1 -1
- package/dist/utils/types.js.map +1 -1
- package/dist/utils/types.mjs.map +1 -1
- package/dist/validations/index.js.map +1 -1
- package/dist/validations/index.mjs.map +1 -1
- package/dist/validations/relations/bidirectional.js.map +1 -1
- package/dist/validations/relations/bidirectional.mjs.map +1 -1
- package/dist/validations/relations/index.js.map +1 -1
- package/dist/validations/relations/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/fields/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/fields/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport Field from './field';\nimport StringField from './string';\nimport JSONField from './json';\nimport BigIntegerField from './biginteger';\nimport NumberField from './number';\nimport DateField from './date';\nimport TimeField from './time';\nimport DatetimeField from './datetime';\nimport TimestampField from './timestamp';\nimport BooleanField from './boolean';\n\nimport type { Attribute } from '../types';\n\nconst typeToFieldMap: Record<string, typeof Field> = {\n increments: Field,\n password: StringField,\n email: StringField,\n string: StringField,\n uid: StringField,\n richtext: StringField,\n text: StringField,\n enumeration: StringField,\n json: JSONField,\n biginteger: BigIntegerField,\n integer: NumberField,\n float: NumberField,\n decimal: NumberField,\n date: DateField,\n time: TimeField,\n datetime: DatetimeField,\n timestamp: TimestampField,\n boolean: BooleanField,\n blocks: JSONField,\n};\n\nexport const createField = (attribute: Attribute): Field => {\n const { type } = attribute;\n\n if (_.has(type, typeToFieldMap)) {\n return new typeToFieldMap[type]({});\n }\n\n throw new Error(`Undefined field for type ${type}`);\n};\n"],"names":["typeToFieldMap","increments","Field","password","StringField","email","string","uid","richtext","text","enumeration","json","JSONField","biginteger","BigIntegerField","integer","NumberField","float","decimal","date","DateField","time","TimeField","datetime","DatetimeField","timestamp","TimestampField","boolean","BooleanField","blocks","createField","attribute","type","_","has","Error"],"mappings":";;;;;;;;;;;;;;AAeA,MAAMA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/fields/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport Field from './field';\nimport StringField from './string';\nimport JSONField from './json';\nimport BigIntegerField from './biginteger';\nimport NumberField from './number';\nimport DateField from './date';\nimport TimeField from './time';\nimport DatetimeField from './datetime';\nimport TimestampField from './timestamp';\nimport BooleanField from './boolean';\n\nimport type { Attribute } from '../types';\n\nconst typeToFieldMap: Record<string, typeof Field> = {\n increments: Field,\n password: StringField,\n email: StringField,\n string: StringField,\n uid: StringField,\n richtext: StringField,\n text: StringField,\n enumeration: StringField,\n json: JSONField,\n biginteger: BigIntegerField,\n integer: NumberField,\n float: NumberField,\n decimal: NumberField,\n date: DateField,\n time: TimeField,\n datetime: DatetimeField,\n timestamp: TimestampField,\n boolean: BooleanField,\n blocks: JSONField,\n};\n\nexport const createField = (attribute: Attribute): Field => {\n const { type } = attribute;\n\n if (_.has(type, typeToFieldMap)) {\n return new typeToFieldMap[type]({});\n }\n\n throw new Error(`Undefined field for type ${type}`);\n};\n"],"names":["typeToFieldMap","increments","Field","password","StringField","email","string","uid","richtext","text","enumeration","json","JSONField","biginteger","BigIntegerField","integer","NumberField","float","decimal","date","DateField","time","TimeField","datetime","DatetimeField","timestamp","TimestampField","boolean","BooleanField","blocks","createField","attribute","type","_","has","Error"],"mappings":";;;;;;;;;;;;;;AAeA,MAAMA,cAAAA,GAA+C;IACnDC,UAAAA,EAAYC,KAAAA;IACZC,QAAAA,EAAUC,MAAAA;IACVC,KAAAA,EAAOD,MAAAA;IACPE,MAAAA,EAAQF,MAAAA;IACRG,GAAAA,EAAKH,MAAAA;IACLI,QAAAA,EAAUJ,MAAAA;IACVK,IAAAA,EAAML,MAAAA;IACNM,WAAAA,EAAaN,MAAAA;IACbO,IAAAA,EAAMC,IAAAA;IACNC,UAAAA,EAAYC,UAAAA;IACZC,OAAAA,EAASC,MAAAA;IACTC,KAAAA,EAAOD,MAAAA;IACPE,OAAAA,EAASF,MAAAA;IACTG,IAAAA,EAAMC,IAAAA;IACNC,IAAAA,EAAMC,IAAAA;IACNC,QAAAA,EAAUC,QAAAA;IACVC,SAAAA,EAAWC,SAAAA;IACXC,OAAAA,EAASC,OAAAA;IACTC,MAAAA,EAAQjB;AACV,CAAA;AAEO,MAAMkB,cAAc,CAACC,SAAAA,GAAAA;IAC1B,MAAM,EAAEC,IAAI,EAAE,GAAGD,SAAAA;AAEjB,IAAA,IAAIE,CAAAA,CAAEC,GAAG,CAACF,IAAAA,EAAMhC,cAAAA,CAAAA,EAAiB;AAC/B,QAAA,OAAO,IAAIA,cAAc,CAACgC,IAAAA,CAAK,CAAC,EAAC,CAAA;AACnC,IAAA;AAEA,IAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,yBAAyB,EAAEH,IAAAA,CAAAA,CAAM,CAAA;AACpD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/fields/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport Field from './field';\nimport StringField from './string';\nimport JSONField from './json';\nimport BigIntegerField from './biginteger';\nimport NumberField from './number';\nimport DateField from './date';\nimport TimeField from './time';\nimport DatetimeField from './datetime';\nimport TimestampField from './timestamp';\nimport BooleanField from './boolean';\n\nimport type { Attribute } from '../types';\n\nconst typeToFieldMap: Record<string, typeof Field> = {\n increments: Field,\n password: StringField,\n email: StringField,\n string: StringField,\n uid: StringField,\n richtext: StringField,\n text: StringField,\n enumeration: StringField,\n json: JSONField,\n biginteger: BigIntegerField,\n integer: NumberField,\n float: NumberField,\n decimal: NumberField,\n date: DateField,\n time: TimeField,\n datetime: DatetimeField,\n timestamp: TimestampField,\n boolean: BooleanField,\n blocks: JSONField,\n};\n\nexport const createField = (attribute: Attribute): Field => {\n const { type } = attribute;\n\n if (_.has(type, typeToFieldMap)) {\n return new typeToFieldMap[type]({});\n }\n\n throw new Error(`Undefined field for type ${type}`);\n};\n"],"names":["typeToFieldMap","increments","Field","password","StringField","email","string","uid","richtext","text","enumeration","json","JSONField","biginteger","BigIntegerField","integer","NumberField","float","decimal","date","DateField","time","TimeField","datetime","DatetimeField","timestamp","TimestampField","boolean","BooleanField","blocks","createField","attribute","type","_","has","Error"],"mappings":";;;;;;;;;;;;AAeA,MAAMA,
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/fields/index.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport Field from './field';\nimport StringField from './string';\nimport JSONField from './json';\nimport BigIntegerField from './biginteger';\nimport NumberField from './number';\nimport DateField from './date';\nimport TimeField from './time';\nimport DatetimeField from './datetime';\nimport TimestampField from './timestamp';\nimport BooleanField from './boolean';\n\nimport type { Attribute } from '../types';\n\nconst typeToFieldMap: Record<string, typeof Field> = {\n increments: Field,\n password: StringField,\n email: StringField,\n string: StringField,\n uid: StringField,\n richtext: StringField,\n text: StringField,\n enumeration: StringField,\n json: JSONField,\n biginteger: BigIntegerField,\n integer: NumberField,\n float: NumberField,\n decimal: NumberField,\n date: DateField,\n time: TimeField,\n datetime: DatetimeField,\n timestamp: TimestampField,\n boolean: BooleanField,\n blocks: JSONField,\n};\n\nexport const createField = (attribute: Attribute): Field => {\n const { type } = attribute;\n\n if (_.has(type, typeToFieldMap)) {\n return new typeToFieldMap[type]({});\n }\n\n throw new Error(`Undefined field for type ${type}`);\n};\n"],"names":["typeToFieldMap","increments","Field","password","StringField","email","string","uid","richtext","text","enumeration","json","JSONField","biginteger","BigIntegerField","integer","NumberField","float","decimal","date","DateField","time","TimeField","datetime","DatetimeField","timestamp","TimestampField","boolean","BooleanField","blocks","createField","attribute","type","_","has","Error"],"mappings":";;;;;;;;;;;;AAeA,MAAMA,cAAAA,GAA+C;IACnDC,UAAAA,EAAYC,KAAAA;IACZC,QAAAA,EAAUC,WAAAA;IACVC,KAAAA,EAAOD,WAAAA;IACPE,MAAAA,EAAQF,WAAAA;IACRG,GAAAA,EAAKH,WAAAA;IACLI,QAAAA,EAAUJ,WAAAA;IACVK,IAAAA,EAAML,WAAAA;IACNM,WAAAA,EAAaN,WAAAA;IACbO,IAAAA,EAAMC,SAAAA;IACNC,UAAAA,EAAYC,eAAAA;IACZC,OAAAA,EAASC,WAAAA;IACTC,KAAAA,EAAOD,WAAAA;IACPE,OAAAA,EAASF,WAAAA;IACTG,IAAAA,EAAMC,SAAAA;IACNC,IAAAA,EAAMC,SAAAA;IACNC,QAAAA,EAAUC,aAAAA;IACVC,SAAAA,EAAWC,cAAAA;IACXC,OAAAA,EAASC,YAAAA;IACTC,MAAAA,EAAQjB;AACV,CAAA;AAEO,MAAMkB,cAAc,CAACC,SAAAA,GAAAA;IAC1B,MAAM,EAAEC,IAAI,EAAE,GAAGD,SAAAA;AAEjB,IAAA,IAAIE,CAAAA,CAAEC,GAAG,CAACF,IAAAA,EAAMhC,cAAAA,CAAAA,EAAiB;AAC/B,QAAA,OAAO,IAAIA,cAAc,CAACgC,IAAAA,CAAK,CAAC,EAAC,CAAA;AACnC,IAAA;AAEA,IAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,yBAAyB,EAAEH,IAAAA,CAAAA,CAAM,CAAA;AACpD;;;;"}
|
package/dist/fields/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sources":["../../src/fields/json.ts"],"sourcesContent":["import Field from './field';\n\nexport default class JSONField extends Field {\n toDB(value: unknown) {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return value;\n }\n\n fromDB(value: unknown) {\n try {\n if (typeof value === 'string') {\n const parsedValue = JSON.parse(value);\n\n /**\n * On Strapi 5 until 5.0.0-rc.7, the values were accidentally stringified twice when saved,\n * so in those cases we need to parse them twice to retrieve the actual value.\n */\n if (typeof parsedValue === 'string') {\n return JSON.parse(parsedValue);\n }\n\n return parsedValue;\n }\n } catch (error) {\n // Just return the value if it's not a valid JSON string\n return value;\n }\n\n return value;\n }\n}\n"],"names":["JSONField","Field","toDB","value","JSON","stringify","fromDB","parsedValue","parse","error"],"mappings":";;;;AAEe,MAAMA,SAAkBC,
|
|
1
|
+
{"version":3,"file":"json.js","sources":["../../src/fields/json.ts"],"sourcesContent":["import Field from './field';\n\nexport default class JSONField extends Field {\n toDB(value: unknown) {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return value;\n }\n\n fromDB(value: unknown) {\n try {\n if (typeof value === 'string') {\n const parsedValue = JSON.parse(value);\n\n /**\n * On Strapi 5 until 5.0.0-rc.7, the values were accidentally stringified twice when saved,\n * so in those cases we need to parse them twice to retrieve the actual value.\n */\n if (typeof parsedValue === 'string') {\n return JSON.parse(parsedValue);\n }\n\n return parsedValue;\n }\n } catch (error) {\n // Just return the value if it's not a valid JSON string\n return value;\n }\n\n return value;\n }\n}\n"],"names":["JSONField","Field","toDB","value","JSON","stringify","fromDB","parsedValue","parse","error"],"mappings":";;;;AAEe,MAAMA,SAAAA,SAAkBC,KAAAA,CAAAA;AACrCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,IAAIA,SAAS,IAAA,EAAM;YACjB,OAAO,IAAA;AACT,QAAA;QAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;YAC7B,OAAOC,IAAAA,CAAKC,SAAS,CAACF,KAAAA,CAAAA;AACxB,QAAA;QAEA,OAAOA,KAAAA;AACT,IAAA;AAEAG,IAAAA,MAAAA,CAAOH,KAAc,EAAE;QACrB,IAAI;YACF,IAAI,OAAOA,UAAU,QAAA,EAAU;gBAC7B,MAAMI,WAAAA,GAAcH,IAAAA,CAAKI,KAAK,CAACL,KAAAA,CAAAA;AAE/B;;;YAIA,IAAI,OAAOI,WAAAA,KAAgB,QAAA,EAAU;oBACnC,OAAOH,IAAAA,CAAKI,KAAK,CAACD,WAAAA,CAAAA;AACpB,gBAAA;gBAEA,OAAOA,WAAAA;AACT,YAAA;AACF,QAAA,CAAA,CAAE,OAAOE,KAAAA,EAAO;;YAEd,OAAON,KAAAA;AACT,QAAA;QAEA,OAAOA,KAAAA;AACT,IAAA;AACF;;;;"}
|
package/dist/fields/json.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.mjs","sources":["../../src/fields/json.ts"],"sourcesContent":["import Field from './field';\n\nexport default class JSONField extends Field {\n toDB(value: unknown) {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return value;\n }\n\n fromDB(value: unknown) {\n try {\n if (typeof value === 'string') {\n const parsedValue = JSON.parse(value);\n\n /**\n * On Strapi 5 until 5.0.0-rc.7, the values were accidentally stringified twice when saved,\n * so in those cases we need to parse them twice to retrieve the actual value.\n */\n if (typeof parsedValue === 'string') {\n return JSON.parse(parsedValue);\n }\n\n return parsedValue;\n }\n } catch (error) {\n // Just return the value if it's not a valid JSON string\n return value;\n }\n\n return value;\n }\n}\n"],"names":["JSONField","Field","toDB","value","JSON","stringify","fromDB","parsedValue","parse","error"],"mappings":";;AAEe,MAAMA,SAAkBC,
|
|
1
|
+
{"version":3,"file":"json.mjs","sources":["../../src/fields/json.ts"],"sourcesContent":["import Field from './field';\n\nexport default class JSONField extends Field {\n toDB(value: unknown) {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return value;\n }\n\n fromDB(value: unknown) {\n try {\n if (typeof value === 'string') {\n const parsedValue = JSON.parse(value);\n\n /**\n * On Strapi 5 until 5.0.0-rc.7, the values were accidentally stringified twice when saved,\n * so in those cases we need to parse them twice to retrieve the actual value.\n */\n if (typeof parsedValue === 'string') {\n return JSON.parse(parsedValue);\n }\n\n return parsedValue;\n }\n } catch (error) {\n // Just return the value if it's not a valid JSON string\n return value;\n }\n\n return value;\n }\n}\n"],"names":["JSONField","Field","toDB","value","JSON","stringify","fromDB","parsedValue","parse","error"],"mappings":";;AAEe,MAAMA,SAAAA,SAAkBC,KAAAA,CAAAA;AACrCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,IAAIA,SAAS,IAAA,EAAM;YACjB,OAAO,IAAA;AACT,QAAA;QAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;YAC7B,OAAOC,IAAAA,CAAKC,SAAS,CAACF,KAAAA,CAAAA;AACxB,QAAA;QAEA,OAAOA,KAAAA;AACT,IAAA;AAEAG,IAAAA,MAAAA,CAAOH,KAAc,EAAE;QACrB,IAAI;YACF,IAAI,OAAOA,UAAU,QAAA,EAAU;gBAC7B,MAAMI,WAAAA,GAAcH,IAAAA,CAAKI,KAAK,CAACL,KAAAA,CAAAA;AAE/B;;;YAIA,IAAI,OAAOI,WAAAA,KAAgB,QAAA,EAAU;oBACnC,OAAOH,IAAAA,CAAKI,KAAK,CAACD,WAAAA,CAAAA;AACpB,gBAAA;gBAEA,OAAOA,WAAAA;AACT,YAAA;AACF,QAAA,CAAA,CAAE,OAAOE,KAAAA,EAAO;;YAEd,OAAON,KAAAA;AACT,QAAA;QAEA,OAAOA,KAAAA;AACT,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n const numberValue = toNumber(value);\n\n if (Number.isNaN(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","numberValue","toNumber","Number","isNaN","Error","fromDB"],"mappings":";;;;;AAGe,MAAMA,
|
|
1
|
+
{"version":3,"file":"number.js","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n const numberValue = toNumber(value);\n\n if (Number.isNaN(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","numberValue","toNumber","Number","isNaN","Error","fromDB"],"mappings":";;;;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,MAAMC,cAAcC,UAAAA,CAASF,KAAAA,CAAAA;QAE7B,IAAIG,MAAAA,CAAOC,KAAK,CAACH,WAAAA,CAAAA,EAAc;AAC7B,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,6BAA6B,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AACzD,QAAA;QAEA,OAAOC,WAAAA;AACT,IAAA;AAEAK,IAAAA,MAAAA,CAAON,KAAc,EAAE;AACrB,QAAA,OAAOE,UAAAA,CAASF,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.mjs","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n const numberValue = toNumber(value);\n\n if (Number.isNaN(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","numberValue","toNumber","Number","isNaN","Error","fromDB"],"mappings":";;;AAGe,MAAMA,
|
|
1
|
+
{"version":3,"file":"number.mjs","sources":["../../src/fields/number.ts"],"sourcesContent":["import { toNumber } from 'lodash/fp';\nimport Field from './field';\n\nexport default class NumberField extends Field {\n toDB(value: unknown) {\n const numberValue = toNumber(value);\n\n if (Number.isNaN(numberValue)) {\n throw new Error(`Expected a valid Number, got ${value}`);\n }\n\n return numberValue;\n }\n\n fromDB(value: unknown) {\n return toNumber(value);\n }\n}\n"],"names":["NumberField","Field","toDB","value","numberValue","toNumber","Number","isNaN","Error","fromDB"],"mappings":";;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,MAAMC,cAAcC,QAAAA,CAASF,KAAAA,CAAAA;QAE7B,IAAIG,MAAAA,CAAOC,KAAK,CAACH,WAAAA,CAAAA,EAAc;AAC7B,YAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,6BAA6B,EAAEL,KAAAA,CAAAA,CAAO,CAAA;AACzD,QAAA;QAEA,OAAOC,WAAAA;AACT,IAAA;AAEAK,IAAAA,MAAAA,CAAON,KAAc,EAAE;AACrB,QAAA,OAAOE,QAAAA,CAASF,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sources":["../../../src/fields/shared/parsers.ts"],"sourcesContent":["import { padCharsEnd, isString, toString } from 'lodash/fp';\nimport * as dateFns from 'date-fns';\n\nimport { InvalidDateTimeError, InvalidDateError, InvalidTimeError } from '../../errors';\n\nconst isDate = (value: unknown): value is Date => {\n return dateFns.isDate(value);\n};\n\nconst DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;\nconst PARTIAL_DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])/g;\nconst TIME_REGEX = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nexport const parseDateTimeOrTimestamp = (value: unknown): Date => {\n if (isDate(value)) {\n return value;\n }\n\n try {\n const date = dateFns.parseISO(toString(value));\n if (dateFns.isValid(date)) {\n return date;\n }\n\n const milliUnixDate = dateFns.parse(toString(value), 'T', new Date());\n if (dateFns.isValid(milliUnixDate)) {\n return milliUnixDate;\n }\n\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\nexport const parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'yyyy-MM-dd');\n }\n\n const found = isString(value) ? value.match(PARTIAL_DATE_REGEX) || [] : [];\n const extractedValue = found[0];\n\n if (extractedValue && !DATE_REGEX.test(toString(value))) {\n // TODO V5: throw an error when format yyyy-MM-dd is not respected\n // throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n process.emitWarning(\n `[deprecated] Using a date format other than YYYY-MM-DD will be removed in future versions. Date received: ${value}. Date stored: ${extractedValue}.`\n );\n }\n\n if (!extractedValue) {\n throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n }\n\n const date = dateFns.parseISO(extractedValue);\n if (!dateFns.isValid(date)) {\n throw new InvalidDateError(`Invalid date`);\n }\n\n return extractedValue;\n};\n\nexport const parseTime = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new InvalidTimeError(`Expected a string, got a ${typeof value}`);\n }\n\n const result = value.match(TIME_REGEX);\n\n if (result === null) {\n throw new InvalidTimeError('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = padCharsEnd('0', 3, fraction.slice(1));\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n"],"names":["isDate","value","dateFns","DATE_REGEX","PARTIAL_DATE_REGEX","TIME_REGEX","parseDateTimeOrTimestamp","date","parseISO","toString","isValid","milliUnixDate","parse","Date","InvalidDateTimeError","error","parseDate","format","found","isString","match","extractedValue","test","process","emitWarning","InvalidDateError","parseTime","InvalidTimeError","result","hours","minutes","seconds","fraction","fractionPart","padCharsEnd","slice"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,SAAS,CAACC,KAAAA,GAAAA;IACd,OAAOC,kBAAAA,CAAQF,MAAM,CAACC,KAAAA,CAAAA;AACxB,CAAA;AAEA,MAAME,
|
|
1
|
+
{"version":3,"file":"parsers.js","sources":["../../../src/fields/shared/parsers.ts"],"sourcesContent":["import { padCharsEnd, isString, toString } from 'lodash/fp';\nimport * as dateFns from 'date-fns';\n\nimport { InvalidDateTimeError, InvalidDateError, InvalidTimeError } from '../../errors';\n\nconst isDate = (value: unknown): value is Date => {\n return dateFns.isDate(value);\n};\n\nconst DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;\nconst PARTIAL_DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])/g;\nconst TIME_REGEX = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nexport const parseDateTimeOrTimestamp = (value: unknown): Date => {\n if (isDate(value)) {\n return value;\n }\n\n try {\n const date = dateFns.parseISO(toString(value));\n if (dateFns.isValid(date)) {\n return date;\n }\n\n const milliUnixDate = dateFns.parse(toString(value), 'T', new Date());\n if (dateFns.isValid(milliUnixDate)) {\n return milliUnixDate;\n }\n\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\nexport const parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'yyyy-MM-dd');\n }\n\n const found = isString(value) ? value.match(PARTIAL_DATE_REGEX) || [] : [];\n const extractedValue = found[0];\n\n if (extractedValue && !DATE_REGEX.test(toString(value))) {\n // TODO V5: throw an error when format yyyy-MM-dd is not respected\n // throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n process.emitWarning(\n `[deprecated] Using a date format other than YYYY-MM-DD will be removed in future versions. Date received: ${value}. Date stored: ${extractedValue}.`\n );\n }\n\n if (!extractedValue) {\n throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n }\n\n const date = dateFns.parseISO(extractedValue);\n if (!dateFns.isValid(date)) {\n throw new InvalidDateError(`Invalid date`);\n }\n\n return extractedValue;\n};\n\nexport const parseTime = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new InvalidTimeError(`Expected a string, got a ${typeof value}`);\n }\n\n const result = value.match(TIME_REGEX);\n\n if (result === null) {\n throw new InvalidTimeError('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = padCharsEnd('0', 3, fraction.slice(1));\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n"],"names":["isDate","value","dateFns","DATE_REGEX","PARTIAL_DATE_REGEX","TIME_REGEX","parseDateTimeOrTimestamp","date","parseISO","toString","isValid","milliUnixDate","parse","Date","InvalidDateTimeError","error","parseDate","format","found","isString","match","extractedValue","test","process","emitWarning","InvalidDateError","parseTime","InvalidTimeError","result","hours","minutes","seconds","fraction","fractionPart","padCharsEnd","slice"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { toString,
|
|
1
|
+
import { toString, padCharsEnd, isString } from 'lodash/fp';
|
|
2
2
|
import * as dateFns from 'date-fns';
|
|
3
3
|
import InvalidTimeError from '../../errors/invalid-time.mjs';
|
|
4
4
|
import InvalidDateError from '../../errors/invalid-date.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.mjs","sources":["../../../src/fields/shared/parsers.ts"],"sourcesContent":["import { padCharsEnd, isString, toString } from 'lodash/fp';\nimport * as dateFns from 'date-fns';\n\nimport { InvalidDateTimeError, InvalidDateError, InvalidTimeError } from '../../errors';\n\nconst isDate = (value: unknown): value is Date => {\n return dateFns.isDate(value);\n};\n\nconst DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;\nconst PARTIAL_DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])/g;\nconst TIME_REGEX = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nexport const parseDateTimeOrTimestamp = (value: unknown): Date => {\n if (isDate(value)) {\n return value;\n }\n\n try {\n const date = dateFns.parseISO(toString(value));\n if (dateFns.isValid(date)) {\n return date;\n }\n\n const milliUnixDate = dateFns.parse(toString(value), 'T', new Date());\n if (dateFns.isValid(milliUnixDate)) {\n return milliUnixDate;\n }\n\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\nexport const parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'yyyy-MM-dd');\n }\n\n const found = isString(value) ? value.match(PARTIAL_DATE_REGEX) || [] : [];\n const extractedValue = found[0];\n\n if (extractedValue && !DATE_REGEX.test(toString(value))) {\n // TODO V5: throw an error when format yyyy-MM-dd is not respected\n // throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n process.emitWarning(\n `[deprecated] Using a date format other than YYYY-MM-DD will be removed in future versions. Date received: ${value}. Date stored: ${extractedValue}.`\n );\n }\n\n if (!extractedValue) {\n throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n }\n\n const date = dateFns.parseISO(extractedValue);\n if (!dateFns.isValid(date)) {\n throw new InvalidDateError(`Invalid date`);\n }\n\n return extractedValue;\n};\n\nexport const parseTime = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new InvalidTimeError(`Expected a string, got a ${typeof value}`);\n }\n\n const result = value.match(TIME_REGEX);\n\n if (result === null) {\n throw new InvalidTimeError('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = padCharsEnd('0', 3, fraction.slice(1));\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n"],"names":["isDate","value","dateFns","DATE_REGEX","PARTIAL_DATE_REGEX","TIME_REGEX","parseDateTimeOrTimestamp","date","parseISO","toString","isValid","milliUnixDate","parse","Date","InvalidDateTimeError","error","parseDate","format","found","isString","match","extractedValue","test","process","emitWarning","InvalidDateError","parseTime","InvalidTimeError","result","hours","minutes","seconds","fraction","fractionPart","padCharsEnd","slice"],"mappings":";;;;;;AAKA,MAAMA,SAAS,CAACC,KAAAA,GAAAA;IACd,OAAOC,OAAAA,CAAQF,MAAM,CAACC,KAAAA,CAAAA;AACxB,CAAA;AAEA,MAAME,
|
|
1
|
+
{"version":3,"file":"parsers.mjs","sources":["../../../src/fields/shared/parsers.ts"],"sourcesContent":["import { padCharsEnd, isString, toString } from 'lodash/fp';\nimport * as dateFns from 'date-fns';\n\nimport { InvalidDateTimeError, InvalidDateError, InvalidTimeError } from '../../errors';\n\nconst isDate = (value: unknown): value is Date => {\n return dateFns.isDate(value);\n};\n\nconst DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;\nconst PARTIAL_DATE_REGEX = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])/g;\nconst TIME_REGEX = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nexport const parseDateTimeOrTimestamp = (value: unknown): Date => {\n if (isDate(value)) {\n return value;\n }\n\n try {\n const date = dateFns.parseISO(toString(value));\n if (dateFns.isValid(date)) {\n return date;\n }\n\n const milliUnixDate = dateFns.parse(toString(value), 'T', new Date());\n if (dateFns.isValid(milliUnixDate)) {\n return milliUnixDate;\n }\n\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\nexport const parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'yyyy-MM-dd');\n }\n\n const found = isString(value) ? value.match(PARTIAL_DATE_REGEX) || [] : [];\n const extractedValue = found[0];\n\n if (extractedValue && !DATE_REGEX.test(toString(value))) {\n // TODO V5: throw an error when format yyyy-MM-dd is not respected\n // throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n process.emitWarning(\n `[deprecated] Using a date format other than YYYY-MM-DD will be removed in future versions. Date received: ${value}. Date stored: ${extractedValue}.`\n );\n }\n\n if (!extractedValue) {\n throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);\n }\n\n const date = dateFns.parseISO(extractedValue);\n if (!dateFns.isValid(date)) {\n throw new InvalidDateError(`Invalid date`);\n }\n\n return extractedValue;\n};\n\nexport const parseTime = (value: unknown) => {\n if (isDate(value)) {\n return dateFns.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new InvalidTimeError(`Expected a string, got a ${typeof value}`);\n }\n\n const result = value.match(TIME_REGEX);\n\n if (result === null) {\n throw new InvalidTimeError('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = padCharsEnd('0', 3, fraction.slice(1));\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n"],"names":["isDate","value","dateFns","DATE_REGEX","PARTIAL_DATE_REGEX","TIME_REGEX","parseDateTimeOrTimestamp","date","parseISO","toString","isValid","milliUnixDate","parse","Date","InvalidDateTimeError","error","parseDate","format","found","isString","match","extractedValue","test","process","emitWarning","InvalidDateError","parseTime","InvalidTimeError","result","hours","minutes","seconds","fraction","fractionPart","padCharsEnd","slice"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.js","sources":["../../src/fields/string.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport Field from './field';\n\nexport default class StringField extends Field {\n toDB(value: unknown) {\n return toString(value);\n }\n\n fromDB(value: unknown) {\n return toString(value);\n }\n}\n"],"names":["StringField","Field","toDB","value","toString","fromDB"],"mappings":";;;;;AAGe,MAAMA,
|
|
1
|
+
{"version":3,"file":"string.js","sources":["../../src/fields/string.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport Field from './field';\n\nexport default class StringField extends Field {\n toDB(value: unknown) {\n return toString(value);\n }\n\n fromDB(value: unknown) {\n return toString(value);\n }\n}\n"],"names":["StringField","Field","toDB","value","toString","fromDB"],"mappings":";;;;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,OAAOC,UAAAA,CAASD,KAAAA,CAAAA;AAClB,IAAA;AAEAE,IAAAA,MAAAA,CAAOF,KAAc,EAAE;AACrB,QAAA,OAAOC,UAAAA,CAASD,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.mjs","sources":["../../src/fields/string.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport Field from './field';\n\nexport default class StringField extends Field {\n toDB(value: unknown) {\n return toString(value);\n }\n\n fromDB(value: unknown) {\n return toString(value);\n }\n}\n"],"names":["StringField","Field","toDB","value","toString","fromDB"],"mappings":";;;AAGe,MAAMA,
|
|
1
|
+
{"version":3,"file":"string.mjs","sources":["../../src/fields/string.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport Field from './field';\n\nexport default class StringField extends Field {\n toDB(value: unknown) {\n return toString(value);\n }\n\n fromDB(value: unknown) {\n return toString(value);\n }\n}\n"],"names":["StringField","Field","toDB","value","toString","fromDB"],"mappings":";;;AAGe,MAAMA,WAAAA,SAAoBC,KAAAA,CAAAA;AACvCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,OAAOC,QAAAA,CAASD,KAAAA,CAAAA;AAClB,IAAA;AAEAE,IAAAA,MAAAA,CAAOF,KAAc,EAAE;AACrB,QAAA,OAAOC,QAAAA,CAASD,KAAAA,CAAAA;AAClB,IAAA;AACF;;;;"}
|
package/dist/fields/time.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sources":["../../src/fields/time.ts"],"sourcesContent":["import { parseTime } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimeField extends Field {\n toDB(value: unknown) {\n return parseTime(value);\n }\n\n fromDB(value: unknown) {\n // make sure that's a string with valid format ?\n return value;\n }\n}\n"],"names":["TimeField","Field","toDB","value","parseTime","fromDB"],"mappings":";;;;;AAGe,MAAMA,SAAkBC,
|
|
1
|
+
{"version":3,"file":"time.js","sources":["../../src/fields/time.ts"],"sourcesContent":["import { parseTime } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimeField extends Field {\n toDB(value: unknown) {\n return parseTime(value);\n }\n\n fromDB(value: unknown) {\n // make sure that's a string with valid format ?\n return value;\n }\n}\n"],"names":["TimeField","Field","toDB","value","parseTime","fromDB"],"mappings":";;;;;AAGe,MAAMA,SAAAA,SAAkBC,KAAAA,CAAAA;AACrCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,OAAOC,iBAAAA,CAAUD,KAAAA,CAAAA;AACnB,IAAA;AAEAE,IAAAA,MAAAA,CAAOF,KAAc,EAAE;;QAErB,OAAOA,KAAAA;AACT,IAAA;AACF;;;;"}
|
package/dist/fields/time.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.mjs","sources":["../../src/fields/time.ts"],"sourcesContent":["import { parseTime } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimeField extends Field {\n toDB(value: unknown) {\n return parseTime(value);\n }\n\n fromDB(value: unknown) {\n // make sure that's a string with valid format ?\n return value;\n }\n}\n"],"names":["TimeField","Field","toDB","value","parseTime","fromDB"],"mappings":";;;AAGe,MAAMA,SAAkBC,
|
|
1
|
+
{"version":3,"file":"time.mjs","sources":["../../src/fields/time.ts"],"sourcesContent":["import { parseTime } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimeField extends Field {\n toDB(value: unknown) {\n return parseTime(value);\n }\n\n fromDB(value: unknown) {\n // make sure that's a string with valid format ?\n return value;\n }\n}\n"],"names":["TimeField","Field","toDB","value","parseTime","fromDB"],"mappings":";;;AAGe,MAAMA,SAAAA,SAAkBC,KAAAA,CAAAA;AACrCC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,OAAOC,SAAAA,CAAUD,KAAAA,CAAAA;AACnB,IAAA;AAEAE,IAAAA,MAAAA,CAAOF,KAAc,EAAE;;QAErB,OAAOA,KAAAA;AACT,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp.js","sources":["../../src/fields/timestamp.ts"],"sourcesContent":["import * as dateFns from 'date-fns';\n\nimport { parseDateTimeOrTimestamp } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimestampField extends Field {\n toDB(value: unknown) {\n return parseDateTimeOrTimestamp(value);\n }\n\n fromDB(value: unknown) {\n const cast = new Date(value as any);\n return dateFns.isValid(cast) ? dateFns.format(cast, 'T') : null;\n }\n}\n"],"names":["TimestampField","Field","toDB","value","parseDateTimeOrTimestamp","fromDB","cast","Date","dateFns","isValid","format"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAKe,MAAMA,
|
|
1
|
+
{"version":3,"file":"timestamp.js","sources":["../../src/fields/timestamp.ts"],"sourcesContent":["import * as dateFns from 'date-fns';\n\nimport { parseDateTimeOrTimestamp } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimestampField extends Field {\n toDB(value: unknown) {\n return parseDateTimeOrTimestamp(value);\n }\n\n fromDB(value: unknown) {\n const cast = new Date(value as any);\n return dateFns.isValid(cast) ? dateFns.format(cast, 'T') : null;\n }\n}\n"],"names":["TimestampField","Field","toDB","value","parseDateTimeOrTimestamp","fromDB","cast","Date","dateFns","isValid","format"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAKe,MAAMA,cAAAA,SAAuBC,KAAAA,CAAAA;AAC1CC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,OAAOC,gCAAAA,CAAyBD,KAAAA,CAAAA;AAClC,IAAA;AAEAE,IAAAA,MAAAA,CAAOF,KAAc,EAAE;QACrB,MAAMG,IAAAA,GAAO,IAAIC,IAAAA,CAAKJ,KAAAA,CAAAA;QACtB,OAAOK,kBAAAA,CAAQC,OAAO,CAACH,IAAAA,CAAAA,GAAQE,mBAAQE,MAAM,CAACJ,MAAM,GAAA,CAAA,GAAO,IAAA;AAC7D,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp.mjs","sources":["../../src/fields/timestamp.ts"],"sourcesContent":["import * as dateFns from 'date-fns';\n\nimport { parseDateTimeOrTimestamp } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimestampField extends Field {\n toDB(value: unknown) {\n return parseDateTimeOrTimestamp(value);\n }\n\n fromDB(value: unknown) {\n const cast = new Date(value as any);\n return dateFns.isValid(cast) ? dateFns.format(cast, 'T') : null;\n }\n}\n"],"names":["TimestampField","Field","toDB","value","parseDateTimeOrTimestamp","fromDB","cast","Date","dateFns","isValid","format"],"mappings":";;;;AAKe,MAAMA,
|
|
1
|
+
{"version":3,"file":"timestamp.mjs","sources":["../../src/fields/timestamp.ts"],"sourcesContent":["import * as dateFns from 'date-fns';\n\nimport { parseDateTimeOrTimestamp } from './shared/parsers';\nimport Field from './field';\n\nexport default class TimestampField extends Field {\n toDB(value: unknown) {\n return parseDateTimeOrTimestamp(value);\n }\n\n fromDB(value: unknown) {\n const cast = new Date(value as any);\n return dateFns.isValid(cast) ? dateFns.format(cast, 'T') : null;\n }\n}\n"],"names":["TimestampField","Field","toDB","value","parseDateTimeOrTimestamp","fromDB","cast","Date","dateFns","isValid","format"],"mappings":";;;;AAKe,MAAMA,cAAAA,SAAuBC,KAAAA,CAAAA;AAC1CC,IAAAA,IAAAA,CAAKC,KAAc,EAAE;AACnB,QAAA,OAAOC,wBAAAA,CAAyBD,KAAAA,CAAAA;AAClC,IAAA;AAEAE,IAAAA,MAAAA,CAAOF,KAAc,EAAE;QACrB,MAAMG,IAAAA,GAAO,IAAIC,IAAAA,CAAKJ,KAAAA,CAAAA;QACtB,OAAOK,OAAAA,CAAQC,OAAO,CAACH,IAAAA,CAAAA,GAAQE,QAAQE,MAAM,CAACJ,MAAM,GAAA,CAAA,GAAO,IAAA;AAC7D,IAAA;AACF;;;;"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { Knex } from 'knex';\n\nimport path from 'node:path';\n\nimport { Dialect, getDialect } from './dialects';\nimport { createSchemaProvider, SchemaProvider } from './schema';\nimport { createMetadata, Metadata } from './metadata';\nimport { createEntityManager, EntityManager } from './entity-manager';\nimport { createMigrationsProvider, MigrationProvider, type Migration } from './migrations';\nimport { createLifecyclesProvider, LifecycleProvider } from './lifecycles';\nimport { createConnection } from './connection';\nimport * as errors from './errors';\nimport { Callback, transactionCtx, TransactionObject } from './transaction-context';\nimport { validateDatabase } from './validations';\nimport type { Model, JoinTable } from './types';\nimport type { Identifiers } from './utils/identifiers';\nimport { createRepairManager, type RepairManager } from './repairs';\n\nexport { isKnexQuery } from './utils/knex';\n\ninterface Settings {\n forceMigration?: boolean;\n runMigrations?: boolean;\n migrations: {\n dir: string;\n };\n [key: string]: unknown;\n}\n\nexport type Logger = Record<\n 'info' | 'warn' | 'error' | 'debug',\n (message: string | Record<string, unknown>) => void\n>;\n\nexport interface DatabaseConfig {\n connection: Knex.Config;\n settings: Settings;\n logger?: Logger;\n}\n\nconst afterCreate =\n (db: Database) =>\n (\n nativeConnection: unknown,\n done: (error: Error | null, nativeConnection: unknown) => Promise<void>\n ) => {\n // run initialize for it since commands such as postgres SET and sqlite PRAGMA are per-connection\n db.dialect.initialize(nativeConnection).then(() => {\n return done(null, nativeConnection);\n });\n };\n\nclass Database {\n connection: Knex;\n\n dialect: Dialect;\n\n config: DatabaseConfig;\n\n metadata: Metadata;\n\n schema: SchemaProvider;\n\n migrations: MigrationProvider;\n\n lifecycles: LifecycleProvider;\n\n entityManager: EntityManager;\n\n repair: RepairManager;\n\n logger: Logger;\n\n constructor(config: DatabaseConfig) {\n this.config = {\n ...config,\n settings: {\n forceMigration: true,\n runMigrations: true,\n ...(config.settings ?? {}),\n },\n };\n\n this.logger = config.logger ?? console;\n\n this.dialect = getDialect(this);\n\n let knexConfig: Knex.Config = this.config.connection;\n\n // for object connections, we can configure the dialect synchronously\n if (typeof this.config.connection.connection !== 'function') {\n this.dialect.configure();\n }\n // for connection functions, we wrap it so that we can modify it with dialect configure before it reaches knex\n else {\n this.logger.warn(\n 'Knex connection functions are currently experimental. Attempting to access the connection object before database initialization will result in errors.'\n );\n\n knexConfig = {\n ...this.config.connection,\n connection: async () => {\n // @ts-expect-error confirmed it was a function above\n const conn = await this.config.connection.connection();\n this.dialect.configure(conn);\n return conn;\n },\n };\n }\n\n this.metadata = createMetadata([]);\n\n this.connection = createConnection(knexConfig, {\n pool: { afterCreate: afterCreate(this) },\n });\n\n this.schema = createSchemaProvider(this);\n\n this.migrations = createMigrationsProvider(this);\n this.lifecycles = createLifecyclesProvider(this);\n\n this.entityManager = createEntityManager(this);\n\n this.repair = createRepairManager(this);\n }\n\n async init({ models }: { models: Model[] }) {\n if (typeof this.config.connection.connection === 'function') {\n /*\n * User code needs to be able to access `connection.connection` directly as if\n * it were always an object. For a connection function, that doesn't happen\n * until the pool is created, so we need to do that here\n *\n * TODO: In the next major version, we need to replace all internal code that\n * directly references `connection.connection` prior to init, and make a breaking\n * change that it cannot be relied on to exist before init so that we can call\n * this feature stable.\n */\n this.logger.debug('Forcing Knex to make real connection to db');\n\n // sqlite does not support connection pooling so acquireConnection doesn't work\n if (this.config.connection.client === 'sqlite') {\n await this.connection.raw('SELECT 1');\n } else {\n await this.connection.client.acquireConnection();\n }\n }\n\n this.metadata.loadModels(models);\n await validateDatabase(this);\n return this;\n }\n\n query(uid: string) {\n if (!this.metadata.has(uid)) {\n throw new Error(`Model ${uid} not found`);\n }\n\n return this.entityManager.getRepository(uid);\n }\n\n inTransaction() {\n return !!transactionCtx.get();\n }\n\n transaction(): Promise<TransactionObject>;\n transaction<TCallback extends Callback>(c: TCallback): Promise<ReturnType<TCallback>>;\n async transaction<TCallback extends Callback>(\n cb?: TCallback\n ): Promise<ReturnType<TCallback> | TransactionObject> {\n const notNestedTransaction = !transactionCtx.get();\n const trx = notNestedTransaction\n ? await this.connection.transaction()\n : (transactionCtx.get() as Knex.Transaction);\n\n async function commit() {\n if (notNestedTransaction) {\n await transactionCtx.commit(trx);\n }\n }\n\n async function rollback() {\n if (notNestedTransaction) {\n await transactionCtx.rollback(trx);\n }\n }\n\n if (!cb) {\n return { commit, rollback, get: () => trx };\n }\n\n return transactionCtx.run(trx, async () => {\n try {\n const callbackParams = {\n trx,\n commit,\n rollback,\n onCommit: transactionCtx.onCommit,\n onRollback: transactionCtx.onRollback,\n };\n const res = await cb(callbackParams);\n await commit();\n return res;\n } catch (error) {\n await rollback();\n throw error;\n }\n });\n }\n\n getSchemaName(): string | undefined {\n return this.connection.client.connectionSettings.schema;\n }\n\n getConnection(): Knex;\n getConnection(tableName?: string): Knex.QueryBuilder;\n getConnection(tableName?: string): Knex | Knex.QueryBuilder {\n const schema = this.getSchemaName();\n const connection = tableName ? this.connection(tableName) : this.connection;\n return schema ? connection.withSchema(schema) : connection;\n }\n\n // Returns basic info about the database connection\n getInfo() {\n const connectionSettings = this.connection?.client?.connectionSettings || {};\n const client = this.dialect?.client || '';\n\n let displayName = '';\n let schema;\n\n // For SQLite, get the relative filename\n if (client === 'sqlite') {\n const absolutePath = connectionSettings?.filename;\n if (absolutePath) {\n displayName = path.relative(process.cwd(), absolutePath);\n }\n }\n // For other dialects, get the database name\n else {\n displayName = connectionSettings?.database;\n schema = connectionSettings?.schema;\n }\n\n return {\n displayName,\n schema,\n client,\n };\n }\n\n getSchemaConnection(trx = this.connection) {\n const schema = this.getSchemaName();\n return schema ? trx.schema.withSchema(schema) : trx.schema;\n }\n\n queryBuilder(uid: string) {\n return this.entityManager.createQueryBuilder(uid);\n }\n\n async destroy() {\n await this.lifecycles.clear();\n await this.connection.destroy();\n }\n}\n\nexport { Database, errors };\nexport type { Model, JoinTable, Identifiers, Migration };\n"],"names":["afterCreate","db","nativeConnection","done","dialect","initialize","then","Database","init","models","config","connection","logger","debug","client","raw","acquireConnection","metadata","loadModels","validateDatabase","query","uid","has","Error","entityManager","getRepository","inTransaction","transactionCtx","get","transaction","cb","notNestedTransaction","trx","commit","rollback","run","callbackParams","onCommit","onRollback","res","error","getSchemaName","connectionSettings","schema","getConnection","tableName","withSchema","getInfo","displayName","absolutePath","filename","path","relative","process","cwd","database","getSchemaConnection","queryBuilder","createQueryBuilder","destroy","lifecycles","clear","settings","forceMigration","runMigrations","console","getDialect","knexConfig","configure","warn","conn","createMetadata","createConnection","pool","createSchemaProvider","migrations","createMigrationsProvider","createLifecyclesProvider","createEntityManager","repair","createRepairManager"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":";;;;;;;AA0BO,MAAMA,2BAA2B,CAACC,EAAAA,GAAAA;AACvC,IAAA,IAAIC,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":";;;;;AA0BO,MAAMA,2BAA2B,CAACC,EAAAA,GAAAA;AACvC,IAAA,IAAIC,
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;;;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;;;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,UAAAA,KAAe,UAAA,IAAe,OAAOA,UAAAA,KAAe,YAAYA,UAAAA,KAAe,IAAA;AAE1F;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,UAAAA,KAAe,UAAA,IAAe,OAAOA,UAAAA,KAAe,YAAYA,UAAAA,KAAe,IAAA;AAE1F;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models-lifecycles.js","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":";;AAEA;;
|
|
1
|
+
{"version":3,"file":"models-lifecycles.js","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":";;AAEA;;IAGO,MAAMA,0BAAAA,GAAyC,OAAOC,KAAAA,GAAAA;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD,KAAAA;IAElB,IAAIC,KAAAA,CAAMC,UAAU,IAAIF,KAAAA,CAAMG,MAAM,IAAIF,KAAAA,CAAMC,UAAU,EAAE;AACxD,QAAA,MAAMD,MAAMC,UAAU,CAACF,KAAAA,CAAMG,MAAM,CAAC,GAAGH,KAAAA,CAAAA;AACzC,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models-lifecycles.mjs","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":"AAEA;;
|
|
1
|
+
{"version":3,"file":"models-lifecycles.mjs","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":"AAEA;;IAGO,MAAMA,0BAAAA,GAAyC,OAAOC,KAAAA,GAAAA;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD,KAAAA;IAElB,IAAIC,KAAAA,CAAMC,UAAU,IAAIF,KAAAA,CAAMG,MAAM,IAAIF,KAAAA,CAAMC,UAAU,EAAE;AACxD,QAAA,MAAMD,MAAMC,UAAU,CAACF,KAAAA,CAAMG,MAAM,CAAC,GAAGH,KAAAA,CAAAA;AACzC,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamps.js","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;;;AAGA;MACaA,
|
|
1
|
+
{"version":3,"file":"timestamps.js","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;;;AAGA;MACaA,8BAAAA,GAA6C;AACxD;;AAEC,MACDC,cAAaC,KAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAAA,CAAEC,QAAQ,CAACL,IAAAA,EAAM;YAAEM,SAAAA,EAAWJ,GAAAA;YAAKK,SAAAA,EAAWL;AAAI,SAAA,CAAA;AACpD,IAAA,CAAA;AAEA;;;AAGC,MACDM,kBAAiBT,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAAA,CAAAA,EAAO;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAAA,CAAEC,QAAQ,CAACL,IAAAA,EAAM;oBAAEM,SAAAA,EAAWJ,GAAAA;oBAAKK,SAAAA,EAAWL;AAAI,iBAAA,CAAA,CAAA;AAC3E,QAAA;AACF,IAAA,CAAA;AAEA;;;AAGC,MACDS,cAAaZ,KAAK,EAAA;AAChB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAAA,CAAEQ,MAAM,CAACZ,IAAAA,EAAM;YAAEO,SAAAA,EAAWL;AAAI,SAAA,CAAA;AAClC,IAAA,CAAA;AAEA;;;AAGC,MACDW,kBAAiBd,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAAA,CAAAA,EAAO;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAAA,CAAEQ,MAAM,CAACZ,IAAAA,EAAM;oBAAEO,SAAAA,EAAWL;AAAI,iBAAA,CAAA,CAAA;AACzD,QAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamps.mjs","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;AAGA;MACaA,
|
|
1
|
+
{"version":3,"file":"timestamps.mjs","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;AAGA;MACaA,8BAAAA,GAA6C;AACxD;;AAEC,MACDC,cAAaC,KAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAAA,CAAEC,QAAQ,CAACL,IAAAA,EAAM;YAAEM,SAAAA,EAAWJ,GAAAA;YAAKK,SAAAA,EAAWL;AAAI,SAAA,CAAA;AACpD,IAAA,CAAA;AAEA;;;AAGC,MACDM,kBAAiBT,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAAA,CAAAA,EAAO;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAAA,CAAEC,QAAQ,CAACL,IAAAA,EAAM;oBAAEM,SAAAA,EAAWJ,GAAAA;oBAAKK,SAAAA,EAAWL;AAAI,iBAAA,CAAA,CAAA;AAC3E,QAAA;AACF,IAAA,CAAA;AAEA;;;AAGC,MACDS,cAAaZ,KAAK,EAAA;AAChB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAAA,CAAEQ,MAAM,CAACZ,IAAAA,EAAM;YAAEO,SAAAA,EAAWL;AAAI,SAAA,CAAA;AAClC,IAAA,CAAA;AAEA;;;AAGC,MACDW,kBAAiBd,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAAA,CAAAA,EAAO;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAAA,CAAEQ,MAAM,CAACZ,IAAAA,EAAM;oBAAEO,SAAAA,EAAWL;AAAI,iBAAA,CAAA,CAAA;AACzD,QAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;;;AAuBA;AACA;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;;;AAuBA;AACA;;IAGO,MAAMA,cAAAA,GAAiB,CAACC,MAAAA,GAAAA;AAC7B,IAAA,MAAMC,aAAW,IAAIC,iBAAAA,EAAAA;IAErB,IAAIF,MAAAA,CAAOG,MAAM,EAAE;AACjBF,QAAAA,UAAAA,CAASG,UAAU,CAACJ,MAAAA,CAAAA;AACtB,IAAA;IAEA,OAAOC,UAAAA;AACT;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;AAuBA;AACA;;
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;AAuBA;AACA;;IAGO,MAAMA,cAAAA,GAAiB,CAACC,MAAAA,GAAAA;AAC7B,IAAA,MAAMC,WAAW,IAAIC,QAAAA,EAAAA;IAErB,IAAIF,MAAAA,CAAOG,MAAM,EAAE;AACjBF,QAAAA,QAAAA,CAASG,UAAU,CAACJ,MAAAA,CAAAA;AACtB,IAAA;IAEA,OAAOC,QAAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sources":["../../src/metadata/metadata.ts"],"sourcesContent":["import { cloneDeep, snakeCase } from 'lodash/fp';\nimport { identifiers } from '../utils/identifiers';\nimport * as types from '../utils/types';\nimport { createRelation } from './relations';\nimport type { Attribute, Model } from '../types';\nimport type { ForeignKey, Index } from '../schema/types';\nimport type { Action, SubscriberFn } from '../lifecycles';\n\nexport interface Meta extends Model {\n columnToAttribute: Record<string, string>;\n indexes: Index[];\n foreignKeys: ForeignKey[];\n lifecycles: Partial<Record<Action, SubscriberFn>>;\n}\n\nexport class Metadata extends Map<string, Meta> {\n // TODO: we expose the global identifiers in this way so that in the future we can instantiate our own\n // However, it should NOT be done until all the methods used by metadata can be part of this metadata object\n // and access this one; currently they all access the global identifiers directly.\n get identifiers() {\n return identifiers;\n }\n\n get(key: string): Meta {\n if (!super.has(key)) {\n throw new Error(`Metadata for \"${key}\" not found`);\n }\n\n return super.get(key) as Meta;\n }\n\n add(meta: Meta) {\n return this.set(meta.uid, meta);\n }\n\n /**\n * Validate the DB metadata, throwing an error if a duplicate DB table name is detected\n */\n validate() {\n const seenTables = new Map();\n for (const meta of this.values()) {\n if (seenTables.get(meta.tableName)) {\n throw new Error(\n `DB table \"${meta.tableName}\" already exists. Change the collectionName of the related content type.`\n );\n }\n seenTables.set(meta.tableName, true);\n }\n }\n\n loadModels(models: Model[]) {\n // init pass\n for (const model of cloneDeep(models ?? [])) {\n const tableName = identifiers.getTableName(model.tableName);\n this.add({\n ...model,\n tableName,\n attributes: {\n ...model.attributes,\n },\n lifecycles: model.lifecycles ?? {},\n indexes: model.indexes ?? [],\n foreignKeys: model.foreignKeys ?? [],\n columnToAttribute: {},\n });\n }\n\n // build compos / relations\n for (const meta of this.values()) {\n for (const [attributeName, attribute] of Object.entries(meta.attributes)) {\n try {\n if (attribute.unstable_virtual) {\n continue;\n }\n\n if (types.isRelationalAttribute(attribute)) {\n createRelation(attributeName, attribute, meta, this);\n continue;\n }\n\n createAttribute(attributeName, attribute);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`\n );\n }\n }\n }\n }\n\n for (const meta of this.values()) {\n const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key) => {\n const attribute = meta.attributes[key];\n if ('columnName' in attribute) {\n return Object.assign(acc, { [attribute.columnName || key]: key });\n }\n\n return Object.assign(acc, { [key]: key });\n }, {});\n\n meta.columnToAttribute = columnToAttribute;\n }\n\n this.validate();\n }\n}\n\nconst createAttribute = (attributeName: string, attribute: Attribute) => {\n // if the attribute has already set its own column name, use that\n // this will prevent us from shortening a name twice\n if ('columnName' in attribute && attribute.columnName) {\n return;\n }\n\n const columnName = identifiers.getColumnName(snakeCase(attributeName));\n\n Object.assign(attribute, { columnName });\n};\n"],"names":["Metadata","Map","identifiers","get","key","has","Error","add","meta","set","uid","validate","seenTables","values","tableName","loadModels","models","model","cloneDeep","getTableName","attributes","lifecycles","indexes","foreignKeys","columnToAttribute","attributeName","attribute","Object","entries","unstable_virtual","types","createRelation","createAttribute","error","singularName","message","keys","reduce","acc","assign","columnName","getColumnName","snakeCase"],"mappings":";;;;;;;AAeO,MAAMA,
|
|
1
|
+
{"version":3,"file":"metadata.js","sources":["../../src/metadata/metadata.ts"],"sourcesContent":["import { cloneDeep, snakeCase } from 'lodash/fp';\nimport { identifiers } from '../utils/identifiers';\nimport * as types from '../utils/types';\nimport { createRelation } from './relations';\nimport type { Attribute, Model } from '../types';\nimport type { ForeignKey, Index } from '../schema/types';\nimport type { Action, SubscriberFn } from '../lifecycles';\n\nexport interface Meta extends Model {\n columnToAttribute: Record<string, string>;\n indexes: Index[];\n foreignKeys: ForeignKey[];\n lifecycles: Partial<Record<Action, SubscriberFn>>;\n}\n\nexport class Metadata extends Map<string, Meta> {\n // TODO: we expose the global identifiers in this way so that in the future we can instantiate our own\n // However, it should NOT be done until all the methods used by metadata can be part of this metadata object\n // and access this one; currently they all access the global identifiers directly.\n get identifiers() {\n return identifiers;\n }\n\n get(key: string): Meta {\n if (!super.has(key)) {\n throw new Error(`Metadata for \"${key}\" not found`);\n }\n\n return super.get(key) as Meta;\n }\n\n add(meta: Meta) {\n return this.set(meta.uid, meta);\n }\n\n /**\n * Validate the DB metadata, throwing an error if a duplicate DB table name is detected\n */\n validate() {\n const seenTables = new Map();\n for (const meta of this.values()) {\n if (seenTables.get(meta.tableName)) {\n throw new Error(\n `DB table \"${meta.tableName}\" already exists. Change the collectionName of the related content type.`\n );\n }\n seenTables.set(meta.tableName, true);\n }\n }\n\n loadModels(models: Model[]) {\n // init pass\n for (const model of cloneDeep(models ?? [])) {\n const tableName = identifiers.getTableName(model.tableName);\n this.add({\n ...model,\n tableName,\n attributes: {\n ...model.attributes,\n },\n lifecycles: model.lifecycles ?? {},\n indexes: model.indexes ?? [],\n foreignKeys: model.foreignKeys ?? [],\n columnToAttribute: {},\n });\n }\n\n // build compos / relations\n for (const meta of this.values()) {\n for (const [attributeName, attribute] of Object.entries(meta.attributes)) {\n try {\n if (attribute.unstable_virtual) {\n continue;\n }\n\n if (types.isRelationalAttribute(attribute)) {\n createRelation(attributeName, attribute, meta, this);\n continue;\n }\n\n createAttribute(attributeName, attribute);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`\n );\n }\n }\n }\n }\n\n for (const meta of this.values()) {\n const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key) => {\n const attribute = meta.attributes[key];\n if ('columnName' in attribute) {\n return Object.assign(acc, { [attribute.columnName || key]: key });\n }\n\n return Object.assign(acc, { [key]: key });\n }, {});\n\n meta.columnToAttribute = columnToAttribute;\n }\n\n this.validate();\n }\n}\n\nconst createAttribute = (attributeName: string, attribute: Attribute) => {\n // if the attribute has already set its own column name, use that\n // this will prevent us from shortening a name twice\n if ('columnName' in attribute && attribute.columnName) {\n return;\n }\n\n const columnName = identifiers.getColumnName(snakeCase(attributeName));\n\n Object.assign(attribute, { columnName });\n};\n"],"names":["Metadata","Map","identifiers","get","key","has","Error","add","meta","set","uid","validate","seenTables","values","tableName","loadModels","models","model","cloneDeep","getTableName","attributes","lifecycles","indexes","foreignKeys","columnToAttribute","attributeName","attribute","Object","entries","unstable_virtual","types","createRelation","createAttribute","error","singularName","message","keys","reduce","acc","assign","columnName","getColumnName","snakeCase"],"mappings":"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"}
|