@powerhousedao/switchboard 2.2.165-dev.0 → 2.4.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@powerhousedao/switchboard",
3
3
  "type": "module",
4
- "version": "2.2.165-dev.0",
4
+ "version": "2.4.0-dev.0",
5
5
  "main": "dist/src/index.js",
6
6
  "bin": {
7
7
  "switchboard": "dist/src/index.js"
@@ -21,9 +21,9 @@
21
21
  "express": "^4.21.2",
22
22
  "graphql": "^16.10.0",
23
23
  "redis": "^4.7.0",
24
- "@powerhousedao/reactor-api": "1.29.23-dev.2",
25
- "@powerhousedao/scalars": "1.33.1-dev.7",
26
24
  "@powerhousedao/config": "1.27.0-dev.9",
25
+ "@powerhousedao/scalars": "1.33.1-dev.7",
26
+ "@powerhousedao/reactor-api": "1.29.23-dev.3",
27
27
  "document-drive": "1.29.11-dev.5",
28
28
  "document-model": "2.28.1-dev.9"
29
29
  },
@@ -1,33 +0,0 @@
1
- export declare const installPackages: (packages: string[]) => Promise<void>;
2
- export declare const readManifest: () => string;
3
- import { type Subgraph } from "@powerhousedao/reactor-api";
4
- import { type DocumentModelModule } from "document-model";
5
- interface IPackagesManager {
6
- onDocumentModelsChange(handler: (documentModels: DocumentModelModule[]) => void): void;
7
- }
8
- type IPackagesManagerOptions = {
9
- packages: string[];
10
- };
11
- export declare function loadDependency(packageName: string, subPath: string): Promise<unknown>;
12
- export declare class PackagesManager implements IPackagesManager {
13
- protected options: IPackagesManagerOptions;
14
- protected onError?: ((e: unknown) => void) | undefined;
15
- private docModelsMap;
16
- private subgraphsMap;
17
- private configWatcher;
18
- private eventEmitter;
19
- constructor(options: IPackagesManagerOptions, onError?: ((e: unknown) => void) | undefined);
20
- init(): Promise<{
21
- documentModels: DocumentModelModule[];
22
- subgraphs: (typeof Subgraph)[];
23
- }>;
24
- private loadPackages;
25
- private loadFromConfigFile;
26
- private initConfigFile;
27
- private updatePackagesMap;
28
- private updateSubgraphsMap;
29
- onDocumentModelsChange(handler: (documentModels: DocumentModelModule[]) => void): void;
30
- onSubgraphsChange(handler: (subgraphs: (typeof Subgraph)[]) => void): void;
31
- }
32
- export {};
33
- //# sourceMappingURL=package-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../../src/utils/package-manager.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,GAAU,UAAU,MAAM,EAAE,kBAIvD,CAAC;AAEF,eAAO,MAAM,YAAY,cAGxB,CAAC;AAGF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,UAAU,gBAAgB;IACxB,sBAAsB,CACpB,OAAO,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,IAAI,GACvD,IAAI,CAAC;CACT;AAED,KAAK,uBAAuB,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEtD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAGxE;AA2ED,qBAAa,eAAgB,YAAW,gBAAgB;IAUpD,SAAS,CAAC,OAAO,EAAE,uBAAuB;IAC1C,SAAS,CAAC,OAAO,CAAC,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;IAV1C,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAGf;gBAGO,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,aAAA;IAK7B,IAAI;;;;YAIH,YAAY;IAe1B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAa1B,sBAAsB,CACpB,OAAO,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,IAAI,GACvD,IAAI;IAGP,iBAAiB,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,QAAQ,CAAC,EAAE,KAAK,IAAI,GAAG,IAAI;CAG3E"}
@@ -1,145 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- export const installPackages = async (packages) => {
3
- for (const packageName of packages) {
4
- execSync(`ph install ${packageName}`);
5
- }
6
- };
7
- export const readManifest = () => {
8
- const manifest = execSync(`ph manifest`).toString();
9
- return manifest;
10
- };
11
- import { getConfig } from "@powerhousedao/config/utils";
12
- import EventEmitter from "node:events";
13
- import { watchFile } from "node:fs";
14
- export async function loadDependency(packageName, subPath) {
15
- const module = (await import(`${packageName}/${subPath}`));
16
- return module;
17
- }
18
- async function loadPackagesDocumentModels(packages) {
19
- const loadedPackages = new Map();
20
- for (const pkg of packages) {
21
- try {
22
- console.log("> Loading package:", pkg);
23
- const pkgModule = (await loadDependency(pkg, "document-models"));
24
- if (pkgModule) {
25
- console.log(` ➜ Loaded Document Models from: ${pkg}`);
26
- loadedPackages.set(pkg, Object.values(pkgModule));
27
- }
28
- else {
29
- console.warn(` ➜ No Document Models found: ${pkg}`);
30
- }
31
- }
32
- catch (e) {
33
- console.error("Error loading Document Models from", pkg, e);
34
- }
35
- }
36
- return loadedPackages;
37
- }
38
- async function loadPackagesSubgraphs(packages) {
39
- const loadedPackages = new Map();
40
- for (const pkg of packages) {
41
- const pkgModule = (await loadDependency(pkg, "subgraphs"));
42
- if (pkgModule) {
43
- console.log(` ➜ Loaded Subgraphs from: ${pkg}`);
44
- loadedPackages.set(pkg, pkgModule);
45
- }
46
- else {
47
- console.warn(` ➜ No Subgraphs found: ${pkg}`);
48
- }
49
- }
50
- return loadedPackages;
51
- }
52
- function getUniqueDocumentModels(...documentModels) {
53
- const uniqueModels = new Map();
54
- for (const models of documentModels) {
55
- for (const model of models) {
56
- uniqueModels.set(model.documentModel.id, model);
57
- }
58
- }
59
- return Array.from(uniqueModels.values());
60
- }
61
- function getUniqueSubgraphs(subgraphs) {
62
- const uniqueSubgraphs = new Map();
63
- for (const subgraphss of subgraphs) {
64
- const keys = Object.keys(subgraphss);
65
- for (const key of keys) {
66
- uniqueSubgraphs.set(key, subgraphss[key][key]);
67
- }
68
- }
69
- return Array.from(uniqueSubgraphs.values());
70
- }
71
- export class PackagesManager {
72
- options;
73
- onError;
74
- docModelsMap = new Map();
75
- subgraphsMap = new Map();
76
- configWatcher;
77
- eventEmitter = new EventEmitter();
78
- constructor(options, onError) {
79
- this.options = options;
80
- this.onError = onError;
81
- this.eventEmitter.setMaxListeners(0);
82
- }
83
- async init() {
84
- return await this.loadPackages(this.options.packages);
85
- }
86
- async loadPackages(packages) {
87
- // install packages
88
- const packagesMap = await loadPackagesDocumentModels(packages);
89
- const subgraphsMap = await loadPackagesSubgraphs(packages);
90
- this.updatePackagesMap(packagesMap);
91
- this.updateSubgraphsMap(subgraphsMap);
92
- return {
93
- documentModels: getUniqueDocumentModels(...Array.from(packagesMap.values())),
94
- subgraphs: getUniqueSubgraphs(Array.from(subgraphsMap.values())),
95
- };
96
- }
97
- loadFromConfigFile(configFile) {
98
- const config = getConfig(configFile);
99
- const packages = config.packages;
100
- return this.loadPackages(packages?.map((pkg) => pkg.packageName) ?? []).catch(this.onError);
101
- }
102
- initConfigFile(configFile) {
103
- const result = this.loadFromConfigFile(configFile);
104
- if (!this.configWatcher) {
105
- this.configWatcher = watchFile(configFile, { interval: 100 }, (curr, prev) => {
106
- if (curr.mtime === prev.mtime) {
107
- return;
108
- }
109
- void this.loadFromConfigFile(configFile).catch(this.onError);
110
- });
111
- }
112
- return result;
113
- }
114
- updatePackagesMap(packagesMap) {
115
- const oldPackages = Array.from(this.docModelsMap.keys());
116
- const newPackages = Array.from(packagesMap.keys());
117
- oldPackages
118
- .filter((pkg) => !newPackages.includes(pkg))
119
- .forEach((pkg) => {
120
- console.log("> Removed package:", pkg);
121
- });
122
- this.docModelsMap = packagesMap;
123
- const documentModels = getUniqueDocumentModels(...Array.from(packagesMap.values()));
124
- this.eventEmitter.emit("documentModelsChange", documentModels);
125
- }
126
- updateSubgraphsMap(subgraphsMap) {
127
- const oldPackages = Array.from(this.subgraphsMap.keys());
128
- const newPackages = Array.from(subgraphsMap.keys());
129
- oldPackages
130
- .filter((pkg) => !newPackages.includes(pkg))
131
- .forEach((pkg) => {
132
- console.log("> Removed Subgraphs from:", pkg);
133
- });
134
- this.subgraphsMap = subgraphsMap;
135
- const subgraphs = getUniqueSubgraphs(Array.from(subgraphsMap.values()));
136
- this.eventEmitter.emit("subgraphsChange", subgraphs);
137
- }
138
- onDocumentModelsChange(handler) {
139
- this.eventEmitter.on("documentModelsChange", handler);
140
- }
141
- onSubgraphsChange(handler) {
142
- this.eventEmitter.on("subgraphsChange", handler);
143
- }
144
- }
145
- //# sourceMappingURL=package-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../../src/utils/package-manager.ts"],"names":[],"mappings":"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"}
@@ -1,51 +0,0 @@
1
- import { createClient, type RedisClientType } from "redis";
2
-
3
- export let redisClient: RedisClientType;
4
- export const initRedis = async () => {
5
- if (!redisClient) {
6
- const url = process.env.REDIS_TLS_URL ?? process.env.REDIS_URL;
7
- if (!url) {
8
- throw new Error("REDIS_TLS_URL is not set");
9
- }
10
-
11
- const socket = url.includes("rediss")
12
- ? {
13
- tls: true,
14
- rejectUnauthorized: false,
15
- }
16
- : undefined;
17
-
18
- redisClient = createClient({
19
- url,
20
- socket,
21
- });
22
-
23
- redisClient.on("error", (err: string) => {
24
- console.log("Redis Client Error", err);
25
- throw new Error("Redis Client Error");
26
- });
27
-
28
- redisClient.connect();
29
- }
30
-
31
- return redisClient;
32
- };
33
-
34
- const timer = setInterval(
35
- async () => {
36
- try {
37
- if (redisClient) {
38
- await redisClient.ping();
39
- }
40
- } catch (err) {
41
- console.error("Ping Interval Error", err);
42
- }
43
- },
44
- 1000 * 60 * 4,
45
- );
46
-
47
- export const closeRedis = () => {
48
- clearInterval(timer);
49
-
50
- redisClient.disconnect();
51
- };
package/src/index.ts DELETED
@@ -1,99 +0,0 @@
1
- #!/usr/bin/env node
2
- import { startAPI } from "@powerhousedao/reactor-api";
3
- import * as Sentry from "@sentry/node";
4
- import { ReactorBuilder, driveDocumentModelModule } from "document-drive";
5
- import RedisCache from "document-drive/cache/redis";
6
- import { PrismaStorageFactory } from "document-drive/storage/prisma";
7
- import {
8
- type DocumentModelModule,
9
- documentModelDocumentModelModule,
10
- } from "document-model";
11
- import dotenv from "dotenv";
12
- import express from "express";
13
- import { initRedis } from "./clients/redis.js";
14
- import { initProfilerFromEnv } from "./profiler.js";
15
- import { PackagesManager } from "./utils/package-manager.js";
16
-
17
- dotenv.config();
18
-
19
- // Create a monolith express app for all subgraphs
20
- const app = express();
21
-
22
- if (process.env.SENTRY_DSN) {
23
- console.log("Initialized Sentry with env:", process.env.SENTRY_ENV);
24
- Sentry.init({
25
- dsn: process.env.SENTRY_DSN,
26
- environment: process.env.SENTRY_ENV,
27
- });
28
-
29
- Sentry.setupExpressErrorHandler(app);
30
- }
31
-
32
- const serverPort = process.env.PORT ? Number(process.env.PORT) : 4001;
33
-
34
- const main = async () => {
35
- if (process.env.PYROSCOPE_SERVER_ADDRESS) {
36
- try {
37
- await initProfilerFromEnv(process.env);
38
- } catch (e) {
39
- Sentry.captureException(e);
40
- console.error("Error starting profiler", e);
41
- }
42
- }
43
-
44
- try {
45
- const packages =
46
- process.env.PH_PACKAGES && process.env.PH_PACKAGES !== ""
47
- ? process.env.PH_PACKAGES.split(",")
48
- : [];
49
- const pkgManager = new PackagesManager({
50
- packages,
51
- });
52
- const { documentModels, subgraphs } = await pkgManager.init();
53
- const redis = await initRedis();
54
- const connectionString = process.env.DATABASE_URL;
55
- if (!connectionString) {
56
- throw new Error("Please set env var DATABASE_URL");
57
- }
58
- const dbUrl =
59
- connectionString.includes("amazonaws") &&
60
- !connectionString.includes("sslmode=no-verify")
61
- ? connectionString + "?sslmode=no-verify"
62
- : connectionString;
63
-
64
- const redisCache = new RedisCache(redis);
65
- const storageFactory = new PrismaStorageFactory(dbUrl, redisCache);
66
- const storage = storageFactory.build();
67
-
68
- const reactor = new ReactorBuilder([
69
- documentModelDocumentModelModule,
70
- driveDocumentModelModule,
71
- ...documentModels,
72
- ] as DocumentModelModule[])
73
- .withStorage(storage)
74
- .withCache(redisCache)
75
- .build();
76
-
77
- // init drive server
78
- await reactor.initialize();
79
-
80
- // Start the API with the reactor and options
81
- await startAPI(reactor, {
82
- express: app,
83
- port: serverPort,
84
- dbPath: dbUrl,
85
- packages,
86
- });
87
-
88
- // start http server
89
- // httpServer.listen({ port: serverPort }, () => {
90
- // console.log(`Subgraph server listening on port ${serverPort}`);
91
- // });
92
- } catch (e) {
93
- Sentry.captureException(e);
94
- console.error("App crashed", e);
95
- throw e;
96
- }
97
- };
98
-
99
- main().catch(console.error);
@@ -1,8 +0,0 @@
1
- import { execSync } from "child_process";
2
-
3
- const pkgs = process.env.PH_PACKAGES?.split(",") || [];
4
- for (const pkg of pkgs) {
5
- if (pkg === "") continue;
6
- console.log(`> Installing ${pkg}`);
7
- execSync(`pnpm add ${pkg}@latest`, { stdio: "inherit" });
8
- }
package/src/profiler.ts DELETED
@@ -1,25 +0,0 @@
1
- import type { PyroscopeConfig } from "@pyroscope/nodejs";
2
-
3
- export async function initProfilerFromEnv(env: typeof process.env) {
4
- const {
5
- PYROSCOPE_SERVER_ADDRESS: serverAddress,
6
- PYROSCOPE_APPLICATION_NAME: appName,
7
- PYROSCOPE_USER: basicAuthUser,
8
- PYROSCOPE_PASSWORD: basicAuthPassword,
9
- } = env;
10
-
11
- const options: PyroscopeConfig = {
12
- serverAddress,
13
- appName,
14
- basicAuthUser,
15
- basicAuthPassword,
16
- };
17
- return initProfiler(options);
18
- }
19
-
20
- export async function initProfiler(options?: PyroscopeConfig) {
21
- console.log("Initializing Pyroscope profiler at:", options?.serverAddress);
22
- const Pyroscope = await import("@pyroscope/nodejs");
23
- Pyroscope.init(options);
24
- Pyroscope.start();
25
- }
@@ -1,65 +0,0 @@
1
- import { type BaseDocumentDriveServer } from "document-drive";
2
- import { parse } from "graphql";
3
-
4
- export const getDocumentModelTypeDefs = (
5
- documentDriveServer: BaseDocumentDriveServer,
6
- typeDefs: string,
7
- ) => {
8
- const documentModels = documentDriveServer.getDocumentModelModules();
9
- let dmSchema = "";
10
- documentModels.forEach(({ documentModel }) => {
11
- dmSchema += `
12
- ${documentModel.specifications
13
- .map((specification) =>
14
- specification.state.global.schema
15
- .replaceAll(" Account ", ` ${documentModel.name}Account `)
16
- .replaceAll(`: Account`, `: ${documentModel.name}Account`)
17
- .replaceAll(`[Account!]!`, `[${documentModel.name}Account!]!`)
18
- .replaceAll("scalar DateTime", "")
19
- .replaceAll(/input (.*?) {[\s\S]*?}/g, ""),
20
- )
21
- .join("\n")};
22
-
23
- ${documentModel.specifications
24
- .map((specification) =>
25
- specification.state.local.schema
26
- .replaceAll(" Account ", ` ${documentModel.name}Account `)
27
- .replaceAll(`: Account`, `: ${documentModel.name}Account`)
28
- .replaceAll(`[Account!]!`, `[${documentModel.name}Account!]!`)
29
- .replaceAll("scalar DateTime", "")
30
- .replaceAll(/input (.*?) {[\s\S]*?}/g, "")
31
- .replaceAll("type AccountSnapshotLocalState", "")
32
- .replaceAll("type BudgetStatementLocalState", "")
33
- .replaceAll("type ScopeFrameworkLocalState", ""),
34
- )
35
- .join("\n")};
36
-
37
- type ${documentModel.name} implements IDocument {
38
- id: ID!
39
- name: String!
40
- documentType: String!
41
- revision: Int!
42
- created: DateTime!
43
- lastModified: DateTime!
44
- ${documentModel.name !== "DocumentModel" ? `state: ${documentModel.name}State!` : ""}
45
- }\n`;
46
- });
47
-
48
- // add the mutation and query types
49
- const schema = `
50
- scalar DateTime
51
- interface IDocument {
52
- name: String!
53
- documentType: String!
54
- revision: Int!
55
- created: DateTime!
56
- lastModified: DateTime!
57
-
58
- }
59
- ${dmSchema}
60
-
61
- ${typeDefs}
62
- `;
63
-
64
- return parse(schema.replaceAll(";", ""));
65
- };
@@ -1,204 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- export const installPackages = async (packages: string[]) => {
3
- for (const packageName of packages) {
4
- execSync(`ph install ${packageName}`);
5
- }
6
- };
7
-
8
- export const readManifest = () => {
9
- const manifest = execSync(`ph manifest`).toString();
10
- return manifest;
11
- };
12
-
13
- import { getConfig } from "@powerhousedao/config/utils";
14
- import { type Subgraph } from "@powerhousedao/reactor-api";
15
- import { type DocumentModelModule } from "document-model";
16
- import EventEmitter from "node:events";
17
- import { type StatWatcher, watchFile } from "node:fs";
18
-
19
- interface IPackagesManager {
20
- onDocumentModelsChange(
21
- handler: (documentModels: DocumentModelModule[]) => void,
22
- ): void;
23
- }
24
-
25
- type IPackagesManagerOptions = { packages: string[] };
26
-
27
- export async function loadDependency(packageName: string, subPath: string) {
28
- const module = (await import(`${packageName}/${subPath}`)) as unknown;
29
- return module;
30
- }
31
-
32
- async function loadPackagesDocumentModels(packages: string[]) {
33
- const loadedPackages = new Map<string, DocumentModelModule[]>();
34
- for (const pkg of packages) {
35
- try {
36
- console.log("> Loading package:", pkg);
37
- const pkgModule = (await loadDependency(pkg, "document-models")) as {
38
- [key: string]: DocumentModelModule;
39
- };
40
- if (pkgModule) {
41
- console.log(` ➜ Loaded Document Models from: ${pkg}`);
42
- loadedPackages.set(pkg, Object.values(pkgModule));
43
- } else {
44
- console.warn(` ➜ No Document Models found: ${pkg}`);
45
- }
46
- } catch (e) {
47
- console.error("Error loading Document Models from", pkg, e);
48
- }
49
- }
50
- return loadedPackages;
51
- }
52
-
53
- async function loadPackagesSubgraphs(packages: string[]) {
54
- const loadedPackages = new Map<string, (typeof Subgraph)[]>();
55
- for (const pkg of packages) {
56
- const pkgModule = (await loadDependency(
57
- pkg,
58
- "subgraphs",
59
- )) as (typeof Subgraph)[];
60
- if (pkgModule) {
61
- console.log(` ➜ Loaded Subgraphs from: ${pkg}`);
62
- loadedPackages.set(pkg, pkgModule);
63
- } else {
64
- console.warn(` ➜ No Subgraphs found: ${pkg}`);
65
- }
66
- }
67
- return loadedPackages;
68
- }
69
-
70
- function getUniqueDocumentModels(
71
- ...documentModels: DocumentModelModule[][]
72
- ): DocumentModelModule[] {
73
- const uniqueModels = new Map<string, DocumentModelModule>();
74
-
75
- for (const models of documentModels) {
76
- for (const model of models) {
77
- uniqueModels.set(model.documentModel.id, model);
78
- }
79
- }
80
-
81
- return Array.from(uniqueModels.values());
82
- }
83
-
84
- function getUniqueSubgraphs(
85
- subgraphs: (typeof Subgraph)[][],
86
- ): (typeof Subgraph)[] {
87
- const uniqueSubgraphs = new Map<string, typeof Subgraph>();
88
- for (const subgraphss of subgraphs) {
89
- const keys = Object.keys(subgraphss);
90
- for (const key of keys) {
91
- uniqueSubgraphs.set(
92
- key,
93
- (
94
- subgraphss as unknown as Record<
95
- string,
96
- Record<string, typeof Subgraph>
97
- >
98
- )[key][key],
99
- );
100
- }
101
- }
102
- return Array.from(uniqueSubgraphs.values());
103
- }
104
-
105
- export class PackagesManager implements IPackagesManager {
106
- private docModelsMap = new Map<string, DocumentModelModule[]>();
107
- private subgraphsMap = new Map<string, (typeof Subgraph)[]>();
108
- private configWatcher: StatWatcher | undefined;
109
- private eventEmitter = new EventEmitter<{
110
- documentModelsChange: DocumentModelModule[][];
111
- subgraphsChange: (typeof Subgraph)[][];
112
- }>();
113
-
114
- constructor(
115
- protected options: IPackagesManagerOptions,
116
- protected onError?: (e: unknown) => void,
117
- ) {
118
- this.eventEmitter.setMaxListeners(0);
119
- }
120
-
121
- public async init() {
122
- return await this.loadPackages(this.options.packages);
123
- }
124
-
125
- private async loadPackages(packages: string[]) {
126
- // install packages
127
- const packagesMap = await loadPackagesDocumentModels(packages);
128
- const subgraphsMap = await loadPackagesSubgraphs(packages);
129
- this.updatePackagesMap(packagesMap);
130
- this.updateSubgraphsMap(subgraphsMap);
131
-
132
- return {
133
- documentModels: getUniqueDocumentModels(
134
- ...Array.from(packagesMap.values()),
135
- ),
136
- subgraphs: getUniqueSubgraphs(Array.from(subgraphsMap.values())),
137
- };
138
- }
139
-
140
- private loadFromConfigFile(configFile: string) {
141
- const config = getConfig(configFile);
142
- const packages = config.packages;
143
-
144
- return this.loadPackages(
145
- packages?.map((pkg) => pkg.packageName) ?? [],
146
- ).catch(this.onError);
147
- }
148
-
149
- private initConfigFile(configFile: string) {
150
- const result = this.loadFromConfigFile(configFile);
151
-
152
- if (!this.configWatcher) {
153
- this.configWatcher = watchFile(
154
- configFile,
155
- { interval: 100 },
156
- (curr, prev) => {
157
- if (curr.mtime === prev.mtime) {
158
- return;
159
- }
160
- void this.loadFromConfigFile(configFile).catch(this.onError);
161
- },
162
- );
163
- }
164
-
165
- return result;
166
- }
167
-
168
- private updatePackagesMap(packagesMap: Map<string, DocumentModelModule[]>) {
169
- const oldPackages = Array.from(this.docModelsMap.keys());
170
- const newPackages = Array.from(packagesMap.keys());
171
- oldPackages
172
- .filter((pkg) => !newPackages.includes(pkg))
173
- .forEach((pkg) => {
174
- console.log("> Removed package:", pkg);
175
- });
176
- this.docModelsMap = packagesMap;
177
- const documentModels = getUniqueDocumentModels(
178
- ...Array.from(packagesMap.values()),
179
- );
180
- this.eventEmitter.emit("documentModelsChange", documentModels);
181
- }
182
-
183
- private updateSubgraphsMap(subgraphsMap: Map<string, (typeof Subgraph)[]>) {
184
- const oldPackages = Array.from(this.subgraphsMap.keys());
185
- const newPackages = Array.from(subgraphsMap.keys());
186
- oldPackages
187
- .filter((pkg) => !newPackages.includes(pkg))
188
- .forEach((pkg) => {
189
- console.log("> Removed Subgraphs from:", pkg);
190
- });
191
- this.subgraphsMap = subgraphsMap;
192
- const subgraphs = getUniqueSubgraphs(Array.from(subgraphsMap.values()));
193
- this.eventEmitter.emit("subgraphsChange", subgraphs);
194
- }
195
-
196
- onDocumentModelsChange(
197
- handler: (documentModels: DocumentModelModule[]) => void,
198
- ): void {
199
- this.eventEmitter.on("documentModelsChange", handler);
200
- }
201
- onSubgraphsChange(handler: (subgraphs: (typeof Subgraph)[]) => void): void {
202
- this.eventEmitter.on("subgraphsChange", handler);
203
- }
204
- }