diff --git a/packages/db/.madgerc b/packages/db/.madgerc index b33c2c2b617..ec6048a48ed 100644 --- a/packages/db/.madgerc +++ b/packages/db/.madgerc @@ -1,5 +1,5 @@ { - "excludeRegExp": ["\\.\\.", "test"], + "excludeRegExp": ["\\.\\.", "test", "logger.ts"], "fileExtensions": ["ts"], "tsConfig": "./tsconfig.base.json" } diff --git a/packages/db/package.json b/packages/db/package.json index bea626341e0..95a087b2020 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -21,10 +21,9 @@ "dist": "dist" }, "scripts": { - "build": "./bin/build", + "build": "yarn build:types && yarn build:dist", "clean": "rm -rf ./dist ./types/schema.d.ts", "prepare": "yarn build", - "build": "yarn build:types && yarn build:dist", "build:stubbed": "ttsc --project tsconfig.codegen.json", "build:types": "yarn build:stubbed && node ./bin/codegen.js", "build:dist": "ttsc", @@ -40,6 +39,7 @@ "@truffle/config": "^1.2.31", "@truffle/workflow-compile": "^3.0.5", "apollo-server": "^2.18.2", + "debug": "^4.2.0", "fse": "^4.0.1", "graphql": "^15.3.0", "graphql-tag": "^2.11.0", @@ -60,6 +60,7 @@ }, "devDependencies": { "@gql2ts/from-schema": "^2.0.0-4", + "@types/debug": "^4.1.5", "@types/express": "^4.16.0", "@types/graphql": "^14.5.0", "@types/jest": "^23.3.11", diff --git a/packages/db/src/connect.ts b/packages/db/src/connect.ts index a0971617ff1..7d7a4e227a1 100644 --- a/packages/db/src/connect.ts +++ b/packages/db/src/connect.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:connect"); + import { definitions } from "./definitions"; import { forDefinitions } from "./pouch"; diff --git a/packages/db/src/db.ts b/packages/db/src/db.ts index 745d114cd06..af7fbb3eaa2 100644 --- a/packages/db/src/db.ts +++ b/packages/db/src/db.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:db"); + import { GraphQLSchema, DocumentNode, parse, execute } from "graphql"; import type TruffleConfig from "@truffle/config"; import { generateCompileLoad } from "@truffle/db/loaders/commands"; diff --git a/packages/db/src/definitions/bytecodes.ts b/packages/db/src/definitions/bytecodes.ts index 3c39cc8b1a2..4a16c234b8a 100644 --- a/packages/db/src/definitions/bytecodes.ts +++ b/packages/db/src/definitions/bytecodes.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:bytecodes"); + import gql from "graphql-tag"; import { Definition } from "./types"; diff --git a/packages/db/src/definitions/compilations.ts b/packages/db/src/definitions/compilations.ts index 594a9660d92..d364ea9243d 100644 --- a/packages/db/src/definitions/compilations.ts +++ b/packages/db/src/definitions/compilations.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:compilations"); + import gql from "graphql-tag"; import { Definition } from "./types"; @@ -66,32 +69,58 @@ export const compilations: Definition<"compilations"> = { resolvers: { Compilation: { sources: { - resolve: ({ sources }, _, { workspace }) => - Promise.all(sources.map(({ id }) => workspace.get("sources", id))) + resolve: async ({ sources }, _, { workspace }) => { + debug("Resolving Compilation.sources..."); + + const result = await Promise.all( + sources.map(({ id }) => workspace.get("sources", id)) + ); + + debug("Resolved Compilation.sources."); + return result; + } }, processedSources: { - resolve: ({ id, processedSources }, _, {}) => - processedSources.map((processedSource, index) => ({ + resolve: ({ id, processedSources }, _, {}) => { + debug("Resolving Compilation.processedSources..."); + + const result = processedSources.map((processedSource, index) => ({ ...processedSource, compilation: { id }, index - })) + })); + + debug("Resolved Compilation.processedSources."); + return result; + } } }, ProcessedSource: { source: { - resolve: ({ source: { id } }, _, { workspace }) => - workspace.get("sources", id) + resolve: async ({ source: { id } }, _, { workspace }) => { + debug("Resolving ProcessedSource.source..."); + + const result = await workspace.get("sources", id); + + debug("Resolved ProcessedSource.source."); + return result; + } }, contracts: { - resolve: ({ compilation, index }, _, { workspace }) => - workspace.find("contracts", { + resolve: async ({ compilation, index }, _, { workspace }) => { + debug("Resolving ProcessedSource.compilation..."); + + const result = await workspace.find("contracts", { selector: { "compilation.id": compilation.id, "processedSource.index": index } - }) + }); + + debug("Resolved ProcessedSource.compilation."); + return result; + } } } } diff --git a/packages/db/src/definitions/contractInstances.ts b/packages/db/src/definitions/contractInstances.ts index cafcb09ff36..bed75a0667f 100644 --- a/packages/db/src/definitions/contractInstances.ts +++ b/packages/db/src/definitions/contractInstances.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:contractInstances"); + import gql from "graphql-tag"; import { Definition } from "./types"; @@ -76,15 +79,28 @@ export const contractInstances: Definition<"contractInstances"> = { resolvers: { ContractInstance: { network: { - resolve: ({ network: { id } }, _, { workspace }) => - workspace.get("networks", id) + resolve: async ({ network: { id } }, _, { workspace }) => { + debug("Resolving ContractInstance.network..."); + + const result = await workspace.get("networks", id); + + debug("Resolved ContractInstance.network."); + return result; + } }, contract: { - resolve: ({ contract: { id } }, _, { workspace }) => - workspace.get("contracts", id) + resolve: async ({ contract: { id } }, _, { workspace }) => { + debug("Resolving ContractInstance.contract..."); + const result = await workspace.get("contracts", id); + + debug("Resolved ContractInstance.contract."); + return result; + } }, callBytecode: { resolve: async ({ callBytecode }, _, { workspace }) => { + debug("Resolving ContractInstance.callBytecode..."); + const bytecode = await workspace.get( "bytecodes", callBytecode.bytecode.id @@ -97,6 +113,8 @@ export const contractInstances: Definition<"contractInstances"> = { }; } ); + + debug("Resolved ContractInstance.callBytecode."); return { bytecode: bytecode, linkValues: linkValues @@ -105,6 +123,8 @@ export const contractInstances: Definition<"contractInstances"> = { }, creation: { resolve: async (input, _, { workspace }) => { + debug("Resolving ContractInstance.creation..."); + let bytecode = await workspace.get( "bytecodes", input.creation.constructor.createBytecode.bytecode.id @@ -118,6 +138,8 @@ export const contractInstances: Definition<"contractInstances"> = { }; } ); + + debug("Resolved ContractInstance.creation."); return { transactionHash: transactionHash, constructor: { diff --git a/packages/db/src/definitions/contracts.ts b/packages/db/src/definitions/contracts.ts index 2f8a87d245c..ab70a213cab 100644 --- a/packages/db/src/definitions/contracts.ts +++ b/packages/db/src/definitions/contracts.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:contracts"); + import gql from "graphql-tag"; import { Definition } from "./types"; @@ -45,8 +48,14 @@ export const contracts: Definition<"contracts"> = { resolvers: { Contract: { compilation: { - resolve: ({ compilation: { id } }, _, { workspace }) => - workspace.get("compilations", id) + resolve: async ({ compilation: { id } }, _, { workspace }) => { + debug("Resolving Contract.compilation..."); + + const result = workspace.get("compilations", id); + + debug("Resolved Contract.compilation."); + return result; + } }, processedSource: { fragment: `... on Contract { compilation { id } }`, @@ -55,18 +64,33 @@ export const contracts: Definition<"contracts"> = { _, { workspace } ) => { + debug("Resolving Contract.processedSource..."); + const { processedSources } = await workspace.get("compilations", id); + debug("Resolved Contract.processedSource."); return processedSources[processedSource.index]; } }, createBytecode: { - resolve: ({ createBytecode: { id } }, _, { workspace }) => - workspace.get("bytecodes", id) + resolve: async ({ createBytecode: { id } }, _, { workspace }) => { + debug("Resolving Contract.createBytecode..."); + + const result = await workspace.get("bytecodes", id); + + debug("Resolved Contract.createBytecode."); + return result; + } }, callBytecode: { - resolve: ({ callBytecode: { id } }, _, { workspace }) => - workspace.get("bytecodes", id) + resolve: async ({ callBytecode: { id } }, _, { workspace }) => { + debug("Resolving Contract.callBytecode..."); + + const result = await workspace.get("bytecodes", id); + + debug("Resolved Contract.callBytecode."); + return result; + } } } } diff --git a/packages/db/src/definitions/index.ts b/packages/db/src/definitions/index.ts index 5dcffe3af4e..8308515be85 100644 --- a/packages/db/src/definitions/index.ts +++ b/packages/db/src/definitions/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions"); + import { Definitions } from "./types"; export * from "./types"; diff --git a/packages/db/src/definitions/nameRecords.ts b/packages/db/src/definitions/nameRecords.ts index a50458b854b..a78797e4de5 100644 --- a/packages/db/src/definitions/nameRecords.ts +++ b/packages/db/src/definitions/nameRecords.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:nameRecords"); + import gql from "graphql-tag"; import camelCase from "camel-case"; import { plural } from "pluralize"; @@ -28,13 +31,25 @@ export const nameRecords: Definition<"nameRecords"> = { NameRecord: { resource: { resolve: async ({ type, resource: { id } }, _, { workspace }) => { + debug("Resolving NameRecord.resource..."); + const collectionName = camelCase(plural(type)) as CollectionName; - return await workspace.get(collectionName, id); + const result = await workspace.get(collectionName, id); + + debug("Resolved NameRecord.resource."); + return result; } }, previous: { - resolve: ({ id }, _, { workspace }) => workspace.get("nameRecords", id) + resolve: async ({ id }, _, { workspace }) => { + debug("Resolving NameRecord.previous..."); + + const result = await workspace.get("nameRecords", id); + + debug("Resolved NameRecord.previous."); + return result; + } } } } diff --git a/packages/db/src/definitions/networks.ts b/packages/db/src/definitions/networks.ts index 8d9879d41af..2ad8d87c160 100644 --- a/packages/db/src/definitions/networks.ts +++ b/packages/db/src/definitions/networks.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:networks"); + import gql from "graphql-tag"; import { Definition } from "./types"; diff --git a/packages/db/src/definitions/projectNames.ts b/packages/db/src/definitions/projectNames.ts index cbf327a2b37..ea4d6d67aed 100644 --- a/packages/db/src/definitions/projectNames.ts +++ b/packages/db/src/definitions/projectNames.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:projectNames"); + import gql from "graphql-tag"; import { Definition } from "./types"; @@ -35,12 +38,24 @@ export const projectNames: Definition<"projectNames"> = { resolvers: { ProjectName: { project: { - resolve: ({ project: { id } }, _, { workspace }) => - workspace.get("projects", id) + resolve: async ({ project: { id } }, _, { workspace }) => { + debug("Resolving ProjectName.project..."); + + const result = await workspace.get("projects", id); + + debug("Resolved ProjectName.project."); + return result; + } }, nameRecord: { - resolve: ({ nameRecord: { id } }, _, { workspace }) => - workspace.get("nameRecords", id) + resolve: async ({ nameRecord: { id } }, _, { workspace }) => { + debug("Resolving ProjectName.nameRecord..."); + + const result = await workspace.get("nameRecords", id); + + debug("Resolved ProjectName.nameRecord."); + return result; + } } } } diff --git a/packages/db/src/definitions/projects.ts b/packages/db/src/definitions/projects.ts index 40f47c69740..e02014ca431 100644 --- a/packages/db/src/definitions/projects.ts +++ b/packages/db/src/definitions/projects.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:projects"); + import gql from "graphql-tag"; import { Definition } from "./types"; @@ -24,19 +27,28 @@ export const projects: Definition<"projects"> = { Project: { resolve: { resolve: async ({ id }, { name, type }, { workspace }) => { + debug("Resolving Project.resolve..."); + const results = await workspace.find("projectNames", { selector: { "project.id": id, name, type } }); + const nameRecordIds = results.map(({ nameRecord: { id } }) => id); - return await workspace.find("nameRecords", { + + const result = await workspace.find("nameRecords", { selector: { id: { $in: nameRecordIds } } }); + + debug("Resolved Project.resolve."); + return result; } }, network: { resolve: async ({ id }, { name }, { workspace }) => { + debug("Resolving Project.network..."); + const results = await workspace.find("projectNames", { selector: { "project.id": id, name, "type": "Network" } }); @@ -52,11 +64,16 @@ export const projects: Definition<"projects"> = { } const { resource } = nameRecords[0]; - return await workspace.get("networks", resource.id); + const result = await workspace.get("networks", resource.id); + + debug("Resolved Project.network."); + return result; } }, contract: { resolve: async ({ id }, { name }, { workspace }) => { + debug("Resolving Project.contract..."); + const results = await workspace.find("projectNames", { selector: { "project.id": id, name, "type": "Contract" } }); @@ -71,7 +88,11 @@ export const projects: Definition<"projects"> = { return; } const { resource } = nameRecords[0]; - return await workspace.get("contracts", resource.id); + + const result = await workspace.get("contracts", resource.id); + + debug("Resolved Project.contract."); + return result; } } } diff --git a/packages/db/src/definitions/sources.ts b/packages/db/src/definitions/sources.ts index f4e5468b55c..bc630e5c019 100644 --- a/packages/db/src/definitions/sources.ts +++ b/packages/db/src/definitions/sources.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:sources"); + import gql from "graphql-tag"; import { Definition } from "./types"; diff --git a/packages/db/src/definitions/types.ts b/packages/db/src/definitions/types.ts index bae06119b3c..b7127205186 100644 --- a/packages/db/src/definitions/types.ts +++ b/packages/db/src/definitions/types.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:definitions:types"); + import * as Meta from "@truffle/db/meta"; import * as Pouch from "../pouch"; import * as GraphQl from "../graphql"; diff --git a/packages/db/src/graphql/index.ts b/packages/db/src/graphql/index.ts index d0bb0ac74ab..b75a50766ca 100644 --- a/packages/db/src/graphql/index.ts +++ b/packages/db/src/graphql/index.ts @@ -1,2 +1,5 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:graphql"); + export * from "./types"; export * from "./schema"; diff --git a/packages/db/src/graphql/schema.ts b/packages/db/src/graphql/schema.ts index 66102cb0ff5..72f8d401187 100644 --- a/packages/db/src/graphql/schema.ts +++ b/packages/db/src/graphql/schema.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:graphql:schema"); + import gql from "graphql-tag"; import * as graphql from "graphql"; import { makeExecutableSchema, IResolvers } from "graphql-tools"; @@ -33,6 +36,9 @@ class DefinitionsSchema { } get typeDefs(): graphql.DocumentNode[] { + const log = debug.extend("typeDefs"); + log("Generating..."); + const common = gql` interface Resource { id: ID! @@ -51,12 +57,18 @@ class DefinitionsSchema { type Mutation `; - return Object.values(this.collections) + const result = Object.values(this.collections) .map(schema => schema.typeDefs) .reduce((a, b) => [...a, ...b], [common]); + + log("Generated."); + return result; } get resolvers() { + const log = debug.extend("resolvers"); + log("Generating..."); + const common = { Query: {}, @@ -76,7 +88,7 @@ class DefinitionsSchema { } }; - return Object.values(this.collections).reduce( + const result = Object.values(this.collections).reduce( (a, { resolvers: b }) => ({ ...a, ...b, @@ -91,23 +103,34 @@ class DefinitionsSchema { }), common ); + + log("Generated."); + return result; } private createSchema( resource: CollectionName ): DefinitionSchema> { + debug("Creating DefinitonSchema for %s...", resource); + const definition = this.definitions[resource]; if (definition.mutable) { - return new MutableDefinitionSchema({ + const result = new MutableDefinitionSchema({ resource: resource as MutableCollectionName, definition }); + + debug("Created MutableDefinitonSchema for %s.", resource); + return result; } - return new ImmutableDefinitionSchema({ + const result = new ImmutableDefinitionSchema({ resource, definition }); + + debug("Created ImmutableDefinitionSchema for %s.", resource); + return result; } } @@ -133,6 +156,9 @@ abstract class DefinitionSchema< } get typeDefs() { + const log = debug.extend(`${this.resource}:typeDefs`); + log("Generating..."); + const { typeDefs } = this.definition; const { @@ -143,7 +169,7 @@ abstract class DefinitionSchema< ResourcesMutate } = this.names; - return [ + const result = [ gql` ${typeDefs} @@ -167,25 +193,52 @@ abstract class DefinitionSchema< } ` ]; + + log("Generated."); + return result; } get resolvers(): IResolvers> { + const log = debug.extend(`${this.resource}:resolvers`); + log("Generating..."); + + // setup loggers for specific resolvers + const logGet = log.extend("get"); + const logAll = log.extend("all"); + const { resource, resources } = this.names; const { resolvers = {} } = this.definition; - return { + const result = { ...resolvers, Query: { [resource]: { - resolve: (_, { id }, { workspace }) => workspace.get(resources, id) + resolve: async (_, { id }, { workspace }) => { + logGet("Getting id: %s...", id); + + const result = await workspace.get(resources, id); + + logGet("Got id: %s.", id); + return result; + } }, [resources]: { - resolve: (_, {}, { workspace }) => workspace.all(resources) + resolve: async (_, {}, { workspace }) => { + logAll("Fetching all..."); + + const result = await workspace.all(resources); + + logAll("Fetched all."); + return result; + } } } }; + + log("Generated."); + return result; } } @@ -215,16 +268,30 @@ class ImmutableDefinitionSchema< } get resolvers() { + const log = debug.extend(`${this.resource}:resolvers`); + log("Generating..."); + + const logMutate = log.extend("add"); + const { resources, resourcesMutate } = this.names; - return { + const result = { ...super.resolvers, Mutation: { - [resourcesMutate]: (_, { input }, { workspace }) => - workspace.add(resources, input) + [resourcesMutate]: async (_, { input }, { workspace }) => { + logMutate("Mutating..."); + + const result = await workspace.add(resources, input); + + logMutate("Mutated."); + return result; + } } }; + + log("Generated."); + return result; } } @@ -254,16 +321,30 @@ class MutableDefinitionSchema< } get resolvers() { + const log = debug.extend(`${this.resource}:resolvers`); + log("Generating..."); + + const logMutate = log.extend("assign"); + const { resources, resourcesMutate } = this.names; - return { + const result = { ...super.resolvers, Mutation: { - [resourcesMutate]: (_, { input }, { workspace }) => - workspace.update(resources, input) + [resourcesMutate]: async (_, { input }, { workspace }) => { + logMutate("Mutating..."); + + const result = await workspace.update(resources, input); + + logMutate("Mutated."); + return result; + } } }; + + log("Generated."); + return result; } } diff --git a/packages/db/src/graphql/types.ts b/packages/db/src/graphql/types.ts index 3f10cba7efc..ef871f3b14d 100644 --- a/packages/db/src/graphql/types.ts +++ b/packages/db/src/graphql/types.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:graphql:types"); + import * as graphql from "graphql"; import { IResolvers } from "graphql-tools"; diff --git a/packages/db/src/helpers/generateId.ts b/packages/db/src/helpers/generateId.ts index 74a20cf8f9d..289a06847be 100644 --- a/packages/db/src/helpers/generateId.ts +++ b/packages/db/src/helpers/generateId.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:helpers:generateId"); + import { soliditySha3 } from "web3-utils"; const jsonStableStringify = require("json-stable-stringify"); diff --git a/packages/db/src/helpers/index.ts b/packages/db/src/helpers/index.ts index 2eb924d61a4..6e2b612abfd 100644 --- a/packages/db/src/helpers/index.ts +++ b/packages/db/src/helpers/index.ts @@ -1 +1,4 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:helpers"); + export { generateId } from "./generateId"; diff --git a/packages/db/src/index.ts b/packages/db/src/index.ts index 947bbd2c8af..1578f0a98b0 100644 --- a/packages/db/src/index.ts +++ b/packages/db/src/index.ts @@ -1,3 +1,5 @@ +const debug = require("debug")("db"); + require("source-map-support/register"); const { TruffleDB } = require("./db"); diff --git a/packages/db/src/loaders/commands/compile.ts b/packages/db/src/loaders/commands/compile.ts index 96c0fbdc0d4..5e0b70a4c5c 100644 --- a/packages/db/src/loaders/commands/compile.ts +++ b/packages/db/src/loaders/commands/compile.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:commands:compile"); + import { CompilationData, Load } from "@truffle/db/loaders/types"; import { WorkflowCompileResult, diff --git a/packages/db/src/loaders/commands/index.ts b/packages/db/src/loaders/commands/index.ts index 985de690c58..893723fa26c 100644 --- a/packages/db/src/loaders/commands/index.ts +++ b/packages/db/src/loaders/commands/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:commands"); + export { generateCompileLoad } from "./compile"; export { generateNamesLoad } from "./names"; export { generateInitializeLoad } from "./initialize"; diff --git a/packages/db/src/loaders/commands/initialize.ts b/packages/db/src/loaders/commands/initialize.ts index 97de8bb570f..2a9afda7d48 100644 --- a/packages/db/src/loaders/commands/initialize.ts +++ b/packages/db/src/loaders/commands/initialize.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:commands:initialize"); + import { IdObject, toIdObject } from "@truffle/db/meta"; import { generateProjectLoad } from "@truffle/db/loaders/resources/projects"; diff --git a/packages/db/src/loaders/commands/names.ts b/packages/db/src/loaders/commands/names.ts index 0d3b08a2a7e..e0fee2f1529 100644 --- a/packages/db/src/loaders/commands/names.ts +++ b/packages/db/src/loaders/commands/names.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:commands:names"); + import { generateProjectNameResolve, generateProjectNamesAssign @@ -14,7 +17,7 @@ export function* generateNamesLoad( project: IdObject, contracts: NamedResource[] ): Load { - let getCurrent = function*(name, type) { + let getCurrent = function* (name, type) { return yield* generateProjectNameResolve(project, name, type); }; diff --git a/packages/db/src/loaders/resources/bytecodes/index.ts b/packages/db/src/loaders/resources/bytecodes/index.ts index 57534778864..9d5205bcb18 100644 --- a/packages/db/src/loaders/resources/bytecodes/index.ts +++ b/packages/db/src/loaders/resources/bytecodes/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:bytecodes"); + import { CompilationData, LoadedBytecodes, diff --git a/packages/db/src/loaders/resources/compilations/index.ts b/packages/db/src/loaders/resources/compilations/index.ts index 55ec18f41a6..1f0c0a1cce0 100644 --- a/packages/db/src/loaders/resources/compilations/index.ts +++ b/packages/db/src/loaders/resources/compilations/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:compilations"); + import { CompilationData, LoadedSources, diff --git a/packages/db/src/loaders/resources/contractInstances/index.ts b/packages/db/src/loaders/resources/contractInstances/index.ts index 8a5e76fc4a5..dc63db6907a 100644 --- a/packages/db/src/loaders/resources/contractInstances/index.ts +++ b/packages/db/src/loaders/resources/contractInstances/index.ts @@ -1 +1,4 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:contractInstances"); + export { AddContractInstances } from "./add.graphql"; diff --git a/packages/db/src/loaders/resources/contracts/index.ts b/packages/db/src/loaders/resources/contracts/index.ts index 6b7029e77fb..ae63277b897 100644 --- a/packages/db/src/loaders/resources/contracts/index.ts +++ b/packages/db/src/loaders/resources/contracts/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:contracts"); + import { LoadedBytecodes, Load } from "@truffle/db/loaders/types"; import { IdObject } from "@truffle/db/meta"; import { CompiledContract } from "@truffle/compile-common"; diff --git a/packages/db/src/loaders/resources/nameRecords/index.ts b/packages/db/src/loaders/resources/nameRecords/index.ts index 96ee7f269f9..1739e00a83a 100644 --- a/packages/db/src/loaders/resources/nameRecords/index.ts +++ b/packages/db/src/loaders/resources/nameRecords/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:nameRecords"); + import { Load } from "@truffle/db/loaders/types"; import { toIdObject } from "@truffle/db/meta"; diff --git a/packages/db/src/loaders/resources/networks/index.ts b/packages/db/src/loaders/resources/networks/index.ts index 126dcad2be3..d7df35bb8c3 100644 --- a/packages/db/src/loaders/resources/networks/index.ts +++ b/packages/db/src/loaders/resources/networks/index.ts @@ -1 +1,4 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:networks"); + export { AddNetworks } from "./add.graphql"; diff --git a/packages/db/src/loaders/resources/projects/index.ts b/packages/db/src/loaders/resources/projects/index.ts index d8b6a0be3a0..7e8c890b7fa 100644 --- a/packages/db/src/loaders/resources/projects/index.ts +++ b/packages/db/src/loaders/resources/projects/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:projects"); + import { Load } from "@truffle/db/loaders/types"; import { IdObject } from "@truffle/db/meta"; diff --git a/packages/db/src/loaders/resources/sources/index.ts b/packages/db/src/loaders/resources/sources/index.ts index 55810418873..38cd2e92abe 100644 --- a/packages/db/src/loaders/resources/sources/index.ts +++ b/packages/db/src/loaders/resources/sources/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:resources:sources"); + import { toIdObject } from "@truffle/db/meta"; import { diff --git a/packages/db/src/loaders/run.ts b/packages/db/src/loaders/run.ts index 0228c67b417..909ba79a07a 100644 --- a/packages/db/src/loaders/run.ts +++ b/packages/db/src/loaders/run.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:run"); + import { Loader, LoadRequest, RequestName } from "./types"; export type LoaderRunner = < diff --git a/packages/db/src/loaders/schema/artifactsLoader.ts b/packages/db/src/loaders/schema/artifactsLoader.ts index 1d9d0a8f61d..f0adf285ecf 100644 --- a/packages/db/src/loaders/schema/artifactsLoader.ts +++ b/packages/db/src/loaders/schema/artifactsLoader.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:schema:artifactsLoader"); + import { TruffleDB } from "@truffle/db/db"; import * as fse from "fs-extra"; import path from "path"; diff --git a/packages/db/src/loaders/types.ts b/packages/db/src/loaders/types.ts index 8f1692cb087..86ed27d0063 100644 --- a/packages/db/src/loaders/types.ts +++ b/packages/db/src/loaders/types.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:loaders:types"); + import * as graphql from "graphql"; import { CompiledContract } from "@truffle/compile-common"; diff --git a/packages/db/src/logger.ts b/packages/db/src/logger.ts new file mode 100644 index 00000000000..eb67906f7a1 --- /dev/null +++ b/packages/db/src/logger.ts @@ -0,0 +1,4 @@ +import debugModule from "debug"; +const debug = debugModule("db:logger"); // this could maybe dogfood + +export const logger = (namespace: string) => debugModule(namespace); diff --git a/packages/db/src/meta/index.ts b/packages/db/src/meta/index.ts index 65757bc1bbc..8e6a5ada0c9 100644 --- a/packages/db/src/meta/index.ts +++ b/packages/db/src/meta/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:meta"); + export type Collections = { [collectionName: string]: | { diff --git a/packages/db/src/pouch/databases.ts b/packages/db/src/pouch/databases.ts index 93b886b3664..93404ae2a2c 100644 --- a/packages/db/src/pouch/databases.ts +++ b/packages/db/src/pouch/databases.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:pouch:databases"); + import PouchDB from "pouchdb"; import PouchDBDebug from "pouchdb-debug"; import PouchDBFind from "pouchdb-find"; @@ -76,13 +79,24 @@ export abstract class Databases implements Workspace { public async all>( collectionName: N ): Promise[]> { - return await this.find(collectionName, { selector: {} }); + const log = debug.extend(`${collectionName}:all`); + log("Fetching all..."); + + await this.ready; + + const result = await this.find(collectionName, { selector: {} }); + + log("Fetched all."); + return result; } public async find>( collectionName: N, options: PouchDB.Find.FindRequest<{}> ): Promise[]> { + const log = debug.extend(`${collectionName}:all`); + log("Finding..."); + await this.ready; // allows searching with `id` instead of pouch's internal `_id`, @@ -102,7 +116,10 @@ export abstract class Databases implements Workspace { }); // make sure we include `id` in the response as well - return docs.map(doc => ({ ...doc, id: doc["_id"] })); + const result = docs.map(doc => ({ ...doc, id: doc["_id"] })); + + log("Found."); + return result; } catch (error) { console.log(`Error fetching all ${collectionName}\n`); console.log(error); @@ -114,15 +131,21 @@ export abstract class Databases implements Workspace { collectionName: N, id: string ): Promise> | null> { + const log = debug.extend(`${collectionName}:get`); + log("Getting id: %s...", id); + await this.ready; try { const result = await this.collections[collectionName].get(id); + + log("Got id: %s.", id); return { ...result, id } as Historical>; } catch (_) { + log("Unknown id: %s.", id); return null; } } @@ -131,6 +154,9 @@ export abstract class Databases implements Workspace { collectionName: N, input: MutationInput ): Promise> { + const log = debug.extend(`${collectionName}:add`); + log("Adding..."); + await this.ready; const resources = await Promise.all( @@ -155,6 +181,10 @@ export abstract class Databases implements Workspace { }) ); + log( + "Added ids: %o", + resources.map(({ id }) => id) + ); return ({ [collectionName]: resources } as unknown) as MutationPayload; @@ -164,6 +194,9 @@ export abstract class Databases implements Workspace { collectionName: M, input: MutationInput ): Promise> { + const log = debug.extend(`${collectionName}:update`); + log("Updating..."); + await this.ready; const resources = await Promise.all( @@ -187,6 +220,10 @@ export abstract class Databases implements Workspace { }) ); + log( + "Updated ids: %o", + resources.map(({ id }) => id) + ); return ({ [collectionName]: resources } as unknown) as MutationPayload; @@ -196,6 +233,9 @@ export abstract class Databases implements Workspace { collectionName: M, input: MutationInput ): Promise { + const log = debug.extend(`${collectionName}:remove`); + log("Removing..."); + await this.ready; await Promise.all( @@ -214,6 +254,8 @@ export abstract class Databases implements Workspace { } }) ); + + log("Removed."); } private generateId>( diff --git a/packages/db/src/pouch/fs.ts b/packages/db/src/pouch/fs.ts index 03bbc85e2c3..c3fd4075107 100644 --- a/packages/db/src/pouch/fs.ts +++ b/packages/db/src/pouch/fs.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:pouch:fs"); + import path from "path"; import PouchDB from "pouchdb"; import * as jsondown from "jsondown"; diff --git a/packages/db/src/pouch/index.ts b/packages/db/src/pouch/index.ts index 4e148ba060d..1e14f8121a5 100644 --- a/packages/db/src/pouch/index.ts +++ b/packages/db/src/pouch/index.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:pouch"); + import path from "path"; export * from "./types"; diff --git a/packages/db/src/pouch/memory.ts b/packages/db/src/pouch/memory.ts index bcfd3baa7ec..0445a95648c 100644 --- a/packages/db/src/pouch/memory.ts +++ b/packages/db/src/pouch/memory.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:pouch:memory"); + import PouchDB from "pouchdb"; import PouchDBMemoryAdapter from "pouchdb-adapter-memory"; diff --git a/packages/db/src/pouch/sqlite.ts b/packages/db/src/pouch/sqlite.ts index cd40a546846..67761663097 100644 --- a/packages/db/src/pouch/sqlite.ts +++ b/packages/db/src/pouch/sqlite.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:pouch:sqlite"); + import path from "path"; import fse from "fs-extra"; import PouchDB from "pouchdb"; diff --git a/packages/db/src/pouch/types.ts b/packages/db/src/pouch/types.ts index 573e1c0e27f..cf1138a76e5 100644 --- a/packages/db/src/pouch/types.ts +++ b/packages/db/src/pouch/types.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:pouch:types"); + import PouchDB from "pouchdb"; import { diff --git a/packages/db/src/schema.ts b/packages/db/src/schema.ts index 311080ae83c..c0920b9b8be 100644 --- a/packages/db/src/schema.ts +++ b/packages/db/src/schema.ts @@ -1,3 +1,6 @@ +import { logger } from "@truffle/db/logger"; +const debug = logger("db:schema"); + import { definitions } from "./definitions"; import { forDefinitions } from "./graphql"; diff --git a/yarn.lock b/yarn.lock index d5693dfeba6..8b611756a68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7520,6 +7520,13 @@ debug@4.1.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" +debug@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"