@codedrifters/configulator 0.0.306 → 0.0.307

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,
@@ -33009,8 +33013,88 @@ var JsiiFaker = class _JsiiFaker extends import_projen13.Component {
33009
33013
  }
33010
33014
  };
33011
33015
 
33016
+ // src/projects/add-playwright.ts
33017
+ var import_projen14 = require("projen");
33018
+ function addPlaywright(project) {
33019
+ project.addDevDeps("@playwright/test");
33020
+ project.tasks.addTask("e2e:install", {
33021
+ description: "Install Playwright browsers",
33022
+ steps: [{ exec: "npx playwright install --with-deps" }]
33023
+ });
33024
+ project.tasks.addTask("e2e", {
33025
+ description: "Run Playwright E2E tests (headless)",
33026
+ steps: [{ exec: "npx playwright test" }]
33027
+ });
33028
+ project.tasks.addTask("e2e:ui", {
33029
+ description: "Run Playwright in UI mode",
33030
+ steps: [{ exec: "npx playwright test --ui" }]
33031
+ });
33032
+ project.tasks.addTask("e2e:report", {
33033
+ description: "Open last HTML report",
33034
+ steps: [{ exec: "npx playwright show-report" }]
33035
+ });
33036
+ project.setScript("e2e:install", "npx projen e2e:install");
33037
+ project.setScript("e2e", "npx projen e2e");
33038
+ project.setScript("e2e:ui", "npx projen e2e:ui");
33039
+ project.setScript("e2e:report", "npx projen e2e:report");
33040
+ new import_projen14.SampleFile(project, "playwright.config.ts", {
33041
+ contents: `import { defineConfig, devices } from '@playwright/test';
33042
+
33043
+ export default defineConfig({
33044
+ testDir: './tests',
33045
+ reporter: [['html', { open: 'never' }]],
33046
+ use: {
33047
+ baseURL: process.env.PLAYWRIGHT_BASE_URL || 'http://localhost:5173',
33048
+ trace: 'on-first-retry',
33049
+ },
33050
+ projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
33051
+ });
33052
+ `
33053
+ });
33054
+ project.gitignore.addPatterns("test-results/", "playwright-report/");
33055
+ }
33056
+
33057
+ // src/projects/add-storybook.ts
33058
+ var import_projen15 = require("projen");
33059
+ function addStorybook(project, options = {}) {
33060
+ const withDocs = options.withDocs ?? true;
33061
+ project.addDevDeps(
33062
+ "storybook",
33063
+ "@storybook/react@^9",
33064
+ "@storybook/react-vite@^9",
33065
+ ...withDocs ? ["@storybook/addon-docs@^9"] : []
33066
+ );
33067
+ project.tasks.addTask("storybook", {
33068
+ description: "Run Storybook (Vite)",
33069
+ steps: [{ exec: "storybook dev -p 6006" }]
33070
+ });
33071
+ project.tasks.addTask("build-storybook", {
33072
+ description: "Build static Storybook",
33073
+ steps: [{ exec: "storybook build" }]
33074
+ });
33075
+ project.setScript("storybook", "npx projen storybook");
33076
+ project.setScript("build-storybook", "npx projen build-storybook");
33077
+ new import_projen15.SampleFile(project, ".storybook/main.ts", {
33078
+ contents: `import type { StorybookConfig } from '@storybook/react-vite';
33079
+
33080
+ const config: StorybookConfig = {
33081
+ stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
33082
+ addons: [${withDocs ? `'@storybook/addon-docs'` : ""}],
33083
+ framework: { name: '@storybook/react-vite', options: {} },
33084
+ };
33085
+ export default config;
33086
+ `
33087
+ });
33088
+ new import_projen15.SampleFile(project, ".storybook/preview.ts", {
33089
+ contents: `import '../src/index.css';
33090
+ const preview = { parameters: { controls: { expanded: true } } };
33091
+ export default preview;
33092
+ `
33093
+ });
33094
+ }
33095
+
33012
33096
  // src/projects/astro-project.ts
33013
- var import_projen19 = require("projen");
33097
+ var import_projen21 = require("projen");
33014
33098
  var import_ts_deepmerge3 = require("ts-deepmerge");
33015
33099
 
33016
33100
  // src/projects/monorepo-layout.ts
@@ -33029,6 +33113,7 @@ var LAYOUT_ROOT_BY_PROJECT_TYPE = {
33029
33113
  TypeScriptProject: MONOREPO_LAYOUT.PACKAGES,
33030
33114
  AwsCdkProject: MONOREPO_LAYOUT.APPS,
33031
33115
  AstroProject: MONOREPO_LAYOUT.SITES,
33116
+ ReactViteSiteProject: MONOREPO_LAYOUT.SITES,
33032
33117
  StarlightProject: MONOREPO_LAYOUT.DOCS
33033
33118
  };
33034
33119
  function validateMonorepoLayout(root) {
@@ -33152,9 +33237,12 @@ function resolveAwsCdkProjectOutdir(packageName) {
33152
33237
  function resolveAstroProjectOutdir(packageName) {
33153
33238
  return resolveOutdirFromPackageName(packageName, MONOREPO_LAYOUT.SITES);
33154
33239
  }
33240
+ function resolveReactViteSiteProjectOutdir(packageName) {
33241
+ return resolveOutdirFromPackageName(packageName, MONOREPO_LAYOUT.SITES);
33242
+ }
33155
33243
 
33156
33244
  // src/projects/typescript-project.ts
33157
- var import_projen18 = require("projen");
33245
+ var import_projen20 = require("projen");
33158
33246
  var import_javascript4 = require("projen/lib/javascript");
33159
33247
  var import_release = require("projen/lib/release");
33160
33248
  var import_ts_deepmerge2 = require("ts-deepmerge");
@@ -33166,9 +33254,9 @@ var import_typescript3 = require("projen/lib/typescript");
33166
33254
  var import_ts_deepmerge = require("ts-deepmerge");
33167
33255
 
33168
33256
  // src/projects/nvmrc.ts
33169
- var import_projen14 = require("projen");
33257
+ var import_projen16 = require("projen");
33170
33258
  var import_textfile5 = require("projen/lib/textfile");
33171
- var Nvmrc = class extends import_projen14.Component {
33259
+ var Nvmrc = class extends import_projen16.Component {
33172
33260
  constructor(project) {
33173
33261
  super(project);
33174
33262
  new import_textfile5.TextFile(project, ".nvmrc", {
@@ -33181,8 +33269,8 @@ var Nvmrc = class extends import_projen14.Component {
33181
33269
  };
33182
33270
 
33183
33271
  // src/tasks/reset-task.ts
33184
- var import_projen15 = require("projen");
33185
- var ResetTask = class _ResetTask extends import_projen15.Component {
33272
+ var import_projen17 = require("projen");
33273
+ var ResetTask = class _ResetTask extends import_projen17.Component {
33186
33274
  constructor(project, options = {}) {
33187
33275
  super(project);
33188
33276
  this.project = project;
@@ -33255,12 +33343,12 @@ var ResetTask = class _ResetTask extends import_projen15.Component {
33255
33343
  };
33256
33344
 
33257
33345
  // src/vscode/vscode.ts
33258
- var import_projen16 = require("projen");
33259
- var VSCodeConfig = class extends import_projen16.Component {
33346
+ var import_projen18 = require("projen");
33347
+ var VSCodeConfig = class extends import_projen18.Component {
33260
33348
  constructor(project) {
33261
33349
  super(project);
33262
- const vsConfig = new import_projen16.vscode.VsCode(project);
33263
- const vsSettings = new import_projen16.vscode.VsCodeSettings(vsConfig);
33350
+ const vsConfig = new import_projen18.vscode.VsCode(project);
33351
+ const vsSettings = new import_projen18.vscode.VsCodeSettings(vsConfig);
33264
33352
  vsSettings.addSetting("editor.tabSize", 2);
33265
33353
  vsSettings.addSetting("editor.detectIndentation", false);
33266
33354
  vsSettings.addSetting("editor.bracketPairColorization.enabled", true);
@@ -33540,7 +33628,7 @@ function patchStepArray2(steps, pinned) {
33540
33628
  }
33541
33629
 
33542
33630
  // src/workflows/sync-labels.ts
33543
- var import_projen17 = require("projen");
33631
+ var import_projen19 = require("projen");
33544
33632
  var import_workflows_model4 = require("projen/lib/github/workflows-model");
33545
33633
  var DEFAULT_STATUS_LABELS = [
33546
33634
  {
@@ -33748,10 +33836,10 @@ ${offenders}`
33748
33836
  }
33749
33837
  });
33750
33838
  }
33751
- var LabelsFile = class extends import_projen17.Component {
33839
+ var LabelsFile = class extends import_projen19.Component {
33752
33840
  constructor(project, labels) {
33753
33841
  super(project);
33754
- new import_projen17.YamlFile(project, LABELS_CONFIG_PATH, {
33842
+ new import_projen19.YamlFile(project, LABELS_CONFIG_PATH, {
33755
33843
  obj: labels.map((l) => ({
33756
33844
  name: l.name,
33757
33845
  color: l.color,
@@ -34144,7 +34232,7 @@ var TestRunner = {
34144
34232
  JEST: "jest",
34145
34233
  VITEST: "vitest"
34146
34234
  };
34147
- var TypeScriptProject = class extends import_projen18.typescript.TypeScriptProject {
34235
+ var TypeScriptProject = class extends import_projen20.typescript.TypeScriptProject {
34148
34236
  constructor(userOptions) {
34149
34237
  if (!(userOptions.parent instanceof MonorepoProject)) {
34150
34238
  throw new Error(
@@ -34454,10 +34542,10 @@ var AstroProject = class extends TypeScriptProject {
34454
34542
  adapter: options.adapter
34455
34543
  });
34456
34544
  if (options.sampleCode === true) {
34457
- new import_projen19.SampleFile(this, "src/pages/index.astro", {
34545
+ new import_projen21.SampleFile(this, "src/pages/index.astro", {
34458
34546
  contents: DEFAULT_INDEX_ASTRO
34459
34547
  });
34460
- new import_projen19.SampleFile(this, "public/favicon.svg", {
34548
+ new import_projen21.SampleFile(this, "public/favicon.svg", {
34461
34549
  contents: DEFAULT_FAVICON_SVG
34462
34550
  });
34463
34551
  }
@@ -34482,19 +34570,19 @@ var DEFAULT_FAVICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
34482
34570
  `;
34483
34571
 
34484
34572
  // src/projects/aws-cdk-project.ts
34485
- var import_projen22 = require("projen");
34573
+ var import_projen24 = require("projen");
34486
34574
  var import_javascript5 = require("projen/lib/javascript");
34487
34575
  var import_release2 = require("projen/lib/release");
34488
34576
  var import_ts_deepmerge4 = require("ts-deepmerge");
34489
34577
 
34490
34578
  // src/workflows/aws-deploy-workflow.ts
34491
34579
  var import_utils11 = __toESM(require_lib());
34492
- var import_projen20 = require("projen");
34580
+ var import_projen22 = require("projen");
34493
34581
  var import_build = require("projen/lib/build");
34494
34582
  var import_github5 = require("projen/lib/github");
34495
34583
  var import_workflows_model5 = require("projen/lib/github/workflows-model");
34496
34584
  var PROD_DEPLOY_NAME = "prod-deploy";
34497
- var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen20.Component {
34585
+ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen22.Component {
34498
34586
  constructor(project, options = {}) {
34499
34587
  super(project);
34500
34588
  this.project = project;
@@ -34758,7 +34846,7 @@ var AwsDeployWorkflow = class _AwsDeployWorkflow extends import_projen20.Compone
34758
34846
  };
34759
34847
 
34760
34848
  // src/workflows/aws-teardown-workflow.ts
34761
- var import_projen21 = require("projen");
34849
+ var import_projen23 = require("projen");
34762
34850
  var import_github6 = require("projen/lib/github");
34763
34851
  var import_workflows_model6 = require("projen/lib/github/workflows-model");
34764
34852
  var DEFAULT_TEARDOWN_BRANCH_PATTERNS = [
@@ -34780,7 +34868,7 @@ var resolveBranchPatterns = (explicit, targets) => {
34780
34868
  }
34781
34869
  return [...DEFAULT_TEARDOWN_BRANCH_PATTERNS];
34782
34870
  };
34783
- var AwsTeardownWorkflow = class extends import_projen21.Component {
34871
+ var AwsTeardownWorkflow = class extends import_projen23.Component {
34784
34872
  constructor(rootProject, options) {
34785
34873
  super(rootProject);
34786
34874
  this.rootProject = rootProject;
@@ -34962,7 +35050,7 @@ var AwsTeardownWorkflow = class extends import_projen21.Component {
34962
35050
  };
34963
35051
 
34964
35052
  // src/projects/aws-cdk-project.ts
34965
- var AwsCdkProject = class extends import_projen22.awscdk.AwsCdkTypeScriptApp {
35053
+ var AwsCdkProject = class extends import_projen24.awscdk.AwsCdkTypeScriptApp {
34966
35054
  constructor(userOptions) {
34967
35055
  if (!(userOptions.parent instanceof MonorepoProject)) {
34968
35056
  throw new Error(
@@ -35158,8 +35246,305 @@ var AwsCdkProject = class extends import_projen22.awscdk.AwsCdkTypeScriptApp {
35158
35246
  }
35159
35247
  };
35160
35248
 
35249
+ // src/projects/react-vite-site-project.ts
35250
+ var import_projen25 = require("projen");
35251
+ var import_ts_deepmerge5 = require("ts-deepmerge");
35252
+ var ReactViteSiteProject = class extends TypeScriptProject {
35253
+ constructor(userOptions) {
35254
+ const resolvedOutdir = userOptions.outdir ?? resolveReactViteSiteProjectOutdir(
35255
+ userOptions.packageName ?? userOptions.name
35256
+ );
35257
+ const defaultOptions = {
35258
+ testRunner: TestRunner.VITEST,
35259
+ apiExtractor: false,
35260
+ // ESLint inherited from TypeScriptProject lints `src` by default;
35261
+ // skip projen's `.projenrc.ts` lint pass since downstream sites
35262
+ // configure projen through their own root project.
35263
+ eslintOptions: {
35264
+ dirs: ["src"],
35265
+ lintProjenRc: false
35266
+ },
35267
+ // VSCode workspace defaults (Prettier formatter, ESLint on save)
35268
+ // need a project-level `.vscode/` folder. The inherited
35269
+ // TypeScriptProject does not enable it on sub-projects by
35270
+ // default; flip it on so the React-site VSCode wiring below
35271
+ // actually renders.
35272
+ vscode: true,
35273
+ tsconfig: {
35274
+ compilerOptions: {
35275
+ declaration: false
35276
+ }
35277
+ }
35278
+ };
35279
+ const merged = (0, import_ts_deepmerge5.merge)(
35280
+ defaultOptions,
35281
+ userOptions
35282
+ );
35283
+ const options = {
35284
+ ...merged,
35285
+ outdir: resolvedOutdir
35286
+ };
35287
+ super(options);
35288
+ this.package.addField("type", "module");
35289
+ new import_projen25.TextFile(this, ".nvmrc", { lines: ["v24.11.0"] });
35290
+ this.tsconfig?.file.addOverride("compilerOptions.target", "ES2020");
35291
+ this.tsconfig?.file.addOverride("compilerOptions.lib", [
35292
+ "ES2020",
35293
+ "DOM",
35294
+ "DOM.Iterable"
35295
+ ]);
35296
+ this.tsconfig?.file.addOverride("compilerOptions.module", "ESNext");
35297
+ this.tsconfig?.file.addOverride(
35298
+ "compilerOptions.moduleResolution",
35299
+ "bundler"
35300
+ );
35301
+ this.tsconfig?.file.addOverride("compilerOptions.jsx", "react-jsxdev");
35302
+ this.tsconfig?.file.addOverride("compilerOptions.noEmit", true);
35303
+ this.tsconfig?.file.addOverride("compilerOptions.skipLibCheck", true);
35304
+ this.tsconfig?.file.addOverride("compilerOptions.strict", true);
35305
+ this.tsconfig?.file.addOverride("compilerOptions.resolveJsonModule", true);
35306
+ this.tsconfig?.file.addOverride("compilerOptions.declaration", false);
35307
+ this.tsconfig?.file.addOverride("compilerOptions.paths", {
35308
+ "@/*": ["./src/*"]
35309
+ });
35310
+ this.tsconfig?.file.addOverride("include", ["src"]);
35311
+ this.tsconfigDev?.file.addOverride("compilerOptions.types", [
35312
+ "vitest/globals",
35313
+ "vite/client"
35314
+ ]);
35315
+ this.tsconfigDev?.file.addOverride("include", [
35316
+ "src",
35317
+ "tests",
35318
+ "**/*.test.ts",
35319
+ "**/*.test.tsx",
35320
+ "**/*.spec.ts",
35321
+ "**/*.spec.tsx",
35322
+ "vitest.config.ts"
35323
+ ]);
35324
+ this.tsconfigDev?.file.addOverride("exclude", [
35325
+ "node_modules",
35326
+ "dist",
35327
+ "build",
35328
+ ".turbo"
35329
+ ]);
35330
+ new import_projen25.SampleFile(this, "vite.config.ts", {
35331
+ contents: `import { defineConfig } from 'vite';
35332
+ import react from '@vitejs/plugin-react';
35333
+ import tailwindcss from '@tailwindcss/vite';
35334
+ import path from 'path';
35335
+
35336
+ export default defineConfig({
35337
+ plugins: [tailwindcss(), react()],
35338
+ resolve: { alias: { '@': path.resolve(__dirname, 'src') } },
35339
+ });
35340
+ `
35341
+ });
35342
+ if (options.testRunner !== TestRunner.JEST) {
35343
+ this.tryRemoveFile("vitest.config.ts");
35344
+ new import_projen25.SampleFile(this, "vitest.config.ts", {
35345
+ contents: `import { defineConfig, mergeConfig } from 'vitest/config';
35346
+ import react from '@vitejs/plugin-react';
35347
+ import viteConfig from './vite.config';
35348
+
35349
+ export default mergeConfig(
35350
+ viteConfig,
35351
+ defineConfig({
35352
+ plugins: [react()],
35353
+ test: {
35354
+ environment: 'jsdom',
35355
+ globals: true,
35356
+ setupFiles: ['./src/setupTests.ts'],
35357
+ passWithNoTests: true,
35358
+ },
35359
+ })
35360
+ );
35361
+ `
35362
+ });
35363
+ }
35364
+ this.compileTask.reset();
35365
+ this.compileTask.exec("vite build");
35366
+ this.packageTask.reset();
35367
+ this.tasks.tryFind("watch")?.reset("vite");
35368
+ if (!this.tasks.tryFind("dev")) {
35369
+ this.addTask("dev", {
35370
+ description: "Start the Vite dev server",
35371
+ exec: "vite",
35372
+ receiveArgs: true
35373
+ });
35374
+ }
35375
+ if (!this.tasks.tryFind("preview")) {
35376
+ this.addTask("preview", {
35377
+ description: "Preview the built site locally",
35378
+ exec: "vite preview",
35379
+ receiveArgs: true
35380
+ });
35381
+ }
35382
+ this.addDeps("react", "react-dom", "react-router-dom");
35383
+ this.addDevDeps(
35384
+ "vite",
35385
+ "@vitejs/plugin-react",
35386
+ "@tailwindcss/vite",
35387
+ "tailwindcss",
35388
+ "jsdom",
35389
+ "@testing-library/react",
35390
+ "@testing-library/jest-dom",
35391
+ "@testing-library/user-event",
35392
+ "@types/react",
35393
+ "@types/react-dom",
35394
+ "eslint-plugin-react",
35395
+ "eslint-plugin-react-hooks"
35396
+ );
35397
+ this.eslint?.addExtends("plugin:react/recommended");
35398
+ this.eslint?.addExtends("plugin:react/jsx-runtime");
35399
+ this.eslint?.addExtends("plugin:react-hooks/recommended");
35400
+ this.eslint?.addOverride({
35401
+ files: ["**/*.{tsx,jsx}"],
35402
+ // Projen's ESLint override type does not include `settings`, but
35403
+ // `settings` is a valid ESLint override key. Cast to `any` so the
35404
+ // generated `.eslintrc.json` carries the React-version detection
35405
+ // settings on the JSX glob.
35406
+ settings: {
35407
+ react: {
35408
+ version: "detect"
35409
+ }
35410
+ }
35411
+ });
35412
+ this.eslint?.addRules({
35413
+ // We use TypeScript; prop-types are unnecessary.
35414
+ "react/prop-types": "off",
35415
+ // New JSX transform — React no longer needs to be in scope.
35416
+ "react/react-in-jsx-scope": "off"
35417
+ });
35418
+ this.eslint?.addOverride({
35419
+ files: [
35420
+ "**/*.{test,spec}.ts",
35421
+ "**/*.{test,spec}.tsx",
35422
+ "**/__tests__/**",
35423
+ "src/setupTests.ts"
35424
+ ],
35425
+ rules: {
35426
+ "import/no-extraneous-dependencies": [
35427
+ "error",
35428
+ { devDependencies: true }
35429
+ ]
35430
+ }
35431
+ });
35432
+ this.vscode?.settings.addSettings({
35433
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
35434
+ "editor.formatOnSave": true,
35435
+ // Prettier must format the whole file; "modifications" mode is
35436
+ // known to mis-merge ranges with Prettier and can corrupt saves.
35437
+ "editor.formatOnSaveMode": "file",
35438
+ "prettier.requireConfig": true,
35439
+ "eslint.useFlatConfig": false,
35440
+ "eslint.workingDirectories": [{ directory: ".", changeProcessCWD: true }],
35441
+ // Prettier is the default formatter; ESLint's fixAll must not
35442
+ // re-apply prettier/prettier (would double-format).
35443
+ "eslint.codeActionsOnSave.rules": ["!prettier/prettier", "*"],
35444
+ "eslint.format.enable": false,
35445
+ "[typescript]": {
35446
+ "editor.codeActionsOnSave": {
35447
+ "source.fixAll.eslint": "always",
35448
+ "source.organizeImports": "always"
35449
+ }
35450
+ },
35451
+ "[typescriptreact]": {
35452
+ "editor.codeActionsOnSave": {
35453
+ "source.fixAll.eslint": "always",
35454
+ "source.organizeImports": "always"
35455
+ }
35456
+ },
35457
+ "[javascript]": {
35458
+ "editor.codeActionsOnSave": {
35459
+ "source.fixAll.eslint": "always"
35460
+ }
35461
+ },
35462
+ "[javascriptreact]": {
35463
+ "editor.codeActionsOnSave": {
35464
+ "source.fixAll.eslint": "always"
35465
+ }
35466
+ },
35467
+ "eslint.validate": [
35468
+ "javascript",
35469
+ "javascriptreact",
35470
+ "typescript",
35471
+ "typescriptreact"
35472
+ ]
35473
+ });
35474
+ this.vscode?.extensions.addRecommendations("dbaeumer.vscode-eslint");
35475
+ this.vscode?.extensions.addRecommendations("esbenp.prettier-vscode");
35476
+ const turbo = TurboRepo.of(this);
35477
+ if (turbo?.compileTask) {
35478
+ turbo.compileTask.inputs.push(
35479
+ "public/**",
35480
+ "index.html",
35481
+ "vite.config.ts"
35482
+ );
35483
+ }
35484
+ if (userOptions.sampleCode === true) {
35485
+ const siteName = options.name;
35486
+ new import_projen25.SampleFile(this, "index.html", {
35487
+ contents: `<!doctype html>
35488
+ <html>
35489
+ <head>
35490
+ <meta charset="utf-8"/>
35491
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
35492
+ <title>${siteName}</title>
35493
+ </head>
35494
+ <body>
35495
+ <div id="root"></div>
35496
+ <script type="module" src="/src/main.tsx"></script>
35497
+ </body>
35498
+ </html>
35499
+ `
35500
+ });
35501
+ new import_projen25.SampleFile(this, "src/routes.tsx", {
35502
+ contents: `import { createBrowserRouter } from 'react-router-dom';
35503
+ import App from './App';
35504
+
35505
+ export const router = createBrowserRouter([
35506
+ { path: '/', element: <App /> },
35507
+ ]);
35508
+ `
35509
+ });
35510
+ new import_projen25.SampleFile(this, "src/main.tsx", {
35511
+ contents: `import React from 'react';
35512
+ import ReactDOM from 'react-dom/client';
35513
+ import { RouterProvider } from 'react-router-dom';
35514
+ import { router } from './routes';
35515
+ import './index.css';
35516
+
35517
+ ReactDOM.createRoot(document.getElementById('root')!).render(
35518
+ <React.StrictMode>
35519
+ <RouterProvider router={router} />
35520
+ </React.StrictMode>
35521
+ );
35522
+ `
35523
+ });
35524
+ new import_projen25.SampleFile(this, "src/App.tsx", {
35525
+ contents: `export default function App() {
35526
+ return (
35527
+ <main className="p-4">
35528
+ <h1 className="text-2xl font-bold">Hello from ${siteName}</h1>
35529
+ </main>
35530
+ );
35531
+ }
35532
+ `
35533
+ });
35534
+ new import_projen25.SampleFile(this, "src/index.css", {
35535
+ contents: `@import "tailwindcss";
35536
+ `
35537
+ });
35538
+ new import_projen25.SampleFile(this, "src/setupTests.ts", {
35539
+ contents: `import '@testing-library/jest-dom';
35540
+ `
35541
+ });
35542
+ }
35543
+ }
35544
+ };
35545
+
35161
35546
  // src/projects/starlight-project.ts
35162
- var import_projen23 = require("projen");
35547
+ var import_projen26 = require("projen");
35163
35548
  var STARLIGHT_ROLE = {
35164
35549
  DOCS: "docs",
35165
35550
  SITE: "site"
@@ -35201,10 +35586,10 @@ var StarlightProject = class extends AstroProject {
35201
35586
  turbo.compileTask.inputs.push("src/content/**");
35202
35587
  }
35203
35588
  if (userOptions.sampleContent === true) {
35204
- new import_projen23.SampleFile(this, "src/content/docs/index.mdx", {
35589
+ new import_projen26.SampleFile(this, "src/content/docs/index.mdx", {
35205
35590
  contents: DEFAULT_INDEX_MDX
35206
35591
  });
35207
- new import_projen23.SampleFile(this, "src/content.config.ts", {
35592
+ new import_projen26.SampleFile(this, "src/content.config.ts", {
35208
35593
  contents: DEFAULT_CONTENT_CONFIG_TS
35209
35594
  });
35210
35595
  }
@@ -35254,9 +35639,9 @@ export const collections = {
35254
35639
 
35255
35640
  // src/typescript/typescript-config.ts
35256
35641
  var import_node_path2 = require("path");
35257
- var import_projen24 = require("projen");
35642
+ var import_projen27 = require("projen");
35258
35643
  var import_path2 = require("projen/lib/util/path");
35259
- var TypeScriptConfig = class extends import_projen24.Component {
35644
+ var TypeScriptConfig = class extends import_projen27.Component {
35260
35645
  constructor(project) {
35261
35646
  super(project);
35262
35647
  let tsPaths = {};
@@ -35381,6 +35766,7 @@ var TypeScriptConfig = class extends import_projen24.Component {
35381
35766
  REQUIREMENTS_WRITER_PATHS,
35382
35767
  ROOT_CI_TASK_NAME,
35383
35768
  ROOT_TURBO_TASK_NAME,
35769
+ ReactViteSiteProject,
35384
35770
  ResetTask,
35385
35771
  SCHEDULED_TASK_MODEL_VALUES,
35386
35772
  SCOPE_CLASS_VALUES,
@@ -35407,6 +35793,8 @@ var TypeScriptConfig = class extends import_projen24.Component {
35407
35793
  Vitest,
35408
35794
  addApproveMergeUpgradeWorkflow,
35409
35795
  addBuildCompleteJob,
35796
+ addPlaywright,
35797
+ addStorybook,
35410
35798
  addSyncLabelsWorkflow,
35411
35799
  agendaBundle,
35412
35800
  analyzeTsDocCoverage,
@@ -35534,6 +35922,7 @@ var TypeScriptConfig = class extends import_projen24.Component {
35534
35922
  resolveOutdirFromPackageName,
35535
35923
  resolveOverrideForLabels,
35536
35924
  resolveProgressFiles,
35925
+ resolveReactViteSiteProjectOutdir,
35537
35926
  resolveRunRatio,
35538
35927
  resolveScheduledTasks,
35539
35928
  resolveScopeGate,