@dromio/product 0.1.49

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 (86) hide show
  1. package/LICENSE +201 -0
  2. package/dist/architectureCheck.d.ts +11 -0
  3. package/dist/architectureCheck.d.ts.map +1 -0
  4. package/dist/architectureCheck.js +269 -0
  5. package/dist/architectureCheck.js.map +1 -0
  6. package/dist/architectureCheckTypes.d.ts +23 -0
  7. package/dist/architectureCheckTypes.d.ts.map +1 -0
  8. package/dist/architectureCheckTypes.js +50 -0
  9. package/dist/architectureCheckTypes.js.map +1 -0
  10. package/dist/architectureEffectCheck.d.ts +4 -0
  11. package/dist/architectureEffectCheck.d.ts.map +1 -0
  12. package/dist/architectureEffectCheck.js +106 -0
  13. package/dist/architectureEffectCheck.js.map +1 -0
  14. package/dist/authoring.d.ts +55 -0
  15. package/dist/authoring.d.ts.map +1 -0
  16. package/dist/authoring.js +308 -0
  17. package/dist/authoring.js.map +1 -0
  18. package/dist/authoringArchitectureTemplates.d.ts +5 -0
  19. package/dist/authoringArchitectureTemplates.d.ts.map +1 -0
  20. package/dist/authoringArchitectureTemplates.js +169 -0
  21. package/dist/authoringArchitectureTemplates.js.map +1 -0
  22. package/dist/authoringManifestTemplates.d.ts +4 -0
  23. package/dist/authoringManifestTemplates.d.ts.map +1 -0
  24. package/dist/authoringManifestTemplates.js +77 -0
  25. package/dist/authoringManifestTemplates.js.map +1 -0
  26. package/dist/authoringPackageJson.d.ts +3 -0
  27. package/dist/authoringPackageJson.d.ts.map +1 -0
  28. package/dist/authoringPackageJson.js +69 -0
  29. package/dist/authoringPackageJson.js.map +1 -0
  30. package/dist/authoringTemplates.d.ts +9 -0
  31. package/dist/authoringTemplates.d.ts.map +1 -0
  32. package/dist/authoringTemplates.js +142 -0
  33. package/dist/authoringTemplates.js.map +1 -0
  34. package/dist/authoringWorkflowTemplates.d.ts +13 -0
  35. package/dist/authoringWorkflowTemplates.d.ts.map +1 -0
  36. package/dist/authoringWorkflowTemplates.js +282 -0
  37. package/dist/authoringWorkflowTemplates.js.map +1 -0
  38. package/dist/build.d.ts +12 -0
  39. package/dist/build.d.ts.map +1 -0
  40. package/dist/build.js +119 -0
  41. package/dist/build.js.map +1 -0
  42. package/dist/check.d.ts +16 -0
  43. package/dist/check.d.ts.map +1 -0
  44. package/dist/check.js +172 -0
  45. package/dist/check.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +93 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/deploymentProfile.d.ts +19 -0
  51. package/dist/deploymentProfile.d.ts.map +1 -0
  52. package/dist/deploymentProfile.js +72 -0
  53. package/dist/deploymentProfile.js.map +1 -0
  54. package/dist/emitFromDefinition.d.ts +14 -0
  55. package/dist/emitFromDefinition.d.ts.map +1 -0
  56. package/dist/emitFromDefinition.js +87 -0
  57. package/dist/emitFromDefinition.js.map +1 -0
  58. package/dist/files.d.ts +13 -0
  59. package/dist/files.d.ts.map +1 -0
  60. package/dist/files.js +77 -0
  61. package/dist/files.js.map +1 -0
  62. package/dist/forbiddenImports.d.ts +7 -0
  63. package/dist/forbiddenImports.d.ts.map +1 -0
  64. package/dist/forbiddenImports.js +31 -0
  65. package/dist/forbiddenImports.js.map +1 -0
  66. package/dist/index.d.ts +11 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +9 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/manifest.d.ts +14 -0
  71. package/dist/manifest.d.ts.map +1 -0
  72. package/dist/manifest.js +49 -0
  73. package/dist/manifest.js.map +1 -0
  74. package/dist/publish.d.ts +29 -0
  75. package/dist/publish.d.ts.map +1 -0
  76. package/dist/publish.js +40 -0
  77. package/dist/publish.js.map +1 -0
  78. package/dist/publishPlan.d.ts +62 -0
  79. package/dist/publishPlan.d.ts.map +1 -0
  80. package/dist/publishPlan.js +204 -0
  81. package/dist/publishPlan.js.map +1 -0
  82. package/dist/schemas.d.ts +141 -0
  83. package/dist/schemas.d.ts.map +1 -0
  84. package/dist/schemas.js +154 -0
  85. package/dist/schemas.js.map +1 -0
  86. package/package.json +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env bun
2
+ import { readFileSync } from "node:fs";
3
+ import { buildDromioProduct } from "./build.js";
4
+ import { checkDromioProduct } from "./check.js";
5
+ const packageVersion = readPackageVersion();
6
+ async function main(argv) {
7
+ const [command, ...rest] = argv;
8
+ if (!command || command === "help" || command === "--help") {
9
+ printHelp();
10
+ return;
11
+ }
12
+ if (command === "version" || command === "--version") {
13
+ console.log(packageVersion);
14
+ return;
15
+ }
16
+ const options = parseOptions(rest);
17
+ if (command === "check") {
18
+ const result = await checkDromioProduct(options);
19
+ console.log(`Dromio product ok: ${result.product.id} / ${result.environment.id}`);
20
+ console.log(`Entrypoints: ${result.entrypointCount}`);
21
+ console.log(`Fixtures: ${result.fixtureCount}`);
22
+ console.log(`Source files: ${result.sourceFileCount}`);
23
+ console.log(`Architecture: ${result.architecture.mode} / effect ${result.architecture.effectMode}`);
24
+ if (result.architecture.findings.length > 0) {
25
+ console.log(`Architecture warnings: ${result.architecture.findings.length}`);
26
+ for (const finding of result.architecture.findings) {
27
+ const path = finding.path ? `${finding.path}: ` : "";
28
+ console.log(`- [${finding.checkId}] ${path}${finding.message}`);
29
+ console.log(` Suggested fix: ${finding.suggestion}`);
30
+ }
31
+ }
32
+ return;
33
+ }
34
+ if (command === "build") {
35
+ const result = await buildDromioProduct(options);
36
+ console.log(`Dromio product bundle: ${result.bundlePath}`);
37
+ console.log(`Product: ${result.bundleManifest.product.id}`);
38
+ console.log(`Environment: ${result.bundleManifest.environment.id}`);
39
+ return;
40
+ }
41
+ throw new Error(`Unknown dromio-product command: ${command}`);
42
+ }
43
+ function readPackageVersion() {
44
+ const manifest = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
45
+ if (typeof manifest.version !== "string" || manifest.version.length === 0) {
46
+ throw new Error("@dromio/product package.json is missing its version.");
47
+ }
48
+ return manifest.version;
49
+ }
50
+ function parseOptions(args) {
51
+ const options = {};
52
+ for (let index = 0; index < args.length; index += 1) {
53
+ const arg = args[index];
54
+ if (arg === "--env") {
55
+ options.env = readOptionValue(args, ++index, arg);
56
+ continue;
57
+ }
58
+ if (arg === "--out-dir") {
59
+ options.outDir = readOptionValue(args, ++index, arg);
60
+ continue;
61
+ }
62
+ if (arg === "--product-root") {
63
+ options.productRoot = readOptionValue(args, ++index, arg);
64
+ continue;
65
+ }
66
+ throw new Error(`Unknown option: ${arg}`);
67
+ }
68
+ return options;
69
+ }
70
+ function readOptionValue(args, index, flag) {
71
+ const value = args[index];
72
+ if (!value) {
73
+ throw new Error(`${flag} requires a value`);
74
+ }
75
+ return value;
76
+ }
77
+ function printHelp() {
78
+ console.log(`usage:
79
+ dromio-product check [--env dev] [--product-root <path>]
80
+ dromio-product build [--env dev] [--product-root <path>] [--out-dir <path>]
81
+
82
+ commands:
83
+ help Show help
84
+ version Show installed version
85
+ check Validate product manifest, env manifest, entries, fixtures, imports
86
+ build Build .dromio.tgz product bundle
87
+ `);
88
+ }
89
+ main(process.argv.slice(2)).catch((error) => {
90
+ console.error(error instanceof Error ? error.message : String(error));
91
+ process.exitCode = 1;
92
+ });
93
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const dromioDeploymentProfileValues: readonly ["public"];
2
+ export type DromioDeploymentProfile = (typeof dromioDeploymentProfileValues)[number];
3
+ export type DromioDeploymentExposure = "public";
4
+ export interface DromioDeploymentProfileConfig {
5
+ readonly exposure: DromioDeploymentExposure;
6
+ readonly gitBaseUrl: string;
7
+ readonly platformBaseUrl: string;
8
+ readonly profile: DromioDeploymentProfile;
9
+ readonly registryBaseUrl: string;
10
+ readonly runtimeBaseUrl: string;
11
+ }
12
+ export interface ResolveDromioDeploymentProfileOptions {
13
+ readonly env?: Record<string, string | undefined>;
14
+ readonly profile?: string;
15
+ }
16
+ export declare function resolveDromioDeploymentProfile(options?: ResolveDromioDeploymentProfileOptions): DromioDeploymentProfileConfig;
17
+ export declare function formatDromioDeploymentProfileEnv(config: DromioDeploymentProfileConfig): string;
18
+ export declare function formatDromioNpmrc(config: Pick<DromioDeploymentProfileConfig, "registryBaseUrl">, tokenEnvName?: string): string;
19
+ //# sourceMappingURL=deploymentProfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploymentProfile.d.ts","sourceRoot":"","sources":["../src/deploymentProfile.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,6BAA6B,qBAAsB,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AACrF,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,qCAAqC;IACpD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAaD,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qCAA0C,GAClD,6BAA6B,CAqB/B;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,6BAA6B,GACpC,MAAM,CAUR;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,IAAI,CAAC,6BAA6B,EAAE,iBAAiB,CAAC,EAC9D,YAAY,SAAsB,GACjC,MAAM,CAOR"}
@@ -0,0 +1,72 @@
1
+ export const dromioDeploymentProfileValues = ["public"];
2
+ const defaultProfileConfigs = {
3
+ public: {
4
+ exposure: "public",
5
+ gitBaseUrl: "https://github.com/Dromio-Lab",
6
+ platformBaseUrl: "https://app.dromio.ai",
7
+ profile: "public",
8
+ registryBaseUrl: "https://registry.npmjs.org",
9
+ runtimeBaseUrl: "https://runtime.dromio.ai",
10
+ },
11
+ };
12
+ export function resolveDromioDeploymentProfile(options = {}) {
13
+ const env = options.env ?? process.env;
14
+ const profile = readDeploymentProfile(options.profile ?? env.DROMIO_DEPLOYMENT_PROFILE);
15
+ const defaults = defaultProfileConfigs[profile];
16
+ return {
17
+ exposure: readExposure(env.DROMIO_EXPOSURE, defaults.exposure),
18
+ gitBaseUrl: normalizedHttpUrl(env.DROMIO_GIT_BASE_URL ?? defaults.gitBaseUrl, "DROMIO_GIT_BASE_URL"),
19
+ platformBaseUrl: normalizedHttpUrl(env.DROMIO_PLATFORM_BASE_URL ?? defaults.platformBaseUrl, "DROMIO_PLATFORM_BASE_URL"),
20
+ profile,
21
+ registryBaseUrl: normalizedHttpUrl(env.DROMIO_REGISTRY_BASE_URL ?? defaults.registryBaseUrl, "DROMIO_REGISTRY_BASE_URL"),
22
+ runtimeBaseUrl: normalizedHttpUrl(env.DROMIO_RUNTIME_BASE_URL ?? defaults.runtimeBaseUrl, "DROMIO_RUNTIME_BASE_URL"),
23
+ };
24
+ }
25
+ export function formatDromioDeploymentProfileEnv(config) {
26
+ return [
27
+ `DROMIO_DEPLOYMENT_PROFILE=${config.profile}`,
28
+ `DROMIO_PLATFORM_BASE_URL=${config.platformBaseUrl}`,
29
+ `DROMIO_REGISTRY_BASE_URL=${config.registryBaseUrl}`,
30
+ `DROMIO_GIT_BASE_URL=${config.gitBaseUrl}`,
31
+ `DROMIO_RUNTIME_BASE_URL=${config.runtimeBaseUrl}`,
32
+ `DROMIO_EXPOSURE=${config.exposure}`,
33
+ "",
34
+ ].join("\n");
35
+ }
36
+ export function formatDromioNpmrc(config, tokenEnvName = "DROMIO_AUTH_TOKEN") {
37
+ const registryUrl = `${config.registryBaseUrl.replace(/\/+$/, "")}/`;
38
+ return [
39
+ `@dromio:registry=${registryUrl}`,
40
+ `${npmAuthTokenKey(registryUrl)}=\${${tokenEnvName}}`,
41
+ "",
42
+ ].join("\n");
43
+ }
44
+ function readDeploymentProfile(value) {
45
+ const profile = value ?? "public";
46
+ if (isDeploymentProfile(profile))
47
+ return profile;
48
+ throw new Error(`Invalid DROMIO_DEPLOYMENT_PROFILE: ${profile}`);
49
+ }
50
+ function isDeploymentProfile(value) {
51
+ return dromioDeploymentProfileValues.includes(value);
52
+ }
53
+ function readExposure(value, fallback) {
54
+ if (!value)
55
+ return fallback;
56
+ if (value === "public")
57
+ return value;
58
+ throw new Error(`Invalid DROMIO_EXPOSURE: ${value}`);
59
+ }
60
+ function normalizedHttpUrl(value, label) {
61
+ const parsed = new URL(value);
62
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
63
+ throw new Error(`${label} must use http or https.`);
64
+ }
65
+ return value.replace(/\/+$/, "");
66
+ }
67
+ function npmAuthTokenKey(registryUrl) {
68
+ const parsed = new URL(registryUrl);
69
+ const path = parsed.pathname.endsWith("/") ? parsed.pathname : `${parsed.pathname}/`;
70
+ return `//${parsed.host}${path}:_authToken`;
71
+ }
72
+ //# sourceMappingURL=deploymentProfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploymentProfile.js","sourceRoot":"","sources":["../src/deploymentProfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DromioAppDefinition } from "@dromio/workflow/config";
2
+ export interface EmitDromioProductManifestsOptions {
3
+ readonly env?: string;
4
+ readonly productRoot: string;
5
+ }
6
+ export interface EmitDromioProductManifestsResult {
7
+ readonly skipped: string[];
8
+ readonly written: string[];
9
+ }
10
+ /** Loads the tagged default export produced by `defineApp`. */
11
+ export declare function loadDromioAppDefinition(configPath: string): DromioAppDefinition;
12
+ /** Emits validated machine manifests from one config-as-code app definition. */
13
+ export declare function emitDromioProductManifests(definition: DromioAppDefinition, options: EmitDromioProductManifestsOptions): Promise<EmitDromioProductManifestsResult>;
14
+ //# sourceMappingURL=emitFromDefinition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitFromDefinition.d.ts","sourceRoot":"","sources":["../src/emitFromDefinition.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAUnE,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAY/E;AAED,gFAAgF;AAChF,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,gCAAgC,CAAC,CAqC3C"}
@@ -0,0 +1,87 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import { join, resolve } from "node:path";
4
+ import { workflowCompileArtifactPath, workflowDocumentPath, } from "./authoringWorkflowTemplates.js";
5
+ import { environmentManifestSchema, productManifestSchema } from "./schemas.js";
6
+ const GENERATED_HEADER = "# generated from dromio.config.ts — do not edit\n";
7
+ /** Loads the tagged default export produced by `defineApp`. */
8
+ export function loadDromioAppDefinition(configPath) {
9
+ const requireModule = createRequire(import.meta.url);
10
+ const resolvedPath = requireModule.resolve(resolve(configPath));
11
+ delete requireModule.cache?.[resolvedPath];
12
+ const loaded = requireModule(resolvedPath);
13
+ const definition = readDefaultExport(loaded);
14
+ if (!definition || typeof definition !== "object" || !isAppDefinition(definition)) {
15
+ throw new Error(`${configPath} must default-export defineApp({...}) from @dromio/workflow/config.`);
16
+ }
17
+ return definition;
18
+ }
19
+ /** Emits validated machine manifests from one config-as-code app definition. */
20
+ export async function emitDromioProductManifests(definition, options) {
21
+ const productRoot = resolve(options.productRoot);
22
+ const skipped = [];
23
+ const workflows = (definition.workflows ?? []).flatMap((workflow) => {
24
+ if (!workflow.document && workflow.run) {
25
+ skipped.push(`Workflow "${workflow.id}" is run-only and was omitted from the manifest.`);
26
+ return [];
27
+ }
28
+ return [{
29
+ approvalPolicy: workflow.approvals ?? "none",
30
+ compileArtifact: workflow.compileArtifact ?? workflowCompileArtifactPath(workflow.id),
31
+ document: workflow.document ?? workflowDocumentPath(workflow.id),
32
+ id: workflow.id,
33
+ title: workflow.title,
34
+ }];
35
+ });
36
+ const product = productManifestSchema.parse({
37
+ id: definition.id ?? kebabCase(definition.name),
38
+ name: definition.name,
39
+ ...definition.product,
40
+ workflows,
41
+ });
42
+ const environments = selectedEnvironments(definition, options.env).map(([id, environment]) => ({
43
+ id,
44
+ manifest: environmentManifestSchema.parse({ id, ...environment }),
45
+ }));
46
+ const files = [
47
+ { path: join(productRoot, "dromio.product.yml"), value: product },
48
+ ...environments.map(({ id, manifest }) => ({
49
+ path: join(productRoot, `dromio.env.${id}.yml`),
50
+ value: manifest,
51
+ })),
52
+ ];
53
+ await mkdir(productRoot, { recursive: true });
54
+ await Promise.all(files.map(({ path, value }) => writeGeneratedManifest(path, value)));
55
+ return { skipped, written: files.map(({ path }) => path) };
56
+ }
57
+ function readDefaultExport(loaded) {
58
+ if (loaded && typeof loaded === "object" && "default" in loaded) {
59
+ return loaded.default;
60
+ }
61
+ return loaded;
62
+ }
63
+ function isAppDefinition(value) {
64
+ return "kind" in value && value.kind === "app";
65
+ }
66
+ function selectedEnvironments(definition, environmentId) {
67
+ const entries = Object.entries(definition.environments ?? {});
68
+ if (!environmentId)
69
+ return entries;
70
+ const selected = entries.filter(([id]) => id === environmentId);
71
+ if (selected.length === 0) {
72
+ throw new Error(`Environment "${environmentId}" is not defined in dromio.config.ts.`);
73
+ }
74
+ return selected;
75
+ }
76
+ async function writeGeneratedManifest(path, value) {
77
+ await writeFile(path, `${GENERATED_HEADER}${JSON.stringify(value, null, 2)}\n`, "utf8");
78
+ }
79
+ function kebabCase(value) {
80
+ return value
81
+ .trim()
82
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
83
+ .replaceAll(/[^a-zA-Z0-9]+/g, "-")
84
+ .replaceAll(/^-+|-+$/g, "")
85
+ .toLowerCase();
86
+ }
87
+ //# sourceMappingURL=emitFromDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitFromDefinition.js","sourceRoot":"","sources":["../src/emitFromDefinition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface SourceFile {
2
+ readonly absolutePath: string;
3
+ readonly relativePath: string;
4
+ }
5
+ export declare function resolveProductPath(productRoot: string, productRelativePath: string): string;
6
+ export declare function ensureCleanDirectory(path: string): Promise<void>;
7
+ export declare function writeJsonFile(path: string, value: unknown): Promise<void>;
8
+ export declare function readTextFile(path: string): Promise<string>;
9
+ export declare function listSourceFiles(productRoot: string): Promise<SourceFile[]>;
10
+ export declare function hashFile(path: string): Promise<string>;
11
+ export declare function assertFileExists(path: string, label: string): void;
12
+ export declare function toPosixPath(path: string): string;
13
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAO3F;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQhF;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIlE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"}
package/dist/files.js ADDED
@@ -0,0 +1,77 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, statSync } from "node:fs";
3
+ import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
4
+ import { dirname, join, relative, resolve, sep } from "node:path";
5
+ const SOURCE_EXTENSIONS = new Set([
6
+ ".cjs",
7
+ ".cts",
8
+ ".js",
9
+ ".jsx",
10
+ ".mjs",
11
+ ".mts",
12
+ ".ts",
13
+ ".tsx",
14
+ ]);
15
+ export function resolveProductPath(productRoot, productRelativePath) {
16
+ const root = resolve(productRoot);
17
+ const resolved = resolve(root, productRelativePath);
18
+ if (!isInside(root, resolved)) {
19
+ throw new Error(`Product path escapes product root: ${productRelativePath}`);
20
+ }
21
+ return resolved;
22
+ }
23
+ export async function ensureCleanDirectory(path) {
24
+ await rm(path, { force: true, recursive: true });
25
+ await mkdir(path, { recursive: true });
26
+ }
27
+ export async function writeJsonFile(path, value) {
28
+ await mkdir(dirname(path), { recursive: true });
29
+ await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
30
+ }
31
+ export async function readTextFile(path) {
32
+ return readFile(path, "utf8");
33
+ }
34
+ export async function listSourceFiles(productRoot) {
35
+ const roots = ["src", "evals"].map((dir) => join(productRoot, dir)).filter(existsSync);
36
+ const files = [];
37
+ for (const root of roots) {
38
+ await collectSourceFiles(productRoot, root, files);
39
+ }
40
+ files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
41
+ return files;
42
+ }
43
+ export async function hashFile(path) {
44
+ const content = await readFile(path);
45
+ return createHash("sha256").update(content).digest("hex");
46
+ }
47
+ export function assertFileExists(path, label) {
48
+ if (!existsSync(path) || !statSync(path).isFile()) {
49
+ throw new Error(`${label} does not exist: ${path}`);
50
+ }
51
+ }
52
+ export function toPosixPath(path) {
53
+ return path.split(sep).join("/");
54
+ }
55
+ function isInside(root, target) {
56
+ const rel = relative(root, target);
57
+ return rel === "" || (!rel.startsWith("..") && !rel.startsWith(`${sep}..`));
58
+ }
59
+ async function collectSourceFiles(productRoot, dir, files) {
60
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
61
+ const absolutePath = join(dir, entry.name);
62
+ if (entry.isDirectory()) {
63
+ await collectSourceFiles(productRoot, absolutePath, files);
64
+ continue;
65
+ }
66
+ if (!entry.isFile())
67
+ continue;
68
+ const extension = entry.name.slice(entry.name.lastIndexOf("."));
69
+ if (!SOURCE_EXTENSIONS.has(extension))
70
+ continue;
71
+ files.push({
72
+ absolutePath,
73
+ relativePath: toPosixPath(relative(productRoot, absolutePath)),
74
+ });
75
+ }
76
+ }
77
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ForbiddenImportFinding {
2
+ readonly path: string;
3
+ readonly reason: string;
4
+ }
5
+ export declare function findForbiddenImportReasons(content: string): readonly string[];
6
+ export declare function findForbiddenImports(productRoot: string): Promise<ForbiddenImportFinding[]>;
7
+ //# sourceMappingURL=forbiddenImports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forbiddenImports.d.ts","sourceRoot":"","sources":["../src/forbiddenImports.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAY7E;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAYjG"}
@@ -0,0 +1,31 @@
1
+ import { listSourceFiles, readTextFile } from "./files.js";
2
+ const ABSOLUTE_DROMIO_ROOT = "/private/dromio-source";
3
+ const WORKSPACE_IMPORT_PATTERN = /(?:from|import)\s*(?:\(|)\s*["'][^"']*(?:\.\.\/)+(?:[^"']+\/)?dromio(?:\/|["'])/u;
4
+ const FILE_SPECIFIER_PATTERN = /(?:from|import)\s*(?:\(|)\s*["']file:/u;
5
+ export function findForbiddenImportReasons(content) {
6
+ const reasons = [];
7
+ if (content.includes(ABSOLUTE_DROMIO_ROOT)) {
8
+ reasons.push(`contains absolute Dromio workspace path ${ABSOLUTE_DROMIO_ROOT}`);
9
+ }
10
+ if (WORKSPACE_IMPORT_PATTERN.test(content)) {
11
+ reasons.push("imports workspace-local Dromio source by relative path");
12
+ }
13
+ if (FILE_SPECIFIER_PATTERN.test(content)) {
14
+ reasons.push("imports file: specifier instead of package export");
15
+ }
16
+ return reasons;
17
+ }
18
+ export async function findForbiddenImports(productRoot) {
19
+ const findings = [];
20
+ for (const file of await listSourceFiles(productRoot)) {
21
+ const content = await readTextFile(file.absolutePath);
22
+ for (const reason of findForbiddenImportReasons(content)) {
23
+ findings.push({
24
+ path: file.relativePath,
25
+ reason,
26
+ });
27
+ }
28
+ }
29
+ return findings;
30
+ }
31
+ //# sourceMappingURL=forbiddenImports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forbiddenImports.js","sourceRoot":"","sources":["../src/forbiddenImports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AACtD,MAAM,wBAAwB,GAC5B,kFAAkF,CAAC;AACrF,MAAM,sBAAsB,GAAG,wCAAwC,CAAC;AAOxE,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,2CAA2C,oBAAoB,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,MAAM,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,KAAK,MAAM,MAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,YAAY;gBACvB,MAAM;aACP,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { applyDromioProductScaffoldPlan, createDromioProductScaffoldPlan, productRelativePath, type CreateDromioProductScaffoldPlanOptions, type DromioProductScaffoldCapability, type DromioProductScaffoldDeferredWorkflow, type DromioProductScaffoldFileOverride, type DromioProductScaffoldFilePlan, type DromioProductScaffoldPanel, type DromioProductScaffoldPlan, type DromioProductScaffoldWorkflow, type DromioScaffoldFileOperation, } from "./authoring.js";
2
+ export { buildDromioProduct, type BuildDromioProductResult } from "./build.js";
3
+ export { checkDromioProduct, type ProductCheckResult } from "./check.js";
4
+ export { emitDromioProductManifests, loadDromioAppDefinition, type EmitDromioProductManifestsOptions, type EmitDromioProductManifestsResult, } from "./emitFromDefinition.js";
5
+ export type { ArchitectureCheckReport } from "./architectureCheck.js";
6
+ export type { ArchitectureFinding } from "./architectureCheckTypes.js";
7
+ export { dromioDeploymentProfileValues, formatDromioDeploymentProfileEnv, formatDromioNpmrc, resolveDromioDeploymentProfile, type DromioDeploymentExposure, type DromioDeploymentProfile, type DromioDeploymentProfileConfig, type ResolveDromioDeploymentProfileOptions, } from "./deploymentProfile.js";
8
+ export { publishDromioProduct, type DromioProductPublishFetch, type PublishDromioProductOptions, type PublishDromioProductResult, } from "./publish.js";
9
+ export { createDromioProductPublishPlan, type CreateDromioProductPublishPlanOptions, type DromioPlatformArtifactPayload, type DromioPlatformDeploymentPayload, type DromioPlatformReleasePayload, type DromioPlatformSettingsPayload, type DromioPlatformWorkflowRef, type DromioProductPublishPlan, type DromioPublishRequest, } from "./publishPlan.js";
10
+ export { environmentManifestSchema, productBundleManifestSchema, productManifestSchema, type DromioProductArchitecture, type DromioEnvironmentManifest, type DromioProductBundleManifest, type DromioProductManifest, } from "./schemas.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,mBAAmB,EACnB,KAAK,sCAAsC,EAC3C,KAAK,+BAA+B,EACpC,KAAK,qCAAqC,EAC1C,KAAK,iCAAiC,EACtC,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,GACjC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,KAAK,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,GACtC,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EACL,6BAA6B,EAC7B,gCAAgC,EAChC,iBAAiB,EACjB,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,qCAAqC,GAC3C,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,GAChC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,8BAA8B,EAC9B,KAAK,qCAAqC,EAC1C,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACpC,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,qBAAqB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,GAC3B,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { applyDromioProductScaffoldPlan, createDromioProductScaffoldPlan, productRelativePath, } from "./authoring.js";
2
+ export { buildDromioProduct } from "./build.js";
3
+ export { checkDromioProduct } from "./check.js";
4
+ export { emitDromioProductManifests, loadDromioAppDefinition, } from "./emitFromDefinition.js";
5
+ export { dromioDeploymentProfileValues, formatDromioDeploymentProfileEnv, formatDromioNpmrc, resolveDromioDeploymentProfile, } from "./deploymentProfile.js";
6
+ export { publishDromioProduct, } from "./publish.js";
7
+ export { createDromioProductPublishPlan, } from "./publishPlan.js";
8
+ export { environmentManifestSchema, productBundleManifestSchema, productManifestSchema, } from "./schemas.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,mBAAmB,GAUpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAiC,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAA2B,MAAM,YAAY,CAAC;AACzE,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GAGxB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,6BAA6B,EAC7B,gCAAgC,EAChC,iBAAiB,EACjB,8BAA8B,GAK/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,GAIrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,8BAA8B,GAS/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,qBAAqB,GAKtB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type DromioEnvironmentManifest, type DromioProductManifest } from "./schemas.js";
2
+ export interface ProductManifests {
3
+ readonly environment: DromioEnvironmentManifest;
4
+ readonly environmentPath: string;
5
+ readonly product: DromioProductManifest;
6
+ readonly productPath: string;
7
+ readonly productRoot: string;
8
+ }
9
+ export interface LoadProductManifestsOptions {
10
+ readonly env?: string;
11
+ readonly productRoot?: string;
12
+ }
13
+ export declare function loadProductManifests(options?: LoadProductManifestsOptions): Promise<ProductManifests>;
14
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AAWtB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,gBAAgB,CAAC,CAkB3B"}
@@ -0,0 +1,49 @@
1
+ import { join, resolve } from "node:path";
2
+ import { parse } from "yaml";
3
+ import { environmentManifestSchema, productManifestSchema, } from "./schemas.js";
4
+ import { readTextFile } from "./files.js";
5
+ export async function loadProductManifests(options = {}) {
6
+ const productRoot = resolve(options.productRoot ?? process.cwd());
7
+ const environmentId = options.env ?? (await readProductEnv(productRoot)) ?? process.env.DROMIO_PRODUCT_ENV ?? "dev";
8
+ const productPath = join(productRoot, "dromio.product.yml");
9
+ const environmentPath = join(productRoot, `dromio.env.${environmentId}.yml`);
10
+ const product = await readYamlManifest(productPath, productManifestSchema, "product manifest");
11
+ const environment = await readYamlManifest(environmentPath, environmentManifestSchema, "environment manifest");
12
+ if (environment.id !== environmentId) {
13
+ throw new Error(`Environment manifest id "${environment.id}" does not match requested "${environmentId}".`);
14
+ }
15
+ return { environment, environmentPath, product, productPath, productRoot };
16
+ }
17
+ async function readProductEnv(productRoot) {
18
+ try {
19
+ const source = await readTextFile(join(productRoot, ".env"));
20
+ return source
21
+ .split(/\r?\n/)
22
+ .map((line) => line.trim())
23
+ .filter((line) => line !== "" && !line.startsWith("#"))
24
+ .map((line) => line.match(/^DROMIO_PRODUCT_ENV=(.*)$/)?.[1]?.trim())
25
+ .find((value) => Boolean(value));
26
+ }
27
+ catch (error) {
28
+ if (isMissingFileError(error))
29
+ return undefined;
30
+ throw error;
31
+ }
32
+ }
33
+ function isMissingFileError(error) {
34
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
35
+ }
36
+ async function readYamlManifest(path, schema, label) {
37
+ const source = await readTextFile(path);
38
+ const parsed = parse(source);
39
+ const result = schema.safeParse(parsed);
40
+ if (result.success)
41
+ return result.data;
42
+ throw new Error(`${label} invalid at ${path}: ${formatZodError(result.error)}`);
43
+ }
44
+ function formatZodError(error) {
45
+ return error.issues
46
+ .map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
47
+ .join("; ");
48
+ }
49
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type CreateDromioProductPublishPlanOptions, type DromioProductPublishPlan, type DromioPublishRequest } from "./publishPlan.js";
2
+ interface DromioProductPublishResponse {
3
+ json(): Promise<unknown>;
4
+ readonly ok: boolean;
5
+ readonly status: number;
6
+ readonly statusText: string;
7
+ text(): Promise<string>;
8
+ }
9
+ export type DromioProductPublishFetch = (url: string, init: {
10
+ readonly body: string;
11
+ readonly headers: Record<string, string>;
12
+ readonly method: DromioPublishRequest<unknown>["method"];
13
+ }) => Promise<DromioProductPublishResponse>;
14
+ export interface PublishDromioProductOptions extends CreateDromioProductPublishPlanOptions {
15
+ readonly authToken: string;
16
+ readonly fetchImpl?: DromioProductPublishFetch;
17
+ }
18
+ export interface PublishDromioProductResult {
19
+ readonly app: unknown;
20
+ readonly artifact: unknown;
21
+ readonly deployment?: unknown;
22
+ readonly plan: DromioProductPublishPlan;
23
+ readonly publish: unknown;
24
+ readonly release: unknown;
25
+ readonly settings?: unknown;
26
+ }
27
+ export declare function publishDromioProduct(options: PublishDromioProductOptions): Promise<PublishDromioProductResult>;
28
+ export {};
29
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qCAAqC,EAC1C,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,UAAU,4BAA4B;IACpC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;CAC1D,KACE,OAAO,CAAC,4BAA4B,CAAC,CAAC;AAE3C,MAAM,WAAW,2BAA4B,SAAQ,qCAAqC;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,yBAAyB,CAAC;CAChD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAsBrC"}