UNPKG

convex

Version:

Client for the Convex Cloud

250 lines (248 loc) 8.61 kB
"use strict"; 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 __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( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var component_api_exports = {}; __export(component_api_exports, { componentApiDTS: () => componentApiDTS, componentApiJs: () => componentApiJs, componentApiStubDTS: () => componentApiStubDTS, rootComponentApiCJS: () => rootComponentApiCJS }); module.exports = __toCommonJS(component_api_exports); var import_path = __toESM(require("path"), 1); var import_bundler = require("../../bundler/index.js"); var import_directoryStructure = require("../lib/components/definition/directoryStructure.js"); var import_api = require("./api.js"); var import_common = require("./common.js"); var import_component_server = require("./component_server.js"); var import_bundle = require("../lib/components/definition/bundle.js"); function componentApiJs() { const lines = []; lines.push((0, import_common.header)("Generated `api` utility.")); lines.push(` import { anyApi } from "convex/server"; /** * A utility for referencing Convex functions in your app's API. * * Usage: * \`\`\`js * const myFunctionReference = api.myModule.myFunction; * \`\`\` */ export const api = anyApi; export const internal = anyApi; `); return lines.join("\n"); } function rootComponentApiCJS() { const lines = []; lines.push((0, import_common.header)("Generated `api` utility.")); lines.push(`const { anyApi } = require("convex/server");`); lines.push(`module.exports = { api: anyApi, internal: anyApi, };`); return lines.join("\n"); } function componentApiStubDTS() { const lines = []; lines.push((0, import_common.header)("Generated `api` utility.")); lines.push(`import type { AnyApi } from "convex/server";`); lines.push(` export declare const api: AnyApi; export declare const internal: AnyApi; `); return lines.join("\n"); } async function componentApiDTS(ctx, startPush, rootComponent, componentDirectory) { const definitionPath = (0, import_directoryStructure.toComponentDefinitionPath)( rootComponent, componentDirectory ); const absModulePaths = await (0, import_bundler.entryPoints)(ctx, componentDirectory.path, false); const modulePaths = absModulePaths.map( (p) => import_path.default.relative(componentDirectory.path, p) ); const lines = []; lines.push((0, import_common.header)("Generated `api` utility.")); for (const modulePath of modulePaths) { const ident = (0, import_api.moduleIdentifier)(modulePath); const path2 = (0, import_api.importPath)(modulePath); lines.push(`import type * as ${ident} from "../${path2}.js";`); } lines.push(` import type { ApiFromModules, FilterApi, FunctionReference, } from "convex/server"; /** * A utility for referencing Convex functions in your app's API. * * Usage: * \`\`\`js * const myFunctionReference = api.myModule.myFunction; * \`\`\` */ declare const fullApi: ApiFromModules<{ `); for (const modulePath of modulePaths) { const ident = (0, import_api.moduleIdentifier)(modulePath); const path2 = (0, import_api.importPath)(modulePath); lines.push(` "${path2}": typeof ${ident},`); } lines.push(`}>;`); for await (const line of codegenApiWithMounts( ctx, startPush, definitionPath )) { lines.push(line); } lines.push(` export declare const api: FilterApi<typeof fullApiWithMounts, FunctionReference<any, "public">>; export declare const internal: FilterApi<typeof fullApiWithMounts, FunctionReference<any, "internal">>; `); return lines.join("\n"); } async function* codegenApiWithMounts(ctx, startPush, definitionPath) { const mountTree = await buildMountTree(ctx, startPush, definitionPath, []); if (!mountTree) { yield "declare const fullApiWithMounts: typeof fullApi;"; return; } yield "declare const fullApiWithMounts: typeof fullApi &"; yield* codegenMountTree(mountTree); yield `;`; } function* codegenMountTree(tree) { yield `{`; for (const [identifier, subtree] of Object.entries(tree)) { if (typeof subtree === "string") { yield `"${identifier}": ${subtree},`; } else { yield `"${identifier}":`; yield* codegenMountTree(subtree); yield `,`; } } yield `}`; } async function buildMountTree(ctx, startPush, definitionPath, attributes) { const analysis = startPush.analysis[(0, import_bundle.encodeDefinitionPath)(definitionPath)]; if (!analysis) { return await ctx.crash({ exitCode: 1, errorType: "fatal", printedMessage: `No analysis found for component ${(0, import_bundle.encodeDefinitionPath)(definitionPath)} orig: ${definitionPath} in ${Object.keys(startPush.analysis).toString()}` }); } let current = analysis.definition.exports.branch; for (const attribute of attributes) { const componentExport = current.find( ([identifier]) => identifier === attribute ); if (!componentExport) { return await ctx.crash({ exitCode: 1, errorType: "fatal", printedMessage: `No export found for ${attribute}` }); } const [_, node] = componentExport; if (node.type !== "branch") { return await ctx.crash({ exitCode: 1, errorType: "fatal", printedMessage: `Expected branch at ${attribute}` }); } current = node.branch; } return buildComponentMountTree(ctx, startPush, analysis, current); } async function buildComponentMountTree(ctx, startPush, analysis, exports) { const result = {}; let nonEmpty = false; for (const [identifier, componentExport] of exports) { if (componentExport.type === "leaf") { if (componentExport.leaf.startsWith("_reference/childComponent/")) { const suffix = componentExport.leaf.slice( "_reference/childComponent/".length ); const [componentName, ...attributes] = suffix.split("/"); const childComponent = analysis.definition.childComponents.find( (c) => c.name === componentName ); if (!childComponent) { return await ctx.crash({ exitCode: 1, errorType: "fatal", printedMessage: `No child component found for ${componentName}` }); } const childTree = await buildMountTree( ctx, startPush, childComponent.path, attributes ); if (childTree) { result[identifier] = childTree; nonEmpty = true; } } const isRoot = analysis.definition.definitionType.type === "app"; if (!isRoot && componentExport.leaf.startsWith("_reference/function/")) { const leaf = await (0, import_component_server.resolveFunctionReference)( ctx, analysis, componentExport.leaf, "public" ); result[identifier] = leaf; nonEmpty = true; } } else { const subTree = await buildComponentMountTree( ctx, startPush, analysis, componentExport.branch ); if (subTree) { result[identifier] = subTree; nonEmpty = true; } } } return nonEmpty ? result : null; } //# sourceMappingURL=component_api.js.map