@codedrifters/configulator 0.0.196 → 0.0.198

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -186,11 +186,13 @@ __export(index_exports, {
186
186
  AwsDeployWorkflow: () => AwsDeployWorkflow,
187
187
  AwsDeploymentConfig: () => AwsDeploymentConfig,
188
188
  AwsDeploymentTarget: () => AwsDeploymentTarget,
189
+ AwsTeardownWorkflow: () => AwsTeardownWorkflow,
189
190
  BUILT_IN_BUNDLES: () => BUILT_IN_BUNDLES,
190
191
  CLAUDE_RULE_TARGET: () => CLAUDE_RULE_TARGET,
191
192
  COMPLETE_JOB_ID: () => COMPLETE_JOB_ID,
192
193
  DEFAULT_PRIORITY_LABELS: () => DEFAULT_PRIORITY_LABELS,
193
194
  DEFAULT_STATUS_LABELS: () => DEFAULT_STATUS_LABELS,
195
+ DEFAULT_TEARDOWN_BRANCH_PATTERNS: () => DEFAULT_TEARDOWN_BRANCH_PATTERNS,
194
196
  DEFAULT_TYPE_LABELS: () => DEFAULT_TYPE_LABELS,
195
197
  JsiiFaker: () => JsiiFaker,
196
198
  MCP_TRANSPORT: () => MCP_TRANSPORT,
@@ -204,6 +206,7 @@ __export(index_exports, {
204
206
  ROOT_CI_TASK_NAME: () => ROOT_CI_TASK_NAME,
205
207
  ROOT_TURBO_TASK_NAME: () => ROOT_TURBO_TASK_NAME,
206
208
  ResetTask: () => ResetTask,
209
+ StarlightProject: () => StarlightProject,
207
210
  TestRunner: () => TestRunner,
208
211
  TurboRepo: () => TurboRepo,
209
212
  TurboRepoTask: () => TurboRepoTask,
@@ -3053,6 +3056,15 @@ var VERSION = {
3053
3056
  * Version of Projen to use.
3054
3057
  */
3055
3058
  PROJEN_VERSION: "0.99.48",
3059
+ /**
3060
+ * Version of sharp to pin for StarlightProject (required peer for
3061
+ * Starlight's image optimization pipeline).
3062
+ */
3063
+ SHARP_VERSION: "0.34.5",
3064
+ /**
3065
+ * Version of @astrojs/starlight to pin for StarlightProject scaffolding.
3066
+ */
3067
+ STARLIGHT_VERSION: "0.38.3",
3056
3068
  /**
3057
3069
  * What version of the turborepo library should we use?
3058
3070
  */
@@ -4814,6 +4826,8 @@ var VERSION_NPM_PACKAGES = [
4814
4826
  { key: "AWS_CONSTRUCTS_VERSION", npmPackage: "constructs" },
4815
4827
  { key: "PNPM_VERSION", npmPackage: "pnpm" },
4816
4828
  { key: "PROJEN_VERSION", npmPackage: "projen" },
4829
+ { key: "SHARP_VERSION", npmPackage: "sharp" },
4830
+ { key: "STARLIGHT_VERSION", npmPackage: "@astrojs/starlight" },
4817
4831
  { key: "TURBO_VERSION", npmPackage: "turbo" },
4818
4832
  { key: "TYPES_NODE_VERSION", npmPackage: "@types/node" },
4819
4833
  { key: "VITEST_VERSION", npmPackage: "vitest" }
@@ -5914,7 +5928,7 @@ var DEFAULT_FAVICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
5914
5928
  `;
5915
5929
 
5916
5930
  // src/projects/aws-cdk-project.ts
5917
- var import_projen19 = require("projen");
5931
+ var import_projen20 = require("projen");
5918
5932
  var import_javascript5 = require("projen/lib/javascript");
5919
5933
  var import_release2 = require("projen/lib/release");
5920
5934
  var import_ts_deepmerge3 = require("ts-deepmerge");
@@ -6190,8 +6204,212 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen18.Compone
6190
6204
  }
6191
6205
  };
6192
6206
 
6207
+ // src/workflows/aws-teardown-workflow.ts
6208
+ var import_projen19 = require("projen");
6209
+ var import_github3 = require("projen/lib/github");
6210
+ var import_workflows_model6 = require("projen/lib/github/workflows-model");
6211
+ var DEFAULT_TEARDOWN_BRANCH_PATTERNS = [
6212
+ "feat/*",
6213
+ "fix/*",
6214
+ "feature/*"
6215
+ ];
6216
+ var resolveBranchPatterns = (explicit, targets) => {
6217
+ if (explicit && explicit.length > 0) {
6218
+ return [...explicit];
6219
+ }
6220
+ const derived = Array.from(
6221
+ new Set(
6222
+ targets.flatMap((target) => target.branches.map((b) => b.branch)).filter((branch) => typeof branch === "string").filter((branch) => branch.includes("*"))
6223
+ )
6224
+ );
6225
+ if (derived.length > 0) {
6226
+ return derived;
6227
+ }
6228
+ return [...DEFAULT_TEARDOWN_BRANCH_PATTERNS];
6229
+ };
6230
+ var AwsTeardownWorkflow = class extends import_projen19.Component {
6231
+ constructor(rootProject, options) {
6232
+ super(rootProject);
6233
+ this.rootProject = rootProject;
6234
+ const {
6235
+ awsDestructionTargets,
6236
+ repoTagName,
6237
+ stageTypeTagName,
6238
+ environmentTypeTagName,
6239
+ branchNameTagName,
6240
+ deleteBranchPatterns
6241
+ } = options;
6242
+ if (!repoTagName) {
6243
+ throw new Error("AwsTeardownWorkflow requires `repoTagName`");
6244
+ }
6245
+ if (!stageTypeTagName) {
6246
+ throw new Error("AwsTeardownWorkflow requires `stageTypeTagName`");
6247
+ }
6248
+ if (!environmentTypeTagName) {
6249
+ throw new Error("AwsTeardownWorkflow requires `environmentTypeTagName`");
6250
+ }
6251
+ if (!branchNameTagName) {
6252
+ throw new Error("AwsTeardownWorkflow requires `branchNameTagName`");
6253
+ }
6254
+ if (!(rootProject instanceof MonorepoProject)) {
6255
+ throw new Error(
6256
+ "AwsTeardownWorkflow requires the root project to be a MonorepoProject"
6257
+ );
6258
+ }
6259
+ const github = import_github3.GitHub.of(this.rootProject);
6260
+ if (!github) {
6261
+ throw new Error(
6262
+ "AwsTeardownWorkflow requires a GitHub component in the root project"
6263
+ );
6264
+ }
6265
+ const branchPatterns = resolveBranchPatterns(
6266
+ deleteBranchPatterns,
6267
+ awsDestructionTargets
6268
+ );
6269
+ const workflow = new import_github3.GithubWorkflow(github, "teardown-dev");
6270
+ workflow.on({
6271
+ workflowDispatch: {},
6272
+ schedule: [
6273
+ {
6274
+ cron: "32 6 * * *"
6275
+ }
6276
+ ],
6277
+ delete: {
6278
+ branches: branchPatterns
6279
+ }
6280
+ });
6281
+ awsDestructionTargets.forEach((target) => {
6282
+ const {
6283
+ awsStageType,
6284
+ deploymentTargetRole,
6285
+ account,
6286
+ region,
6287
+ ciDeploymentConfig
6288
+ } = target;
6289
+ const { roleArn } = ciDeploymentConfig ?? {};
6290
+ workflow.addJob(
6291
+ `teardown-${awsStageType}-${deploymentTargetRole}-${account}-${region}`.toLowerCase(),
6292
+ {
6293
+ name: `Teardown Stacks in ${awsStageType}/${deploymentTargetRole}/${account}/${region}`,
6294
+ runsOn: ["ubuntu-latest"],
6295
+ permissions: {
6296
+ contents: import_workflows_model6.JobPermission.READ,
6297
+ idToken: import_workflows_model6.JobPermission.WRITE
6298
+ },
6299
+ env: {
6300
+ REPO: "${{ github.repository }}",
6301
+ REGIONS: [region].join(" ")
6302
+ },
6303
+ steps: [
6304
+ {
6305
+ name: `AWS Creds ${account}/${region}`,
6306
+ uses: "aws-actions/configure-aws-credentials@v6",
6307
+ with: {
6308
+ "role-to-assume": roleArn,
6309
+ "aws-region": region,
6310
+ "role-duration-seconds": 900
6311
+ }
6312
+ },
6313
+ {
6314
+ name: "Fetch All Branches",
6315
+ id: "fetch_branches",
6316
+ uses: "actions/github-script@v9",
6317
+ with: {
6318
+ script: [
6319
+ "const all = await github.paginate(github.rest.repos.listBranches, {",
6320
+ " owner: context.repo.owner,",
6321
+ " repo: context.repo.repo,",
6322
+ " per_page: 100",
6323
+ "});",
6324
+ "const names = all.map(b => b.name);",
6325
+ "console.log(`Found branches: ${names}`);",
6326
+ 'core.setOutput("json", JSON.stringify(names));'
6327
+ ].join("\n")
6328
+ }
6329
+ },
6330
+ {
6331
+ name: "Save Branches to File",
6332
+ run: [
6333
+ 'echo "Saving branches to file"',
6334
+ "echo '${{ steps.fetch_branches.outputs.json }}' | jq -r '.[]' | sort -u > branches.txt",
6335
+ 'echo "Branches:"',
6336
+ "cat branches.txt"
6337
+ ].join("\n")
6338
+ },
6339
+ {
6340
+ name: "Find Stacks by Tag",
6341
+ id: "find_stacks",
6342
+ run: [
6343
+ "set -euo pipefail",
6344
+ ": > candidates.txt # columns: arn region branchTag",
6345
+ "# Build tag filters",
6346
+ `TAG_FILTERS=( "Key=${repoTagName},Values=$REPO" )`,
6347
+ `TAG_FILTERS+=( "Key=${stageTypeTagName},Values=${awsStageType}" )`,
6348
+ `TAG_FILTERS+=( "Key=${environmentTypeTagName},Values=${deploymentTargetRole}" )`,
6349
+ "for r in $REGIONS; do",
6350
+ ` echo "Scanning region: $r"`,
6351
+ " aws resourcegroupstaggingapi get-resources \\",
6352
+ ' --region "$r" \\',
6353
+ ' --resource-type-filters "cloudformation:stack" \\',
6354
+ ' --tag-filters "${TAG_FILTERS[@]}" \\',
6355
+ ` | jq -r --arg r "$r" '`,
6356
+ " .ResourceTagMappingList[]",
6357
+ " | . as $res",
6358
+ ` | ($res.Tags[] | select(.Key=="${branchNameTagName}") | .Value) as $branch`,
6359
+ ' | [$res.ResourceARN, $r, ($branch // "")]',
6360
+ " | @tsv",
6361
+ " ' >> candidates.txt",
6362
+ "done",
6363
+ "echo 'Tagged stacks:'",
6364
+ `(echo -e "ARN\\tREGION\\tBRANCH"; cat candidates.txt) | column -t -s $'\\t'`
6365
+ ].join("\n")
6366
+ },
6367
+ {
6368
+ name: "Determine Orphan Stacks (No Matching Branch)",
6369
+ run: [
6370
+ "set -euo pipefail",
6371
+ ": > orphans.txt # arn region branch",
6372
+ "while IFS=$'\\t' read -r arn region branch; do",
6373
+ ' [ -z "$arn" ] && continue',
6374
+ ' if [ -z "$branch" ]; then',
6375
+ " # If no Branch tag, treat as not-a-preview; skip",
6376
+ " continue",
6377
+ " fi",
6378
+ ' if ! grep -Fxq "$branch" branches.txt; then',
6379
+ ' echo -e "$arn\\t$region\\t$branch" >> orphans.txt',
6380
+ " fi",
6381
+ "done < candidates.txt",
6382
+ "",
6383
+ "if [ -s orphans.txt ]; then",
6384
+ ' echo "Orphan stacks (no matching branch):"',
6385
+ ` (echo -e "ARN\\tREGION\\tBRANCH"; cat orphans.txt) | column -t -s $'\\t'`,
6386
+ "else",
6387
+ ' echo "No orphan stacks found."',
6388
+ "fi"
6389
+ ].join("\n")
6390
+ },
6391
+ {
6392
+ name: "Delete Orphan Stacks",
6393
+ if: "hashFiles('orphans.txt') != ''",
6394
+ run: [
6395
+ "set -euo pipefail",
6396
+ "while IFS=$'\\t' read -r arn region branch; do",
6397
+ ' [ -z "$arn" ] && continue',
6398
+ ` stack_name=$(cut -d'/' -f2 <<<"$arn")`,
6399
+ ' echo "Deleting $stack_name (branch=$branch) in $region"',
6400
+ ' aws cloudformation delete-stack --region "$region" --stack-name "$stack_name" || true',
6401
+ "done < orphans.txt"
6402
+ ].join("\n")
6403
+ }
6404
+ ]
6405
+ }
6406
+ );
6407
+ });
6408
+ }
6409
+ };
6410
+
6193
6411
  // src/projects/aws-cdk-project.ts
6194
- var AwsCdkProject = class extends import_projen19.awscdk.AwsCdkTypeScriptApp {
6412
+ var AwsCdkProject = class extends import_projen20.awscdk.AwsCdkTypeScriptApp {
6195
6413
  constructor(userOptions) {
6196
6414
  if (!(userOptions.parent instanceof MonorepoProject)) {
6197
6415
  throw new Error(
@@ -6322,6 +6540,9 @@ var AwsCdkProject = class extends import_projen19.awscdk.AwsCdkTypeScriptApp {
6322
6540
  deployWorkflows.forEach(
6323
6541
  (workflowOptions) => new AwsDeployWorkflow(this, workflowOptions)
6324
6542
  );
6543
+ if (options.teardownWorkflow) {
6544
+ new AwsTeardownWorkflow(parent, options.teardownWorkflow);
6545
+ }
6325
6546
  const turboActive = TurboRepo.of(parent) !== void 0;
6326
6547
  if (turboActive) {
6327
6548
  const turbo = new TurboRepo(this);
@@ -6380,11 +6601,96 @@ var AwsCdkProject = class extends import_projen19.awscdk.AwsCdkTypeScriptApp {
6380
6601
  }
6381
6602
  };
6382
6603
 
6604
+ // src/projects/starlight-project.ts
6605
+ var import_projen21 = require("projen");
6606
+ var StarlightProject = class extends AstroProject {
6607
+ constructor(userOptions) {
6608
+ const starlightConfig = buildStarlightConfig(userOptions);
6609
+ const starlightSpec = {
6610
+ name: "starlight",
6611
+ importPath: "@astrojs/starlight",
6612
+ defaultImport: true,
6613
+ args: JSON.stringify(starlightConfig, null, 2)
6614
+ };
6615
+ const mergedOptions = {
6616
+ ...userOptions,
6617
+ integrations: [starlightSpec, ...userOptions.integrations ?? []],
6618
+ depsUpgradeOptions: {
6619
+ ...userOptions.depsUpgradeOptions,
6620
+ exclude: [
6621
+ ...userOptions.depsUpgradeOptions?.exclude ?? [],
6622
+ "@astrojs/starlight",
6623
+ "sharp"
6624
+ ]
6625
+ }
6626
+ };
6627
+ super(mergedOptions);
6628
+ const starlightVersion = userOptions.starlightVersion ?? VERSION.STARLIGHT_VERSION;
6629
+ const sharpVersion = userOptions.sharpVersion ?? VERSION.SHARP_VERSION;
6630
+ this.addDeps(
6631
+ `@astrojs/starlight@${starlightVersion}`,
6632
+ `sharp@${sharpVersion}`
6633
+ );
6634
+ const turbo = TurboRepo.of(this);
6635
+ if (turbo?.compileTask) {
6636
+ turbo.compileTask.inputs.push("src/content/**");
6637
+ }
6638
+ if (userOptions.sampleContent === true) {
6639
+ new import_projen21.SampleFile(this, "src/content/docs/index.mdx", {
6640
+ contents: DEFAULT_INDEX_MDX
6641
+ });
6642
+ new import_projen21.SampleFile(this, "src/content/config.ts", {
6643
+ contents: DEFAULT_CONTENT_CONFIG_TS
6644
+ });
6645
+ }
6646
+ }
6647
+ };
6648
+ function buildStarlightConfig(options) {
6649
+ const config = {
6650
+ title: options.starlightTitle
6651
+ };
6652
+ if (options.starlightDescription !== void 0) {
6653
+ config.description = options.starlightDescription;
6654
+ }
6655
+ if (options.social !== void 0) {
6656
+ config.social = options.social;
6657
+ }
6658
+ if (options.sidebar !== void 0) {
6659
+ config.sidebar = options.sidebar;
6660
+ }
6661
+ if (options.customCss !== void 0) {
6662
+ config.customCss = options.customCss;
6663
+ }
6664
+ if (options.logo !== void 0) {
6665
+ config.logo = options.logo;
6666
+ }
6667
+ if (options.editLink !== void 0) {
6668
+ config.editLink = options.editLink;
6669
+ }
6670
+ return config;
6671
+ }
6672
+ var DEFAULT_INDEX_MDX = `---
6673
+ title: Welcome
6674
+ description: Starlight-powered documentation site.
6675
+ ---
6676
+
6677
+ # Hello, Starlight!
6678
+
6679
+ Edit \`src/content/docs/index.mdx\` to replace this page.
6680
+ `;
6681
+ var DEFAULT_CONTENT_CONFIG_TS = `import { defineCollection } from "astro:content";
6682
+ import { docsSchema } from "@astrojs/starlight/schema";
6683
+
6684
+ export const collections = {
6685
+ docs: defineCollection({ schema: docsSchema() }),
6686
+ };
6687
+ `;
6688
+
6383
6689
  // src/typescript/typescript-config.ts
6384
6690
  var import_node_path2 = require("path");
6385
- var import_projen20 = require("projen");
6691
+ var import_projen22 = require("projen");
6386
6692
  var import_path2 = require("projen/lib/util/path");
6387
- var TypeScriptConfig = class extends import_projen20.Component {
6693
+ var TypeScriptConfig = class extends import_projen22.Component {
6388
6694
  constructor(project) {
6389
6695
  super(project);
6390
6696
  let tsPaths = {};
@@ -6422,11 +6728,13 @@ var TypeScriptConfig = class extends import_projen20.Component {
6422
6728
  AwsDeployWorkflow,
6423
6729
  AwsDeploymentConfig,
6424
6730
  AwsDeploymentTarget,
6731
+ AwsTeardownWorkflow,
6425
6732
  BUILT_IN_BUNDLES,
6426
6733
  CLAUDE_RULE_TARGET,
6427
6734
  COMPLETE_JOB_ID,
6428
6735
  DEFAULT_PRIORITY_LABELS,
6429
6736
  DEFAULT_STATUS_LABELS,
6737
+ DEFAULT_TEARDOWN_BRANCH_PATTERNS,
6430
6738
  DEFAULT_TYPE_LABELS,
6431
6739
  JsiiFaker,
6432
6740
  MCP_TRANSPORT,
@@ -6440,6 +6748,7 @@ var TypeScriptConfig = class extends import_projen20.Component {
6440
6748
  ROOT_CI_TASK_NAME,
6441
6749
  ROOT_TURBO_TASK_NAME,
6442
6750
  ResetTask,
6751
+ StarlightProject,
6443
6752
  TestRunner,
6444
6753
  TurboRepo,
6445
6754
  TurboRepoTask,