Skip to content

Commit

Permalink
Feat: Start adding CSV parsing code
Browse files Browse the repository at this point in the history
  • Loading branch information
Gum-Joe committed Jul 29, 2024
1 parent 15c45ab commit 4852063
Show file tree
Hide file tree
Showing 18 changed files with 410 additions and 154 deletions.
8 changes: 7 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
{
"singleQuote": true
"singleQuote": false,
"trailingComma": "all",
"useTabs": false,
"tabWidth": 4,
"printWidth": 120,
"importOrderSeparation": true,
"importOrder": ["<THIRD_PARTY_MODULES>", "^[./]"]
}
29 changes: 29 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [

{
"type": "node",
"request": "launch",
"name": "Launch mail merge cli",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/packages/email/docsoc-mail-merge/src/cli.ts",
"cwd": "${workspaceFolder}/packages/email/docsoc-mail-merge",
"outFiles": [
"${workspaceFolder}/packages/email/docsoc-mail-merge/dist/**/*.js",
"${workspaceFolder}/packages/email/docsoc-mail-merge/dist/**/*.js.map"
],
"preLaunchTask": "nx: nx run docsoc-mail-merge:build",
"sourceMaps": true,
"sourceMapPathOverrides": {
"../../../../../packages/email/docsoc-mail-merge/**/*": "${workspaceFolder}/dist/packages/email/docsoc-mail-merge/**/*",
},
"console": "integratedTerminal"
}
]
}
5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,8 @@
],
"files.watcherExclude": {
"**/target": true
}
},
"editor.tabSize": 4,
"editor.insertSpaces": true,
"editor.detectIndentation": false
}
14 changes: 14 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "nx",
"project": "",
"command": "run",
"positional": "docsoc-mail-merge:build",
"flags": [],
"problemMatcher": [],
"label": "nx: nx run docsoc-mail-merge:build"
}
]
}
122 changes: 122 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"@swc-node/register": "~1.9.1",
"@swc/core": "~1.5.7",
"@swc/helpers": "~0.5.11",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/jest": "^29.4.0",
"@types/node": "~18.16.9",
"@typescript-eslint/eslint-plugin": "^7.3.0",
Expand Down
9 changes: 5 additions & 4 deletions packages/email/docsoc-mail-merge/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@
"name": "docsoc-mail-merge",
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/email/docsoc-mail-merge/src",
"projectType": "library",
"projectType": "application",
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": ["{options.outputPath}"],
"options": {
"outputPath": "dist/packages/email/docsoc-mail-merge",
"main": "packages/email/docsoc-mail-merge/src/index.ts",
"outputPath": "packages/email/docsoc-mail-merge/dist",
"main": "packages/email/docsoc-mail-merge/src/cli.ts",
"tsConfig": "packages/email/docsoc-mail-merge/tsconfig.lib.json",
"assets": ["packages/email/docsoc-mail-merge/*.md"]
"assets": [],
"rootDir": "packages/email/docsoc-mail-merge/src"
}
},
"run": {
Expand Down
49 changes: 49 additions & 0 deletions packages/email/docsoc-mail-merge/src/cli-testing.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import Mailer from "./mailer/mailer";
import createLogger from "./util/logger";

import { promises as fs } from "fs";
import nunjucks from "nunjucks";
import markdownit from "markdown-it";

import "dotenv/config"; // load .env
import { join } from "path";
import { renderMarkdownTemplate, renderMarkdownToHtml } from "./markdown/template";
import { parse } from "csv-parse";
import { defaultMailer, getDefaultMailer } from "./mailer/defaultMailer";

const logger = createLogger("docsoc");

async function main() {
logger.info("Starting DoCSoc Mail Merge");
logger.info("Loading template...");

const template = await fs.readFile(join(__dirname, "../templates/TEMPLATE.md.njk"), "utf-8");
const csv = await fs.readFile(join(__dirname, "../data/names.csv"), "utf-8");
const templateCompiled = nunjucks.compile(
template,
nunjucks.configure({
throwOnUndefined: true,
}),
);
const htmlWrapper = await fs.readFile(join(__dirname, "../templates/wrapper.html.njk"), "utf-8");
const htmlWrapperCompiled = nunjucks.compile(htmlWrapper, nunjucks.configure({ autoescape: false }));
const mailer = getDefaultMailer();
// read the params from the nunjucks template

const csvData = parse(csv, { columns: true });
for await (const record of csvData) {
const expanded = renderMarkdownTemplate(templateCompiled, {
name: record["name"],
});
const html = renderMarkdownToHtml(expanded);

// wrap the html in the wrapper
const wrapped = htmlWrapperCompiled.render({ content: html });

console.log(wrapped);

await defaultMailer([record["email"]], "DoCSoc Mail Merge Test", wrapped, mailer);
}
}

main();
85 changes: 40 additions & 45 deletions packages/email/docsoc-mail-merge/src/cli.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,44 @@
import Mailer from './mailer/mailer';
import createLogger from './util/logger';

import { promises as fs } from 'fs';
import nunjucks from 'nunjucks';
import markdownit from 'markdown-it';

import 'dotenv/config'; // load .env
import { join } from "path";
import { renderMarkdownTemplate, renderMarkdownToHtml } from "./markdown/template";
import { parse } from "csv-parse";
import { defaultMailer, getDefaultMailer } from "./mailer/defaultMailer";

const logger = createLogger('docsoc');


async function main() {
logger.info('Starting DoCSoc Mail Merge');
logger.info("Loading template...")

const template = await fs.readFile(join(__dirname, '../templates/TEMPLATE.md.njk'), 'utf-8');
const csv = await fs.readFile(join(__dirname, '../data/names.csv'), 'utf-8');
const templateCompiled = nunjucks.compile(template, nunjucks.configure({
throwOnUndefined: true,
}));
const htmlWrapper = await fs.readFile(join(__dirname, '../templates/wrapper.html.njk'), 'utf-8');
const htmlWrapperCompiled = nunjucks.compile(htmlWrapper, nunjucks.configure({autoescape: false}));
const mailer = getDefaultMailer();
// read the params from the nunjucks template

const csvData = parse(csv, {columns: true});
for await (const record of csvData) {

const expanded = renderMarkdownTemplate(templateCompiled, {
name: record["name"]
})
const html = renderMarkdownToHtml(expanded);

// wrap the html in the wrapper
const wrapped = htmlWrapperCompiled.render({content: html});

console.log(wrapped)

await defaultMailer([record["email"]], "DoCSoc Mail Merge Test", wrapped, mailer);
}
import "dotenv/config";
import { promises as fs } from "fs";
import markdownit from "markdown-it";
import nunjucks from "nunjucks";
// load .env
import { join } from "path";

import packageJSON from "../package.json";
import createLogger from "./util/logger";
import { CliOptions } from "./util/types";
import { stopIfCriticalFsError } from "./util/files";

const logger = createLogger("docsoc");

const opts: CliOptions = {
csvFile: "./data/names.csv",
};

async function main(opts: CliOptions) {
logger.info("DoCSoc Mail Merge");
logger.info(`v${packageJSON.version}`);

// 1: Load the CSV
logger.info("Loading CSV...");
const csvRaw = await stopIfCriticalFsError(fs.readFile(join(__dirname, "../data/names.csv"), "utf-8"));
logger.debug("Parsing & loading CSV...");
const csvParsed = parse(csvRaw, { columns: true });
const records = [];
for await (const record of csvParsed) {
records.push(record);
}
logger.info(`Loaded ${records.length} records`);

// 3: Grab fields
if (records.length === 0) {
logger.error("No records found in CSV");
throw new Error("No records found in CSV");
}
const fields = Object.keys(records[0]);
logger.info(`Fields: ${fields.join(", ")}`);
}

main();
main(opts);
Loading

0 comments on commit 4852063

Please sign in to comment.