{"version":3,"file":"metadata.mjs","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;\n indexes: Index[];\n foreignKeys: ForeignKey[];\n lifecycles: Partial>;\n}\n\nexport class Metadata extends Map {\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,QAAiBC,SAAAA,GAAAA,CAAAA;;;;AAI5B,IAAA,IAAIC,WAAc,GAAA;QAChB,OAAOA,WAAAA;AACT;AAEAC,IAAAA,GAAAA,CAAIC,GAAW,EAAQ;AACrB,QAAA,IAAI,CAAC,KAAK,CAACC,GAAAA,CAAID,GAAM,CAAA,EAAA;AACnB,YAAA,MAAM,IAAIE,KAAM,CAAA,CAAC,cAAc,EAAEF,GAAAA,CAAI,WAAW,CAAC,CAAA;AACnD;QAEA,OAAO,KAAK,CAACD,GAAIC,CAAAA,GAAAA,CAAAA;AACnB;AAEAG,IAAAA,GAAAA,CAAIC,IAAU,EAAE;AACd,QAAA,OAAO,IAAI,CAACC,GAAG,CAACD,IAAAA,CAAKE,GAAG,EAAEF,IAAAA,CAAAA;AAC5B;AAEA;;AAEC,MACDG,QAAW,GAAA;AACT,QAAA,MAAMC,aAAa,IAAIX,GAAAA,EAAAA;AACvB,QAAA,KAAK,MAAMO,IAAAA,IAAQ,IAAI,CAACK,MAAM,EAAI,CAAA;AAChC,YAAA,IAAID,UAAWT,CAAAA,GAAG,CAACK,IAAAA,CAAKM,SAAS,CAAG,EAAA;gBAClC,MAAM,IAAIR,MACR,CAAC,UAAU,EAAEE,IAAKM,CAAAA,SAAS,CAAC,wEAAwE,CAAC,CAAA;AAEzG;AACAF,YAAAA,UAAAA,CAAWH,GAAG,CAACD,IAAKM,CAAAA,SAAS,EAAE,IAAA,CAAA;AACjC;AACF;AAEAC,IAAAA,UAAAA,CAAWC,MAAe,EAAE;;AAE1B,QAAA,KAAK,MAAMC,KAAAA,IAASC,SAAUF,CAAAA,MAAAA,IAAU,EAAE,CAAG,CAAA;AAC3C,YAAA,MAAMF,SAAYZ,GAAAA,WAAAA,CAAYiB,YAAY,CAACF,MAAMH,SAAS,CAAA;YAC1D,IAAI,CAACP,GAAG,CAAC;AACP,gBAAA,GAAGU,KAAK;AACRH,gBAAAA,SAAAA;gBACAM,UAAY,EAAA;AACV,oBAAA,GAAGH,MAAMG;AACX,iBAAA;gBACAC,UAAYJ,EAAAA,KAAAA,CAAMI,UAAU,IAAI,EAAC;gBACjCC,OAASL,EAAAA,KAAAA,CAAMK,OAAO,IAAI,EAAE;gBAC5BC,WAAaN,EAAAA,KAAAA,CAAMM,WAAW,IAAI,EAAE;AACpCC,gBAAAA,iBAAAA,EAAmB;AACrB,aAAA,CAAA;AACF;;AAGA,QAAA,KAAK,MAAMhB,IAAAA,IAAQ,IAAI,CAACK,MAAM,EAAI,CAAA;YAChC,KAAK,MAAM,CAACY,aAAAA,EAAeC,SAAU,CAAA,IAAIC,OAAOC,OAAO,CAACpB,IAAKY,CAAAA,UAAU,CAAG,CAAA;gBACxE,IAAI;oBACF,IAAIM,SAAAA,CAAUG,gBAAgB,EAAE;AAC9B,wBAAA;AACF;oBAEA,IAAIC,qBAA2B,CAACJ,SAAY,CAAA,EAAA;wBAC1CK,cAAeN,CAAAA,aAAAA,EAAeC,SAAWlB,EAAAA,IAAAA,EAAM,IAAI,CAAA;AACnD,wBAAA;AACF;AAEAwB,oBAAAA,eAAAA,CAAgBP,aAAeC,EAAAA,SAAAA,CAAAA;AACjC,iBAAA,CAAE,OAAOO,KAAO,EAAA;AACd,oBAAA,IAAIA,iBAAiB3B,KAAO,EAAA;wBAC1B,MAAM,IAAIA,MACR,CAAC,mBAAmB,EAAEmB,aAAc,CAAA,UAAU,EAAEjB,IAAK0B,CAAAA,YAAY,CAAC,CAAC,EAAE1B,KAAKE,GAAG,CAAC,GAAG,EAAEuB,KAAAA,CAAME,OAAO,CAAC,CAAC,CAAA;AAEtG;AACF;AACF;AACF;AAEA,QAAA,KAAK,MAAM3B,IAAAA,IAAQ,IAAI,CAACK,MAAM,EAAI,CAAA;YAChC,MAAMW,iBAAAA,GAAoBG,MAAOS,CAAAA,IAAI,CAAC5B,IAAAA,CAAKY,UAAU,CAAEiB,CAAAA,MAAM,CAAC,CAACC,GAAKlC,EAAAA,GAAAA,GAAAA;AAClE,gBAAA,MAAMsB,SAAYlB,GAAAA,IAAAA,CAAKY,UAAU,CAAChB,GAAI,CAAA;AACtC,gBAAA,IAAI,gBAAgBsB,SAAW,EAAA;oBAC7B,OAAOC,MAAAA,CAAOY,MAAM,CAACD,GAAK,EAAA;AAAE,wBAAA,CAACZ,SAAUc,CAAAA,UAAU,IAAIpC,GAAAA,GAAMA;AAAI,qBAAA,CAAA;AACjE;gBAEA,OAAOuB,MAAAA,CAAOY,MAAM,CAACD,GAAK,EAAA;AAAE,oBAAA,CAAClC,MAAMA;AAAI,iBAAA,CAAA;AACzC,aAAA,EAAG,EAAC,CAAA;AAEJI,YAAAA,IAAAA,CAAKgB,iBAAiB,GAAGA,iBAAAA;AAC3B;AAEA,QAAA,IAAI,CAACb,QAAQ,EAAA;AACf;AACF;AAEA,MAAMqB,eAAAA,GAAkB,CAACP,aAAuBC,EAAAA,SAAAA,GAAAA;;;AAG9C,IAAA,IAAI,YAAgBA,IAAAA,SAAAA,IAAaA,SAAUc,CAAAA,UAAU,EAAE;AACrD,QAAA;AACF;AAEA,IAAA,MAAMA,UAAatC,GAAAA,WAAAA,CAAYuC,aAAa,CAACC,SAAUjB,CAAAA,aAAAA,CAAAA,CAAAA;IAEvDE,MAAOY,CAAAA,MAAM,CAACb,SAAW,EAAA;AAAEc,QAAAA;AAAW,KAAA,CAAA;AACxC,CAAA;;;;"}