@smoothbricks/cli 0.1.1 → 0.2.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 (117) hide show
  1. package/README.md +155 -30
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +91 -7
  4. package/dist/devenv/index.d.ts +10 -0
  5. package/dist/devenv/index.d.ts.map +1 -0
  6. package/dist/devenv/index.js +27 -0
  7. package/dist/lib/cli-package.d.ts +4 -0
  8. package/dist/lib/cli-package.d.ts.map +1 -0
  9. package/dist/lib/cli-package.js +15 -0
  10. package/dist/lib/run.d.ts +5 -0
  11. package/dist/lib/run.d.ts.map +1 -1
  12. package/dist/lib/run.js +13 -0
  13. package/dist/lib/workspace.d.ts +15 -1
  14. package/dist/lib/workspace.d.ts.map +1 -1
  15. package/dist/lib/workspace.js +25 -2
  16. package/dist/monorepo/commit-msg.d.ts +8 -1
  17. package/dist/monorepo/commit-msg.d.ts.map +1 -1
  18. package/dist/monorepo/commit-msg.js +85 -7
  19. package/dist/monorepo/index.d.ts +19 -2
  20. package/dist/monorepo/index.d.ts.map +1 -1
  21. package/dist/monorepo/index.js +104 -16
  22. package/dist/monorepo/managed-files.js +1 -1
  23. package/dist/monorepo/nx-sync.d.ts +2 -1
  24. package/dist/monorepo/nx-sync.d.ts.map +1 -1
  25. package/dist/monorepo/nx-sync.js +8 -2
  26. package/dist/monorepo/package-hygiene.d.ts +6 -2
  27. package/dist/monorepo/package-hygiene.d.ts.map +1 -1
  28. package/dist/monorepo/package-hygiene.js +12 -4
  29. package/dist/monorepo/package-policy.d.ts +22 -2
  30. package/dist/monorepo/package-policy.d.ts.map +1 -1
  31. package/dist/monorepo/package-policy.js +1167 -8
  32. package/dist/monorepo/packed-package.d.ts +3 -0
  33. package/dist/monorepo/packed-package.d.ts.map +1 -1
  34. package/dist/monorepo/packed-package.js +68 -36
  35. package/dist/monorepo/packs/index.d.ts +20 -1
  36. package/dist/monorepo/packs/index.d.ts.map +1 -1
  37. package/dist/monorepo/packs/index.js +238 -19
  38. package/dist/monorepo/publish-workflow.d.ts +0 -4
  39. package/dist/monorepo/publish-workflow.d.ts.map +1 -1
  40. package/dist/monorepo/publish-workflow.js +5 -12
  41. package/dist/monorepo/tool-validation.d.ts +22 -0
  42. package/dist/monorepo/tool-validation.d.ts.map +1 -0
  43. package/dist/monorepo/tool-validation.js +399 -0
  44. package/dist/nx/index.d.ts +24 -0
  45. package/dist/nx/index.d.ts.map +1 -0
  46. package/dist/nx/index.js +94 -0
  47. package/dist/release/bootstrap-npm-packages.d.ts +19 -0
  48. package/dist/release/bootstrap-npm-packages.d.ts.map +1 -0
  49. package/dist/release/bootstrap-npm-packages.js +58 -0
  50. package/dist/release/candidates.d.ts +11 -0
  51. package/dist/release/candidates.d.ts.map +1 -0
  52. package/dist/release/candidates.js +181 -0
  53. package/dist/release/core.d.ts +1 -0
  54. package/dist/release/core.d.ts.map +1 -1
  55. package/dist/release/github-release.js +2 -2
  56. package/dist/release/index.d.ts +25 -0
  57. package/dist/release/index.d.ts.map +1 -1
  58. package/dist/release/index.js +247 -49
  59. package/dist/release/npm-auth.d.ts +0 -1
  60. package/dist/release/npm-auth.d.ts.map +1 -1
  61. package/dist/release/npm-auth.js +4 -16
  62. package/dist/release/orchestration.d.ts +2 -1
  63. package/dist/release/orchestration.d.ts.map +1 -1
  64. package/dist/release/orchestration.js +9 -1
  65. package/dist/release/publish-plan.js +1 -1
  66. package/managed/raw/git-format-staged.yml +54 -0
  67. package/managed/raw/tooling/git-hooks/commit-msg.sh +1 -1
  68. package/managed/templates/github/actions/setup-devenv/action.yml +1 -7
  69. package/managed/templates/github/workflows/ci.yml +1 -0
  70. package/package.json +15 -3
  71. package/src/cli.ts +134 -20
  72. package/src/devenv/index.test.ts +49 -0
  73. package/src/devenv/index.ts +38 -0
  74. package/src/lib/cli-package.ts +18 -0
  75. package/src/lib/run.ts +19 -0
  76. package/src/lib/workspace.ts +41 -2
  77. package/src/monorepo/__tests__/publish-workflow.test.ts +16 -9
  78. package/src/monorepo/commit-msg.test.ts +45 -0
  79. package/src/monorepo/commit-msg.ts +107 -7
  80. package/src/monorepo/index.ts +142 -16
  81. package/src/monorepo/managed-files.ts +1 -1
  82. package/src/monorepo/nx-sync.ts +9 -2
  83. package/src/monorepo/package-hygiene.test.ts +34 -0
  84. package/src/monorepo/package-hygiene.ts +26 -4
  85. package/src/monorepo/package-policy.test.ts +902 -0
  86. package/src/monorepo/package-policy.ts +1393 -7
  87. package/src/monorepo/packed-package.ts +89 -37
  88. package/src/monorepo/packs/index.test.ts +189 -0
  89. package/src/monorepo/packs/index.ts +311 -20
  90. package/src/monorepo/publish-workflow.ts +8 -16
  91. package/src/monorepo/setup-test-tracing.test.ts +120 -0
  92. package/src/monorepo/tool-validation.test.ts +261 -0
  93. package/src/monorepo/tool-validation.ts +462 -0
  94. package/src/nx/index.test.ts +64 -0
  95. package/src/nx/index.ts +119 -0
  96. package/src/release/__tests__/bootstrap-npm-packages.test.ts +127 -0
  97. package/src/release/__tests__/candidates.test.ts +217 -0
  98. package/src/release/__tests__/core-properties.test.ts +4 -4
  99. package/src/release/__tests__/core-scenarios.test.ts +15 -5
  100. package/src/release/__tests__/core.test.ts +2 -2
  101. package/src/release/__tests__/fixture-repo.test.ts +22 -13
  102. package/src/release/__tests__/github-release.test.ts +13 -8
  103. package/src/release/__tests__/helpers/fixture-repo.ts +1 -0
  104. package/src/release/__tests__/npm-auth.test.ts +12 -21
  105. package/src/release/__tests__/orchestration.test.ts +51 -7
  106. package/src/release/__tests__/publish-plan.test.ts +9 -3
  107. package/src/release/__tests__/retag-unpublished.test.ts +1 -1
  108. package/src/release/__tests__/trust-publisher.test.ts +133 -0
  109. package/src/release/bootstrap-npm-packages.ts +88 -0
  110. package/src/release/candidates.ts +225 -0
  111. package/src/release/core.ts +1 -0
  112. package/src/release/github-release.ts +2 -2
  113. package/src/release/index.ts +346 -56
  114. package/src/release/npm-auth.ts +4 -33
  115. package/src/release/orchestration.ts +12 -2
  116. package/src/release/publish-plan.ts +1 -1
  117. package/managed/raw/.git-format-staged.yml +0 -47
@@ -1,2 +1,5 @@
1
1
  export declare function validatePackedPublicPackages(root: string): Promise<number>;
2
+ export declare function validatePackedPublicPackagePublint(root: string): Promise<number>;
3
+ export declare function validatePackedPublicPackageManifest(root: string): Promise<number>;
4
+ export declare function validatePackedPublicPackageTypes(root: string): Promise<number>;
2
5
  //# sourceMappingURL=packed-package.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packed-package.d.ts","sourceRoot":"","sources":["../../src/monorepo/packed-package.ts"],"names":[],"mappings":"AAUA,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhF"}
1
+ {"version":3,"file":"packed-package.d.ts","sourceRoot":"","sources":["../../src/monorepo/packed-package.ts"],"names":[],"mappings":"AAUA,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhF;AAED,wBAAsB,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMtF;AAED,wBAAsB,mCAAmC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvF;AAED,wBAAsB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpF"}
@@ -3,64 +3,96 @@ import { join } from 'node:path';
3
3
  import { publint } from 'publint';
4
4
  import { formatMessage } from 'publint/utils';
5
5
  import { isRecord } from '../lib/json.js';
6
- import { runStatus } from '../lib/run.js';
6
+ import { runResult, runStatus } from '../lib/run.js';
7
7
  import { listPublicPackages } from '../lib/workspace.js';
8
8
  import { readPackedPackageJson, validatePackedWorkspaceDependencies } from './packed-manifest.js';
9
9
  export async function validatePackedPublicPackages(root) {
10
+ return ((await validatePackedPublicPackagePublint(root)) +
11
+ (await validatePackedPublicPackageManifest(root)) +
12
+ (await validatePackedPublicPackageTypes(root)));
13
+ }
14
+ export async function validatePackedPublicPackagePublint(root) {
10
15
  let failures = 0;
11
16
  for (const pkg of listPublicPackages(root)) {
12
- failures += await validatePackedPublicPackage(root, pkg);
17
+ failures += await validatePackedPublicPackageTool(root, pkg, validatePublint);
13
18
  }
14
19
  return failures;
15
20
  }
16
- async function validatePackedPublicPackage(root, pkg) {
21
+ export async function validatePackedPublicPackageManifest(root) {
17
22
  let failures = 0;
23
+ for (const pkg of listPublicPackages(root)) {
24
+ failures += await validatePackedPublicPackageTool(root, pkg, validatePackedManifest);
25
+ }
26
+ return failures;
27
+ }
28
+ export async function validatePackedPublicPackageTypes(root) {
29
+ let failures = 0;
30
+ for (const pkg of listPublicPackages(root)) {
31
+ failures += await validatePackedPublicPackageTool(root, pkg, validateAttw);
32
+ }
33
+ return failures;
34
+ }
35
+ async function validatePackedPublicPackageTool(root, pkg, validate) {
18
36
  const packed = await packPackage(root, pkg);
19
37
  try {
20
- const lint = await publint({ pack: { tarball: packed.arrayBuffer }, level: 'warning', strict: true });
21
- for (const message of lint.messages) {
22
- console.error(`${pkg.path}: publint ${message.type} ${message.code}: ${formatMessage(message, lint.pkg)}`);
23
- failures++;
24
- }
25
- const packedPackage = await readPackedPackageJson(root, packed.path, pkg.name);
26
- for (const message of validatePackedWorkspaceDependencies(root, pkg, packedPackage)) {
27
- console.error(message);
28
- failures++;
29
- }
30
- const attwArgs = [
31
- packed.path,
32
- '--format',
33
- 'ascii',
34
- '--no-color',
35
- '--profile',
36
- 'node16',
37
- '--ignore-rules',
38
- 'cjs-resolves-to-esm',
39
- ...attwExcludedEntrypointArgs(pkg),
40
- ];
41
- const attwStatus = await runStatus('attw', ['--quiet', ...attwArgs], root, true);
42
- if (attwStatus !== 0) {
43
- await runStatus('attw', attwArgs, root);
44
- console.error(`${pkg.path}: are-the-types-wrong validation failed`);
45
- failures++;
46
- }
47
- else {
48
- console.log(`${pkg.path}: are-the-types-wrong valid.`);
49
- }
38
+ return await validate(root, pkg, packed);
50
39
  }
51
40
  catch (error) {
52
41
  const message = error instanceof Error ? error.message : String(error);
53
42
  console.error(`${pkg.path}: packed package validation failed: ${message}`);
54
- failures++;
43
+ return 1;
55
44
  }
56
45
  finally {
57
46
  unlinkSync(packed.path);
58
47
  }
59
- if (failures === 0) {
60
- console.log(`${pkg.path}: packed package is valid.`);
48
+ }
49
+ async function validatePublint(_root, pkg, packed) {
50
+ let failures = 0;
51
+ const lint = await publint({ pack: { tarball: packed.arrayBuffer }, level: 'warning', strict: true });
52
+ for (const message of lint.messages) {
53
+ console.error(`${pkg.path}: publint ${message.type} ${message.code}: ${formatMessage(message, lint.pkg)}`);
54
+ failures++;
55
+ }
56
+ return failures;
57
+ }
58
+ async function validatePackedManifest(root, pkg, packed) {
59
+ let failures = 0;
60
+ const packedPackage = await readPackedPackageJson(root, packed.path, pkg.name);
61
+ for (const message of validatePackedWorkspaceDependencies(root, pkg, packedPackage)) {
62
+ console.error(message);
63
+ failures++;
61
64
  }
62
65
  return failures;
63
66
  }
67
+ async function validateAttw(root, pkg, packed) {
68
+ const attwArgs = [
69
+ packed.path,
70
+ '--format',
71
+ 'ascii',
72
+ '--no-color',
73
+ '--profile',
74
+ 'node16',
75
+ '--ignore-rules',
76
+ 'cjs-resolves-to-esm',
77
+ ...attwExcludedEntrypointArgs(pkg),
78
+ ];
79
+ const attw = await runResult('attw', attwArgs, root);
80
+ if (attw.exitCode === 0) {
81
+ return 0;
82
+ }
83
+ printAttwOutput(attw.stdout);
84
+ printAttwOutput(attw.stderr);
85
+ console.error(`${pkg.path}: are-the-types-wrong validation failed`);
86
+ return 1;
87
+ }
88
+ function printAttwOutput(output) {
89
+ for (const line of output.split('\n')) {
90
+ if (!line || line.includes('(ignored)')) {
91
+ continue;
92
+ }
93
+ console.error(line);
94
+ }
95
+ }
64
96
  function attwExcludedEntrypointArgs(pkg) {
65
97
  const excluded = wasmExportEntrypoints(pkg.json.exports);
66
98
  return excluded.length === 0 ? [] : ['--exclude-entrypoints', ...excluded];
@@ -1,10 +1,29 @@
1
1
  export interface MonorepoContext {
2
2
  root: string;
3
3
  syncRuntime: boolean;
4
+ verbose?: boolean;
4
5
  }
5
6
  export interface ValidatePackOptions {
6
7
  failFast?: boolean;
8
+ fix?: boolean;
9
+ verbose?: boolean;
10
+ }
11
+ export interface MonorepoPack {
12
+ name: string;
13
+ init?(ctx: MonorepoContext): Promise<void> | void;
14
+ fixPreBuild?(ctx: MonorepoContext): Promise<void> | void;
15
+ fixPostBuild?(ctx: MonorepoContext): Promise<void> | void;
16
+ validatePreBuild?(ctx: MonorepoContext): Promise<number> | number;
17
+ validatePostBuild?(ctx: MonorepoContext): Promise<number> | number;
18
+ }
19
+ export interface ValidatePackRunHooks {
20
+ packs?: readonly MonorepoPack[];
21
+ runBuild?: (ctx: MonorepoContext, options?: ValidatePackOptions) => Promise<number> | number;
22
+ }
23
+ export interface ValidatePackResult {
24
+ failures: number;
25
+ failedChecks: number;
7
26
  }
8
27
  export declare function runInitPacks(ctx: MonorepoContext): Promise<void>;
9
- export declare function runValidatePacks(ctx: MonorepoContext, options?: ValidatePackOptions): Promise<number>;
28
+ export declare function runValidatePacks(ctx: MonorepoContext, options?: ValidatePackOptions, hooks?: ValidatePackRunHooks): Promise<ValidatePackResult>;
10
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/monorepo/packs/index.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAyDD,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/monorepo/packs/index.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,WAAW,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzD,YAAY,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1D,gBAAgB,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAClE,iBAAiB,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CACpE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAC9F;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAgGD,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,mBAAwB,EACjC,KAAK,GAAE,oBAAyB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA0B7B"}
@@ -1,12 +1,15 @@
1
1
  import { chmodSync, existsSync, statSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { validateBunLockfileVersions } from '../lockfile.js';
3
+ import { runStatus } from '../../lib/run.js';
4
+ import { readProjectTargets } from '../../nx/index.js';
5
+ import { syncBunLockfileVersions, validateBunLockfileVersions } from '../lockfile.js';
4
6
  import { validateManagedFiles } from '../managed-files.js';
5
- import { validateNxSync } from '../nx-sync.js';
7
+ import { fixNxSync, validateNxSync } from '../nx-sync.js';
6
8
  import { fixPackageHygiene, validatePackageHygiene } from '../package-hygiene.js';
7
- import { applyNxReleaseDefaults, applyPublicPackageDefaults, applyWorkspaceDependencyDefaults, validateNxReleaseConfig, validatePublicPackageMetadata, validatePublicTags, validateRootPackagePolicy, validateWorkspaceDependencies, } from '../package-policy.js';
8
- import { validatePackedPublicPackages } from '../packed-package.js';
9
+ import { applyFixableMonorepoDefaults, applyNxReleaseDefaults, applyPublicPackageDefaults, applyWorkspaceDependencyDefaults, validateNxProjectNames, validateNxReleaseConfig, validatePublicPackageMetadata, validatePublicTags, validateRootPackagePolicy, validateWorkspaceDependencies, } from '../package-policy.js';
10
+ import { validatePackedPublicPackageManifest, validatePackedPublicPackagePublint, validatePackedPublicPackageTypes, } from '../packed-package.js';
9
11
  import { syncRootRuntimeVersions } from '../runtime.js';
12
+ import { applyToolConfigDefaults, validateToolConfig } from '../tool-validation.js';
10
13
  const packs = [
11
14
  {
12
15
  name: 'core',
@@ -20,12 +23,21 @@ const packs = [
20
23
  console.log('skip root runtime versions (outside devenv; pass --sync-runtime to force)');
21
24
  }
22
25
  },
23
- async validate(ctx) {
26
+ async fixPreBuild(ctx) {
27
+ applyFixableMonorepoDefaults(ctx.root);
28
+ await applyToolConfigDefaults(ctx.root);
29
+ syncBunLockfileVersions(ctx.root);
30
+ await fixNxSync(ctx.root, ctx.verbose === true);
31
+ applyWorkspaceDependencyDefaults(ctx.root, { resolvedTargetsByProject: await readResolvedTargetsByProject(ctx) });
32
+ },
33
+ async validatePreBuild(ctx) {
24
34
  return (validateManagedFiles(ctx.root) +
25
35
  validateRootPackagePolicy(ctx.root) +
36
+ validateToolConfig(ctx.root) +
37
+ validateNxProjectNames(ctx.root) +
26
38
  validateNxReleaseConfig(ctx.root) +
27
39
  validateBunLockfileVersions(ctx.root) +
28
- (await validateNxSync(ctx.root)));
40
+ (await validateNxSync(ctx.root, ctx.verbose === true)));
29
41
  },
30
42
  },
31
43
  {
@@ -33,24 +45,55 @@ const packs = [
33
45
  init(ctx) {
34
46
  applyPublicPackageDefaults(ctx.root);
35
47
  },
36
- validate(ctx) {
48
+ fixPreBuild(ctx) {
49
+ applyPublicPackageDefaults(ctx.root);
50
+ },
51
+ validatePreBuild(ctx) {
37
52
  return validatePublicTags(ctx.root) + validatePublicPackageMetadata(ctx.root);
38
53
  },
39
54
  },
40
55
  {
41
56
  name: 'workspace-dependencies',
42
- async init(ctx) {
57
+ init(ctx) {
43
58
  applyWorkspaceDependencyDefaults(ctx.root);
59
+ },
60
+ async fixPostBuild(ctx) {
61
+ applyWorkspaceDependencyDefaults(ctx.root, { resolvedTargetsByProject: await readResolvedTargetsByProject(ctx) });
62
+ },
63
+ async validatePostBuild(ctx) {
64
+ return validateWorkspaceDependencies(ctx.root, {
65
+ resolvedTargetsByProject: await readResolvedTargetsByProject(ctx),
66
+ });
67
+ },
68
+ },
69
+ {
70
+ name: 'package-hygiene',
71
+ async init(ctx) {
72
+ await fixPackageHygiene(ctx.root, ctx.verbose === true);
73
+ },
74
+ async fixPostBuild(ctx) {
44
75
  await fixPackageHygiene(ctx.root);
45
76
  },
46
- async validate(ctx) {
47
- return validateWorkspaceDependencies(ctx.root) + (await validatePackageHygiene(ctx.root));
77
+ async validatePostBuild(ctx) {
78
+ return validatePackageHygiene(ctx.root, ctx.verbose === true);
79
+ },
80
+ },
81
+ {
82
+ name: 'packed-package-publint',
83
+ validatePostBuild(ctx) {
84
+ return validatePackedPublicPackagePublint(ctx.root);
85
+ },
86
+ },
87
+ {
88
+ name: 'packed-package-manifest',
89
+ validatePostBuild(ctx) {
90
+ return validatePackedPublicPackageManifest(ctx.root);
48
91
  },
49
92
  },
50
93
  {
51
- name: 'packed-packages',
52
- validate(ctx) {
53
- return validatePackedPublicPackages(ctx.root);
94
+ name: 'packed-package-types',
95
+ validatePostBuild(ctx) {
96
+ return validatePackedPublicPackageTypes(ctx.root);
54
97
  },
55
98
  },
56
99
  ];
@@ -59,22 +102,198 @@ export async function runInitPacks(ctx) {
59
102
  await pack.init?.(ctx);
60
103
  }
61
104
  }
62
- export async function runValidatePacks(ctx, options = {}) {
105
+ export async function runValidatePacks(ctx, options = {}, hooks = {}) {
106
+ const selectedPacks = hooks.packs ?? packs;
107
+ const build = hooks.runBuild ?? runBuild;
108
+ if (options.fix) {
109
+ await runFixPhase(ctx, selectedPacks, 'pre-build', 'fixPreBuild');
110
+ const buildFailures = await build(ctx, options);
111
+ if (buildFailures > 0) {
112
+ return { failures: buildFailures, failedChecks: 1 };
113
+ }
114
+ await runFixPhase(ctx, selectedPacks, 'post-build', 'fixPostBuild');
115
+ return runValidationPhases(ctx, selectedPacks, options, false);
116
+ }
117
+ const preBuild = await runValidationPhase(ctx, selectedPacks, options, 'pre-build', 'validatePreBuild', false);
118
+ if (preBuild.failures > 0 && options.failFast) {
119
+ return preBuild;
120
+ }
121
+ const buildFailures = await build(ctx, options);
122
+ if (buildFailures > 0) {
123
+ return { failures: preBuild.failures + buildFailures, failedChecks: preBuild.failedChecks + 1 };
124
+ }
125
+ return sumResults(preBuild, await runValidationPhase(ctx, selectedPacks, options, 'post-build', 'validatePostBuild', true));
126
+ }
127
+ async function runValidationPhases(ctx, selectedPacks, options, printedBefore) {
128
+ const preBuild = await runValidationPhase(ctx, selectedPacks, options, 'pre-build', 'validatePreBuild', printedBefore);
129
+ if (preBuild.failures > 0 && options.failFast) {
130
+ return preBuild;
131
+ }
132
+ return sumResults(preBuild, await runValidationPhase(ctx, selectedPacks, options, 'post-build', 'validatePostBuild', true));
133
+ }
134
+ async function runValidationPhase(ctx, selectedPacks, options, phase, method, printedBefore) {
63
135
  let failures = 0;
136
+ let failedChecks = 0;
64
137
  let checkedPacks = 0;
65
- for (const pack of packs) {
66
- if (!pack.validate) {
138
+ let hasPrinted = printedBefore;
139
+ for (const pack of selectedPacks) {
140
+ const validate = pack[method];
141
+ if (!validate) {
67
142
  continue;
68
143
  }
69
- console.log(`${checkedPacks === 0 ? '' : '\n'}== ${pack.name} ==`);
144
+ const label = `${pack.name} (${phase})`;
145
+ if (options.verbose) {
146
+ printCheckHeading(label, hasPrinted || checkedPacks > 0);
147
+ }
148
+ hasPrinted = true;
70
149
  checkedPacks++;
71
- const packFailures = await pack.validate(ctx);
150
+ let packFailures;
151
+ let output = emptyCapturedOutput();
152
+ try {
153
+ if (options.verbose) {
154
+ packFailures = await validate(ctx);
155
+ }
156
+ else {
157
+ const captured = await captureConsoleOutput(() => validate(ctx));
158
+ packFailures = captured.result;
159
+ output = captured.output;
160
+ }
161
+ }
162
+ catch (error) {
163
+ if (!options.verbose) {
164
+ printCheckHeading(label, true);
165
+ if (error instanceof CapturedConsoleError) {
166
+ output = error.output;
167
+ }
168
+ printCapturedOutput(output);
169
+ }
170
+ throw error instanceof CapturedConsoleError ? error.cause : error;
171
+ }
72
172
  failures += packFailures;
173
+ if (packFailures > 0) {
174
+ failedChecks++;
175
+ }
176
+ if (!options.verbose && packFailures > 0) {
177
+ printCheckHeading(label, true);
178
+ printCapturedOutput(output);
179
+ }
180
+ printCheckStatus(label, packFailures);
73
181
  if (packFailures > 0 && options.failFast) {
74
182
  break;
75
183
  }
76
184
  }
77
- return failures;
185
+ return { failures, failedChecks };
186
+ }
187
+ function sumResults(left, right) {
188
+ return { failures: left.failures + right.failures, failedChecks: left.failedChecks + right.failedChecks };
189
+ }
190
+ async function runFixPhase(ctx, selectedPacks, phase, method) {
191
+ let checkedPacks = 0;
192
+ for (const pack of selectedPacks) {
193
+ const fix = pack[method];
194
+ if (!fix) {
195
+ continue;
196
+ }
197
+ const label = `${pack.name} (${phase} fix)`;
198
+ if (ctx.verbose) {
199
+ printCheckHeading(label, checkedPacks > 0);
200
+ }
201
+ checkedPacks++;
202
+ if (ctx.verbose) {
203
+ await fix(ctx);
204
+ continue;
205
+ }
206
+ let output = emptyCapturedOutput();
207
+ try {
208
+ output = (await captureConsoleOutput(() => fix(ctx))).output;
209
+ }
210
+ catch (error) {
211
+ if (error instanceof CapturedConsoleError) {
212
+ output = error.output;
213
+ }
214
+ printCheckHeading(label, true);
215
+ printCapturedOutput(output);
216
+ throw error instanceof CapturedConsoleError ? error.cause : error;
217
+ }
218
+ }
219
+ }
220
+ async function runBuild(ctx, options = {}) {
221
+ if (options.verbose) {
222
+ printCheckHeading('build', true);
223
+ }
224
+ const status = await runStatus('nx', ['run-many', '-t', 'build'], ctx.root, options.verbose !== true);
225
+ if (status !== 0) {
226
+ if (!options.verbose) {
227
+ printCheckHeading('build', true);
228
+ }
229
+ console.error('nx run-many -t build failed');
230
+ printCheckStatus('build', 1);
231
+ return 1;
232
+ }
233
+ printCheckStatus('build', 0);
234
+ return 0;
235
+ }
236
+ function printCheckStatus(label, failures) {
237
+ if (failures === 0) {
238
+ console.log(`🆗 ${label}`);
239
+ return;
240
+ }
241
+ const noun = failures === 1 ? 'problem' : 'problems';
242
+ console.log(`👎 ${label} (${failures} ${noun})\n`);
243
+ }
244
+ function printCheckHeading(label, separate) {
245
+ console.log(`${separate ? '\n' : ''}== ${label} ==`);
246
+ }
247
+ function emptyCapturedOutput() {
248
+ return { logs: [], errors: [] };
249
+ }
250
+ async function captureConsoleOutput(fn) {
251
+ const output = emptyCapturedOutput();
252
+ const originalLog = console.log;
253
+ const originalError = console.error;
254
+ console.log = (...args) => {
255
+ output.logs.push(args.join(' '));
256
+ };
257
+ console.error = (...args) => {
258
+ output.errors.push(args.join(' '));
259
+ };
260
+ try {
261
+ return { result: await fn(), output };
262
+ }
263
+ catch (error) {
264
+ throw new CapturedConsoleError(error, output);
265
+ }
266
+ finally {
267
+ console.log = originalLog;
268
+ console.error = originalError;
269
+ }
270
+ }
271
+ class CapturedConsoleError extends Error {
272
+ cause;
273
+ output;
274
+ constructor(cause, output) {
275
+ super(cause instanceof Error ? cause.message : String(cause));
276
+ this.cause = cause;
277
+ this.output = output;
278
+ }
279
+ }
280
+ function printCapturedOutput(output) {
281
+ for (const line of output.logs) {
282
+ console.log(line);
283
+ }
284
+ for (const line of output.errors) {
285
+ console.log(line);
286
+ }
287
+ }
288
+ async function readResolvedTargetsByProject(ctx) {
289
+ const projects = await readProjectTargets(ctx.root);
290
+ return new Map(projects.map((project) => [
291
+ project.project,
292
+ {
293
+ targets: new Set(project.targets),
294
+ ...(project.buildDependsOn ? { buildDependsOn: project.buildDependsOn } : {}),
295
+ },
296
+ ]));
78
297
  }
79
298
  function ensureLocalSmooShim(root) {
80
299
  const shim = join(root, 'tooling', 'smoo');
@@ -24,7 +24,6 @@ export interface PublishWorkflowStep {
24
24
  id?: string;
25
25
  condition?: PublishWorkflowCondition;
26
26
  nxTarget?: PublishWorkflowNxTarget;
27
- needsNodeAuthToken?: boolean;
28
27
  }
29
28
  export interface PublishWorkflowDefinition {
30
29
  steps: PublishWorkflowStep[];
@@ -51,7 +50,6 @@ export interface PublishWorkflowCallbacks {
51
50
  buildSelfHostedCli(): Promise<void>;
52
51
  repairPendingReleases(input: {
53
52
  dryRun: boolean;
54
- nodeAuthToken: boolean;
55
53
  }): Promise<void>;
56
54
  versionRelease(input: {
57
55
  bump: PublishWorkflowBump;
@@ -67,13 +65,11 @@ export interface PublishWorkflowCallbacks {
67
65
  publishRelease(input: {
68
66
  bump: PublishWorkflowBump;
69
67
  dryRun: boolean;
70
- nodeAuthToken: boolean;
71
68
  }): Promise<void>;
72
69
  saveNixDevenv(input: PublishWorkflowSetupOutputs): Promise<void>;
73
70
  }
74
71
  export interface PublishWorkflowRunContext {
75
72
  inputs: PublishWorkflowInputs;
76
- nodeAuthToken: boolean;
77
73
  callbacks: PublishWorkflowCallbacks;
78
74
  }
79
75
  export interface PublishWorkflowRunResult {
@@ -1 +1 @@
1
- {"version":3,"file":"publish-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/publish-workflow.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,CAAC;AACtF,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,GAAG,SAAS,GAAG,QAAQ,CAAC;AACtF,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE,oBAAY,uBAAuB;IACjC,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,sBAAsB,6BAA6B;IACnD,kBAAkB,0BAA0B;IAC5C,qBAAqB,4BAA4B;IACjD,cAAc,oBAAoB;IAClC,yBAAyB,iCAAiC;IAC1D,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,cAAc,qBAAqB;IACnC,sBAAsB,6BAA6B;IACnD,cAAc,oBAAoB;IAClC,aAAa,oBAAoB;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,WAAW,IAAI,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACpD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,qBAAqB,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAC9G,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,SAAS,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,uBAAuB,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7G,aAAa,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,wBAAwB,CAAC;CACrC;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,6BAA6B,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;CACjB;AAID,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,gCAAqC,GAAG,yBAAyB,CA4D/G;AAMD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,yBAAyB,EACnC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAqEnC;AAYD,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,gCAAqC,GAAG,MAAM,CAGhG"}
1
+ {"version":3,"file":"publish-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/publish-workflow.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { isSmoothBricksCodebasePackageName } from '../lib/cli-package.js';
1
2
  export var PublishWorkflowStepKind;
2
3
  (function (PublishWorkflowStepKind) {
3
4
  PublishWorkflowStepKind["Checkout"] = "checkout";
@@ -22,7 +23,7 @@ export function definePublishWorkflow(options = {}) {
22
23
  { kind: PublishWorkflowStepKind.SetupDevenv, name: '🧱 Setup Nix/devenv', id: 'setup' },
23
24
  { kind: PublishWorkflowStepKind.ConfigureReleaseAuthor, name: '🤖 Configure release author' },
24
25
  ];
25
- if (options.repoName === '@smoothbricks/codebase') {
26
+ if (isSmoothBricksCodebasePackageName(options.repoName)) {
26
27
  setupSteps.push({ kind: PublishWorkflowStepKind.BuildSelfHostedCli, name: '🏗️ Build self-hosted smoo' });
27
28
  }
28
29
  return {
@@ -31,7 +32,6 @@ export function definePublishWorkflow(options = {}) {
31
32
  {
32
33
  kind: PublishWorkflowStepKind.RepairPendingReleases,
33
34
  name: '🧯 Repair pending releases',
34
- needsNodeAuthToken: true,
35
35
  },
36
36
  { kind: PublishWorkflowStepKind.VersionRelease, name: '🏷️ Version release', id: 'version' },
37
37
  {
@@ -66,7 +66,6 @@ export function definePublishWorkflow(options = {}) {
66
66
  {
67
67
  kind: PublishWorkflowStepKind.PublishRelease,
68
68
  name: `📦 Publish release (${versionMode})`,
69
- needsNodeAuthToken: true,
70
69
  },
71
70
  {
72
71
  kind: PublishWorkflowStepKind.SaveNixDevenv,
@@ -105,7 +104,6 @@ export async function runPublishWorkflow(workflow, context) {
105
104
  case PublishWorkflowStepKind.RepairPendingReleases:
106
105
  await context.callbacks.repairPendingReleases({
107
106
  dryRun: context.inputs.dryRun,
108
- nodeAuthToken: context.nodeAuthToken,
109
107
  });
110
108
  break;
111
109
  case PublishWorkflowStepKind.VersionRelease:
@@ -132,7 +130,6 @@ export async function runPublishWorkflow(workflow, context) {
132
130
  await context.callbacks.publishRelease({
133
131
  bump: context.inputs.bump,
134
132
  dryRun: context.inputs.dryRun,
135
- nodeAuthToken: context.nodeAuthToken,
136
133
  });
137
134
  break;
138
135
  case PublishWorkflowStepKind.SaveNixDevenv:
@@ -271,13 +268,11 @@ function yamlLinesForStep(step) {
271
268
  ` - name: ${step.name}`,
272
269
  ' # SmoothBricks self-hosts smoo from source, but Nx release loads',
273
270
  ' # @smoothbricks/cli/nx-version-actions through the built package export.',
274
- ' run: nx build @smoothbricks/cli',
271
+ ' run: nx build cli',
275
272
  ];
276
273
  case PublishWorkflowStepKind.RepairPendingReleases:
277
274
  return [
278
275
  ` - name: ${step.name}`,
279
- ' env:',
280
- ` NODE_AUTH_TOKEN: ${githubExpression('secrets.NPM_TOKEN')}`,
281
276
  ` run: smoo release repair-pending --dry-run "${githubExpression('inputs.dry_run')}"`,
282
277
  ];
283
278
  case PublishWorkflowStepKind.VersionRelease:
@@ -314,10 +309,8 @@ function yamlLinesForStep(step) {
314
309
  return [
315
310
  ` - name: ${step.name}`,
316
311
  ' # smoo packs with Bun, then publishes tarballs with npm. Existing',
317
- ' # packages use trusted publishing/OIDC; first publishes use NODE_AUTH_TOKEN',
318
- ' # because npm trust can only be configured after a package exists.',
319
- ' env:',
320
- ` NODE_AUTH_TOKEN: ${githubExpression('secrets.NPM_TOKEN')}`,
312
+ ' # packages must already exist on npm and use trusted publishing/OIDC.',
313
+ ' # Missing package names are bootstrapped locally before trust setup.',
321
314
  ` run: smoo release publish --bump "${githubExpression('inputs.bump')}" --dry-run "${githubExpression('inputs.dry_run')}"`,
322
315
  ];
323
316
  case PublishWorkflowStepKind.SaveNixDevenv:
@@ -0,0 +1,22 @@
1
+ import { type PackageJson } from '../lib/workspace.js';
2
+ export interface ToolPolicy {
3
+ isSmoothBricksCodebase: boolean;
4
+ toolingPackageName: string;
5
+ cliDependencyRange: string;
6
+ }
7
+ export interface ToolContext {
8
+ rootPackage: PackageJson | null;
9
+ policy: ToolPolicy;
10
+ }
11
+ export declare function applyToolConfigDefaults(root: string): Promise<void>;
12
+ export declare function validateToolConfig(root: string): number;
13
+ export declare function applyRootDevDependencyDefaults(root: string, context: ToolContext): Promise<void>;
14
+ export declare function applyToolingPackageDefaults(root: string, policy: ToolPolicy): void;
15
+ export declare function applyToolingWorkspaceDefault(root: string): void;
16
+ export declare function applyDevenvPackageDefaults(root: string): void;
17
+ export declare function validateRootDevDependencies(policy: ToolPolicy, rootPackage: PackageJson | null): number;
18
+ export declare function validateToolingPackage(root: string, policy: ToolPolicy): number;
19
+ export declare function validateToolingWorkspace(rootPackage: PackageJson | null): number;
20
+ export declare function validateDevenvPackages(root: string): number;
21
+ export declare function readToolContext(root: string): ToolContext;
22
+ //# sourceMappingURL=tool-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-validation.d.ts","sourceRoot":"","sources":["../../src/monorepo/tool-validation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,qBAAqB,CAAC;AAU9E,MAAM,WAAW,UAAU;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,UAAU,CAAC;CACpB;AA8BD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED,wBAAsB,8BAA8B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtG;AAoCD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAkBlF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAY/D;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA0B7D;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAyBvG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAoB/E;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAWhF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmB3D;AA0DD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAGzD"}