metamigo-api: runs in docker now
* great typescript module import refactor * refactor metamigo-cli so it is the entrypoint for the db, api, and worker
This commit is contained in:
parent
b45e2e8c11
commit
696ba16cb7
78 changed files with 319 additions and 180 deletions
|
|
@ -6,7 +6,7 @@ This is a plugin for hapi.js that exposes [NextAuth's database adapter](https://
|
|||
|
||||
```typescript
|
||||
import * as Hapi from "@hapi/hapi";
|
||||
import * as Joi from "joi";
|
||||
import Joi from "joi";
|
||||
import NextAuthPlugin from "@digiresilience/hapi-nextauth";
|
||||
import type { AdapterInstance } from "next-auth/adapters";
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
"version": "1.0.0",
|
||||
"description": "a plugin for hapi.js that exposes NextAuth's database adapter via HTTP",
|
||||
"main": "build/main/index.js",
|
||||
"type": "module",
|
||||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"private": false,
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import * as Hapi from "@hapi/hapi";
|
||||
import * as Hoek from "@hapi/hoek";
|
||||
import * as Joi from "joi";
|
||||
import Joi from "joi";
|
||||
|
||||
import { NextAuthPluginOptions } from "./types";
|
||||
import * as Routes from "./routes";
|
||||
import { NextAuthPluginOptions } from "./types.js";
|
||||
import * as Routes from "./routes.js";
|
||||
|
||||
const minimumProfileSchema = Joi.object()
|
||||
.keys({
|
||||
|
|
@ -98,5 +98,5 @@ const nextAuthPlugin = {
|
|||
version: "0.0.3",
|
||||
};
|
||||
|
||||
export * from "./types";
|
||||
export * from "./types.js";
|
||||
export default nextAuthPlugin;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* eslint-disable unicorn/no-null */
|
||||
import * as Joi from "joi";
|
||||
import Joi from "joi";
|
||||
import * as Hapi from "@hapi/hapi";
|
||||
import { ResponseToolkit, ResponseObject } from "@hapi/hapi";
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
"version": "1.0.0",
|
||||
"description": "a hapi.js plugin for pg-promise",
|
||||
"main": "build/main/index.js",
|
||||
"type": "module",
|
||||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"private": false,
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import * as Hapi from "@hapi/hapi";
|
||||
import pgPromise from "pg-promise";
|
||||
import * as pgMonitor from "pg-monitor";
|
||||
import pgMonitor from "pg-monitor";
|
||||
import type { IConnectionParameters } from "pg-promise/typescript/pg-subset";
|
||||
import type { IMain, IInitOptions } from "pg-promise";
|
||||
import { IPGPPluginOptions, ExtendedProtocol } from "./types";
|
||||
import { IPGPPluginOptions, ExtendedProtocol } from "./types.js";
|
||||
import { Plugin } from "@hapi/hapi/lib/types/plugin";
|
||||
|
||||
export * from "./types";
|
||||
export * from "./types.js";
|
||||
|
||||
export const startDiagnostics = <T>(
|
||||
logSql: boolean,
|
||||
|
|
|
|||
|
|
@ -1,12 +0,0 @@
|
|||
require("eslint-config-link/patch/modern-module-resolution");
|
||||
module.exports = {
|
||||
extends: [
|
||||
"eslint-config-link/profile/node",
|
||||
"eslint-config-link/profile/typescript",
|
||||
"eslint-config-link/profile/jest",
|
||||
],
|
||||
parserOptions: { tsconfigRootDir: __dirname },
|
||||
rules: {
|
||||
"new-cap": "off"
|
||||
},
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"presets": ["babel-preset-link"]
|
||||
}
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
{
|
||||
"preset": "jest-config-link",
|
||||
"setupFiles": ["<rootDir>/src/setup.test.ts"]
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"name": "@digiresilience/metamigo-cli",
|
||||
"version": "0.2.0",
|
||||
"main": "build/main/index.js",
|
||||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
"@digiresilience/montar": "*",
|
||||
"@digiresilience/metamigo-config": "*",
|
||||
"@digiresilience/metamigo-db": "*",
|
||||
"commander": "^10.0.1",
|
||||
"graphile-migrate": "^1.4.1",
|
||||
"graphile-worker": "^0.13.0",
|
||||
"node-jose": "^2.2.0",
|
||||
"postgraphile": "4.13.0",
|
||||
"graphql": "16.6.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"pino-pretty": "^10.0.0",
|
||||
"nodemon": "^2.0.22",
|
||||
"tsconfig-link": "*",
|
||||
"eslint-config-link": "*",
|
||||
"jest-config-link": "*",
|
||||
"babel-preset-link": "*",
|
||||
"typescript": "^5.0.4"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc -p tsconfig.json",
|
||||
"cli": "NODE_ENV=development node --unhandled-rejections=strict build/main/index.js",
|
||||
"fix:lint": "eslint src --ext .ts --fix",
|
||||
"fmt": "prettier \"src/**/*.ts\" --write",
|
||||
"lint": "eslint src --ext .ts && prettier \"src/**/*.ts\" --list-different",
|
||||
"test": "echo no tests"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
import {
|
||||
generateConfig,
|
||||
printConfigOptions,
|
||||
} from "@digiresilience/metamigo-common";
|
||||
import { IAppConfig, IAppConvict } from "@digiresilience/metamigo-config";
|
||||
import { loadConfigRaw } from "@digiresilience/metamigo-config";
|
||||
|
||||
export const genConf = async (): Promise<void> => {
|
||||
const c = await loadConfigRaw() as any;
|
||||
const generated = generateConfig(c) as any;
|
||||
console.log(generated);
|
||||
};
|
||||
|
||||
export const genSchema = async (): Promise<void> => {
|
||||
const c: any = await loadConfigRaw();
|
||||
console.log(c.getSchemaString());
|
||||
};
|
||||
|
||||
export const listConfig = async (): Promise<void> => {
|
||||
const c = await loadConfigRaw() as any;
|
||||
printConfigOptions(c);
|
||||
};
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
import { Command } from "commander";
|
||||
import { startWithout } from "@digiresilience/montar";
|
||||
import { migrateWrapper } from "@digiresilience/metamigo-db";
|
||||
import { loadConfig } from "@digiresilience/metamigo-config";
|
||||
import { genConf, listConfig } from "./config";
|
||||
import { createTokenForTesting, generateJwks } from "./jwks";
|
||||
import { exportGraphqlSchema } from "./metamigo-postgraphile";
|
||||
import "api/build/main/server";
|
||||
import "api/build/main/logger";
|
||||
import "worker/build/main";
|
||||
|
||||
const program = new Command();
|
||||
|
||||
export async function runServer(): Promise<void> {
|
||||
await startWithout(["worker"]);
|
||||
}
|
||||
|
||||
export async function runWorker(): Promise<void> {
|
||||
await startWithout(["server"]);
|
||||
}
|
||||
|
||||
program
|
||||
.command("config-generate")
|
||||
.description("Generate a sample JSON configuration file (to stdout)")
|
||||
.action(genConf);
|
||||
|
||||
program
|
||||
.command("config-help")
|
||||
.description("Prints the entire convict config ")
|
||||
.action(listConfig);
|
||||
|
||||
program
|
||||
.command("api")
|
||||
.description("Run the application api server")
|
||||
.action(runServer);
|
||||
|
||||
program
|
||||
.command("worker")
|
||||
.description("Run the worker to process jobs")
|
||||
.action(runWorker);
|
||||
|
||||
program
|
||||
.command("db <commands...>")
|
||||
.description("Run graphile-migrate commands with your app's config loaded.")
|
||||
.action(async (args) => {
|
||||
const config = await loadConfig();
|
||||
return migrateWrapper(args, config);
|
||||
});
|
||||
|
||||
program
|
||||
.command("gen-jwks")
|
||||
.description("Generate the JWKS")
|
||||
.action(generateJwks);
|
||||
|
||||
program
|
||||
.command("gen-testing-jwt")
|
||||
.description("Generate a JWT for the test suite")
|
||||
.action(createTokenForTesting);
|
||||
|
||||
program
|
||||
.command("export-graphql-schema")
|
||||
.description("Export the graphql schema")
|
||||
.action(exportGraphqlSchema);
|
||||
|
||||
program.parse(process.argv);
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
import jose from "node-jose";
|
||||
import * as jwt from "jsonwebtoken";
|
||||
|
||||
const generateKeystore = async () => {
|
||||
const keystore = jose.JWK.createKeyStore();
|
||||
await keystore.generate("oct", 256, {
|
||||
alg: "A256GCM",
|
||||
use: "enc",
|
||||
});
|
||||
await keystore.generate("oct", 256, {
|
||||
alg: "HS512",
|
||||
use: "sig",
|
||||
});
|
||||
return keystore;
|
||||
};
|
||||
|
||||
const safeString = (input) =>
|
||||
Buffer.from(JSON.stringify(input)).toString("base64");
|
||||
|
||||
const stringify = (v) => JSON.stringify(v, undefined, 2);
|
||||
|
||||
const _generateJwks = async () => {
|
||||
const keystore = await generateKeystore();
|
||||
const encryption = keystore.all({ use: "enc" })[0].toJSON(true);
|
||||
const signing = keystore.all({ use: "sig" })[0].toJSON(true);
|
||||
|
||||
return {
|
||||
nextAuth: {
|
||||
signingKeyB64: safeString(signing),
|
||||
encryptionKeyB64: safeString(encryption),
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const generateJwks = async (): Promise<void> => {
|
||||
console.log(stringify(await _generateJwks()));
|
||||
};
|
||||
|
||||
export const createTokenForTesting = async (): Promise<void> => {
|
||||
const keys = await _generateJwks();
|
||||
const signingKey = Buffer.from(
|
||||
JSON.parse(
|
||||
Buffer.from(keys.nextAuth.signingKeyB64, "base64").toString("utf-8")
|
||||
).k,
|
||||
"base64"
|
||||
);
|
||||
|
||||
const token = jwt.sign(
|
||||
{
|
||||
iss: "Test Env",
|
||||
iat: 1606893960,
|
||||
aud: "metamigo",
|
||||
sub: "abel@guardianproject.info",
|
||||
name: "Abel Luck",
|
||||
email: "abel@guardianproject.info",
|
||||
userRole: "admin",
|
||||
},
|
||||
signingKey,
|
||||
{ expiresIn: "100y", algorithm: "HS512" }
|
||||
);
|
||||
console.log("CONFIG");
|
||||
console.log(stringify(keys));
|
||||
console.log();
|
||||
console.log("TOKEN");
|
||||
console.log(token);
|
||||
console.log();
|
||||
};
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
import { writeFileSync } from "node:fs";
|
||||
import {
|
||||
getIntrospectionQuery,
|
||||
GraphQLSchema,
|
||||
graphqlSync,
|
||||
lexicographicSortSchema,
|
||||
printSchema,
|
||||
} from "graphql";
|
||||
import { createPostGraphileSchema } from "postgraphile";
|
||||
import { Pool } from "pg";
|
||||
import { loadConfig } from "@digiresilience/metamigo-config";
|
||||
import { getPostGraphileOptions } from "@digiresilience/metamigo-db";
|
||||
|
||||
export const exportGraphqlSchema = async (): Promise<void> => {
|
||||
const config = await loadConfig();
|
||||
|
||||
const rootPgPool = new Pool({
|
||||
connectionString: config.db.connection,
|
||||
});
|
||||
const exportSchema = `../../data/schema.graphql`;
|
||||
const exportJson = `../../frontend/lib/graphql-schema.json`;
|
||||
try {
|
||||
const schema = (await createPostGraphileSchema(
|
||||
config.postgraphile.authConnection,
|
||||
"app_public",
|
||||
getPostGraphileOptions()
|
||||
)) as unknown as GraphQLSchema;
|
||||
const sorted = lexicographicSortSchema(schema);
|
||||
const json = graphqlSync({ schema, source: getIntrospectionQuery() });
|
||||
writeFileSync(exportSchema, printSchema(sorted));
|
||||
writeFileSync(exportJson, JSON.stringify(json));
|
||||
|
||||
console.log(`GraphQL schema exported to ${exportSchema}`);
|
||||
console.log(`GraphQL schema json exported to ${exportJson}`);
|
||||
} finally {
|
||||
rootPgPool.end();
|
||||
}
|
||||
};
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
"extends": "tsconfig-link",
|
||||
"compilerOptions": {
|
||||
"incremental": true,
|
||||
"outDir": "build/main",
|
||||
"rootDir": "src",
|
||||
"baseUrl": "./",
|
||||
"skipLibCheck": true,
|
||||
"types": ["jest", "node"],
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["src/**/*.ts"],
|
||||
"exclude": ["node_modules/**"]
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
"version": "0.2.0",
|
||||
"description": "",
|
||||
"main": "build/main/index.js",
|
||||
"type": "module",
|
||||
"types": "build/main/index.d.ts",
|
||||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ConvictSchema } from "./types";
|
||||
import { ConvictSchema } from "./types.js";
|
||||
|
||||
export interface IAppMetaConfig {
|
||||
name: string;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ConvictSchema } from "./types";
|
||||
import { ConvictSchema } from "./types.js";
|
||||
|
||||
export interface ISessionConfig {
|
||||
sessionMaxAgeSeconds: number;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ConvictSchema } from "./types";
|
||||
import { ConvictSchema } from "./types.js";
|
||||
|
||||
export interface ICorsConfig {
|
||||
allowedMethods: Array<string>;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import * as Joi from "joi";
|
||||
import Joi from "joi";
|
||||
import type { Format } from "convict";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import process from "node:process";
|
||||
import convict, { SchemaObj } from "convict";
|
||||
import { IServerConfig, ServerConfig } from "./server";
|
||||
import { IMetricsConfig, MetricsConfig } from "./metrics-server";
|
||||
import { IAppMetaConfig, AppMetaConfig } from "./app-meta";
|
||||
import { ICorsConfig, CorsConfig } from "./cors";
|
||||
import { ILoggingConfig, LoggingConfig } from "./logging";
|
||||
import { ExtendedConvict } from "./types";
|
||||
import { MetamigoConvictFormats } from "./formats";
|
||||
import { IServerConfig, ServerConfig } from "./server.js";
|
||||
import { IMetricsConfig, MetricsConfig } from "./metrics-server.js";
|
||||
import { IAppMetaConfig, AppMetaConfig } from "./app-meta.js";
|
||||
import { ICorsConfig, CorsConfig } from "./cors.js";
|
||||
import { ILoggingConfig, LoggingConfig } from "./logging.js";
|
||||
import { ExtendedConvict } from "./types.js";
|
||||
import { MetamigoConvictFormats } from "./formats.js";
|
||||
|
||||
type IEnvConfig = "production" | "development" | "test";
|
||||
|
||||
|
|
@ -51,10 +51,10 @@ export type IMetamigoConvict = ExtendedConvict<IMetamigoConfig>;
|
|||
|
||||
export type { IMetamigoConfig };
|
||||
|
||||
export * from "./formats";
|
||||
export * from "./generate";
|
||||
export * from "./print";
|
||||
export * from "./types";
|
||||
export * from "./formats.js";
|
||||
export * from "./generate.js";
|
||||
export * from "./print.js";
|
||||
export * from "./types.js";
|
||||
|
||||
/**
|
||||
* Loads your applications configuration from environment variables and configuration files (see METAMIGO_CONFIG).
|
||||
|
|
@ -137,8 +137,8 @@ export const loadConfiguration = async <T extends IMetamigoConfig>(
|
|||
return c.getProperties();
|
||||
};
|
||||
|
||||
export { type IServerConfig } from "./server";
|
||||
export { type IMetricsConfig } from "./metrics-server";
|
||||
export { type IAppMetaConfig } from "./app-meta";
|
||||
export { type ICorsConfig } from "./cors";
|
||||
export { type ILoggingConfig } from "./logging";
|
||||
export { type IServerConfig } from "./server.js";
|
||||
export { type IMetricsConfig } from "./metrics-server.js";
|
||||
export { type IAppMetaConfig } from "./app-meta.js";
|
||||
export { type ICorsConfig } from "./cors.js";
|
||||
export { type ILoggingConfig } from "./logging.js";
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ConvictSchema } from "./types";
|
||||
import { ConvictSchema } from "./types.js";
|
||||
|
||||
export interface ILoggingConfig {
|
||||
level: string;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ConvictSchema } from "./types";
|
||||
import { ConvictSchema } from "./types.js";
|
||||
|
||||
export interface IMetricsConfig {
|
||||
address: string;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ConvictSchema } from "./types";
|
||||
import { ConvictSchema } from "./types.js";
|
||||
|
||||
export interface IServerConfig {
|
||||
address: string;
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
/* eslint-disable @typescript-eslint/no-explicit-any,max-params */
|
||||
import * as Boom from "@hapi/boom";
|
||||
import * as Hapi from "@hapi/hapi";
|
||||
import { CrudRepository } from "../records/crud-repository";
|
||||
import { createResponse } from "../helpers/response";
|
||||
import { CrudRepository } from "../records/crud-repository.js";
|
||||
import { createResponse } from "../helpers/response.js";
|
||||
import {
|
||||
PgRecordInfo,
|
||||
UnsavedR,
|
||||
SavedR,
|
||||
KeyType,
|
||||
} from "../records/record-info";
|
||||
} from "../records/record-info.js";
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
/* eslint-disable unicorn/no-null,max-params */
|
||||
import { createHash, randomBytes } from "node:crypto";
|
||||
import omit from "lodash/omit";
|
||||
import type { IMetamigoRepositories } from "../records";
|
||||
import type { UnsavedAccount } from "../records/account";
|
||||
import type { UserId, UnsavedUser, SavedUser } from "../records/user";
|
||||
import type { UnsavedSession, SavedSession } from "../records/session";
|
||||
import omit from "lodash/omit.js";
|
||||
import type { IMetamigoRepositories } from "../records/index.js";
|
||||
import type { UnsavedAccount } from "../records/account.js";
|
||||
import type { UserId, UnsavedUser, SavedUser } from "../records/user.js";
|
||||
import type { UnsavedSession, SavedSession } from "../records/session.js";
|
||||
|
||||
// Sessions expire after 30 days of being idle
|
||||
export const defaultSessionMaxAge = 30 * 24 * 60 * 60 * 1000;
|
||||
|
|
|
|||
|
|
@ -8,11 +8,11 @@ import PinoPlugin from "hapi-pino";
|
|||
import { createServer as createPrometheusServer } from "@promster/server";
|
||||
import { createHttpTerminator } from "http-terminator";
|
||||
|
||||
import { getPrettyPrint } from "./logger";
|
||||
import RequestIdPlugin from "./plugins/request-id";
|
||||
import StatusPlugin from "./plugins/status";
|
||||
import ConfigPlugin from "./plugins/config";
|
||||
import { IMetamigoConfig } from "./config";
|
||||
import { getPrettyPrint } from "./logger.js";
|
||||
import RequestIdPlugin from "./plugins/request-id.js";
|
||||
import StatusPlugin from "./plugins/status.js";
|
||||
import ConfigPlugin from "./plugins/config.js";
|
||||
import { IMetamigoConfig } from "./config/index.js";
|
||||
|
||||
export interface Server {
|
||||
hapiServer: Hapi.Server;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import process from "node:process";
|
||||
import * as Hapi from "@hapi/hapi";
|
||||
import * as Joi from "joi";
|
||||
import Hoek from "@hapi/hoek";
|
||||
import Joi from "joi";
|
||||
import * as Hoek from "@hapi/hoek";
|
||||
import * as Boom from "@hapi/boom";
|
||||
|
||||
export interface HapiValidationError extends Joi.ValidationError {
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
export * from "./config";
|
||||
export * from "./controllers/crud-controller";
|
||||
export * from "./controllers/nextauth-adapter";
|
||||
export * from "./hapi";
|
||||
export * from "./helpers";
|
||||
export * from "./helpers/response";
|
||||
export * from "./helpers/validation-error";
|
||||
export * from "./logger";
|
||||
export * from "./records";
|
||||
export * from "./config/index.js";
|
||||
export * from "./controllers/crud-controller.js";
|
||||
export * from "./controllers/nextauth-adapter.js";
|
||||
export * from "./hapi.js";
|
||||
export * from "./helpers/index.js";
|
||||
export * from "./helpers/response.js";
|
||||
export * from "./helpers/validation-error.js";
|
||||
export * from "./logger.js";
|
||||
export * from "./records/index.js";
|
||||
|
||||
import * as pino from "pino";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import pino, { LoggerOptions } from "pino";
|
||||
import { IMetamigoConfig } from "./config";
|
||||
import { IMetamigoConfig } from "./config/index.js";
|
||||
|
||||
export const getPrettyPrint = <T extends IMetamigoConfig>(
|
||||
config: T
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { Server } from "@hapi/hapi";
|
||||
import cloneDeep from "lodash/cloneDeep";
|
||||
import { deepFreeze } from "../helpers";
|
||||
import cloneDeep from "lodash/cloneDeep.js";
|
||||
import { deepFreeze } from "../helpers/index.js";
|
||||
|
||||
interface ConfigOptions {
|
||||
config: unknown;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { recordInfo } from "./record-info";
|
||||
import { RepositoryBase } from "./base";
|
||||
import { recordInfo } from "./record-info.js";
|
||||
import { RepositoryBase } from "./base.js";
|
||||
import { Flavor, UUID } from "../helpers";
|
||||
import { UserId } from "./user";
|
||||
import { UserId } from "./user.js";
|
||||
|
||||
export type AccountId = Flavor<UUID, "Account Id">;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { TableName } from "pg-promise";
|
||||
import { IMain } from "../db/types";
|
||||
import { CrudRepository } from "./crud-repository";
|
||||
import { PgRecordInfo, UnsavedR, SavedR, KeyType } from "./record-info";
|
||||
import { IMain } from "../db/types.js";
|
||||
import { CrudRepository } from "./crud-repository.js";
|
||||
import { PgRecordInfo, UnsavedR, SavedR, KeyType } from "./record-info.js";
|
||||
import type { IDatabase } from "pg-promise";
|
||||
|
||||
export type PgProtocol<T> = IDatabase<T> & T;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import { TableName } from "pg-promise";
|
||||
import decamelcaseKeys from "decamelcase-keys";
|
||||
import isObject from "lodash/isObject";
|
||||
import isArray from "lodash/isArray";
|
||||
import zipObject from "lodash/zipObject";
|
||||
import isEmpty from "lodash/isEmpty";
|
||||
import omit from "lodash/omit";
|
||||
import { IDatabase, IMain, IResult } from "../db/types";
|
||||
import { PgRecordInfo, idKeysOf } from "./record-info";
|
||||
import isObject from "lodash/isObject.js";
|
||||
import isArray from "lodash/isArray.js";
|
||||
import zipObject from "lodash/zipObject.js";
|
||||
import isEmpty from "lodash/isEmpty.js";
|
||||
import omit from "lodash/omit.js";
|
||||
import { IDatabase, IMain, IResult } from "../db/types.js";
|
||||
import { PgRecordInfo, idKeysOf } from "./record-info.js";
|
||||
|
||||
export interface ICrudRepository<
|
||||
TUnsavedR,
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
export * from "./base";
|
||||
export * from "./record-info";
|
||||
export * from "./crud-repository";
|
||||
export * from "./user";
|
||||
export * from "./session";
|
||||
export * from "./account";
|
||||
export * from "./base.js";
|
||||
export * from "./record-info.js";
|
||||
export * from "./crud-repository.js";
|
||||
export * from "./user.js";
|
||||
export * from "./session.js";
|
||||
export * from "./account.js";
|
||||
|
||||
import type { AccountRecordRepository } from "./account";
|
||||
import type { UserRecordRepository } from "./user";
|
||||
import type { SessionRecordRepository } from "./session";
|
||||
import type { AccountRecordRepository } from "./account.js";
|
||||
import type { UserRecordRepository } from "./user.js";
|
||||
import type { SessionRecordRepository } from "./session.js";
|
||||
|
||||
export interface IMetamigoRepositories {
|
||||
users: UserRecordRepository;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import at from "lodash/at";
|
||||
import pick from "lodash/pick";
|
||||
import at from "lodash/at.js";
|
||||
import pick from "lodash/pick.js";
|
||||
|
||||
export interface EntityType<
|
||||
TUnsaved = any,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { recordInfo } from "./record-info";
|
||||
import { RepositoryBase } from "./base";
|
||||
import { recordInfo } from "./record-info.js";
|
||||
import { RepositoryBase } from "./base.js";
|
||||
import { Flavor, UUID } from "../helpers";
|
||||
import { UserId } from "./user";
|
||||
import { UserId } from "./user.js";
|
||||
|
||||
export type SessionId = Flavor<UUID, "Session Id">;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { recordInfo } from "./record-info";
|
||||
import { RepositoryBase } from "./base";
|
||||
import { recordInfo } from "./record-info.js";
|
||||
import { RepositoryBase } from "./base.js";
|
||||
import { Flavor, UUID } from "../helpers";
|
||||
|
||||
export type UserId = Flavor<UUID, "User Id">;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
"name": "@digiresilience/metamigo-config",
|
||||
"version": "0.2.0",
|
||||
"main": "build/main/index.js",
|
||||
"type": "module",
|
||||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
"private": true,
|
||||
"version": "0.2.0",
|
||||
"main": "build/main/index.js",
|
||||
"type": "module",
|
||||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
import process from "node:process";
|
||||
import { existsSync } from "node:fs";
|
||||
import path from "node:path";
|
||||
import { exec } from "node:child_process";
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import type { IAppConfig } from "@digiresilience/metamigo-config";
|
||||
|
||||
/**
|
||||
|
|
@ -34,10 +36,11 @@ export const migrateWrapper = async (
|
|||
DATABASE_VISITOR: config.postgraphile.visitor,
|
||||
};
|
||||
const cmd = `npx --no-install graphile-migrate ${commands.join(" ")}`;
|
||||
const dbDir = `../../db`;
|
||||
const gmrc = `${dbDir}/.gmrc`;
|
||||
if (!existsSync(gmrc)) {
|
||||
throw new Error(`graphile migrate config not found at ${gmrc}`);
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const dbDir = path.resolve(__dirname, '../../');
|
||||
const gmrcPath = path.resolve(__dirname, '../../.gmrc');
|
||||
if (!existsSync(gmrcPath)) {
|
||||
throw new Error(`graphile migrate config not found at ${gmrcPath}`);
|
||||
}
|
||||
|
||||
if (!silent) console.log("executing:", cmd);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import type { IAppConfig } from "@digiresilience/metamigo-config";
|
|||
import camelcaseKeys from "camelcase-keys";
|
||||
import PgSimplifyInflectorPlugin from "@graphile-contrib/pg-simplify-inflector";
|
||||
import PgManyToManyPlugin from "@graphile-contrib/pg-many-to-many";
|
||||
import * as ConnectionFilterPlugin from "postgraphile-plugin-connection-filter";
|
||||
import ConnectionFilterPlugin from "postgraphile-plugin-connection-filter";
|
||||
import type { PostGraphileOptions } from "postgraphile";
|
||||
|
||||
import {
|
||||
|
|
@ -20,7 +20,7 @@ import {
|
|||
WhatsappMessageRecordRepository,
|
||||
WhatsappAttachmentRecordRepository,
|
||||
SignalBotRecordRepository,
|
||||
} from "./records";
|
||||
} from "./records/index.js";
|
||||
|
||||
import type { IInitOptions, IDatabase } from "pg-promise";
|
||||
|
||||
|
|
@ -83,5 +83,5 @@ export const getPostGraphileOptions = (): PostGraphileOptions => ({
|
|||
],
|
||||
});
|
||||
|
||||
export * from "./helpers";
|
||||
export * from "./records";
|
||||
export * from "./helpers.js";
|
||||
export * from "./records/index.js";
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
export * from "./settings";
|
||||
export * from "./signal/bots";
|
||||
export * from "./whatsapp/bots";
|
||||
export * from "./whatsapp/messages";
|
||||
export * from "./whatsapp/attachments";
|
||||
export * from "./settings";
|
||||
export * from "./voice/voice-line";
|
||||
export * from "./voice/voice-provider";
|
||||
export * from "./webhooks";
|
||||
export * from "./settings.js";
|
||||
export * from "./signal/bots.js";
|
||||
export * from "./whatsapp/bots.js";
|
||||
export * from "./whatsapp/messages.js";
|
||||
export * from "./whatsapp/attachments.js";
|
||||
export * from "./settings.js";
|
||||
export * from "./voice/voice-line.js";
|
||||
export * from "./voice/voice-provider.js";
|
||||
export * from "./webhooks.js";
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
"version": "0.1.7",
|
||||
"description": "manage typescript state",
|
||||
"main": "build/main/index.js",
|
||||
"type": "module",
|
||||
"typings": "build/main/index.d.ts",
|
||||
"module": "build/module/index.js",
|
||||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
/* eslint-disable no-await-in-loop */
|
||||
import Debug from "debug";
|
||||
import { mutableProxyFactory } from "./proxy";
|
||||
import { mutableProxyFactory } from "./proxy.js";
|
||||
|
||||
const debug = Debug("montar");
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
"author": "Abel Luck <abel@guardianproject.info>",
|
||||
"license": "AGPL-3.0-only",
|
||||
"private": false,
|
||||
"type": "module",
|
||||
"main": "build/main/index.js",
|
||||
"types": "types/main/index.d.ts",
|
||||
"files": [
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { SignaldGeneratedApi, JsonMessageEnvelopev1 } from "./generated";
|
||||
import { SignaldGeneratedApi, JsonMessageEnvelopev1 } from "./generated.js";
|
||||
|
||||
export class SignaldAPI extends SignaldGeneratedApi {
|
||||
constructor() {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
Date: Mon Jan 03 2022 09:59:39 GMT+0000 (Coordinated Universal Time)
|
||||
Version: 0.15.0-40-56a6c9d2
|
||||
*/
|
||||
import { JSONTransport } from "./util";
|
||||
import { JSONTransport } from "./util.js";
|
||||
|
||||
export type JsonAccountListv0 = {
|
||||
accounts?: JsonAccountv0[];
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
export { SignaldAPI } from "./api";
|
||||
export { JSONTransport, EventTypes } from "./util";
|
||||
export { SignaldError, CaptchaRequiredException } from "./error";
|
||||
import "./util";
|
||||
export * from "./generated";
|
||||
export { SignaldAPI } from "./api.js";
|
||||
export { JSONTransport, EventTypes } from "./util.js";
|
||||
export { SignaldError, CaptchaRequiredException } from "./error.js";
|
||||
import "./util.js";
|
||||
export * from "./generated.js";
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import EventEmitter from "eventemitter3";
|
|||
import { v4 as uuid } from "uuid";
|
||||
import * as backoff from "backoff";
|
||||
import * as net from "net";
|
||||
import { throwOnError } from "./error";
|
||||
import { throwOnError } from "./error.js";
|
||||
|
||||
export interface EventTypes {
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
"incremental": true,
|
||||
"target": "es2020",
|
||||
"lib": ["es2020"],
|
||||
"module": "ES2020",
|
||||
"moduleResolution": "node",
|
||||
"module": "commonjs",
|
||||
"declaration": true,
|
||||
"inlineSourceMap": true,
|
||||
"esModuleInterop": true,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue