From b05e6a4db0e22fb9a0a6ed03cc6d8a57bf8da4a5 Mon Sep 17 00:00:00 2001 From: Orion Kindel Date: Wed, 31 Jul 2024 17:08:54 -0500 Subject: [PATCH] fix: rename ath -> core --- .dockerignore | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 39 +++++++++++ bun.lockb | Bin 3527 -> 15488 bytes fly.toml | 23 +++++++ format.js | 36 +++++------ index.js | 2 + package.json | 1 + 7 files changed, 256 insertions(+), 20 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 fly.toml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7fe0732 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# syntax = docker/dockerfile:1 + +# Adjust BUN_VERSION as desired +ARG BUN_VERSION=1.1.0 +FROM oven/bun:${BUN_VERSION}-slim as base + +LABEL fly_launch_runtime="Bun" + +# Bun app lives here +WORKDIR /app + +# Set production environment +ENV NODE_ENV="production" + + +# Throw-away build stage to reduce size of final image +FROM base as build + +# Install packages needed to build node modules +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y build-essential pkg-config python-is-python3 + +# Install node modules +COPY --link bun.lockb package.json ./ +RUN bun install --ci + +# Copy application code +COPY --link . . + + +# Final stage for app image +FROM base + +# Copy built application +COPY --from=build /app /app + +# Start the server by default, this can be overwritten at runtime +EXPOSE 3000 +CMD [ "bun", "index.js" ] diff --git a/bun.lockb b/bun.lockb index 49b3e2952f3b693408614380e4f78d6d9baf42ce..ea3851d1afb389bc03669bd0867a7dbc7bc170a4 100755 GIT binary patch literal 15488 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

>eN5ve?_o&K^bYEH zrc-arN6L?q)z7D}olSL*Eqt=_Mwn;MYo)WMjhk!z%KPN?alJ%YJ#~`HjECQvbtz-> z>K$gD9VY5V>6jk;fyRsPaU?Of?<f*c`24Tg?imfT>pQv!r4+t*!F#mRg7^!hdOl}kq4tzb^=;mcw}|J%8vu6hvHG7ACUf~}O)9>A<@#6b7NlaPV!5*1jb^H+P%xm1NpY%*FgdgOtc*Odk}@ZAI7J@B7-z|B~Jk8hM}_EHItEf7g%T%nLnVj2rkwf05WvaoXGPQIU`g-&^qcZ-^O4B#(P5@=k;AAXo># zlNbaSmXYt*{%lkw01F_g*@swKI6{kGX&dVx7jhsUYJ_LSc&>|Quy|go0vGCoXPkH* ziD!p+&WC4mcz%XwUHH8Kp5fzrBI=1c;+Y4YPvF@So&(`oJbs_Yh70w@GaP-m@Vh;H zPeIiU;KFx8R3E1noqhVjlg6 zHlyF78|@4*hYTb&drynOULm$Heg-%7A*Xr#H0mcO@td8Mysg>hY(OI`XeTETnjMve zTp3>~Q}`Kdl9L$E<`VM8MxsDFDtTM7;jhULP3=I5HQSnP#bDGyJK#Mzi4;{<;;`Y* z2I4Tl`B*|?MU|Bn+X9AT&LB~_B&rljEX>&)3$`tZ(lJEn1HG{v%# zSWIQq%@Tb;qFqU}CRM`067uds;zgmv64bV9j>shurBK3Q+p-}jhQtb!SXV5uVcW1R z7$lmPM59ven6s@R&bBcgn8dR}i7oUGu#t#i67dQpr~#Cam}3$%3nf-;3+x3Fl}w^) zp~QmnHiN`1lek+ffp$QHESLr`V&x<OD|91K&Lm0~N>FR?8;OG^ zalB9hp2iXq2~8q-p#(?b*X;q!*EJyV(ann9whNt7^@SSoss#9PzGC~6I% zDkPGdL?R;_lt4QqwwuHzQ*0c>kf?AH)l6YHY?yQUu=v3mB`5LCjci~ki6AEt(8@~C zZD{D1+G*^$FSOI>ov*j^#r~msfyAVfm}=0?20RM7ktlT%Wep{beVPWPnCcqkr;k`E ze|{)m!gdLl@g*XzaI#Dy5cxambDEb*+vcT`;*m*tl+3EvNtVQ|(ZL@u;Jr?FciPwX z3Qm_vrF;o+dR^6D>ftxG4kjJ-JAf!#>q|=EnhgWdVUVhZDkMCQU~T4nX=$b^M1}|j zL98GlSHzb^1i_q_2!doze!>V}u}mN~^M&6_@Fh3|oTy?m_z{IdC50LRGFgyxh?$v$ z?+?NLk_fgaX#PAYTP*Q6Yo;?}(K0M*S!T=pBaw$J=xp9RX$xGW8ZeQMENbCLo)&P; zN&^yq|A8}PFx5C@C=FXcBS2xb0!)3TC}3HIh8x+#q>Ud$Vqbm>bhKKa4OV6;9x5Cw zWD61b3V4E6m7-Sz8hRF73r`~Jw)rGX3g|E?i+bX55Yyb(EgA8Jp#enASQaemu+{*d zG=MJ@vVudzvX;C;J+y#LL;>aKtS0oki=ZohFSTI%j;R5*8O^8rPd6&h*p%^3;jrfz(mWzxNIGb1}jW!v|f>6QM&|e8Ld_r+=6Azm4Kx=1G5Pp zKdtHC__HchzVRd24bQ+ONix{oQ!MMSG1K;t)La_wKh6tWEEe(uM>Y+(=95oLp(-gNw-1#jn2F;b4h!8=o zxzr-rf?sft3n&y+*HLRw3-xKs6ToOWXbra0=mLB~K@Y)KG%fJJP95;@pXzwnXtg}z zadQUsQLv!0onolW7l;J#dqiG93k@~Z0eI8r=F#RO;qv$_es~b}tyt6o(PuS*?z20J zXPm+X@T)-)kMGN(w1d&WgI`U~=LWSv-&_fpn=|lWXnj8Ue9|0h_Q?%U4ECh0c$jQh z0Zl$qxYhqc00HP#}NsCq=e)#GO02H`yX;rgN Ry+ge}qb-VE?*G02{{w-8EjIuF delta 589 zcmZpuJT5&!Pjho|f^xl!uZE1lvYOre4qH3#NX7ZROpa2&GL&Fmw%?YFp85tP3fpi&=<^j?gKpG@I`2?fGWC3OmM(xRw%=V1s zlV<|S^^jKn&t@05J%FXb>L+DAWIM^JD(KOp}F~MJDseDKMr_)|JZ!I?G^ljA8^M*9NGC zM>r<)Yud_#?fds10ze#)yFNhG@NiBp($bOxITz$4kki?K7^K7k7(O5n!#R18rV=CL zYmSKD{nOjFv8WzZlPtT~FpLHpd ziLuT?&s5LQfWdIGy^f?EEHXIrZH~PPoV6P$Z>ncxrf0$ci>`_KQN3zgZ7rD?wIHT5 zoB+lu2yk#uE;4YLyu-ji3gkmjoVHk)o?)!u`)2`+Xb{lnoy=rtvpLA{A>-tYax(yZ C2X3JN diff --git a/fly.toml b/fly.toml new file mode 100644 index 0000000..975c69c --- /dev/null +++ b/fly.toml @@ -0,0 +1,23 @@ +# fly.toml app configuration file generated for lum-zulip-plane on 2024-07-23T12:01:40-05:00 +# +# See https://fly.io/docs/reference/configuration/ for information about how to use this file. +# + +app = 'lum-zulip-plane' +primary_region = 'ord' + +[deploy] +strategy = 'immediate' + +[build] + +[http_service] + internal_port = 3000 + force_https = true + min_machines_running = 1 + processes = ['app'] + +[[vm]] + memory = '512mb' + cpu_kind = 'shared' + cpus = 1 diff --git a/format.js b/format.js index c37fc0e..b16879e 100644 --- a/format.js +++ b/format.js @@ -98,6 +98,10 @@ export const isIssueEstimateUpdated = e => export const isIssueStateUpdated = e => e.event === 'issue' && e.action === 'updated' && e.activity.field === 'state' +/** @type {(e: Event) => e is EventIssueUpdated<"name">} */ +export const isIssueTitleUpdated = e => + e.event === 'issue' && e.action === 'updated' && e.activity.field === 'name' + /** @type {(c: import('./plane.js').Config, p: string, i: string) => string} */ export const issueURL = (c, project, issue) => c.baseURI + '/' + c.workspace + '/projects/' + project + '/issues/' + issue @@ -125,12 +129,12 @@ export default async (plane, ev) => { /** @type {(_: {sequence_id: number, name: string, project: string, id: string}) => string} */ const link = ({ sequence_id, name, project, id }) => - `**[ATH-${sequence_id}](${issueURL(plane, project, id)}) ${name}**` + `**[CORE-${sequence_id}](${issueURL(plane, project, id)}) ${name}**` const thisLink = link(ev.data) const title = parent ? link(parent) + '\n⤷ ' + link(ev.data) : link(ev.data) const topic = parent - ? 'ATH-' + parent.sequence_id - : 'ATH-' + ev.data.sequence_id + ? 'CORE-' + parent.sequence_id + : 'CORE-' + ev.data.sequence_id /** @type {(g: import('./plane.js').StateGroup) => string} */ const stateEmoji = s => @@ -164,23 +168,10 @@ export default async (plane, ev) => { return ( '**Sub-issues**\n' + by_state('completed') - .map(i => stateEmoji(stateMap[i.state].group) + ' ' + link(i)) - .concat( - by_state('started').map( - i => stateEmoji(stateMap[i.state].group) + ' ' + link(i), - ), - ) - .concat( - by_state('unstarted').map( - i => stateEmoji(stateMap[i.state].group) + ' ' + link(i), - ), - ) - .concat( - by_state('backlog').map( - i => stateEmoji(stateMap[i.state].group) + ' ' + link(i), - ), - ) - .map(l => ' - ' + l) + .concat(by_state('started')) + .concat(by_state('unstarted')) + .concat(by_state('backlog')) + .map(i => ' - ' + stateEmoji(stateMap[i.state].group) + ' ' + link(i)) .join('\n') ) })() @@ -206,6 +197,11 @@ export default async (plane, ev) => { topic, content: `${title}\n${user} set estimate to ${estimateMap[ev.data.estimate_point.toString()]}`, } + } else if (isIssueTitleUpdated(ev)) { + return { + topic, + content: `${title}\n${user} updated title to ${ev.data.name}`, + } } else if (isIssueDescriptionUpdated(ev)) { return { topic, diff --git a/index.js b/index.js index 99f2e19..46151f2 100644 --- a/index.js +++ b/index.js @@ -41,6 +41,8 @@ const server = Bun.serve({ return new Response() }, + hostname: '0.0.0.0', + lowMemoryMode: true, }) console.log(`Zulip <> Plane integration`) diff --git a/package.json b/package.json index 15b8fee..6799148 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "zulip-plane", "module": "index.js", "devDependencies": { + "@flydotio/dockerfile": "^0.5.8", "@types/bun": "latest", "prettier": "^3.3.3", "typescript": "^5.5.4"