sporades 0.1.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.
Files changed (112) hide show
  1. package/Dockerfile.base +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +289 -0
  4. package/bin/sporades-host-helper.js +4001 -0
  5. package/bin/sporades.js +14198 -0
  6. package/dist/base-image.d.ts +43 -0
  7. package/dist/base-image.d.ts.map +1 -0
  8. package/dist/base-image.js +53 -0
  9. package/dist/base-image.js.map +1 -0
  10. package/dist/bundle-pipeline.d.ts +110 -0
  11. package/dist/bundle-pipeline.d.ts.map +1 -0
  12. package/dist/bundle-pipeline.js +369 -0
  13. package/dist/bundle-pipeline.js.map +1 -0
  14. package/dist/capsule-services.d.ts +94 -0
  15. package/dist/capsule-services.d.ts.map +1 -0
  16. package/dist/capsule-services.js +310 -0
  17. package/dist/capsule-services.js.map +1 -0
  18. package/dist/cli/cli-help.d.ts +16 -0
  19. package/dist/cli/cli-help.d.ts.map +1 -0
  20. package/dist/cli/cli-help.js +202 -0
  21. package/dist/cli/cli-help.js.map +1 -0
  22. package/dist/cli/cli-support.d.ts +17 -0
  23. package/dist/cli/cli-support.d.ts.map +1 -0
  24. package/dist/cli/cli-support.js +46 -0
  25. package/dist/cli/cli-support.js.map +1 -0
  26. package/dist/cli/github-autodeploy-workflow.d.ts +7 -0
  27. package/dist/cli/github-autodeploy-workflow.d.ts.map +1 -0
  28. package/dist/cli/github-autodeploy-workflow.js +185 -0
  29. package/dist/cli/github-autodeploy-workflow.js.map +1 -0
  30. package/dist/cli/host-helper-archive.d.ts +9 -0
  31. package/dist/cli/host-helper-archive.d.ts.map +1 -0
  32. package/dist/cli/host-helper-archive.js +74 -0
  33. package/dist/cli/host-helper-archive.js.map +1 -0
  34. package/dist/cli/host-helper-config.d.ts +15 -0
  35. package/dist/cli/host-helper-config.d.ts.map +1 -0
  36. package/dist/cli/host-helper-config.js +111 -0
  37. package/dist/cli/host-helper-config.js.map +1 -0
  38. package/dist/cli/host-helper-contract.d.ts +5 -0
  39. package/dist/cli/host-helper-contract.d.ts.map +1 -0
  40. package/dist/cli/host-helper-contract.js +5 -0
  41. package/dist/cli/host-helper-contract.js.map +1 -0
  42. package/dist/cli/host-helper-docker-types.d.ts +27 -0
  43. package/dist/cli/host-helper-docker-types.d.ts.map +1 -0
  44. package/dist/cli/host-helper-docker-types.js +2 -0
  45. package/dist/cli/host-helper-docker-types.js.map +1 -0
  46. package/dist/cli/host-helper-json.d.ts +6 -0
  47. package/dist/cli/host-helper-json.d.ts.map +1 -0
  48. package/dist/cli/host-helper-json.js +2 -0
  49. package/dist/cli/host-helper-json.js.map +1 -0
  50. package/dist/cli/host-helper-release-files.d.ts +4 -0
  51. package/dist/cli/host-helper-release-files.d.ts.map +1 -0
  52. package/dist/cli/host-helper-release-files.js +21 -0
  53. package/dist/cli/host-helper-release-files.js.map +1 -0
  54. package/dist/cli/host-helper-requests.d.ts +163 -0
  55. package/dist/cli/host-helper-requests.d.ts.map +1 -0
  56. package/dist/cli/host-helper-requests.js +2 -0
  57. package/dist/cli/host-helper-requests.js.map +1 -0
  58. package/dist/cli/host-helper-validation.d.ts +27 -0
  59. package/dist/cli/host-helper-validation.d.ts.map +1 -0
  60. package/dist/cli/host-helper-validation.js +256 -0
  61. package/dist/cli/host-helper-validation.js.map +1 -0
  62. package/dist/cli/host-request-builders.d.ts +143 -0
  63. package/dist/cli/host-request-builders.d.ts.map +1 -0
  64. package/dist/cli/host-request-builders.js +266 -0
  65. package/dist/cli/host-request-builders.js.map +1 -0
  66. package/dist/cli/hosted-capsule-contract.d.ts +128 -0
  67. package/dist/cli/hosted-capsule-contract.d.ts.map +1 -0
  68. package/dist/cli/hosted-capsule-contract.js +2 -0
  69. package/dist/cli/hosted-capsule-contract.js.map +1 -0
  70. package/dist/cli/sporades-host-helper.d.ts +3 -0
  71. package/dist/cli/sporades-host-helper.d.ts.map +1 -0
  72. package/dist/cli/sporades-host-helper.js +3120 -0
  73. package/dist/cli/sporades-host-helper.js.map +1 -0
  74. package/dist/cli/sporades.d.ts +3 -0
  75. package/dist/cli/sporades.d.ts.map +1 -0
  76. package/dist/cli/sporades.js +4066 -0
  77. package/dist/cli/sporades.js.map +1 -0
  78. package/dist/client.d.ts +7 -0
  79. package/dist/client.d.ts.map +1 -0
  80. package/dist/client.js +9 -0
  81. package/dist/client.js.map +1 -0
  82. package/dist/runtime-restart-policy.d.ts +29 -0
  83. package/dist/runtime-restart-policy.d.ts.map +1 -0
  84. package/dist/runtime-restart-policy.js +53 -0
  85. package/dist/runtime-restart-policy.js.map +1 -0
  86. package/dist/sealed-server-env.d.ts +56 -0
  87. package/dist/sealed-server-env.d.ts.map +1 -0
  88. package/dist/sealed-server-env.js +170 -0
  89. package/dist/sealed-server-env.js.map +1 -0
  90. package/dist/server-runtime-source.d.ts +1262 -0
  91. package/dist/server-runtime-source.d.ts.map +1 -0
  92. package/dist/server-runtime-source.js +6397 -0
  93. package/dist/server-runtime-source.js.map +1 -0
  94. package/dist/server.d.ts +58 -0
  95. package/dist/server.d.ts.map +1 -0
  96. package/dist/server.js +183 -0
  97. package/dist/server.js.map +1 -0
  98. package/dist/templates/client-runtime-template.d.ts +2 -0
  99. package/dist/templates/client-runtime-template.d.ts.map +1 -0
  100. package/dist/templates/client-runtime-template.js +438 -0
  101. package/dist/templates/client-runtime-template.js.map +1 -0
  102. package/dist/templates/scaffold-template.d.ts +19 -0
  103. package/dist/templates/scaffold-template.d.ts.map +1 -0
  104. package/dist/templates/scaffold-template.js +1201 -0
  105. package/dist/templates/scaffold-template.js.map +1 -0
  106. package/dist/templates/server-bundle-template.d.ts +8 -0
  107. package/dist/templates/server-bundle-template.d.ts.map +1 -0
  108. package/dist/templates/server-bundle-template.js +162 -0
  109. package/dist/templates/server-bundle-template.js.map +1 -0
  110. package/package.json +44 -0
  111. package/src/types/client.d.ts +161 -0
  112. package/src/types/server.d.ts +300 -0
@@ -0,0 +1,43 @@
1
+ export declare const SPORADES_BASE_IMAGE: {
2
+ name: string;
3
+ image: string;
4
+ version: string;
5
+ runtimeUser: string;
6
+ runtimeUid: number;
7
+ runtimeGid: number;
8
+ updatePolicy: {
9
+ defaultMode: string;
10
+ modes: string[];
11
+ autoPatchSupported: boolean;
12
+ autoPatchUnsupportedReason: string;
13
+ };
14
+ };
15
+ export declare function baseImageRuntimeUser(): string;
16
+ export declare function normaliseBaseImageUpdatePolicy(value: string | {
17
+ mode: string;
18
+ }): string;
19
+ export declare function baseImageUpdatePolicy(mode?: string): {
20
+ mode: string;
21
+ autoPatch: {
22
+ supported: boolean;
23
+ reason: string;
24
+ };
25
+ };
26
+ export declare function baseImageMetadata(updatePolicyMode?: string): {
27
+ name: string;
28
+ image: string;
29
+ version: string;
30
+ updatePolicy: {
31
+ mode: string;
32
+ autoPatch: {
33
+ supported: boolean;
34
+ reason: string;
35
+ };
36
+ };
37
+ };
38
+ export declare function baseImageLabels(updatePolicyMode?: string): {
39
+ "com.sporades.base-image.name": string;
40
+ "com.sporades.base-image.version": string;
41
+ "com.sporades.base-image.update-policy": string;
42
+ };
43
+ //# sourceMappingURL=base-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-image.d.ts","sourceRoot":"","sources":["../src/base-image.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CAa/B,CAAC;AAEF,wBAAgB,oBAAoB,WAEnC;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,UAW5E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,SAA+C;;;;;;EAQxF;AAED,wBAAgB,iBAAiB,CAAC,gBAAgB,SAA+C;;;;;;;;;;;EAOhG;AAED,wBAAgB,eAAe,CAAC,gBAAgB,SAA+C;;;;EAM9F"}
@@ -0,0 +1,53 @@
1
+ export const SPORADES_BASE_IMAGE = {
2
+ name: "sporades-base",
3
+ image: "ghcr.io/sporades/sporades-base:0.1.0-node22-alpine",
4
+ version: "0.1.0-node22-alpine",
5
+ runtimeUser: "sporades",
6
+ runtimeUid: 10001,
7
+ runtimeGid: 10001,
8
+ updatePolicy: {
9
+ defaultMode: "host-managed",
10
+ modes: ["host-managed", "auto-patch", "manual"],
11
+ autoPatchSupported: false,
12
+ autoPatchUnsupportedReason: "Base image updates are applied by replacing containers, not mutating them in place.",
13
+ },
14
+ };
15
+ export function baseImageRuntimeUser() {
16
+ return `${SPORADES_BASE_IMAGE.runtimeUid}:${SPORADES_BASE_IMAGE.runtimeGid}`;
17
+ }
18
+ export function normaliseBaseImageUpdatePolicy(value) {
19
+ const mode = typeof value === "string"
20
+ ? value
21
+ : typeof value?.mode === "string"
22
+ ? value.mode
23
+ : SPORADES_BASE_IMAGE.updatePolicy.defaultMode;
24
+ if (!SPORADES_BASE_IMAGE.updatePolicy.modes.includes(mode)) {
25
+ return SPORADES_BASE_IMAGE.updatePolicy.defaultMode;
26
+ }
27
+ return mode;
28
+ }
29
+ export function baseImageUpdatePolicy(mode = SPORADES_BASE_IMAGE.updatePolicy.defaultMode) {
30
+ return {
31
+ mode: normaliseBaseImageUpdatePolicy(mode),
32
+ autoPatch: {
33
+ supported: SPORADES_BASE_IMAGE.updatePolicy.autoPatchSupported,
34
+ reason: SPORADES_BASE_IMAGE.updatePolicy.autoPatchUnsupportedReason,
35
+ },
36
+ };
37
+ }
38
+ export function baseImageMetadata(updatePolicyMode = SPORADES_BASE_IMAGE.updatePolicy.defaultMode) {
39
+ return {
40
+ name: SPORADES_BASE_IMAGE.name,
41
+ image: SPORADES_BASE_IMAGE.image,
42
+ version: SPORADES_BASE_IMAGE.version,
43
+ updatePolicy: baseImageUpdatePolicy(updatePolicyMode),
44
+ };
45
+ }
46
+ export function baseImageLabels(updatePolicyMode = SPORADES_BASE_IMAGE.updatePolicy.defaultMode) {
47
+ return {
48
+ "com.sporades.base-image.name": SPORADES_BASE_IMAGE.name,
49
+ "com.sporades.base-image.version": SPORADES_BASE_IMAGE.version,
50
+ "com.sporades.base-image.update-policy": normaliseBaseImageUpdatePolicy(updatePolicyMode),
51
+ };
52
+ }
53
+ //# sourceMappingURL=base-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-image.js","sourceRoot":"","sources":["../src/base-image.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,oDAAoD;IAC3D,OAAO,EAAE,qBAAqB;IAC9B,WAAW,EAAE,UAAU;IACvB,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,KAAK;IACjB,YAAY,EAAE;QACZ,WAAW,EAAE,cAAc;QAC3B,KAAK,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC;QAC/C,kBAAkB,EAAE,KAAK;QACzB,0BAA0B,EAAE,qFAAqF;KAClH;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB;IAClC,OAAO,GAAG,mBAAmB,CAAC,UAAU,IAAI,mBAAmB,CAAC,UAAU,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAA8B;IAC3E,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ;YAC/B,CAAC,CAAC,KAAK,CAAC,IAAI;YACZ,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,WAAW,CAAC;IACrD,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,OAAO,mBAAmB,CAAC,YAAY,CAAC,WAAW,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAI,GAAG,mBAAmB,CAAC,YAAY,CAAC,WAAW;IACvF,OAAO;QACL,IAAI,EAAE,8BAA8B,CAAC,IAAI,CAAC;QAC1C,SAAS,EAAE;YACT,SAAS,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB;YAC9D,MAAM,EAAE,mBAAmB,CAAC,YAAY,CAAC,0BAA0B;SACpE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,YAAY,CAAC,WAAW;IAC/F,OAAO;QACL,IAAI,EAAE,mBAAmB,CAAC,IAAI;QAC9B,KAAK,EAAE,mBAAmB,CAAC,KAAK;QAChC,OAAO,EAAE,mBAAmB,CAAC,OAAO;QACpC,YAAY,EAAE,qBAAqB,CAAC,gBAAgB,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,YAAY,CAAC,WAAW;IAC7F,OAAO;QACL,8BAA8B,EAAE,mBAAmB,CAAC,IAAI;QACxD,iCAAiC,EAAE,mBAAmB,CAAC,OAAO;QAC9D,uCAAuC,EAAE,8BAA8B,CAAC,gBAAgB,CAAC;KAC1F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,110 @@
1
+ import type { PathLike } from "node:fs";
2
+ import type { FileHandle } from "node:fs/promises";
3
+ export type JsonRecord = Record<string, unknown>;
4
+ export type ServerEnv = Record<string, string>;
5
+ export type ServerEnvFile = {
6
+ exists: boolean;
7
+ raw: string;
8
+ };
9
+ export type ProjectConfig = JsonRecord & {
10
+ auth?: AuthConfig;
11
+ client?: {
12
+ framework?: unknown;
13
+ };
14
+ };
15
+ export type AuthConfig = JsonRecord & {
16
+ mode?: unknown;
17
+ providers?: unknown;
18
+ google?: unknown;
19
+ };
20
+ export type NormalizedProviderConfig = {
21
+ enabled: boolean;
22
+ clientIdEnv: string | null;
23
+ clientSecretEnv: string | null;
24
+ };
25
+ export type NormalizedAuthConfig = {
26
+ mode: string;
27
+ providers: {
28
+ anonymous: {
29
+ enabled: boolean;
30
+ };
31
+ google: NormalizedProviderConfig;
32
+ email: {
33
+ enabled: boolean;
34
+ };
35
+ };
36
+ };
37
+ export type FrameworkBundleConfig = {
38
+ jsxImportSource: string;
39
+ jsxRuntimeImport: string;
40
+ };
41
+ export declare function createBundle(projectDir: string, config: ProjectConfig): Promise<{
42
+ paths: {
43
+ config: string;
44
+ serverEntry: string;
45
+ clientEntry: string;
46
+ indexHtml: string;
47
+ serverEnv: string;
48
+ serverBundle: string;
49
+ clientBundle: string;
50
+ };
51
+ buildDir: string;
52
+ serverRuntime: {
53
+ source: string;
54
+ env: Record<string, string>;
55
+ capsuleModuleSource: string;
56
+ };
57
+ staticFiles: {
58
+ indexHtml: string;
59
+ clientBundle: string;
60
+ };
61
+ containerMounts: {
62
+ files: {
63
+ host: string;
64
+ container: string;
65
+ mode: string;
66
+ }[];
67
+ serverEnv: {
68
+ host: string;
69
+ container: string;
70
+ mode: string;
71
+ } | null;
72
+ sealedServerEnv: {
73
+ envelope: {
74
+ host: string;
75
+ container: string;
76
+ mode: string;
77
+ };
78
+ privateKey: {
79
+ host: string;
80
+ container: string;
81
+ mode: string;
82
+ };
83
+ } | null;
84
+ };
85
+ }>;
86
+ export declare function readServerEnvFile(envPath: PathLike | FileHandle): Promise<ServerEnvFile>;
87
+ export declare function parseServerEnv(envFile: ServerEnvFile): ServerEnv;
88
+ export declare function authStatus(config: ProjectConfig, serverEnv: ServerEnv): {
89
+ mode: string;
90
+ providers: {
91
+ anonymous: {
92
+ enabled: boolean;
93
+ };
94
+ google: {
95
+ enabled: boolean;
96
+ configured: boolean;
97
+ clientIdEnv: string | null;
98
+ clientSecretEnv: string | null;
99
+ };
100
+ email?: {
101
+ enabled: boolean;
102
+ };
103
+ };
104
+ google: {
105
+ configured: boolean;
106
+ clientIdEnv: string | null;
107
+ clientSecretEnv: string | null;
108
+ };
109
+ };
110
+ //# sourceMappingURL=bundle-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-pipeline.d.ts","sourceRoot":"","sources":["../src/bundle-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG;IACvC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAClC,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACT,SAAS,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC;QAChC,MAAM,EAAE,wBAAwB,CAAC;QACjC,KAAK,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC;KAC7B,CAAC;CACH,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAcF,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiF3E;AA4CD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAa9F;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CAwBhE;AAYD,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS;;;mBAMvD;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE;gBACvB;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,UAAU,EAAE,OAAO,CAAC;YAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE;gBACrG;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE;;;;;;;EA0B/B"}
@@ -0,0 +1,369 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readKeyPair, readSealedServerEnv, sealedServerEnvPaths, unsealServerEnv } from "./sealed-server-env.js";
4
+ import { serverRuntimeModuleSource } from "./server.js";
5
+ import { createClientRuntimeSource } from "./templates/client-runtime-template.js";
6
+ import { createServerBundleSource } from "./templates/server-bundle-template.js";
7
+ const FRAMEWORK_BUNDLE_CONFIG = {
8
+ react: {
9
+ jsxImportSource: "react",
10
+ jsxRuntimeImport: "react/jsx-runtime",
11
+ },
12
+ preact: {
13
+ jsxImportSource: "preact",
14
+ jsxRuntimeImport: "preact/jsx-runtime",
15
+ },
16
+ };
17
+ const SUPPORTED_AUTH_PROVIDERS = new Set(["anonymous", "google", "email"]);
18
+ export async function createBundle(projectDir, config) {
19
+ const frameworkBundleConfig = readFrameworkBundleConfig(config.client?.framework ?? "react");
20
+ const buildDir = path.join(projectDir, ".sporades", "build");
21
+ await mkdir(buildDir, { recursive: true });
22
+ const paths = {
23
+ config: path.join(projectDir, "sporades.json"),
24
+ serverEntry: path.join(projectDir, "server", "index.ts"),
25
+ clientEntry: path.join(projectDir, "client", "index.tsx"),
26
+ indexHtml: path.join(projectDir, "index.html"),
27
+ serverEnv: path.join(projectDir, ".env.sporades.server"),
28
+ serverBundle: path.join(buildDir, "server.mjs"),
29
+ clientBundle: path.join(buildDir, "client.js"),
30
+ };
31
+ const sealedPaths = sealedServerEnvPaths(projectDir);
32
+ const sealedEnvelope = await readSealedServerEnv(sealedPaths);
33
+ const serverEnvFile = sealedEnvelope ? { exists: false, raw: "" } : await readServerEnvFile(paths.serverEnv);
34
+ const serverEnv = sealedEnvelope
35
+ ? unsealServerEnv(sealedEnvelope, (await readRequiredSealedPrivateKey(sealedPaths)).privateKey)
36
+ : parseServerEnv(serverEnvFile);
37
+ validateAuthConfig(config, serverEnv);
38
+ const [serverSource, clientSource] = await Promise.all([
39
+ readRequiredFile(paths.serverEntry, "Missing capsule entry: server/index.ts", "Run `sporades create` to scaffold a new project."),
40
+ readRequiredFile(paths.clientEntry, "Missing client entry: client/index.tsx", "Run `sporades create` to scaffold a new project."),
41
+ readRequiredFile(paths.indexHtml, "Missing HTML shell: index.html", "Restore index.html or run `sporades create`."),
42
+ ]);
43
+ const serverCapsuleModule = await bundleServerCapsuleModule({
44
+ serverSource,
45
+ serverSourcePath: paths.serverEntry,
46
+ });
47
+ const clientBundle = await bundleClientSource(clientSource, {
48
+ clientSourcePath: paths.clientEntry,
49
+ frameworkBundleConfig,
50
+ });
51
+ await Promise.all([
52
+ writeFile(paths.serverBundle, createServerBundleSource({
53
+ config,
54
+ serverEnv: sealedEnvelope ? {} : serverEnv,
55
+ sealedServerEnv: sealedEnvelope ? { enabled: true } : { enabled: false },
56
+ serverSource,
57
+ serverModuleSource: serverCapsuleModule,
58
+ })),
59
+ writeFile(paths.clientBundle, clientBundle),
60
+ ]);
61
+ return {
62
+ paths,
63
+ buildDir,
64
+ serverRuntime: {
65
+ source: serverSource,
66
+ env: serverEnv,
67
+ capsuleModuleSource: serverCapsuleModule,
68
+ },
69
+ staticFiles: {
70
+ indexHtml: paths.indexHtml,
71
+ clientBundle: paths.clientBundle,
72
+ },
73
+ containerMounts: {
74
+ files: [
75
+ { host: paths.serverBundle, container: "/app/server.mjs", mode: "ro" },
76
+ { host: paths.clientBundle, container: "/app/client.js", mode: "ro" },
77
+ { host: paths.indexHtml, container: "/app/index.html", mode: "ro" },
78
+ { host: paths.config, container: "/app/sporades.json", mode: "ro" },
79
+ ],
80
+ serverEnv: serverEnvFile.exists
81
+ ? { host: paths.serverEnv, container: "/app/.env.sporades.server", mode: "ro" }
82
+ : null,
83
+ sealedServerEnv: sealedEnvelope
84
+ ? {
85
+ envelope: { host: sealedPaths.envelope, container: "/app/.sporades/sealed-server-env/server-env.sealed.json", mode: "ro" },
86
+ privateKey: { host: sealedPaths.privateKey, container: "/app/.sporades/sealed-server-env/server-env.private.pem", mode: "ro" },
87
+ }
88
+ : null,
89
+ },
90
+ };
91
+ }
92
+ async function readRequiredSealedPrivateKey(paths) {
93
+ const keyPair = await readKeyPair(paths);
94
+ if (!keyPair) {
95
+ throw commandError("Sealed Server env private key is missing.", "Restore .sporades/sealed-server-env/server-env.private.pem or re-import the Server env values.");
96
+ }
97
+ return keyPair;
98
+ }
99
+ async function bundleServerCapsuleModule(options) {
100
+ const { build } = await import("esbuild");
101
+ try {
102
+ const result = await build({
103
+ bundle: true,
104
+ format: "esm",
105
+ platform: "node",
106
+ write: false,
107
+ logLevel: "silent",
108
+ sourcemap: "inline",
109
+ stdin: {
110
+ contents: options.serverSource,
111
+ sourcefile: options.serverSourcePath,
112
+ resolveDir: path.dirname(options.serverSourcePath),
113
+ loader: "ts",
114
+ },
115
+ plugins: [sporadesServerPlugin()],
116
+ });
117
+ const output = result.outputFiles?.[0];
118
+ if (!output) {
119
+ throw commandError("Server bundle failed: esbuild returned no output.", "Fix server/index.ts and save again.");
120
+ }
121
+ return output.text;
122
+ }
123
+ catch (error) {
124
+ const message = bundleErrorMessage(error);
125
+ throw commandError(`Server bundle failed: ${message}`, "Fix server/index.ts and save again.");
126
+ }
127
+ }
128
+ export async function readServerEnvFile(envPath) {
129
+ try {
130
+ const raw = await readFile(envPath, "utf8");
131
+ if (Buffer.byteLength(raw, "utf8") > 64 * 1024) {
132
+ throw commandError("Invalid server env file.", ".env.sporades.server must be 64KB or smaller.");
133
+ }
134
+ return { exists: true, raw };
135
+ }
136
+ catch (error) {
137
+ if (errorDetails(error).code === "ENOENT") {
138
+ return { exists: false, raw: "" };
139
+ }
140
+ throw error;
141
+ }
142
+ }
143
+ export function parseServerEnv(envFile) {
144
+ const values = {};
145
+ for (const [index, line] of envFile.raw.split(/\r?\n/).entries()) {
146
+ const trimmed = line.trim();
147
+ if (!trimmed || trimmed.startsWith("#")) {
148
+ continue;
149
+ }
150
+ const equalsIndex = trimmed.indexOf("=");
151
+ if (equalsIndex <= 0) {
152
+ throw commandError("Invalid server env file.", `Fix line ${index + 1} in .env.sporades.server to use KEY=value.`);
153
+ }
154
+ const key = trimmed.slice(0, equalsIndex).trim();
155
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
156
+ throw commandError("Invalid server env file.", `Fix invalid key ${key} in .env.sporades.server.`);
157
+ }
158
+ if (key.startsWith("SPORADES_")) {
159
+ throw commandError("Invalid server env file.", "Remove reserved SPORADES_ keys from .env.sporades.server.");
160
+ }
161
+ values[key] = parseEnvValue(trimmed.slice(equalsIndex + 1).trim());
162
+ }
163
+ if (Object.keys(values).length > 64) {
164
+ throw commandError("Invalid server env file.", ".env.sporades.server can contain at most 64 keys.");
165
+ }
166
+ return values;
167
+ }
168
+ function parseEnvValue(value) {
169
+ if ((value.startsWith('"') && value.endsWith('"')) ||
170
+ (value.startsWith("'") && value.endsWith("'"))) {
171
+ return value.slice(1, -1);
172
+ }
173
+ return value;
174
+ }
175
+ export function authStatus(config, serverEnv) {
176
+ const authConfig = config.auth ?? { mode: "anonymous" };
177
+ const normalized = normalizeAuthConfig(authConfig);
178
+ const clientIdEnv = normalized.providers.google.clientIdEnv;
179
+ const clientSecretEnv = normalized.providers.google.clientSecretEnv;
180
+ const providers = {
181
+ anonymous: {
182
+ enabled: normalized.providers.anonymous.enabled,
183
+ },
184
+ google: {
185
+ enabled: normalized.providers.google.enabled,
186
+ configured: Boolean(clientIdEnv && clientSecretEnv && serverEnv[clientIdEnv] && serverEnv[clientSecretEnv]),
187
+ clientIdEnv,
188
+ clientSecretEnv,
189
+ },
190
+ };
191
+ if (normalized.providers.email.enabled) {
192
+ providers.email = {
193
+ enabled: true,
194
+ };
195
+ }
196
+ return {
197
+ mode: normalized.mode,
198
+ providers,
199
+ google: {
200
+ configured: providers.google.configured,
201
+ clientIdEnv,
202
+ clientSecretEnv,
203
+ },
204
+ };
205
+ }
206
+ function normalizeAuthConfig(authConfig) {
207
+ const providerConfig = isRecord(authConfig.providers) ? authConfig.providers : {};
208
+ for (const provider of Object.keys(providerConfig)) {
209
+ if (!SUPPORTED_AUTH_PROVIDERS.has(provider)) {
210
+ throw commandError(`Unsupported auth provider: ${provider}`, "Use supported auth providers: anonymous, google, email.");
211
+ }
212
+ }
213
+ const googleConfig = readProviderConfig(providerConfig.google);
214
+ const legacyGoogle = readProviderConfig(authConfig.google);
215
+ const googleEnabled = googleConfig.enabled || authConfig.mode === "google";
216
+ const emailConfig = readProviderConfig(providerConfig.email);
217
+ const anonymousConfig = readProviderConfig(providerConfig.anonymous);
218
+ const anonymousEnabled = providerConfig.anonymous === undefined ? true : anonymousConfig.enabled;
219
+ const mode = typeof authConfig.mode === "string" ? authConfig.mode : googleEnabled ? "google" : "anonymous";
220
+ return {
221
+ mode,
222
+ providers: {
223
+ anonymous: {
224
+ enabled: anonymousEnabled,
225
+ },
226
+ google: {
227
+ enabled: googleEnabled,
228
+ clientIdEnv: googleConfig.clientIdEnv ?? legacyGoogle.clientIdEnv,
229
+ clientSecretEnv: googleConfig.clientSecretEnv ?? legacyGoogle.clientSecretEnv,
230
+ },
231
+ email: {
232
+ enabled: emailConfig.enabled,
233
+ },
234
+ },
235
+ };
236
+ }
237
+ function readProviderConfig(config) {
238
+ if (config === true) {
239
+ return { enabled: true, clientIdEnv: null, clientSecretEnv: null };
240
+ }
241
+ if (config === false || config === undefined || config === null) {
242
+ return { enabled: false, clientIdEnv: null, clientSecretEnv: null };
243
+ }
244
+ if (!isRecord(config)) {
245
+ return { enabled: false, clientIdEnv: null, clientSecretEnv: null };
246
+ }
247
+ return {
248
+ enabled: config.enabled !== false,
249
+ clientIdEnv: typeof config.clientIdEnv === "string" ? config.clientIdEnv : null,
250
+ clientSecretEnv: typeof config.clientSecretEnv === "string" ? config.clientSecretEnv : null,
251
+ };
252
+ }
253
+ function validateAuthConfig(config, serverEnv) {
254
+ const status = authStatus(config, serverEnv);
255
+ if (!status.providers.google.enabled) {
256
+ return;
257
+ }
258
+ if (!status.google.configured) {
259
+ throw commandError("Google OAuth is not fully configured.", "Run `sporades auth set google --client-id <id> --client-secret <secret>` or `sporades auth set google --client-json <path>`.");
260
+ }
261
+ }
262
+ async function readRequiredFile(filePath, message, hint) {
263
+ try {
264
+ return await readFile(filePath, "utf8");
265
+ }
266
+ catch (error) {
267
+ if (errorDetails(error).code === "ENOENT") {
268
+ throw commandError(message, hint);
269
+ }
270
+ throw error;
271
+ }
272
+ }
273
+ function readFrameworkBundleConfig(framework) {
274
+ if (typeof framework !== "string" || !(framework in FRAMEWORK_BUNDLE_CONFIG)) {
275
+ throw commandError(`Unsupported framework: ${framework}`, "Use one of: react, preact.");
276
+ }
277
+ return FRAMEWORK_BUNDLE_CONFIG[framework];
278
+ }
279
+ async function bundleClientSource(clientSource, options) {
280
+ const { build } = await import("esbuild");
281
+ try {
282
+ const result = await build({
283
+ bundle: true,
284
+ format: "esm",
285
+ platform: "browser",
286
+ write: false,
287
+ logLevel: "silent",
288
+ sourcemap: "inline",
289
+ jsx: "automatic",
290
+ jsxImportSource: options.frameworkBundleConfig.jsxImportSource,
291
+ stdin: {
292
+ contents: clientSource,
293
+ sourcefile: options.clientSourcePath,
294
+ resolveDir: path.dirname(options.clientSourcePath),
295
+ loader: "tsx",
296
+ },
297
+ plugins: [sporadesClientPlugin()],
298
+ });
299
+ const output = result.outputFiles?.[0];
300
+ if (!output) {
301
+ throw commandError("Client bundle failed: esbuild returned no output.", "Fix client/index.tsx and save again.");
302
+ }
303
+ return [
304
+ "// Sporades client bundle",
305
+ `// JSX import source: ${options.frameworkBundleConfig.jsxImportSource}`,
306
+ `// JSX runtime import: ${options.frameworkBundleConfig.jsxRuntimeImport}`,
307
+ 'console.log("Sporades client bundle loaded");',
308
+ "",
309
+ output.text,
310
+ ].join("\n");
311
+ }
312
+ catch (error) {
313
+ const message = bundleErrorMessage(error);
314
+ throw commandError(`Client bundle failed: ${message}`, "Fix client/index.tsx and save again.");
315
+ }
316
+ }
317
+ function sporadesClientPlugin() {
318
+ return {
319
+ name: "sporades-client",
320
+ setup(build) {
321
+ build.onResolve({ filter: /^sporades\/client$/ }, () => ({
322
+ path: "sporades/client",
323
+ namespace: "sporades-runtime",
324
+ }));
325
+ build.onLoad({ filter: /^sporades\/client$/, namespace: "sporades-runtime" }, () => ({
326
+ loader: "js",
327
+ contents: createClientRuntimeSource(),
328
+ }));
329
+ },
330
+ };
331
+ }
332
+ function sporadesServerPlugin() {
333
+ return {
334
+ name: "sporades-server",
335
+ setup(build) {
336
+ build.onResolve({ filter: /^sporades\/server$/ }, () => ({
337
+ path: "sporades/server",
338
+ namespace: "sporades-runtime",
339
+ }));
340
+ build.onLoad({ filter: /^sporades\/server$/, namespace: "sporades-runtime" }, async () => ({
341
+ loader: "js",
342
+ contents: serverRuntimeModuleSource(),
343
+ }));
344
+ },
345
+ };
346
+ }
347
+ function isRecord(value) {
348
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
349
+ }
350
+ function errorDetails(error) {
351
+ if (error === null || error === undefined) {
352
+ return {};
353
+ }
354
+ return typeof error === "object" ? error : { message: String(error) };
355
+ }
356
+ function bundleErrorMessage(error) {
357
+ const details = errorDetails(error);
358
+ const firstError = Array.isArray(details.errors) ? details.errors[0] : null;
359
+ if (isRecord(firstError) && typeof firstError.text === "string") {
360
+ return firstError.text;
361
+ }
362
+ return typeof details.message === "string" ? details.message : "unknown error";
363
+ }
364
+ function commandError(message, hint) {
365
+ const error = new Error(message);
366
+ error.hint = hint;
367
+ return error;
368
+ }
369
+ //# sourceMappingURL=bundle-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-pipeline.js","sourceRoot":"","sources":["../src/bundle-pipeline.ts"],"names":[],"mappings":"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"}