@stackwright-services/runtime 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.
- package/dist/index.d.mts +985 -0
- package/dist/index.d.ts +985 -0
- package/dist/index.js +1177 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1138 -0
- package/dist/index.mjs.map +1 -0
- package/dist/prebuild/index.d.mts +65 -0
- package/dist/prebuild/index.d.ts +65 -0
- package/dist/prebuild/index.js +192 -0
- package/dist/prebuild/index.js.map +1 -0
- package/dist/prebuild/index.mjs +162 -0
- package/dist/prebuild/index.mjs.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
// src/prebuild/register.ts
|
|
9
|
+
import { CapabilityRegistry, registerAllCapabilities } from "@stackwright-services/capabilities";
|
|
10
|
+
|
|
11
|
+
// src/datasource/scan.ts
|
|
12
|
+
function scanDataSources() {
|
|
13
|
+
const sources = [];
|
|
14
|
+
const detectedProviders = [];
|
|
15
|
+
try {
|
|
16
|
+
__require.resolve("@stackwright-pro/openapi/datasource-adapter");
|
|
17
|
+
detectedProviders.push("@stackwright-pro/openapi");
|
|
18
|
+
try {
|
|
19
|
+
const mod = __require("@stackwright-pro/openapi/datasource-adapter");
|
|
20
|
+
if (typeof mod.listDataSources === "function") {
|
|
21
|
+
sources.push(...mod.listDataSources());
|
|
22
|
+
}
|
|
23
|
+
} catch (err) {
|
|
24
|
+
console.warn(
|
|
25
|
+
"stackwright-services:datasource Failed to enumerate @stackwright-pro/openapi sources:",
|
|
26
|
+
err
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
__require.resolve("@stackwright-pro/pulse/datasource-adapter");
|
|
33
|
+
detectedProviders.push("@stackwright-pro/pulse");
|
|
34
|
+
try {
|
|
35
|
+
const mod = __require("@stackwright-pro/pulse/datasource-adapter");
|
|
36
|
+
if (typeof mod.listDataSources === "function") {
|
|
37
|
+
sources.push(...mod.listDataSources());
|
|
38
|
+
}
|
|
39
|
+
} catch (err) {
|
|
40
|
+
console.warn(
|
|
41
|
+
"stackwright-services:datasource Failed to enumerate @stackwright-pro/pulse sources:",
|
|
42
|
+
err
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
} catch {
|
|
46
|
+
}
|
|
47
|
+
return { sources, detectedProviders };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/prebuild/register.ts
|
|
51
|
+
var PACKAGE_VERSION = "0.0.1";
|
|
52
|
+
function enumerateTriggers() {
|
|
53
|
+
return [
|
|
54
|
+
{
|
|
55
|
+
type: "http",
|
|
56
|
+
description: "HTTP request/response trigger \u2014 becomes API Gateway route (Lambda) or Ingress (k8s)",
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: "object",
|
|
59
|
+
properties: {
|
|
60
|
+
method: { type: "string", enum: ["GET", "POST", "PUT", "DELETE", "PATCH"] },
|
|
61
|
+
path: { type: "string", pattern: "^/" },
|
|
62
|
+
input_schema: { type: "string" }
|
|
63
|
+
},
|
|
64
|
+
required: ["method", "path"]
|
|
65
|
+
},
|
|
66
|
+
example: {
|
|
67
|
+
type: "http",
|
|
68
|
+
method: "POST",
|
|
69
|
+
path: "/api/patients/at-risk",
|
|
70
|
+
input_schema: "AtRiskRequest"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
type: "event",
|
|
75
|
+
description: "Pub/sub event trigger \u2014 subscribes to a message bus topic",
|
|
76
|
+
inputSchema: {
|
|
77
|
+
type: "object",
|
|
78
|
+
properties: {
|
|
79
|
+
source: { type: "string", pattern: "^bus:" },
|
|
80
|
+
input_schema: { type: "string" }
|
|
81
|
+
},
|
|
82
|
+
required: ["source"]
|
|
83
|
+
},
|
|
84
|
+
example: {
|
|
85
|
+
type: "event",
|
|
86
|
+
source: "bus:equipment-status",
|
|
87
|
+
input_schema: "EquipmentStatusEvent"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
type: "schedule",
|
|
92
|
+
description: "Cron-style scheduled trigger \u2014 periodic invocation",
|
|
93
|
+
inputSchema: {
|
|
94
|
+
type: "object",
|
|
95
|
+
properties: {
|
|
96
|
+
cron: { type: "string" },
|
|
97
|
+
input_schema: { type: "string" }
|
|
98
|
+
},
|
|
99
|
+
required: ["cron"]
|
|
100
|
+
},
|
|
101
|
+
example: { type: "schedule", cron: "0 */6 * * *", input_schema: "ScheduledCheckInput" }
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
type: "queue",
|
|
105
|
+
description: "Durable point-to-point queue trigger \u2014 processes messages sequentially",
|
|
106
|
+
inputSchema: {
|
|
107
|
+
type: "object",
|
|
108
|
+
properties: {
|
|
109
|
+
source: { type: "string", pattern: "^queue:" },
|
|
110
|
+
batch_size: { type: "number", minimum: 1, maximum: 10 },
|
|
111
|
+
input_schema: { type: "string" }
|
|
112
|
+
},
|
|
113
|
+
required: ["source"]
|
|
114
|
+
},
|
|
115
|
+
example: {
|
|
116
|
+
type: "queue",
|
|
117
|
+
source: "queue:approvals",
|
|
118
|
+
batch_size: 1,
|
|
119
|
+
input_schema: "ApprovalMessage"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
function enumerateCapabilities() {
|
|
125
|
+
const registry = new CapabilityRegistry();
|
|
126
|
+
registerAllCapabilities(registry);
|
|
127
|
+
return registry.listAll().map((cap) => {
|
|
128
|
+
const descriptor = {
|
|
129
|
+
name: cap.definition.name,
|
|
130
|
+
kind: cap.definition.kind,
|
|
131
|
+
description: cap.definition.description,
|
|
132
|
+
inputSchema: cap.definition.inputSchema,
|
|
133
|
+
outputSchema: cap.definition.outputSchema
|
|
134
|
+
};
|
|
135
|
+
if (cap.definition.kind === "effect") {
|
|
136
|
+
descriptor.requiredPermissions = cap.definition.requiredPermissions;
|
|
137
|
+
}
|
|
138
|
+
return descriptor;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function enumerateDataSources() {
|
|
142
|
+
const scanResult = scanDataSources();
|
|
143
|
+
return scanResult.sources.map((source) => ({
|
|
144
|
+
id: source.id,
|
|
145
|
+
provider: source.transport,
|
|
146
|
+
operations: source.operations
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
function registerServices() {
|
|
150
|
+
return {
|
|
151
|
+
pluginId: "@stackwright-services/runtime",
|
|
152
|
+
version: PACKAGE_VERSION,
|
|
153
|
+
triggers: enumerateTriggers(),
|
|
154
|
+
capabilities: enumerateCapabilities(),
|
|
155
|
+
dataSources: enumerateDataSources(),
|
|
156
|
+
registeredAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
export {
|
|
160
|
+
registerServices
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/prebuild/register.ts","../../src/datasource/scan.ts"],"sourcesContent":["/**\n * Core prebuild registration function.\n * Discovers and enumerates the complete services schema surface.\n */\nimport { CapabilityRegistry, registerAllCapabilities } from '@stackwright-services/capabilities';\nimport { scanDataSources } from '../datasource/scan';\nimport type {\n CapabilityDescriptor,\n DataSourceDescriptorEntry,\n PrebuildRegistration,\n TriggerTypeDescriptor,\n} from './types';\n\n// Read version from package.json at build time\nconst PACKAGE_VERSION = '0.0.1'; // Synced with package.json via sync-versions.mjs\n\n/**\n * Enumerate all known trigger types.\n * The trigger type set is closed and small per VISION.md.\n */\nfunction enumerateTriggers(): TriggerTypeDescriptor[] {\n return [\n {\n type: 'http',\n description:\n 'HTTP request/response trigger — becomes API Gateway route (Lambda) or Ingress (k8s)',\n inputSchema: {\n type: 'object',\n properties: {\n method: { type: 'string', enum: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'] },\n path: { type: 'string', pattern: '^/' },\n input_schema: { type: 'string' },\n },\n required: ['method', 'path'],\n },\n example: {\n type: 'http',\n method: 'POST',\n path: '/api/patients/at-risk',\n input_schema: 'AtRiskRequest',\n },\n },\n {\n type: 'event',\n description: 'Pub/sub event trigger — subscribes to a message bus topic',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', pattern: '^bus:' },\n input_schema: { type: 'string' },\n },\n required: ['source'],\n },\n example: {\n type: 'event',\n source: 'bus:equipment-status',\n input_schema: 'EquipmentStatusEvent',\n },\n },\n {\n type: 'schedule',\n description: 'Cron-style scheduled trigger — periodic invocation',\n inputSchema: {\n type: 'object',\n properties: {\n cron: { type: 'string' },\n input_schema: { type: 'string' },\n },\n required: ['cron'],\n },\n example: { type: 'schedule', cron: '0 */6 * * *', input_schema: 'ScheduledCheckInput' },\n },\n {\n type: 'queue',\n description: 'Durable point-to-point queue trigger — processes messages sequentially',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', pattern: '^queue:' },\n batch_size: { type: 'number', minimum: 1, maximum: 10 },\n input_schema: { type: 'string' },\n },\n required: ['source'],\n },\n example: {\n type: 'queue',\n source: 'queue:approvals',\n batch_size: 1,\n input_schema: 'ApprovalMessage',\n },\n },\n ];\n}\n\n/**\n * Walk the capability registry and extract descriptors.\n */\nfunction enumerateCapabilities(): CapabilityDescriptor[] {\n const registry = new CapabilityRegistry();\n registerAllCapabilities(registry);\n\n return registry.listAll().map((cap) => {\n const descriptor: CapabilityDescriptor = {\n name: cap.definition.name,\n kind: cap.definition.kind,\n description: cap.definition.description,\n inputSchema: cap.definition.inputSchema,\n outputSchema: cap.definition.outputSchema,\n };\n\n if (cap.definition.kind === 'effect') {\n descriptor.requiredPermissions = cap.definition.requiredPermissions;\n }\n\n return descriptor;\n });\n}\n\n/**\n * Discover installed data sources.\n * Maps from runtime's DataSourceDescriptor (transport field) to prebuild's\n * DataSourceDescriptorEntry (provider field).\n */\nfunction enumerateDataSources(): DataSourceDescriptorEntry[] {\n const scanResult = scanDataSources();\n return scanResult.sources.map((source) => ({\n id: source.id,\n provider: source.transport,\n operations: source.operations,\n }));\n}\n\n/**\n * Main prebuild registration function.\n * Called by @stackwright/scaffold-core at prebuild time.\n *\n * This is safe to call at build time — no running server required,\n * no network calls, no side effects beyond module resolution for data source scanning.\n */\nexport function registerServices(): PrebuildRegistration {\n return {\n pluginId: '@stackwright-services/runtime',\n version: PACKAGE_VERSION,\n triggers: enumerateTriggers(),\n capabilities: enumerateCapabilities(),\n dataSources: enumerateDataSources(),\n registeredAt: new Date().toISOString(),\n };\n}\n","import type { DataSourceDescriptor } from './provider';\n\n/**\n * Result of a prebuild-time data source scan.\n */\nexport interface DataSourceScanResult {\n /** All sources discovered across all installed providers */\n sources: DataSourceDescriptor[];\n /** Which provider packages were found (for logging/diagnostics) */\n detectedProviders: string[];\n}\n\n/**\n * Scan installed packages at prebuild time to discover available data sources.\n *\n * This is called by the compiler and prebuild hook (yo8) to expand the valid\n * `source:` schema surface. If @stackwright-pro/openapi or @stackwright-pro/pulse\n * are installed and expose an adapter registry, their sources are enumerated here.\n *\n * This is a pure filesystem/module-resolution operation — no network, no side effects.\n * It is safe to call at build time (no running server required).\n *\n * Returns an empty sources array if no providers are installed, which causes the\n * compiler to emit a warning (not an error) when a `source:` reference is encountered.\n */\nexport function scanDataSources(): DataSourceScanResult {\n const sources: DataSourceDescriptor[] = [];\n const detectedProviders: string[] = [];\n\n // Try @stackwright-pro/openapi\n try {\n require.resolve('@stackwright-pro/openapi/datasource-adapter');\n detectedProviders.push('@stackwright-pro/openapi');\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('@stackwright-pro/openapi/datasource-adapter') as {\n listDataSources?: () => DataSourceDescriptor[];\n };\n if (typeof mod.listDataSources === 'function') {\n sources.push(...mod.listDataSources());\n }\n } catch (err) {\n console.warn(\n 'stackwright-services:datasource Failed to enumerate @stackwright-pro/openapi sources:',\n err,\n );\n }\n } catch {\n // @stackwright-pro/openapi not installed\n }\n\n // Try @stackwright-pro/pulse\n try {\n require.resolve('@stackwright-pro/pulse/datasource-adapter');\n detectedProviders.push('@stackwright-pro/pulse');\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('@stackwright-pro/pulse/datasource-adapter') as {\n listDataSources?: () => DataSourceDescriptor[];\n };\n if (typeof mod.listDataSources === 'function') {\n sources.push(...mod.listDataSources());\n }\n } catch (err) {\n console.warn(\n 'stackwright-services:datasource Failed to enumerate @stackwright-pro/pulse sources:',\n err,\n );\n }\n } catch {\n // @stackwright-pro/pulse not installed\n }\n\n return { sources, detectedProviders };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stackwright-services/runtime",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"registry": "https://registry.npmjs.org/",
|
|
6
|
+
"access": "restricted"
|
|
7
|
+
},
|
|
8
|
+
"description": "Runtime layer for Stackwright Services — Hono HTTP, trigger adapters, observability",
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"module": "./dist/index.mjs",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.mjs",
|
|
16
|
+
"require": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./prebuild": {
|
|
19
|
+
"types": "./dist/prebuild/index.d.ts",
|
|
20
|
+
"import": "./dist/prebuild/index.mjs",
|
|
21
|
+
"require": "./dist/prebuild/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"hono": "^4",
|
|
29
|
+
"zod": "^3.24",
|
|
30
|
+
"@stackwright-services/capabilities": "0.0.1",
|
|
31
|
+
"@stackwright-services/types": "0.0.1"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@aws-sdk/client-sns": "^3.0.0",
|
|
35
|
+
"@aws-sdk/client-sqs": "^3.0.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependenciesMeta": {
|
|
38
|
+
"@aws-sdk/client-sns": {
|
|
39
|
+
"optional": true
|
|
40
|
+
},
|
|
41
|
+
"@aws-sdk/client-sqs": {
|
|
42
|
+
"optional": true
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@aws-sdk/client-sns": "^3.0.0",
|
|
47
|
+
"@aws-sdk/client-sqs": "^3.0.0",
|
|
48
|
+
"@types/node": "^25.9.1",
|
|
49
|
+
"tsup": "^8",
|
|
50
|
+
"typescript": "^6",
|
|
51
|
+
"vitest": "^4"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=22"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsup",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:watch": "vitest",
|
|
60
|
+
"lint": "eslint src/",
|
|
61
|
+
"clean": "rm -rf dist .turbo",
|
|
62
|
+
"test:coverage": "vitest run --coverage"
|
|
63
|
+
}
|
|
64
|
+
}
|