@tandem-language-exchange/content-store 1.3.2 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ AZURE_DEVOPS_PROJECT_KEYS,
3
4
  config,
5
+ formatPipelineRunSummary,
6
+ isAzureDevOpsProjectKey,
7
+ notifyClientsAfterCmsSync,
8
+ summariseCmsContentfulApiUsage,
4
9
  summariseCmsEntries,
5
10
  summariseCmsErrors,
6
11
  summariseTranslationEntries,
7
12
  syncCmsContent,
8
- syncTranslations
9
- } from "./chunk-NQHWG4XM.js";
13
+ syncTranslations,
14
+ triggerPipelineBuild
15
+ } from "./chunk-Q3TFZNBV.js";
10
16
  import {
11
17
  allProjects
12
- } from "./chunk-SF7FCBR2.js";
18
+ } from "./chunk-TMR6VJBQ.js";
13
19
 
14
20
  // src/server/slack.ts
15
21
  import { App } from "@slack/bolt";
@@ -66,6 +72,24 @@ async function startSlackBot() {
66
72
  if (result.errors.length > 0) {
67
73
  blocks.push("", "*Errors:*", ...summariseCmsErrors(result));
68
74
  }
75
+ const apiUsageLines = summariseCmsContentfulApiUsage(result);
76
+ if (apiUsageLines.length > 0) {
77
+ blocks.push("", ...apiUsageLines);
78
+ }
79
+ const refreshResults = await notifyClientsAfterCmsSync(
80
+ result,
81
+ contentTypes
82
+ );
83
+ if (refreshResults.length > 0) {
84
+ const ok = refreshResults.filter((r) => r.ok).map((r) => r.target);
85
+ const failed = refreshResults.filter((r) => !r.ok).map((r) => r.target);
86
+ if (ok.length > 0) {
87
+ blocks.push("", `*Content refresh:* notified \`${ok.join("`, `")}\``);
88
+ }
89
+ if (failed.length > 0) {
90
+ blocks.push(`*Content refresh failed:* \`${failed.join("`, `")}\``);
91
+ }
92
+ }
69
93
  await respond({ response_type: "in_channel", text: blocks.join("\n") });
70
94
  } catch (err) {
71
95
  const message = err instanceof Error ? err.message : String(err);
@@ -110,7 +134,7 @@ async function startSlackBot() {
110
134
  const result = await syncTranslations(projects, locales);
111
135
  const lines = summariseTranslationEntries(result.entries);
112
136
  const errorLines = result.errors.map(
113
- (e) => `\u2022 \`${e.project}\` / \`${e.resource}\` / \`${e.locale}\` \u2014 ${e.error}`
137
+ (e) => `\u2022 \`${e.project}\` / \`${e.locale}\` \u2014 ${e.error}`
114
138
  );
115
139
  const blocks = [
116
140
  result.errors.length === 0 ? `:white_check_mark: *Translation sync complete* \u2014 ${result.entries.length} resource \xD7 locale uploads` : `:warning: *Translation sync complete with errors* \u2014 ${result.entries.length} succeeded, ${result.errors.length} failed`,
@@ -130,6 +154,52 @@ async function startSlackBot() {
130
154
  });
131
155
  }
132
156
  });
157
+ app.command(slack.cmdTriggerBuild, async ({ command, ack, respond }) => {
158
+ await ack();
159
+ const args = command.text.trim().split(/\s+/).filter(Boolean);
160
+ const projectArg = (args[0] ?? config.azure.defaultProject).toLowerCase();
161
+ if (args.length > 1) {
162
+ const projects = AZURE_DEVOPS_PROJECT_KEYS.join("`, `");
163
+ await respond({
164
+ response_type: "ephemeral",
165
+ text: "Usage: `/trigger-build [project]`\nQueues the pipeline configured for this instance (`ENVIRONMENT=" + config.azure.instanceEnvironment + "`, Azure `" + config.azure.pipelineEnvironment + "`).\nDefault project: `" + config.azure.defaultProject + "`. Projects: `" + projects + "`"
166
+ });
167
+ return;
168
+ }
169
+ if (!isAzureDevOpsProjectKey(projectArg)) {
170
+ await respond({
171
+ response_type: "ephemeral",
172
+ text: `Unknown project \`${projectArg}\`. Use one of: \`${AZURE_DEVOPS_PROJECT_KEYS.join("`, `")}\`.`
173
+ });
174
+ return;
175
+ }
176
+ if (!config.azure.enabled) {
177
+ await respond({
178
+ response_type: "ephemeral",
179
+ text: "Azure DevOps is not configured on this server (set `AZURE_DEVOPS_ACCESS_TOKEN`)."
180
+ });
181
+ return;
182
+ }
183
+ await respond({
184
+ response_type: "in_channel",
185
+ text: `:hourglass_flowing_sand: Queuing pipeline for \`${projectArg}\` (\`${config.azure.instanceEnvironment}\` / Azure \`${config.azure.pipelineEnvironment}\`)\u2026`
186
+ });
187
+ try {
188
+ const result = await triggerPipelineBuild(config.azure, projectArg);
189
+ await respond({
190
+ response_type: "in_channel",
191
+ text: `:rocket: Pipeline run queued
192
+ ${formatPipelineRunSummary(result)}`
193
+ });
194
+ } catch (err) {
195
+ const message = err instanceof Error ? err.message : String(err);
196
+ console.error("[slack] Pipeline trigger failed:", message);
197
+ await respond({
198
+ response_type: "ephemeral",
199
+ text: `:x: Failed to trigger build: ${message}`
200
+ });
201
+ }
202
+ });
133
203
  app.command("/list-projects", async ({ ack }) => {
134
204
  const projectNames = Object.keys(allProjects);
135
205
  const lines = projectNames.map((name, i) => `${i + 1}. ${name}`);
@@ -180,4 +250,4 @@ export {
180
250
  notifySlack,
181
251
  startSlackBot
182
252
  };
183
- //# sourceMappingURL=chunk-YWUFALDR.js.map
253
+ //# sourceMappingURL=chunk-LXA6HPF5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/slack.ts"],"sourcesContent":["import { App } from '@slack/bolt';\nimport {\n AZURE_DEVOPS_PROJECT_KEYS,\n formatPipelineRunSummary,\n isAzureDevOpsProjectKey,\n triggerPipelineBuild,\n} from './adapters/azure';\nimport { config, type CMSProvider } from './config';\nimport { notifyClientsAfterCmsSync } from './content-refresh-notify';\nimport {\n syncCmsContent,\n syncTranslations,\n summariseTranslationEntries,\n summariseCmsEntries,\n summariseCmsErrors,\n summariseCmsContentfulApiUsage,\n} from './sync/engine';\nimport { allProjects } from '../shared/lingohub';\n\nconst VALID_CMS: CMSProvider[] = ['contentful', 'sanity'];\n\nlet app: App | null = null;\n\n/**\n * Post a message to the configured Slack notify channel.\n * Silently logs and returns if Slack is not configured or no channel is set.\n */\nexport async function notifySlack(text: string): Promise<void> {\n const { notifyChannel } = config.slack;\n if (!app || !notifyChannel) {\n console.log('[slack] Notification skipped (no app or channel configured)');\n return;\n }\n try {\n await app.client.chat.postMessage({ channel: notifyChannel, text: `[${config.environment}] ${text}` });\n } catch (err) {\n console.error('[slack] Failed to send notification:', err);\n }\n}\n\nexport async function startSlackBot(): Promise<void> {\n const { slack } = config;\n if (!slack.enabled) {\n console.log('[slack] Disabled (SLACK_BOT_TOKEN not set)');\n return;\n }\n\n app = new App({\n token: slack.botToken,\n signingSecret: slack.signingSecret,\n appToken: slack.appToken,\n socketMode: true,\n });\n\n app.command(slack.cmdSyncContent, async ({ command, ack, respond }) => {\n await ack();\n\n const args = command.text.trim().split(/\\s+/).filter(Boolean);\n const cms = (args[0] ?? 'contentful') as CMSProvider;\n const contentTypes = args.length > 1 ? args.slice(1) : undefined;\n\n if (!VALID_CMS.includes(cms)) {\n await respond({\n response_type: 'ephemeral',\n text: `Invalid CMS provider \\`${cms}\\`. Use \\`contentful\\` or \\`sanity\\`.`,\n });\n return;\n }\n\n const typesHint = contentTypes?.length ? ` (types: ${contentTypes.join(', ')})` : ' (all types)';\n await respond({\n response_type: 'in_channel',\n text: `:hourglass_flowing_sand: Sync started for *${cms}*${typesHint}…`,\n });\n\n try {\n const result = await syncCmsContent(cms, contentTypes);\n\n const blocks: string[] = [\n result.errors.length === 0\n ? `:white_check_mark: *Sync complete* — ${result.entries.length} content types synced`\n : `:warning: *Sync complete with errors* — ${result.entries.length} succeeded, ${result.errors.length} failed`,\n '',\n ...summariseCmsEntries(result),\n ];\n\n if (result.errors.length > 0) {\n blocks.push('', '*Errors:*', ...summariseCmsErrors(result));\n }\n\n const apiUsageLines = summariseCmsContentfulApiUsage(result);\n if (apiUsageLines.length > 0) {\n blocks.push('', ...apiUsageLines);\n }\n\n const refreshResults = await notifyClientsAfterCmsSync(\n result,\n contentTypes,\n );\n if (refreshResults.length > 0) {\n const ok = refreshResults.filter((r) => r.ok).map((r) => r.target);\n const failed = refreshResults.filter((r) => !r.ok).map((r) => r.target);\n if (ok.length > 0) {\n blocks.push('', `*Content refresh:* notified \\`${ok.join('`, `')}\\``);\n }\n if (failed.length > 0) {\n blocks.push(`*Content refresh failed:* \\`${failed.join('`, `')}\\``);\n }\n }\n\n await respond({ response_type: 'in_channel', text: blocks.join('\\n') });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('[slack] Sync failed:', message);\n await respond({\n response_type: 'ephemeral',\n text: `:x: Sync failed: ${message}`,\n });\n }\n });\n\n app.command(slack.cmdSyncTranslations, async ({ command, ack, respond }) => {\n await ack();\n\n const raw = command.text.trim();\n if (!raw) {\n await respond({\n response_type: 'ephemeral',\n text:\n 'Usage: `/sync-translations <comma-separated projects> [<comma-separated locales>]`\\n' +\n 'Example: `/sync-translations tandem,tandem-(website) en,de,fr`\\n' +\n 'Omit locales to use the default locale list.',\n });\n return;\n }\n\n const spaceIdx = raw.indexOf(' ');\n const projectsPart = spaceIdx === -1 ? raw : raw.slice(0, spaceIdx).trim();\n const localesPart = spaceIdx === -1 ? '' : raw.slice(spaceIdx + 1).trim();\n\n const projects = projectsPart\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (projects.length === 0) {\n await respond({\n response_type: 'ephemeral',\n text:\n 'No valid projects. Pass a comma-separated list as the first argument, e.g. `tandem,tandem-(website)`.',\n });\n return;\n }\n\n let locales: string[] | undefined = localesPart.length\n ? localesPart\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined;\n if (locales && locales.length === 0) {\n locales = undefined;\n }\n\n const localesHint =\n locales?.length ? ` — locales: ${locales?.join(', ')}` : ' — default locales';\n await respond({\n response_type: 'in_channel',\n text: `:hourglass_flowing_sand: Translation sync started for projects: *${projects.join(', ')}*${localesHint}…`,\n });\n\n try {\n const result = await syncTranslations(projects, locales);\n\n const lines = summariseTranslationEntries(result.entries);\n const errorLines = result.errors.map(\n (e) =>\n `• \\`${e.project}\\` / \\`${e.locale}\\` — ${e.error}`,\n );\n\n const blocks: string[] = [\n result.errors.length === 0\n ? `:white_check_mark: *Translation sync complete* — ${result.entries.length} resource × locale uploads`\n : `:warning: *Translation sync complete with errors* — ${result.entries.length} succeeded, ${result.errors.length} failed`,\n '',\n ...lines,\n ];\n\n if (errorLines.length > 0) {\n blocks.push('', '*Errors:*', ...errorLines);\n }\n\n await respond({ response_type: 'in_channel', text: blocks.join('\\n') });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('[slack] Sync failed:', message);\n await respond({\n response_type: 'ephemeral',\n text: `:x: Sync failed: ${message}`,\n });\n }\n });\n\n app.command(slack.cmdTriggerBuild, async ({ command, ack, respond }) => {\n await ack();\n\n const args = command.text.trim().split(/\\s+/).filter(Boolean);\n const projectArg = (args[0] ?? config.azure.defaultProject).toLowerCase();\n\n if (args.length > 1) {\n const projects = AZURE_DEVOPS_PROJECT_KEYS.join('`, `');\n await respond({\n response_type: 'ephemeral',\n text:\n 'Usage: `/trigger-build [project]`\\n' +\n 'Queues the pipeline configured for this instance (`ENVIRONMENT=' +\n config.azure.instanceEnvironment +\n '`, Azure `' +\n config.azure.pipelineEnvironment +\n '`).\\n' +\n 'Default project: `' +\n config.azure.defaultProject +\n '`. Projects: `' +\n projects +\n '`',\n });\n return;\n }\n\n if (!isAzureDevOpsProjectKey(projectArg)) {\n await respond({\n response_type: 'ephemeral',\n text:\n `Unknown project \\`${projectArg}\\`. Use one of: \\`${AZURE_DEVOPS_PROJECT_KEYS.join('`, `')}\\`.`,\n });\n return;\n }\n\n if (!config.azure.enabled) {\n await respond({\n response_type: 'ephemeral',\n text: 'Azure DevOps is not configured on this server (set `AZURE_DEVOPS_ACCESS_TOKEN`).',\n });\n return;\n }\n\n await respond({\n response_type: 'in_channel',\n text:\n `:hourglass_flowing_sand: Queuing pipeline for \\`${projectArg}\\` ` +\n `(\\`${config.azure.instanceEnvironment}\\` / Azure \\`${config.azure.pipelineEnvironment}\\`)…`,\n });\n\n try {\n const result = await triggerPipelineBuild(config.azure, projectArg);\n await respond({\n response_type: 'in_channel',\n text: `:rocket: Pipeline run queued\\n${formatPipelineRunSummary(result)}`,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('[slack] Pipeline trigger failed:', message);\n await respond({\n response_type: 'ephemeral',\n text: `:x: Failed to trigger build: ${message}`,\n });\n }\n });\n\n app.command('/list-projects', async ({ ack }) => {\n const projectNames = Object.keys(allProjects);\n const lines = projectNames.map((name, i) => `${i + 1}. ${name}`);\n await ack({\n response_type: 'ephemeral',\n text: `*Available Lingohub projects:*\\n${lines.join('\\n')}`,\n });\n });\n\n app.command('/list-resources', async ({ command, ack }) => {\n const project = command.text.trim();\n if (!project) {\n const projectNames = Object.keys(allProjects);\n const lines = projectNames.map((name, i) => `${i + 1}. ${name}`);\n await ack({\n response_type: 'ephemeral',\n text: `Usage: \\`/list-resources <project-name>\\`\\n\\n*Available projects:*\\n${lines.join('\\n')}`,\n });\n return;\n }\n\n const resources = allProjects[project];\n if (!resources) {\n const available = Object.keys(allProjects).join(', ');\n await ack({\n response_type: 'ephemeral',\n text: `Unknown project \\`${project}\\`.\\nAvailable projects: ${available}`,\n });\n return;\n }\n\n const lines = resources.map(\n (r, i) => `${i + 1}. \\`${r.resource}\\` (${r.fileName})`,\n );\n await ack({\n response_type: 'ephemeral',\n text: `*Resources for \"${project}\":*\\n${lines.join('\\n')}`,\n });\n });\n\n await app.start();\n console.log('[slack] Bot connected via Socket Mode');\n}\n"],"mappings":"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","names":["lines"]}
@@ -5,7 +5,7 @@ import dotenv from "dotenv";
5
5
  dotenv.config({ path: ".env.local" });
6
6
  dotenv.config();
7
7
  var config = {
8
- environment: process.env.ENVIRONMENT || "development",
8
+ environment: process.env.ENVIRONMENT?.trim() || "development",
9
9
  s3: {
10
10
  bucket: process.env.CONTENT_STORE_S3_BUCKET ?? "",
11
11
  region: process.env.CONTENT_STORE_S3_REGION ?? "eu-central-1",
@@ -17,4 +17,4 @@ var config = {
17
17
  export {
18
18
  config
19
19
  };
20
- //# sourceMappingURL=chunk-Y6HC4NYU.js.map
20
+ //# sourceMappingURL=chunk-OCAIIQZW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/config.ts"],"sourcesContent":["import dotenv from 'dotenv';\nimport type { S3Config, CMSProvider } from './types';\n\ndotenv.config({ path: '.env.local' });\ndotenv.config();\n\nexport type { CMSProvider, S3Config };\n\nexport interface SharedConfig {\n /** Instance label (AWS convention: beta, live, development, …). */\n environment: string;\n s3: S3Config;\n}\n\nexport const config: SharedConfig = {\n environment: process.env.ENVIRONMENT?.trim() || 'development',\n s3: {\n bucket: process.env.CONTENT_STORE_S3_BUCKET ?? '',\n region: process.env.CONTENT_STORE_S3_REGION ?? 'eu-central-1',\n accessKeyId: process.env.CONTENT_STORE_AWS_ACCESS_KEY ?? '',\n secretAccessKey: process.env.CONTENT_STORE_AWS_SECRET_ACCESS_KEY ?? '',\n }\n};\n"],"mappings":";;;AAAA,OAAO,YAAY;AAGnB,OAAO,OAAO,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,OAAO;AAUP,IAAM,SAAuB;AAAA,EAChC,aAAa,QAAQ,IAAI,aAAa,KAAK,KAAK;AAAA,EAChD,IAAI;AAAA,IACA,QAAQ,QAAQ,IAAI,2BAA2B;AAAA,IAC/C,QAAQ,QAAQ,IAAI,2BAA2B;AAAA,IAC/C,aAAa,QAAQ,IAAI,gCAAgC;AAAA,IACzD,iBAAiB,QAAQ,IAAI,uCAAuC;AAAA,EACxE;AACJ;","names":[]}
@@ -10,11 +10,11 @@ import {
10
10
  parseTranslationResourceRaw,
11
11
  toFlatStringMap,
12
12
  translationJsonOutputPath
13
- } from "./chunk-LZHYKLAU.js";
13
+ } from "./chunk-VBJ6LVMY.js";
14
14
  import {
15
15
  allProjects,
16
16
  defaultLocales
17
- } from "./chunk-SF7FCBR2.js";
17
+ } from "./chunk-TMR6VJBQ.js";
18
18
 
19
19
  // src/shared/bundles.ts
20
20
  import fs from "fs/promises";
@@ -286,4 +286,4 @@ export {
286
286
  fetchMergedTranslationBundles,
287
287
  queryCmsBundle
288
288
  };
289
- //# sourceMappingURL=chunk-D2F7FQEM.js.map
289
+ //# sourceMappingURL=chunk-OWGYS6EG.js.map