diff --git a/module/data/fields/_module.mjs b/module/data/fields/_module.mjs index 41436d4f..dc57c779 100644 --- a/module/data/fields/_module.mjs +++ b/module/data/fields/_module.mjs @@ -1,2 +1,3 @@ export { default as FormulaField } from "./formulaField.mjs"; -export { default as ForeignDocumentUUIDField } from "./foreignDocumentUUIDField.mjs"; \ No newline at end of file +export { default as ForeignDocumentUUIDField } from "./foreignDocumentUUIDField.mjs"; +export { default as PseudoDocumentsField } from "./pseudoDocumentsField.mjs"; \ No newline at end of file diff --git a/module/data/fields/pseudoDocumentsField.mjs b/module/data/fields/pseudoDocumentsField.mjs new file mode 100644 index 00000000..718bd42d --- /dev/null +++ b/module/data/fields/pseudoDocumentsField.mjs @@ -0,0 +1,22 @@ +import { BasePseudoDocument } from "../pseudo-documents/_types"; +export default class PseudoDocumentsField extends foundry.data.fields.TypedObjectField { + constructor(model, options = {}, context = {}) { + options.validateKey ||= ((key) => foundry.data.validators.isValidId(key)); + if (!(model instanceof BasePseudoDocument)) throw new Error("The model must be a PseudoDocument"); + const field = new foundry.data.fields.EmbeddedDataField(model); + super(field, options, context); + } + + /** @inheritdoc */ + static get _defaults() { + return Object.assign(super._defaults, { + max: Infinity + }); + } + + /** @override */ + _validateType(value, options = {}) { + if (Object.keys(value).length > this.max) throw new Error(`cannot have more than ${this.max} elements`); + return super._validateType(value, options); + } +} \ No newline at end of file diff --git a/module/data/pseudo-documents/base.mjs b/module/data/pseudo-documents/base.mjs index db44e344..e3b8c642 100644 --- a/module/data/pseudo-documents/base.mjs +++ b/module/data/pseudo-documents/base.mjs @@ -121,8 +121,8 @@ export default class BasePseudoDocument extends foundry.abstract.DataModel { getEmbeddedDocument(embeddedName, id, { invalid = false, strict = false } = {}) { const embeds = this.constructor.metadata.embedded ?? {}; if (embeddedName in embeds) { - const path = embeds[embeddedName]; - return foundry.utils.getProperty(this, path).get(id, { invalid, strict }) ?? null; + const path = `${embeds[embeddedName]}.${id}`; + return foundry.utils.getProperty(this, path) ?? null; } return null; }