@ankhorage/infra 0.0.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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/adapters/minikube/auth/index.d.ts +7 -0
  4. package/dist/adapters/minikube/auth/index.d.ts.map +1 -0
  5. package/dist/adapters/minikube/auth/index.js +14 -0
  6. package/dist/adapters/minikube/auth/index.js.map +1 -0
  7. package/dist/adapters/minikube/auth/supabase/index.d.ts +7 -0
  8. package/dist/adapters/minikube/auth/supabase/index.d.ts.map +1 -0
  9. package/dist/adapters/minikube/auth/supabase/index.js +213 -0
  10. package/dist/adapters/minikube/auth/supabase/index.js.map +1 -0
  11. package/dist/adapters/minikube/authz/cerbos/index.d.ts +9 -0
  12. package/dist/adapters/minikube/authz/cerbos/index.d.ts.map +1 -0
  13. package/dist/adapters/minikube/authz/cerbos/index.js +360 -0
  14. package/dist/adapters/minikube/authz/cerbos/index.js.map +1 -0
  15. package/dist/adapters/minikube/authz/index.d.ts +9 -0
  16. package/dist/adapters/minikube/authz/index.d.ts.map +1 -0
  17. package/dist/adapters/minikube/authz/index.js +23 -0
  18. package/dist/adapters/minikube/authz/index.js.map +1 -0
  19. package/dist/adapters/minikube/base/index.d.ts +9 -0
  20. package/dist/adapters/minikube/base/index.d.ts.map +1 -0
  21. package/dist/adapters/minikube/base/index.js +1371 -0
  22. package/dist/adapters/minikube/base/index.js.map +1 -0
  23. package/dist/adapters/minikube/contracts.d.ts +9 -0
  24. package/dist/adapters/minikube/contracts.d.ts.map +1 -0
  25. package/dist/adapters/minikube/contracts.js +9 -0
  26. package/dist/adapters/minikube/contracts.js.map +1 -0
  27. package/dist/adapters/minikube/index.d.ts +3 -0
  28. package/dist/adapters/minikube/index.d.ts.map +1 -0
  29. package/dist/adapters/minikube/index.js +114 -0
  30. package/dist/adapters/minikube/index.js.map +1 -0
  31. package/dist/adapters/minikube/storage/index.d.ts +7 -0
  32. package/dist/adapters/minikube/storage/index.d.ts.map +1 -0
  33. package/dist/adapters/minikube/storage/index.js +77 -0
  34. package/dist/adapters/minikube/storage/index.js.map +1 -0
  35. package/dist/adapters/minikube/storage/supabase/index.d.ts +7 -0
  36. package/dist/adapters/minikube/storage/supabase/index.d.ts.map +1 -0
  37. package/dist/adapters/minikube/storage/supabase/index.js +81 -0
  38. package/dist/adapters/minikube/storage/supabase/index.js.map +1 -0
  39. package/dist/datasets.d.ts +11 -0
  40. package/dist/datasets.d.ts.map +1 -0
  41. package/dist/datasets.js +397 -0
  42. package/dist/datasets.js.map +1 -0
  43. package/dist/index.d.ts +7 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +15 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/types.d.ts +70 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +86 -0
  52. package/src/adapters/minikube/README.md +73 -0
  53. package/src/adapters/minikube/auth/index.ts +23 -0
  54. package/src/adapters/minikube/auth/supabase/index.ts +269 -0
  55. package/src/adapters/minikube/authz/cerbos/index.ts +458 -0
  56. package/src/adapters/minikube/authz/index.ts +32 -0
  57. package/src/adapters/minikube/base/index.test.ts +103 -0
  58. package/src/adapters/minikube/base/index.ts +1478 -0
  59. package/src/adapters/minikube/contracts.ts +17 -0
  60. package/src/adapters/minikube/index.ts +149 -0
  61. package/src/adapters/minikube/storage/index.ts +91 -0
  62. package/src/adapters/minikube/storage/supabase/index.ts +112 -0
  63. package/src/datasets.test.ts +178 -0
  64. package/src/datasets.ts +562 -0
  65. package/src/index.test.ts +679 -0
  66. package/src/index.ts +43 -0
  67. package/src/minikubeImageLifecycle.test.ts +34 -0
  68. package/src/types.ts +82 -0
package/src/index.ts ADDED
@@ -0,0 +1,43 @@
1
+ import { generateMinikubeInfra } from './adapters/minikube';
2
+ import type {
3
+ InfraGenerationInput,
4
+ InfraManifestInput,
5
+ InfrastructureGenerationOptions,
6
+ InfrastructureGenerationResult,
7
+ } from './types';
8
+
9
+ export type { DatasetInfrastructureArtifacts } from './datasets';
10
+ export { generateDatasetInfrastructureArtifacts } from './datasets';
11
+ export type {
12
+ GeneratedFile,
13
+ GeneratedInfrastructureFile,
14
+ GeneratedPackageDependency,
15
+ InfraDiagnostic,
16
+ InfraGenerationInput,
17
+ InfraGenerationOptions,
18
+ InfraGenerationResult,
19
+ InfraManifestInput,
20
+ InfrastructureGenerationMeta,
21
+ InfrastructureGenerationOptions,
22
+ InfrastructureGenerationResult,
23
+ PackageDependency,
24
+ } from './types';
25
+
26
+ export function generateInfra(input: InfraGenerationInput): InfrastructureGenerationResult {
27
+ return generateInfrastructure(input.manifest, input.options ?? {});
28
+ }
29
+
30
+ export function generateInfrastructure(
31
+ manifest: InfraManifestInput,
32
+ options: InfrastructureGenerationOptions = {},
33
+ ): InfrastructureGenerationResult {
34
+ if (!manifest.deployment) {
35
+ throw new Error('Deployment configuration is missing.');
36
+ }
37
+
38
+ if (manifest.deployment.target !== 'minikube') {
39
+ throw new Error(`Unsupported deployment target: ${manifest.deployment.target}`);
40
+ }
41
+
42
+ return generateMinikubeInfra(manifest, options);
43
+ }
@@ -0,0 +1,34 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+
3
+ import { generateInfrastructure } from './index';
4
+ import type { InfraManifestInput } from './types';
5
+
6
+ describe('minikube generated app image lifecycle', () => {
7
+ test('exposes generated cleanup flags and Docker image labels', () => {
8
+ const manifest: InfraManifestInput = {
9
+ deployment: {
10
+ target: 'minikube',
11
+ monitoring: false,
12
+ },
13
+ plugins: [],
14
+ };
15
+
16
+ const result = generateInfrastructure(manifest, { namespaceHint: 'shop' });
17
+
18
+ const envExample = result.files.find((file) => file.path === 'infra/minikube/.env.example');
19
+ expect(envExample?.content).toContain('APP_IMAGE=ankh/shop:dev');
20
+ expect(envExample?.content).toContain('APP_IMAGE_CLEANUP_ON_DOWN=true');
21
+ expect(envExample?.content).toContain('APP_IMAGE_CLEANUP_MINIKUBE=true');
22
+ expect(envExample?.content).toContain('APP_IMAGE_CLEANUP_DOCKER=true');
23
+
24
+ const appBuildScript = result.files.find(
25
+ (file) => file.path === 'infra/minikube/scripts/build-app-image.sh',
26
+ );
27
+ expect(appBuildScript?.content).toContain('docker build');
28
+ expect(appBuildScript?.content).toContain('--label "ankhorage.kind=generated-app"');
29
+ expect(appBuildScript?.content).toContain('--label "ankhorage.namespace=${NAMESPACE}"');
30
+ expect(appBuildScript?.content).toContain('--label "ankhorage.image=${APP_IMAGE}"');
31
+ expect(appBuildScript?.content).toContain('-t "${APP_IMAGE}"');
32
+ expect(appBuildScript?.content).toContain('-f "${DOCKERFILE_PATH}"');
33
+ });
34
+ });
package/src/types.ts ADDED
@@ -0,0 +1,82 @@
1
+ import type { AppManifest, InfraManifest } from '@ankhorage/contracts';
2
+
3
+ export interface GeneratedInfrastructureFile {
4
+ /**
5
+ * Path relative to the target app root.
6
+ */
7
+ readonly path: string;
8
+ readonly content: string;
9
+ readonly executable?: boolean;
10
+ }
11
+
12
+ export interface GeneratedPackageDependency {
13
+ readonly name: string;
14
+ readonly version: string;
15
+ readonly reason: string;
16
+ }
17
+
18
+ export interface InfrastructureGenerationMeta {
19
+ readonly target: NonNullable<InfraManifest['deployment']>['target'];
20
+ readonly providers: readonly string[];
21
+ }
22
+
23
+ export interface InfrastructureGenerationResult {
24
+ readonly files: readonly GeneratedInfrastructureFile[];
25
+ readonly warnings: readonly string[];
26
+ readonly meta: InfrastructureGenerationMeta;
27
+ readonly dependencies: readonly GeneratedPackageDependency[];
28
+ }
29
+
30
+ export interface InfrastructureGenerationOptions {
31
+ /**
32
+ * Optional namespace hint from caller context, such as app slug or project id.
33
+ */
34
+ readonly namespaceHint?: string;
35
+ /**
36
+ * Optional app-level context used by provider/engine-specific generators.
37
+ */
38
+ readonly appManifest?: Pick<
39
+ AppManifest,
40
+ 'data' | 'metadata' | 'navigator' | 'screens' | 'settings'
41
+ >;
42
+ }
43
+
44
+ export interface InfraGenerationInput {
45
+ /**
46
+ * Infra manifest section from an app manifest.
47
+ */
48
+ readonly manifest: InfraManifestInput;
49
+ /**
50
+ * Optional root used by callers that want to keep output intent alongside generation.
51
+ * The generator itself still returns relative file paths and does not write to disk.
52
+ */
53
+ readonly outputRoot?: string;
54
+ readonly options?: InfrastructureGenerationOptions;
55
+ }
56
+
57
+ export type InfraGenerationOptions = InfrastructureGenerationOptions;
58
+ export type InfraGenerationResult = InfrastructureGenerationResult;
59
+ export type GeneratedFile = GeneratedInfrastructureFile;
60
+ export type PackageDependency = GeneratedPackageDependency;
61
+
62
+ export interface InfraDiagnostic {
63
+ readonly severity: 'warning';
64
+ readonly message: string;
65
+ }
66
+
67
+ type InfraStorageProvider = NonNullable<InfraManifest['storage']>['provider'] | 'supabase';
68
+
69
+ interface InfraStorageSpecInput {
70
+ readonly provider: InfraStorageProvider;
71
+ readonly buckets: readonly string[];
72
+ }
73
+
74
+ /**
75
+ * Infra-local manifest input type.
76
+ *
77
+ * This is intentionally broader than `@ankhorage/contracts` to allow adapters to support
78
+ * additional providers before the shared contracts package officially includes them.
79
+ */
80
+ export type InfraManifestInput = Omit<InfraManifest, 'storage'> & {
81
+ readonly storage?: InfraStorageSpecInput;
82
+ };