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:
Abel Luck 2023-06-02 14:05:20 +00:00
parent b45e2e8c11
commit 696ba16cb7
78 changed files with 319 additions and 180 deletions

View file

@ -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";

View file

@ -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,

View file

@ -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;

View file

@ -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";

View file

@ -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,

View file

@ -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,

View file

@ -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"
},
};

View file

@ -1,3 +0,0 @@
{
"presets": ["babel-preset-link"]
}

View file

@ -1,4 +0,0 @@
{
"preset": "jest-config-link",
"setupFiles": ["<rootDir>/src/setup.test.ts"]
}

View file

@ -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"
}
}

View file

@ -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);
};

View file

@ -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);

View file

@ -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();
};

View file

@ -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();
}
};

View file

@ -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/**"]
}

View file

@ -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",

View file

@ -1,4 +1,4 @@
import { ConvictSchema } from "./types";
import { ConvictSchema } from "./types.js";
export interface IAppMetaConfig {
name: string;

View file

@ -1,4 +1,4 @@
import { ConvictSchema } from "./types";
import { ConvictSchema } from "./types.js";
export interface ISessionConfig {
sessionMaxAgeSeconds: number;

View file

@ -1,4 +1,4 @@
import { ConvictSchema } from "./types";
import { ConvictSchema } from "./types.js";
export interface ICorsConfig {
allowedMethods: Array<string>;

View file

@ -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

View file

@ -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";

View file

@ -1,4 +1,4 @@
import { ConvictSchema } from "./types";
import { ConvictSchema } from "./types.js";
export interface ILoggingConfig {
level: string;

View file

@ -1,4 +1,4 @@
import { ConvictSchema } from "./types";
import { ConvictSchema } from "./types.js";
export interface IMetricsConfig {
address: string;

View file

@ -1,4 +1,4 @@
import { ConvictSchema } from "./types";
import { ConvictSchema } from "./types.js";
export interface IServerConfig {
address: string;

View file

@ -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";
/**
*

View file

@ -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;

View file

@ -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;

View file

@ -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 {

View file

@ -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";

View file

@ -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

View file

@ -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;

View file

@ -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">;

View file

@ -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;

View file

@ -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,

View file

@ -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;

View file

@ -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,

View file

@ -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">;

View file

@ -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">;

View file

@ -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": {

View file

@ -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": {

View file

@ -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);

View file

@ -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";

View file

@ -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";

View file

@ -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>",

View file

@ -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");

View file

@ -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": [

View file

@ -1,4 +1,4 @@
import { SignaldGeneratedApi, JsonMessageEnvelopev1 } from "./generated";
import { SignaldGeneratedApi, JsonMessageEnvelopev1 } from "./generated.js";
export class SignaldAPI extends SignaldGeneratedApi {
constructor() {

View file

@ -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[];

View file

@ -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";

View file

@ -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 {
/**

View file

@ -3,8 +3,8 @@
"incremental": true,
"target": "es2020",
"lib": ["es2020"],
"module": "ES2020",
"moduleResolution": "node",
"module": "commonjs",
"declaration": true,
"inlineSourceMap": true,
"esModuleInterop": true,