Skip to content

Commit 2ee25cd

Browse files
authored
feat: internalize sparkpost code, upgrade all dependencies (#97)
BREAKING CHANGE: uses latest microfleet version, which requires a change in configuration
1 parent 1c1adff commit 2ee25cd

28 files changed

Lines changed: 9777 additions & 9609 deletions

.babelrc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
{
22
"plugins": [
3-
"@babel/plugin-transform-strict-mode",
4-
"@babel/plugin-proposal-class-properties",
5-
["@babel/plugin-proposal-object-rest-spread", { "useBuiltIns": true }]
3+
"@babel/plugin-transform-strict-mode"
64
],
75
"env": {
86
"test": {

.husky/commit-msg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/sh
2+
. "$(dirname "$0")/_/husky.sh"
3+
4+
npx --no-install commitlint -e $1

.husky/prepare-commit-msg

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/sh
2+
. "$(dirname "$0")/_/husky.sh"
3+
4+
case "$2,$3" in
5+
merge,)
6+
ex "+%s/Merge branch '\([^']\+\)'/chore(merge): \1/i" -scwq $1 ;;
7+
*) ;;
8+
esac

.mdeprc

Lines changed: 0 additions & 7 deletions
This file was deleted.

.mdeprc.cjs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module.exports = {
2+
node: "20",
3+
auto_compose: true,
4+
services: [
5+
"rabbitmq"
6+
],
7+
extras: {
8+
tester: {
9+
environment: {
10+
NODE_NO_WARNINGS: '1'
11+
}
12+
}
13+
}
14+
}

.nycrc

Lines changed: 0 additions & 19 deletions
This file was deleted.

.releaserc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"prepare": [
55
"@semantic-release/changelog",
66
"@semantic-release/npm",
7-
{ "path": "@semantic-release/exec", "cmd": "yarn docker-release" },
7+
{ "path": "@semantic-release/exec", "cmd": "pnpm docker-release" },
88
"@semantic-release/git"
99
],
1010
"publish": ["@semantic-release/npm", "@semantic-release/github"],

.semaphore/semaphore.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
version: v1.0
2+
name: makeomatic/ms-mailer
3+
agent:
4+
machine:
5+
type: e1-standard-2
6+
os_image: ubuntu2004
7+
8+
fail_fast:
9+
stop:
10+
when: "branch != 'master'"
11+
12+
auto_cancel:
13+
running:
14+
when: "branch != 'master'"
15+
16+
global_job_config:
17+
prologue:
18+
commands:
19+
- set -e
20+
- sem-version node --lts
21+
- corepack enable
22+
- corepack install --global pnpm@9.x
23+
- checkout
24+
- cache restore node-$(checksum pnpm-lock.yaml)
25+
- pnpm i --frozen-lockfile --prefer-offline --ignore-scripts
26+
- cache store node-$(checksum pnpm-lock.yaml) $(pnpm store path)
27+
28+
blocks:
29+
- name: test
30+
dependencies: []
31+
task:
32+
jobs:
33+
- name: test
34+
commands:
35+
- pnpm test
36+
37+
- name: test-docker-build
38+
dependencies: []
39+
task:
40+
jobs:
41+
- name: docker build
42+
commands:
43+
- pnpm mdep docker build
44+
45+
- name: release
46+
dependencies: ["test", "test-docker-build"]
47+
skip:
48+
when: "branch != 'master'"
49+
task:
50+
secrets:
51+
- name: semantic-release
52+
- name: docker-hub
53+
jobs:
54+
- name: release
55+
commands:
56+
- pnpm run semantic-release

Dockerfile

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,31 @@
1-
FROM makeomatic/node:$NODE_VERSION-onbuild
1+
FROM makeomatic/node:$NODE_VERSION
22

33
ENV NCONF_NAMESPACE=MS_MAILER \
4-
NODE_ENV=$NODE_ENV
4+
NODE_ENV=$NODE_ENV \
5+
COREPACK_ENABLE_NETWORK=1
6+
7+
WORKDIR /src
8+
9+
# pnpm fetch does require only lockfile
10+
COPY --chown=node:node pnpm-lock.yaml ./
11+
RUN \
12+
apk --update --upgrade \
13+
add ca-certificates --virtual .buildDeps git ca-certificates openssl g++ make python3 linux-headers \
14+
&& update-ca-certificates \
15+
&& corepack install -g pnpm@9 \
16+
&& chown node:node /src \
17+
&& su node sh -c "cd /src && pnpm fetch --prod" \
18+
&& su node sh -c "rm -rf ~/.cache && pnpm store prune" \
19+
&& apk del .buildDeps \
20+
&& rm -rf \
21+
/tmp/* \
22+
/root/.node-gyp \
23+
/root/.npm \
24+
/etc/apk/cache/* \
25+
/var/cache/apk/*
26+
27+
USER node
28+
COPY --chown=node:node . /src
29+
RUN pnpm install --offline --prod
30+
31+
CMD [ "./node_modules/.bin/mfleet" ]

bin/send-email.js

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -53,41 +53,48 @@ const { argv } = require('yargs')
5353
.help('h');
5454

5555
// these are basic options that we want to send
56-
const Promise = require('bluebird');
57-
const AMQPTransport = require('@microfleet/transport-amqp');
56+
const { connect } = require('@microfleet/transport-amqp');
5857
const omit = require('lodash/omit');
5958
const pick = require('lodash/pick');
60-
const config = require('../lib/config').get('/', { env: process.env.NODE_ENV });
61-
// App level code
59+
const getStore = require('../lib/config');
6260

63-
const amqpConfig = omit(config.amqp.transport, ['queue', 'listen', 'neck', 'onComplete', 'bindPersistantQueueToHeadersExchange']);
64-
const { prefix } = config.router.routes;
65-
const getTransport = () => {
66-
console.info('establishing connection to amqp with %j', amqpConfig);
67-
return AMQPTransport.connect(amqpConfig).disposer((amqp) => amqp.close());
68-
};
61+
async function main() {
62+
const store = await getStore({ env: process.env.NODE_ENV });
63+
const config = store.get('/');
6964

70-
// sends email
71-
const sendEmail = (amqp) => {
72-
const route = `${prefix}.predefined`;
73-
const basics = pick(argv, ['from', 'to', 'cc', 'bcc', 'subject']);
74-
const message = {
75-
account: argv.account,
76-
email: { ...basics },
77-
};
65+
const amqpConfig = omit(config.amqp.transport, ['queue', 'listen', 'neck', 'onComplete', 'bindPersistantQueueToHeadersExchange']);
66+
const { prefix } = config.router.routes;
7867

79-
message.email[argv.type] = argv.body;
68+
// sends email
69+
async function sendEmail(amqp) {
70+
const route = `${prefix}.predefined`;
71+
const basics = pick(argv, ['from', 'to', 'cc', 'bcc', 'subject']);
72+
const message = {
73+
account: argv.account,
74+
email: { ...basics },
75+
};
8076

81-
// add attachments, ensure they are local
82-
if (Array.isArray(argv.attachment) && argv.attachment.length > 0) {
83-
message.email.attachments = argv.attachment;
77+
message.email[argv.type] = argv.body;
78+
79+
// add attachments, ensure they are local
80+
if (Array.isArray(argv.attachment) && argv.attachment.length > 0) {
81+
message.email.attachments = argv.attachment;
82+
}
83+
84+
const rsp = await amqp.publishAndWait(route, message, { timeout: 60000 });
85+
86+
console.log(rsp.response);
8487
}
8588

86-
return amqp
87-
.publishAndWait(route, message, { timeout: 60000 })
88-
.tap((rsp) => console.log(rsp.response));
89-
};
89+
let transport;
90+
try {
91+
transport = await connect(amqpConfig);
92+
await sendEmail(transport);
93+
} catch (err) {
94+
console.error(err);
95+
} finally {
96+
if (transport) transport.close();
97+
}
98+
}
9099

91-
Promise
92-
.using(getTransport(), sendEmail)
93-
.done();
100+
main();

0 commit comments

Comments
 (0)