@codedrifters/configulator 0.0.306 → 0.0.308

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
@@ -273,6 +273,7 @@ __export(index_exports, {
273
273
  REQUIREMENTS_WRITER_PATHS: () => REQUIREMENTS_WRITER_PATHS,
274
274
  ROOT_CI_TASK_NAME: () => ROOT_CI_TASK_NAME,
275
275
  ROOT_TURBO_TASK_NAME: () => ROOT_TURBO_TASK_NAME,
276
+ ReactViteSiteProject: () => ReactViteSiteProject,
276
277
  ResetTask: () => ResetTask,
277
278
  SCHEDULED_TASK_MODEL_VALUES: () => SCHEDULED_TASK_MODEL_VALUES,
278
279
  SCOPE_CLASS_VALUES: () => SCOPE_CLASS_VALUES,
@@ -299,6 +300,8 @@ __export(index_exports, {
299
300
  Vitest: () => Vitest,
300
301
  addApproveMergeUpgradeWorkflow: () => addApproveMergeUpgradeWorkflow,
301
302
  addBuildCompleteJob: () => addBuildCompleteJob,
303
+ addPlaywright: () => addPlaywright,
304
+ addStorybook: () => addStorybook,
302
305
  addSyncLabelsWorkflow: () => addSyncLabelsWorkflow,
303
306
  agendaBundle: () => agendaBundle,
304
307
  analyzeTsDocCoverage: () => analyzeTsDocCoverage,
@@ -426,6 +429,7 @@ __export(index_exports, {
426
429
  resolveOutdirFromPackageName: () => resolveOutdirFromPackageName,
427
430
  resolveOverrideForLabels: () => resolveOverrideForLabels,
428
431
  resolveProgressFiles: () => resolveProgressFiles,
432
+ resolveReactViteSiteProjectOutdir: () => resolveReactViteSiteProjectOutdir,
429
433
  resolveRunRatio: () => resolveRunRatio,
430
434
  resolveScheduledTasks: () => resolveScheduledTasks,
431
435
  resolveScopeGate: () => resolveScopeGate,
@@ -18626,7 +18630,39 @@ var prReviewBundle = {
18626
18630
  }
18627
18631
  ],
18628
18632
  skills: [reviewPrSkill, reviewPrsSkill],
18629
- subAgents: [prReviewerSubAgent]
18633
+ subAgents: [prReviewerSubAgent],
18634
+ labels: [
18635
+ {
18636
+ name: "type:pr-review",
18637
+ color: "5319E7",
18638
+ description: "PR review tasks"
18639
+ },
18640
+ {
18641
+ name: "origin:issue-worker",
18642
+ color: "5319E7",
18643
+ description: "PR opened by the issue-worker agent"
18644
+ },
18645
+ {
18646
+ name: "review:auto-ok",
18647
+ color: "0E8A16",
18648
+ description: "Force auto-merge regardless of policy"
18649
+ },
18650
+ {
18651
+ name: "review:human-required",
18652
+ color: "D93F0B",
18653
+ description: "Force human review regardless of policy"
18654
+ },
18655
+ {
18656
+ name: "review:awaiting-human",
18657
+ color: "FBCA04",
18658
+ description: "Reviewer handed off; awaiting human merge decision"
18659
+ },
18660
+ {
18661
+ name: "review:fixing",
18662
+ color: "D4C5F9",
18663
+ description: "Short-lived lease while issue-worker applies feedback fixes"
18664
+ }
18665
+ ]
18630
18666
  };
18631
18667
 
18632
18668
  // src/agent/bundles/projen.ts
@@ -33009,8 +33045,88 @@ var JsiiFaker = class _JsiiFaker extends import_projen13.Component {
33009
33045
  }
33010
33046
  };
33011
33047
 
33048
+ // src/projects/add-playwright.ts
33049
+ var import_projen14 = require("projen");
33050
+ function addPlaywright(project) {
33051
+ project.addDevDeps("@playwright/test");
33052
+ project.tasks.addTask("e2e:install", {
33053
+ description: "Install Playwright browsers",
33054
+ steps: [{ exec: "npx playwright install --with-deps" }]
33055
+ });
33056
+ project.tasks.addTask("e2e", {
33057
+ description: "Run Playwright E2E tests (headless)",
33058
+ steps: [{ exec: "npx playwright test" }]
33059
+ });
33060
+ project.tasks.addTask("e2e:ui", {
33061
+ description: "Run Playwright in UI mode",
33062
+ steps: [{ exec: "npx playwright test --ui" }]
33063
+ });
33064
+ project.tasks.addTask("e2e:report", {
33065
+ description: "Open last HTML report",
33066
+ steps: [{ exec: "npx playwright show-report" }]
33067
+ });
33068
+ project.setScript("e2e:install", "npx projen e2e:install");
33069
+ project.setScript("e2e", "npx projen e2e");
33070
+ project.setScript("e2e:ui", "npx projen e2e:ui");
33071
+ project.setScript("e2e:report", "npx projen e2e:report");
33072
+ new import_projen14.SampleFile(project, "playwright.config.ts", {
33073
+ contents: `import { defineConfig, devices } from '@playwright/test';
33074
+
33075
+ export default defineConfig({
33076
+ testDir: './tests',
33077
+ reporter: [['html', { open: 'never' }]],
33078
+ use: {
33079
+ baseURL: process.env.PLAYWRIGHT_BASE_URL || 'http://localhost:5173',
33080
+ trace: 'on-first-retry',
33081
+ },
33082
+ projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
33083
+ });
33084
+ `
33085
+ });
33086
+ project.gitignore.addPatterns("test-results/", "playwright-report/");
33087
+ }
33088
+
33089
+ // src/projects/add-storybook.ts
33090
+ var import_projen15 = require("projen");
33091
+ function addStorybook(project, options = {}) {
33092
+ const withDocs = options.withDocs ?? true;
33093
+ project.addDevDeps(
33094
+ "storybook",
33095
+ "@storybook/react@^9",
33096
+ "@storybook/react-vite@^9",
33097
+ ...withDocs ? ["@storybook/addon-docs@^9"] : []
33098
+ );
33099
+ project.tasks.addTask("storybook", {
33100
+ description: "Run Storybook (Vite)",
33101
+ steps: [{ exec: "storybook dev -p 6006" }]
33102
+ });
33103
+ project.tasks.addTask("build-storybook", {
33104
+ description: "Build static Storybook",
33105
+ steps: [{ exec: "storybook build" }]
33106
+ });
33107
+ project.setScript("storybook", "npx projen storybook");
33108
+ project.setScript("build-storybook", "npx projen build-storybook");
33109
+ new import_projen15.SampleFile(project, ".storybook/main.ts", {
33110
+ contents: `import type { StorybookConfig } from '@storybook/react-vite';
33111
+
33112
+ const config: StorybookConfig = {
33113
+ stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
33114
+ addons: [${withDocs ? `'@storybook/addon-docs'` : ""}],
33115
+ framework: { name: '@storybook/react-vite', options: {} },
33116
+ };
33117
+ export default config;
33118
+ `
33119
+ });
33120
+ new import_projen15.SampleFile(project, ".storybook/preview.ts", {
33121
+ contents: `import '../src/index.css';
33122
+ const preview = { parameters: { controls: { expanded: true } } };
33123
+ export default preview;
33124
+ `
33125
+ });
33126
+ }
33127
+
33012
33128
  // src/projects/astro-project.ts
33013
- var import_projen19 = require("projen");
33129
+ var import_projen21 = require("projen");
33014
33130
  var import_ts_deepmerge3 = require("ts-deepmerge");
33015
33131
 
33016
33132
  // src/projects/monorepo-layout.ts
@@ -33029,6 +33145,7 @@ var LAYOUT_ROOT_BY_PROJECT_TYPE = {
33029
33145
  TypeScriptProject: MONOREPO_LAYOUT.PACKAGES,
33030
33146
  AwsCdkProject: MONOREPO_LAYOUT.APPS,
33031
33147
  AstroProject: MONOREPO_LAYOUT.SITES,
33148
+ ReactViteSiteProject: MONOREPO_LAYOUT.SITES,
33032
33149
  StarlightProject: MONOREPO_LAYOUT.DOCS
33033
33150
  };
33034
33151
  function validateMonorepoLayout(root) {
@@ -33152,9 +33269,12 @@ function resolveAwsCdkProjectOutdir(packageName) {
33152
33269
  function resolveAstroProjectOutdir(packageName) {
33153
33270
  return resolveOutdirFromPackageName(packageName, MONOREPO_LAYOUT.SITES);
33154
33271
  }
33272
+ function resolveReactViteSiteProjectOutdir(packageName) {
33273
+ return resolveOutdirFromPackageName(packageName, MONOREPO_LAYOUT.SITES);
33274
+ }
33155
33275
 
33156
33276
  // src/projects/typescript-project.ts
33157
- var import_projen18 = require("projen");
33277
+ var import_projen20 = require("projen");
33158
33278
  var import_javascript4 = require("projen/lib/javascript");
33159
33279
  var import_release = require("projen/lib/release");
33160
33280
  var import_ts_deepmerge2 = require("ts-deepmerge");
@@ -33166,9 +33286,9 @@ var import_typescript3 = require("projen/lib/typescript");
33166
33286
  var import_ts_deepmerge = require("ts-deepmerge");
33167
33287
 
33168
33288
  // src/projects/nvmrc.ts
33169
- var import_projen14 = require("projen");
33289
+ var import_projen16 = require("projen");
33170
33290
  var import_textfile5 = require("projen/lib/textfile");
33171
- var Nvmrc = class extends import_projen14.Component {
33291
+ var Nvmrc = class extends import_projen16.Component {
33172
33292
  constructor(project) {
33173
33293
  super(project);
33174
33294
  new import_textfile5.TextFile(project, ".nvmrc", {
@@ -33181,8 +33301,8 @@ var Nvmrc = class extends import_projen14.Component {
33181
33301
  };
33182
33302
 
33183
33303
  // src/tasks/reset-task.ts
33184
- var import_projen15 = require("projen");
33185
- var ResetTask = class _ResetTask extends import_projen15.Component {
33304
+ var import_projen17 = require("projen");
33305
+ var ResetTask = class _ResetTask extends import_projen17.Component {
33186
33306
  constructor(project, options = {}) {
33187
33307
  super(project);
33188
33308
  this.project = project;
@@ -33255,12 +33375,12 @@ var ResetTask = class _ResetTask extends import_projen15.Component {
33255
33375
  };
33256
33376
 
33257
33377
  // src/vscode/vscode.ts
33258
- var import_projen16 = require("projen");
33259
- var VSCodeConfig = class extends import_projen16.Component {
33378
+ var import_projen18 = require("projen");
33379
+ var VSCodeConfig = class extends import_projen18.Component {
33260
33380
  constructor(project) {
33261
33381
  super(project);
33262
- const vsConfig = new import_projen16.vscode.VsCode(project);
33263
- const vsSettings = new import_projen16.vscode.VsCodeSettings(vsConfig);
33382
+ const vsConfig = new import_projen18.vscode.VsCode(project);
33383
+ const vsSettings = new import_projen18.vscode.VsCodeSettings(vsConfig);
33264
33384
  vsSettings.addSetting("editor.tabSize", 2);
33265
33385
  vsSettings.addSetting("editor.detectIndentation", false);
33266
33386
  vsSettings.addSetting("editor.bracketPairColorization.enabled", true);
@@ -33540,7 +33660,7 @@ function patchStepArray2(steps, pinned) {
33540
33660
  }
33541
33661
 
33542
33662
  // src/workflows/sync-labels.ts
33543
- var import_projen17 = require("projen");
33663
+ var import_projen19 = require("projen");
33544
33664
  var import_workflows_model4 = require("projen/lib/github/workflows-model");
33545
33665
  var DEFAULT_STATUS_LABELS = [
33546
33666
  {
@@ -33748,10 +33868,10 @@ ${offenders}`
33748
33868
  }
33749
33869
  });
33750
33870
  }
33751
- var LabelsFile = class extends import_projen17.Component {
33871
+ var LabelsFile = class extends import_projen19.Component {
33752
33872
  constructor(project, labels) {
33753
33873
  super(project);
33754
- new import_projen17.YamlFile(project, LABELS_CONFIG_PATH, {
33874
+ new import_projen19.YamlFile(project, LABELS_CONFIG_PATH, {
33755
33875
  obj: labels.map((l) => ({
33756
33876
  name: l.name,
33757
33877
  color: l.color,
@@ -34144,7 +34264,7 @@ var TestRunner = {
34144
34264
  JEST: "jest",
34145
34265
  VITEST: "vitest"
34146
34266
  };
34147
- var TypeScriptProject = class extends import_projen18.typescript.TypeScriptProject {
34267
+ var TypeScriptProject = class extends import_projen20.typescript.TypeScriptProject {
34148
34268
  constructor(userOptions) {
34149
34269
  if (!(userOptions.parent instanceof MonorepoProject)) {
34150
34270
  throw new Error(
@@ -34454,10 +34574,10 @@ var AstroProject = class extends TypeScriptProject {
34454
34574
  adapter: options.adapter
34455
34575
  });
34456
34576
  if (options.sampleCode === true) {
34457
- new import_projen19.SampleFile(this, "src/pages/index.astro", {
34577
+ new import_projen21.SampleFile(this, "src/pages/index.astro", {
34458
34578
  contents: DEFAULT_INDEX_ASTRO
34459
34579
  });
34460
- new import_projen19.SampleFile(this, "public/favicon.svg", {
34580
+ new import_projen21.SampleFile(this, "public/favicon.svg", {
34461
34581
  contents: DEFAULT_FAVICON_SVG
34462
34582
  });
34463
34583
  }
@@ -34482,19 +34602,19 @@ var DEFAULT_FAVICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
34482
34602
  `;
34483
34603
 
34484
34604
  // src/projects/aws-cdk-project.ts
34485
- var import_projen22 = require("projen");
34605
+ var import_projen24 = require("projen");
34486
34606
  var import_javascript5 = require("projen/lib/javascript");
34487
34607
  var import_release2 = require("projen/lib/release");
34488
34608
  var import_ts_deepmerge4 = require("ts-deepmerge");
34489
34609
 
34490
34610
  // src/workflows/aws-deploy-workflow.ts
34491
34611
  var import_utils11 = __toESM(require_lib());
34492
- var import_projen20 = require("projen");
34612
+ var import_projen22 = require("projen");
34493
34613
  var import_build = require("projen/lib/build");
34494
34614
  var import_github5 = require("projen/lib/github");
34495
34615
  var import_workflows_model5 = require("projen/lib/github/workflows-model");
34496
34616
  var PROD_DEPLOY_NAME = "prod-deploy";
34497
- var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen20.Component {
34617
+ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen22.Component {
34498
34618
  constructor(project, options = {}) {
34499
34619
  super(project);
34500
34620
  this.project = project;
@@ -34758,7 +34878,7 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen20.Compone
34758
34878
  };
34759
34879
 
34760
34880
  // src/workflows/aws-teardown-workflow.ts
34761
- var import_projen21 = require("projen");
34881
+ var import_projen23 = require("projen");
34762
34882
  var import_github6 = require("projen/lib/github");
34763
34883
  var import_workflows_model6 = require("projen/lib/github/workflows-model");
34764
34884
  var DEFAULT_TEARDOWN_BRANCH_PATTERNS = [
@@ -34780,7 +34900,7 @@ var resolveBranchPatterns = (explicit, targets) => {
34780
34900
  }
34781
34901
  return [...DEFAULT_TEARDOWN_BRANCH_PATTERNS];
34782
34902
  };
34783
- var AwsTeardownWorkflow = class extends import_projen21.Component {
34903
+ var AwsTeardownWorkflow = class extends import_projen23.Component {
34784
34904
  constructor(rootProject, options) {
34785
34905
  super(rootProject);
34786
34906
  this.rootProject = rootProject;
@@ -34962,7 +35082,7 @@ var AwsTeardownWorkflow = class extends import_projen21.Component {
34962
35082
  };
34963
35083
 
34964
35084
  // src/projects/aws-cdk-project.ts
34965
- var AwsCdkProject = class extends import_projen22.awscdk.AwsCdkTypeScriptApp {
35085
+ var AwsCdkProject = class extends import_projen24.awscdk.AwsCdkTypeScriptApp {
34966
35086
  constructor(userOptions) {
34967
35087
  if (!(userOptions.parent instanceof MonorepoProject)) {
34968
35088
  throw new Error(
@@ -35158,8 +35278,305 @@ var AwsCdkProject = class extends import_projen22.awscdk.AwsCdkTypeScriptApp {
35158
35278
  }
35159
35279
  };
35160
35280
 
35281
+ // src/projects/react-vite-site-project.ts
35282
+ var import_projen25 = require("projen");
35283
+ var import_ts_deepmerge5 = require("ts-deepmerge");
35284
+ var ReactViteSiteProject = class extends TypeScriptProject {
35285
+ constructor(userOptions) {
35286
+ const resolvedOutdir = userOptions.outdir ?? resolveReactViteSiteProjectOutdir(
35287
+ userOptions.packageName ?? userOptions.name
35288
+ );
35289
+ const defaultOptions = {
35290
+ testRunner: TestRunner.VITEST,
35291
+ apiExtractor: false,
35292
+ // ESLint inherited from TypeScriptProject lints `src` by default;
35293
+ // skip projen's `.projenrc.ts` lint pass since downstream sites
35294
+ // configure projen through their own root project.
35295
+ eslintOptions: {
35296
+ dirs: ["src"],
35297
+ lintProjenRc: false
35298
+ },
35299
+ // VSCode workspace defaults (Prettier formatter, ESLint on save)
35300
+ // need a project-level `.vscode/` folder. The inherited
35301
+ // TypeScriptProject does not enable it on sub-projects by
35302
+ // default; flip it on so the React-site VSCode wiring below
35303
+ // actually renders.
35304
+ vscode: true,
35305
+ tsconfig: {
35306
+ compilerOptions: {
35307
+ declaration: false
35308
+ }
35309
+ }
35310
+ };
35311
+ const merged = (0, import_ts_deepmerge5.merge)(
35312
+ defaultOptions,
35313
+ userOptions
35314
+ );
35315
+ const options = {
35316
+ ...merged,
35317
+ outdir: resolvedOutdir
35318
+ };
35319
+ super(options);
35320
+ this.package.addField("type", "module");
35321
+ new import_projen25.TextFile(this, ".nvmrc", { lines: ["v24.11.0"] });
35322
+ this.tsconfig?.file.addOverride("compilerOptions.target", "ES2020");
35323
+ this.tsconfig?.file.addOverride("compilerOptions.lib", [
35324
+ "ES2020",
35325
+ "DOM",
35326
+ "DOM.Iterable"
35327
+ ]);
35328
+ this.tsconfig?.file.addOverride("compilerOptions.module", "ESNext");
35329
+ this.tsconfig?.file.addOverride(
35330
+ "compilerOptions.moduleResolution",
35331
+ "bundler"
35332
+ );
35333
+ this.tsconfig?.file.addOverride("compilerOptions.jsx", "react-jsxdev");
35334
+ this.tsconfig?.file.addOverride("compilerOptions.noEmit", true);
35335
+ this.tsconfig?.file.addOverride("compilerOptions.skipLibCheck", true);
35336
+ this.tsconfig?.file.addOverride("compilerOptions.strict", true);
35337
+ this.tsconfig?.file.addOverride("compilerOptions.resolveJsonModule", true);
35338
+ this.tsconfig?.file.addOverride("compilerOptions.declaration", false);
35339
+ this.tsconfig?.file.addOverride("compilerOptions.paths", {
35340
+ "@/*": ["./src/*"]
35341
+ });
35342
+ this.tsconfig?.file.addOverride("include", ["src"]);
35343
+ this.tsconfigDev?.file.addOverride("compilerOptions.types", [
35344
+ "vitest/globals",
35345
+ "vite/client"
35346
+ ]);
35347
+ this.tsconfigDev?.file.addOverride("include", [
35348
+ "src",
35349
+ "tests",
35350
+ "**/*.test.ts",
35351
+ "**/*.test.tsx",
35352
+ "**/*.spec.ts",
35353
+ "**/*.spec.tsx",
35354
+ "vitest.config.ts"
35355
+ ]);
35356
+ this.tsconfigDev?.file.addOverride("exclude", [
35357
+ "node_modules",
35358
+ "dist",
35359
+ "build",
35360
+ ".turbo"
35361
+ ]);
35362
+ new import_projen25.SampleFile(this, "vite.config.ts", {
35363
+ contents: `import { defineConfig } from 'vite';
35364
+ import react from '@vitejs/plugin-react';
35365
+ import tailwindcss from '@tailwindcss/vite';
35366
+ import path from 'path';
35367
+
35368
+ export default defineConfig({
35369
+ plugins: [tailwindcss(), react()],
35370
+ resolve: { alias: { '@': path.resolve(__dirname, 'src') } },
35371
+ });
35372
+ `
35373
+ });
35374
+ if (options.testRunner !== TestRunner.JEST) {
35375
+ this.tryRemoveFile("vitest.config.ts");
35376
+ new import_projen25.SampleFile(this, "vitest.config.ts", {
35377
+ contents: `import { defineConfig, mergeConfig } from 'vitest/config';
35378
+ import react from '@vitejs/plugin-react';
35379
+ import viteConfig from './vite.config';
35380
+
35381
+ export default mergeConfig(
35382
+ viteConfig,
35383
+ defineConfig({
35384
+ plugins: [react()],
35385
+ test: {
35386
+ environment: 'jsdom',
35387
+ globals: true,
35388
+ setupFiles: ['./src/setupTests.ts'],
35389
+ passWithNoTests: true,
35390
+ },
35391
+ })
35392
+ );
35393
+ `
35394
+ });
35395
+ }
35396
+ this.compileTask.reset();
35397
+ this.compileTask.exec("vite build");
35398
+ this.packageTask.reset();
35399
+ this.tasks.tryFind("watch")?.reset("vite");
35400
+ if (!this.tasks.tryFind("dev")) {
35401
+ this.addTask("dev", {
35402
+ description: "Start the Vite dev server",
35403
+ exec: "vite",
35404
+ receiveArgs: true
35405
+ });
35406
+ }
35407
+ if (!this.tasks.tryFind("preview")) {
35408
+ this.addTask("preview", {
35409
+ description: "Preview the built site locally",
35410
+ exec: "vite preview",
35411
+ receiveArgs: true
35412
+ });
35413
+ }
35414
+ this.addDeps("react", "react-dom", "react-router-dom");
35415
+ this.addDevDeps(
35416
+ "vite",
35417
+ "@vitejs/plugin-react",
35418
+ "@tailwindcss/vite",
35419
+ "tailwindcss",
35420
+ "jsdom",
35421
+ "@testing-library/react",
35422
+ "@testing-library/jest-dom",
35423
+ "@testing-library/user-event",
35424
+ "@types/react",
35425
+ "@types/react-dom",
35426
+ "eslint-plugin-react",
35427
+ "eslint-plugin-react-hooks"
35428
+ );
35429
+ this.eslint?.addExtends("plugin:react/recommended");
35430
+ this.eslint?.addExtends("plugin:react/jsx-runtime");
35431
+ this.eslint?.addExtends("plugin:react-hooks/recommended");
35432
+ this.eslint?.addOverride({
35433
+ files: ["**/*.{tsx,jsx}"],
35434
+ // Projen's ESLint override type does not include `settings`, but
35435
+ // `settings` is a valid ESLint override key. Cast to `any` so the
35436
+ // generated `.eslintrc.json` carries the React-version detection
35437
+ // settings on the JSX glob.
35438
+ settings: {
35439
+ react: {
35440
+ version: "detect"
35441
+ }
35442
+ }
35443
+ });
35444
+ this.eslint?.addRules({
35445
+ // We use TypeScript; prop-types are unnecessary.
35446
+ "react/prop-types": "off",
35447
+ // New JSX transform — React no longer needs to be in scope.
35448
+ "react/react-in-jsx-scope": "off"
35449
+ });
35450
+ this.eslint?.addOverride({
35451
+ files: [
35452
+ "**/*.{test,spec}.ts",
35453
+ "**/*.{test,spec}.tsx",
35454
+ "**/__tests__/**",
35455
+ "src/setupTests.ts"
35456
+ ],
35457
+ rules: {
35458
+ "import/no-extraneous-dependencies": [
35459
+ "error",
35460
+ { devDependencies: true }
35461
+ ]
35462
+ }
35463
+ });
35464
+ this.vscode?.settings.addSettings({
35465
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
35466
+ "editor.formatOnSave": true,
35467
+ // Prettier must format the whole file; "modifications" mode is
35468
+ // known to mis-merge ranges with Prettier and can corrupt saves.
35469
+ "editor.formatOnSaveMode": "file",
35470
+ "prettier.requireConfig": true,
35471
+ "eslint.useFlatConfig": false,
35472
+ "eslint.workingDirectories": [{ directory: ".", changeProcessCWD: true }],
35473
+ // Prettier is the default formatter; ESLint's fixAll must not
35474
+ // re-apply prettier/prettier (would double-format).
35475
+ "eslint.codeActionsOnSave.rules": ["!prettier/prettier", "*"],
35476
+ "eslint.format.enable": false,
35477
+ "[typescript]": {
35478
+ "editor.codeActionsOnSave": {
35479
+ "source.fixAll.eslint": "always",
35480
+ "source.organizeImports": "always"
35481
+ }
35482
+ },
35483
+ "[typescriptreact]": {
35484
+ "editor.codeActionsOnSave": {
35485
+ "source.fixAll.eslint": "always",
35486
+ "source.organizeImports": "always"
35487
+ }
35488
+ },
35489
+ "[javascript]": {
35490
+ "editor.codeActionsOnSave": {
35491
+ "source.fixAll.eslint": "always"
35492
+ }
35493
+ },
35494
+ "[javascriptreact]": {
35495
+ "editor.codeActionsOnSave": {
35496
+ "source.fixAll.eslint": "always"
35497
+ }
35498
+ },
35499
+ "eslint.validate": [
35500
+ "javascript",
35501
+ "javascriptreact",
35502
+ "typescript",
35503
+ "typescriptreact"
35504
+ ]
35505
+ });
35506
+ this.vscode?.extensions.addRecommendations("dbaeumer.vscode-eslint");
35507
+ this.vscode?.extensions.addRecommendations("esbenp.prettier-vscode");
35508
+ const turbo = TurboRepo.of(this);
35509
+ if (turbo?.compileTask) {
35510
+ turbo.compileTask.inputs.push(
35511
+ "public/**",
35512
+ "index.html",
35513
+ "vite.config.ts"
35514
+ );
35515
+ }
35516
+ if (userOptions.sampleCode === true) {
35517
+ const siteName = options.name;
35518
+ new import_projen25.SampleFile(this, "index.html", {
35519
+ contents: `<!doctype html>
35520
+ <html>
35521
+ <head>
35522
+ <meta charset="utf-8"/>
35523
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
35524
+ <title>${siteName}</title>
35525
+ </head>
35526
+ <body>
35527
+ <div id="root"></div>
35528
+ <script type="module" src="/src/main.tsx"></script>
35529
+ </body>
35530
+ </html>
35531
+ `
35532
+ });
35533
+ new import_projen25.SampleFile(this, "src/routes.tsx", {
35534
+ contents: `import { createBrowserRouter } from 'react-router-dom';
35535
+ import App from './App';
35536
+
35537
+ export const router = createBrowserRouter([
35538
+ { path: '/', element: <App /> },
35539
+ ]);
35540
+ `
35541
+ });
35542
+ new import_projen25.SampleFile(this, "src/main.tsx", {
35543
+ contents: `import React from 'react';
35544
+ import ReactDOM from 'react-dom/client';
35545
+ import { RouterProvider } from 'react-router-dom';
35546
+ import { router } from './routes';
35547
+ import './index.css';
35548
+
35549
+ ReactDOM.createRoot(document.getElementById('root')!).render(
35550
+ <React.StrictMode>
35551
+ <RouterProvider router={router} />
35552
+ </React.StrictMode>
35553
+ );
35554
+ `
35555
+ });
35556
+ new import_projen25.SampleFile(this, "src/App.tsx", {
35557
+ contents: `export default function App() {
35558
+ return (
35559
+ <main className="p-4">
35560
+ <h1 className="text-2xl font-bold">Hello from ${siteName}</h1>
35561
+ </main>
35562
+ );
35563
+ }
35564
+ `
35565
+ });
35566
+ new import_projen25.SampleFile(this, "src/index.css", {
35567
+ contents: `@import "tailwindcss";
35568
+ `
35569
+ });
35570
+ new import_projen25.SampleFile(this, "src/setupTests.ts", {
35571
+ contents: `import '@testing-library/jest-dom';
35572
+ `
35573
+ });
35574
+ }
35575
+ }
35576
+ };
35577
+
35161
35578
  // src/projects/starlight-project.ts
35162
- var import_projen23 = require("projen");
35579
+ var import_projen26 = require("projen");
35163
35580
  var STARLIGHT_ROLE = {
35164
35581
  DOCS: "docs",
35165
35582
  SITE: "site"
@@ -35201,10 +35618,10 @@ var StarlightProject = class extends AstroProject {
35201
35618
  turbo.compileTask.inputs.push("src/content/**");
35202
35619
  }
35203
35620
  if (userOptions.sampleContent === true) {
35204
- new import_projen23.SampleFile(this, "src/content/docs/index.mdx", {
35621
+ new import_projen26.SampleFile(this, "src/content/docs/index.mdx", {
35205
35622
  contents: DEFAULT_INDEX_MDX
35206
35623
  });
35207
- new import_projen23.SampleFile(this, "src/content.config.ts", {
35624
+ new import_projen26.SampleFile(this, "src/content.config.ts", {
35208
35625
  contents: DEFAULT_CONTENT_CONFIG_TS
35209
35626
  });
35210
35627
  }
@@ -35254,9 +35671,9 @@ export const collections = {
35254
35671
 
35255
35672
  // src/typescript/typescript-config.ts
35256
35673
  var import_node_path2 = require("path");
35257
- var import_projen24 = require("projen");
35674
+ var import_projen27 = require("projen");
35258
35675
  var import_path2 = require("projen/lib/util/path");
35259
- var TypeScriptConfig = class extends import_projen24.Component {
35676
+ var TypeScriptConfig = class extends import_projen27.Component {
35260
35677
  constructor(project) {
35261
35678
  super(project);
35262
35679
  let tsPaths = {};
@@ -35381,6 +35798,7 @@ var TypeScriptConfig = class extends import_projen24.Component {
35381
35798
  REQUIREMENTS_WRITER_PATHS,
35382
35799
  ROOT_CI_TASK_NAME,
35383
35800
  ROOT_TURBO_TASK_NAME,
35801
+ ReactViteSiteProject,
35384
35802
  ResetTask,
35385
35803
  SCHEDULED_TASK_MODEL_VALUES,
35386
35804
  SCOPE_CLASS_VALUES,
@@ -35407,6 +35825,8 @@ var TypeScriptConfig = class extends import_projen24.Component {
35407
35825
  Vitest,
35408
35826
  addApproveMergeUpgradeWorkflow,
35409
35827
  addBuildCompleteJob,
35828
+ addPlaywright,
35829
+ addStorybook,
35410
35830
  addSyncLabelsWorkflow,
35411
35831
  agendaBundle,
35412
35832
  analyzeTsDocCoverage,
@@ -35534,6 +35954,7 @@ var TypeScriptConfig = class extends import_projen24.Component {
35534
35954
  resolveOutdirFromPackageName,
35535
35955
  resolveOverrideForLabels,
35536
35956
  resolveProgressFiles,
35957
+ resolveReactViteSiteProjectOutdir,
35537
35958
  resolveRunRatio,
35538
35959
  resolveScheduledTasks,
35539
35960
  resolveScopeGate,