prisma-erd-generator
Version:
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> [](#contributors-) <!-- ALL-CONTRIBUTORS-BADGE:END -->
38 lines (34 loc) • 13.7 kB
JavaScript
;(()=>{var z=Object.create;var P=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var N=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var A=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var ee=(e,n,t,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of H(n))!Z.call(e,s)&&s!==t&&P(e,s,{get:()=>n[s],enumerable:!(o=Q(n,s))||o.enumerable});return e};var V=(e,n,t)=>(t=e!=null?z(X(e)):{},ee(n||!e||!e.__esModule?P(t,"default",{value:e,enumerable:!0}):t,e));var K=A((De,te)=>{te.exports={name:"dotenv",version:"16.6.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var J=A(($e,_)=>{"use strict";var k=N("fs"),T=N("path"),ne=N("os"),re=N("crypto"),oe=K(),C=oe.version,ie=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function se(e){let n={},t=e.toString();t=t.replace(/\r\n?/mg,`
`);let o;for(;(o=ie.exec(t))!=null;){let s=o[1],r=o[2]||"";r=r.trim();let l=r[0];r=r.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),l==='"'&&(r=r.replace(/\\n/g,`
`),r=r.replace(/\\r/g,"\r")),n[s]=r}return n}function ae(e){e=e||{};let n=B(e);e.path=n;let t=f.configDotenv(e);if(!t.parsed){let l=new Error(`MISSING_DATA: Cannot parse ${n} for an unknown reason`);throw l.code="MISSING_DATA",l}let o=U(e).split(","),s=o.length,r;for(let l=0;l<s;l++)try{let c=o[l].trim(),h=le(t,c);r=f.decrypt(h.ciphertext,h.key);break}catch(c){if(l+1>=s)throw c}return f.parse(r)}function ce(e){console.log(`[dotenv@${C}][WARN] ${e}`)}function j(e){console.log(`[dotenv@${C}][DEBUG] ${e}`)}function q(e){console.log(`[dotenv@${C}] ${e}`)}function U(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function le(e,n){let t;try{t=new URL(n)}catch(c){if(c.code==="ERR_INVALID_URL"){let h=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw h.code="INVALID_DOTENV_KEY",h}throw c}let o=t.password;if(!o){let c=new Error("INVALID_DOTENV_KEY: Missing key part");throw c.code="INVALID_DOTENV_KEY",c}let s=t.searchParams.get("environment");if(!s){let c=new Error("INVALID_DOTENV_KEY: Missing environment part");throw c.code="INVALID_DOTENV_KEY",c}let r=`DOTENV_VAULT_${s.toUpperCase()}`,l=e.parsed[r];if(!l){let c=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${r} in your .env.vault file.`);throw c.code="NOT_FOUND_DOTENV_ENVIRONMENT",c}return{ciphertext:l,key:o}}function B(e){let n=null;if(e&&e.path&&e.path.length>0)if(Array.isArray(e.path))for(let t of e.path)k.existsSync(t)&&(n=t.endsWith(".vault")?t:`${t}.vault`);else n=e.path.endsWith(".vault")?e.path:`${e.path}.vault`;else n=T.resolve(process.cwd(),".env.vault");return k.existsSync(n)?n:null}function Y(e){return e[0]==="~"?T.join(ne.homedir(),e.slice(1)):e}function de(e){let n=!!(e&&e.debug),t=e&&"quiet"in e?e.quiet:!0;(n||!t)&&q("Loading env from encrypted .env.vault");let o=f._parseVault(e),s=process.env;return e&&e.processEnv!=null&&(s=e.processEnv),f.populate(s,o,e),{parsed:o}}function me(e){let n=T.resolve(process.cwd(),".env"),t="utf8",o=!!(e&&e.debug),s=e&&"quiet"in e?e.quiet:!0;e&&e.encoding?t=e.encoding:o&&j("No encoding is specified. UTF-8 is used by default");let r=[n];if(e&&e.path)if(!Array.isArray(e.path))r=[Y(e.path)];else{r=[];for(let u of e.path)r.push(Y(u))}let l,c={};for(let u of r)try{let d=f.parse(k.readFileSync(u,{encoding:t}));f.populate(c,d,e)}catch(d){o&&j(`Failed to load ${u} ${d.message}`),l=d}let h=process.env;if(e&&e.processEnv!=null&&(h=e.processEnv),f.populate(h,c,e),o||!s){let u=Object.keys(c).length,d=[];for(let x of r)try{let E=T.relative(process.cwd(),x);d.push(E)}catch(E){o&&j(`Failed to load ${x} ${E.message}`),l=E}q(`injecting env (${u}) from ${d.join(",")}`)}return l?{parsed:c,error:l}:{parsed:c}}function pe(e){if(U(e).length===0)return f.configDotenv(e);let n=B(e);return n?f._configVault(e):(ce(`You set DOTENV_KEY but you are missing a .env.vault file at ${n}. Did you forget to build it?`),f.configDotenv(e))}function fe(e,n){let t=Buffer.from(n.slice(-64),"hex"),o=Buffer.from(e,"base64"),s=o.subarray(0,12),r=o.subarray(-16);o=o.subarray(12,-16);try{let l=re.createDecipheriv("aes-256-gcm",t,s);return l.setAuthTag(r),`${l.update(o)}${l.final()}`}catch(l){let c=l instanceof RangeError,h=l.message==="Invalid key length",u=l.message==="Unsupported state or unable to authenticate data";if(c||h){let d=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw d.code="INVALID_DOTENV_KEY",d}else if(u){let d=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw d.code="DECRYPTION_FAILED",d}else throw l}}function ue(e,n,t={}){let o=!!(t&&t.debug),s=!!(t&&t.override);if(typeof n!="object"){let r=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw r.code="OBJECT_REQUIRED",r}for(let r of Object.keys(n))Object.prototype.hasOwnProperty.call(e,r)?(s===!0&&(e[r]=n[r]),o&&j(s===!0?`"${r}" is already defined and WAS overwritten`:`"${r}" is already defined and was NOT overwritten`)):e[r]=n[r]}var f={configDotenv:me,_configVault:de,_parseVault:ae,config:pe,decrypt:fe,parse:se,populate:ue};_.exports.configDotenv=f.configDotenv;_.exports._configVault=f._configVault;_.exports._parseVault=f._parseVault;_.exports.config=f.config;_.exports.decrypt=f.decrypt;_.exports.parse=f.parse;_.exports.populate=f.populate;_.exports=f});var g=V(N("path")),L=V(N("child_process")),y=V(N("fs")),R=V(N("os")),G=N("url"),W=V(J());W.config();function ge(e,n){let{tableOnly:t=!1,ignoreEnums:o=!1,ignoreViews:s=!1,ignorePattern:r=[],includeRelationFromFields:l=!1,disableEmoji:c=!1}=n??{},h="erDiagram",u=e.models;if(s&&e.views){let m=new Set(e.views.map(a=>a.name));u=u.filter(a=>!m.has(a.name))}r.length>0&&(u=u.filter(m=>!Ee(m.name,r)));let d=u.concat(e.types),x=t||o?"":e.enums.map(m=>`
${m.dbName||m.name} {
${m.values.map(a=>`${a.name||a.dbName} ${a.dbName||a.name}`).join(`
`)}
}
`).join(`
`),E=c?'"PK"':'"\u{1F5DD}\uFE0F"',F=c?'"nullable"':'"\u2753"',b=d.map(m=>` "${m.dbName||m.name}" {
${t?"":m.fields.filter(he(m,l)).map(a=>` ${a.type.trimStart()} ${a.name.replace(/^_/,"z_")} ${a.isId||m.primaryKey?.fields?.includes(a.name)?E:""}${a.isRequired?"":F}`).join(`
`)}
}
`).join(`
`),S="";for(let m of d)for(let a of m.fields){let O=a.kind==="enum";if(O&&(t||o))continue;let I=`${O?"enum:":""}${a.name}`,M=`"${m.dbName||m.name}"`,$=`"${d.find(p=>p.name===a.type)?.dbName||a.type}"`;if(a.relationFromFields&&a.relationFromFields.length>0||O){let p=d.find(D=>D.name===a.type||D.dbName===a.type),i=p?.fields.find(({relationName:D})=>D===a.relationName),v="||";i?.isList?v="}o":i?.isRequired||(v="|o");let w="||";a.isList?w="}o":a.isRequired||(w="|o"),S+=` ${M} ${v}--${w} ${p?.dbName||$} : "${I}"
`}else if(d.find(p=>p.name===a.type||p.dbName===a.type)&&a.relationFromFields?.length===0){let p=d.find(i=>i.name===a.type||i.dbName===a.type);if(p){let i=p.fields.find(({relationName:w})=>w===a.relationName);if(!(i?.relationFromFields&&i.relationFromFields.length>0)){let w=d.indexOf(m),D=d.indexOf(p);w<D&&(S+=` ${M} o{--}o ${$} : ""
`)}}}else if(a.kind==="object"){let p=e.types.find(i=>i.name.replace(/^_/,"z_").replace(/\s/g,""));if(console.log($,p),p){let i="||";a.isList?i="}o":a.isRequired||(i="|o");let v=p?.fields.find(({relationName:D})=>D===a.relationName),w=i;v?.isList?i="o{":v?.isRequired||(i="o|"),S+=` ${M} ${i}--${w} ${p.dbName||$} : "${I}"
`}}}return`${h}
${x}
${b}
${S}`}var he=(e,n)=>t=>n?t.kind!=="object":t.kind!=="object"&&!e.fields.find(({relationFromFields:o})=>o?.includes(t.name)),ve=e=>{let n=[],t=e?.split(`
`)||[];for(let o=0;o<t.length;o++){let s=t[o]?.trim();if(!s)continue;let r=s.match(/^view\s+(\w+)\s*{/);r&&r[1]&&n.push(r[1])}return n},ye=e=>{let n=e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${n}$`)},Ee=(e,n)=>n.some(t=>ye(t).test(e)),be=(e,n)=>{let t=n?.split(`
`).filter(o=>o.includes("@map")||o.includes("model ")).map(o=>o.trim());return e.map(o=>({...o,fields:o.fields.map(s=>{let r="None",l=t.filter(c=>(r==="Match"&&c.includes("model ")&&(r="End"),r==="None"&&c.includes(`model ${o.name} `)&&(r="Match"),r==="Match")).find(c=>c.includes(`${s.name} `)&&c.includes("@map"));if(l){let h=new RegExp(/@map\(\"(.*?)\"\)/,"g").exec(l);if(h?.[1]){let u=h[1].replace(/^_/,"z_").replace(/\s/g,"");s.name=u}}return s})}))},Ne=async e=>{try{let n=e.generator.output?.value||"./prisma/ERD.svg",t=e.generator.config,o=t.theme??"forest",s=g.resolve(g.join(t.mmdcPath||"node_modules/.bin","mmdc")),r=t.tableOnly==="true",l=t.disableEmoji==="true",c=t.ignoreEnums==="true",h=t.ignoreViews==="true",u=t.ignorePattern?t.ignorePattern.split(",").map(i=>i.trim()):[],d=t.includeRelationFromFields==="true",x=process.env.DISABLE_ERD==="true"||t.disabled==="true",E=t.erdDebug==="true"||!!process.env.ERD_DEBUG;if(E&&(console.log("debug mode enabled"),console.log("config",t)),x)return console.log("ERD generator is disabled");let F=y.default.mkdtempSync(`${R.default.tmpdir()+g.sep}prisma-erd-`);if(!e.dmmf?.datamodel)throw new Error("Datamodel is missing from generator options");let b=JSON.parse(JSON.stringify(e.dmmf.datamodel));if(E&&b){y.default.mkdirSync(g.resolve("prisma/debug"),{recursive:!0});let i=g.resolve("prisma/debug/1-datamodel.json");y.default.writeFileSync(i,JSON.stringify(b,null,2)),console.log(`data model written to ${i}`)}b.models=be(b.models,e.datamodel),b.types||(b.types=[]);let S=ve(e.datamodel);if(b.views=b.models.filter(i=>S.includes(i.name)),E&&b.models){let i=g.resolve("prisma/debug/2-datamodel-map-applied.json");y.default.writeFileSync(i,JSON.stringify(b,null,2)),console.log(`applied @map to fields written to ${i}`)}let m=ge(b,{tableOnly:r,ignoreEnums:c,ignoreViews:h,ignorePattern:u,includeRelationFromFields:d,disableEmoji:l});if(E&&m){let i=g.resolve("prisma/debug/3-mermaid.mmd");y.default.writeFileSync(i,m),console.log(`mermaid written to ${i}`)}if(!m)throw new Error("failed to construct mermaid instance from dml");if(n.endsWith(".md"))return y.default.writeFileSync(n,`\`\`\`mermaid
${m}\`\`\`
`);let a=g.resolve(g.join(F,"prisma.mmd"));y.default.writeFileSync(a,m);let O={deterministicIds:!0,maxTextSize:9e4,er:{useMaxWidth:!0},theme:o},I=O;if(t?.mermaidConfig){let i=g.resolve(t.mermaidConfig),v=await import((0,G.pathToFileURL)(i).href);E&&console.log("imported mermaid config: ",v),I={...O,...v}}let M=g.resolve(g.join(F,"config.json"));y.default.writeFileSync(M,JSON.stringify(I));let $=t.puppeteerConfig;if($&&!y.default.existsSync($))throw new Error(`Puppeteer config file "${$}" does not exist`);if(!$){let i=g.resolve(g.join(F,"puppeteerConfig.json")),v,w={logLevel:E?"warn":"error",executablePath:v};if(R.default.platform()==="darwin"&&R.default.arch()==="arm64")try{let D=L.execSync("which chromium").toString().replace(`
`,"");if(!D)throw new Error("Could not find chromium executable. Refer to https://github.com/keonik/prisma-erd-generator#issues for next steps.");w.executablePath=D,w.args=["--no-sandbox"]}catch(D){console.error(D),console.log(`
Prisma ERD Generator: Unable to find chromium path for you MacOS arm64 machine. Attempting to use the default at ${v}. To learn more visit https://github.com/keonik/prisma-erd-generator#-arm64-users-
`),v="/usr/bin/chromium-browser"}y.default.writeFileSync(i,JSON.stringify(w)),$=i}if(t.mmdcPath){if(!y.default.existsSync(s))throw new Error(`
Mermaid CLI provided path does not exist.
${s}`)}else if(!y.default.existsSync(s)){let i=L.execSync("find ../.. -name mmdc").toString().split(`
`).filter(v=>v).pop();if(!i||!y.default.existsSync(i))throw new Error(`Expected mermaid CLI at
${s}
or
${i}
but this package was not found.`);s=g.resolve(i)}let p=`"${s}" -i "${a}" -o "${n}" -c "${M}" -p "${$}"`;if(E&&p&&console.log("mermaid command: ",p),L.execSync(p),!y.default.existsSync(n))throw new Error(`Issue generating ER Diagram. Expected ${n} to be created`)}catch(n){throw console.error(n),n}};})();