{"version":3,"file":"vite-loader.mjs","sources":["../../../src/packages/vite-loader.mts"],"sourcesContent":["import { viteCommonjs } from \"@originjs/vite-plugin-commonjs\";\nimport type {\n  ProcessorFactoryBuilder,\n  SubgraphClass,\n} from \"@powerhousedao/reactor-api\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { childLogger, type ILogger } from \"document-model\";\nimport path from \"node:path\";\nimport { readPackage } from \"read-pkg\";\nimport type { Logger, PluginOption, ViteDevServer } from \"vite\";\nimport { createLogger, createServer } from \"vite\";\nimport { isSubgraphClass } from \"../graphql/utils.js\";\nimport type {\n  ISubscribablePackageLoader,\n  ISubscriptionOptions,\n} from \"./types.js\";\nimport { debounce, isSubpath } from \"./util.js\";\n\nexport function createViteLogger(logger: ILogger, prefix = \"\") {\n  const customLogger = createLogger(\"info\", {\n    prefix,\n  });\n  customLogger.info = logger.info;\n  customLogger.warn = logger.warn;\n  customLogger.error = logger.error;\n  return customLogger;\n}\n\nexport class VitePackageLoader implements ISubscribablePackageLoader {\n  private readonly logger = childLogger([\"reactor-api\", \"vite-loader\"]);\n\n  private readonly vite: ViteDevServer;\n\n  readonly name = \"VitePackageLoader\";\n\n  static build(vite: ViteDevServer) {\n    return new VitePackageLoader(vite);\n  }\n\n  constructor(vite: ViteDevServer) {\n    this.vite = vite;\n  }\n\n  private getDocumentModelsPath(identifier: string): string {\n    return path.join(identifier, \"./document-models\");\n  }\n\n  private getSubgraphsPath(identifier: string): string {\n    return path.join(identifier, \"./subgraphs\");\n  }\n\n  private getProcessorsPath(identifier: string): string {\n    return path.join(identifier, \"./processors\");\n  }\n\n  public loadDocumentModels(identifier: string, immediate = false) {\n    return this.#loadDocumentModelsWithDebounce(immediate, identifier);\n  }\n\n  #loadDocumentModelsWithDebounce = debounce(\n    this.#loadDocumentModels.bind(this),\n    500,\n  );\n\n  async #loadDocumentModels(\n    identifier: string,\n  ): Promise<DocumentModelModule[]> {\n    const fullPath = this.getDocumentModelsPath(identifier);\n    this.logger.debug(\"Loading document models from\", fullPath);\n\n    try {\n      const localDMs = (await this.vite.ssrLoadModule(fullPath)) as Record<\n        string,\n        DocumentModelModule\n      >;\n\n      const exports = Object.values(localDMs);\n\n      // duck type\n      const documentModels: DocumentModelModule[] = [];\n      for (const dm of exports) {\n        if (dm.documentModel) {\n          documentModels.push(dm);\n        }\n      }\n\n      this.logger.verbose(\n        `  ➜  Loaded ${documentModels.length} Document Models from: ${identifier}`,\n      );\n\n      return documentModels;\n    } catch (e) {\n      this.logger.debug(`  ➜  No Document Models found for: ${identifier}`, e);\n    }\n\n    return [];\n  }\n\n  async loadSubgraphs(identifier: string): Promise<SubgraphClass[]> {\n    const fullPath = this.getSubgraphsPath(identifier);\n\n    this.logger.verbose(\"Loading subgraphs from\", fullPath);\n\n    let localSubgraphs: Record<string, Record<string, SubgraphClass>> = {};\n    try {\n      localSubgraphs = await this.vite.ssrLoadModule(fullPath);\n    } catch (e) {\n      this.logger.debug(`  ➜  No Subgraphs found for: ${identifier}`, e);\n      return [];\n    }\n\n    const subgraphs: SubgraphClass[] = [];\n    for (const [name, subgraph] of Object.entries(localSubgraphs)) {\n      const SubgraphClass = subgraph[name];\n      if (isSubgraphClass(SubgraphClass)) {\n        subgraphs.push(SubgraphClass);\n      }\n    }\n\n    this.logger.debug(\n      `  ➜  Loaded ${subgraphs.length} Subgraphs from: ${identifier}`,\n    );\n\n    return subgraphs;\n  }\n\n  async loadProcessors(\n    identifier: string,\n  ): Promise<ProcessorFactoryBuilder | null> {\n    const fullPath = this.getProcessorsPath(identifier);\n\n    this.logger.verbose(\"Loading processors from\", fullPath);\n\n    try {\n      const pkgModule = await this.vite.ssrLoadModule(fullPath);\n\n      const factory = (\n        pkgModule as Record<string, ProcessorFactoryBuilder | undefined>\n      )?.processorFactory;\n\n      if (factory && typeof factory === \"function\") {\n        this.logger.verbose(\n          `  ➜  Loaded Processor Factory from: ${identifier}`,\n        );\n        return factory;\n      }\n    } catch (e) {\n      this.logger.debug(\n        `  ➜  No Processor Factory found for: ${identifier}`,\n        e,\n      );\n    }\n\n    this.logger.verbose(`  ➜  No Processor Factory found for: ${identifier}`);\n\n    // return empty processor factory\n    return null;\n  }\n\n  onDocumentModelsChange(\n    identifier: string,\n    handler: (documentModels: DocumentModelModule[]) => void,\n    options?: ISubscriptionOptions,\n  ): () => void {\n    const listener = async (changedPath: string) => {\n      const documentModelsPath = this.getDocumentModelsPath(identifier);\n      if (isSubpath(documentModelsPath, changedPath)) {\n        const documentModels = await this.loadDocumentModels(identifier);\n        handler(documentModels);\n      }\n    };\n\n    this.vite.watcher.on(\"change\", listener);\n\n    return () => {\n      this.vite.watcher.off(\"change\", listener);\n    };\n  }\n\n  onSubgraphsChange(\n    identifier: string,\n    handler: (subgraphs: SubgraphClass[]) => void,\n    options?: ISubscriptionOptions,\n  ): () => void {\n    const subgraphsPath = this.getSubgraphsPath(identifier);\n    const listener = debounce(async (changedPath: string) => {\n      if (isSubpath(subgraphsPath, changedPath)) {\n        const subgraphs = await this.loadSubgraphs(identifier);\n        handler(subgraphs);\n      }\n    }, options?.debounce ?? 100);\n    this.vite.watcher.on(\"change\", listener);\n\n    return () => {\n      this.vite.watcher.off(\"change\", listener);\n    };\n  }\n\n  onProcessorsChange(\n    identifier: string,\n    handler: (processors: ProcessorFactoryBuilder | null) => void,\n    options?: ISubscriptionOptions,\n  ): () => void {\n    const processorsPath = this.getProcessorsPath(identifier);\n    const listener = async (changedPath: string) => {\n      if (isSubpath(processorsPath, changedPath)) {\n        const processors = await this.loadProcessors(identifier);\n        handler(processors);\n      }\n    };\n    this.vite.watcher.on(\"change\", listener);\n\n    return () => {\n      this.vite.watcher.off(\"change\", listener);\n    };\n  }\n}\n\nexport async function startViteServer(root: string, logger?: Logger) {\n  const packageJson = await readPackage({ cwd: root });\n\n  const vite = await createServer({\n    root,\n    configFile: false,\n    logger,\n    server: { middlewareMode: true, watch: { ignored: [\"**/.ph/**\"] } },\n    appType: \"custom\",\n    build: {\n      rollupOptions: {\n        input: [],\n      },\n    },\n    resolve: {\n      tsconfigPaths: true,\n      alias: {\n        [packageJson.name]: root,\n      },\n    },\n    plugins: [\n      // cast: the plugin ships types built against an older vite, and the\n      // mismatched Plugin type crashes tsc 6 during assignability checking\n      viteCommonjs() as PluginOption,\n      {\n        name: \"suppress-hmr\",\n        handleHotUpdate() {\n          return []; // return empty array to suppress server refresh\n        },\n      },\n    ],\n  });\n\n  return vite;\n}\n"],"names":["#loadDocumentModelsWithDebounce","#loadDocumentModels"],"mappings":"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","debug_id":"02fc7276-e4d6-5195-b4ce-5791df961225"}