@pipeline-builder/api-server 0.0.1

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.
Files changed (61) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +79 -0
  3. package/lib/api/app-factory.d.ts +95 -0
  4. package/lib/api/app-factory.js +328 -0
  5. package/lib/api/check-quota.d.ts +13 -0
  6. package/lib/api/check-quota.js +74 -0
  7. package/lib/api/context-middleware.d.ts +34 -0
  8. package/lib/api/context-middleware.js +42 -0
  9. package/lib/api/etag-middleware.d.ts +7 -0
  10. package/lib/api/etag-middleware.js +44 -0
  11. package/lib/api/get-context.d.ts +22 -0
  12. package/lib/api/get-context.js +28 -0
  13. package/lib/api/health-checks.d.ts +62 -0
  14. package/lib/api/health-checks.js +87 -0
  15. package/lib/api/idempotency-middleware.d.ts +80 -0
  16. package/lib/api/idempotency-middleware.js +321 -0
  17. package/lib/api/index.d.ts +20 -0
  18. package/lib/api/index.js +34 -0
  19. package/lib/api/meter-quota.d.ts +32 -0
  20. package/lib/api/meter-quota.js +70 -0
  21. package/lib/api/metrics.d.ts +47 -0
  22. package/lib/api/metrics.js +221 -0
  23. package/lib/api/middleware-factory.d.ts +56 -0
  24. package/lib/api/middleware-factory.js +80 -0
  25. package/lib/api/middleware.d.ts +1 -0
  26. package/lib/api/middleware.js +8 -0
  27. package/lib/api/mongo-connect.d.ts +19 -0
  28. package/lib/api/mongo-connect.js +41 -0
  29. package/lib/api/quota-helpers.d.ts +23 -0
  30. package/lib/api/quota-helpers.js +22 -0
  31. package/lib/api/rate-limit-by-org.d.ts +29 -0
  32. package/lib/api/rate-limit-by-org.js +64 -0
  33. package/lib/api/readiness.d.ts +29 -0
  34. package/lib/api/readiness.js +65 -0
  35. package/lib/api/request-types.d.ts +55 -0
  36. package/lib/api/request-types.js +65 -0
  37. package/lib/api/require-org-id.d.ts +14 -0
  38. package/lib/api/require-org-id.js +28 -0
  39. package/lib/api/route-wrapper.d.ts +50 -0
  40. package/lib/api/route-wrapper.js +84 -0
  41. package/lib/api/server.d.ts +79 -0
  42. package/lib/api/server.js +234 -0
  43. package/lib/api/tenant-context.d.ts +28 -0
  44. package/lib/api/tenant-context.js +48 -0
  45. package/lib/api/tracing.d.ts +25 -0
  46. package/lib/api/tracing.js +69 -0
  47. package/lib/http/index.d.ts +4 -0
  48. package/lib/http/index.js +7 -0
  49. package/lib/http/sse-connection-manager.d.ts +357 -0
  50. package/lib/http/sse-connection-manager.js +665 -0
  51. package/lib/http/sse-relay.d.ts +63 -0
  52. package/lib/http/sse-relay.js +70 -0
  53. package/lib/http/sse-ticket-channel.d.ts +31 -0
  54. package/lib/http/sse-ticket-channel.js +52 -0
  55. package/lib/http/sse-ticket-store.d.ts +75 -0
  56. package/lib/http/sse-ticket-store.js +160 -0
  57. package/lib/index.d.ts +30 -0
  58. package/lib/index.js +35 -0
  59. package/lib/otel-bootstrap.d.ts +1 -0
  60. package/lib/otel-bootstrap.js +75 -0
  61. package/package.json +183 -0
@@ -0,0 +1,75 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Shared OpenTelemetry preload bootstrap for every Pipeline Builder service.
5
+ *
6
+ * Preload it BEFORE the app's own code with (services are ESM, so `--import`,
7
+ * not the CJS `-r`):
8
+ * node --import @pipeline-builder/api-server/lib/otel-bootstrap.js index.js
9
+ * (see each service's Dockerfile CMD).
10
+ *
11
+ * Why a preload and not a programmatic SDK start from createApp/index.ts:
12
+ * OpenTelemetry auto-instrumentation patches modules as they load. If
13
+ * `http`/`express` are already loaded when the SDK starts, the HTTP server is
14
+ * never wrapped, so no inbound server span — and therefore no trace id — is ever
15
+ * created. The `--import` preload runs fully before `index.js` loads any
16
+ * instrumented module. Because the services are ESM, we also register the
17
+ * import-in-the-middle ESM loader hook below — require-in-the-middle alone only
18
+ * patches CJS `require()`, which an ESM app never uses.
19
+ *
20
+ * Self-contained on purpose: it imports ONLY OpenTelemetry packages and reads
21
+ * `process.env` directly. It must NOT import this package's own barrel (or
22
+ * api-core / pipeline-core), because those transitively require express — which
23
+ * would load express before the SDK starts and defeat the preload. This is why
24
+ * the bootstrap lives in its own entrypoint file rather than starting the SDK
25
+ * from within `api/tracing.ts`.
26
+ *
27
+ * No-op unless `OTEL_TRACING_ENABLED=true`. Service name comes from
28
+ * `OTEL_SERVICE_NAME` (falling back to `SERVICE_NAME`), which every service
29
+ * already sets in its deploy env.
30
+ */
31
+ import { register } from 'node:module';
32
+ import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
33
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
34
+ import { resourceFromAttributes } from '@opentelemetry/resources';
35
+ import { NodeSDK } from '@opentelemetry/sdk-node';
36
+ if (process.env.OTEL_TRACING_ENABLED === 'true') {
37
+ const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces';
38
+ const serviceName = process.env.OTEL_SERVICE_NAME || process.env.SERVICE_NAME || 'api';
39
+ // Enable ESM instrumentation: register the import-in-the-middle hook before any
40
+ // instrumented module is imported. Wrapped so a hook-resolution failure
41
+ // degrades to no-instrumentation (today's behaviour) rather than crashing the
42
+ // service on startup.
43
+ try {
44
+ register('@opentelemetry/instrumentation/hook.mjs', import.meta.url);
45
+ }
46
+ catch (err) {
47
+ // eslint-disable-next-line no-console
48
+ console.warn('[otel] ESM instrumentation hook not registered:', err.message);
49
+ }
50
+ const sdk = new NodeSDK({
51
+ resource: resourceFromAttributes({
52
+ 'service.name': serviceName,
53
+ 'service.namespace': 'pipeline-builder',
54
+ 'deployment.environment': process.env.NODE_ENV ?? 'development',
55
+ }),
56
+ traceExporter: new OTLPTraceExporter({ url: endpoint }),
57
+ // `fs` spans are noise for request-level correlation; everything else
58
+ // (http/express/mongo/pg/…) is auto-instrumented so inbound requests get a
59
+ // server span whose trace id flows onto audit events + structured logs.
60
+ instrumentations: [
61
+ getNodeAutoInstrumentations({
62
+ '@opentelemetry/instrumentation-fs': { enabled: false },
63
+ }),
64
+ ],
65
+ });
66
+ sdk.start();
67
+ // eslint-disable-next-line no-console
68
+ console.log(`[otel] tracing initialized for ${serviceName} -> ${endpoint}`);
69
+ const shutdown = () => {
70
+ void sdk.shutdown().catch(() => undefined);
71
+ };
72
+ process.once('SIGTERM', shutdown);
73
+ process.once('SIGINT', shutdown);
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbC1ib290c3RyYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvb3RlbC1ib290c3RyYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixLQUFLLE1BQU0sRUFBRSxDQUFDO0lBQ2hELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksaUNBQWlDLENBQUM7SUFDOUYsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUM7SUFFdkYsZ0ZBQWdGO0lBQ2hGLHdFQUF3RTtJQUN4RSw4RUFBOEU7SUFDOUUsc0JBQXNCO0lBQ3RCLElBQUksQ0FBQztRQUNILFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxFQUFHLEdBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUM7UUFDdEIsUUFBUSxFQUFFLHNCQUFzQixDQUFDO1lBQy9CLGNBQWMsRUFBRSxXQUFXO1lBQzNCLG1CQUFtQixFQUFFLGtCQUFrQjtZQUN2Qyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxhQUFhO1NBQ2hFLENBQUM7UUFDRixhQUFhLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUN2RCxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLHdFQUF3RTtRQUN4RSxnQkFBZ0IsRUFBRTtZQUNoQiwyQkFBMkIsQ0FBQztnQkFDMUIsbUNBQW1DLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO2FBQ3hELENBQUM7U0FDSDtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNaLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxXQUFXLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQztJQUU1RSxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUU7UUFDcEIsS0FBSyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTaGFyZWQgT3BlblRlbGVtZXRyeSBwcmVsb2FkIGJvb3RzdHJhcCBmb3IgZXZlcnkgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlLlxuICpcbiAqIFByZWxvYWQgaXQgQkVGT1JFIHRoZSBhcHAncyBvd24gY29kZSB3aXRoIChzZXJ2aWNlcyBhcmUgRVNNLCBzbyBgLS1pbXBvcnRgLFxuICogbm90IHRoZSBDSlMgYC1yYCk6XG4gKiAgIG5vZGUgLS1pbXBvcnQgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLXNlcnZlci9saWIvb3RlbC1ib290c3RyYXAuanMgaW5kZXguanNcbiAqIChzZWUgZWFjaCBzZXJ2aWNlJ3MgRG9ja2VyZmlsZSBDTUQpLlxuICpcbiAqIFdoeSBhIHByZWxvYWQgYW5kIG5vdCBhIHByb2dyYW1tYXRpYyBTREsgc3RhcnQgZnJvbSBjcmVhdGVBcHAvaW5kZXgudHM6XG4gKiBPcGVuVGVsZW1ldHJ5IGF1dG8taW5zdHJ1bWVudGF0aW9uIHBhdGNoZXMgbW9kdWxlcyBhcyB0aGV5IGxvYWQuIElmXG4gKiBgaHR0cGAvYGV4cHJlc3NgIGFyZSBhbHJlYWR5IGxvYWRlZCB3aGVuIHRoZSBTREsgc3RhcnRzLCB0aGUgSFRUUCBzZXJ2ZXIgaXNcbiAqIG5ldmVyIHdyYXBwZWQsIHNvIG5vIGluYm91bmQgc2VydmVyIHNwYW4g4oCUIGFuZCB0aGVyZWZvcmUgbm8gdHJhY2UgaWQg4oCUIGlzIGV2ZXJcbiAqIGNyZWF0ZWQuIFRoZSBgLS1pbXBvcnRgIHByZWxvYWQgcnVucyBmdWxseSBiZWZvcmUgYGluZGV4LmpzYCBsb2FkcyBhbnlcbiAqIGluc3RydW1lbnRlZCBtb2R1bGUuIEJlY2F1c2UgdGhlIHNlcnZpY2VzIGFyZSBFU00sIHdlIGFsc28gcmVnaXN0ZXIgdGhlXG4gKiBpbXBvcnQtaW4tdGhlLW1pZGRsZSBFU00gbG9hZGVyIGhvb2sgYmVsb3cg4oCUIHJlcXVpcmUtaW4tdGhlLW1pZGRsZSBhbG9uZSBvbmx5XG4gKiBwYXRjaGVzIENKUyBgcmVxdWlyZSgpYCwgd2hpY2ggYW4gRVNNIGFwcCBuZXZlciB1c2VzLlxuICpcbiAqIFNlbGYtY29udGFpbmVkIG9uIHB1cnBvc2U6IGl0IGltcG9ydHMgT05MWSBPcGVuVGVsZW1ldHJ5IHBhY2thZ2VzIGFuZCByZWFkc1xuICogYHByb2Nlc3MuZW52YCBkaXJlY3RseS4gSXQgbXVzdCBOT1QgaW1wb3J0IHRoaXMgcGFja2FnZSdzIG93biBiYXJyZWwgKG9yXG4gKiBhcGktY29yZSAvIHBpcGVsaW5lLWNvcmUpLCBiZWNhdXNlIHRob3NlIHRyYW5zaXRpdmVseSByZXF1aXJlIGV4cHJlc3Mg4oCUIHdoaWNoXG4gKiB3b3VsZCBsb2FkIGV4cHJlc3MgYmVmb3JlIHRoZSBTREsgc3RhcnRzIGFuZCBkZWZlYXQgdGhlIHByZWxvYWQuIFRoaXMgaXMgd2h5XG4gKiB0aGUgYm9vdHN0cmFwIGxpdmVzIGluIGl0cyBvd24gZW50cnlwb2ludCBmaWxlIHJhdGhlciB0aGFuIHN0YXJ0aW5nIHRoZSBTREtcbiAqIGZyb20gd2l0aGluIGBhcGkvdHJhY2luZy50c2AuXG4gKlxuICogTm8tb3AgdW5sZXNzIGBPVEVMX1RSQUNJTkdfRU5BQkxFRD10cnVlYC4gU2VydmljZSBuYW1lIGNvbWVzIGZyb21cbiAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgKGZhbGxpbmcgYmFjayB0byBgU0VSVklDRV9OQU1FYCksIHdoaWNoIGV2ZXJ5IHNlcnZpY2VcbiAqIGFscmVhZHkgc2V0cyBpbiBpdHMgZGVwbG95IGVudi5cbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBnZXROb2RlQXV0b0luc3RydW1lbnRhdGlvbnMgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hdXRvLWluc3RydW1lbnRhdGlvbnMtbm9kZSc7XG5pbXBvcnQgeyBPVExQVHJhY2VFeHBvcnRlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2V4cG9ydGVyLXRyYWNlLW90bHAtaHR0cCc7XG5pbXBvcnQgeyByZXNvdXJjZUZyb21BdHRyaWJ1dGVzIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvcmVzb3VyY2VzJztcbmltcG9ydCB7IE5vZGVTREsgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9zZGstbm9kZSc7XG5cbmlmIChwcm9jZXNzLmVudi5PVEVMX1RSQUNJTkdfRU5BQkxFRCA9PT0gJ3RydWUnKSB7XG4gIGNvbnN0IGVuZHBvaW50ID0gcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UIHx8ICdodHRwOi8vbG9jYWxob3N0OjQzMTgvdjEvdHJhY2VzJztcbiAgY29uc3Qgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5PVEVMX1NFUlZJQ0VfTkFNRSB8fCBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ2FwaSc7XG5cbiAgLy8gRW5hYmxlIEVTTSBpbnN0cnVtZW50YXRpb246IHJlZ2lzdGVyIHRoZSBpbXBvcnQtaW4tdGhlLW1pZGRsZSBob29rIGJlZm9yZSBhbnlcbiAgLy8gaW5zdHJ1bWVudGVkIG1vZHVsZSBpcyBpbXBvcnRlZC4gV3JhcHBlZCBzbyBhIGhvb2stcmVzb2x1dGlvbiBmYWlsdXJlXG4gIC8vIGRlZ3JhZGVzIHRvIG5vLWluc3RydW1lbnRhdGlvbiAodG9kYXkncyBiZWhhdmlvdXIpIHJhdGhlciB0aGFuIGNyYXNoaW5nIHRoZVxuICAvLyBzZXJ2aWNlIG9uIHN0YXJ0dXAuXG4gIHRyeSB7XG4gICAgcmVnaXN0ZXIoJ0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi9ob29rLm1qcycsIGltcG9ydC5tZXRhLnVybCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKCdbb3RlbF0gRVNNIGluc3RydW1lbnRhdGlvbiBob29rIG5vdCByZWdpc3RlcmVkOicsIChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3Qgc2RrID0gbmV3IE5vZGVTREsoe1xuICAgIHJlc291cmNlOiByZXNvdXJjZUZyb21BdHRyaWJ1dGVzKHtcbiAgICAgICdzZXJ2aWNlLm5hbWUnOiBzZXJ2aWNlTmFtZSxcbiAgICAgICdzZXJ2aWNlLm5hbWVzcGFjZSc6ICdwaXBlbGluZS1idWlsZGVyJyxcbiAgICAgICdkZXBsb3ltZW50LmVudmlyb25tZW50JzogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz8gJ2RldmVsb3BtZW50JyxcbiAgICB9KSxcbiAgICB0cmFjZUV4cG9ydGVyOiBuZXcgT1RMUFRyYWNlRXhwb3J0ZXIoeyB1cmw6IGVuZHBvaW50IH0pLFxuICAgIC8vIGBmc2Agc3BhbnMgYXJlIG5vaXNlIGZvciByZXF1ZXN0LWxldmVsIGNvcnJlbGF0aW9uOyBldmVyeXRoaW5nIGVsc2VcbiAgICAvLyAoaHR0cC9leHByZXNzL21vbmdvL3BnL+KApikgaXMgYXV0by1pbnN0cnVtZW50ZWQgc28gaW5ib3VuZCByZXF1ZXN0cyBnZXQgYVxuICAgIC8vIHNlcnZlciBzcGFuIHdob3NlIHRyYWNlIGlkIGZsb3dzIG9udG8gYXVkaXQgZXZlbnRzICsgc3RydWN0dXJlZCBsb2dzLlxuICAgIGluc3RydW1lbnRhdGlvbnM6IFtcbiAgICAgIGdldE5vZGVBdXRvSW5zdHJ1bWVudGF0aW9ucyh7XG4gICAgICAgICdAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24tZnMnOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICB9KSxcbiAgICBdLFxuICB9KTtcblxuICBzZGsuc3RhcnQoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coYFtvdGVsXSB0cmFjaW5nIGluaXRpYWxpemVkIGZvciAke3NlcnZpY2VOYW1lfSAtPiAke2VuZHBvaW50fWApO1xuXG4gIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgIHZvaWQgc2RrLnNodXRkb3duKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIHNodXRkb3duKTtcbn1cbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,183 @@
1
+ {
2
+ "name": "@pipeline-builder/api-server",
3
+ "description": "Express server infrastructure for Pipeline Builder: app factory, middleware (CORS, Helmet, rate limiting, idempotency, ETag), request context, route wrappers, health-check helpers, and SSE support.",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/mwashburn160/pipeline-builder.git"
7
+ },
8
+ "devDependencies": {
9
+ "@jest/globals": "30.4.1",
10
+ "@stylistic/eslint-plugin": "^2",
11
+ "@types/compression": "1.8.1",
12
+ "@types/cors": "2.8.19",
13
+ "@types/express": "5.0.6",
14
+ "@types/express-serve-static-core": "5.1.3",
15
+ "@types/jsonwebtoken": "9.0.10",
16
+ "@types/node": "26.1.2",
17
+ "@types/swagger-ui-express": "4.1.8",
18
+ "@typescript-eslint/eslint-plugin": "^8",
19
+ "@typescript-eslint/parser": "^8",
20
+ "@typescript/native": "npm:typescript@^7.0.2",
21
+ "eslint": "^9",
22
+ "eslint-import-resolver-typescript": "^4.4.4",
23
+ "eslint-plugin-import": "^2.32.0",
24
+ "jest": "30.4.2",
25
+ "jest-junit": "^17",
26
+ "ts-jest": "29.4.12",
27
+ "typescript": "npm:@typescript/typescript6@^6.0.2"
28
+ },
29
+ "dependencies": {
30
+ "@opentelemetry/api": "1.9.1",
31
+ "@opentelemetry/auto-instrumentations-node": "0.79.0",
32
+ "@opentelemetry/exporter-trace-otlp-http": "0.221.0",
33
+ "@opentelemetry/instrumentation": "0.221.0",
34
+ "@opentelemetry/resources": "2.10.0",
35
+ "@opentelemetry/sdk-node": "0.221.0",
36
+ "compression": "1.8.1",
37
+ "cors": "2.8.6",
38
+ "express": "5.2.1",
39
+ "express-rate-limit": "8.6.1",
40
+ "helmet": "8.3.0",
41
+ "ioredis": "6.0.0",
42
+ "jsonwebtoken": "9.0.3",
43
+ "prom-client": "15.1.3",
44
+ "rate-limit-redis": "6.0.0",
45
+ "swagger-ui-express": "5.0.1",
46
+ "uuid": "14.0.1",
47
+ "@pipeline-builder/pipeline-core": "0.0.1",
48
+ "@pipeline-builder/pipeline-data": "0.0.1",
49
+ "@pipeline-builder/api-core": "0.0.1"
50
+ },
51
+ "keywords": [
52
+ "ci-cd",
53
+ "cicd",
54
+ "continuous-delivery",
55
+ "devops",
56
+ "self-service",
57
+ "platform-engineering",
58
+ "internal-developer-platform",
59
+ "developer-platform",
60
+ "aws",
61
+ "aws-cdk",
62
+ "cdk",
63
+ "codepipeline",
64
+ "codebuild",
65
+ "cloudformation",
66
+ "pipeline",
67
+ "pipeline-as-code",
68
+ "infrastructure-as-code",
69
+ "iac",
70
+ "compliance",
71
+ "policy-as-code",
72
+ "governance",
73
+ "golden-paths",
74
+ "multi-tenant",
75
+ "rbac",
76
+ "ai",
77
+ "ai-pipeline-generation",
78
+ "llm",
79
+ "bedrock",
80
+ "plugins",
81
+ "plugin-marketplace",
82
+ "containerized",
83
+ "docker",
84
+ "kubernetes",
85
+ "typescript",
86
+ "cli"
87
+ ],
88
+ "engines": {
89
+ "node": ">= 24.14.0"
90
+ },
91
+ "devEngines": {
92
+ "packageManager": {
93
+ "name": "pnpm",
94
+ "version": ">=10",
95
+ "onFail": "ignore"
96
+ }
97
+ },
98
+ "main": "lib/index.js",
99
+ "license": "Apache-2.0",
100
+ "homepage": "https://mwashburn160.github.io/pipeline-builder/",
101
+ "publishConfig": {
102
+ "access": "public",
103
+ "registry": "https://registry.npmjs.org/"
104
+ },
105
+ "version": "0.0.1",
106
+ "bugs": {
107
+ "url": "https://github.com/mwashburn160/pipeline-builder/issues"
108
+ },
109
+ "jest": {
110
+ "coverageProvider": "v8",
111
+ "testMatch": [
112
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
113
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)"
114
+ ],
115
+ "clearMocks": true,
116
+ "collectCoverage": true,
117
+ "coverageReporters": [
118
+ "json",
119
+ "lcov",
120
+ "clover",
121
+ "cobertura",
122
+ "text"
123
+ ],
124
+ "coverageDirectory": "coverage",
125
+ "coveragePathIgnorePatterns": [
126
+ "/node_modules/"
127
+ ],
128
+ "testPathIgnorePatterns": [
129
+ "/node_modules/"
130
+ ],
131
+ "watchPathIgnorePatterns": [
132
+ "/node_modules/"
133
+ ],
134
+ "reporters": [
135
+ "default",
136
+ [
137
+ "jest-junit",
138
+ {
139
+ "outputDirectory": "test-reports"
140
+ }
141
+ ]
142
+ ],
143
+ "transform": {
144
+ "^.+\\.[t]sx?$": [
145
+ "ts-jest",
146
+ {
147
+ "useESM": true,
148
+ "tsconfig": "tsconfig.dev.json",
149
+ "diagnostics": {
150
+ "ignoreCodes": [
151
+ 151002
152
+ ]
153
+ }
154
+ }
155
+ ]
156
+ },
157
+ "extensionsToTreatAsEsm": [
158
+ ".ts",
159
+ ".tsx"
160
+ ],
161
+ "moduleNameMapper": {
162
+ "^uuid$": "<rootDir>/../../jest-uuid-stub.js",
163
+ "^(\\.{1,2}/.*)\\.js$": "$1"
164
+ },
165
+ "maxWorkers": 1
166
+ },
167
+ "types": "lib/index.d.ts",
168
+ "type": "module",
169
+ "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm dlx projen\".",
170
+ "scripts": {
171
+ "build": "pnpm dlx projen build",
172
+ "compile": "pnpm dlx projen compile",
173
+ "default": "pnpm dlx projen default",
174
+ "eslint": "pnpm dlx projen eslint",
175
+ "package": "pnpm dlx projen package",
176
+ "post-compile": "pnpm dlx projen post-compile",
177
+ "pre-compile": "pnpm dlx projen pre-compile",
178
+ "test": "pnpm dlx projen test",
179
+ "test:watch": "pnpm dlx projen test:watch",
180
+ "watch": "pnpm dlx projen watch",
181
+ "projen": "pnpm dlx projen"
182
+ }
183
+ }