UNPKG

@prisma/sdk

Version:
347 lines (345 loc) • 17.4 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var getGenerators_exports = {}; __export(getGenerators_exports, { getGenerator: () => getGenerator, getGenerators: () => getGenerators, knownBinaryTargets: () => knownBinaryTargets, skipIndex: () => skipIndex }); module.exports = __toCommonJS(getGenerators_exports); var import_debug = __toESM(require("@prisma/debug")); var import_engine_core = require("@prisma/engine-core"); var import_engines = require("@prisma/engines"); var import_fetch_engine = require("@prisma/fetch-engine"); var import_get_platform = require("@prisma/get-platform"); var import_chalk = __toESM(require("chalk")); var import_fs = __toESM(require("fs")); var import_p_map = __toESM(require("p-map")); var import_path = __toESM(require("path")); var import__ = require(".."); var import_Generator = require("../Generator"); var import_predefinedGeneratorResolvers = require("../predefinedGeneratorResolvers"); var import_resolveOutput = require("../resolveOutput"); var import_extractPreviewFeatures = require("../utils/extractPreviewFeatures"); var import_mapPreviewFeatures = require("../utils/mapPreviewFeatures"); var import_missingDatasource = require("../utils/missingDatasource"); var import_missingGeneratorMessage = require("../utils/missingGeneratorMessage"); var import_parseEnvValue = require("../utils/parseEnvValue"); var import_pick = require("../utils/pick"); var import_printConfigWarnings = require("../utils/printConfigWarnings"); var import_binaryTypeToEngineType = require("./utils/binaryTypeToEngineType"); var import_checkFeatureFlags = require("./utils/check-feature-flags/checkFeatureFlags"); var import_getBinaryPathsByVersion = require("./utils/getBinaryPathsByVersion"); var import_getEngineVersionForGenerator = require("./utils/getEngineVersionForGenerator"); const debug = (0, import_debug.default)("prisma:getGenerators"); async function getGenerators(options) { var _a, _b, _c, _d; const { schemaPath, providerAliases: aliases, version, cliVersion, printDownloadProgress, baseDir = import_path.default.dirname(schemaPath), overrideGenerators, skipDownload, binaryPathsOverride, dataProxy } = options; if (!schemaPath) { throw new Error(`schemaPath for getGenerators got invalid value ${schemaPath}`); } if (!import_fs.default.existsSync(schemaPath)) { throw new Error(`${schemaPath} does not exist`); } const platform = await (0, import_get_platform.getPlatform)(); const queryEngineBinaryType = (0, import_engines.getCliQueryEngineBinaryType)(); const queryEngineType = (0, import_binaryTypeToEngineType.binaryTypeToEngineType)(queryEngineBinaryType); let prismaPath = binaryPathsOverride == null ? void 0 : binaryPathsOverride[queryEngineType]; if (version && !prismaPath) { const potentialPath = eval(`require('path').join(__dirname, '..')`); if (!potentialPath.startsWith("/snapshot/")) { const downloadParams = { binaries: { [queryEngineBinaryType]: potentialPath }, binaryTargets: [platform], showProgress: false, version, skipDownload }; const binaryPathsWithEngineType = await (0, import_fetch_engine.download)(downloadParams); prismaPath = binaryPathsWithEngineType[queryEngineBinaryType][platform]; } } const datamodel = import_fs.default.readFileSync(schemaPath, "utf-8"); const config = await (0, import__.getConfig)({ datamodel, datamodelPath: schemaPath, prismaPath, ignoreEnvVarErrors: true }); if (config.datasources.length === 0) { throw new Error(import_missingDatasource.missingDatasource); } (0, import_printConfigWarnings.printConfigWarnings)(config.warnings); const previewFeatures = (0, import_mapPreviewFeatures.mapPreviewFeatures)((0, import_extractPreviewFeatures.extractPreviewFeatures)(config)); const dmmf = await (0, import__.getDMMF)({ datamodel, datamodelPath: schemaPath, prismaPath, previewFeatures }); if (dmmf.datamodel.models.length === 0) { if (config.datasources.some((d) => d.provider === "mongodb")) { throw new Error(import_missingGeneratorMessage.missingModelMessageMongoDB); } throw new Error(import_missingGeneratorMessage.missingModelMessage); } (0, import_checkFeatureFlags.checkFeatureFlags)(config, options); const generatorConfigs = overrideGenerators || config.generators; await validateGenerators(generatorConfigs); const runningGenerators = []; try { const generators = await (0, import_p_map.default)(generatorConfigs, async (generator, index) => { let generatorPath = (0, import_parseEnvValue.parseEnvValue)(generator.provider); let paths; const providerValue = (0, import_parseEnvValue.parseEnvValue)(generator.provider); if (aliases && aliases[providerValue]) { generatorPath = aliases[providerValue].generatorPath; paths = aliases[providerValue]; } else if (import_predefinedGeneratorResolvers.predefinedGeneratorResolvers[providerValue]) { paths = await import_predefinedGeneratorResolvers.predefinedGeneratorResolvers[providerValue](baseDir, cliVersion); generatorPath = paths.generatorPath; } const generatorInstance = new import_Generator.Generator(generatorPath, generator, paths == null ? void 0 : paths.isNode); await generatorInstance.init(); if (generator.output) { generator.output = { value: import_path.default.resolve(baseDir, (0, import_parseEnvValue.parseEnvValue)(generator.output)), fromEnvVar: null }; generator.isCustomOutput = true; } else if (paths) { generator.output = { value: paths.outputPath, fromEnvVar: null }; } else { if (!generatorInstance.manifest || !generatorInstance.manifest.defaultOutput) { throw new Error(`Can't resolve output dir for generator ${import_chalk.default.bold(generator.name)} with provider ${import_chalk.default.bold(generator.provider)}. The generator needs to either define the \`defaultOutput\` path in the manifest or you need to define \`output\` in the datamodel.prisma file.`); } generator.output = { value: await (0, import_resolveOutput.resolveOutput)({ defaultOutput: generatorInstance.manifest.defaultOutput, baseDir }), fromEnvVar: "null" }; } const options2 = { datamodel, datasources: config.datasources, generator, dmmf, otherGenerators: skipIndex(generatorConfigs, index), schemaPath, version: version || import_engines.enginesVersion, dataProxy }; generatorInstance.setOptions(options2); runningGenerators.push(generatorInstance); return generatorInstance; }, { stopOnError: false }); const generatorProviders = generatorConfigs.map((g) => (0, import_parseEnvValue.parseEnvValue)(g.provider)); for (const g of generators) { if (g.manifest && g.manifest.requiresGenerators && g.manifest.requiresGenerators.length > 0) { for (const neededGenerator of g.manifest.requiresGenerators) { if (!generatorProviders.includes(neededGenerator)) { throw new Error(`Generator "${g.manifest.prettyName}" requires generator "${neededGenerator}", but it is missing in your schema.prisma. Please add it to your schema.prisma: generator gen { provider = "${neededGenerator}" } `); } } } } const neededVersions = /* @__PURE__ */ Object.create(null); for (const g of generators) { if (g.manifest && g.manifest.requiresEngines && Array.isArray(g.manifest.requiresEngines) && g.manifest.requiresEngines.length > 0) { const neededVersion = (0, import_getEngineVersionForGenerator.getEngineVersionForGenerator)(g.manifest, version); if (!neededVersions[neededVersion]) { neededVersions[neededVersion] = { engines: [], binaryTargets: [] }; } for (const engine of g.manifest.requiresEngines) { if (!neededVersions[neededVersion].engines.includes(engine)) { neededVersions[neededVersion].engines.push(engine); } } const generatorBinaryTargets = (_b = (_a = g.options) == null ? void 0 : _a.generator) == null ? void 0 : _b.binaryTargets; if (generatorBinaryTargets && generatorBinaryTargets.length > 0) { const binaryTarget0 = generatorBinaryTargets[0]; if (binaryTarget0.fromEnvVar !== null) { const parsedBinaryTargetsEnvValue = (0, import_parseEnvValue.parseBinaryTargetsEnvValue)(binaryTarget0); generatorBinaryTargets.shift(); if (Array.isArray(parsedBinaryTargetsEnvValue)) { for (const platformName of parsedBinaryTargetsEnvValue) { generatorBinaryTargets.push({ fromEnvVar: binaryTarget0.fromEnvVar, value: platformName }); } } else { generatorBinaryTargets.push({ fromEnvVar: binaryTarget0.fromEnvVar, value: parsedBinaryTargetsEnvValue }); } } for (const binaryTarget of generatorBinaryTargets) { if (binaryTarget.value === "native") { binaryTarget.value = platform; } if (!neededVersions[neededVersion].binaryTargets.find((object) => object.value === binaryTarget.value)) { neededVersions[neededVersion].binaryTargets.push(binaryTarget); } } } } } debug("neededVersions", JSON.stringify(neededVersions, null, 2)); const binaryPathsByVersion = await (0, import_getBinaryPathsByVersion.getBinaryPathsByVersion)({ neededVersions, platform, version, printDownloadProgress, skipDownload, binaryPathsOverride }); for (const generator of generators) { if (generator.manifest && generator.manifest.requiresEngines) { const engineVersion = (0, import_getEngineVersionForGenerator.getEngineVersionForGenerator)(generator.manifest, version); const binaryPaths = binaryPathsByVersion[engineVersion]; const generatorBinaryPaths = (0, import_pick.pick)(binaryPaths, generator.manifest.requiresEngines); debug({ generatorBinaryPaths }); generator.setBinaryPaths(generatorBinaryPaths); if (engineVersion !== version && generator.options && generator.manifest.requiresEngines.includes(queryEngineType) && generatorBinaryPaths[queryEngineType] && ((_c = generatorBinaryPaths[queryEngineType]) == null ? void 0 : _c[platform])) { const customDmmf = await (0, import__.getDMMF)({ datamodel, datamodelPath: schemaPath, prismaPath: (_d = generatorBinaryPaths[queryEngineType]) == null ? void 0 : _d[platform], previewFeatures }); const options2 = { ...generator.options, dmmf: customDmmf }; debug("generator.manifest.prettyName", generator.manifest.prettyName); debug("options", options2); debug("options.generator.binaryTargets", options2.generator.binaryTargets); generator.setOptions(options2); } } } return generators; } catch (e) { runningGenerators.forEach((g) => g.stop()); throw e; } } __name(getGenerators, "getGenerators"); async function getGenerator(options2) { const generators = await getGenerators(options2); return generators[0]; } __name(getGenerator, "getGenerator"); function skipIndex(arr, index) { return [...arr.slice(0, index), ...arr.slice(index + 1)]; } __name(skipIndex, "skipIndex"); const knownBinaryTargets = [...import_get_platform.platforms, "native"]; const oldToNewBinaryTargetsMapping = { "linux-glibc-libssl1.0.1": "debian-openssl-1.0.x", "linux-glibc-libssl1.0.2": "debian-openssl-1.0.x", "linux-glibc-libssl1.1.0": "debian-openssl1.1.x" }; async function validateGenerators(generators) { const platform2 = await (0, import_get_platform.getPlatform)(); for (const generator of generators) { if ((0, import_parseEnvValue.parseEnvValue)(generator.provider) === "photonjs") { throw new Error(`Oops! Photon has been renamed to Prisma Client. Please make the following adjustments: 1. Rename ${import_chalk.default.red('provider = "photonjs"')} to ${import_chalk.default.green('provider = "prisma-client-js"')} in your ${import_chalk.default.bold("schema.prisma")} file. 2. Replace your ${import_chalk.default.bold("package.json")}'s ${import_chalk.default.red("@prisma/photon")} dependency to ${import_chalk.default.green("@prisma/client")} 3. Replace ${import_chalk.default.red("import { Photon } from '@prisma/photon'")} with ${import_chalk.default.green("import { PrismaClient } from '@prisma/client'")} in your code. 4. Run ${import_chalk.default.green("prisma generate")} again. `); } if (generator.config.platforms) { throw new Error(`The \`platforms\` field on the generator definition is deprecated. Please rename it to \`binaryTargets\`.`); } if (generator.config.pinnedBinaryTargets) { throw new Error(`The \`pinnedBinaryTargets\` field on the generator definition is deprecated. Please use the PRISMA_QUERY_ENGINE_BINARY env var instead to pin the binary target.`); } if (generator.binaryTargets) { const binaryTargets = generator.binaryTargets && generator.binaryTargets.length > 0 ? generator.binaryTargets : [{ fromEnvVar: null, value: "native" }]; const resolvedBinaryTargets = binaryTargets.flatMap((object) => (0, import_parseEnvValue.parseBinaryTargetsEnvValue)(object)).map((p) => p === "native" ? platform2 : p); for (const resolvedBinaryTarget of resolvedBinaryTargets) { if (oldToNewBinaryTargetsMapping[resolvedBinaryTarget]) { throw new Error(`Binary target ${import_chalk.default.red.bold(resolvedBinaryTarget)} is deprecated. Please use ${import_chalk.default.green.bold(oldToNewBinaryTargetsMapping[resolvedBinaryTarget])} instead.`); } if (!knownBinaryTargets.includes(resolvedBinaryTarget)) { throw new Error(`Unknown binary target ${import_chalk.default.red(resolvedBinaryTarget)} in generator ${import_chalk.default.bold(generator.name)}. Possible binaryTargets: ${import_chalk.default.greenBright(knownBinaryTargets.join(", "))}`); } } if (!resolvedBinaryTargets.includes(platform2)) { const originalBinaryTargetsConfig = (0, import_engine_core.getOriginalBinaryTargetsValue)(generator.binaryTargets); if (generator) { console.log(`${import_chalk.default.yellow("Warning:")} Your current platform \`${import_chalk.default.bold(platform2)}\` is not included in your generator's \`binaryTargets\` configuration ${JSON.stringify(originalBinaryTargetsConfig)}. To fix it, use this generator config in your ${import_chalk.default.bold("schema.prisma")}: ${import_chalk.default.greenBright((0, import_engine_core.printGeneratorConfig)({ ...generator, binaryTargets: (0, import_engine_core.fixBinaryTargets)(generator.binaryTargets, platform2) }))} ${import_chalk.default.gray(`Note, that by providing \`native\`, Prisma Client automatically resolves \`${platform2}\`. Read more about deploying Prisma Client: ${import_chalk.default.underline("https://github.com/prisma/prisma/blob/main/docs/core/generators/prisma-client-js.md")}`)} `); } else { console.log(`${import_chalk.default.yellow("Warning")} The binaryTargets ${JSON.stringify(originalBinaryTargetsConfig)} don't include your local platform ${platform2}, which you can also point to with \`native\`. In case you want to fix this, you can provide ${import_chalk.default.greenBright(`binaryTargets: ${JSON.stringify(["native", ...binaryTargets || []])}`)} in the schema.prisma file.`); } } } } } __name(validateGenerators, "validateGenerators"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getGenerator, getGenerators, knownBinaryTargets, skipIndex });