@supacloud/compiler 0.15.0 → 0.17.0

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/config.d.ts CHANGED
@@ -1,5 +1,8 @@
1
+ import { type DeliveryOptions } from "./delivery-schema";
1
2
  import type { CommandExecutionCapabilities, CompileOptions, GraphqlOptions, ModuleBoundaryPresetName } from "./types";
2
3
  export interface SupaCloudConfig {
4
+ /** Local delivery configuration; does not authorize deployment. */
5
+ delivery?: DeliveryOptions;
3
6
  /** Opt-in outside app init. Schema is configuration-relative; documents are root-relative. */
4
7
  graphql?: GraphqlOptions | false;
5
8
  root?: string;
@@ -18,7 +21,7 @@ export interface SupaCloudConfig {
18
21
  commandCapabilities?: CommandExecutionCapabilities;
19
22
  treeShakeUnusedProviders?: boolean;
20
23
  }
21
- export declare const DEFAULT_SUPACLOUD_CONFIG: Required<Omit<SupaCloudConfig, "include" | "moduleBoundaryPreset" | "commandCapabilities" | "moduleBoundaries" | "typeSafety" | "allowRouteCommandBindings" | "disallowControllerDirectDb" | "detectOrphanModules">> & {
24
+ export declare const DEFAULT_SUPACLOUD_CONFIG: Required<Omit<SupaCloudConfig, "include" | "moduleBoundaryPreset" | "commandCapabilities" | "moduleBoundaries" | "typeSafety" | "delivery" | "allowRouteCommandBindings" | "disallowControllerDirectDb" | "detectOrphanModules">> & {
22
25
  include: string[];
23
26
  moduleBoundaryPreset: ModuleBoundaryPresetName;
24
27
  };
@@ -0,0 +1,184 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ export declare const DeliveryObjectSchema: import("@sinclair/typebox").TObject<{
3
+ name: import("@sinclair/typebox").TString;
4
+ objectId: import("@sinclair/typebox").TString;
5
+ inputDigest: import("@sinclair/typebox").TString;
6
+ entrypoint: import("@sinclair/typebox").TLiteral<"bundle/index.js">;
7
+ entryKind: import("@sinclair/typebox").TLiteral<"compiled-module-factory">;
8
+ runtimeImports: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
9
+ files: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
10
+ path: import("@sinclair/typebox").TString;
11
+ sha256: import("@sinclair/typebox").TString;
12
+ bytes: import("@sinclair/typebox").TInteger;
13
+ }>>;
14
+ }>;
15
+ export declare const DeliveryBuildManifestSchema: import("@sinclair/typebox").TObject<{
16
+ schemaVersion: import("@sinclair/typebox").TLiteral<1>;
17
+ producer: import("@sinclair/typebox").TLiteral<"@supacloud/compiler/delivery-build-v1">;
18
+ deploymentReady: import("@sinclair/typebox").TLiteral<false>;
19
+ plan: import("@sinclair/typebox").TObject<{
20
+ schemaVersion: import("@sinclair/typebox").TLiteral<1>;
21
+ policyVersion: import("@sinclair/typebox").TLiteral<"module-workload-v1">;
22
+ digestScope: import("@sinclair/typebox").TLiteral<"topology-only">;
23
+ topologyDigest: import("@sinclair/typebox").TString;
24
+ deploymentReady: import("@sinclair/typebox").TLiteral<false>;
25
+ targets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
26
+ name: import("@sinclair/typebox").TString;
27
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api">, import("@sinclair/typebox").TLiteral<"jobs">, import("@sinclair/typebox").TLiteral<"webhook">]>;
28
+ isolation: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shared">, import("@sinclair/typebox").TLiteral<"process">]>;
29
+ roots: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
30
+ modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
31
+ name: import("@sinclair/typebox").TString;
32
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"owner">, import("@sinclair/typebox").TLiteral<"dependency">]>;
33
+ importedBy: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
34
+ }>>;
35
+ routes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
36
+ module: import("@sinclair/typebox").TString;
37
+ controller: import("@sinclair/typebox").TString;
38
+ handler: import("@sinclair/typebox").TString;
39
+ method: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"GET">, import("@sinclair/typebox").TLiteral<"POST">, import("@sinclair/typebox").TLiteral<"PUT">, import("@sinclair/typebox").TLiteral<"PATCH">, import("@sinclair/typebox").TLiteral<"DELETE">, import("@sinclair/typebox").TLiteral<"HEAD">, import("@sinclair/typebox").TLiteral<"OPTIONS">]>;
40
+ path: import("@sinclair/typebox").TString;
41
+ command: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
42
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"default-http">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
43
+ }>>;
44
+ jobs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
45
+ module: import("@sinclair/typebox").TString;
46
+ name: import("@sinclair/typebox").TString;
47
+ className: import("@sinclair/typebox").TString;
48
+ serviceKey: import("@sinclair/typebox").TString;
49
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"declared-job">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
50
+ }>>;
51
+ externalTokens: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
52
+ requirements: import("@sinclair/typebox").TObject<{
53
+ processIsolation: import("@sinclair/typebox").TBoolean;
54
+ durableQueue: import("@sinclair/typebox").TBoolean;
55
+ capabilities: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
56
+ }>;
57
+ runtimeStatus: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"unchecked">, import("@sinclair/typebox").TLiteral<"declared-compatible">]>;
58
+ }>>;
59
+ }>;
60
+ objects: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
61
+ name: import("@sinclair/typebox").TString;
62
+ objectId: import("@sinclair/typebox").TString;
63
+ inputDigest: import("@sinclair/typebox").TString;
64
+ entrypoint: import("@sinclair/typebox").TLiteral<"bundle/index.js">;
65
+ entryKind: import("@sinclair/typebox").TLiteral<"compiled-module-factory">;
66
+ runtimeImports: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
67
+ files: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
68
+ path: import("@sinclair/typebox").TString;
69
+ sha256: import("@sinclair/typebox").TString;
70
+ bytes: import("@sinclair/typebox").TInteger;
71
+ }>>;
72
+ }>>;
73
+ routes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
74
+ method: import("@sinclair/typebox").TString;
75
+ path: import("@sinclair/typebox").TString;
76
+ target: import("@sinclair/typebox").TString;
77
+ }>>;
78
+ jobs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
79
+ name: import("@sinclair/typebox").TString;
80
+ target: import("@sinclair/typebox").TString;
81
+ }>>;
82
+ }>;
83
+ export declare const DeliveryBuildResultSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
84
+ ok: import("@sinclair/typebox").TLiteral<true>;
85
+ manifest: import("@sinclair/typebox").TObject<{
86
+ schemaVersion: import("@sinclair/typebox").TLiteral<1>;
87
+ producer: import("@sinclair/typebox").TLiteral<"@supacloud/compiler/delivery-build-v1">;
88
+ deploymentReady: import("@sinclair/typebox").TLiteral<false>;
89
+ plan: import("@sinclair/typebox").TObject<{
90
+ schemaVersion: import("@sinclair/typebox").TLiteral<1>;
91
+ policyVersion: import("@sinclair/typebox").TLiteral<"module-workload-v1">;
92
+ digestScope: import("@sinclair/typebox").TLiteral<"topology-only">;
93
+ topologyDigest: import("@sinclair/typebox").TString;
94
+ deploymentReady: import("@sinclair/typebox").TLiteral<false>;
95
+ targets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
96
+ name: import("@sinclair/typebox").TString;
97
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api">, import("@sinclair/typebox").TLiteral<"jobs">, import("@sinclair/typebox").TLiteral<"webhook">]>;
98
+ isolation: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shared">, import("@sinclair/typebox").TLiteral<"process">]>;
99
+ roots: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
100
+ modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
101
+ name: import("@sinclair/typebox").TString;
102
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"owner">, import("@sinclair/typebox").TLiteral<"dependency">]>;
103
+ importedBy: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
104
+ }>>;
105
+ routes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
106
+ module: import("@sinclair/typebox").TString;
107
+ controller: import("@sinclair/typebox").TString;
108
+ handler: import("@sinclair/typebox").TString;
109
+ method: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"GET">, import("@sinclair/typebox").TLiteral<"POST">, import("@sinclair/typebox").TLiteral<"PUT">, import("@sinclair/typebox").TLiteral<"PATCH">, import("@sinclair/typebox").TLiteral<"DELETE">, import("@sinclair/typebox").TLiteral<"HEAD">, import("@sinclair/typebox").TLiteral<"OPTIONS">]>;
110
+ path: import("@sinclair/typebox").TString;
111
+ command: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
112
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"default-http">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
113
+ }>>;
114
+ jobs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
115
+ module: import("@sinclair/typebox").TString;
116
+ name: import("@sinclair/typebox").TString;
117
+ className: import("@sinclair/typebox").TString;
118
+ serviceKey: import("@sinclair/typebox").TString;
119
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"declared-job">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
120
+ }>>;
121
+ externalTokens: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
122
+ requirements: import("@sinclair/typebox").TObject<{
123
+ processIsolation: import("@sinclair/typebox").TBoolean;
124
+ durableQueue: import("@sinclair/typebox").TBoolean;
125
+ capabilities: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
126
+ }>;
127
+ runtimeStatus: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"unchecked">, import("@sinclair/typebox").TLiteral<"declared-compatible">]>;
128
+ }>>;
129
+ }>;
130
+ objects: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
131
+ name: import("@sinclair/typebox").TString;
132
+ objectId: import("@sinclair/typebox").TString;
133
+ inputDigest: import("@sinclair/typebox").TString;
134
+ entrypoint: import("@sinclair/typebox").TLiteral<"bundle/index.js">;
135
+ entryKind: import("@sinclair/typebox").TLiteral<"compiled-module-factory">;
136
+ runtimeImports: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
137
+ files: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
138
+ path: import("@sinclair/typebox").TString;
139
+ sha256: import("@sinclair/typebox").TString;
140
+ bytes: import("@sinclair/typebox").TInteger;
141
+ }>>;
142
+ }>>;
143
+ routes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
144
+ method: import("@sinclair/typebox").TString;
145
+ path: import("@sinclair/typebox").TString;
146
+ target: import("@sinclair/typebox").TString;
147
+ }>>;
148
+ jobs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
149
+ name: import("@sinclair/typebox").TString;
150
+ target: import("@sinclair/typebox").TString;
151
+ }>>;
152
+ }>;
153
+ changedTargets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
154
+ unchangedTargets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
155
+ removedTargets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
156
+ diagnostics: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
157
+ severity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"error">, import("@sinclair/typebox").TLiteral<"warn">]>;
158
+ code: import("@sinclair/typebox").TString;
159
+ message: import("@sinclair/typebox").TString;
160
+ suggestion: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
161
+ file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
162
+ line: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
163
+ }>>;
164
+ written: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
165
+ bundledTargets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
166
+ }>, import("@sinclair/typebox").TObject<{
167
+ written: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
168
+ ok: import("@sinclair/typebox").TLiteral<false>;
169
+ manifest: import("@sinclair/typebox").TNull;
170
+ diagnostics: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
171
+ severity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"error">, import("@sinclair/typebox").TLiteral<"warn">]>;
172
+ code: import("@sinclair/typebox").TString;
173
+ message: import("@sinclair/typebox").TString;
174
+ suggestion: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
175
+ file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
176
+ line: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
177
+ }>>;
178
+ bundledTargets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
179
+ }>]>;
180
+ export type DeliveryObject = Static<typeof DeliveryObjectSchema>;
181
+ export type DeliveryBuildManifest = Static<typeof DeliveryBuildManifestSchema>;
182
+ export type DeliveryBuildResult = Static<typeof DeliveryBuildResultSchema>;
183
+ export declare function parseDeliveryBuildManifest(value: unknown): DeliveryBuildManifest;
184
+ export declare function parseDeliveryBuildResult(value: unknown): DeliveryBuildResult;
@@ -0,0 +1,4 @@
1
+ import { type DeliveryBuildResult } from "./delivery-build-schema";
2
+ import type { CompileOptions } from "./types";
3
+ /** Build local, independently importable factories. Never activates remote Functions. */
4
+ export declare function buildDeliveryProject(options: CompileOptions, delivery?: unknown): Promise<DeliveryBuildResult>;
@@ -0,0 +1,7 @@
1
+ import type { DeliveryOptions } from "./delivery-schema";
2
+ export interface BundledDeliveryTarget {
3
+ files: Map<string, Uint8Array>;
4
+ inputs: Map<string, string>;
5
+ runtimeImports: string[];
6
+ }
7
+ export declare function bundleDeliveryTarget(name: string, code: string, project: string, generatedDirectory: string, options: DeliveryOptions): Promise<BundledDeliveryTarget>;
@@ -0,0 +1,17 @@
1
+ import type { DeliveryObject } from "./delivery-build-schema";
2
+ export declare const digest: (value: string | Uint8Array) => string;
3
+ export declare function canonical(value: unknown): string;
4
+ export declare function inside(parent: string, path: string): boolean;
5
+ export declare function exists(path: string): Promise<boolean>;
6
+ /** The anchor must already be canonical; reject links in every descendant component. */
7
+ export declare function noLinks(anchor: string, path: string): Promise<void>;
8
+ export declare function readOwned(anchor: string, path: string): Promise<Uint8Array>;
9
+ export declare function reserveOutput(project: string, requested: string): Promise<{
10
+ path: string;
11
+ release(): Promise<void>;
12
+ }>;
13
+ export declare function writeArtifact(root: string, path: string, content: string | Uint8Array): Promise<void>;
14
+ export declare function artifactInventory(root: string): Promise<DeliveryObject["files"]>;
15
+ /** Snapshot application sources before graph analysis, excluding generated output. */
16
+ export declare function sourceInventory(root: string, output: string): Promise<Map<string, string>>;
17
+ export declare function publishPointer(root: string, content: string): Promise<boolean>;
@@ -0,0 +1,7 @@
1
+ import { type DeliveryPlanResult } from "./delivery-schema";
2
+ import type { ApplicationGraph, CompileOptions } from "./types";
3
+ /** Trusted compiler graph in, validated topology preview out. No file or remote writes. */
4
+ export declare function createDeliveryPlan(graph: ApplicationGraph, input?: unknown): DeliveryPlanResult;
5
+ /** Reuse all compiler gates without requiring generated files to already exist. */
6
+ export declare function planDeliveryProject(options: CompileOptions, delivery?: unknown): Promise<DeliveryPlanResult>;
7
+ export declare function formatDeliveryPlan(result: DeliveryPlanResult): string;
@@ -0,0 +1,5 @@
1
+ import type { ApplicationGraph } from "./types";
2
+ import type { DeliveryTarget } from "./delivery-schema";
3
+ import { type GenerateOptions } from "./generate";
4
+ /** Keep conservative service factories while restricting exposed route/job descriptors. */
5
+ export declare function renderDeliveryTarget(graph: ApplicationGraph, target: DeliveryTarget, options: GenerateOptions): import("./generate").RenderedArtifacts;
@@ -0,0 +1,186 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ export declare const DeliveryFilePathSchema: import("@sinclair/typebox").TString;
3
+ export declare const DeliveryOptionsSchema: import("@sinclair/typebox").TObject<{
4
+ version: import("@sinclair/typebox").TLiteral<1>;
5
+ targets: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
6
+ name: import("@sinclair/typebox").TString;
7
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api">, import("@sinclair/typebox").TLiteral<"jobs">, import("@sinclair/typebox").TLiteral<"webhook">]>;
8
+ modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
9
+ isolation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shared">, import("@sinclair/typebox").TLiteral<"process">]>>;
10
+ capabilities: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
11
+ }>>>;
12
+ runtime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
13
+ processIsolation: import("@sinclair/typebox").TBoolean;
14
+ durableQueue: import("@sinclair/typebox").TBoolean;
15
+ capabilities: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
16
+ }>>;
17
+ build: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
18
+ minify: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
19
+ environmentContract: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
+ assets: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
21
+ target: import("@sinclair/typebox").TString;
22
+ source: import("@sinclair/typebox").TString;
23
+ path: import("@sinclair/typebox").TString;
24
+ }>>>;
25
+ }>>;
26
+ }>;
27
+ export type DeliveryOptions = Static<typeof DeliveryOptionsSchema>;
28
+ export declare const DeliveryDiagnosticSchema: import("@sinclair/typebox").TObject<{
29
+ severity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"error">, import("@sinclair/typebox").TLiteral<"warn">]>;
30
+ code: import("@sinclair/typebox").TString;
31
+ message: import("@sinclair/typebox").TString;
32
+ suggestion: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
33
+ file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
34
+ line: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
35
+ }>;
36
+ export declare const DeliveryTargetSchema: import("@sinclair/typebox").TObject<{
37
+ name: import("@sinclair/typebox").TString;
38
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api">, import("@sinclair/typebox").TLiteral<"jobs">, import("@sinclair/typebox").TLiteral<"webhook">]>;
39
+ isolation: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shared">, import("@sinclair/typebox").TLiteral<"process">]>;
40
+ roots: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
41
+ modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
42
+ name: import("@sinclair/typebox").TString;
43
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"owner">, import("@sinclair/typebox").TLiteral<"dependency">]>;
44
+ importedBy: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
45
+ }>>;
46
+ routes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
47
+ module: import("@sinclair/typebox").TString;
48
+ controller: import("@sinclair/typebox").TString;
49
+ handler: import("@sinclair/typebox").TString;
50
+ method: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"GET">, import("@sinclair/typebox").TLiteral<"POST">, import("@sinclair/typebox").TLiteral<"PUT">, import("@sinclair/typebox").TLiteral<"PATCH">, import("@sinclair/typebox").TLiteral<"DELETE">, import("@sinclair/typebox").TLiteral<"HEAD">, import("@sinclair/typebox").TLiteral<"OPTIONS">]>;
51
+ path: import("@sinclair/typebox").TString;
52
+ command: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
53
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"default-http">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
54
+ }>>;
55
+ jobs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
56
+ module: import("@sinclair/typebox").TString;
57
+ name: import("@sinclair/typebox").TString;
58
+ className: import("@sinclair/typebox").TString;
59
+ serviceKey: import("@sinclair/typebox").TString;
60
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"declared-job">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
61
+ }>>;
62
+ externalTokens: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
63
+ requirements: import("@sinclair/typebox").TObject<{
64
+ processIsolation: import("@sinclair/typebox").TBoolean;
65
+ durableQueue: import("@sinclair/typebox").TBoolean;
66
+ capabilities: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
67
+ }>;
68
+ runtimeStatus: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"unchecked">, import("@sinclair/typebox").TLiteral<"declared-compatible">]>;
69
+ }>;
70
+ export declare const DeliveryPlanSchema: import("@sinclair/typebox").TObject<{
71
+ schemaVersion: import("@sinclair/typebox").TLiteral<1>;
72
+ policyVersion: import("@sinclair/typebox").TLiteral<"module-workload-v1">;
73
+ digestScope: import("@sinclair/typebox").TLiteral<"topology-only">;
74
+ topologyDigest: import("@sinclair/typebox").TString;
75
+ deploymentReady: import("@sinclair/typebox").TLiteral<false>;
76
+ targets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
77
+ name: import("@sinclair/typebox").TString;
78
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api">, import("@sinclair/typebox").TLiteral<"jobs">, import("@sinclair/typebox").TLiteral<"webhook">]>;
79
+ isolation: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shared">, import("@sinclair/typebox").TLiteral<"process">]>;
80
+ roots: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
81
+ modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
82
+ name: import("@sinclair/typebox").TString;
83
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"owner">, import("@sinclair/typebox").TLiteral<"dependency">]>;
84
+ importedBy: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
85
+ }>>;
86
+ routes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
87
+ module: import("@sinclair/typebox").TString;
88
+ controller: import("@sinclair/typebox").TString;
89
+ handler: import("@sinclair/typebox").TString;
90
+ method: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"GET">, import("@sinclair/typebox").TLiteral<"POST">, import("@sinclair/typebox").TLiteral<"PUT">, import("@sinclair/typebox").TLiteral<"PATCH">, import("@sinclair/typebox").TLiteral<"DELETE">, import("@sinclair/typebox").TLiteral<"HEAD">, import("@sinclair/typebox").TLiteral<"OPTIONS">]>;
91
+ path: import("@sinclair/typebox").TString;
92
+ command: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
93
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"default-http">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
94
+ }>>;
95
+ jobs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
96
+ module: import("@sinclair/typebox").TString;
97
+ name: import("@sinclair/typebox").TString;
98
+ className: import("@sinclair/typebox").TString;
99
+ serviceKey: import("@sinclair/typebox").TString;
100
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"declared-job">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
101
+ }>>;
102
+ externalTokens: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
103
+ requirements: import("@sinclair/typebox").TObject<{
104
+ processIsolation: import("@sinclair/typebox").TBoolean;
105
+ durableQueue: import("@sinclair/typebox").TBoolean;
106
+ capabilities: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
107
+ }>;
108
+ runtimeStatus: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"unchecked">, import("@sinclair/typebox").TLiteral<"declared-compatible">]>;
109
+ }>>;
110
+ }>;
111
+ export declare const DeliveryPlanResultSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
112
+ ok: import("@sinclair/typebox").TLiteral<true>;
113
+ plan: import("@sinclair/typebox").TObject<{
114
+ schemaVersion: import("@sinclair/typebox").TLiteral<1>;
115
+ policyVersion: import("@sinclair/typebox").TLiteral<"module-workload-v1">;
116
+ digestScope: import("@sinclair/typebox").TLiteral<"topology-only">;
117
+ topologyDigest: import("@sinclair/typebox").TString;
118
+ deploymentReady: import("@sinclair/typebox").TLiteral<false>;
119
+ targets: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
120
+ name: import("@sinclair/typebox").TString;
121
+ kind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"api">, import("@sinclair/typebox").TLiteral<"jobs">, import("@sinclair/typebox").TLiteral<"webhook">]>;
122
+ isolation: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shared">, import("@sinclair/typebox").TLiteral<"process">]>;
123
+ roots: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
124
+ modules: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
125
+ name: import("@sinclair/typebox").TString;
126
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"owner">, import("@sinclair/typebox").TLiteral<"dependency">]>;
127
+ importedBy: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
128
+ }>>;
129
+ routes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
130
+ module: import("@sinclair/typebox").TString;
131
+ controller: import("@sinclair/typebox").TString;
132
+ handler: import("@sinclair/typebox").TString;
133
+ method: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"GET">, import("@sinclair/typebox").TLiteral<"POST">, import("@sinclair/typebox").TLiteral<"PUT">, import("@sinclair/typebox").TLiteral<"PATCH">, import("@sinclair/typebox").TLiteral<"DELETE">, import("@sinclair/typebox").TLiteral<"HEAD">, import("@sinclair/typebox").TLiteral<"OPTIONS">]>;
134
+ path: import("@sinclair/typebox").TString;
135
+ command: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
136
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"default-http">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
137
+ }>>;
138
+ jobs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
139
+ module: import("@sinclair/typebox").TString;
140
+ name: import("@sinclair/typebox").TString;
141
+ className: import("@sinclair/typebox").TString;
142
+ serviceKey: import("@sinclair/typebox").TString;
143
+ reason: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"declared-job">, import("@sinclair/typebox").TLiteral<"explicit-module">]>;
144
+ }>>;
145
+ externalTokens: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
146
+ requirements: import("@sinclair/typebox").TObject<{
147
+ processIsolation: import("@sinclair/typebox").TBoolean;
148
+ durableQueue: import("@sinclair/typebox").TBoolean;
149
+ capabilities: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
150
+ }>;
151
+ runtimeStatus: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"unchecked">, import("@sinclair/typebox").TLiteral<"declared-compatible">]>;
152
+ }>>;
153
+ }>;
154
+ diagnostics: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
155
+ severity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"error">, import("@sinclair/typebox").TLiteral<"warn">]>;
156
+ code: import("@sinclair/typebox").TString;
157
+ message: import("@sinclair/typebox").TString;
158
+ suggestion: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
159
+ file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
160
+ line: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
161
+ }>>;
162
+ written: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
163
+ }>, import("@sinclair/typebox").TObject<{
164
+ ok: import("@sinclair/typebox").TLiteral<false>;
165
+ plan: import("@sinclair/typebox").TNull;
166
+ diagnostics: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
167
+ severity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"error">, import("@sinclair/typebox").TLiteral<"warn">]>;
168
+ code: import("@sinclair/typebox").TString;
169
+ message: import("@sinclair/typebox").TString;
170
+ suggestion: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
171
+ file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
172
+ line: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
173
+ }>>;
174
+ written: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
175
+ }>]>;
176
+ export type DeliveryTarget = Static<typeof DeliveryTargetSchema>;
177
+ export type DeliveryPlan = Static<typeof DeliveryPlanSchema>;
178
+ export type DeliveryDiagnostic = Static<typeof DeliveryDiagnosticSchema>;
179
+ export type DeliveryPlanResult = Static<typeof DeliveryPlanResultSchema>;
180
+ export declare class DeliveryConfigurationError extends Error {
181
+ readonly code = "delivery-config-invalid";
182
+ constructor();
183
+ }
184
+ export declare function parseDeliveryOptions(value: unknown): DeliveryOptions;
185
+ /** Validate plans received from files/messages before using their typed contract. */
186
+ export declare function parseDeliveryPlanResult(value: unknown): DeliveryPlanResult;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Bad fixture: circular dependency (CYCLE_A <-> CYCLE_B), scope violation (application depends on
3
+ * request provider), provider reference from unimported module, duplicate token,
4
+ * command missing permission, dependency cannot be statically resolved.
5
+ * marker:xxx comments are used by tests to locate diagnostic line numbers.
6
+ */
7
+ export declare const BAD_PROJECT_FILES: Record<string, string>;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Valid three-layer module fixture:
3
+ * - tokens.ts: DB_CLIENT (platform injection), AUDIT_CONFIG, LOGGER, AUDIT_SERVICE,
4
+ * CASE_REPOSITORY, CASE_SERVICE
5
+ * - audit module: value provider + factory provider + class provider, exports AUDIT_SERVICE
6
+ * - case module: imports audit; CaseRepository class provider, CaseService deps
7
+ * [CASE_REPOSITORY, AUDIT_SERVICE], CASE_SERVICE existing alias, AcceptCaseCommand
8
+ * with full @Command metadata, CaseController @Controller("/cases") + @Post with schema,
9
+ * constructor depends on CASE_REPOSITORY and REQUEST_CONTEXT (request scope)
10
+ * - health module: defineModule format
11
+ */
12
+ export declare const GOOD_PROJECT_FILES: Record<string, string>;
@@ -0,0 +1,5 @@
1
+ export declare function requireValue<T>(value: T | undefined): T;
2
+ /** Writes fixture files map to directory (auto-creates parent directories). */
3
+ export declare function writeFixtureProject(rootDir: string, files: Record<string, string>): Promise<void>;
4
+ /** 1-based line number containing marker in source, used to assert diagnostic positions. */
5
+ export declare function lineOf(source: string, marker: string): number;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Local stand-in for @supacloud/app in fixture projects: noop implementations of decorators and tokens.
3
+ * AST analysis matches decorators by name only and generated code does not import it;
4
+ * implementation exists only so fixture sources can be dynamically imported and executed by bun.
5
+ */
6
+ export declare const RUNTIME_SOURCE = "export class InjectionToken<T = unknown> {\n readonly name: string;\n readonly scope?: string;\n\n constructor(name: string, options: { scope?: string } = {}) {\n this.name = name;\n this.scope = options.scope;\n }\n}\n\nexport function Injectable(_options: { scope?: string; deps?: unknown[] } = {}) {\n return () => {};\n}\n\nexport function Inject(_token: unknown) {\n return () => {};\n}\n\nexport function Module(_options: Record<string, unknown>) {\n return () => {};\n}\n\nexport function defineModule(_options: Record<string, unknown>) {\n return class DefinedModule {};\n}\n\nexport function Command(_options: Record<string, unknown>) {\n return () => {};\n}\n\nexport function Job(_options: Record<string, unknown>) {\n return () => {};\n}\n\nexport function Query(_options: Record<string, unknown>) {\n return () => {};\n}\n\nexport function Controller(_path: string) {\n return () => {};\n}\n\nfunction routeDecorator(_method: string) {\n return (_path: string, _options?: Record<string, unknown>) => () => {};\n}\n\nexport const Get = routeDecorator(\"GET\");\nexport const Post = routeDecorator(\"POST\");\nexport const Put = routeDecorator(\"PUT\");\nexport const Patch = routeDecorator(\"PATCH\");\nexport const Delete = routeDecorator(\"DELETE\");\nexport const Head = routeDecorator(\"HEAD\");\nexport const Options = routeDecorator(\"OPTIONS\");\n\nexport const REQUEST_CONTEXT = new InjectionToken(\"supacloud.request-context\", {\n scope: \"request\",\n});\nexport const JOB_CONTEXT = new InjectionToken(\"supacloud.job-context\", {\n scope: \"job\",\n});\n";
7
+ export declare const FIXTURE_TSCONFIG = "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"experimentalDecorators\": true,\n \"strict\": true\n }\n}\n";
package/dist/index.d.ts CHANGED
@@ -1,4 +1,10 @@
1
1
  export { analyzeProject } from "./analyze";
2
+ export { createDeliveryPlan, planDeliveryProject, formatDeliveryPlan } from "./delivery-plan";
3
+ export { buildDeliveryProject } from "./delivery-build";
4
+ export { DeliveryBuildManifestSchema, DeliveryBuildResultSchema, parseDeliveryBuildManifest, parseDeliveryBuildResult } from "./delivery-build-schema";
5
+ export type { DeliveryBuildManifest, DeliveryBuildResult, DeliveryObject } from "./delivery-build-schema";
6
+ export { DeliveryOptionsSchema, DeliveryPlanSchema, DeliveryPlanResultSchema, DeliveryTargetSchema, DeliveryConfigurationError, parseDeliveryOptions, parseDeliveryPlanResult, } from "./delivery-schema";
7
+ export type { DeliveryOptions, DeliveryPlan, DeliveryPlanResult, DeliveryTarget, DeliveryDiagnostic } from "./delivery-schema";
2
8
  export { generateFeatureSource, validateFeatureSpec } from "./feature";
3
9
  export { applyDiagnosticFix } from "./fixes";
4
10
  export type { AppliedDiagnosticFix, ApplyDiagnosticFixOptions } from "./fixes";