[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"projectName\": \"projen\",\n  \"projectOwner\": \"projen\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"commitConvention\": \"angular\",\n  \"contributors\": [\n    {\n      \"login\": \"eladb\",\n      \"name\": \"Elad Ben-Israel\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/598796?v=4\",\n      \"profile\": \"http://eladb.github.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Chriscbr\",\n      \"name\": \"Christopher Rybicki\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/5008987?v=4\",\n      \"profile\": \"https://rybicki.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pgollucci\",\n      \"name\": \"Philip M. Gollucci\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/34295?v=4\",\n      \"profile\": \"http://p6m7g8.github.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hoegertn\",\n      \"name\": \"Thorsten Hoeger\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/1287829?v=4\",\n      \"profile\": \"https://github.com/hoegertn\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kcwinner\",\n      \"name\": \"Kenneth Winner\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/2728868?v=4\",\n      \"profile\": \"https://github.com/kcwinner\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"JordanSinko\",\n      \"name\": \"Jordan Sinko\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/10212966?v=4\",\n      \"profile\": \"https://github.com/JordanSinko\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"misterjoshua\",\n      \"name\": \"Josh Kellendonk\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/644092?v=4\",\n      \"profile\": \"https://github.com/misterjoshua\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"andrestone\",\n      \"name\": \"andrestone\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/7958086?v=4\",\n      \"profile\": \"https://github.com/andrestone\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"skyrpex\",\n      \"name\": \"Cristian Pallarés\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/1077520?v=4\",\n      \"profile\": \"https://pallares.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jogold\",\n      \"name\": \"Jonathan Goldwasser\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/12623249?v=4\",\n      \"profile\": \"https://github.com/jogold\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mbonig\",\n      \"name\": \"Matthew Bonig\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/1559437?v=4\",\n      \"profile\": \"http://www.matthewbonig.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pahud\",\n      \"name\": \"Pahud Hsieh\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/278432?v=4\",\n      \"profile\": \"https://github.com/pahud\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"adamelmore\",\n      \"name\": \"Adam Elmore\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/2363879?v=4\",\n      \"profile\": \"https://github.com/adamelmore\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"abelmokadem\",\n      \"name\": \"Ash\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/9717944?v=4\",\n      \"profile\": \"https://github.com/abelmokadem\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jmourelos\",\n      \"name\": \"Jacob\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/3878434?v=4\",\n      \"profile\": \"https://github.com/jmourelos\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"bigkraig\",\n      \"name\": \"Kraig Amador\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/508403?v=4\",\n      \"profile\": \"https://github.com/bigkraig\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mmuller88\",\n      \"name\": \"Martin Muller\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/18393842?v=4\",\n      \"profile\": \"https://github.com/mmuller88\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"tlakomy\",\n      \"name\": \"Tomasz Łakomy\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/16646517?v=4\",\n      \"profile\": \"https://tlakomy.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"john-tipper\",\n      \"name\": \"john-tipper\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/9730398?v=4\",\n      \"profile\": \"https://github.com/john-tipper\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"henrysachs\",\n      \"name\": \"Henry Sachs\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/17173951?v=4\",\n      \"profile\": \"https://github.com/henrysachs\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"eganjs\",\n      \"name\": \"Joseph Egan\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/6639482?v=4\",\n      \"profile\": \"https://github.com/eganjs\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"skorfmann\",\n      \"name\": \"Sebastian Korfmann\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/136789?v=4\",\n      \"profile\": \"https://skorfmann.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"bartcallant\",\n      \"name\": \"Bart Callant\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/5915843?v=4\",\n      \"profile\": \"http://www.callant.net/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"campionfellin\",\n      \"name\": \"Campion Fellin\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/11984923?v=4\",\n      \"profile\": \"https://github.com/campionfellin\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"gradybarrett\",\n      \"name\": \"Grady Barrett\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/1140074?v=4\",\n      \"profile\": \"https://github.com/gradybarrett\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"HassanMahmud\",\n      \"name\": \"Hassan Mahmud\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/58504381?v=4\",\n      \"profile\": \"https://github.com/HassanMahmud\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hass123uk\",\n      \"name\": \"Hassan Mahmud\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/7426703?v=4\",\n      \"profile\": \"https://dk.linkedin.com/in/hassanmahmud93\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jakepearson\",\n      \"name\": \"Jake Pearson\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/325306?v=4\",\n      \"profile\": \"http://joapy.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"JeremyJonas\",\n      \"name\": \"Jeremy Jonas\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/464119?v=4\",\n      \"profile\": \"https://github.com/JeremyJonas\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"martzcodes\",\n      \"name\": \"Matt Martz\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/978362?v=4\",\n      \"profile\": \"https://dev.to/martzcodes\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"fongie\",\n      \"name\": \"Max Körlinge\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/19932622?v=4\",\n      \"profile\": \"https://github.com/fongie\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"guan840912\",\n      \"name\": \"Neil Kuan\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/46012524?v=4\",\n      \"profile\": \"https://blog.neilkuan.dev/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"RafalWilinski\",\n      \"name\": \"Rafal Wilinski\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/3391616?v=4\",\n      \"profile\": \"https://dynobase.dev/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"RomainMuller\",\n      \"name\": \"Romain Marcadier\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/411689?v=4\",\n      \"profile\": \"https://keybase.io/romainmuller\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"thomasklinger1234\",\n      \"name\": \"Thomas Klinger\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/39558817?v=4\",\n      \"profile\": \"https://github.com/thomasklinger1234\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"gwriss\",\n      \"name\": \"Tobias\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/1842089?v=4\",\n      \"profile\": \"https://github.com/gwriss\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"flyingImer\",\n      \"name\": \"flyingImer\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1973868?v=4\",\n      \"profile\": \"https://github.com/flyingImer\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Hunter-Thompson\",\n      \"name\": \" Aatman \",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/20844961?v=4\",\n      \"profile\": \"https://github.com/Hunter-Thompson\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mmcculloh-dms\",\n      \"name\": \"Mark McCulloh\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/68597641?v=4\",\n      \"profile\": \"https://github.com/mmcculloh-dms\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"aisamu\",\n      \"name\": \"Samuel Tschiedel\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/431708?v=4\",\n      \"profile\": \"https://github.com/aisamu\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"iliapolo\",\n      \"name\": \"Eli Polonsky\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1428812?v=4\",\n      \"profile\": \"https://github.com/iliapolo\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Miradorn\",\n      \"name\": \"Alexander Steppke\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1308885?v=4\",\n      \"profile\": \"https://unsubstantiated.blog/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kanatti\",\n      \"name\": \"Balagopal Kanattil\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8623654?v=4\",\n      \"profile\": \"https://github.com/kanatti\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"bracki\",\n      \"name\": \"Jan Brauer\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/49786?v=4\",\n      \"profile\": \"http://twitter.com/bracki\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"polothy\",\n      \"name\": \"Mark Nielsen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/634657?v=4\",\n      \"profile\": \"https://polothy.github.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"MrArnoldPalmer\",\n      \"name\": \"Mitchell Valine\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/7221111?v=4\",\n      \"profile\": \"https://github.com/MrArnoldPalmer\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"neilkuan\",\n      \"name\": \"Neil Kuan\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/46012524?v=4\",\n      \"profile\": \"https://blog.neilkuan.net/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pgarbe\",\n      \"name\": \"Philipp Garbe\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/721899?v=4\",\n      \"profile\": \"https://garbe.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"smacintyre\",\n      \"name\": \"Shawn MacIntyre\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/361689?v=4\",\n      \"profile\": \"https://selfstructured.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"tobias-bardino\",\n      \"name\": \"Tobias\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1842089?v=4\",\n      \"profile\": \"https://github.com/tobias-bardino\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"yglcode\",\n      \"name\": \"Yigong Liu\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/11893614?v=4\",\n      \"profile\": \"https://github.com/yglcode\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"eduardomourar\",\n      \"name\": \"Eduardo Rodrigues\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/16357187?v=4\",\n      \"profile\": \"https://github.com/eduardomourar\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hassanazharkhan\",\n      \"name\": \"Hassan Azhar\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/57677979?v=4\",\n      \"profile\": \"https://github.com/hassanazharkhan\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jumic\",\n      \"name\": \"Julian Michel\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/15660169?v=4\",\n      \"profile\": \"https://www.linkedin.com/in/julian-michel-812a223a/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"lmarsden\",\n      \"name\": \"lmarsden\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/51232932?v=4\",\n      \"profile\": \"https://github.com/lmarsden\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"adrianmace\",\n      \"name\": \"Adrian Mace\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/5071859?v=4\",\n      \"profile\": \"https://github.com/adrianmace\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mKeRix\",\n      \"name\": \"Heiko Rothe\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/770596?v=4\",\n      \"profile\": \"https://github.com/mKeRix\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hyandell\",\n      \"name\": \"Henri Yandell\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/477715?v=4\",\n      \"profile\": \"https://github.com/hyandell\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mwg-rea\",\n      \"name\": \"Matthew Gamble\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/82480228?v=4\",\n      \"profile\": \"https://github.com/mwg-rea\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"willdady\",\n      \"name\": \"Will Dady\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/204259?v=4\",\n      \"profile\": \"https://willdady.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"msessa\",\n      \"name\": \"Matteo Sessa\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1912143?v=4\",\n      \"profile\": \"https://github.com/msessa\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Hi-Fi\",\n      \"name\": \"Juho Saarinen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1499780?v=4\",\n      \"profile\": \"https://github.com/Hi-Fi\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"njlynch\",\n      \"name\": \"Nick Lynch\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1376292?v=4\",\n      \"profile\": \"https://github.com/njlynch\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"dkaksl\",\n      \"name\": \"Amani Kilumanga\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8690282?v=4\",\n      \"profile\": \"https://amani.kilumanga.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"gherlein\",\n      \"name\": \"Greg Herlein\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/173428?v=4\",\n      \"profile\": \"http://blog.herlein.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kaizen3031593\",\n      \"name\": \"Kaizen Conroy\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/36202692?v=4\",\n      \"profile\": \"https://github.com/kaizen3031593\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"saudkhanzada\",\n      \"name\": \"Saud Khanzada\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/30137907?v=4\",\n      \"profile\": \"https://github.com/saudkhanzada\",\n      \"contributions\": [\n        \"code\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7\n}\n"
  },
  {
    "path": ".devcontainer.json",
    "content": "{\n  \"postCreateCommand\": \"( npx projen devenv:setup )\",\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}\n"
  },
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"env\": {\n    \"jest\": true,\n    \"node\": true\n  },\n  \"root\": true,\n  \"plugins\": [\n    \"@typescript-eslint\",\n    \"import\",\n    \"prettier\"\n  ],\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"ecmaVersion\": 2018,\n    \"sourceType\": \"module\",\n    \"project\": \"./tsconfig.dev.json\"\n  },\n  \"extends\": [\n    \"plugin:import/typescript\",\n    \"prettier\",\n    \"plugin:prettier/recommended\"\n  ],\n  \"settings\": {\n    \"import/parsers\": {\n      \"@typescript-eslint/parser\": [\n        \".ts\",\n        \".tsx\"\n      ]\n    },\n    \"import/resolver\": {\n      \"node\": {},\n      \"typescript\": {\n        \"project\": \"./tsconfig.dev.json\",\n        \"alwaysTryTypes\": true\n      }\n    }\n  },\n  \"ignorePatterns\": [\n    \"*.js\",\n    \"!.projenrc.js\",\n    \"*.d.ts\",\n    \"node_modules/\",\n    \"*.generated.ts\",\n    \"coverage\"\n  ],\n  \"rules\": {\n    \"prettier/prettier\": [\n      \"error\"\n    ],\n    \"@typescript-eslint/no-require-imports\": [\n      \"error\"\n    ],\n    \"import/no-extraneous-dependencies\": [\n      \"error\",\n      {\n        \"devDependencies\": [\n          \"**/test/**\",\n          \"**/build-tools/**\"\n        ],\n        \"optionalDependencies\": false,\n        \"peerDependencies\": true\n      }\n    ],\n    \"import/no-unresolved\": [\n      \"error\"\n    ],\n    \"import/order\": [\n      \"warn\",\n      {\n        \"groups\": [\n          \"builtin\",\n          \"external\"\n        ],\n        \"alphabetize\": {\n          \"order\": \"asc\",\n          \"caseInsensitive\": true\n        }\n      }\n    ],\n    \"no-duplicate-imports\": [\n      \"error\"\n    ],\n    \"no-shadow\": [\n      \"off\"\n    ],\n    \"@typescript-eslint/no-shadow\": [\n      \"error\"\n    ],\n    \"key-spacing\": [\n      \"error\"\n    ],\n    \"no-multiple-empty-lines\": [\n      \"error\"\n    ],\n    \"@typescript-eslint/no-floating-promises\": [\n      \"error\"\n    ],\n    \"no-return-await\": [\n      \"off\"\n    ],\n    \"@typescript-eslint/return-await\": [\n      \"error\"\n    ],\n    \"no-trailing-spaces\": [\n      \"error\"\n    ],\n    \"dot-notation\": [\n      \"error\"\n    ],\n    \"no-bitwise\": [\n      \"error\"\n    ],\n    \"@typescript-eslint/member-ordering\": [\n      \"error\",\n      {\n        \"default\": [\n          \"public-static-field\",\n          \"public-static-method\",\n          \"protected-static-field\",\n          \"protected-static-method\",\n          \"private-static-field\",\n          \"private-static-method\",\n          \"field\",\n          \"constructor\",\n          \"method\"\n        ]\n      }\n    ]\n  },\n  \"overrides\": [\n    {\n      \"files\": [\n        \".projenrc.js\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-require-imports\": \"off\",\n        \"import/no-extraneous-dependencies\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\n*.snap linguist-generated\n/.devcontainer.json linguist-generated\n/.eslintrc.json linguist-generated\n/.gitattributes linguist-generated\n/.github/pull_request_template.md linguist-generated\n/.github/workflows/auto-approve.yml linguist-generated\n/.github/workflows/build.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.github/workflows/upgrade-main.yml linguist-generated\n/.gitignore linguist-generated\n/.gitpod.yml linguist-generated\n/.markdownlint.json linguist-generated\n/.mergify.yml linguist-generated\n/.npmignore linguist-generated\n/.prettierignore linguist-generated\n/.prettierrc.json linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/.vscode/launch.json linguist-generated\n/docs/api/API.md linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/projen.bash linguist-generated\n/tsconfig.dev.json linguist-generated\n/yarn.lock linguist-generated"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "---\nBy submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license."
  },
  {
    "path": ".github/workflows/auto-approve.yml",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\nname: auto-approve\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\njobs:\n  approve:\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    if: contains(github.event.pull_request.labels.*.name, 'auto-approve') && (github.event.pull_request.user.login == 'cdklabs-automation')\n    steps:\n      - uses: hmarr/auto-approve-action@v2.2.1\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\nname: build\non:\n  pull_request: {}\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      self_mutation_happened: ${{ steps.self_mutation.outputs.self_mutation_happened }}\n    env:\n      CI: \"true\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: ${{ github.event.pull_request.head.ref }}\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Install dependencies\n        run: yarn install --check-files\n      - name: build\n        run: /bin/bash ./projen.bash build\n      - name: Upload coverage to Codecov\n        uses: codecov/codecov-action@v1\n        with:\n          directory: coverage\n      - id: self_mutation\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \"::set-output name=self_mutation_happened::true\"\n      - if: steps.self_mutation.outputs.self_mutation_happened\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n      - name: Fail build on mutation\n        if: steps.self_mutation.outputs.self_mutation_happened\n        run: |-\n          echo \"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\"\n          cat .repo.patch\n          exit 1\n      - name: Upload artifact\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  self-mutation:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: always() && needs.build.outputs.self_mutation_happened && !(github.event.pull_request.head.repo.full_name != github.repository)\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: ${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: ${{ github.event.pull_request.head.ref }}\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: ${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s ${{ runner.temp }}/.repo.patch ] && git apply ${{ runner.temp }}/.repo.patch || echo \"Empty patch. Skipping.\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \"github-actions\"\n          git config user.email \"github-actions@github.com\"\n      - name: Push changes\n        run: |2-\n            git add .\n            git commit -s -m \"chore: self mutation\"\n            git push origin HEAD:${{ github.event.pull_request.head.ref }}\n  package-js:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions: {}\n    if: \"! needs.build.outputs.self_mutation_happened\"\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n  package-java:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions: {}\n    if: \"! needs.build.outputs.self_mutation_happened\"\n    steps:\n      - uses: actions/setup-java@v3\n        with:\n          distribution: temurin\n          java-version: 11.x\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create java artifact\n        run: cd .repo && npx projen package:java\n      - name: Collect java Artifact\n        run: mv .repo/dist dist\n  package-python:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions: {}\n    if: \"! needs.build.outputs.self_mutation_happened\"\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create python artifact\n        run: cd .repo && npx projen package:python\n      - name: Collect python Artifact\n        run: mv .repo/dist dist\n  package-go:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions: {}\n    if: \"! needs.build.outputs.self_mutation_happened\"\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - uses: actions/setup-go@v3\n        with:\n          go-version: ^1.16.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create go artifact\n        run: cd .repo && npx projen package:go\n      - name: Collect go Artifact\n        run: mv .repo/dist dist\n  post-build-integ:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: \"! needs.build.outputs.self_mutation_happened\"\n    steps:\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - uses: actions/setup-go@v3\n        with:\n          go-version: 1.16.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: ${{ github.event.pull_request.head.ref }}\n          repository: ${{ github.event.pull_request.head.repo.full_name }}\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - run: /bin/bash ./projen.bash integ\n"
  },
  {
    "path": ".github/workflows/pull-request-lint.yml",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: ${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \"true\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \"github-actions\"\n          git config user.email \"github-actions@github.com\"\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: /bin/bash ./projen.bash release\n      - name: Upload coverage to Codecov\n        uses: codecov/codecov-action@v1\n        with:\n          directory: coverage\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\"$(git ls-remote origin -h ${{ github.ref }} | cut -f1)\"\n      - name: Upload artifact\n        if: ${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      issues: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Collect GitHub Metadata\n        run: mv .repo/dist dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \"Release.tag_name already exists\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: ${{ github.repository }}\n          GITHUB_REF: ${{ github.ref }}\n      - name: Extract Version\n        if: ${{ failure() }}\n        id: extract-version\n        run: echo \"::set-output name=VERSION::$(cat dist/version.txt)\"\n      - name: Create Issue\n        if: ${{ failure() }}\n        uses: imjohnbo/issue-bot@v3\n        with:\n          labels: failed-release\n          title: Publishing v${{ steps.extract-version.outputs.VERSION }} to GitHub Releases failed\n          body: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      issues: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: registry.npmjs.org\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n      - name: Extract Version\n        if: ${{ failure() }}\n        id: extract-version\n        run: echo \"::set-output name=VERSION::$(cat dist/version.txt)\"\n      - name: Create Issue\n        if: ${{ failure() }}\n        uses: imjohnbo/issue-bot@v3\n        with:\n          labels: failed-release\n          title: Publishing v${{ steps.extract-version.outputs.VERSION }} to npm failed\n          body: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n  release_maven:\n    name: Publish to Maven Central\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      issues: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-java@v3\n        with:\n          distribution: temurin\n          java-version: 11.x\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create java artifact\n        run: cd .repo && npx projen package:java\n      - name: Collect java Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-maven\n        env:\n          MAVEN_ENDPOINT: https://s01.oss.sonatype.org\n          MAVEN_GPG_PRIVATE_KEY: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}\n          MAVEN_GPG_PRIVATE_KEY_PASSPHRASE: ${{ secrets.MAVEN_GPG_PRIVATE_KEY_PASSPHRASE }}\n          MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}\n          MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}\n          MAVEN_STAGING_PROFILE_ID: ${{ secrets.MAVEN_STAGING_PROFILE_ID }}\n      - name: Extract Version\n        if: ${{ failure() }}\n        id: extract-version\n        run: echo \"::set-output name=VERSION::$(cat dist/version.txt)\"\n      - name: Create Issue\n        if: ${{ failure() }}\n        uses: imjohnbo/issue-bot@v3\n        with:\n          labels: failed-release\n          title: Publishing v${{ steps.extract-version.outputs.VERSION }} to Maven Central failed\n          body: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n  release_pypi:\n    name: Publish to PyPI\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      issues: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create python artifact\n        run: cd .repo && npx projen package:python\n      - name: Collect python Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-pypi\n        env:\n          TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }}\n          TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }}\n      - name: Extract Version\n        if: ${{ failure() }}\n        id: extract-version\n        run: echo \"::set-output name=VERSION::$(cat dist/version.txt)\"\n      - name: Create Issue\n        if: ${{ failure() }}\n        uses: imjohnbo/issue-bot@v3\n        with:\n          labels: failed-release\n          title: Publishing v${{ steps.extract-version.outputs.VERSION }} to PyPI failed\n          body: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n  release_golang:\n    name: Publish to GitHub Go Module Repository\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      issues: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - uses: actions/setup-go@v3\n        with:\n          go-version: ^1.16.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create go artifact\n        run: cd .repo && npx projen package:go\n      - name: Collect go Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-golang\n        env:\n          GIT_USER_NAME: github-actions\n          GIT_USER_EMAIL: github-actions@github.com\n          GITHUB_TOKEN: ${{ secrets.GO_GITHUB_TOKEN }}\n      - name: Extract Version\n        if: ${{ failure() }}\n        id: extract-version\n        run: echo \"::set-output name=VERSION::$(cat dist/version.txt)\"\n      - name: Create Issue\n        if: ${{ failure() }}\n        uses: imjohnbo/issue-bot@v3\n        with:\n          labels: failed-release\n          title: Publishing v${{ steps.extract-version.outputs.VERSION }} to GitHub Go Module Repository failed\n          body: See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/upgrade-main.yml",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: ${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.17.0\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: /bin/bash ./projen.bash upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \"::set-output name=patch_created::true\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: ${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: ${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: ${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s ${{ runner.temp }}/.repo.patch ] && git apply ${{ runner.temp }}/.repo.patch || echo \"Empty patch. Skipping.\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \"github-actions\"\n          git config user.email \"github-actions@github.com\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: ${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \"upgrade-main\" workflow*\n          branch: github-actions/upgrade-main\n          title: \"chore(deps): upgrade dependencies\"\n          labels: auto-approve\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \"upgrade-main\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n"
  },
  {
    "path": ".gitignore",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/.gitpod.yml\n!/.devcontainer.json\n!/.github/workflows/auto-approve.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n/test-reports/\njunit.xml\n/coverage/\n!/.github/workflows/build.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.mergify.yml\n!/.github/workflows/upgrade-main.yml\n!/.github/pull_request_template.md\n!/.prettierignore\n!/.prettierrc.json\n!/test/\n!/tsconfig.dev.json\n!/src/\n/lib\n/dist/\n!/.eslintrc.json\n.jsii\ntsconfig.json\n!/docs/api/API.md\n!/projen.bash\n!templates/**\n/.idea\n!test/inventory/**\n!/.markdownlint.json\n!/.vscode/launch.json\n"
  },
  {
    "path": ".gitpod.yml",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\ntasks:\n  - name: Setup\n    command: npx projen build\n    init: yarn install\n    prebuild: bash ./projen.bash\n"
  },
  {
    "path": ".markdownlint.json",
    "content": "{\n  \"default\": true,\n  \"commands-show-output\": false,\n  \"line-length\": {\n    \"line_length\": 200\n  },\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}\n"
  },
  {
    "path": ".mergify.yml",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \"#approved-reviews-by>=1\"\n      - -label~=(do-not-merge)\n      - status-success=build\n      - status-success=package-js\n      - status-success=package-java\n      - status-success=package-python\n      - status-success=package-go\n      - status-success=post-build-integ\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \"#approved-reviews-by>=1\"\n      - -label~=(do-not-merge)\n      - status-success=build\n      - status-success=package-js\n      - status-success=package-java\n      - status-success=package-python\n      - status-success=package-go\n      - status-success=post-build-integ\n  - name: Label core contributions\n    actions:\n      label:\n        add:\n          - contribution/core\n    conditions:\n      - author~=^(eladb|Chriscbr)$\n      - label!=contribution/core\n"
  },
  {
    "path": ".npmignore",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n/.projen/\n/test-reports/\njunit.xml\n/coverage/\n/dist/changelog.md\n/dist/version.txt\n/.mergify.yml\n/test/\n/tsconfig.dev.json\n/src/\n!/lib/\n!/lib/**/*.js\n!/lib/**/*.d.ts\ndist\n/tsconfig.json\n/.github/\n/.vscode/\n/.idea/\n/.projenrc.js\ntsconfig.tsbuildinfo\n/.eslintrc.json\n!.jsii\n/projen.bash\n/.markdownlint.json\n/.devcontainer.json\n/.all-contributorsrc\n/scripts/\n/ARCHITECTURE.md\n/CODE_OF_CONDUCT.md\n/CONTRIBUTING.md\n/VISION.md\n/SECURITY.md\n/.gitattributes\n/.gitpod.yml\n"
  },
  {
    "path": ".prettierignore",
    "content": "# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".\n"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n  \"overrides\": []\n}\n"
  },
  {
    "path": ".projen/deps.json",
    "content": "{\n  \"dependencies\": [\n    {\n      \"name\": \"@types/conventional-changelog-config-spec\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@types/fs-extra\",\n      \"version\": \"^8\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@types/glob\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@types/ini\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@types/jest\",\n      \"version\": \"^27\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@types/node\",\n      \"version\": \"^14\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@types/semver\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@types/yargs\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@typescript-eslint/eslint-plugin\",\n      \"version\": \"^5\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@typescript-eslint/parser\",\n      \"version\": \"^5\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"all-contributors-cli\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"esbuild\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"eslint-config-prettier\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"eslint-import-resolver-node\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"eslint-import-resolver-typescript\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"eslint-plugin-import\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"eslint-plugin-prettier\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"eslint\",\n      \"version\": \"^8\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"jest-junit\",\n      \"version\": \"^13\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"jest\",\n      \"version\": \"^27\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"jsii\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"jsii-diff\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"jsii-docgen\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"jsii-pacmak\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"json-schema\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"json5\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"markmac\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"npm-check-updates\",\n      \"version\": \"^15\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"prettier\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"standard-version\",\n      \"version\": \"^9\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"ts-jest\",\n      \"version\": \"^27\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"typescript\",\n      \"type\": \"build\"\n    },\n    {\n      \"name\": \"@iarna/toml\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"case\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"chalk\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"conventional-changelog-config-spec\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"fast-json-patch\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"fs-extra\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"glob\",\n      \"version\": \"^7\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"ini\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"semver\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"shx\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"xmlbuilder2\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"yaml\",\n      \"version\": \"2.0.0\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"yargs\",\n      \"type\": \"bundled\"\n    },\n    {\n      \"name\": \"zlib\",\n      \"type\": \"bundled\"\n    }\n  ],\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}\n"
  },
  {
    "path": ".projen/files.json",
    "content": "{\n  \"files\": [\n    \".devcontainer.json\",\n    \".eslintrc.json\",\n    \".gitattributes\",\n    \".github/pull_request_template.md\",\n    \".github/workflows/auto-approve.yml\",\n    \".github/workflows/build.yml\",\n    \".github/workflows/pull-request-lint.yml\",\n    \".github/workflows/release.yml\",\n    \".github/workflows/upgrade-main.yml\",\n    \".gitignore\",\n    \".gitpod.yml\",\n    \".markdownlint.json\",\n    \".mergify.yml\",\n    \".prettierignore\",\n    \".prettierrc.json\",\n    \".projen/deps.json\",\n    \".projen/files.json\",\n    \".projen/tasks.json\",\n    \".vscode/launch.json\",\n    \"LICENSE\",\n    \"projen.bash\",\n    \"tsconfig.dev.json\"\n  ],\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}\n"
  },
  {
    "path": ".projen/tasks.json",
    "content": "{\n  \"tasks\": {\n    \"build\": {\n      \"name\": \"build\",\n      \"description\": \"Full release build\",\n      \"steps\": [\n        {\n          \"spawn\": \"default\"\n        },\n        {\n          \"spawn\": \"pre-compile\"\n        },\n        {\n          \"spawn\": \"compile\"\n        },\n        {\n          \"spawn\": \"post-compile\"\n        },\n        {\n          \"spawn\": \"test\"\n        },\n        {\n          \"spawn\": \"package\"\n        }\n      ]\n    },\n    \"bump\": {\n      \"name\": \"bump\",\n      \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n      \"env\": {\n        \"OUTFILE\": \"package.json\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\"\n      },\n      \"steps\": [\n        {\n          \"builtin\": \"release/bump-version\"\n        }\n      ],\n      \"condition\": \"! git log --oneline -1 | grep -q \\\"chore(release):\\\"\"\n    },\n    \"bundle:task-runner\": {\n      \"name\": \"bundle:task-runner\",\n      \"description\": \"Bundle the run-task script needed for \\\"projen eject\\\"\",\n      \"steps\": [\n        {\n          \"exec\": \"esbuild src/task-runtime.ts --outfile=lib/run-task.js --bundle --platform=node --external:\\\"*/package.json\\\"\"\n        },\n        {\n          \"exec\": \"echo \\\"#!/usr/bin/env node\\\" | cat - lib/run-task.js | tee lib/run-task.js > /dev/null\",\n          \"name\": \"Insert Node shebang to beginning of the file\"\n        },\n        {\n          \"exec\": \"echo \\\"const runtime = new TaskRuntime(\\\\\\\".\\\\\\\");\\nruntime.runTask(process.argv[2]);\\\" >> lib/run-task.js\",\n          \"name\": \"Add driver code to end of the file\"\n        }\n      ]\n    },\n    \"clobber\": {\n      \"name\": \"clobber\",\n      \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n      \"env\": {\n        \"BRANCH\": \"$(git branch --show-current)\"\n      },\n      \"steps\": [\n        {\n          \"exec\": \"git checkout -b scratch\",\n          \"name\": \"save current HEAD in \\\"scratch\\\" branch\"\n        },\n        {\n          \"exec\": \"git checkout $BRANCH\"\n        },\n        {\n          \"exec\": \"git fetch origin\",\n          \"name\": \"fetch latest changes from origin\"\n        },\n        {\n          \"exec\": \"git reset --hard origin/$BRANCH\",\n          \"name\": \"hard reset to origin commit\"\n        },\n        {\n          \"exec\": \"git clean -fdx\",\n          \"name\": \"clean all untracked files\"\n        },\n        {\n          \"say\": \"ready to rock! (unpushed commits are under the \\\"scratch\\\" branch)\"\n        }\n      ],\n      \"condition\": \"git diff --exit-code > /dev/null\"\n    },\n    \"compat\": {\n      \"name\": \"compat\",\n      \"description\": \"Perform API compatibility check against latest version\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii-diff npm:$(node -p \\\"require('./package.json').name\\\") -k --ignore-file .compatignore || (echo \\\"\\nUNEXPECTED BREAKING CHANGES: add keys such as 'removed:constructs.Node.of' to .compatignore to skip.\\n\\\" && exit 1)\"\n        }\n      ]\n    },\n    \"compile\": {\n      \"name\": \"compile\",\n      \"description\": \"Only compile\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii --silence-warnings=reserved-word\"\n        }\n      ]\n    },\n    \"contributors:update\": {\n      \"name\": \"contributors:update\",\n      \"steps\": [\n        {\n          \"exec\": \"all-contributors check | grep \\\"Missing contributors\\\" -A 1 | tail -n1 | sed -e \\\"s/,//g\\\" | xargs -n1 | grep -v \\\"[bot]\\\" | xargs -n1 -I{} all-contributors add {} code\"\n        }\n      ]\n    },\n    \"default\": {\n      \"name\": \"default\",\n      \"description\": \"Synthesize project files\",\n      \"steps\": [\n        {\n          \"exec\": \"node .projenrc.js\"\n        }\n      ]\n    },\n    \"devenv:setup\": {\n      \"name\": \"devenv:setup\",\n      \"steps\": [\n        {\n          \"exec\": \"yarn install\"\n        },\n        {\n          \"spawn\": \"build\"\n        }\n      ]\n    },\n    \"docgen\": {\n      \"name\": \"docgen\",\n      \"description\": \"Generate API.md from .jsii manifest\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii-docgen -o docs/api/API.md\"\n        }\n      ]\n    },\n    \"eject\": {\n      \"name\": \"eject\",\n      \"description\": \"Remove projen from the project\",\n      \"env\": {\n        \"PROJEN_EJECTING\": \"true\"\n      },\n      \"steps\": [\n        {\n          \"spawn\": \"default\"\n        }\n      ]\n    },\n    \"eslint\": {\n      \"name\": \"eslint\",\n      \"description\": \"Runs eslint against the codebase\",\n      \"steps\": [\n        {\n          \"exec\": \"eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test build-tools .projenrc.js\"\n        }\n      ]\n    },\n    \"integ\": {\n      \"name\": \"integ\",\n      \"description\": \"Run integration tests\",\n      \"steps\": [\n        {\n          \"spawn\": \"compile\"\n        },\n        {\n          \"spawn\": \"package:python\"\n        },\n        {\n          \"spawn\": \"integ:python-compat\"\n        }\n      ]\n    },\n    \"integ:python-compat\": {\n      \"name\": \"integ:python-compat\",\n      \"description\": \"Checks that projen's submodule structure does not cause import failures for python. Expects python to be installed and projen to be fully built.\",\n      \"steps\": [\n        {\n          \"exec\": \"scripts/python-compat.sh\"\n        }\n      ]\n    },\n    \"package\": {\n      \"name\": \"package\",\n      \"description\": \"Creates the distribution package\",\n      \"steps\": [\n        {\n          \"exec\": \"if [ ! -z ${CI} ]; then rsync -a . .repo --exclude .git --exclude node_modules && rm -rf dist && mv .repo dist; else /bin/bash ./projen.bash package-all; fi\"\n        }\n      ]\n    },\n    \"package-all\": {\n      \"name\": \"package-all\",\n      \"description\": \"Packages artifacts for all target languages\",\n      \"steps\": [\n        {\n          \"spawn\": \"package:js\"\n        },\n        {\n          \"spawn\": \"package:java\"\n        },\n        {\n          \"spawn\": \"package:python\"\n        },\n        {\n          \"spawn\": \"package:go\"\n        }\n      ]\n    },\n    \"package:go\": {\n      \"name\": \"package:go\",\n      \"description\": \"Create go language bindings\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii-pacmak -v --target go\"\n        }\n      ]\n    },\n    \"package:java\": {\n      \"name\": \"package:java\",\n      \"description\": \"Create java language bindings\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii-pacmak -v --target java\"\n        }\n      ]\n    },\n    \"package:js\": {\n      \"name\": \"package:js\",\n      \"description\": \"Create js language bindings\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii-pacmak -v --target js\"\n        }\n      ]\n    },\n    \"package:python\": {\n      \"name\": \"package:python\",\n      \"description\": \"Create python language bindings\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii-pacmak -v --target python\"\n        }\n      ]\n    },\n    \"post-compile\": {\n      \"name\": \"post-compile\",\n      \"description\": \"Runs after successful compilation\",\n      \"steps\": [\n        {\n          \"spawn\": \"docgen\"\n        },\n        {\n          \"spawn\": \"readme-macros\"\n        },\n        {\n          \"spawn\": \"bundle:task-runner\"\n        },\n        {\n          \"spawn\": \"default\"\n        }\n      ]\n    },\n    \"post-upgrade\": {\n      \"name\": \"post-upgrade\",\n      \"description\": \"Runs after upgrading dependencies\"\n    },\n    \"pre-compile\": {\n      \"name\": \"pre-compile\",\n      \"description\": \"Prepare the project for compilation\"\n    },\n    \"readme-macros\": {\n      \"name\": \"readme-macros\",\n      \"steps\": [\n        {\n          \"exec\": \"mv README.md README.md.bak\"\n        },\n        {\n          \"exec\": \"cat README.md.bak | markmac > README.md\"\n        },\n        {\n          \"exec\": \"rm README.md.bak\"\n        }\n      ]\n    },\n    \"release\": {\n      \"name\": \"release\",\n      \"description\": \"Prepare a release from \\\"main\\\" branch\",\n      \"env\": {\n        \"RELEASE\": \"true\"\n      },\n      \"steps\": [\n        {\n          \"exec\": \"rm -fr dist\"\n        },\n        {\n          \"spawn\": \"bump\"\n        },\n        {\n          \"spawn\": \"build\"\n        },\n        {\n          \"spawn\": \"unbump\"\n        },\n        {\n          \"exec\": \"git diff --ignore-space-at-eol --exit-code\"\n        }\n      ]\n    },\n    \"test\": {\n      \"name\": \"test\",\n      \"description\": \"Run tests\",\n      \"steps\": [\n        {\n          \"exec\": \"jest --passWithNoTests --all --updateSnapshot --coverageProvider=v8\"\n        },\n        {\n          \"spawn\": \"eslint\"\n        }\n      ]\n    },\n    \"test:update\": {\n      \"name\": \"test:update\",\n      \"description\": \"Update jest snapshots\",\n      \"steps\": [\n        {\n          \"exec\": \"jest --updateSnapshot\"\n        }\n      ]\n    },\n    \"test:watch\": {\n      \"name\": \"test:watch\",\n      \"description\": \"Run jest in watch mode\",\n      \"steps\": [\n        {\n          \"exec\": \"jest --watch\"\n        }\n      ]\n    },\n    \"unbump\": {\n      \"name\": \"unbump\",\n      \"description\": \"Restores version to 0.0.0\",\n      \"env\": {\n        \"OUTFILE\": \"package.json\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\"\n      },\n      \"steps\": [\n        {\n          \"builtin\": \"release/reset-version\"\n        }\n      ]\n    },\n    \"upgrade\": {\n      \"name\": \"upgrade\",\n      \"description\": \"upgrade dependencies\",\n      \"env\": {\n        \"CI\": \"0\"\n      },\n      \"steps\": [\n        {\n          \"exec\": \"yarn upgrade npm-check-updates\"\n        },\n        {\n          \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor --reject='yaml,markmac'\"\n        },\n        {\n          \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor --reject='yaml,markmac'\"\n        },\n        {\n          \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor --reject='yaml,markmac'\"\n        },\n        {\n          \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor --reject='yaml,markmac'\"\n        },\n        {\n          \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor --reject='yaml,markmac'\"\n        },\n        {\n          \"exec\": \"yarn install --check-files\"\n        },\n        {\n          \"exec\": \"yarn upgrade @types/conventional-changelog-config-spec @types/fs-extra @types/glob @types/ini @types/jest @types/node @types/semver @types/yargs @typescript-eslint/eslint-plugin @typescript-eslint/parser all-contributors-cli esbuild eslint-config-prettier eslint-import-resolver-node eslint-import-resolver-typescript eslint-plugin-import eslint-plugin-prettier eslint jest-junit jest jsii jsii-diff jsii-docgen jsii-pacmak json-schema json5 npm-check-updates prettier standard-version ts-jest typescript @iarna/toml case chalk conventional-changelog-config-spec fast-json-patch fs-extra glob ini semver shx xmlbuilder2 yaml yargs zlib\"\n        },\n        {\n          \"exec\": \"/bin/bash ./projen.bash\"\n        },\n        {\n          \"spawn\": \"post-upgrade\"\n        }\n      ]\n    },\n    \"watch\": {\n      \"name\": \"watch\",\n      \"description\": \"Watch & compile in the background\",\n      \"steps\": [\n        {\n          \"exec\": \"jsii -w --silence-warnings=reserved-word\"\n        }\n      ]\n    }\n  },\n  \"env\": {\n    \"PATH\": \"$(npx -c \\\"node -e \\\\\\\"console.log(process.env.PATH)\\\\\\\"\\\")\"\n  },\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}\n"
  },
  {
    "path": ".projenrc.js",
    "content": "const { cdk, JsonFile, TextFile } = require(\"./lib\");\nconst { PROJEN_MARKER } = require(\"./lib/common\");\n\nconst project = new cdk.JsiiProject({\n  name: \"projen\",\n  description: \"CDK for software projects\",\n  repository: \"https://github.com/projen/projen.git\",\n\n  authorName: \"Amazon Web Services\",\n  authorUrl: \"https://aws.amazon.com\",\n  authorOrganization: true,\n\n  stability: \"experimental\",\n  keywords: [\n    \"scaffolding\",\n    \"cicd\",\n    \"project\",\n    \"management\",\n    \"generator\",\n    \"cdk\",\n  ],\n\n  pullRequestTemplateContents: [\n    \"---\",\n    \"By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.\",\n  ],\n\n  bundledDeps: [\n    \"conventional-changelog-config-spec\",\n    \"yaml@2.0.0\",\n    \"fs-extra\",\n    \"yargs\",\n    \"case\",\n    \"glob@^7\",\n    \"semver\",\n    \"chalk\",\n    \"@iarna/toml\",\n    \"xmlbuilder2\",\n    \"ini\",\n    \"shx\",\n    \"fast-json-patch\",\n    \"zlib\",\n  ],\n\n  devDeps: [\n    \"@types/conventional-changelog-config-spec\",\n    \"@types/fs-extra@^8\",\n    \"@types/yargs\",\n    \"@types/glob\",\n    \"@types/semver\",\n    \"@types/ini\",\n    \"markmac\",\n    \"esbuild\",\n    \"all-contributors-cli\",\n    \"json5\",\n  ],\n\n  depsUpgradeOptions: {\n    // markmac depends on projen, we are excluding it here to avoid a circular update loop\n    exclude: [\"markmac\"],\n  },\n\n  projenDevDependency: false, // because I am projen\n  releaseToNpm: true,\n  minNodeVersion: \"14.0.0\",\n  workflowNodeVersion: \"14.17.0\", // required by @typescript-eslint/eslint-plugin@5.19.0\n\n  codeCov: true,\n  prettier: true,\n  defaultReleaseBranch: \"main\",\n  gitpod: true,\n  devContainer: true,\n  // since this is projen, we need to always compile before we run\n  projenCommand: \"/bin/bash ./projen.bash\",\n\n  // cli tests need projen to be compiled\n  compileBeforeTest: true,\n\n  jestOptions: {\n    // makes it very hard to iterate with jest --watch\n    coverageText: false,\n    jestConfig: {\n      // By default jest will try to use all CPU cores on the running machine.\n      // But some of our integration tests spawn child processes - so by\n      // creating one jest worker per test, some of the child processes will get\n      // starved of CPU time and sometimes hang or timeout. This should\n      // help mitigate that.\n      maxWorkers: \"50%\",\n    },\n  },\n\n  publishToMaven: {\n    javaPackage: \"io.github.cdklabs.projen\",\n    mavenGroupId: \"io.github.cdklabs\",\n    mavenArtifactId: \"projen\",\n    mavenEndpoint: \"https://s01.oss.sonatype.org\",\n  },\n  publishToPypi: {\n    distName: \"projen\",\n    module: \"projen\",\n  },\n  publishToGo: {\n    moduleName: \"github.com/projen/projen-go\",\n  },\n\n  releaseFailureIssue: true,\n\n  autoApproveUpgrades: true,\n  autoApproveOptions: { allowedUsernames: [\"cdklabs-automation\"] },\n\n  docgenFilePath: \"docs/api/API.md\",\n});\n\n// this script is what we use as the projen command in this project\n// it will compile the project if needed and then run the cli.\nnew TextFile(project, \"projen.bash\", {\n  lines: [\n    \"#!/bin/bash\",\n    `# ${PROJEN_MARKER}`,\n    \"set -euo pipefail\",\n    \"if [ ! -f lib/cli/index.js ]; then\",\n    '  echo \"bootstrapping...\"',\n    \"  npx jsii --silence-warnings=reserved-word --no-fix-peer-dependencies\",\n    \"fi\",\n    \"exec bin/projen $@\",\n  ],\n});\nproject.npmignore.exclude(\"/projen.bash\");\n\nproject.addExcludeFromCleanup(\"test/**\"); // because snapshots include the projen marker...\nproject.gitignore.include(\"templates/**\");\nproject.gitignore.exclude(\"/.idea\");\nproject.gitignore.include(\"test/inventory/**\");\n\n// expand markdown macros in readme\nconst macros = project.addTask(\"readme-macros\");\nmacros.exec(\"mv README.md README.md.bak\");\nmacros.exec(\"cat README.md.bak | markmac > README.md\");\nmacros.exec(\"rm README.md.bak\");\nproject.postCompileTask.spawn(macros);\n\nnew JsonFile(project, \".markdownlint.json\", {\n  obj: {\n    default: true,\n    \"commands-show-output\": false,\n    \"line-length\": {\n      line_length: 200,\n    },\n  },\n});\nproject.npmignore.exclude(\"/.markdownlint.json\");\n\nproject.vscode.launchConfiguration.addConfiguration({\n  type: \"pwa-node\",\n  request: \"launch\",\n  name: \"projen CLI\",\n  skipFiles: [\"<node_internals>/**\"],\n  program: \"${workspaceFolder}/lib/cli/index.js\",\n  outFiles: [\"${workspaceFolder}/lib/**/*.js\"],\n});\n\nproject.github.mergify.addRule({\n  name: \"Label core contributions\",\n  actions: {\n    label: {\n      add: [\"contribution/core\"],\n    },\n  },\n  conditions: [\"author~=^(eladb|Chriscbr)$\", \"label!=contribution/core\"],\n});\n\nproject.gitpod.addCustomTask({\n  name: \"Setup\",\n  init: \"yarn install\",\n  prebuild: \"bash ./projen.bash\",\n  command: \"npx projen build\",\n});\n\nconst setup = project.addTask(\"devenv:setup\");\nsetup.exec(\"yarn install\");\nsetup.spawn(project.buildTask);\nproject.devContainer.addTasks(setup);\nproject.npmignore.exclude(\"/.devcontainer.json\");\n\nproject.addTask(\"contributors:update\", {\n  exec: 'all-contributors check | grep \"Missing contributors\" -A 1 | tail -n1 | sed -e \"s/,//g\" | xargs -n1 | grep -v \"[bot]\" | xargs -n1 -I{} all-contributors add {} code',\n});\nproject.npmignore.exclude(\"/.all-contributorsrc\");\n\nproject.npmignore.exclude(\"/scripts/\");\nproject.npmignore.exclude(\"/ARCHITECTURE.md\");\nproject.npmignore.exclude(\"/CODE_OF_CONDUCT.md\");\nproject.npmignore.exclude(\"/CONTRIBUTING.md\");\nproject.npmignore.exclude(\"/VISION.md\");\nproject.npmignore.exclude(\"/SECURITY.md\");\nproject.npmignore.exclude(\"/.gitattributes\");\nproject.npmignore.exclude(\"/.gitpod.yml\");\n\nfunction setupIntegTest() {\n  const pythonCompatTask = project.addTask(\"integ:python-compat\", {\n    exec: \"scripts/python-compat.sh\",\n    description:\n      \"Checks that projen's submodule structure does not cause import failures for python. Expects python to be installed and projen to be fully built.\",\n  });\n  const integTask = project.addTask(\"integ\", {\n    description: \"Run integration tests\",\n  });\n  integTask.spawn(project.compileTask);\n  integTask.spawn(project.tasks.tryFind(\"package:python\"));\n  integTask.spawn(pythonCompatTask);\n\n  project.buildWorkflow.addPostBuildJobTask(integTask, {\n    tools: { python: { version: \"3.x\" }, go: { version: \"1.16.x\" } },\n  });\n}\n\n// build `run-task` script needed for \"projen eject\" functionality\nfunction setupBundleTaskRunner() {\n  const taskRunnerPath = \"lib/run-task.js\";\n  const task = project.addTask(\"bundle:task-runner\", {\n    description: 'Bundle the run-task script needed for \"projen eject\"',\n    exec: `esbuild src/task-runtime.ts --outfile=${taskRunnerPath} --bundle --platform=node --external:\"*/package.json\"`,\n  });\n  task.exec(\n    `echo \"#!/usr/bin/env node\" | cat - lib/run-task.js | tee lib/run-task.js > /dev/null`,\n    {\n      name: \"Insert Node shebang to beginning of the file\",\n    }\n  );\n  task.exec(\n    `echo \"const runtime = new TaskRuntime(\\\\\".\\\\\");\\nruntime.runTask(process.argv[2]);\" >> ${taskRunnerPath}`,\n    {\n      name: \"Add driver code to end of the file\",\n    }\n  );\n  project.postCompileTask.spawn(task);\n}\n\nsetupIntegTest();\nsetupBundleTaskRunner();\n\n// we are projen, so re-synth after compiling.\n// fixes feedback loop where projen contibutors run \"build\"\n// but not all files are updated\nproject.postCompileTask.spawn(project.defaultTask);\n\nproject.synth();\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"type\": \"pwa-node\",\n      \"request\": \"launch\",\n      \"name\": \"projen CLI\",\n      \"skipFiles\": [\n        \"<node_internals>/**\"\n      ],\n      \"program\": \"${workspaceFolder}/lib/cli/index.js\",\n      \"outFiles\": [\n        \"${workspaceFolder}/lib/**/*.js\"\n      ]\n    }\n  ],\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}\n"
  },
  {
    "path": "ARCHITECTURE.md",
    "content": "# Architecture\n\nThis document attempts to document the high-level architecture of projen. This\ncould be useful if you're trying to contribute to projen, trying to debug an\nerror message, or if you're just curious!\n\n## How are a project's files synthesized?\n\n### Bird's eye view\n\nWhen `npx projen` is run, the command-line process executes the project's\nprojenrc file. This is usually a file like `.projenrc.js` or `projenrc.java`.\n\n> The \"rc\" in the name is a common convention for configuration files - see\nhttps://en.wikipedia.org/wiki/Configuration_file.\n\nprojenrc files follow a general structure:\n\n1. they define one or more `Project` instances\n2. these projects are configured and customized\n3. `project.synth()` is called on the root project\n\nFor simplicity, most of this document will just assume there is a single project\nunless otherwise specified.\n\nSteps 1 and 2 only serve to initialize an in-memory representation of the\nproject. projen runs on Node.js; so in the JavaScript runtime, these steps\ncreate a hierarchy of objects (called `Component`'s), each with various fields\nspecifying the names of files, tasks, options, and so on. The data within each\ncomponent provides enough information to uniquely determine the structure and\ncontents of the files it is responsible for. Components can add other components\nto the project, and even make changes to existing components through common\ninterfaces like `project.tasks`, `project.deps`, or\n`project.tryFindObjectFile()`.\n\nStep 3 is the only step that actually performs any changes to files in the\nuser's project / file system.\n\n### Synthesizing actual files\n\nThe `synth()` method of `Project` performs the actual synthesizing (and\nupdating) of all configuration files managed by projen. This is achieved by\ndeleting all projen-managed files (if there are any), and then re-synthesizing\nthem based on the latest configuration specified by the user. In code, this\nbreaks down as follows (slightly simplified):\n\n1. the project's `preSynthesize()` method is called\n2. all components' `preSynthesize()` methods are called\n3. all projen-synthesized files are cleaned up\n4. all components' `synthesize()` methods are called (most files are generated)\n5. all components' `postSynthesize()` methods are called\n6. the project's `postSynthesize()` method is called\n\nIn the above list, step 3 is critical since it's important that only files that\nare managed by projen get cleaned up - we don't want user source code to be\ndeleted! Moreover, if a file was synthesized by projen at one point in time, but\nlater a user changes their projenrc configuration so it is no longer necessary,\nwe want it to be automatically cleaned up.\n\nRather than manually keeping track of synthesized files with some form of stored\nstate (which could easily get desynced by tampering from users or other tools),\nprojen simply looks for files with the _magic string_ that you get by\nconcatenating `\"~~ Generated by \"` and `\"projen\"`, and removes them. See\n[cleanup.ts](src/cleanup.ts).\n\nSince any file with this string gets automatically cleaned up, you should not\ninclude this magic string verbatim in source code files. If you are writing your\nown projen project type or component, you can simply reference this magic string\nvia `FileBase.PROJEN_MARKER`.\n\n----\n\nSteps 1, 2, 4, 5, and 6 are more straightforward. `synthesize()` is used to\ngenerate the actual files in the user's file system (including applying\nappropriate read/write permissions). `preSynthesize()` and `postSynthesize()`\nare complementary methods that can used to enable components to perform\nadditional logic before and after synthesis. See the source code of `Component`\nand `FileBase` for more details.\n\n> Note: in practice, there are many existing components for creating specific\n> types of files (such as `JsonFile` and `TextFile`), so we recommend using\n> these over hand-making components wherever possible. (Believe in the power of\n> abstractions!)\n\nSince `preSynthesize()` is called before any files are cleaned up, it can be\nused for e.g. observing any changes made to a generated file, and then adjusting\nhow the file is re-synthesized based on those changes. (As an example, running\n`npm install` or `yarn install` can change the dependencies listed in the\n`package.json` file of JavaScript projects. The built-in `NodeProject` uses\n`preSynthesize()` to automatically integrate these changes to the `package.json`\nfile synthesized by projen, instead of overriding them.)\n\n## How can projenrc files be written in multiple languages?\n\nThe projen library is transpiled by [jsii](https://github.com/aws/jsii) so that\nprojenrc files can be written in languages besides JavaScript. Under the hood,\nAPI calls made in projen's  Java/Python/etc. libraries communicate with a\nJavaScript runtime to deliver the same behavior as if you wrote the code in\nJavaScript. For more information, check out [jsii](https://github.com/aws/jsii).\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "\n# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nelad.benisrael@gmail.com. All complaints will be reviewed and investigated \npromptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to projen\n\nThanks for your interest in contributing to projen! :heart:\n\nThis document describes how to set up a development environment and submit your\ncontributions. Please read it carefully and let us know if it's not up-to date\n(or even better, submit a pull request with your corrections! :wink:).\n\n## Prerequisites\n\n### Manually install tools\n\nThe following tools need to be installed to develop on projen locally.\n\n- [Node]\n- [Yarn]\n- [Maven]\n\n[Node]: https://nodejs.org/en/download/\n[Yarn]: https://yarnpkg.com/en/docs/install\n[Maven]: https://maven.apache.org/install\n\n## Getting Started\n\nThe basic commands to get the repository cloned and built locally follow:\n\n```console\n$ git clone git@github.com:projen/projen\n$ cd projen\n$ yarn # install dependencies\n$ yarn build # build projen\n```\n\n## Code Organization\n\nCheck out [this recording](https://www.youtube.com/watch?v=8dHwnuSND14) from a walkthrough of the projen codebase.\n\n### Development workflow\n\nThe projen package has the following scripts:\n\n- `build` - builds the package and runs all unit tests\n- `watch` - watches for file changes and builds them progressively\n- `test` - executes all unit tests\n- `test:update` - executes all unit tests and overwrites snapshot expectations (those `.snap` files).\n- `test:watch` - runs all unit tests and reruns tests when files are changed\n- `package` - emits publishable artifacts to `dist`.\n- `eslint` - run linter against source code\n\nEach of these scripts can be executed using `yarn <script>` or `npx projen <script>`.\n\nTests are located under `src/__tests__` and executed from javascript code, so\nmake sure to compile once before running any tests.\n\nOne trick for quickly iterating is to run `yarn watch` in one terminal, and\n`yarn test:watch` in another. Then, when you change your unit tests the code\nwill automatically recompile, thus triggering the tests to automatically re-run.\n\n#### Linting & Formatting\n\nEslint is used to lint and format our typescript code. The `eslint`\nscript can be run from the root of the package.\n\nYou can integrate the linting and formatting workflow with your editor or ide by\ninstalling the approporiate eslint plugin. For example, when using Visual Studio\nCode, the [eslint plugin](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)\nexposes a number of options including \"fix on save\". This will auto correct lint\nand formatting errors whenever possible while saving a document.\n\n### Testing against local projects\n\nWhen your local version of projen builds successfully, you can test it to create\na new project by going into another directory and invoking the binary directly:\n\nFirst, tell yarn to create a link from your local development copy:\n\n```console\n$ cd /path/to/local/projen\n$ yarn link\n```\n\nNow, to create new projects:\n\n```console\n$ mkdir /my/new/project\n$ cd /my/new/project\n$ yarn link projen\n$ alias pj=\"node_modules/projen/bin/projen\"\n$ pj new TYPE\n$ yarn link projen # <-- important to run this again\n```\n\nIf you already have an existing project and you want to test a new projen\nfeature against it:\n\n```console\n$ cd /my/other/project\n$ yarn link projen\n$ pj\n```\n\nFrom now on, running `pj` in this session will use the local development version of \nprojen instead of the latest one from npm.\n\n```console\n$ yarn unlink projen\n```\n\n### Version bumping\n\nCurrently projen bumps versions automatically thru a GitHub action when a commit\npushed to master successfully builds. Projen follows [semantic versioning](https://semver.org/)\nthrough the [standard-version](https://github.com/conventional-changelog/standard-version)\nnpm utility.\n\n## Making a pull request\n\n* Commit title and message (and PR title and description) must adhere to [conventionalcommits](https://www.conventionalcommits.org).\n  * The title must begin with `feat(module): title`, `fix(module): title`,\n  `refactor(module): title` or `chore(module): title`, where the module refers\n  to the projects or components that the change centers on.\n  The module can be omitted, so \"feat: title\" is okay as well.\n  * Title should be lowercase.\n  * No period at the end of the title.\n* Commit message should describe _motivation_. Think about your code reviewers and what information they need in\n  order to understand what you did. If it's a big commit (hopefully not), try to provide some good entry points so\n  it will be easier to follow.\n* Commit message should indicate which issues are fixed: `fixes #<issue>` or `closes #<issue>`.\n* Shout out to collaborators.\n* If not obvious (i.e. from unit tests), describe how you verified that your change works.\n* If this commit includes breaking changes, they must be listed at the end in the following format (notice how multiple breaking changes should be formatted):\n\n```\nBREAKING CHANGE: Description of what broke and how to achieve this behavior now\n* **module-name:** Another breaking change\n* **module-name:** Yet another breaking change\n```\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <a href=\"https://projen.io\">\n    <img src=\"https://raw.githubusercontent.com/projen/projen/main/logo/projen.svg\">\n    <h3 align=\"center\">projen</h3>\n  </a>\n</p>\n\n<p align=\"center\">\n  Define and maintain complex project configuration through code.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://projen.io/\"><strong>Documentation</strong></a> ·\n  <a href=\"https://github.com/projen/projen/releases\"><strong>Changelog</strong></a> ·\n  <a href=\"#project-types\"><strong>Project types</strong></a> ·\n  <a href=\"#community\"><strong>Join the community</strong></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://opensource.org/licenses/Apache-2.0\"><img src=\"https://img.shields.io/badge/License-Apache%202.0-yellowgreen.svg\" alt=\"Apache 2.0 License\"></a>\n  <a href=\"https://gitpod.io/#https://github.com/projen/projen\"><img src=\"https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod\" alt=\"Gitpod ready-to-code\"></a>\n  <a href=\"https://github.com/projen/projen/actions/workflows/build.yml\"><img src=\"https://github.com/projen/projen/workflows/Build/badge.svg\" alt=\"Build badge\"></a>\n  <a href=\"https://github.com/projen/projen/actions/workflows/release.yml\"><img src=\"https://github.com/projen/projen/workflows/Release/badge.svg\" alt=\"Release badge\"></a>\n  <a href=\"https://github.com/projen/projen/commits/main\"><img src=\"https://img.shields.io/github/commit-activity/w/projen/projen\" alt=\"Commit activity\"></a>\n</p>\n\n<br/>\n\n*projen* synthesizes project configuration files such as `package.json`,\n`tsconfig.json`, `.gitignore`, GitHub Workflows, eslint, jest, etc from a\nwell-typed definition written in JavaScript.\n\nAs opposed to existing templating/scaffolding tools, *projen* is not a one-off\ngenerator. Synthesized files should never be manually edited (in fact, projen\nenforces that). To modify your project setup, users interact with rich\nstrongly-typed class and execute `projen` to update their project configuration\nfiles.\n\nBy defining a custom project type and using projen in multiple repositories, it's\npossible to update configuration files and CI/CD workflows across dozens (or\nhundreds!?) of projects.\n\nCheck out [this talk](https://youtu.be/SOWMPzXtTCw) about projen from its creator.\n\n## Getting Started\n\n_projen_ doesn't need to be installed. You will be using [npx](https://docs.npmjs.com/cli/v7/commands/npx) to run _projen_ which takes care of all required setup steps.\n\nTo create a new project, run the following command and follow the instructions:\n\n```console\n$ mkdir my-project\n$ cd my-project\n$ npx projen new PROJECT-TYPE\n🤖 Synthesizing project...\n...\n```\n\n### Project types\n\nCurrently supported project types (use `npx projen new` without a type for a\nfull list):\n\n**Built-in:** (run `npx projen new <type>`)\n\n<!-- <macro exec=\"node ./scripts/readme-projects.js\"> -->\n* [awscdk-app-java](https://projen.io/api/API.html#projen-awscdk-awscdkjavaapp) - AWS CDK app in Java.\n* [awscdk-app-py](https://projen.io/api/API.html#projen-awscdk-awscdkpythonapp) - AWS CDK app in Python.\n* [awscdk-app-ts](https://projen.io/api/API.html#projen-awscdk-awscdktypescriptapp) - AWS CDK app in TypeScript.\n* [awscdk-construct](https://projen.io/api/API.html#projen-awscdk-awscdkconstructlibrary) - AWS CDK construct library project.\n* [cdk8s-app-py](https://projen.io/api/API.html#projen-cdk8s-cdk8spythonapp) - CDK8s app in Python.\n* [cdk8s-app-ts](https://projen.io/api/API.html#projen-cdk8s-cdk8stypescriptapp) - CDK8s app in TypeScript.\n* [cdk8s-construct](https://projen.io/api/API.html#projen-cdk8s-constructlibrarycdk8s) - CDK8s construct library project.\n* [cdktf-construct](https://projen.io/api/API.html#projen-cdktf-constructlibrarycdktf) - CDKTF construct library project.\n* [java](https://projen.io/api/API.html#projen-java-javaproject) - Java project.\n* [jsii](https://projen.io/api/API.html#projen-cdk-jsiiproject) - Multi-language jsii library project.\n* [nextjs](https://projen.io/api/API.html#projen-web-nextjsproject) - Next.js project without TypeScript.\n* [nextjs-ts](https://projen.io/api/API.html#projen-web-nextjstypescriptproject) - Next.js project with TypeScript.\n* [node](https://projen.io/api/API.html#projen-javascript-nodeproject) - Node.js project.\n* [project](https://projen.io/api/API.html#projen-project) - Base project.\n* [python](https://projen.io/api/API.html#projen-python-pythonproject) - Python project.\n* [react](https://projen.io/api/API.html#projen-web-reactproject) - React project without TypeScript.\n* [react-ts](https://projen.io/api/API.html#projen-web-reacttypescriptproject) - React project with TypeScript.\n* [typescript](https://projen.io/api/API.html#projen-typescript-typescriptproject) - TypeScript project.\n* [typescript-app](https://projen.io/api/API.html#projen-typescript-typescriptappproject) - TypeScript app.\n<!-- </macro> -->\n\n**External:** (run `npx projen new --from <type>`)\n\n* [projen-github-action-typescript](https://github.com/projen/projen-github-action-typescript/blob/main/API.md) - GitHub Action in TypeScript project.\n\n> Use `npx projen new PROJECT-TYPE --help` to view a list of command line\n> switches that allows you to specify most project options during bootstrapping.\n> For example: `npx projen new jsii --author-name \"Jerry Berry\"`.\n\nThe `new` command will create a `.projenrc.js` file which looks like this for\n`jsii` projects:\n\n```js\nconst { JsiiProject } = require('projen');\n\nconst project = new JsiiProject({\n  authorAddress: \"elad.benisrael@gmail.com\",\n  authorName: \"Elad Ben-Israel\",\n  name: \"foobar\",\n  repository: \"https://github.com/eladn/foobar.git\",\n});\n\nproject.synth();\n```\n\nThis program instantiates the project type with minimal setup, and then calls\n`synth()` to synthesize the project files. By default, the `new` command will\nalso execute this program, which will result in a fully working project.\n\nOnce your project is created, you can configure your project by editing\n`.projenrc.js` and re-running `npx projen` to synthesize again.\n\n> The files generated by _projen_ are considered an \"implementation detail\" and\n> _projen_ protects them from being manually edited (most files are marked\n> read-only, and an \"anti tamper\" check is configured in the CI build workflow\n> to ensure that files are not updated during build).\n\nFor example, to setup PyPI publishing in `jsii` projects, you can use\n[`python option`](https://github.com/eladb/projen/blob/master/API.md#projen-jsiipythontarget):\n\n```js\nconst project = new JsiiProject({\n  // ...\n  python: {\n    distName: \"mydist\",\n    module: \"my_module\",\n  }\n});\n```\n\nRun:\n\n```shell\nnpx projen\n```\n\nAnd you'll notice that your `package.json` file now contains a `python` section in\nits `jsii` config and the GitHub `release.yml` workflow includes a PyPI\npublishing step.\n\nWe recommend to put this in your shell profile, so you can simply run `pj` every\ntime you update `.projenrc.js`:\n\n```bash\nalias pj='npx projen'\n```\n\nMost projects come with an assortment of **tasks** that handle various\ndevelopment activities, from compiling to publishing. Tasks can be and composed\ntogether, and can be run as local commands or turned into GitHub workflows. You\ncan list all tasks with `npx projen --help`:\n\n```shell\n$ npx projen --help\nprojen [command]\n\nCommands:\n  projen new [PROJECT-TYPE-NAME] [OPTIONS]  Creates a new projen project\n  projen clobber                            hard resets to HEAD of origin and cleans the local repo\n  projen compile                            Only compile\n  projen test:compile                       compiles the test code\n  projen test                               Run tests\n  projen build                              Full release build (test+compile)\n  projen upgrade-dependencies               upgrade dependencies\n  projen upgrade-projen                     upgrade projen\n...\n```\n\nThe `build` task is the same task that's executed in your CI builds. It\ntypically compiles, lints, tests and packages your module for distribution.\n\n### Shell Completions\nIf installed as a global package, `projen` includes rich shell tab-completion support. To enable this in your shell, run:\n```shell\n# Bash\nprojen completion >> ~/.bashrc\n\n# ZSH\nprojen completion >> ~/.zshrc\n```\n## Features\n\nSome examples for features built-in to project types:\n\n* Fully synthesize `package.json`\n* Standard npm scripts like `compile`, `build`, `test`, `package`\n* eslint\n* Jest\n* jsii: compile, package, api compatibility checks, API.md\n* Bump & release scripts with CHANGELOG generation based on conventional commits\n* Automated PR builds\n* Automated releases to npm, maven, NuGet and PyPI\n* Automated dependency upgrades\n* Mergify configuration\n* LICENSE file generation\n* gitignore + npmignore management\n* Node \"engines\" support with coupling to CI build environment and @types/node\n* Anti-tamper: CI builds will fail if a synthesized file is modified manually\n\n## Documentation\n\nFor documentation including examples and a full API reference, visit <https://projen.io/>.\n\n## Ecosystem\n\n_projen_ takes a \"batteries included\" approach and aims to offer dozens of different project types out of\nthe box (we are just getting started). Think `projen new react`, `projen new angular`, `projen new java-maven`,\n`projen new awscdk-typescript`, `projen new cdk8s-python` (nothing in projen is tied to javascript or npm!)...\n\nAdding new project types is as simple as submitting a pull request to this repo and exporting a class that\nextends `projen.Project` (or one of its derivatives). Projen automatically discovers project types so your\ntype will immediately be available in `projen new`.\n\n### Projects in external modules\n\n_projen_ is bundled with many project types out of the box, but it can also work\nwith project types and components defined in external jsii modules (the reason\nwe need jsii is because projen uses the jsii metadata to discover project types\n& options in projen new).\n\nSay we have a module in npm called `projen-vuejs` which includes a single project\ntype for vue.js:\n\n```bash\n$ npx projen new --from projen-vuejs\n```\n\nIf the referenced module includes multiple project types, the type is required.\nSwitches can also be used to specify initial values based on the project type\nAPIs. You can also use any package syntax supported by [yarn\nadd](https://classic.yarnpkg.com/en/docs/cli/add#toc-adding-dependencies) like\n`projen-vuejs@1.2.3`, `file:/path/to/local/folder`,\n`git@github.com/awesome/projen-vuejs#1.2.3`, etc.\n\n```bash\n$ npx projen new --from projen-vuejs@^2 vuejs-ts --description \"my awesome vue project\"\n```\n\nUnder the hood, `projen new` will install the `projen-vuejs` module from npm\n(version 2.0.0 and above), discover the project types in it and bootstrap the\n`vuejs-ts` project type. It will assign the value `\"my awesome vue project\"` to\nthe `description` field. If you examine your `.projenrc.js` file, you'll see\nthat `projen-vuejs` is defined as a dev dependency:\n\n```javascript\nconst { VueJsProject } = require('projen-vuejs');\n\nconst project = new VueJsProject({\n  name: 'my-vuejs-sample',\n  description: \"my awesome vue project\",\n  // ...\n  devDeps: [\n    'projen-vuejs'\n  ]\n});\n\nproject.synth();\n```\n\n## Roadmap\n\nSee [Vision](./VISION.md).\n\n## FAQ\n\n### Do I have to write my configuration in JavaScript?\n\nNot at all! JavaScript is the default, but it's also possible to write it in\nJava, TypeScript, or even JSON. Python support is also planned. This is made\npossible by the [jsii](https://github.com/aws/jsii) library which allows us\nto write APIs once and generate libraries in several languages. You can choose\na different language by passing the `--projenrc-ts`, `--projenrc-java`, or\n`--projenrc-json` flags when running `projen new`.\n\nNote: using a `.projenrc.json` file to specify configuration only allows\naccessing a subset of the entire API - the options which are passed to the\nconstructor of each project type.\n\n### How does projen work with my IDE?\n\nprojen has an unofficial [VS Code extension]. Check it out!\n\n[VS Code extension]: https://marketplace.visualstudio.com/items?itemName=MarkMcCulloh.vscode-projen\n\n## Community\n\nThe projen community can be found within the #projen channel in the [cdk.dev]\ncommunity Slack workspace.\n\n[cdk.dev]: https://cdk.dev/\n\n### Virtual Meetup\n\n- Thursday June 30, 2022 \n- 1-2pm America/New_York (EDT)\n- [CFP](https://bit.ly/3NEc0UQ) a Google Form\n- CFP Closes Saturday April 30, 2022\n- Hosted on [Zoom](https://zoom.us/j/92399854777?pwd=OUZybHlobHNoZUs1VVordWhaRTVGdz09#success)\n\n## Contributions\n\nContributions of all kinds are welcome! Check out our [contributor's\nguide](./CONTRIBUTING.md) and our [code of conduct](./CODE_OF_CONDUCT.md).\n\nFor a quick start, check out a development environment:\n\n```bash\n$ git clone git@github.com:projen/projen\n$ cd projen\n$ yarn\n$ yarn watch # compile in the background\n```\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->\n[![All Contributors](https://img.shields.io/badge/all_contributors-67-orange.svg?style=flat-square)](#contributors-)\n<!-- ALL-CONTRIBUTORS-BADGE:END -->\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"http://eladb.github.com/\"><img src=\"https://avatars3.githubusercontent.com/u/598796?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Elad Ben-Israel</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=eladb\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://rybicki.io/\"><img src=\"https://avatars2.githubusercontent.com/u/5008987?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christopher Rybicki</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=Chriscbr\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://p6m7g8.github.io/\"><img src=\"https://avatars0.githubusercontent.com/u/34295?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Philip M. Gollucci</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=pgollucci\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/hoegertn\"><img src=\"https://avatars2.githubusercontent.com/u/1287829?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Thorsten Hoeger</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=hoegertn\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/kcwinner\"><img src=\"https://avatars3.githubusercontent.com/u/2728868?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kenneth Winner</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=kcwinner\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/JordanSinko\"><img src=\"https://avatars2.githubusercontent.com/u/10212966?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jordan Sinko</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=JordanSinko\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/misterjoshua\"><img src=\"https://avatars2.githubusercontent.com/u/644092?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Josh Kellendonk</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=misterjoshua\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/andrestone\"><img src=\"https://avatars1.githubusercontent.com/u/7958086?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>andrestone</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=andrestone\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://pallares.io/\"><img src=\"https://avatars3.githubusercontent.com/u/1077520?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Cristian Pallarés</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=skyrpex\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jogold\"><img src=\"https://avatars2.githubusercontent.com/u/12623249?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jonathan Goldwasser</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=jogold\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://www.matthewbonig.com/\"><img src=\"https://avatars2.githubusercontent.com/u/1559437?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Matthew Bonig</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=mbonig\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/pahud\"><img src=\"https://avatars3.githubusercontent.com/u/278432?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Pahud Hsieh</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=pahud\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/adamelmore\"><img src=\"https://avatars2.githubusercontent.com/u/2363879?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Adam Elmore</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=adamelmore\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/abelmokadem\"><img src=\"https://avatars0.githubusercontent.com/u/9717944?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Ash</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=abelmokadem\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/jmourelos\"><img src=\"https://avatars3.githubusercontent.com/u/3878434?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=jmourelos\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/bigkraig\"><img src=\"https://avatars1.githubusercontent.com/u/508403?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kraig Amador</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=bigkraig\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/mmuller88\"><img src=\"https://avatars0.githubusercontent.com/u/18393842?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Martin Muller</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=mmuller88\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://tlakomy.com/\"><img src=\"https://avatars2.githubusercontent.com/u/16646517?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Tomasz Łakomy</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=tlakomy\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/john-tipper\"><img src=\"https://avatars2.githubusercontent.com/u/9730398?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>john-tipper</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=john-tipper\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/henrysachs\"><img src=\"https://avatars0.githubusercontent.com/u/17173951?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Henry Sachs</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=henrysachs\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/eganjs\"><img src=\"https://avatars3.githubusercontent.com/u/6639482?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Joseph Egan</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=eganjs\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://skorfmann.com/\"><img src=\"https://avatars1.githubusercontent.com/u/136789?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Sebastian Korfmann</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=skorfmann\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://www.callant.net/\"><img src=\"https://avatars1.githubusercontent.com/u/5915843?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bart Callant</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=bartcallant\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/campionfellin\"><img src=\"https://avatars3.githubusercontent.com/u/11984923?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Campion Fellin</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=campionfellin\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/gradybarrett\"><img src=\"https://avatars1.githubusercontent.com/u/1140074?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Grady Barrett</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=gradybarrett\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/HassanMahmud\"><img src=\"https://avatars3.githubusercontent.com/u/58504381?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Hassan Mahmud</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=HassanMahmud\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://dk.linkedin.com/in/hassanmahmud93\"><img src=\"https://avatars1.githubusercontent.com/u/7426703?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Hassan Mahmud</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=hass123uk\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://joapy.com/\"><img src=\"https://avatars3.githubusercontent.com/u/325306?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jake Pearson</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=jakepearson\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/JeremyJonas\"><img src=\"https://avatars1.githubusercontent.com/u/464119?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jeremy Jonas</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=JeremyJonas\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://dev.to/martzcodes\"><img src=\"https://avatars1.githubusercontent.com/u/978362?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Matt Martz</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=martzcodes\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/fongie\"><img src=\"https://avatars1.githubusercontent.com/u/19932622?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Max Körlinge</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=fongie\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://blog.neilkuan.dev/\"><img src=\"https://avatars2.githubusercontent.com/u/46012524?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Neil Kuan</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=guan840912\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://dynobase.dev/\"><img src=\"https://avatars3.githubusercontent.com/u/3391616?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Rafal Wilinski</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=RafalWilinski\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://keybase.io/romainmuller\"><img src=\"https://avatars2.githubusercontent.com/u/411689?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Romain Marcadier</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=RomainMuller\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/thomasklinger1234\"><img src=\"https://avatars1.githubusercontent.com/u/39558817?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Thomas Klinger</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=thomasklinger1234\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/gwriss\"><img src=\"https://avatars2.githubusercontent.com/u/1842089?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Tobias</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=gwriss\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/flyingImer\"><img src=\"https://avatars0.githubusercontent.com/u/1973868?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>flyingImer</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=flyingImer\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Hunter-Thompson\"><img src=\"https://avatars.githubusercontent.com/u/20844961?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b> Aatman </b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=Hunter-Thompson\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/mmcculloh-dms\"><img src=\"https://avatars.githubusercontent.com/u/68597641?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Mark McCulloh</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=mmcculloh-dms\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/aisamu\"><img src=\"https://avatars.githubusercontent.com/u/431708?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Samuel Tschiedel</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=aisamu\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/iliapolo\"><img src=\"https://avatars.githubusercontent.com/u/1428812?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Eli Polonsky</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=iliapolo\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://unsubstantiated.blog/\"><img src=\"https://avatars.githubusercontent.com/u/1308885?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Alexander Steppke</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=Miradorn\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/kanatti\"><img src=\"https://avatars.githubusercontent.com/u/8623654?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Balagopal Kanattil</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=kanatti\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://twitter.com/bracki\"><img src=\"https://avatars.githubusercontent.com/u/49786?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jan Brauer</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=bracki\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://polothy.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/634657?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Mark Nielsen</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=polothy\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/MrArnoldPalmer\"><img src=\"https://avatars.githubusercontent.com/u/7221111?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Mitchell Valine</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=MrArnoldPalmer\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://blog.neilkuan.net/\"><img src=\"https://avatars.githubusercontent.com/u/46012524?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Neil Kuan</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=neilkuan\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://garbe.io/\"><img src=\"https://avatars.githubusercontent.com/u/721899?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Philipp Garbe</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=pgarbe\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://selfstructured.com/\"><img src=\"https://avatars.githubusercontent.com/u/361689?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shawn MacIntyre</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=smacintyre\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/tobias-bardino\"><img src=\"https://avatars.githubusercontent.com/u/1842089?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Tobias</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=tobias-bardino\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/yglcode\"><img src=\"https://avatars.githubusercontent.com/u/11893614?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Yigong Liu</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=yglcode\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/eduardomourar\"><img src=\"https://avatars.githubusercontent.com/u/16357187?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Eduardo Rodrigues</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=eduardomourar\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/hassanazharkhan\"><img src=\"https://avatars.githubusercontent.com/u/57677979?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Hassan Azhar</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=hassanazharkhan\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.linkedin.com/in/julian-michel-812a223a/\"><img src=\"https://avatars.githubusercontent.com/u/15660169?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Julian Michel</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=jumic\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/lmarsden\"><img src=\"https://avatars.githubusercontent.com/u/51232932?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>lmarsden</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=lmarsden\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/adrianmace\"><img src=\"https://avatars.githubusercontent.com/u/5071859?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Adrian Mace</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=adrianmace\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/mKeRix\"><img src=\"https://avatars.githubusercontent.com/u/770596?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Heiko Rothe</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=mKeRix\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/hyandell\"><img src=\"https://avatars.githubusercontent.com/u/477715?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Henri Yandell</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=hyandell\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/mwg-rea\"><img src=\"https://avatars.githubusercontent.com/u/82480228?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Matthew Gamble</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=mwg-rea\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://willdady.com/\"><img src=\"https://avatars.githubusercontent.com/u/204259?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Will Dady</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=willdady\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/msessa\"><img src=\"https://avatars.githubusercontent.com/u/1912143?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Matteo Sessa</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=msessa\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Hi-Fi\"><img src=\"https://avatars.githubusercontent.com/u/1499780?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Juho Saarinen</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=Hi-Fi\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/njlynch\"><img src=\"https://avatars.githubusercontent.com/u/1376292?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Nick Lynch</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=njlynch\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://amani.kilumanga.com/\"><img src=\"https://avatars.githubusercontent.com/u/8690282?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Amani Kilumanga</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=dkaksl\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://blog.herlein.com/\"><img src=\"https://avatars.githubusercontent.com/u/173428?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Greg Herlein</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=gherlein\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/kaizen3031593\"><img src=\"https://avatars.githubusercontent.com/u/36202692?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Kaizen Conroy</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=kaizen3031593\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/saudkhanzada\"><img src=\"https://avatars.githubusercontent.com/u/30137907?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Saud Khanzada</b></sub></a><br /><a href=\"https://github.com/projen/projen/commits?author=saudkhanzada\" title=\"Code\">💻</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\n## License\n\nDistributed under the [Apache-2.0](./LICENSE) license.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nUse this section to tell people about which versions of your project are\ncurrently being supported with security updates.\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 0.x     | :white_check_mark: |\n\n## Reporting a Vulnerability\n\nUse this section to tell people how to report a vulnerability.\n\nTell them where to go, how often they can expect to get an update on a\nreported vulnerability, what to expect if the vulnerability is accepted or\ndeclined, etc.\n"
  },
  {
    "path": "VISION.md",
    "content": "# The vision of projen\n\nThis is basically a paper napkin for ideas for the roadmap for the project. Comments/PRs are more than welcome!\n\n## Ecosystem\n\n\"Batteries included\" is a very powerful concept. It allows users to discover the breadth of their options using a\nsingle experience, instead of having to read the manual for 4 different plugins with horrible versioning conflicts.\n\nOn the other hand, one of the goals of projen is to support the ever-increasing amount of tools people use in order to build software,\nand to allow teams to use projen internally for their needs and to do that, we must have an open ecosystem which allows anyone to\nfreely publish and consume components and projects.\n\nSo we need to solve a few problems:\n\n- Discovery: projects/components from ecosystem libraries should feel 1st class.\n- Velocity: a single codebase can easily manage breaking changes in APIs, but it's much harder to do that at the\n  ecosystem level, and usually a source of a lot of frustration.\n\n### Discovery\n\nThe desired experience is that `projen new --help` will list all public project types, including types from ecosystem libraries.\n\nA simple solution that may go a long way is to create a \"sources\" file in the projen repo, and allow anyone to add their library\nto the file through a pull request. The source list will be basically names of npm modules. During _build_, we will process this\nlist by downloading the package information from npm, and injest their `.jsii` manifests into the CLI.\n\nYes, this means that new sources will be added only when projen is released. But projen is released for every merged PR.\n\nWe will also need to indicate major version compatibility of each project/component (see \"Velocity\" below).\n\n### Velocity\n\nIn semver (semantic versioning), the only right way to introduce a breaking change (API or behavioral) is to release\na new major version. It will take a couple of years for projen to stabilize, and we want the ecosystem to grow with it.\nA monolithic module makes this less of a problem because there aren't many libraries that depend on projen, so a major\nversion once in a while is tolerable.\n\nThis means that projen will release major versions all the time. Think 232.4.34.\n\nSo we need our ecosystem to continuously take updates and release new versions that were tested with the new major version.\nIn most cases, projects and component won't get broken, but sometimes they will and then the maintainer will need to resolve.\nLuckily this mechanism already exists in projen (`projenUpgradeSecret`).\nIt is opt-in because it requires a the user to upload a GitHub secret, but maybe if we implement some support for secret management,\nwe could make that the default behavior.\n\nAs mentioned above, when we process our \"sources\" during build, we can check the projen version they were tested with and\ndetermine if it's compatible with the version on the user's system.\n\n## Services\n\nprojen should be able to deploy & manage cloud services related to your development environment. For example,\na service to manage secrets for me in AWS Secrets Manager, a cloud development account, CI/CD infrastructure, etc.\n\nUsing the CDKs (AWS CDK, CDK for Terraform, CDK for Kubernetes), complete services can be expressed as constructs\nand shared and published as libraries. It is fairly easy (#) to simply allow CDK constructs to be freely used\ninside projen components.\n\n## Ideas\n\n- [ ] Components: re-think/re-factor how components and projects interact to allow more modular and composable usage.\n- [ ] Discoverability of external components/modules through the CLI\n- [ ] Support projenrc in YAML (fully declarative, if one desires)\n- [x] CLI bash completion\n- [ ] License checking (non CDK specific)\n- [ ] Multi-repository projects (alternative to mono-repos)\n- [ ] IDE integration (e.g. task execution)\n- [ ] Support multiple workflow engines (currently only GitHub is supported)\n"
  },
  {
    "path": "assets/web/react/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"icon\" href=\"%PUBLIC_URL%/favicon.ico\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta name=\"theme-color\" content=\"#000000\" />\n    <meta\n      name=\"description\"\n      content=\"Web site created using create-react-app\"\n    />\n    <link rel=\"apple-touch-icon\" href=\"%PUBLIC_URL%/logo192.png\" />\n    <!--\n      manifest.json provides metadata used when your web app is installed on a\n      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n    -->\n    <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\" />\n    <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the `public` folder during the build.\n      Only files inside the `public` folder can be referenced from the HTML.\n\n      Unlike \"/favicon.ico\" or \"favicon.ico\", \"%PUBLIC_URL%/favicon.ico\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running `npm run build`.\n    -->\n    <title>React App</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"root\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run `npm start` or `yarn start`.\n      To create a production bundle, use `npm run build` or `yarn build`.\n    -->\n  </body>\n</html>\n"
  },
  {
    "path": "assets/web/react/manifest.json",
    "content": "{\n  \"short_name\": \"React App\",\n  \"name\": \"Create React App Sample\",\n  \"icons\": [\n    {\n      \"src\": \"favicon.ico\",\n      \"sizes\": \"64x64 32x32 24x24 16x16\",\n      \"type\": \"image/x-icon\"\n    },\n    {\n      \"src\": \"logo192.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"192x192\"\n    },\n    {\n      \"src\": \"logo512.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"512x512\"\n    }\n  ],\n  \"start_url\": \".\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#000000\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "assets/web/react/robots.txt",
    "content": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "bin/projen",
    "content": "#!/usr/bin/env node\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nrequire('../lib/cli/index.js');\n"
  },
  {
    "path": "docs/CNAME",
    "content": "projen.io"
  },
  {
    "path": "docs/README.md",
    "content": "# Documentation\n\n* [AWS CDK Applications](awscdk-apps.md)\n* [AWS CDK Construct Library](awscdk-construct.md)\n* [AWS Cloud Projects](awscdk.md)\n* [Build](build.md)\n* [Bundling](bundling.md)\n* [Components](components.md)\n* [CDK8s](cdk8s.md)\n* [CircleCI](circleci.md)\n* [Dependencies](deps.md)\n* [Escape hatches](escape-hatches.md)\n* [Ejecting](eject.md)\n* [GitHub](github.md)\n* [GitLab](gitlab.md)\n* [Java Projects](java.md)\n* [Node.js Projects](node.md)\n* [Programmatic API](programmatic-api.md)\n* [Publishing Modules](publisher.md)\n* [Python Projects](python.md)\n* [Releases and Versioning](releases.md)\n* [Subprojects](subproject.md)\n* [Tasks](tasks.md)\n* [TypeScript Projects](typescript.md)\n\n## API Reference\n\n* [TypeScript](api/API.md)\n"
  },
  {
    "path": "docs/api/API.md",
    "content": "# API Reference\n\n**Classes**\n\nName|Description\n----|-----------\n[Component](#projen-component)|Represents a project component.\n[Dependencies](#projen-dependencies)|The `Dependencies` component is responsible to track the list of dependencies a project has, and then used by project types as the model for rendering project-specific dependency manifests such as the dependencies section `package.json` files.\n[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)|Options for specifying the Docker image of the container.\n[DockerCompose](#projen-dockercompose)|Create a docker-compose YAML file.\n[DockerComposeService](#projen-dockercomposeservice)|A docker-compose service.\n[FileBase](#projen-filebase)|*No description*\n[GitAttributesFile](#projen-gitattributesfile)|Assign attributes to file names in a git repository.\n[Gitpod](#projen-gitpod)|The Gitpod component which emits .gitpod.yml.\n[IgnoreFile](#projen-ignorefile)|*No description*\n[IniFile](#projen-inifile)|Represents an INI file.\n[JsonFile](#projen-jsonfile)|Represents a JSON file.\n[JsonPatch](#projen-jsonpatch)|Utility for applying RFC-6902 JSON-Patch to a document.\n[License](#projen-license)|*No description*\n[Logger](#projen-logger)|Project-level logging utilities.\n[Makefile](#projen-makefile)|Minimal Makefile.\n[ObjectFile](#projen-objectfile)|Represents an Object file.\n[Project](#projen-project)|Base project.\n[ProjectBuild](#projen-projectbuild)|Manages a standard build process for all projects.\n[Projects](#projen-projects)|Programmatic API for projen.\n[Projenrc](#projen-projenrc)|Sets up a project to use JSON for projenrc.\n[Renovatebot](#projen-renovatebot)|Defines renovatebot configuration for projen project.\n[SampleDir](#projen-sampledir)|Renders the given files into the directory if the directory does not exist.\n[SampleFile](#projen-samplefile)|Produces a file with the given contents but only once, if the file doesn't already exist.\n[SampleReadme](#projen-samplereadme)|Represents a README.md sample file. You are expected to manage this file after creation.\n[Semver](#projen-semver)|*No description*\n[SourceCode](#projen-sourcecode)|Represents a source file.\n[Task](#projen-task)|A task that can be performed on the project.\n[TaskRuntime](#projen-taskruntime)|The runtime component of the tasks engine.\n[Tasks](#projen-tasks)|Defines project tasks.\n[Testing](#projen-testing)|A Testing static class with a .synth helper for getting a snapshots of construct outputs. Useful for snapshot testing with Jest.\n[TextFile](#projen-textfile)|A text file.\n[TomlFile](#projen-tomlfile)|Represents a TOML file.\n[Version](#projen-version)|*No description*\n[XmlFile](#projen-xmlfile)|Represents an XML file.\n[YamlFile](#projen-yamlfile)|Represents a YAML file.\n[awscdk.AutoDiscover](#projen-awscdk-autodiscover)|Discovers and creates integration tests and lambdas from code in the project's source and test trees.\n[awscdk.AwsCdkConstructLibrary](#projen-awscdk-awscdkconstructlibrary)|AWS CDK construct library project.\n[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)|Manages dependencies on the AWS CDK.\n[awscdk.AwsCdkDepsJava](#projen-awscdk-awscdkdepsjava)|Manages dependencies on the AWS CDK for Java projects.\n[awscdk.AwsCdkDepsJs](#projen-awscdk-awscdkdepsjs)|Manages dependencies on the AWS CDK for Node.js projects.\n[awscdk.AwsCdkJavaApp](#projen-awscdk-awscdkjavaapp)|AWS CDK app in Java.\n[awscdk.AwsCdkPythonApp](#projen-awscdk-awscdkpythonapp)|AWS CDK app in Python.\n[awscdk.AwsCdkTypeScriptApp](#projen-awscdk-awscdktypescriptapp)|AWS CDK app in TypeScript.\n[awscdk.CdkConfig](#projen-awscdk-cdkconfig)|Represents cdk.json file.\n[awscdk.CdkTasks](#projen-awscdk-cdktasks)|Adds standard AWS CDK tasks to your project.\n[awscdk.ConstructLibraryAws](#projen-awscdk-constructlibraryaws)|*No description*\n[awscdk.EdgeLambdaAutoDiscover](#projen-awscdk-edgelambdaautodiscover)|Creates edge lambdas from entry points discovered in the project's source tree.\n[awscdk.IntegrationTest](#projen-awscdk-integrationtest)|Cloud integration tests.\n[awscdk.IntegrationTestAutoDiscover](#projen-awscdk-integrationtestautodiscover)|Creates integration tests from entry points discovered in the test tree.\n[awscdk.LambdaAutoDiscover](#projen-awscdk-lambdaautodiscover)|Creates lambdas from entry points discovered in the project's source tree.\n[awscdk.LambdaExtension](#projen-awscdk-lambdaextension)|Create a Lambda Extension.\n[awscdk.LambdaExtensionAutoDiscover](#projen-awscdk-lambdaextensionautodiscover)|Creates Lambda Extensions from entrypoints discovered in the project's source tree.\n[awscdk.LambdaFunction](#projen-awscdk-lambdafunction)|Generates a pre-bundled AWS Lambda function construct from handler code.\n[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)|The runtime for the AWS Lambda function.\n[build.BuildWorkflow](#projen-build-buildworkflow)|*No description*\n[cdk.AutoDiscoverBase](#projen-cdk-autodiscoverbase)|Base class for auto-discovering and creating project subcomponents.\n[cdk.ConstructLibrary](#projen-cdk-constructlibrary)|A multi-language library for CDK constructs.\n[cdk.IntegrationTestAutoDiscoverBase](#projen-cdk-integrationtestautodiscoverbase)|Base class for locating integration tests in the project's test tree.\n[cdk.IntegrationTestBase](#projen-cdk-integrationtestbase)|*No description*\n[cdk.JsiiDocgen](#projen-cdk-jsiidocgen)|Creates a markdown file based on the jsii manifest: - Adds a `docgen` script to package.json - Runs `jsii-docgen` after compilation - Enforces that markdown file is checked in.\n[cdk.JsiiProject](#projen-cdk-jsiiproject)|Multi-language jsii library project.\n[cdk8s.AutoDiscover](#projen-cdk8s-autodiscover)|Automatically discovers and creates `IntegrationTest`s from entry points found in the test tree.\n[cdk8s.Cdk8sDeps](#projen-cdk8s-cdk8sdeps)|Manages dependencies on the CDK8s.\n[cdk8s.Cdk8sDepsPy](#projen-cdk8s-cdk8sdepspy)|*No description*\n[cdk8s.Cdk8sPythonApp](#projen-cdk8s-cdk8spythonapp)|CDK8s app in Python.\n[cdk8s.Cdk8sTypeScriptApp](#projen-cdk8s-cdk8stypescriptapp)|CDK8s app in TypeScript.\n[cdk8s.ConstructLibraryCdk8s](#projen-cdk8s-constructlibrarycdk8s)|CDK8s construct library project.\n[cdk8s.IntegrationTest](#projen-cdk8s-integrationtest)|CDK8S integration test.\n[cdk8s.IntegrationTestAutoDiscover](#projen-cdk8s-integrationtestautodiscover)|Discovers and creates integration tests from files in the test root.\n[cdktf.ConstructLibraryCdktf](#projen-cdktf-constructlibrarycdktf)|CDKTF construct library project.\n[circleci.Circleci](#projen-circleci-circleci)|Circleci Class to manage `.circleci/config.yml`. Check projen's docs for more information.\n[github.AutoApprove](#projen-github-autoapprove)|Auto approve pull requests that meet a criteria.\n[github.AutoMerge](#projen-github-automerge)|Sets up mergify to merging approved pull requests.\n[github.Dependabot](#projen-github-dependabot)|Defines dependabot configuration for node projects.\n[github.GitHub](#projen-github-github)|*No description*\n[github.GitHubProject](#projen-github-githubproject)|GitHub-based project.\n[github.GithubCredentials](#projen-github-githubcredentials)|Represents a method of providing GitHub API access for projen workflows.\n[github.GithubWorkflow](#projen-github-githubworkflow)|Workflow for GitHub.\n[github.Mergify](#projen-github-mergify)|*No description*\n[github.PullRequestLint](#projen-github-pullrequestlint)|Configure validations to run on GitHub pull requests.\n[github.PullRequestTemplate](#projen-github-pullrequesttemplate)|Template for GitHub pull requests.\n[github.Stale](#projen-github-stale)|Warns and then closes issues and PRs that have had no activity for a specified amount of time.\n[github.TaskWorkflow](#projen-github-taskworkflow)|A GitHub workflow for common build tasks within a project.\n[gitlab.CiConfiguration](#projen-gitlab-ciconfiguration)|CI for GitLab.\n[gitlab.GitlabConfiguration](#projen-gitlab-gitlabconfiguration)|A GitLab CI for the main `.gitlab-ci.yml` file.\n[gitlab.NestedConfiguration](#projen-gitlab-nestedconfiguration)|A GitLab CI for templates that are created and included in the `.gitlab-ci.yml` file.\n[java.JavaProject](#projen-java-javaproject)|Java project.\n[java.Junit](#projen-java-junit)|Implements JUnit-based testing.\n[java.MavenCompile](#projen-java-mavencompile)|Adds the maven-compiler plugin to a POM file and the `compile` task.\n[java.MavenPackaging](#projen-java-mavenpackaging)|Configures a maven project to produce a .jar archive with sources and javadocs.\n[java.MavenSample](#projen-java-mavensample)|Java code sample.\n[java.Pom](#projen-java-pom)|A Project Object Model or POM is the fundamental unit of work in Maven.\n[java.Projenrc](#projen-java-projenrc)|Allows writing projenrc files in java.\n[javascript.Bundler](#projen-javascript-bundler)|Adds support for bundling JavaScript applications and dependencies into a single file.\n[javascript.Eslint](#projen-javascript-eslint)|Represents eslint configuration.\n[javascript.Jest](#projen-javascript-jest)|Installs the following npm scripts:.\n[javascript.NodePackage](#projen-javascript-nodepackage)|Represents the npm `package.json` file.\n[javascript.NodeProject](#projen-javascript-nodeproject)|Node.js project.\n[javascript.NpmConfig](#projen-javascript-npmconfig)|File representing the local NPM config in .npmrc.\n[javascript.Prettier](#projen-javascript-prettier)|Represents prettier configuration.\n[javascript.Projenrc](#projen-javascript-projenrc)|Sets up a javascript project to use TypeScript for projenrc.\n[javascript.TypescriptConfig](#projen-javascript-typescriptconfig)|*No description*\n[javascript.UpgradeDependencies](#projen-javascript-upgradedependencies)|Upgrade node project dependencies.\n[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)|How often to check for new versions and raise pull requests for version upgrades.\n[python.Pip](#projen-python-pip)|Manages dependencies using a requirements.txt file and the pip CLI tool.\n[python.Poetry](#projen-python-poetry)|Manage project dependencies, virtual environments, and packaging through the poetry CLI tool.\n[python.PoetryPyproject](#projen-python-poetrypyproject)|Represents configuration of a pyproject.toml file for a Poetry project.\n[python.Projenrc](#projen-python-projenrc)|Allows writing projenrc files in python.\n[python.Pytest](#projen-python-pytest)|*No description*\n[python.PytestSample](#projen-python-pytestsample)|Python test code sample.\n[python.PythonProject](#projen-python-pythonproject)|Python project.\n[python.PythonSample](#projen-python-pythonsample)|Python code sample.\n[python.RequirementsFile](#projen-python-requirementsfile)|Specifies a list of packages to be installed using pip.\n[python.SetupPy](#projen-python-setuppy)|Python packaging script where package metadata can be placed.\n[python.Setuptools](#projen-python-setuptools)|Manages packaging through setuptools with a setup.py script.\n[python.Venv](#projen-python-venv)|Manages a virtual environment through the Python venv module.\n[release.Publisher](#projen-release-publisher)|Implements GitHub jobs for publishing modules to package managers.\n[release.Release](#projen-release-release)|Manages releases (currently through GitHub workflows).\n[release.ReleaseTrigger](#projen-release-releasetrigger)|Used to manage release strategies.\n[typescript.Projenrc](#projen-typescript-projenrc)|Sets up a typescript project to use TypeScript for projenrc.\n[typescript.TypeScriptAppProject](#projen-typescript-typescriptappproject)|TypeScript app.\n[typescript.TypeScriptLibraryProject](#projen-typescript-typescriptlibraryproject)|*No description*\n[typescript.TypeScriptProject](#projen-typescript-typescriptproject)|TypeScript project.\n[typescript.TypedocDocgen](#projen-typescript-typedocdocgen)|Adds a simple Typescript documentation generator.\n[vscode.DevContainer](#projen-vscode-devcontainer)|A development environment running VSCode in a container;\n[vscode.VsCode](#projen-vscode-vscode)|*No description*\n[vscode.VsCodeLaunchConfig](#projen-vscode-vscodelaunchconfig)|VSCode launch configuration file (launch.json), useful for enabling in-editor debugger.\n[vscode.VsCodeRecommendedExtensions](#projen-vscode-vscoderecommendedextensions)|VS Code Workspace recommended extensions Source: https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions.\n[vscode.VsCodeSettings](#projen-vscode-vscodesettings)|VS Code Workspace settings Source: https://code.visualstudio.com/docs/getstarted/settings#_workspace-settings.\n[web.NextComponent](#projen-web-nextcomponent)|*No description*\n[web.NextJsProject](#projen-web-nextjsproject)|Next.js project without TypeScript.\n[web.NextJsTypeScriptProject](#projen-web-nextjstypescriptproject)|Next.js project with TypeScript.\n[web.PostCss](#projen-web-postcss)|Declares a PostCSS dependency with a default config file.\n[web.ReactComponent](#projen-web-reactcomponent)|*No description*\n[web.ReactProject](#projen-web-reactproject)|React project without TypeScript.\n[web.ReactTypeDef](#projen-web-reacttypedef)|*No description*\n[web.ReactTypeScriptProject](#projen-web-reacttypescriptproject)|React project with TypeScript.\n[web.TailwindConfig](#projen-web-tailwindconfig)|Declares a Tailwind CSS configuration file.\n\n\n**Structs**\n\nName|Description\n----|-----------\n[CreateProjectOptions](#projen-createprojectoptions)|*No description*\n[Dependency](#projen-dependency)|Represents a project dependency.\n[DependencyCoordinates](#projen-dependencycoordinates)|Coordinates of the dependency (name and version).\n[DepsManifest](#projen-depsmanifest)|*No description*\n[DevEnvironmentOptions](#projen-devenvironmentoptions)|Base options for configuring a container-based development environment.\n[DockerComposeBuild](#projen-dockercomposebuild)|Build arguments for creating a docker image.\n[DockerComposePortMappingOptions](#projen-dockercomposeportmappingoptions)|Options for port mappings.\n[DockerComposeProps](#projen-dockercomposeprops)|Props for DockerCompose.\n[DockerComposeServiceDescription](#projen-dockercomposeservicedescription)|Description of a docker-compose.yml service.\n[DockerComposeServicePort](#projen-dockercomposeserviceport)|A service port mapping.\n[DockerComposeVolumeConfig](#projen-dockercomposevolumeconfig)|Volume configuration.\n[DockerComposeVolumeMount](#projen-dockercomposevolumemount)|Service volume mounting information.\n[FileBaseOptions](#projen-filebaseoptions)|*No description*\n[GitpodOptions](#projen-gitpodoptions)|Constructor options for the Gitpod component.\n[GitpodPort](#projen-gitpodport)|Options for an exposed port on Gitpod.\n[GitpodPrebuilds](#projen-gitpodprebuilds)|Configure the Gitpod App for prebuilds.\n[GitpodTask](#projen-gitpodtask)|Configure options for a task to be run when opening a Gitpod workspace (e.g. running tests, or starting a dev server).\n[IniFileOptions](#projen-inifileoptions)|Options for `IniFile`.\n[InitProject](#projen-initproject)|Information passed from `projen new` to the project object when the project is first created.\n[JsonFileOptions](#projen-jsonfileoptions)|Options for `JsonFile`.\n[LicenseOptions](#projen-licenseoptions)|*No description*\n[LoggerOptions](#projen-loggeroptions)|Options for logging utilities.\n[MakefileOptions](#projen-makefileoptions)|Options for Makefiles.\n[ObjectFileOptions](#projen-objectfileoptions)|Options for `ObjectFile`.\n[ProjectOptions](#projen-projectoptions)|Options for `Project`.\n[ProjenrcOptions](#projen-projenrcoptions)|*No description*\n[RenovatebotOptions](#projen-renovatebotoptions)|Options for Renovatebot.\n[ResolveOptions](#projen-resolveoptions)|Resolve options.\n[Rule](#projen-rule)|A Make rule.\n[SampleDirOptions](#projen-samplediroptions)|SampleDir options.\n[SampleFileOptions](#projen-samplefileoptions)|Options for the SampleFile object.\n[SampleReadmeProps](#projen-samplereadmeprops)|SampleReadme Properties.\n[SnapshotOptions](#projen-snapshotoptions)|Options for the Snapshot synthesis.\n[SourceCodeOptions](#projen-sourcecodeoptions)|Options for `SourceCodeFile`.\n[TaskCommonOptions](#projen-taskcommonoptions)|*No description*\n[TaskOptions](#projen-taskoptions)|*No description*\n[TaskSpec](#projen-taskspec)|Specification of a single task.\n[TaskStep](#projen-taskstep)|A single step within a task.\n[TaskStepOptions](#projen-taskstepoptions)|Options for task steps.\n[TasksManifest](#projen-tasksmanifest)|Schema for `tasks.json`.\n[TextFileOptions](#projen-textfileoptions)|Options for `TextFile`.\n[TomlFileOptions](#projen-tomlfileoptions)|Options for `TomlFile`.\n[VersionOptions](#projen-versionoptions)|Options for `Version`.\n[XmlFileOptions](#projen-xmlfileoptions)|Options for `XmlFile`.\n[YamlFileOptions](#projen-yamlfileoptions)|Options for `JsonFile`.\n[awscdk.AutoDiscoverCommonOptions](#projen-awscdk-autodiscovercommonoptions)|Common options for auto discovering project subcomponents.\n[awscdk.AutoDiscoverOptions](#projen-awscdk-autodiscoveroptions)|Options for `AutoDiscover`.\n[awscdk.AwsCdkConstructLibraryOptions](#projen-awscdk-awscdkconstructlibraryoptions)|Options for `AwsCdkConstructLibrary`.\n[awscdk.AwsCdkDepsCommonOptions](#projen-awscdk-awscdkdepscommonoptions)|Options for `AwsCdkDeps`.\n[awscdk.AwsCdkDepsOptions](#projen-awscdk-awscdkdepsoptions)|*No description*\n[awscdk.AwsCdkJavaAppOptions](#projen-awscdk-awscdkjavaappoptions)|*No description*\n[awscdk.AwsCdkPackageNames](#projen-awscdk-awscdkpackagenames)|Language-specific AWS CDK package names.\n[awscdk.AwsCdkPythonAppOptions](#projen-awscdk-awscdkpythonappoptions)|Options for `AwsCdkPythonApp`.\n[awscdk.AwsCdkTypeScriptAppOptions](#projen-awscdk-awscdktypescriptappoptions)|*No description*\n[awscdk.CdkConfigCommonOptions](#projen-awscdk-cdkconfigcommonoptions)|Common options for `cdk.json`.\n[awscdk.CdkConfigOptions](#projen-awscdk-cdkconfigoptions)|Options for `CdkJson`.\n[awscdk.ConstructLibraryAwsOptions](#projen-awscdk-constructlibraryawsoptions)|*No description*\n[awscdk.EdgeLambdaAutoDiscoverOptions](#projen-awscdk-edgelambdaautodiscoveroptions)|Options for `EdgeLambdaAutoDiscover`.\n[awscdk.IntegrationTestAutoDiscoverOptions](#projen-awscdk-integrationtestautodiscoveroptions)|Options for `IntegrationTestAutoDiscover`.\n[awscdk.IntegrationTestCommonOptions](#projen-awscdk-integrationtestcommonoptions)|*No description*\n[awscdk.IntegrationTestOptions](#projen-awscdk-integrationtestoptions)|Options for `IntegrationTest`.\n[awscdk.LambdaAutoDiscoverOptions](#projen-awscdk-lambdaautodiscoveroptions)|Options for `LambdaAutoDiscover`.\n[awscdk.LambdaExtensionAutoDiscoverOptions](#projen-awscdk-lambdaextensionautodiscoveroptions)|Options for `LambdaExtensionAutoDiscover`.\n[awscdk.LambdaExtensionCommonOptions](#projen-awscdk-lambdaextensioncommonoptions)|Common options for creating lambda extensions.\n[awscdk.LambdaExtensionOptions](#projen-awscdk-lambdaextensionoptions)|Options for creating lambda extensions.\n[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)|Common options for `LambdaFunction`.\n[awscdk.LambdaFunctionOptions](#projen-awscdk-lambdafunctionoptions)|Options for `Function`.\n[build.AddPostBuildJobCommandsOptions](#projen-build-addpostbuildjobcommandsoptions)|Options for `BuildWorkflow.addPostBuildJobCommands`.\n[build.AddPostBuildJobTaskOptions](#projen-build-addpostbuildjobtaskoptions)|Options for `BuildWorkflow.addPostBuildJobTask`.\n[build.BuildWorkflowOptions](#projen-build-buildworkflowoptions)|*No description*\n[cdk.AutoDiscoverBaseOptions](#projen-cdk-autodiscoverbaseoptions)|Options for `AutoDiscoverBase`.\n[cdk.Catalog](#projen-cdk-catalog)|*No description*\n[cdk.ConstructLibraryOptions](#projen-cdk-constructlibraryoptions)|*No description*\n[cdk.IntegrationTestAutoDiscoverBaseOptions](#projen-cdk-integrationtestautodiscoverbaseoptions)|Options for `IntegrationTestAutoDiscoverBase`.\n[cdk.IntegrationTestBaseOptions](#projen-cdk-integrationtestbaseoptions)|Options for IntegrationTest.\n[cdk.JsiiDocgenOptions](#projen-cdk-jsiidocgenoptions)|Options for `JsiiDocgen`.\n[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)|*No description*\n[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)|Go target configuration.\n[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)|*No description*\n[cdk.JsiiProjectOptions](#projen-cdk-jsiiprojectoptions)|*No description*\n[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)|*No description*\n[cdk8s.AutoDiscoverOptions](#projen-cdk8s-autodiscoveroptions)|Options for `AutoDiscover`.\n[cdk8s.Cdk8sDepsCommonOptions](#projen-cdk8s-cdk8sdepscommonoptions)|Options for `Cdk8sDeps`.\n[cdk8s.Cdk8sDepsOptions](#projen-cdk8s-cdk8sdepsoptions)|*No description*\n[cdk8s.Cdk8sPackageNames](#projen-cdk8s-cdk8spackagenames)|*No description*\n[cdk8s.Cdk8sPythonOptions](#projen-cdk8s-cdk8spythonoptions)|Options for `Cdk8sPythonApp`.\n[cdk8s.Cdk8sTypeScriptAppOptions](#projen-cdk8s-cdk8stypescriptappoptions)|*No description*\n[cdk8s.ConstructLibraryCdk8sOptions](#projen-cdk8s-constructlibrarycdk8soptions)|*No description*\n[cdk8s.IntegrationTestAutoDiscoverOptions](#projen-cdk8s-integrationtestautodiscoveroptions)|*No description*\n[cdk8s.IntegrationTestOptions](#projen-cdk8s-integrationtestoptions)|Options for IntegrationTest.\n[cdktf.ConstructLibraryCdktfOptions](#projen-cdktf-constructlibrarycdktfoptions)|*No description*\n[circleci.CircleCiProps](#projen-circleci-circleciprops)|Options for class {@link Circleci}.\n[circleci.Docker](#projen-circleci-docker)|Options for docker executor.\n[circleci.Filter](#projen-circleci-filter)|The branches key controls whether the current branch should have a schedule trigger created for it, where current branch is the branch containing the config.yml file with the trigger stanza. That is, a push on the main branch will only schedule a workflow for the main branch.\n[circleci.FilterConfig](#projen-circleci-filterconfig)|set an inclusive or exclusive filter.\n[circleci.Job](#projen-circleci-job)|A Workflow is comprised of one or more uniquely named jobs.\n[circleci.Machine](#projen-circleci-machine)|*No description*\n[circleci.Macos](#projen-circleci-macos)|CircleCI supports running jobs on macOS, to allow you to build, test, and deploy apps for macOS, iOS, tvOS and watchOS.\n[circleci.Matrix](#projen-circleci-matrix)|The matrix stanza allows you to run a parameterized job multiple times with different arguments.\n[circleci.PipelineParameter](#projen-circleci-pipelineparameter)|Parameters are declared by name under a job, command, or executor.\n[circleci.Run](#projen-circleci-run)|Used for invoking all command-line programs, taking either a map of configuration values, or, when called in its short-form, a string that will be used as both the command and name.\n[circleci.Schedule](#projen-circleci-schedule)|A workflow may have a schedule indicating it runs at a certain time.\n[circleci.StepRun](#projen-circleci-steprun)|Execution steps for Job.\n[circleci.Triggers](#projen-circleci-triggers)|Specifies which triggers will cause this workflow to be executed.\n[circleci.Workflow](#projen-circleci-workflow)|Used for orchestrating all jobs.\n[circleci.WorkflowJob](#projen-circleci-workflowjob)|A Job is part of Workflow.\n[github.AutoApproveOptions](#projen-github-autoapproveoptions)|Options for 'AutoApprove'.\n[github.AutoMergeOptions](#projen-github-automergeoptions)|*No description*\n[github.DependabotIgnore](#projen-github-dependabotignore)|You can use the `ignore` option to customize which dependencies are updated.\n[github.DependabotOptions](#projen-github-dependabotoptions)|*No description*\n[github.DependabotRegistry](#projen-github-dependabotregistry)|Use to add private registry support for dependabot.\n[github.GitHubOptions](#projen-github-githuboptions)|*No description*\n[github.GitHubProjectOptions](#projen-github-githubprojectoptions)|Options for `GitHubProject`.\n[github.GitIdentity](#projen-github-gitidentity)|Represents the git identity.\n[github.GithubCredentialsAppOptions](#projen-github-githubcredentialsappoptions)|Options for `GithubCredentials.fromApp`.\n[github.GithubCredentialsPersonalAccessTokenOptions](#projen-github-githubcredentialspersonalaccesstokenoptions)|Options for `GithubCredentials.fromPersonalAccessToken`.\n[github.GithubWorkflowOptions](#projen-github-githubworkflowoptions)|Options for `GithubWorkflow`.\n[github.MergifyConditionalOperator](#projen-github-mergifyconditionaloperator)|The Mergify conditional operators that can be used are: `or` and `and`.\n[github.MergifyOptions](#projen-github-mergifyoptions)|*No description*\n[github.MergifyQueue](#projen-github-mergifyqueue)|*No description*\n[github.MergifyRule](#projen-github-mergifyrule)|*No description*\n[github.PullRequestLintOptions](#projen-github-pullrequestlintoptions)|Options for PullRequestLint.\n[github.PullRequestTemplateOptions](#projen-github-pullrequesttemplateoptions)|Options for `PullRequestTemplate`.\n[github.SemanticTitleOptions](#projen-github-semantictitleoptions)|Options for linting that PR titles follow Conventional Commits.\n[github.StaleBehavior](#projen-github-stalebehavior)|Stale behavior.\n[github.StaleOptions](#projen-github-staleoptions)|Options for `Stale`.\n[github.TaskWorkflowOptions](#projen-github-taskworkflowoptions)|*No description*\n[gitlab.AllowFailure](#projen-gitlab-allowfailure)|Exit code that are not considered failure.\n[gitlab.Artifacts](#projen-gitlab-artifacts)|Used to specify a list of files and directories that should be attached to the job if it succeeds.\n[gitlab.Assets](#projen-gitlab-assets)|Asset configuration for a release.\n[gitlab.Cache](#projen-gitlab-cache)|Cache Definition.\n[gitlab.CacheKeyFiles](#projen-gitlab-cachekeyfiles)|Use this construct to generate a new key when one or two specific files change.\n[gitlab.CiConfigurationOptions](#projen-gitlab-ciconfigurationoptions)|Options for `CiConfiguration`.\n[gitlab.Default](#projen-gitlab-default)|Default settings for the CI Configuration.\n[gitlab.Engine](#projen-gitlab-engine)|The engine configuration for a secret.\n[gitlab.Environment](#projen-gitlab-environment)|The environment that a job deploys to.\n[gitlab.Filter](#projen-gitlab-filter)|Filtering options for when a job will run.\n[gitlab.Image](#projen-gitlab-image)|Specifies the docker image to use for the job or globally for all jobs.\n[gitlab.Include](#projen-gitlab-include)|An included YAML file.\n[gitlab.IncludeRule](#projen-gitlab-includerule)|Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job.\n[gitlab.Inherit](#projen-gitlab-inherit)|Controls inheritance of globally-defined defaults and variables.\n[gitlab.Job](#projen-gitlab-job)|Jobs are the most fundamental element of a .gitlab-ci.yml file.\n[gitlab.KubernetesConfig](#projen-gitlab-kubernetesconfig)|Used to configure the kubernetes deployment for this environment.\n[gitlab.Link](#projen-gitlab-link)|Link configuration for an asset.\n[gitlab.Need](#projen-gitlab-need)|A jobs in a previous stage whose sole completion is needed to start the current job.\n[gitlab.Parallel](#projen-gitlab-parallel)|Used to run a job multiple times in parallel in a single pipeline.\n[gitlab.Release](#projen-gitlab-release)|Indicates that the job creates a Release.\n[gitlab.Reports](#projen-gitlab-reports)|Reports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in Merge Requests.\n[gitlab.Retry](#projen-gitlab-retry)|How many times a job is retried if it fails.\n[gitlab.Secret](#projen-gitlab-secret)|A CI/CD secret.\n[gitlab.Service](#projen-gitlab-service)|Used to specify an additional Docker image to run scripts in.\n[gitlab.Trigger](#projen-gitlab-trigger)|Trigger a multi-project or a child pipeline.\n[gitlab.TriggerInclude](#projen-gitlab-triggerinclude)|References a local file or an artifact from another job to define the pipeline configuration.\n[gitlab.VariableConfig](#projen-gitlab-variableconfig)|Explains what the global variable is used for, what the acceptable values are.\n[gitlab.VaultConfig](#projen-gitlab-vaultconfig)|Specification for a secret provided by a HashiCorp Vault.\n[gitlab.Workflow](#projen-gitlab-workflow)|Used to control pipeline behavior.\n[gitlab.WorkflowRule](#projen-gitlab-workflowrule)|Used to control whether or not a whole pipeline is created.\n[java.JavaProjectCommonOptions](#projen-java-javaprojectcommonoptions)|Options for `JavaProject`.\n[java.JavaProjectOptions](#projen-java-javaprojectoptions)|Options for `JavaProject`.\n[java.JunitOptions](#projen-java-junitoptions)|Options for `Junit`.\n[java.MavenCompileOptions](#projen-java-mavencompileoptions)|Options for `MavenCompile`.\n[java.MavenPackagingOptions](#projen-java-mavenpackagingoptions)|Options for `MavenPackage`.\n[java.MavenRepository](#projen-java-mavenrepository)|Represents a Maven repository.\n[java.MavenSampleOptions](#projen-java-mavensampleoptions)|*No description*\n[java.PluginExecution](#projen-java-pluginexecution)|Plugin execution definition.\n[java.PluginOptions](#projen-java-pluginoptions)|Options for Maven plugins.\n[java.PomOptions](#projen-java-pomoptions)|Options for `Pom`.\n[java.ProjenrcOptions](#projen-java-projenrcoptions)|Options for `Projenrc`.\n[javascript.AddBundleOptions](#projen-javascript-addbundleoptions)|Options for `addBundle()`.\n[javascript.Bundle](#projen-javascript-bundle)|*No description*\n[javascript.BundlerOptions](#projen-javascript-bundleroptions)|Options for `Bundler`.\n[javascript.BundlingOptions](#projen-javascript-bundlingoptions)|Options for bundling.\n[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)|*No description*\n[javascript.CoverageThreshold](#projen-javascript-coveragethreshold)|*No description*\n[javascript.EslintOptions](#projen-javascript-eslintoptions)|*No description*\n[javascript.EslintOverride](#projen-javascript-eslintoverride)|eslint rules override.\n[javascript.HasteConfig](#projen-javascript-hasteconfig)|*No description*\n[javascript.JestConfigOptions](#projen-javascript-jestconfigoptions)|*No description*\n[javascript.JestOptions](#projen-javascript-jestoptions)|*No description*\n[javascript.NodePackageOptions](#projen-javascript-nodepackageoptions)|*No description*\n[javascript.NodeProjectOptions](#projen-javascript-nodeprojectoptions)|*No description*\n[javascript.NpmConfigOptions](#projen-javascript-npmconfigoptions)|Options to configure the local NPM config.\n[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)|*No description*\n[javascript.PrettierOptions](#projen-javascript-prettieroptions)|Options for Prettier.\n[javascript.PrettierOverride](#projen-javascript-prettieroverride)|*No description*\n[javascript.PrettierSettings](#projen-javascript-prettiersettings)|Options to set in Prettier directly or through overrides.\n[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)|*No description*\n[javascript.RenderWorkflowSetupOptions](#projen-javascript-renderworkflowsetupoptions)|Options for `renderInstallSteps()`.\n[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)|Options for scoped packages.\n[javascript.TypeScriptCompilerOptions](#projen-javascript-typescriptcompileroptions)|*No description*\n[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)|*No description*\n[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)|Options for `UpgradeDependencies`.\n[javascript.UpgradeDependenciesWorkflowOptions](#projen-javascript-upgradedependenciesworkflowoptions)|Options for `UpgradeDependencies.workflowOptions`.\n[python.PipOptions](#projen-python-pipoptions)|Options for pip.\n[python.PoetryPyprojectOptions](#projen-python-poetrypyprojectoptions)|Poetry-specific options.\n[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)|Poetry-specific options.\n[python.ProjenrcOptions](#projen-python-projenrcoptions)|Options for `Projenrc`.\n[python.PytestOptions](#projen-python-pytestoptions)|*No description*\n[python.PytestSampleOptions](#projen-python-pytestsampleoptions)|Options for python test code sample.\n[python.PythonPackagingOptions](#projen-python-pythonpackagingoptions)|*No description*\n[python.PythonProjectOptions](#projen-python-pythonprojectoptions)|Options for `PythonProject`.\n[python.PythonSampleOptions](#projen-python-pythonsampleoptions)|Options for python sample code.\n[python.RequirementsFileOptions](#projen-python-requirementsfileoptions)|*No description*\n[python.SetupPyOptions](#projen-python-setuppyoptions)|Fields to pass in the setup() function of setup.py.\n[python.VenvOptions](#projen-python-venvoptions)|Options for venv.\n[release.BranchOptions](#projen-release-branchoptions)|Options for a release branch.\n[release.CodeArtifactOptions](#projen-release-codeartifactoptions)|*No description*\n[release.CommonPublishOptions](#projen-release-commonpublishoptions)|Common publishing options.\n[release.GitHubReleasesPublishOptions](#projen-release-githubreleasespublishoptions)|Publishing options for GitHub releases.\n[release.GitPublishOptions](#projen-release-gitpublishoptions)|Publishing options for Git releases.\n[release.GoPublishOptions](#projen-release-gopublishoptions)|Options for Go releases.\n[release.JsiiReleaseGo](#projen-release-jsiireleasego)|*No description*\n[release.JsiiReleaseMaven](#projen-release-jsiireleasemaven)|*No description*\n[release.JsiiReleaseNpm](#projen-release-jsiireleasenpm)|*No description*\n[release.JsiiReleaseNuget](#projen-release-jsiireleasenuget)|*No description*\n[release.JsiiReleasePyPi](#projen-release-jsiireleasepypi)|*No description*\n[release.ManualReleaseOptions](#projen-release-manualreleaseoptions)|*No description*\n[release.MavenPublishOptions](#projen-release-mavenpublishoptions)|Options for Maven releases.\n[release.NpmPublishOptions](#projen-release-npmpublishoptions)|Options for npm release.\n[release.NugetPublishOptions](#projen-release-nugetpublishoptions)|Options for NuGet releases.\n[release.PublisherOptions](#projen-release-publisheroptions)|Options for `Publisher`.\n[release.PyPiPublishOptions](#projen-release-pypipublishoptions)|Options for PyPI release.\n[release.ReleaseOptions](#projen-release-releaseoptions)|Options for `Release`.\n[release.ReleaseProjectOptions](#projen-release-releaseprojectoptions)|Project options for release.\n[release.ScheduledReleaseOptions](#projen-release-scheduledreleaseoptions)|*No description*\n[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)|*No description*\n[typescript.TypeScriptLibraryProjectOptions](#projen-typescript-typescriptlibraryprojectoptions)|*No description*\n[typescript.TypeScriptProjectOptions](#projen-typescript-typescriptprojectoptions)|*No description*\n[vscode.DevContainerOptions](#projen-vscode-devcontaineroptions)|Constructor options for the DevContainer component.\n[vscode.Presentation](#projen-vscode-presentation)|VSCode launch configuration Presentation interface \"using the order, group, and hidden attributes in the presentation object you can sort, group, and hide configurations and compounds in the Debug configuration dropdown and in the Debug quick pick.\" Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n[vscode.ServerReadyAction](#projen-vscode-serverreadyaction)|VSCode launch configuration ServerReadyAction interface \"if you want to open a URL in a web browser whenever the program under debugging outputs a specific message to the debug console or integrated terminal.\" Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n[vscode.VsCodeLaunchConfigurationEntry](#projen-vscode-vscodelaunchconfigurationentry)|Options for a 'VsCodeLaunchConfigurationEntry' Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n[web.NextComponentOptions](#projen-web-nextcomponentoptions)|*No description*\n[web.NextJsCommonProjectOptions](#projen-web-nextjscommonprojectoptions)|*No description*\n[web.NextJsProjectOptions](#projen-web-nextjsprojectoptions)|*No description*\n[web.NextJsTypeScriptProjectOptions](#projen-web-nextjstypescriptprojectoptions)|*No description*\n[web.PostCssOptions](#projen-web-postcssoptions)|*No description*\n[web.ReactComponentOptions](#projen-web-reactcomponentoptions)|*No description*\n[web.ReactProjectOptions](#projen-web-reactprojectoptions)|*No description*\n[web.ReactRewireOptions](#projen-web-reactrewireoptions)|*No description*\n[web.ReactTypeDefOptions](#projen-web-reacttypedefoptions)|*No description*\n[web.ReactTypeScriptProjectOptions](#projen-web-reacttypescriptprojectoptions)|*No description*\n[web.TailwindConfigOptions](#projen-web-tailwindconfigoptions)|*No description*\n\n\n**Interfaces**\n\nName|Description\n----|-----------\n[IDevEnvironment](#projen-idevenvironment)|Abstract interface for container-based development environments, such as Gitpod and GitHub Codespaces.\n[IDockerComposeServiceName](#projen-idockercomposeservicename)|An interface providing the name of a docker compose service.\n[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)|Volume binding information.\n[IDockerComposeVolumeConfig](#projen-idockercomposevolumeconfig)|Storage for volume configuration.\n[IResolvable](#projen-iresolvable)|*No description*\n[IResolver](#projen-iresolver)|API for resolving tokens when synthesizing file content.\n[github.IAddConditionsLater](#projen-github-iaddconditionslater)|*No description*\n[github.IJobProvider](#projen-github-ijobprovider)|*No description*\n[python.IPackageProvider](#projen-python-ipackageprovider)|*No description*\n[python.IPythonDeps](#projen-python-ipythondeps)|*No description*\n[python.IPythonEnv](#projen-python-ipythonenv)|*No description*\n[python.IPythonPackaging](#projen-python-ipythonpackaging)|*No description*\n\n\n**Enums**\n\nName|Description\n----|-----------\n[DependencyType](#projen-dependencytype)|Type of dependency.\n[DockerComposeProtocol](#projen-dockercomposeprotocol)|Network protocol for port mapping.\n[GitpodOnOpen](#projen-gitpodonopen)|What to do when a service on a port is detected.\n[GitpodOpenIn](#projen-gitpodopenin)|Configure where in the IDE the terminal should be opened.\n[GitpodOpenMode](#projen-gitpodopenmode)|Configure how the terminal should be opened relative to the previous task.\n[GitpodPortVisibility](#projen-gitpodportvisibility)|Whether the port visibility should be private or public.\n[InitProjectOptionHints](#projen-initprojectoptionhints)|Choices for how to display commented out options in projenrc files.\n[LogLevel](#projen-loglevel)|Logging verbosity.\n[ProjectType](#projen-projecttype)|Which type of project this is.\n[RenovatebotScheduleInterval](#projen-renovatebotscheduleinterval)|How often to check for new versions and raise pull requests for version updates.\n[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)|Which approval is required when deploying CDK apps.\n[cdk.Stability](#projen-cdk-stability)|*No description*\n[circleci.JobType](#projen-circleci-jobtype)|A job may have a type of approval indicating it must be manually approved before downstream jobs may proceed.\n[circleci.JobWhen](#projen-circleci-jobwhen)|Specify when to enable or disable the step.\n[circleci.PipelineParameterType](#projen-circleci-pipelineparametertype)|Pipeline parameter types.\n[circleci.ResourceClass](#projen-circleci-resourceclass)|The resource_class feature allows configuring CPU and RAM resources for each job.\n[github.DependabotRegistryType](#projen-github-dependabotregistrytype)|Each configuration type requires you to provide particular settings.\n[github.DependabotScheduleInterval](#projen-github-dependabotscheduleinterval)|How often to check for new versions and raise pull requests for version updates.\n[github.VersioningStrategy](#projen-github-versioningstrategy)|The strategy to use when edits manifest and lock files.\n[gitlab.Action](#projen-gitlab-action)|Specifies what this job will do.\n[gitlab.CachePolicy](#projen-gitlab-cachepolicy)|Configure the upload and download behaviour of a cache.\n[gitlab.CacheWhen](#projen-gitlab-cachewhen)|Configure when artifacts are uploaded depended on job status.\n[gitlab.DefaultElement](#projen-gitlab-defaultelement)|*No description*\n[gitlab.DeploymentTier](#projen-gitlab-deploymenttier)|Explicitly specifies the tier of the deployment environment if non-standard environment name is used.\n[gitlab.JobWhen](#projen-gitlab-jobwhen)|Describes the conditions for when to run the job.\n[gitlab.KubernetesEnum](#projen-gitlab-kubernetesenum)|Filter job based on if Kubernetes integration is active.\n[gitlab.LinkType](#projen-gitlab-linktype)|The content kind of what users can download via url.\n[gitlab.Strategy](#projen-gitlab-strategy)|You can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend.\n[gitlab.WorkflowWhen](#projen-gitlab-workflowwhen)|Describes the conditions for when to run the job.\n[javascript.ArrowParens](#projen-javascript-arrowparens)|*No description*\n[javascript.AutoRelease](#projen-javascript-autorelease)|Automatic bump modes.\n[javascript.EmbeddedLanguageFormatting](#projen-javascript-embeddedlanguageformatting)|*No description*\n[javascript.EndOfLine](#projen-javascript-endofline)|*No description*\n[javascript.HTMLWhitespaceSensitivity](#projen-javascript-htmlwhitespacesensitivity)|*No description*\n[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)|The node package manager to use.\n[javascript.NpmAccess](#projen-javascript-npmaccess)|Npm package access level.\n[javascript.ProseWrap](#projen-javascript-prosewrap)|*No description*\n[javascript.QuoteProps](#projen-javascript-quoteprops)|*No description*\n[javascript.TrailingComma](#projen-javascript-trailingcomma)|*No description*\n[javascript.TypeScriptJsxMode](#projen-javascript-typescriptjsxmode)|Determines how JSX should get transformed into valid JavaScript.\n[javascript.TypeScriptModuleResolution](#projen-javascript-typescriptmoduleresolution)|Determines how modules get resolved.\n[vscode.Console](#projen-vscode-console)|Controls where to launch the debug target Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n[vscode.InternalConsoleOptions](#projen-vscode-internalconsoleoptions)|Controls the visibility of the VSCode Debug Console panel during a debugging session Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n\n\n\n## class Component 🔹 <a id=\"projen-component\"></a>\n\nRepresents a project component.\n\n\n### Initializer\n\n\n\n\n```ts\nnew Component(project: Project)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**project**🔹 | <code>[Project](#projen-project)</code> | <span></span>\n\n### Methods\n\n\n#### postSynthesize()🔹 <a id=\"projen-component-postsynthesize\"></a>\n\nCalled after synthesis.\n\nOrder is *not* guaranteed.\n\n```ts\npostSynthesize(): void\n```\n\n\n\n\n\n#### preSynthesize()🔹 <a id=\"projen-component-presynthesize\"></a>\n\nCalled before synthesis.\n\n```ts\npreSynthesize(): void\n```\n\n\n\n\n\n#### synthesize()🔹 <a id=\"projen-component-synthesize\"></a>\n\nSynthesizes files to the project output directory.\n\n```ts\nsynthesize(): void\n```\n\n\n\n\n\n\n\n## class Dependencies 🔹 <a id=\"projen-dependencies\"></a>\n\nThe `Dependencies` component is responsible to track the list of dependencies a project has, and then used by project types as the model for rendering project-specific dependency manifests such as the dependencies section `package.json` files.\n\nTo add a dependency you can use a project-type specific API such as\n`nodeProject.addDeps()` or use the generic API of `project.deps`:\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\nAdds a dependencies component to the project.\n\n```ts\nnew Dependencies(project: Project)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  The parent project.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**all**🔹 | <code>Array<[Dependency](#projen-dependency)></code> | A copy of all dependencies recorded for this project.\n*static* **MANIFEST_FILE**🔹 | <code>string</code> | The project-relative path of the deps manifest file.\n\n### Methods\n\n\n#### addDependency(spec, type, metadata?)🔹 <a id=\"projen-dependencies-adddependency\"></a>\n\nAdds a dependency to this project.\n\n```ts\naddDependency(spec: string, type: DependencyType, metadata?: Map<string, any>): Dependency\n```\n\n* **spec** (<code>string</code>)  The dependency spec in the format `MODULE[@VERSION]` where `MODULE` is the package-manager-specific module name and `VERSION` is an optional semantic version requirement (e.g. `^3.4.0`).\n* **type** (<code>[DependencyType](#projen-dependencytype)</code>)  The type of the dependency.\n* **metadata** (<code>Map<string, any></code>)  *No description*\n\n__Returns__:\n* <code>[Dependency](#projen-dependency)</code>\n\n#### getDependency(name, type?)🔹 <a id=\"projen-dependencies-getdependency\"></a>\n\nReturns a dependency by name.\n\nFails if there is no dependency defined by that name or if `type` is not\nprovided and there is more then one dependency type for this dependency.\n\n```ts\ngetDependency(name: string, type?: DependencyType): Dependency\n```\n\n* **name** (<code>string</code>)  The name of the dependency.\n* **type** (<code>[DependencyType](#projen-dependencytype)</code>)  The dependency type.\n\n__Returns__:\n* <code>[Dependency](#projen-dependency)</code>\n\n#### removeDependency(name, type?)🔹 <a id=\"projen-dependencies-removedependency\"></a>\n\nRemoves a dependency.\n\n```ts\nremoveDependency(name: string, type?: DependencyType): void\n```\n\n* **name** (<code>string</code>)  The name of the module to remove (without the version).\n* **type** (<code>[DependencyType](#projen-dependencytype)</code>)  The dependency type.\n\n\n\n\n#### tryGetDependency(name, type?)🔹 <a id=\"projen-dependencies-trygetdependency\"></a>\n\nReturns a dependency by name.\n\nReturns `undefined` if there is no dependency defined by that name or if\n`type` is not provided and there is more then one dependency type for this\ndependency.\n\n```ts\ntryGetDependency(name: string, type?: DependencyType): Dependency\n```\n\n* **name** (<code>string</code>)  The name of the dependency.\n* **type** (<code>[DependencyType](#projen-dependencytype)</code>)  The dependency type.\n\n__Returns__:\n* <code>[Dependency](#projen-dependency)</code>\n\n#### *static* parseDependency(spec)🔹 <a id=\"projen-dependencies-parsedependency\"></a>\n\nReturns the coordinates of a dependency spec.\n\nGiven `foo@^3.4.0` returns `{ name: \"foo\", version: \"^3.4.0\" }`.\nGiven `bar@npm:@bar/legacy` returns `{ name: \"bar\", version: \"npm:@bar/legacy\" }`.\n\n```ts\nstatic parseDependency(spec: string): DependencyCoordinates\n```\n\n* **spec** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[DependencyCoordinates](#projen-dependencycoordinates)</code>\n\n\n\n## class DevEnvironmentDockerImage 🔹 <a id=\"projen-devenvironmentdockerimage\"></a>\n\nOptions for specifying the Docker image of the container.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**dockerFile**?🔹 | <code>string</code> | The relative path of a Dockerfile that defines the container contents.<br/>__*Optional*__\n**image**?🔹 | <code>string</code> | A publicly available Docker image.<br/>__*Optional*__\n\n### Methods\n\n\n#### *static* fromFile(dockerFile)🔹 <a id=\"projen-devenvironmentdockerimage-fromfile\"></a>\n\nThe relative path of a Dockerfile that defines the container contents.\n\n```ts\nstatic fromFile(dockerFile: string): DevEnvironmentDockerImage\n```\n\n* **dockerFile** (<code>string</code>)  a relative path.\n\n__Returns__:\n* <code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code>\n\n#### *static* fromImage(image)🔹 <a id=\"projen-devenvironmentdockerimage-fromimage\"></a>\n\nA publicly available Docker image.\n\n```ts\nstatic fromImage(image: string): DevEnvironmentDockerImage\n```\n\n* **image** (<code>string</code>)  a Docker image.\n\n__Returns__:\n* <code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code>\n\n\n\n## class DockerCompose 🔹 <a id=\"projen-dockercompose\"></a>\n\nCreate a docker-compose YAML file.\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew DockerCompose(project: Project, props?: DockerComposeProps)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **props** (<code>[DockerComposeProps](#projen-dockercomposeprops)</code>)  *No description*\n  * **nameSuffix** (<code>string</code>)  A name to add to the docker-compose.yml filename. __*Default*__: no name is added\n  * **schemaVersion** (<code>string</code>)  Docker Compose schema version do be used. __*Default*__: 3.3\n  * **services** (<code>Map<string, [DockerComposeServiceDescription](#projen-dockercomposeservicedescription)></code>)  Service descriptions. __*Optional*__\n\n\n### Methods\n\n\n#### addService(serviceName, description)🔹 <a id=\"projen-dockercompose-addservice\"></a>\n\nAdd a service to the docker-compose file.\n\n```ts\naddService(serviceName: string, description: DockerComposeServiceDescription): DockerComposeService\n```\n\n* **serviceName** (<code>string</code>)  name of the service.\n* **description** (<code>[DockerComposeServiceDescription](#projen-dockercomposeservicedescription)</code>)  a service description.\n  * **command** (<code>Array<string></code>)  Provide a command to the docker container. __*Default*__: use the container's default command\n  * **dependsOn** (<code>Array<[IDockerComposeServiceName](#projen-idockercomposeservicename)></code>)  Names of other services this service depends on. __*Default*__: no dependencies\n  * **environment** (<code>Map<string, string></code>)  Add environment variables. __*Default*__: no environment variables are provided\n  * **image** (<code>string</code>)  Use a docker image. __*Optional*__\n  * **imageBuild** (<code>[DockerComposeBuild](#projen-dockercomposebuild)</code>)  Build a docker image. __*Optional*__\n  * **ports** (<code>Array<[DockerComposeServicePort](#projen-dockercomposeserviceport)></code>)  Map some ports. __*Default*__: no ports are mapped\n  * **volumes** (<code>Array<[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)></code>)  Mount some volumes into the service. __*Optional*__\n\n__Returns__:\n* <code>[DockerComposeService](#projen-dockercomposeservice)</code>\n\n#### *static* bindVolume(sourcePath, targetPath)🔹 <a id=\"projen-dockercompose-bindvolume\"></a>\n\nCreate a bind volume that binds a host path to the target path in the container.\n\n```ts\nstatic bindVolume(sourcePath: string, targetPath: string): IDockerComposeVolumeBinding\n```\n\n* **sourcePath** (<code>string</code>)  Host path name.\n* **targetPath** (<code>string</code>)  Target path name.\n\n__Returns__:\n* <code>[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)</code>\n\n#### *static* namedVolume(volumeName, targetPath, options?)🔹 <a id=\"projen-dockercompose-namedvolume\"></a>\n\nCreate a named volume and mount it to the target path.\n\nIf you use this\nnamed volume in several services, the volume will be shared. In this\ncase, the volume configuration of the first-provided options are used.\n\n```ts\nstatic namedVolume(volumeName: string, targetPath: string, options?: DockerComposeVolumeConfig): IDockerComposeVolumeBinding\n```\n\n* **volumeName** (<code>string</code>)  Name of the volume.\n* **targetPath** (<code>string</code>)  Target path.\n* **options** (<code>[DockerComposeVolumeConfig](#projen-dockercomposevolumeconfig)</code>)  volume configuration (default: docker compose defaults).\n  * **driver** (<code>string</code>)  Driver to use for the volume. __*Default*__: value is not provided\n  * **driverOpts** (<code>Map<string, string></code>)  Options to provide to the driver. __*Optional*__\n  * **external** (<code>boolean</code>)  Set to true to indicate that the volume is externally created. __*Default*__: unset, indicating that docker-compose creates the volume\n  * **name** (<code>string</code>)  Name of the volume for when the volume name isn't going to work in YAML. __*Default*__: unset, indicating that docker-compose creates volumes as usual\n\n__Returns__:\n* <code>[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)</code>\n\n#### *static* portMapping(publishedPort, targetPort, options?)🔹 <a id=\"projen-dockercompose-portmapping\"></a>\n\nCreate a port mapping.\n\n```ts\nstatic portMapping(publishedPort: number, targetPort: number, options?: DockerComposePortMappingOptions): DockerComposeServicePort\n```\n\n* **publishedPort** (<code>number</code>)  Published port number.\n* **targetPort** (<code>number</code>)  Container's port number.\n* **options** (<code>[DockerComposePortMappingOptions](#projen-dockercomposeportmappingoptions)</code>)  Port mapping options.\n  * **protocol** (<code>[DockerComposeProtocol](#projen-dockercomposeprotocol)</code>)  Port mapping protocol. __*Default*__: DockerComposeProtocol.TCP\n\n__Returns__:\n* <code>[DockerComposeServicePort](#projen-dockercomposeserviceport)</code>\n\n#### *static* serviceName(serviceName)🔹 <a id=\"projen-dockercompose-servicename\"></a>\n\nDepends on a service name.\n\n```ts\nstatic serviceName(serviceName: string): IDockerComposeServiceName\n```\n\n* **serviceName** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[IDockerComposeServiceName](#projen-idockercomposeservicename)</code>\n\n\n\n## class DockerComposeService 🔹 <a id=\"projen-dockercomposeservice\"></a>\n\nA docker-compose service.\n\n__Implements__: [IDockerComposeServiceName](#projen-idockercomposeservicename)\n\n### Initializer\n\n\n\n\n```ts\nnew DockerComposeService(serviceName: string, serviceDescription: DockerComposeServiceDescription)\n```\n\n* **serviceName** (<code>string</code>)  *No description*\n* **serviceDescription** (<code>[DockerComposeServiceDescription](#projen-dockercomposeservicedescription)</code>)  *No description*\n  * **command** (<code>Array<string></code>)  Provide a command to the docker container. __*Default*__: use the container's default command\n  * **dependsOn** (<code>Array<[IDockerComposeServiceName](#projen-idockercomposeservicename)></code>)  Names of other services this service depends on. __*Default*__: no dependencies\n  * **environment** (<code>Map<string, string></code>)  Add environment variables. __*Default*__: no environment variables are provided\n  * **image** (<code>string</code>)  Use a docker image. __*Optional*__\n  * **imageBuild** (<code>[DockerComposeBuild](#projen-dockercomposebuild)</code>)  Build a docker image. __*Optional*__\n  * **ports** (<code>Array<[DockerComposeServicePort](#projen-dockercomposeserviceport)></code>)  Map some ports. __*Default*__: no ports are mapped\n  * **volumes** (<code>Array<[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)></code>)  Mount some volumes into the service. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**dependsOn**🔹 | <code>Array<[IDockerComposeServiceName](#projen-idockercomposeservicename)></code> | Other services that this service depends on.\n**environment**🔹 | <code>Map<string, string></code> | Environment variables.\n**ports**🔹 | <code>Array<[DockerComposeServicePort](#projen-dockercomposeserviceport)></code> | Published ports.\n**serviceName**🔹 | <code>string</code> | Name of the service.\n**volumes**🔹 | <code>Array<[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)></code> | Volumes mounted in the container.\n**command**?🔹 | <code>Array<string></code> | Command to run in the container.<br/>__*Optional*__\n**image**?🔹 | <code>string</code> | Docker image.<br/>__*Optional*__\n**imageBuild**?🔹 | <code>[DockerComposeBuild](#projen-dockercomposebuild)</code> | Docker image build instructions.<br/>__*Optional*__\n\n### Methods\n\n\n#### addDependsOn(serviceName)🔹 <a id=\"projen-dockercomposeservice-adddependson\"></a>\n\nMake the service depend on another service.\n\n```ts\naddDependsOn(serviceName: IDockerComposeServiceName): void\n```\n\n* **serviceName** (<code>[IDockerComposeServiceName](#projen-idockercomposeservicename)</code>)  *No description*\n\n\n\n\n#### addEnvironment(name, value)🔹 <a id=\"projen-dockercomposeservice-addenvironment\"></a>\n\nAdd an environment variable.\n\n```ts\naddEnvironment(name: string, value: string): void\n```\n\n* **name** (<code>string</code>)  environment variable name.\n* **value** (<code>string</code>)  value of the environment variable.\n\n\n\n\n#### addPort(publishedPort, targetPort, options?)🔹 <a id=\"projen-dockercomposeservice-addport\"></a>\n\nAdd a port mapping.\n\n```ts\naddPort(publishedPort: number, targetPort: number, options?: DockerComposePortMappingOptions): void\n```\n\n* **publishedPort** (<code>number</code>)  Published port number.\n* **targetPort** (<code>number</code>)  Container's port number.\n* **options** (<code>[DockerComposePortMappingOptions](#projen-dockercomposeportmappingoptions)</code>)  Port mapping options.\n  * **protocol** (<code>[DockerComposeProtocol](#projen-dockercomposeprotocol)</code>)  Port mapping protocol. __*Default*__: DockerComposeProtocol.TCP\n\n\n\n\n#### addVolume(volume)🔹 <a id=\"projen-dockercomposeservice-addvolume\"></a>\n\nAdd a volume to the service.\n\n```ts\naddVolume(volume: IDockerComposeVolumeBinding): void\n```\n\n* **volume** (<code>[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)</code>)  *No description*\n\n\n\n\n\n\n## class FileBase 🔹 <a id=\"projen-filebase\"></a>\n\n\n\n__Extends__: [Component](#projen-component)\n__Implemented by__: [github.PullRequestTemplate](#projen-github-pullrequesttemplate), [python.RequirementsFile](#projen-python-requirementsfile), [python.SetupPy](#projen-python-setuppy), [web.ReactTypeDef](#projen-web-reacttypedef), [GitAttributesFile](#projen-gitattributesfile), [IgnoreFile](#projen-ignorefile), [IniFile](#projen-inifile), [JsonFile](#projen-jsonfile), [License](#projen-license), [Makefile](#projen-makefile), [TextFile](#projen-textfile), [TomlFile](#projen-tomlfile), [XmlFile](#projen-xmlfile), [YamlFile](#projen-yamlfile)\n__Obtainable from__: [Project](#projen-project).[tryFindFile](#projen-project#projen-project-tryfindfile)(), [Project](#projen-project).[tryRemoveFile](#projen-project#projen-project-tryremovefile)()\n\n### Initializer\n\n\n\n\n```ts\nnew FileBase(project: Project, filePath: string, options?: FileBaseOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[FileBaseOptions](#projen-filebaseoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**absolutePath**🔹 | <code>string</code> | The absolute path of this file.\n**executable**🔹 | <code>boolean</code> | Indicates if the file should be marked as executable.\n**path**🔹 | <code>string</code> | The file path, relative to the project root.\n**readonly**🔹 | <code>boolean</code> | Indicates if the file should be read-only or read-write.\n**changed**?🔹 | <code>boolean</code> | Indicates if the file has been changed during synthesis.<br/>__*Optional*__\n**marker**?🔹 | <code>string</code> | The projen marker, used to identify files as projen-generated.<br/>__*Optional*__\n\n### Methods\n\n\n#### synthesize()🔹 <a id=\"projen-filebase-synthesize\"></a>\n\nWrites the file to the project's output directory.\n\n```ts\nsynthesize(): void\n```\n\n\n\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-filebase-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  Call `resolver.resolve(obj)` on any objects in order to resolve token functions.\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class GitAttributesFile 🔹 <a id=\"projen-gitattributesfile\"></a>\n\nAssign attributes to file names in a git repository.\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\n\n\n```ts\nnew GitAttributesFile(project: Project)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n\n### Methods\n\n\n#### addAttributes(glob, ...attributes)🔹 <a id=\"projen-gitattributesfile-addattributes\"></a>\n\nMaps a set of attributes to a set of files.\n\n```ts\naddAttributes(glob: string, ...attributes: string[]): void\n```\n\n* **glob** (<code>string</code>)  Glob pattern to match files in the repo.\n* **attributes** (<code>string</code>)  Attributes to assign to these files.\n\n\n\n\n#### protected synthesizeContent(_)🔹 <a id=\"projen-gitattributesfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(_: IResolver): string\n```\n\n* **_** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class Gitpod 🔹 <a id=\"projen-gitpod\"></a>\n\nThe Gitpod component which emits .gitpod.yml.\n\n__Implements__: [IDevEnvironment](#projen-idevenvironment)\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew Gitpod(project: Project, options?: GitpodOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[GitpodOptions](#projen-gitpodoptions)</code>)  *No description*\n  * **dockerImage** (<code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code>)  A Docker image or Dockerfile for the container. __*Optional*__\n  * **ports** (<code>Array<string></code>)  An array of ports that should be exposed from the container. __*Optional*__\n  * **tasks** (<code>Array<[Task](#projen-task)></code>)  An array of tasks that should be run when the container starts. __*Optional*__\n  * **vscodeExtensions** (<code>Array<string></code>)  An array of extension IDs that specify the extensions that should be installed inside the container when it is created. __*Optional*__\n  * **prebuilds** (<code>[GitpodPrebuilds](#projen-gitpodprebuilds)</code>)  Optional Gitpod's Github App integration for prebuilds If this is not set and Gitpod's Github App is installed, then Gitpod will apply these defaults: https://www.gitpod.io/docs/prebuilds/#configure-the-github-app. __*Default*__: undefined\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**config**🔹 | <code>any</code> | Direct access to the gitpod configuration (escape hatch).\n\n### Methods\n\n\n#### addCustomTask(options)🔹 <a id=\"projen-gitpod-addcustomtask\"></a>\n\nAdd a task with more granular options.\n\nBy default, all tasks will be run in parallel. To run tasks in sequence,\ncreate a new `Task` and set the other tasks as subtasks.\n\n```ts\naddCustomTask(options: GitpodTask): void\n```\n\n* **options** (<code>[GitpodTask](#projen-gitpodtask)</code>)  The task parameters.\n  * **command** (<code>string</code>)  Required. \n  * **before** (<code>string</code>)  In case you need to run something even before init, that is a requirement for both init and command, you can use the before property. __*Optional*__\n  * **init** (<code>string</code>)  The init property can be used to specify shell commands that should only be executed after a workspace was freshly cloned and needs to be initialized somehow. __*Optional*__\n  * **name** (<code>string</code>)  A name for this task. __*Default*__: task names are omitted when blank\n  * **openIn** (<code>[GitpodOpenIn](#projen-gitpodopenin)</code>)  You can configure where in the IDE the terminal should be opened. __*Default*__: GitpodOpenIn.BOTTOM\n  * **openMode** (<code>[GitpodOpenMode](#projen-gitpodopenmode)</code>)  You can configure how the terminal should be opened relative to the previous task. __*Default*__: GitpodOpenMode.TAB_AFTER\n  * **prebuild** (<code>string</code>)  The optional prebuild command will be executed during prebuilds. __*Optional*__\n\n\n\n\n#### addDockerImage(image)🔹 <a id=\"projen-gitpod-adddockerimage\"></a>\n\nAdd a custom Docker image or Dockerfile for the container.\n\n```ts\naddDockerImage(image: DevEnvironmentDockerImage): void\n```\n\n* **image** (<code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code>)  The Docker image.\n\n\n\n\n#### addPorts(...ports)🔹 <a id=\"projen-gitpod-addports\"></a>\n\nAdd ports that should be exposed (forwarded) from the container.\n\n```ts\naddPorts(...ports: string[]): void\n```\n\n* **ports** (<code>string</code>)  The new ports.\n\n\n\n\n#### addPrebuilds(config)🔹 <a id=\"projen-gitpod-addprebuilds\"></a>\n\nAdd a prebuilds configuration for the Gitpod App.\n\n```ts\naddPrebuilds(config: GitpodPrebuilds): void\n```\n\n* **config** (<code>[GitpodPrebuilds](#projen-gitpodprebuilds)</code>)  The configuration.\n  * **addBadge** (<code>boolean</code>)  Add a \"Review in Gitpod\" button to the pull request's description. __*Default*__: false\n  * **addCheck** (<code>boolean</code>)  Add a check to pull requests. __*Default*__: true\n  * **addComment** (<code>boolean</code>)  Add a \"Review in Gitpod\" button as a comment to pull requests. __*Default*__: false\n  * **addLabel** (<code>boolean</code>)  Add a label once the prebuild is ready to pull requests. __*Default*__: false\n  * **branches** (<code>boolean</code>)  Enable for all branches in this repo. __*Default*__: false\n  * **master** (<code>boolean</code>)  Enable for the master/default branch. __*Default*__: true\n  * **pullRequests** (<code>boolean</code>)  Enable for pull requests coming from this repo. __*Default*__: true\n  * **pullRequestsFromForks** (<code>boolean</code>)  Enable for pull requests coming from forks. __*Default*__: false\n\n\n\n\n#### addTasks(...tasks)🔹 <a id=\"projen-gitpod-addtasks\"></a>\n\nAdd tasks to run when gitpod starts.\n\nBy default, all tasks will be run in parallel. To run tasks in sequence,\ncreate a new `Task` and specify the other tasks as subtasks.\n\n```ts\naddTasks(...tasks: Task[]): void\n```\n\n* **tasks** (<code>[Task](#projen-task)</code>)  The new tasks.\n\n\n\n\n#### addVscodeExtensions(...extensions)🔹 <a id=\"projen-gitpod-addvscodeextensions\"></a>\n\nAdd a list of VSCode extensions that should be automatically installed in the container.\n\nThese must be in the format defined in the Open VSX registry.\n\n```ts\naddVscodeExtensions(...extensions: string[]): void\n```\n\n* **extensions** (<code>string</code>)  The extension IDs.\n\n\n\n\n\n\n## class IgnoreFile 🔹 <a id=\"projen-ignorefile\"></a>\n\n\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\n\n\n```ts\nnew IgnoreFile(project: Project, filePath: string)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n\n\n### Methods\n\n\n#### addPatterns(...patterns)🔹 <a id=\"projen-ignorefile-addpatterns\"></a>\n\nAdd ignore patterns.\n\nFiles that match this pattern will be ignored. If the\npattern starts with a negation mark `!`, files that match will _not_ be\nignored.\n\nComment lines (start with `#`) are ignored.\n\n```ts\naddPatterns(...patterns: string[]): void\n```\n\n* **patterns** (<code>string</code>)  Ignore patterns.\n\n\n\n\n#### exclude(...patterns)🔹 <a id=\"projen-ignorefile-exclude\"></a>\n\nIgnore the files that match these patterns.\n\n```ts\nexclude(...patterns: string[]): void\n```\n\n* **patterns** (<code>string</code>)  The patterns to match.\n\n\n\n\n#### include(...patterns)🔹 <a id=\"projen-ignorefile-include\"></a>\n\nAlways include the specified file patterns.\n\n```ts\ninclude(...patterns: string[]): void\n```\n\n* **patterns** (<code>string</code>)  Patterns to include in git commits.\n\n\n\n\n#### removePatterns(...patterns)🔹 <a id=\"projen-ignorefile-removepatterns\"></a>\n\nRemoves patterns previously added from the ignore file.\n\nIf `addPattern()` is called after this, the pattern will be added again.\n\n```ts\nremovePatterns(...patterns: string[]): void\n```\n\n* **patterns** (<code>string</code>)  patters to remove.\n\n\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-ignorefile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class IniFile 🔹 <a id=\"projen-inifile\"></a>\n\nRepresents an INI file.\n\n__Extends__: [ObjectFile](#projen-objectfile)\n\n### Initializer\n\n\n\n\n```ts\nnew IniFile(project: Project, filePath: string, options: IniFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[IniFileOptions](#projen-inifileoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **obj** (<code>any</code>)  The object that will be serialized. __*Default*__: {} an empty object (use `file.obj` to mutate).\n  * **omitEmpty** (<code>boolean</code>)  Omits empty objects and arrays. __*Default*__: false\n\n\n### Methods\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-inifile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class JsonFile 🔹 <a id=\"projen-jsonfile\"></a>\n\nRepresents a JSON file.\n\n__Extends__: [ObjectFile](#projen-objectfile)\n\n### Initializer\n\n\n\n\n```ts\nnew JsonFile(project: Project, filePath: string, options: JsonFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[JsonFileOptions](#projen-jsonfileoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **obj** (<code>any</code>)  The object that will be serialized. __*Default*__: {} an empty object (use `file.obj` to mutate).\n  * **omitEmpty** (<code>boolean</code>)  Omits empty objects and arrays. __*Default*__: false\n  * **allowComments** (<code>boolean</code>)  Allow the use of comments in this file. __*Default*__: false for .json files, true for .json5 and .jsonc files\n  * **newline** (<code>boolean</code>)  Adds a newline at the end of the file. __*Default*__: true\n\n\n### Methods\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-jsonfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class JsonPatch 🔹 <a id=\"projen-jsonpatch\"></a>\n\nUtility for applying RFC-6902 JSON-Patch to a document.\n\nUse the the `JsonPatch.apply(doc, ...ops)` function to apply a set of\noperations to a JSON document and return the result.\n\nOperations can be created using the factory methods `JsonPatch.add()`,\n`JsonPatch.remove()`, etc.\n\n\n### Methods\n\n\n#### *static* add(path, value)🔹 <a id=\"projen-jsonpatch-add\"></a>\n\nAdds a value to an object or inserts it into an array.\n\nIn the case of an\narray, the value is inserted before the given index. The - character can be\nused instead of an index to insert at the end of an array.\n\n```ts\nstatic add(path: string, value: any): JsonPatch\n```\n\n* **path** (<code>string</code>)  *No description*\n* **value** (<code>any</code>)  *No description*\n\n__Returns__:\n* <code>[JsonPatch](#projen-jsonpatch)</code>\n\n#### *static* apply(document, ...ops)🔹 <a id=\"projen-jsonpatch-apply\"></a>\n\nApplies a set of JSON-Patch (RFC-6902) operations to `document` and returns the result.\n\n```ts\nstatic apply(document: any, ...ops: JsonPatch[]): any\n```\n\n* **document** (<code>any</code>)  The document to patch.\n* **ops** (<code>[JsonPatch](#projen-jsonpatch)</code>)  The operations to apply.\n\n__Returns__:\n* <code>any</code>\n\n#### *static* copy(from, path)🔹 <a id=\"projen-jsonpatch-copy\"></a>\n\nCopies a value from one location to another within the JSON document.\n\nBoth\nfrom and path are JSON Pointers.\n\n```ts\nstatic copy(from: string, path: string): JsonPatch\n```\n\n* **from** (<code>string</code>)  *No description*\n* **path** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[JsonPatch](#projen-jsonpatch)</code>\n\n#### *static* move(from, path)🔹 <a id=\"projen-jsonpatch-move\"></a>\n\nMoves a value from one location to the other.\n\nBoth from and path are JSON Pointers.\n\n```ts\nstatic move(from: string, path: string): JsonPatch\n```\n\n* **from** (<code>string</code>)  *No description*\n* **path** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[JsonPatch](#projen-jsonpatch)</code>\n\n#### *static* remove(path)🔹 <a id=\"projen-jsonpatch-remove\"></a>\n\nRemoves a value from an object or array.\n\n```ts\nstatic remove(path: string): JsonPatch\n```\n\n* **path** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[JsonPatch](#projen-jsonpatch)</code>\n\n#### *static* replace(path, value)🔹 <a id=\"projen-jsonpatch-replace\"></a>\n\nReplaces a value.\n\nEquivalent to a “remove” followed by an “add”.\n\n```ts\nstatic replace(path: string, value: any): JsonPatch\n```\n\n* **path** (<code>string</code>)  *No description*\n* **value** (<code>any</code>)  *No description*\n\n__Returns__:\n* <code>[JsonPatch](#projen-jsonpatch)</code>\n\n#### *static* test(path, value)🔹 <a id=\"projen-jsonpatch-test\"></a>\n\nTests that the specified value is set in the document.\n\nIf the test fails,\nthen the patch as a whole should not apply.\n\n```ts\nstatic test(path: string, value: any): JsonPatch\n```\n\n* **path** (<code>string</code>)  *No description*\n* **value** (<code>any</code>)  *No description*\n\n__Returns__:\n* <code>[JsonPatch](#projen-jsonpatch)</code>\n\n\n\n## class License 🔹 <a id=\"projen-license\"></a>\n\n\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\n\n\n```ts\nnew License(project: Project, options: LicenseOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[LicenseOptions](#projen-licenseoptions)</code>)  *No description*\n  * **spdx** (<code>string</code>)  License type (SPDX). \n  * **copyrightOwner** (<code>string</code>)  Copyright owner. __*Default*__: -\n  * **copyrightPeriod** (<code>string</code>)  Period of license (e.g. \"1998-2023\"). __*Default*__: current year (e.g. \"2020\")\n\n\n### Methods\n\n\n#### protected synthesizeContent(_)🔹 <a id=\"projen-license-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(_: IResolver): string\n```\n\n* **_** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class Logger 🔹 <a id=\"projen-logger\"></a>\n\nProject-level logging utilities.\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew Logger(project: Project, options?: LoggerOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  *No description*\n  * **level** (<code>[LogLevel](#projen-loglevel)</code>)  The logging verbosity. __*Default*__: LogLevel.INFO\n  * **usePrefix** (<code>boolean</code>)  Include a prefix for all logging messages with the project name. __*Default*__: false\n\n\n### Methods\n\n\n#### debug(...text)🔹 <a id=\"projen-logger-debug\"></a>\n\nLog a message to stderr with DEBUG severity.\n\n```ts\ndebug(...text: any[]): void\n```\n\n* **text** (<code>any</code>)  strings or objects to print.\n\n\n\n\n#### error(...text)🔹 <a id=\"projen-logger-error\"></a>\n\nLog a message to stderr with ERROR severity.\n\n```ts\nerror(...text: any[]): void\n```\n\n* **text** (<code>any</code>)  strings or objects to print.\n\n\n\n\n#### info(...text)🔹 <a id=\"projen-logger-info\"></a>\n\nLog a message to stderr with INFO severity.\n\n```ts\ninfo(...text: any[]): void\n```\n\n* **text** (<code>any</code>)  strings or objects to print.\n\n\n\n\n#### log(level, ...text)🔹 <a id=\"projen-logger-log\"></a>\n\nLog a message to stderr with a given logging level.\n\nThe message will be\nprinted as long as `logger.level` is set to the message's severity or higher.\n\n```ts\nlog(level: LogLevel, ...text: any[]): void\n```\n\n* **level** (<code>[LogLevel](#projen-loglevel)</code>)  Logging verbosity.\n* **text** (<code>any</code>)  strings or objects to print.\n\n\n\n\n#### verbose(...text)🔹 <a id=\"projen-logger-verbose\"></a>\n\nLog a message to stderr with VERBOSE severity.\n\n```ts\nverbose(...text: any[]): void\n```\n\n* **text** (<code>any</code>)  strings or objects to print.\n\n\n\n\n#### warn(...text)🔹 <a id=\"projen-logger-warn\"></a>\n\nLog a message to stderr with WARN severity.\n\n```ts\nwarn(...text: any[]): void\n```\n\n* **text** (<code>any</code>)  strings or objects to print.\n\n\n\n\n\n\n## class Makefile 🔹 <a id=\"projen-makefile\"></a>\n\nMinimal Makefile.\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\n\n\n```ts\nnew Makefile(project: Project, filePath: string, options?: MakefileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[MakefileOptions](#projen-makefileoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **all** (<code>Array<string></code>)  List of targets to build when Make is invoked without specifying any targets. __*Default*__: []\n  * **rules** (<code>Array<[Rule](#projen-rule)></code>)  Rules to include in the Makefile. __*Default*__: []\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**rules**🔹 | <code>Array<[Rule](#projen-rule)></code> | List of rule definitions.\n\n### Methods\n\n\n#### addAll(target)🔹 <a id=\"projen-makefile-addall\"></a>\n\nAdd a target to all.\n\n```ts\naddAll(target: string): Makefile\n```\n\n* **target** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[Makefile](#projen-makefile)</code>\n\n#### addAlls(...targets)🔹 <a id=\"projen-makefile-addalls\"></a>\n\nAdd multiple targets to all.\n\n```ts\naddAlls(...targets: string[]): Makefile\n```\n\n* **targets** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[Makefile](#projen-makefile)</code>\n\n#### addRule(rule)🔹 <a id=\"projen-makefile-addrule\"></a>\n\nAdd a rule to the Makefile.\n\n```ts\naddRule(rule: Rule): Makefile\n```\n\n* **rule** (<code>[Rule](#projen-rule)</code>)  *No description*\n  * **targets** (<code>Array<string></code>)  Files to be created or updated by this rule. \n  * **phony** (<code>boolean</code>)  Marks whether the target is phony. __*Default*__: false\n  * **prerequisites** (<code>Array<string></code>)  Files that are used as inputs to create a target. __*Default*__: []\n  * **recipe** (<code>Array<string></code>)  Commands that are run (using prerequisites as inputs) to create a target. __*Default*__: []\n\n__Returns__:\n* <code>[Makefile](#projen-makefile)</code>\n\n#### addRules(...rules)🔹 <a id=\"projen-makefile-addrules\"></a>\n\nAdd multiple rules to the Makefile.\n\n```ts\naddRules(...rules: Rule[]): Makefile\n```\n\n* **rules** (<code>[Rule](#projen-rule)</code>)  *No description*\n  * **targets** (<code>Array<string></code>)  Files to be created or updated by this rule. \n  * **phony** (<code>boolean</code>)  Marks whether the target is phony. __*Default*__: false\n  * **prerequisites** (<code>Array<string></code>)  Files that are used as inputs to create a target. __*Default*__: []\n  * **recipe** (<code>Array<string></code>)  Commands that are run (using prerequisites as inputs) to create a target. __*Default*__: []\n\n__Returns__:\n* <code>[Makefile](#projen-makefile)</code>\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-makefile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class ObjectFile 🔹 <a id=\"projen-objectfile\"></a>\n\nRepresents an Object file.\n\n__Extends__: [FileBase](#projen-filebase)\n__Implemented by__: [IniFile](#projen-inifile), [JsonFile](#projen-jsonfile), [TomlFile](#projen-tomlfile), [XmlFile](#projen-xmlfile), [YamlFile](#projen-yamlfile)\n__Obtainable from__: [Project](#projen-project).[tryFindObjectFile](#projen-project#projen-project-tryfindobjectfile)()\n\n### Initializer\n\n\n\n\n```ts\nnew ObjectFile(project: Project, filePath: string, options: ObjectFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[ObjectFileOptions](#projen-objectfileoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **obj** (<code>any</code>)  The object that will be serialized. __*Default*__: {} an empty object (use `file.obj` to mutate).\n  * **omitEmpty** (<code>boolean</code>)  Omits empty objects and arrays. __*Default*__: false\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**omitEmpty**🔹 | <code>boolean</code> | Indicates if empty objects and arrays are omitted from the output object.\n\n### Methods\n\n\n#### addDeletionOverride(path)🔹 <a id=\"projen-objectfile-adddeletionoverride\"></a>\n\nSyntactic sugar for `addOverride(path, undefined)`.\n\n```ts\naddDeletionOverride(path: string): void\n```\n\n* **path** (<code>string</code>)  The path of the value to delete.\n\n\n\n\n#### addOverride(path, value)🔹 <a id=\"projen-objectfile-addoverride\"></a>\n\nAdds an override to the synthesized object file.\n\nIf the override is nested, separate each nested level using a dot (.) in the path parameter.\nIf there is an array as part of the nesting, specify the index in the path.\n\nTo include a literal `.` in the property name, prefix with a `\\`. In most\nprogramming languages you will need to write this as `\"\\\\.\"` because the\n`\\` itself will need to be escaped.\n\nFor example,\n```typescript\nproject.tsconfig.file.addOverride('compilerOptions.alwaysStrict', true);\nproject.tsconfig.file.addOverride('compilerOptions.lib', ['dom', 'dom.iterable', 'esnext']);\n```\nwould add the overrides\n```json\n\"compilerOptions\": {\n   \"alwaysStrict\": true,\n   \"lib\": [\n     \"dom\",\n     \"dom.iterable\",\n     \"esnext\"\n   ]\n   ...\n}\n...\n```\n\n```ts\naddOverride(path: string, value: any): void\n```\n\n* **path** (<code>string</code>)  - The path of the property, you can use dot notation to override values in complex types.\n* **value** (<code>any</code>)  - The value.\n\n\n\n\n#### addToArray(path, ...values)🔹 <a id=\"projen-objectfile-addtoarray\"></a>\n\nAdds to an array in the synthesized object file.\n\nIf the array is nested, separate each nested level using a dot (.) in the path parameter.\nIf there is an array as part of the nesting, specify the index in the path.\n\nTo include a literal `.` in the property name, prefix with a `\\`. In most\nprogramming languages you will need to write this as `\"\\\\.\"` because the\n`\\` itself will need to be escaped.\n\nFor example, with the following object file\n```json\n\"compilerOptions\": {\n   \"exclude\": [\"node_modules\"],\n   \"lib\": [\"es2019\"]\n   ...\n}\n...\n```\n\n```typescript\nproject.tsconfig.file.addToArray('compilerOptions.exclude', 'coverage');\nproject.tsconfig.file.addToArray('compilerOptions.lib', 'dom', 'dom.iterable', 'esnext');\n```\nwould result in the following object file\n```json\n\"compilerOptions\": {\n   \"exclude\": [\"node_modules\", \"coverage\"],\n   \"lib\": [\"es2019\", \"dom\", \"dom.iterable\", \"esnext\"]\n   ...\n}\n...\n```\n\n```ts\naddToArray(path: string, ...values: any[]): void\n```\n\n* **path** (<code>string</code>)  - The path of the property, you can use dot notation to att to arrays in complex types.\n* **values** (<code>any</code>)  - The values to add.\n\n\n\n\n#### patch(...patches)🔹 <a id=\"projen-objectfile-patch\"></a>\n\nApplies an RFC 6902 JSON-patch to the synthesized object file. See https://datatracker.ietf.org/doc/html/rfc6902 for more information.\n\nFor example, with the following object file\n```json\n\"compilerOptions\": {\n   \"exclude\": [\"node_modules\"],\n   \"lib\": [\"es2019\"]\n   ...\n}\n...\n```\n\n```typescript\nproject.tsconfig.file.patch(JsonPatch.add(\"/compilerOptions/exclude/-\", \"coverage\"));\nproject.tsconfig.file.patch(JsonPatch.replace(\"/compilerOptions/lib\", [\"dom\", \"dom.iterable\", \"esnext\"]));\n```\nwould result in the following object file\n```json\n\"compilerOptions\": {\n   \"exclude\": [\"node_modules\", \"coverage\"],\n   \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"]\n   ...\n}\n...\n```\n\n```ts\npatch(...patches: JsonPatch[]): void\n```\n\n* **patches** (<code>[JsonPatch](#projen-jsonpatch)</code>)  - The patch operations to apply.\n\n\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-objectfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class Project 🔹 <a id=\"projen-project\"></a>\n\nBase project.\n\n\n### Initializer\n\n\n\n\n```ts\nnew Project(options: ProjectOptions)\n```\n\n* **options** (<code>[ProjectOptions](#projen-projectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**buildTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**commitGenerated**🔹 | <code>boolean</code> | Whether to commit the managed files by default.\n**compileTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**components**🔹 | <code>Array<[Component](#projen-component)></code> | Returns all the components within this project.\n**deps**🔹 | <code>[Dependencies](#projen-dependencies)</code> | Project dependencies.\n**ejected**🔹 | <code>boolean</code> | Whether or not the project is being ejected.\n**files**🔹 | <code>Array<[FileBase](#projen-filebase)></code> | All files in this project.\n**gitattributes**🔹 | <code>[GitAttributesFile](#projen-gitattributesfile)</code> | The .gitattributes file for this repository.\n**gitignore**🔹 | <code>[IgnoreFile](#projen-ignorefile)</code> | .gitignore.\n**logger**🔹 | <code>[Logger](#projen-logger)</code> | Logging utilities.\n**name**🔹 | <code>string</code> | Project name.\n**outdir**🔹 | <code>string</code> | Absolute output directory of this project.\n**packageTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**postCompileTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**preCompileTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**projectBuild**🔹 | <code>[ProjectBuild](#projen-projectbuild)</code> | Manages the build process of the project.\n**projenCommand**🔹 | <code>string</code> | The command to use in order to run the projen CLI.\n**root**🔹 | <code>[Project](#projen-project)</code> | The root project.\n**tasks**🔹 | <code>[Tasks](#projen-tasks)</code> | Project tasks.\n**testTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**defaultTask**?🔹 | <code>[Task](#projen-task)</code> | This is the \"default\" task, the one that executes \"projen\".<br/>__*Optional*__\n**initProject**?🔹 | <code>[InitProject](#projen-initproject)</code> | The options used when this project is bootstrapped via `projen new`.<br/>__*Optional*__\n**parent**?🔹 | <code>[Project](#projen-project)</code> | A parent project.<br/>__*Optional*__\n*static* **DEFAULT_TASK**🔹 | <code>string</code> | The name of the default task (the task executed when `projen` is run without arguments).\n\n### Methods\n\n\n#### addExcludeFromCleanup(...globs)🔹 <a id=\"projen-project-addexcludefromcleanup\"></a>\n\nExclude the matching files from pre-synth cleanup.\n\nCan be used when, for example, some\nsource files include the projen marker and we don't want them to be erased during synth.\n\n```ts\naddExcludeFromCleanup(...globs: string[]): void\n```\n\n* **globs** (<code>string</code>)  The glob patterns to match.\n\n\n\n\n#### addGitIgnore(pattern)🔹 <a id=\"projen-project-addgitignore\"></a>\n\nAdds a .gitignore pattern.\n\n```ts\naddGitIgnore(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  The glob pattern to ignore.\n\n\n\n\n#### addPackageIgnore(_pattern)🔹 <a id=\"projen-project-addpackageignore\"></a>\n\nExclude these files from the bundled package.\n\nImplemented by project types based on the\npackaging mechanism. For example, `NodeProject` delegates this to `.npmignore`.\n\n```ts\naddPackageIgnore(_pattern: string): void\n```\n\n* **_pattern** (<code>string</code>)  The glob pattern to exclude.\n\n\n\n\n#### addTask(name, props?)🔹 <a id=\"projen-project-addtask\"></a>\n\nAdds a new task to this project.\n\nThis will fail if the project already has\na task with this name.\n\n```ts\naddTask(name: string, props?: TaskOptions): Task\n```\n\n* **name** (<code>string</code>)  The task name to add.\n* **props** (<code>[TaskOptions](#projen-taskoptions)</code>)  Task properties.\n  * **condition** (<code>string</code>)  A shell command which determines if the this task should be executed. __*Optional*__\n  * **cwd** (<code>string</code>)  The working directory for all steps in this task (unless overridden by the step). __*Default*__: process.cwd()\n  * **description** (<code>string</code>)  The description of this build command. __*Default*__: the task name\n  * **env** (<code>Map<string, string></code>)  Defines environment variables for the execution of this task. __*Default*__: {}\n  * **requiredEnv** (<code>Array<string></code>)  A set of environment variables that must be defined in order to execute this task. __*Optional*__\n  * **exec** (<code>string</code>)  Shell command to execute as the first command of the task. __*Default*__: add steps using `task.exec(command)` or `task.spawn(subtask)`\n  * **steps** (<code>Array<[TaskStep](#projen-taskstep)></code>)  List of task steps to run. __*Optional*__\n\n__Returns__:\n* <code>[Task](#projen-task)</code>\n\n#### addTip(message)⚠️ <a id=\"projen-project-addtip\"></a>\n\nPrints a \"tip\" message during synthesis.\n\n```ts\naddTip(message: string): void\n```\n\n* **message** (<code>string</code>)  The message.\n\n\n\n\n#### annotateGenerated(_glob)🔹 <a id=\"projen-project-annotategenerated\"></a>\n\nConsider a set of files as \"generated\".\n\nThis method is implemented by\nderived classes and used for example, to add git attributes to tell GitHub\nthat certain files are generated.\n\n```ts\nannotateGenerated(_glob: string): void\n```\n\n* **_glob** (<code>string</code>)  the glob pattern to match (could be a file path).\n\n\n\n\n#### postSynthesize()🔹 <a id=\"projen-project-postsynthesize\"></a>\n\nCalled after all components are synthesized.\n\nOrder is *not* guaranteed.\n\n```ts\npostSynthesize(): void\n```\n\n\n\n\n\n#### preSynthesize()🔹 <a id=\"projen-project-presynthesize\"></a>\n\nCalled before all components are synthesized.\n\n```ts\npreSynthesize(): void\n```\n\n\n\n\n\n#### removeTask(name)🔹 <a id=\"projen-project-removetask\"></a>\n\nRemoves a task from a project.\n\n```ts\nremoveTask(name: string): Task\n```\n\n* **name** (<code>string</code>)  The name of the task to remove.\n\n__Returns__:\n* <code>[Task](#projen-task)</code>\n\n#### runTaskCommand(task)🔹 <a id=\"projen-project-runtaskcommand\"></a>\n\nReturns the shell command to execute in order to run a task.\n\nBy default, this is `npx projen@<version> <task>`\n\n```ts\nrunTaskCommand(task: Task): string\n```\n\n* **task** (<code>[Task](#projen-task)</code>)  The task for which the command is required.\n\n__Returns__:\n* <code>string</code>\n\n#### synth()🔹 <a id=\"projen-project-synth\"></a>\n\nSynthesize all project files into `outdir`.\n\n1. Call \"this.preSynthesize()\"\n2. Delete all generated files\n3. Synthesize all sub-projects\n4. Synthesize all components of this project\n5. Call \"postSynthesize()\" for all components of this project\n6. Call \"this.postSynthesize()\"\n\n```ts\nsynth(): void\n```\n\n\n\n\n\n#### tryFindFile(filePath)🔹 <a id=\"projen-project-tryfindfile\"></a>\n\nFinds a file at the specified relative path within this project and all its subprojects.\n\n```ts\ntryFindFile(filePath: string): FileBase\n```\n\n* **filePath** (<code>string</code>)  The file path.\n\n__Returns__:\n* <code>[FileBase](#projen-filebase)</code>\n\n#### tryFindJsonFile(filePath)⚠️ <a id=\"projen-project-tryfindjsonfile\"></a>\n\nFinds a json file by name.\n\n```ts\ntryFindJsonFile(filePath: string): JsonFile\n```\n\n* **filePath** (<code>string</code>)  The file path.\n\n__Returns__:\n* <code>[JsonFile](#projen-jsonfile)</code>\n\n#### tryFindObjectFile(filePath)🔹 <a id=\"projen-project-tryfindobjectfile\"></a>\n\nFinds an object file (like JsonFile, YamlFile, etc.) by name.\n\n```ts\ntryFindObjectFile(filePath: string): ObjectFile\n```\n\n* **filePath** (<code>string</code>)  The file path.\n\n__Returns__:\n* <code>[ObjectFile](#projen-objectfile)</code>\n\n#### tryRemoveFile(filePath)🔹 <a id=\"projen-project-tryremovefile\"></a>\n\nFinds a file at the specified relative path within this project and removes it.\n\n```ts\ntryRemoveFile(filePath: string): FileBase\n```\n\n* **filePath** (<code>string</code>)  The file path.\n\n__Returns__:\n* <code>[FileBase](#projen-filebase)</code>\n\n\n\n## class ProjectBuild 🔹 <a id=\"projen-projectbuild\"></a>\n\nManages a standard build process for all projects.\n\nBuild spawns these tasks in order:\n1. default\n2. pre-compile\n3. compile\n4. post-compile\n5. test\n6. package\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew ProjectBuild(project: Project)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**buildTask**🔹 | <code>[Task](#projen-task)</code> | The task responsible for a full release build.\n**compileTask**🔹 | <code>[Task](#projen-task)</code> | Compiles the code.\n**packageTask**🔹 | <code>[Task](#projen-task)</code> | The \"package\" task.\n**postCompileTask**🔹 | <code>[Task](#projen-task)</code> | Post-compile task.\n**preCompileTask**🔹 | <code>[Task](#projen-task)</code> | Pre-compile task.\n**testTask**🔹 | <code>[Task](#projen-task)</code> | Tests the code.\n\n\n\n## class Projects 🔹 <a id=\"projen-projects\"></a>\n\nProgrammatic API for projen.\n\n\n### Methods\n\n\n#### *static* createProject(options)🔹 <a id=\"projen-projects-createproject\"></a>\n\nCreates a new project with defaults.\n\nThis function creates the project type in-process (with in VM) and calls\n`.synth()` on it (if `options.synth` is not `false`).\n\nAt the moment, it also generates a `.projenrc.js` file with the same code\nthat was just executed. In the future, this will also be done by the project\ntype, so we can easily support multiple languages of projenrc.\n\n```ts\nstatic createProject(options: CreateProjectOptions): void\n```\n\n* **options** (<code>[CreateProjectOptions](#projen-createprojectoptions)</code>)  *No description*\n  * **dir** (<code>string</code>)  Directory that the project will be generated in. \n  * **projectFqn** (<code>string</code>)  Fully-qualified name of the project type (usually formatted as `module.ProjectType`). \n  * **projectOptions** (<code>Map<string, any></code>)  Project options. \n  * **optionHints** (<code>[InitProjectOptionHints](#projen-initprojectoptionhints)</code>)  Should we render commented-out default options in the projenrc file? __*Default*__: InitProjectOptionHints.FEATURED\n  * **post** (<code>boolean</code>)  Should we execute post synthesis hooks? __*Default*__: true\n  * **synth** (<code>boolean</code>)  Should we call `project.synth()` or instantiate the project (could still have side-effects) and render the .projenrc file. __*Default*__: true\n\n\n\n\n\n\n## class Projenrc 🔹 <a id=\"projen-projenrc\"></a>\n\nSets up a project to use JSON for projenrc.\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew Projenrc(project: Project, options?: ProjenrcOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  *No description*\n  * **filename** (<code>string</code>)  The name of the projenrc file. __*Default*__: \".projenrc.json\"\n\n\n\n\n## class Renovatebot 🔹 <a id=\"projen-renovatebot\"></a>\n\nDefines renovatebot configuration for projen project.\n\nIgnores the versions controlled by Projen.\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew Renovatebot(project: Project, options?: RenovatebotOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  *No description*\n  * **ignore** (<code>Array<string></code>)  You can use the `ignore` option to customize which dependencies are updated. __*Default*__: []\n  * **ignoreProjen** (<code>boolean</code>)  Ignores updates to `projen`. __*Default*__: true\n  * **labels** (<code>Array<string></code>)  List of labels to apply to the created PR's. __*Optional*__\n  * **scheduleInterval** (<code>Array<string></code>)  How often to check for new versions and raise pull requests. __*Default*__: [\"at any time\"]\n\n\n### Methods\n\n\n#### preSynthesize()🔹 <a id=\"projen-renovatebot-presynthesize\"></a>\n\nCalled before synthesis.\n\n```ts\npreSynthesize(): void\n```\n\n\n\n\n\n\n\n## class SampleDir 🔹 <a id=\"projen-sampledir\"></a>\n\nRenders the given files into the directory if the directory does not exist.\n\nUse this to create sample code files\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\nCreate sample files in the given directory if the given directory does not exist.\n\n```ts\nnew SampleDir(project: Project, dir: string, options: SampleDirOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  Parent project to add files to.\n* **dir** (<code>string</code>)  directory to add files to.\n* **options** (<code>[SampleDirOptions](#projen-samplediroptions)</code>)  options for which files to create.\n  * **files** (<code>Map<string, string></code>)  The files to render into the directory. __*Optional*__\n  * **sourceDir** (<code>string</code>)  Absolute path to a directory to copy files from (does not need to be text files). __*Optional*__\n\n\n### Methods\n\n\n#### synthesize()🔹 <a id=\"projen-sampledir-synthesize\"></a>\n\nSynthesizes files to the project output directory.\n\n```ts\nsynthesize(): void\n```\n\n\n\n\n\n\n\n## class SampleFile 🔹 <a id=\"projen-samplefile\"></a>\n\nProduces a file with the given contents but only once, if the file doesn't already exist.\n\nUse this for creating example code files or other resources.\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\nCreates a new SampleFile object.\n\n```ts\nnew SampleFile(project: Project, filePath: string, options: SampleFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  - the project to tie this file to.\n* **filePath** (<code>string</code>)  - the relative path in the project to put the file.\n* **options** (<code>[SampleFileOptions](#projen-samplefileoptions)</code>)  - the options for the file.\n  * **contents** (<code>string</code>)  The contents of the file to write. __*Optional*__\n  * **sourcePath** (<code>string</code>)  Absolute path to a file to copy the contents from (does not need to be a text file). __*Optional*__\n\n\n### Methods\n\n\n#### synthesize()🔹 <a id=\"projen-samplefile-synthesize\"></a>\n\nSynthesizes files to the project output directory.\n\n```ts\nsynthesize(): void\n```\n\n\n\n\n\n\n\n## class SampleReadme 🔹 <a id=\"projen-samplereadme\"></a>\n\nRepresents a README.md sample file. You are expected to manage this file after creation.\n\n__Extends__: [SampleFile](#projen-samplefile)\n\n### Initializer\n\n\n\n\n```ts\nnew SampleReadme(project: Project, props?: SampleReadmeProps)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **props** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  *No description*\n  * **contents** (<code>string</code>)  The contents. __*Default*__: \"# replace this\"\n  * **filename** (<code>string</code>)  The name of the README.md file. __*Default*__: \"README.md\"\n\n\n\n\n## class Semver ⚠️ <a id=\"projen-semver\"></a>\n\n\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**spec**⚠️ | <code>string</code> | <span></span>\n**mode**?⚠️ | <code>string</code> | __*Optional*__\n**version**?⚠️ | <code>string</code> | __*Optional*__\n\n### Methods\n\n\n#### *static* caret(version)⚠️ <a id=\"projen-semver-caret\"></a>\n\nAccept any minor version.\n\n>= version\n< next major version\n\n```ts\nstatic caret(version: string): Semver\n```\n\n* **version** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[Semver](#projen-semver)</code>\n\n#### *static* latest()⚠️ <a id=\"projen-semver-latest\"></a>\n\nLatest version.\n\n```ts\nstatic latest(): Semver\n```\n\n\n__Returns__:\n* <code>[Semver](#projen-semver)</code>\n\n#### *static* of(spec)⚠️ <a id=\"projen-semver-of\"></a>\n\n\n\n```ts\nstatic of(spec: string): Semver\n```\n\n* **spec** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[Semver](#projen-semver)</code>\n\n#### *static* pinned(version)⚠️ <a id=\"projen-semver-pinned\"></a>\n\nAccept only an exact version.\n\n```ts\nstatic pinned(version: string): Semver\n```\n\n* **version** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[Semver](#projen-semver)</code>\n\n#### *static* tilde(version)⚠️ <a id=\"projen-semver-tilde\"></a>\n\nAccept patches.\n\n>= version\n< next minor version\n\n```ts\nstatic tilde(version: string): Semver\n```\n\n* **version** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[Semver](#projen-semver)</code>\n\n\n\n## class SourceCode 🔹 <a id=\"projen-sourcecode\"></a>\n\nRepresents a source file.\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew SourceCode(project: Project, filePath: string, options?: SourceCodeOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[SourceCodeOptions](#projen-sourcecodeoptions)</code>)  *No description*\n  * **indent** (<code>number</code>)  Indentation size. __*Default*__: 2\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**filePath**🔹 | <code>string</code> | <span></span>\n**marker**?🔹 | <code>string</code> | __*Optional*__\n\n### Methods\n\n\n#### close(code?)🔹 <a id=\"projen-sourcecode-close\"></a>\n\nDecreases the indentation level and closes a code block.\n\n```ts\nclose(code?: string): void\n```\n\n* **code** (<code>string</code>)  The code after the block is closed (e.g. `}`).\n\n\n\n\n#### line(code?)🔹 <a id=\"projen-sourcecode-line\"></a>\n\nEmit a line of code.\n\n```ts\nline(code?: string): void\n```\n\n* **code** (<code>string</code>)  The contents, if not specified, just adds a newline.\n\n\n\n\n#### open(code?)🔹 <a id=\"projen-sourcecode-open\"></a>\n\nOpens a code block and increases the indentation level.\n\n```ts\nopen(code?: string): void\n```\n\n* **code** (<code>string</code>)  The code before the block starts (e.g. `export class {`).\n\n\n\n\n\n\n## class Task 🔹 <a id=\"projen-task\"></a>\n\nA task that can be performed on the project.\n\nModeled as a series of shell\ncommands and subtasks.\n\n\n### Initializer\n\n\n\n\n```ts\nnew Task(name: string, props?: TaskOptions)\n```\n\n* **name** (<code>string</code>)  *No description*\n* **props** (<code>[TaskOptions](#projen-taskoptions)</code>)  *No description*\n  * **condition** (<code>string</code>)  A shell command which determines if the this task should be executed. __*Optional*__\n  * **cwd** (<code>string</code>)  The working directory for all steps in this task (unless overridden by the step). __*Default*__: process.cwd()\n  * **description** (<code>string</code>)  The description of this build command. __*Default*__: the task name\n  * **env** (<code>Map<string, string></code>)  Defines environment variables for the execution of this task. __*Default*__: {}\n  * **requiredEnv** (<code>Array<string></code>)  A set of environment variables that must be defined in order to execute this task. __*Optional*__\n  * **exec** (<code>string</code>)  Shell command to execute as the first command of the task. __*Default*__: add steps using `task.exec(command)` or `task.spawn(subtask)`\n  * **steps** (<code>Array<[TaskStep](#projen-taskstep)></code>)  List of task steps to run. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | Task name.\n**steps**🔹 | <code>Array<[TaskStep](#projen-taskstep)></code> | Returns an immutable copy of all the step specifications of the task.\n**condition**?🔹 | <code>string</code> | A command to execute which determines if the task should be skipped.<br/>__*Optional*__\n**description**?🔹 | <code>string</code> | Returns the description of this task.<br/>__*Optional*__\n\n### Methods\n\n\n#### builtin(name)🔹 <a id=\"projen-task-builtin\"></a>\n\nExecute a builtin task.\n\nBuiltin tasks are programs bundled as part of projen itself and used as\nhelpers for various components.\n\nIn the future we should support built-in tasks from external modules.\n\n```ts\nbuiltin(name: string): void\n```\n\n* **name** (<code>string</code>)  The name of the builtin task to execute (e.g. `release/resolve-version`).\n\n\n\n\n#### env(name, value)🔹 <a id=\"projen-task-env\"></a>\n\nAdds an environment variable to this task.\n\n```ts\nenv(name: string, value: string): void\n```\n\n* **name** (<code>string</code>)  The name of the variable.\n* **value** (<code>string</code>)  The value.\n\n\n\n\n#### exec(command, options?)🔹 <a id=\"projen-task-exec\"></a>\n\nExecutes a shell command.\n\n```ts\nexec(command: string, options?: TaskStepOptions): void\n```\n\n* **command** (<code>string</code>)  Shell command.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  Options.\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n#### lock()🔹 <a id=\"projen-task-lock\"></a>\n\nForbid additional changes to this task.\n\n```ts\nlock(): void\n```\n\n\n\n\n\n#### prepend(shell, options?)⚠️ <a id=\"projen-task-prepend\"></a>\n\nAdds a command at the beginning of the task.\n\n```ts\nprepend(shell: string, options?: TaskStepOptions): void\n```\n\n* **shell** (<code>string</code>)  The command to add.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  *No description*\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n#### prependExec(shell, options?)🔹 <a id=\"projen-task-prependexec\"></a>\n\nAdds a command at the beginning of the task.\n\n```ts\nprependExec(shell: string, options?: TaskStepOptions): void\n```\n\n* **shell** (<code>string</code>)  The command to add.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  *No description*\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n#### prependSay(message, options?)🔹 <a id=\"projen-task-prependsay\"></a>\n\nSays something at the beginning of the task.\n\n```ts\nprependSay(message: string, options?: TaskStepOptions): void\n```\n\n* **message** (<code>string</code>)  Your message.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  *No description*\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n#### prependSpawn(subtask, options?)🔹 <a id=\"projen-task-prependspawn\"></a>\n\nAdds a spawn instruction at the beginning of the task.\n\n```ts\nprependSpawn(subtask: Task, options?: TaskStepOptions): void\n```\n\n* **subtask** (<code>[Task](#projen-task)</code>)  The subtask to execute.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  *No description*\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n#### reset(command?, options?)🔹 <a id=\"projen-task-reset\"></a>\n\nReset the task so it no longer has any commands.\n\n```ts\nreset(command?: string, options?: TaskStepOptions): void\n```\n\n* **command** (<code>string</code>)  the first command to add to the task after it was cleared.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  *No description*\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n#### say(message, options?)🔹 <a id=\"projen-task-say\"></a>\n\nSay something.\n\n```ts\nsay(message: string, options?: TaskStepOptions): void\n```\n\n* **message** (<code>string</code>)  Your message.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  Options.\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n#### spawn(subtask, options?)🔹 <a id=\"projen-task-spawn\"></a>\n\nSpawns a sub-task.\n\n```ts\nspawn(subtask: Task, options?: TaskStepOptions): void\n```\n\n* **subtask** (<code>[Task](#projen-task)</code>)  The subtask to execute.\n* **options** (<code>[TaskStepOptions](#projen-taskstepoptions)</code>)  *No description*\n  * **cwd** (<code>string</code>)  The working directory for this step. __*Default*__: determined by the task\n  * **name** (<code>string</code>)  Step name. __*Default*__: no name\n\n\n\n\n\n\n## class TaskRuntime 🔹 <a id=\"projen-taskruntime\"></a>\n\nThe runtime component of the tasks engine.\n\n\n### Initializer\n\n\n\n\n```ts\nnew TaskRuntime(workdir: string)\n```\n\n* **workdir** (<code>string</code>)  *No description*\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**manifest**🔹 | <code>[TasksManifest](#projen-tasksmanifest)</code> | The contents of tasks.json.\n**tasks**🔹 | <code>Array<[TaskSpec](#projen-taskspec)></code> | The tasks in this project.\n**workdir**🔹 | <code>string</code> | The root directory of the project and the cwd for executing tasks.\n*static* **MANIFEST_FILE**🔹 | <code>string</code> | The project-relative path of the tasks manifest file.\n\n### Methods\n\n\n#### runTask(name, parents?)🔹 <a id=\"projen-taskruntime-runtask\"></a>\n\nRuns the task.\n\n```ts\nrunTask(name: string, parents?: Array<string>): void\n```\n\n* **name** (<code>string</code>)  The task name.\n* **parents** (<code>Array<string></code>)  *No description*\n\n\n\n\n#### tryFindTask(name)🔹 <a id=\"projen-taskruntime-tryfindtask\"></a>\n\nFind a task by name, or `undefined` if not found.\n\n```ts\ntryFindTask(name: string): TaskSpec\n```\n\n* **name** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[TaskSpec](#projen-taskspec)</code>\n\n\n\n## class Tasks 🔹 <a id=\"projen-tasks\"></a>\n\nDefines project tasks.\n\nTasks extend the projen CLI by adding subcommands to it. Task definitions are\nsynthesized into `.projen/tasks.json`.\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew Tasks(project: Project)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**all**🔹 | <code>Array<[Task](#projen-task)></code> | All tasks.\n**env**🔹 | <code>Map<string, string></code> | Returns a copy of the currently global environment for this project.\n\n### Methods\n\n\n#### addEnvironment(name, value)🔹 <a id=\"projen-tasks-addenvironment\"></a>\n\nAdds global environment.\n\n```ts\naddEnvironment(name: string, value: string): void\n```\n\n* **name** (<code>string</code>)  Environment variable name.\n* **value** (<code>string</code>)  Value.\n\n\n\n\n#### addTask(name, options?)🔹 <a id=\"projen-tasks-addtask\"></a>\n\nAdds a task to a project.\n\n```ts\naddTask(name: string, options?: TaskOptions): Task\n```\n\n* **name** (<code>string</code>)  The name of the task.\n* **options** (<code>[TaskOptions](#projen-taskoptions)</code>)  Task options.\n  * **condition** (<code>string</code>)  A shell command which determines if the this task should be executed. __*Optional*__\n  * **cwd** (<code>string</code>)  The working directory for all steps in this task (unless overridden by the step). __*Default*__: process.cwd()\n  * **description** (<code>string</code>)  The description of this build command. __*Default*__: the task name\n  * **env** (<code>Map<string, string></code>)  Defines environment variables for the execution of this task. __*Default*__: {}\n  * **requiredEnv** (<code>Array<string></code>)  A set of environment variables that must be defined in order to execute this task. __*Optional*__\n  * **exec** (<code>string</code>)  Shell command to execute as the first command of the task. __*Default*__: add steps using `task.exec(command)` or `task.spawn(subtask)`\n  * **steps** (<code>Array<[TaskStep](#projen-taskstep)></code>)  List of task steps to run. __*Optional*__\n\n__Returns__:\n* <code>[Task](#projen-task)</code>\n\n#### removeTask(name)🔹 <a id=\"projen-tasks-removetask\"></a>\n\nRemoves a task from a project.\n\n```ts\nremoveTask(name: string): Task\n```\n\n* **name** (<code>string</code>)  The name of the task to remove.\n\n__Returns__:\n* <code>[Task](#projen-task)</code>\n\n#### synthesize()🔹 <a id=\"projen-tasks-synthesize\"></a>\n\nSynthesizes files to the project output directory.\n\n```ts\nsynthesize(): void\n```\n\n\n\n\n\n#### tryFind(name)🔹 <a id=\"projen-tasks-tryfind\"></a>\n\nFinds a task by name.\n\nReturns `undefined` if the task cannot be found.\n\n```ts\ntryFind(name: string): Task\n```\n\n* **name** (<code>string</code>)  The name of the task.\n\n__Returns__:\n* <code>[Task](#projen-task)</code>\n\n\n\n## class Testing 🔹 <a id=\"projen-testing\"></a>\n\nA Testing static class with a .synth helper for getting a snapshots of construct outputs. Useful for snapshot testing with Jest.\n\n\n### Methods\n\n\n#### *static* synth(project, options?)🔹 <a id=\"projen-testing-synth\"></a>\n\nProduces a simple JS object that represents the contents of the projects with field names being file paths.\n\n```ts\nstatic synth(project: Project, options?: SnapshotOptions): Map<string, any>\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  the project to produce a snapshot for.\n* **options** (<code>[SnapshotOptions](#projen-snapshotoptions)</code>)  *No description*\n  * **parseJson** (<code>boolean</code>)  Parse .json files as a JS object for improved inspection. This will fail if the contents are invalid JSON. __*Default*__: true parse .json files into an object\n\n__Returns__:\n* <code>Map<string, any></code>\n\n\n\n## class TextFile 🔹 <a id=\"projen-textfile\"></a>\n\nA text file.\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\nDefines a text file.\n\n```ts\nnew TextFile(project: Project, filePath: string, options?: TextFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  The project.\n* **filePath** (<code>string</code>)  File path.\n* **options** (<code>[TextFileOptions](#projen-textfileoptions)</code>)  Options.\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **lines** (<code>Array<string></code>)  The contents of the text file. __*Default*__: [] empty file\n\n\n### Methods\n\n\n#### addLine(line)🔹 <a id=\"projen-textfile-addline\"></a>\n\nAdds a line to the text file.\n\n```ts\naddLine(line: string): void\n```\n\n* **line** (<code>string</code>)  the line to add (can use tokens).\n\n\n\n\n#### protected synthesizeContent(_)🔹 <a id=\"projen-textfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(_: IResolver): string\n```\n\n* **_** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class TomlFile 🔹 <a id=\"projen-tomlfile\"></a>\n\nRepresents a TOML file.\n\n__Extends__: [ObjectFile](#projen-objectfile)\n\n### Initializer\n\n\n\n\n```ts\nnew TomlFile(project: Project, filePath: string, options: TomlFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[TomlFileOptions](#projen-tomlfileoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **obj** (<code>any</code>)  The object that will be serialized. __*Default*__: {} an empty object (use `file.obj` to mutate).\n  * **omitEmpty** (<code>boolean</code>)  Omits empty objects and arrays. __*Default*__: false\n\n\n### Methods\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-tomlfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class Version 🔹 <a id=\"projen-version\"></a>\n\n\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew Version(project: Project, options: VersionOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[VersionOptions](#projen-versionoptions)</code>)  *No description*\n  * **artifactsDirectory** (<code>string</code>)  The name of the directory into which `changelog.md` and `version.txt` files are emitted. \n  * **versionInputFile** (<code>string</code>)  A name of a .json file to set the `version` field in after a bump. \n  * **tagPrefix** (<code>string</code>)  The tag prefix corresponding to this version. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration for versionrc file used by standard-release. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**bumpTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**changelogFileName**🔹 | <code>string</code> | The name of the changelog file (under `artifactsDirectory`).\n**releaseTagFileName**🔹 | <code>string</code> | The name of the file that contains the release tag (under `artifactsDirectory`).\n**unbumpTask**🔹 | <code>[Task](#projen-task)</code> | <span></span>\n**versionFileName**🔹 | <code>string</code> | The name of the file that contains the version (under `artifactsDirectory`).\n*static* **STANDARD_VERSION**🔹 | <code>string</code> | <span></span>\n\n\n\n## class XmlFile 🔹 <a id=\"projen-xmlfile\"></a>\n\nRepresents an XML file.\n\nObjects passed in will be synthesized using the npm \"xml\" library.\n\n__Extends__: [ObjectFile](#projen-objectfile)\n\n### Initializer\n\n\n\n\n```ts\nnew XmlFile(project: Project, filePath: string, options?: XmlFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[XmlFileOptions](#projen-xmlfileoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **obj** (<code>any</code>)  The object that will be serialized. __*Default*__: {} an empty object (use `file.obj` to mutate).\n  * **omitEmpty** (<code>boolean</code>)  Omits empty objects and arrays. __*Default*__: false\n\n\n### Methods\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-xmlfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class YamlFile 🔹 <a id=\"projen-yamlfile\"></a>\n\nRepresents a YAML file.\n\n__Extends__: [ObjectFile](#projen-objectfile)\n\n### Initializer\n\n\n\n\n```ts\nnew YamlFile(project: Project, filePath: string, options: YamlFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[YamlFileOptions](#projen-yamlfileoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n  * **obj** (<code>any</code>)  The object that will be serialized. __*Default*__: {} an empty object (use `file.obj` to mutate).\n  * **omitEmpty** (<code>boolean</code>)  Omits empty objects and arrays. __*Default*__: false\n  * **lineWidth** (<code>number</code>)  Maximum line width (set to 0 to disable folding). __*Default*__: 0\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**lineWidth**🔹 | <code>number</code> | Maximum line width (set to 0 to disable folding).\n\n### Methods\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-yamlfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class AutoDiscover 🔹 <a id=\"projen-awscdk-autodiscover\"></a>\n\nDiscovers and creates integration tests and lambdas from code in the project's source and test trees.\n\n__Submodule__: awscdk\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AutoDiscover(project: Project, options: AutoDiscoverOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.AutoDiscoverOptions](#projen-awscdk-autodiscoveroptions)</code>)  *No description*\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **tsconfigPath** (<code>string</code>)  Path to the tsconfig file to use for integration tests. \n  * **srcdir** (<code>string</code>)  Project source tree (relative to project output directory). \n  * **lambdaOptions** (<code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code>)  Options for AWS Lambda functions. __*Optional*__\n  * **lambdaExtensionOptions** (<code>[awscdk.LambdaExtensionCommonOptions](#projen-awscdk-lambdaextensioncommonoptions)</code>)  Options for lambda extensions. __*Optional*__\n  * **testdir** (<code>string</code>)  Test source tree. \n  * **integrationTestOptions** (<code>[awscdk.IntegrationTestCommonOptions](#projen-awscdk-integrationtestcommonoptions)</code>)  Options for integration tests. __*Optional*__\n  * **edgeLambdaAutoDiscover** (<code>boolean</code>)  Auto-discover edge lambda functions. __*Default*__: true\n  * **integrationTestAutoDiscover** (<code>boolean</code>)  Auto-discover integration tests. __*Default*__: true\n  * **lambdaAutoDiscover** (<code>boolean</code>)  Auto-discover lambda functions. __*Default*__: true\n  * **lambdaExtensionAutoDiscover** (<code>boolean</code>)  Auto-discover lambda extensions. __*Default*__: true\n\n\n\n\n## class AwsCdkConstructLibrary 🔹 <a id=\"projen-awscdk-awscdkconstructlibrary\"></a>\n\nAWS CDK construct library project.\n\nA multi-language (jsii) construct library which vends constructs designed to\nuse within the AWS CDK with a friendly workflow and automatic publishing to\nthe construct catalog.\n\n__Submodule__: awscdk\n\n__Extends__: [cdk.ConstructLibrary](#projen-cdk-constructlibrary)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AwsCdkConstructLibrary(options: AwsCdkConstructLibraryOptions)\n```\n\n* **options** (<code>[awscdk.AwsCdkConstructLibraryOptions](#projen-awscdk-awscdkconstructlibraryoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **author** (<code>string</code>)  The name of the library author. \n  * **authorAddress** (<code>string</code>)  Email or URL of the library author. \n  * **repositoryUrl** (<code>string</code>)  Git repository URL. \n  * **compat** (<code>boolean</code>)  Automatically run API compatibility test against the latest version published to npm after compilation. __*Default*__: false\n  * **compatIgnore** (<code>string</code>)  Name of the ignore file for API compatibility tests. __*Default*__: \".compatignore\"\n  * **compressAssembly** (<code>boolean</code>)  Emit a compressed version of the assembly. __*Default*__: false\n  * **docgenFilePath** (<code>string</code>)  File path for generated docs. __*Default*__: \"API.md\"\n  * **dotnet** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  *No description* __*Optional*__\n  * **excludeTypescript** (<code>Array<string></code>)  Accepts a list of glob patterns. __*Optional*__\n  * **publishToGo** (<code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code>)  Publish Go bindings to a git repository. __*Default*__: no publishing\n  * **publishToMaven** (<code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code>)  Publish to maven. __*Default*__: no publishing\n  * **publishToNuget** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  Publish to NuGet. __*Default*__: no publishing\n  * **publishToPypi** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  Publish to pypi. __*Default*__: no publishing\n  * **python** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  *No description* __*Optional*__\n  * **rootdir** (<code>string</code>)  *No description* __*Default*__: \".\"\n  * **catalog** (<code>[cdk.Catalog](#projen-cdk-catalog)</code>)  Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:. __*Default*__: new version will be announced\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **edgeLambdaAutoDiscover** (<code>boolean</code>)  Automatically adds an `cloudfront.experimental.EdgeFunction` for each `.edge-lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project. __*Default*__: true\n  * **integrationTestAutoDiscover** (<code>boolean</code>)  Automatically discovers and creates integration tests for each `.integ.ts` file in under your test directory. __*Default*__: true\n  * **lambdaAutoDiscover** (<code>boolean</code>)  Automatically adds an `aws_lambda.Function` for each `.lambda.ts` handler in your source tree. If this is disabled, you either need to explicitly call `aws_lambda.Function.autoDiscover()` or define a `new aws_lambda.Function()` for each handler. __*Default*__: true\n  * **lambdaExtensionAutoDiscover** (<code>boolean</code>)  Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts` entrypoint in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project. __*Default*__: true\n  * **lambdaOptions** (<code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code>)  Common options for all AWS Lambda functions. __*Default*__: default options\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | <span></span>\n**cdkVersion**🔹 | <code>string</code> | The target CDK version for this library.\n**version**⚠️ | <code>string</code> | <span></span>\n\n### Methods\n\n\n#### addCdkDependencies(...deps)⚠️ <a id=\"projen-awscdk-awscdkconstructlibrary-addcdkdependencies\"></a>\n\nAdds dependencies to AWS CDK modules.\n\nSince this is a library project, dependencies will be added as peer dependencies.\n\n```ts\naddCdkDependencies(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n\n\n\n\n#### addCdkTestDependencies(...deps)⚠️ <a id=\"projen-awscdk-awscdkconstructlibrary-addcdktestdependencies\"></a>\n\nAdds AWS CDK modules as dev dependencies.\n\n```ts\naddCdkTestDependencies(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n\n\n\n\n\n\n## class AwsCdkDeps 🔹 <a id=\"projen-awscdk-awscdkdeps\"></a>\n\nManages dependencies on the AWS CDK.\n\n__Submodule__: awscdk\n\n__Extends__: [Component](#projen-component)\n__Implemented by__: [awscdk.AwsCdkDepsJava](#projen-awscdk-awscdkdepsjava), [awscdk.AwsCdkDepsJs](#projen-awscdk-awscdkdepsjs)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AwsCdkDeps(project: Project, options: AwsCdkDepsOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.AwsCdkDepsOptions](#projen-awscdk-awscdkdepsoptions)</code>)  *No description*\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **dependencyType** (<code>[DependencyType](#projen-dependencytype)</code>)  The type of dependency to use for runtime AWS CDK and `constructs` modules. \n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDependenciesAsDeps**⚠️ | <code>boolean</code> | Whether CDK dependencies are added as normal dependencies (and peer dependencies).\n**cdkMajorVersion**🔹 | <code>number</code> | The major version of the AWS CDK (e.g. 1, 2, ...).\n**cdkMinimumVersion**🔹 | <code>string</code> | The minimum version of the AWS CDK (e.g. `2.0.0`).\n**cdkVersion**🔹 | <code>string</code> | The dependency requirement for AWS CDK (e.g. `^2.0.0`).\n\n### Methods\n\n\n#### addV1Dependencies(...deps)🔹 <a id=\"projen-awscdk-awscdkdeps-addv1dependencies\"></a>\n\nAdds dependencies to AWS CDK modules.\n\nThe type of dependency is determined by the `dependencyType` option.\n\nThis method is not supported in CDK v2. Use `project.addPeerDeps()` or\n`project.addDeps()` as appropriate.\n\n```ts\naddV1Dependencies(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n\n\n\n\n#### addV1DevDependencies(...deps)🔹 <a id=\"projen-awscdk-awscdkdeps-addv1devdependencies\"></a>\n\nAdds AWS CDK modules as dev dependencies.\n\nThis method is not supported in CDK v2. Use `project.addPeerDeps()` or\n`project.addDeps()` as appropriate.\n\n```ts\naddV1DevDependencies(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  fully qualified names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n\n\n\n\n#### preSynthesize()🔹 <a id=\"projen-awscdk-awscdkdeps-presynthesize\"></a>\n\nCalled before synthesis.\n\n```ts\npreSynthesize(): void\n```\n\n\n\n\n\n#### protected packageNames()🔹 <a id=\"projen-awscdk-awscdkdeps-packagenames\"></a>\n\nReturn a configuration object with information about package naming in various languages.\n\n```ts\nprotected packageNames(): AwsCdkPackageNames\n```\n\n\n__Returns__:\n* <code>[awscdk.AwsCdkPackageNames](#projen-awscdk-awscdkpackagenames)</code>\n\n\n\n## class AwsCdkDepsJava 🔹 <a id=\"projen-awscdk-awscdkdepsjava\"></a>\n\nManages dependencies on the AWS CDK for Java projects.\n\n__Submodule__: awscdk\n\n__Extends__: [awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AwsCdkDepsJava(project: Project, options: AwsCdkDepsOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.AwsCdkDepsOptions](#projen-awscdk-awscdkdepsoptions)</code>)  *No description*\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **dependencyType** (<code>[DependencyType](#projen-dependencytype)</code>)  The type of dependency to use for runtime AWS CDK and `constructs` modules. \n\n\n### Methods\n\n\n#### protected packageNames()🔹 <a id=\"projen-awscdk-awscdkdepsjava-packagenames\"></a>\n\nReturn a configuration object with information about package naming in various languages.\n\n```ts\nprotected packageNames(): AwsCdkPackageNames\n```\n\n\n__Returns__:\n* <code>[awscdk.AwsCdkPackageNames](#projen-awscdk-awscdkpackagenames)</code>\n\n\n\n## class AwsCdkDepsJs 🔹 <a id=\"projen-awscdk-awscdkdepsjs\"></a>\n\nManages dependencies on the AWS CDK for Node.js projects.\n\n__Submodule__: awscdk\n\n__Extends__: [awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AwsCdkDepsJs(project: Project, options: AwsCdkDepsOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.AwsCdkDepsOptions](#projen-awscdk-awscdkdepsoptions)</code>)  *No description*\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **dependencyType** (<code>[DependencyType](#projen-dependencytype)</code>)  The type of dependency to use for runtime AWS CDK and `constructs` modules. \n\n\n### Methods\n\n\n#### protected packageNames()🔹 <a id=\"projen-awscdk-awscdkdepsjs-packagenames\"></a>\n\nReturn a configuration object with information about package naming in various languages.\n\n```ts\nprotected packageNames(): AwsCdkPackageNames\n```\n\n\n__Returns__:\n* <code>[awscdk.AwsCdkPackageNames](#projen-awscdk-awscdkpackagenames)</code>\n\n\n\n## class AwsCdkJavaApp 🔹 <a id=\"projen-awscdk-awscdkjavaapp\"></a>\n\nAWS CDK app in Java.\n\n__Submodule__: awscdk\n\n__Extends__: [java.JavaProject](#projen-java-javaproject)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AwsCdkJavaApp(options: AwsCdkJavaAppOptions)\n```\n\n* **options** (<code>[awscdk.AwsCdkJavaAppOptions](#projen-awscdk-awscdkjavaappoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **artifactId** (<code>string</code>)  The artifactId is generally the name that the project is known by. \n  * **groupId** (<code>string</code>)  This is generally unique amongst an organization or a project. \n  * **version** (<code>string</code>)  This is the last piece of the naming puzzle. \n  * **description** (<code>string</code>)  Description of a project is always good. __*Default*__: undefined\n  * **packaging** (<code>string</code>)  Project packaging format. __*Default*__: \"jar\"\n  * **url** (<code>string</code>)  The URL, like the name, is not required. __*Default*__: undefined\n  * **compileOptions** (<code>[java.MavenCompileOptions](#projen-java-mavencompileoptions)</code>)  Compile options. __*Default*__: defaults\n  * **deps** (<code>Array<string></code>)  List of runtime dependencies for this project. __*Default*__: []\n  * **distdir** (<code>string</code>)  Final artifact output directory. __*Default*__: \"dist/java\"\n  * **junit** (<code>boolean</code>)  Include junit tests. __*Default*__: true\n  * **junitOptions** (<code>[java.JunitOptions](#projen-java-junitoptions)</code>)  junit options. __*Default*__: defaults\n  * **packagingOptions** (<code>[java.MavenPackagingOptions](#projen-java-mavenpackagingoptions)</code>)  Packaging options. __*Default*__: defaults\n  * **projenrcJava** (<code>boolean</code>)  Use projenrc in java. __*Default*__: true\n  * **projenrcJavaOptions** (<code>[java.ProjenrcOptions](#projen-java-projenrcoptions)</code>)  Options related to projenrc in java. __*Default*__: default options\n  * **testDeps** (<code>Array<string></code>)  List of test dependencies for this project. __*Default*__: []\n  * **sample** (<code>boolean</code>)  Include sample code and test if the relevant directories don't exist. __*Default*__: true\n  * **sampleJavaPackage** (<code>string</code>)  The java package to use for the code sample. __*Default*__: \"org.acme\"\n  * **buildCommand** (<code>string</code>)  A command to execute before synthesis. __*Default*__: no build command\n  * **cdkout** (<code>string</code>)  cdk.out directory. __*Default*__: \"cdk.out\"\n  * **context** (<code>Map<string, any></code>)  Additional context to include in `cdk.json`. __*Default*__: no additional context\n  * **featureFlags** (<code>boolean</code>)  Include all feature flags in cdk.json. __*Default*__: true\n  * **requireApproval** (<code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code>)  To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them. __*Default*__: ApprovalLevel.BROADENING\n  * **watchExcludes** (<code>Array<string></code>)  Glob patterns to exclude from `cdk watch`. __*Default*__: []\n  * **watchIncludes** (<code>Array<string></code>)  Glob patterns to include in `cdk watch`. __*Default*__: []\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **mainClass** (<code>string</code>)  The name of the Java class with the static `main()` method. \n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**cdkConfig**🔹 | <code>[awscdk.CdkConfig](#projen-awscdk-cdkconfig)</code> | The `cdk.json` file.\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | CDK dependency management helper class.\n**cdkTasks**🔹 | <code>[awscdk.CdkTasks](#projen-awscdk-cdktasks)</code> | CDK tasks.\n**mainClass**🔹 | <code>string</code> | The full name of the main class of the java app (package.Class).\n**mainClassName**🔹 | <code>string</code> | The name of the Java class with the static `main()` method.\n**mainPackage**🔹 | <code>string</code> | The name of the Java package that includes the main class.\n\n### Methods\n\n\n#### addCdkDependency(...modules)⚠️ <a id=\"projen-awscdk-awscdkjavaapp-addcdkdependency\"></a>\n\nAdds an AWS CDK module dependencies.\n\n```ts\naddCdkDependency(...modules: string[]): void\n```\n\n* **modules** (<code>string</code>)  The list of modules to depend on (e.g. \"software.amazon.awscdk/aws-lambda\", \"software.amazon.awscdk/aws-iam\", etc).\n\n\n\n\n\n\n## class AwsCdkPythonApp 🔹 <a id=\"projen-awscdk-awscdkpythonapp\"></a>\n\nAWS CDK app in Python.\n\n__Submodule__: awscdk\n\n__Extends__: [python.PythonProject](#projen-python-pythonproject)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AwsCdkPythonApp(options: AwsCdkPythonAppOptions)\n```\n\n* **options** (<code>[awscdk.AwsCdkPythonAppOptions](#projen-awscdk-awscdkpythonappoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. \n  * **authorName** (<code>string</code>)  Author's name. \n  * **version** (<code>string</code>)  Version of the package. \n  * **classifiers** (<code>Array<string></code>)  A list of PyPI trove classifiers that describe the project. __*Optional*__\n  * **description** (<code>string</code>)  A short description of the package. __*Optional*__\n  * **homepage** (<code>string</code>)  A URL to the website of the project. __*Optional*__\n  * **license** (<code>string</code>)  License of this package as an SPDX identifier. __*Optional*__\n  * **packageName** (<code>string</code>)  Package name. __*Optional*__\n  * **poetryOptions** (<code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code>)  Additional options to set for poetry if using poetry. __*Optional*__\n  * **setupConfig** (<code>Map<string, any></code>)  Additional fields to pass in the setup() function if using setuptools. __*Optional*__\n  * **moduleName** (<code>string</code>)  Name of the python package as used in imports and filenames. \n  * **deps** (<code>Array<string></code>)  List of runtime dependencies for this project. __*Default*__: []\n  * **devDeps** (<code>Array<string></code>)  List of dev dependencies for this project. __*Default*__: []\n  * **pip** (<code>boolean</code>)  Use pip with a requirements.txt file to track project dependencies. __*Default*__: true\n  * **poetry** (<code>boolean</code>)  Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing. __*Default*__: false\n  * **projenrcJs** (<code>boolean</code>)  Use projenrc in javascript. __*Default*__: false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options related to projenrc in JavaScript. __*Default*__: default options\n  * **projenrcPython** (<code>boolean</code>)  Use projenrc in Python. __*Default*__: true\n  * **projenrcPythonOptions** (<code>[python.ProjenrcOptions](#projen-python-projenrcoptions)</code>)  Options related to projenrc in python. __*Default*__: default options\n  * **pytest** (<code>boolean</code>)  Include pytest tests. __*Default*__: true\n  * **pytestOptions** (<code>[python.PytestOptions](#projen-python-pytestoptions)</code>)  pytest options. __*Default*__: defaults\n  * **sample** (<code>boolean</code>)  Include sample code and test if the relevant directories don't exist. __*Default*__: true\n  * **setuptools** (<code>boolean</code>)  Use setuptools with a setup.py script for packaging and publishing. __*Default*__: true if the project type is library\n  * **venv** (<code>boolean</code>)  Use venv to manage a virtual environment for installing dependencies inside. __*Default*__: true\n  * **venvOptions** (<code>[python.VenvOptions](#projen-python-venvoptions)</code>)  Venv options. __*Default*__: defaults\n  * **buildCommand** (<code>string</code>)  A command to execute before synthesis. __*Default*__: no build command\n  * **cdkout** (<code>string</code>)  cdk.out directory. __*Default*__: \"cdk.out\"\n  * **context** (<code>Map<string, any></code>)  Additional context to include in `cdk.json`. __*Default*__: no additional context\n  * **featureFlags** (<code>boolean</code>)  Include all feature flags in cdk.json. __*Default*__: true\n  * **requireApproval** (<code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code>)  To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them. __*Default*__: ApprovalLevel.BROADENING\n  * **watchExcludes** (<code>Array<string></code>)  Glob patterns to exclude from `cdk watch`. __*Default*__: []\n  * **watchIncludes** (<code>Array<string></code>)  Glob patterns to include in `cdk watch`. __*Default*__: []\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **appEntrypoint** (<code>string</code>)  The CDK app's entrypoint (relative to the source directory, which is \"src\" by default). __*Default*__: \"app.py\"\n  * **testdir** (<code>string</code>)  Python sources directory. __*Default*__: \"tests\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**appEntrypoint**🔹 | <code>string</code> | The CDK app entrypoint.\n**cdkConfig**🔹 | <code>[awscdk.CdkConfig](#projen-awscdk-cdkconfig)</code> | cdk.json configuration.\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | <span></span>\n**cdkTasks**🔹 | <code>[awscdk.CdkTasks](#projen-awscdk-cdktasks)</code> | Common CDK tasks.\n**cdkVersion**🔹 | <code>string</code> | The CDK version this app is using.\n**testdir**🔹 | <code>string</code> | The directory in which the python tests reside.\n\n\n\n## class AwsCdkTypeScriptApp 🔹 <a id=\"projen-awscdk-awscdktypescriptapp\"></a>\n\nAWS CDK app in TypeScript.\n\n__Submodule__: awscdk\n\n__Extends__: [typescript.TypeScriptAppProject](#projen-typescript-typescriptappproject)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.AwsCdkTypeScriptApp(options: AwsCdkTypeScriptAppOptions)\n```\n\n* **options** (<code>[awscdk.AwsCdkTypeScriptAppOptions](#projen-awscdk-awscdktypescriptappoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **buildCommand** (<code>string</code>)  A command to execute before synthesis. __*Default*__: no build command\n  * **cdkout** (<code>string</code>)  cdk.out directory. __*Default*__: \"cdk.out\"\n  * **context** (<code>Map<string, any></code>)  Additional context to include in `cdk.json`. __*Default*__: no additional context\n  * **featureFlags** (<code>boolean</code>)  Include all feature flags in cdk.json. __*Default*__: true\n  * **requireApproval** (<code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code>)  To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them. __*Default*__: ApprovalLevel.BROADENING\n  * **watchExcludes** (<code>Array<string></code>)  Glob patterns to exclude from `cdk watch`. __*Default*__: []\n  * **watchIncludes** (<code>Array<string></code>)  Glob patterns to include in `cdk watch`. __*Default*__: []\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **appEntrypoint** (<code>string</code>)  The CDK app's entrypoint (relative to the source directory, which is \"src\" by default). __*Default*__: \"main.ts\"\n  * **edgeLambdaAutoDiscover** (<code>boolean</code>)  Automatically adds an `cloudfront.experimental.EdgeFunction` for each `.edge-lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project. __*Default*__: true\n  * **integrationTestAutoDiscover** (<code>boolean</code>)  Automatically discovers and creates integration tests for each `.integ.ts` file in under your test directory. __*Default*__: true\n  * **lambdaAutoDiscover** (<code>boolean</code>)  Automatically adds an `awscdk.LambdaFunction` for each `.lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project. __*Default*__: true\n  * **lambdaExtensionAutoDiscover** (<code>boolean</code>)  Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts` entrypoint in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project. __*Default*__: true\n  * **lambdaOptions** (<code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code>)  Common options for all AWS Lambda functions. __*Default*__: default options\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**appEntrypoint**🔹 | <code>string</code> | The CDK app entrypoint.\n**cdkConfig**🔹 | <code>[awscdk.CdkConfig](#projen-awscdk-cdkconfig)</code> | cdk.json configuration.\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | <span></span>\n**cdkTasks**🔹 | <code>[awscdk.CdkTasks](#projen-awscdk-cdktasks)</code> | Common CDK tasks.\n**cdkVersion**🔹 | <code>string</code> | The CDK version this app is using.\n\n### Methods\n\n\n#### addCdkDependency(...modules)🔹 <a id=\"projen-awscdk-awscdktypescriptapp-addcdkdependency\"></a>\n\nAdds an AWS CDK module dependencies.\n\n```ts\naddCdkDependency(...modules: string[]): void\n```\n\n* **modules** (<code>string</code>)  The list of modules to depend on.\n\n\n\n\n\n\n## class CdkConfig 🔹 <a id=\"projen-awscdk-cdkconfig\"></a>\n\nRepresents cdk.json file.\n\n__Submodule__: awscdk\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.CdkConfig(project: Project, options: CdkConfigOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.CdkConfigOptions](#projen-awscdk-cdkconfigoptions)</code>)  *No description*\n  * **buildCommand** (<code>string</code>)  A command to execute before synthesis. __*Default*__: no build command\n  * **cdkout** (<code>string</code>)  cdk.out directory. __*Default*__: \"cdk.out\"\n  * **context** (<code>Map<string, any></code>)  Additional context to include in `cdk.json`. __*Default*__: no additional context\n  * **featureFlags** (<code>boolean</code>)  Include all feature flags in cdk.json. __*Default*__: true\n  * **requireApproval** (<code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code>)  To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them. __*Default*__: ApprovalLevel.BROADENING\n  * **watchExcludes** (<code>Array<string></code>)  Glob patterns to exclude from `cdk watch`. __*Default*__: []\n  * **watchIncludes** (<code>Array<string></code>)  Glob patterns to include in `cdk watch`. __*Default*__: []\n  * **app** (<code>string</code>)  The command line to execute in order to synthesize the CDK application (language specific). \n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**cdkout**🔹 | <code>string</code> | Name of the cdk.out directory.\n**exclude**🔹 | <code>Array<string></code> | List of glob patterns to be excluded by CDK.\n**include**🔹 | <code>Array<string></code> | List of glob patterns to be included by CDK.\n**json**🔹 | <code>[JsonFile](#projen-jsonfile)</code> | Represents the JSON file.\n\n### Methods\n\n\n#### addExcludes(...patterns)🔹 <a id=\"projen-awscdk-cdkconfig-addexcludes\"></a>\n\nAdd excludes to `cdk.json`.\n\n```ts\naddExcludes(...patterns: string[]): void\n```\n\n* **patterns** (<code>string</code>)  The excludes to add.\n\n\n\n\n#### addIncludes(...patterns)🔹 <a id=\"projen-awscdk-cdkconfig-addincludes\"></a>\n\nAdd includes to `cdk.json`.\n\n```ts\naddIncludes(...patterns: string[]): void\n```\n\n* **patterns** (<code>string</code>)  The includes to add.\n\n\n\n\n\n\n## class CdkTasks 🔹 <a id=\"projen-awscdk-cdktasks\"></a>\n\nAdds standard AWS CDK tasks to your project.\n\n__Submodule__: awscdk\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.CdkTasks(project: Project)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**deploy**🔹 | <code>[Task](#projen-task)</code> | Deploys your app.\n**destroy**🔹 | <code>[Task](#projen-task)</code> | Destroys all the stacks.\n**diff**🔹 | <code>[Task](#projen-task)</code> | Diff against production.\n**synth**🔹 | <code>[Task](#projen-task)</code> | Synthesizes your app.\n**synthSilent**🔹 | <code>[Task](#projen-task)</code> | Synthesizes your app and suppresses stdout.\n**watch**🔹 | <code>[Task](#projen-task)</code> | Watch task.\n\n\n\n## class ConstructLibraryAws ⚠️ <a id=\"projen-awscdk-constructlibraryaws\"></a>\n\n\n\n__Submodule__: awscdk\n\n__Extends__: [awscdk.AwsCdkConstructLibrary](#projen-awscdk-awscdkconstructlibrary)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.ConstructLibraryAws(options: AwsCdkConstructLibraryOptions)\n```\n\n* **options** (<code>[awscdk.AwsCdkConstructLibraryOptions](#projen-awscdk-awscdkconstructlibraryoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **author** (<code>string</code>)  The name of the library author. \n  * **authorAddress** (<code>string</code>)  Email or URL of the library author. \n  * **repositoryUrl** (<code>string</code>)  Git repository URL. \n  * **compat** (<code>boolean</code>)  Automatically run API compatibility test against the latest version published to npm after compilation. __*Default*__: false\n  * **compatIgnore** (<code>string</code>)  Name of the ignore file for API compatibility tests. __*Default*__: \".compatignore\"\n  * **compressAssembly** (<code>boolean</code>)  Emit a compressed version of the assembly. __*Default*__: false\n  * **docgenFilePath** (<code>string</code>)  File path for generated docs. __*Default*__: \"API.md\"\n  * **dotnet** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  *No description* __*Optional*__\n  * **excludeTypescript** (<code>Array<string></code>)  Accepts a list of glob patterns. __*Optional*__\n  * **publishToGo** (<code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code>)  Publish Go bindings to a git repository. __*Default*__: no publishing\n  * **publishToMaven** (<code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code>)  Publish to maven. __*Default*__: no publishing\n  * **publishToNuget** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  Publish to NuGet. __*Default*__: no publishing\n  * **publishToPypi** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  Publish to pypi. __*Default*__: no publishing\n  * **python** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  *No description* __*Optional*__\n  * **rootdir** (<code>string</code>)  *No description* __*Default*__: \".\"\n  * **catalog** (<code>[cdk.Catalog](#projen-cdk-catalog)</code>)  Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:. __*Default*__: new version will be announced\n  * **cdkVersion** (<code>string</code>)  Minimum version of the AWS CDK to depend on. \n  * **cdkAssert** (<code>boolean</code>)  Warning: NodeJS only. __*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n  * **cdkAssertions** (<code>boolean</code>)  Install the assertions library? __*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n  * **cdkDependencies** (<code>Array<string></code>)  Which AWS CDKv1 modules this project requires. __*Optional*__\n  * **cdkDependenciesAsDeps** (<code>boolean</code>)  If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`). __*Default*__: true\n  * **cdkTestDependencies** (<code>Array<string></code>)  AWS CDK modules required for testing. __*Optional*__\n  * **cdkVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK. __*Optional*__\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n  * **edgeLambdaAutoDiscover** (<code>boolean</code>)  Automatically adds an `cloudfront.experimental.EdgeFunction` for each `.edge-lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project. __*Default*__: true\n  * **integrationTestAutoDiscover** (<code>boolean</code>)  Automatically discovers and creates integration tests for each `.integ.ts` file in under your test directory. __*Default*__: true\n  * **lambdaAutoDiscover** (<code>boolean</code>)  Automatically adds an `aws_lambda.Function` for each `.lambda.ts` handler in your source tree. If this is disabled, you either need to explicitly call `aws_lambda.Function.autoDiscover()` or define a `new aws_lambda.Function()` for each handler. __*Default*__: true\n  * **lambdaExtensionAutoDiscover** (<code>boolean</code>)  Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts` entrypoint in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project. __*Default*__: true\n  * **lambdaOptions** (<code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code>)  Common options for all AWS Lambda functions. __*Default*__: default options\n\n\n\n\n## class EdgeLambdaAutoDiscover 🔹 <a id=\"projen-awscdk-edgelambdaautodiscover\"></a>\n\nCreates edge lambdas from entry points discovered in the project's source tree.\n\n__Submodule__: awscdk\n\n__Extends__: [cdk.AutoDiscoverBase](#projen-cdk-autodiscoverbase)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.EdgeLambdaAutoDiscover(project: Project, options: EdgeLambdaAutoDiscoverOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.EdgeLambdaAutoDiscoverOptions](#projen-awscdk-edgelambdaautodiscoveroptions)</code>)  *No description*\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **tsconfigPath** (<code>string</code>)  Path to the tsconfig file to use for integration tests. \n  * **srcdir** (<code>string</code>)  Project source tree (relative to project output directory). \n  * **lambdaOptions** (<code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code>)  Options for AWS Lambda functions. __*Optional*__\n\n\n\n\n## class IntegrationTest 🔹 <a id=\"projen-awscdk-integrationtest\"></a>\n\nCloud integration tests.\n\n__Submodule__: awscdk\n\n__Extends__: [cdk.IntegrationTestBase](#projen-cdk-integrationtestbase)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.IntegrationTest(project: Project, options: IntegrationTestOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.IntegrationTestOptions](#projen-awscdk-integrationtestoptions)</code>)  *No description*\n  * **destroyAfterDeploy** (<code>boolean</code>)  Destroy the test app after a successful deployment. __*Default*__: true\n  * **pathMetadata** (<code>boolean</code>)  Enables path metadata, adding `aws:cdk:path`, with the defining construct's path, to the CloudFormation metadata for each synthesized resource. __*Default*__: false\n  * **entrypoint** (<code>string</code>)  A path from the project root directory to a TypeScript file which contains the integration test app. \n  * **tsconfigPath** (<code>string</code>)  The path of the tsconfig.json file to use when running integration test cdk apps. \n  * **name** (<code>string</code>)  Name of the integration test. __*Default*__: Derived from the entrypoint filename.\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **stacks** (<code>Array<string></code>)  A list of stacks within the integration test to deploy/destroy. __*Default*__: [\"**\"]\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**destroyTask**🔹 | <code>[Task](#projen-task)</code> | Destroy the integration test resources.\n**watchTask**🔹 | <code>[Task](#projen-task)</code> | The watch task.\n\n\n\n## class IntegrationTestAutoDiscover 🔹 <a id=\"projen-awscdk-integrationtestautodiscover\"></a>\n\nCreates integration tests from entry points discovered in the test tree.\n\n__Submodule__: awscdk\n\n__Extends__: [cdk.IntegrationTestAutoDiscoverBase](#projen-cdk-integrationtestautodiscoverbase)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.IntegrationTestAutoDiscover(project: Project, options: IntegrationTestAutoDiscoverOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.IntegrationTestAutoDiscoverOptions](#projen-awscdk-integrationtestautodiscoveroptions)</code>)  *No description*\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **tsconfigPath** (<code>string</code>)  Path to the tsconfig file to use for integration tests. \n  * **testdir** (<code>string</code>)  Test source tree. \n  * **integrationTestOptions** (<code>[awscdk.IntegrationTestCommonOptions](#projen-awscdk-integrationtestcommonoptions)</code>)  Options for integration tests. __*Optional*__\n\n\n\n\n## class LambdaAutoDiscover 🔹 <a id=\"projen-awscdk-lambdaautodiscover\"></a>\n\nCreates lambdas from entry points discovered in the project's source tree.\n\n__Submodule__: awscdk\n\n__Extends__: [cdk.AutoDiscoverBase](#projen-cdk-autodiscoverbase)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.LambdaAutoDiscover(project: Project, options: LambdaAutoDiscoverOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.LambdaAutoDiscoverOptions](#projen-awscdk-lambdaautodiscoveroptions)</code>)  *No description*\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **tsconfigPath** (<code>string</code>)  Path to the tsconfig file to use for integration tests. \n  * **srcdir** (<code>string</code>)  Project source tree (relative to project output directory). \n  * **lambdaOptions** (<code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code>)  Options for AWS Lambda functions. __*Optional*__\n\n\n\n\n## class LambdaExtension 🔹 <a id=\"projen-awscdk-lambdaextension\"></a>\n\nCreate a Lambda Extension.\n\n__Submodule__: awscdk\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.LambdaExtension(project: Project, options: LambdaExtensionOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.LambdaExtensionOptions](#projen-awscdk-lambdaextensionoptions)</code>)  *No description*\n  * **bundlingOptions** (<code>[javascript.BundlingOptions](#projen-javascript-bundlingoptions)</code>)  Bundling options for this AWS Lambda extension. __*Default*__: defaults\n  * **compatibleRuntimes** (<code>Array<[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)></code>)  The extension's compatible runtimes. __*Optional*__\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **entrypoint** (<code>string</code>)  A path from the project root directory to a TypeScript file which contains the AWS Lambda extension entrypoint (stand-alone script). \n  * **constructFile** (<code>string</code>)  The name of the generated TypeScript source file. __*Default*__: The name of the entrypoint file, with the `-layer-version.ts` suffix instead of `.lambda-extension.ts`.\n  * **constructName** (<code>string</code>)  The name of the generated `lambda.LayerVersion` subclass. __*Default*__: A pascal cased version of the name of the entrypoint file, with the extension `LayerVersion` (e.g. `AppConfigLayerVersion`).\n  * **name** (<code>string</code>)  Name of the extension. __*Default*__: Derived from the entrypoint filename.\n\n\n\n\n## class LambdaExtensionAutoDiscover 🔹 <a id=\"projen-awscdk-lambdaextensionautodiscover\"></a>\n\nCreates Lambda Extensions from entrypoints discovered in the project's source tree.\n\n__Submodule__: awscdk\n\n__Extends__: [cdk.AutoDiscoverBase](#projen-cdk-autodiscoverbase)\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.LambdaExtensionAutoDiscover(project: Project, options: LambdaExtensionAutoDiscoverOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[awscdk.LambdaExtensionAutoDiscoverOptions](#projen-awscdk-lambdaextensionautodiscoveroptions)</code>)  *No description*\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **tsconfigPath** (<code>string</code>)  Path to the tsconfig file to use for integration tests. \n  * **srcdir** (<code>string</code>)  Project source tree (relative to project output directory). \n  * **lambdaExtensionOptions** (<code>[awscdk.LambdaExtensionCommonOptions](#projen-awscdk-lambdaextensioncommonoptions)</code>)  Options for lambda extensions. __*Optional*__\n\n\n\n\n## class LambdaFunction 🔹 <a id=\"projen-awscdk-lambdafunction\"></a>\n\nGenerates a pre-bundled AWS Lambda function construct from handler code.\n\nTo use this, create an AWS Lambda handler file under your source tree with\nthe `.lambda.ts` extension and add a `LambdaFunction` component to your\ntypescript project pointing to this entrypoint.\n\nThis will add a task to your \"compile\" step which will use `esbuild` to\nbundle the handler code into the build directory. It will also generate a\nfile `src/foo-function.ts` with a custom AWS construct called `FooFunction`\nwhich extends `@aws-cdk/aws-lambda.Function` which is bound to the bundled\nhandle through an asset.\n\n__Submodule__: awscdk\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\nDefines a pre-bundled AWS Lambda function construct from handler code.\n\n```ts\nnew awscdk.LambdaFunction(project: Project, options: LambdaFunctionOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  The project to use.\n* **options** (<code>[awscdk.LambdaFunctionOptions](#projen-awscdk-lambdafunctionoptions)</code>)  Options.\n  * **awsSdkConnectionReuse** (<code>boolean</code>)  Whether to automatically reuse TCP connections when working with the AWS SDK for JavaScript. __*Default*__: true\n  * **bundlingOptions** (<code>[javascript.BundlingOptions](#projen-javascript-bundlingoptions)</code>)  Bundling options for this AWS Lambda function. __*Default*__: defaults\n  * **edgeLambda** (<code>boolean</code>)  Whether to create a `cloudfront.experimental.EdgeFunction` instead of a `lambda.Function`. __*Default*__: false\n  * **runtime** (<code>[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)</code>)  The node.js version to target. __*Default*__: Runtime.NODEJS_14_X\n  * **cdkDeps** (<code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code>)  AWS CDK dependency manager. \n  * **entrypoint** (<code>string</code>)  A path from the project root directory to a TypeScript file which contains the AWS Lambda handler entrypoint (exports a `handler` function). \n  * **constructFile** (<code>string</code>)  The name of the generated TypeScript source file. __*Default*__: The name of the entrypoint file, with the `-function.ts` suffix instead of `.lambda.ts`.\n  * **constructName** (<code>string</code>)  The name of the generated `lambda.Function` subclass. __*Default*__: A pascal cased version of the name of the entrypoint file, with the extension `Function` (e.g. `ResizeImageFunction`).\n\n\n\n\n## class LambdaRuntime 🔹 <a id=\"projen-awscdk-lambdaruntime\"></a>\n\nThe runtime for the AWS Lambda function.\n\n__Submodule__: awscdk\n\n\n### Initializer\n\n\n\n\n```ts\nnew awscdk.LambdaRuntime(functionRuntime: string, esbuildTarget: string)\n```\n\n* **functionRuntime** (<code>string</code>)  The Node.js runtime to use.\n* **esbuildTarget** (<code>string</code>)  The esbuild setting to use.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**esbuildPlatform**🔹 | <code>string</code> | <span></span>\n**esbuildTarget**🔹 | <code>string</code> | The esbuild setting to use.\n**functionRuntime**🔹 | <code>string</code> | The Node.js runtime to use.\n*static* **NODEJS_10_X**🔹 | <code>[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)</code> | Node.js 10.x.\n*static* **NODEJS_12_X**🔹 | <code>[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)</code> | Node.js 12.x.\n*static* **NODEJS_14_X**🔹 | <code>[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)</code> | Node.js 14.x.\n*static* **NODEJS_16_X**🔹 | <code>[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)</code> | Node.js 16.x.\n\n\n\n## class BuildWorkflow 🔹 <a id=\"projen-build-buildworkflow\"></a>\n\n\n\n__Submodule__: build\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew build.BuildWorkflow(project: Project, options: BuildWorkflowOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[build.BuildWorkflowOptions](#projen-build-buildworkflowoptions)</code>)  *No description*\n  * **artifactsDirectory** (<code>string</code>)  A name of a directory that includes build artifacts. \n  * **buildTask** (<code>[Task](#projen-task)</code>)  The task to execute in order to build the project. \n  * **containerImage** (<code>string</code>)  The container image to use for builds. __*Default*__: the default workflow container\n  * **env** (<code>Map<string, string></code>)  Build environment variables. __*Default*__: {}\n  * **gitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  Git identity to use for the workflow. __*Default*__: default identity\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build. __*Default*__: []\n  * **preBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute before the build. __*Default*__: []\n  * **runsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **workflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**buildJobIds**🔹 | <code>Array<string></code> | Returns a list of job IDs that are part of the build.\n\n### Methods\n\n\n#### addPostBuildJob(id, job)🔹 <a id=\"projen-build-buildworkflow-addpostbuildjob\"></a>\n\nAdds another job to the build workflow which is executed after the build job succeeded.\n\nJobs are executed _only_ if the build did NOT self mutate. If the build\nself-mutate, the branch will either be updated or the build will fail (in\nforks), so there is no point in executing the post-build job.\n\n```ts\naddPostBuildJob(id: string, job: Job): void\n```\n\n* **id** (<code>string</code>)  The id of the new job.\n* **job** (<code>[github.workflows.Job](#projen-github-workflows-job)</code>)  The job specification.\n  * **permissions** (<code>[github.workflows.JobPermissions](#projen-github-workflows-jobpermissions)</code>)  You can modify the default permissions granted to the GITHUB_TOKEN, adding or removing access as required, so that you only allow the minimum required access. \n  * **concurrency** (<code>any</code>)  Concurrency ensures that only a single job or workflow using the same concurrency group will run at a time. __*Optional*__\n  * **if** (<code>string</code>)  You can use the if conditional to prevent a job from running unless a condition is met. __*Optional*__\n  * **name** (<code>string</code>)  The name of the job displayed on GitHub. __*Optional*__\n  * **needs** (<code>Array<string></code>)  Identifies any jobs that must complete successfully before this job will run. __*Optional*__\n  * **runsOn** (<code>Array<string></code>)  The type of machine to run the job on. \n  * **steps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A job contains a sequence of tasks called steps. \n  * **container** (<code>[github.workflows.ContainerOptions](#projen-github-workflows-containeroptions)</code>)  A container to run any steps in a job that don't already specify a container. __*Optional*__\n  * **continueOnError** (<code>boolean</code>)  Prevents a workflow run from failing when a job fails. __*Optional*__\n  * **defaults** (<code>[github.workflows.JobDefaults](#projen-github-workflows-jobdefaults)</code>)  A map of default settings that will apply to all steps in the job. __*Optional*__\n  * **env** (<code>Map<string, string></code>)  A map of environment variables that are available to all steps in the job. __*Optional*__\n  * **environment** (<code>any</code>)  The environment that the job references. __*Optional*__\n  * **outputs** (<code>Map<string, [github.workflows.JobStepOutput](#projen-github-workflows-jobstepoutput)></code>)  A map of outputs for a job. __*Optional*__\n  * **services** (<code>Map<string, [github.workflows.ContainerOptions](#projen-github-workflows-containeroptions)></code>)  Used to host service containers for a job in a workflow. __*Optional*__\n  * **strategy** (<code>[github.workflows.JobStrategy](#projen-github-workflows-jobstrategy)</code>)  A strategy creates a build matrix for your jobs. __*Optional*__\n  * **timeoutMinutes** (<code>number</code>)  The maximum number of minutes to let a job run before GitHub automatically cancels it. __*Default*__: 360\n  * **tools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Tools required for this job. __*Optional*__\n\n\n\n\n#### addPostBuildJobCommands(id, commands, options?)🔹 <a id=\"projen-build-buildworkflow-addpostbuildjobcommands\"></a>\n\nRun a sequence of commands as a job within the build workflow which is executed after the build job succeeded.\n\nJobs are executed _only_ if the build did NOT self mutate. If the build\nself-mutate, the branch will either be updated or the build will fail (in\nforks), so there is no point in executing the post-build job.\n\n```ts\naddPostBuildJobCommands(id: string, commands: Array<string>, options?: AddPostBuildJobCommandsOptions): void\n```\n\n* **id** (<code>string</code>)  *No description*\n* **commands** (<code>Array<string></code>)  *No description*\n* **options** (<code>[build.AddPostBuildJobCommandsOptions](#projen-build-addpostbuildjobcommandsoptions)</code>)  Specify tools and other options.\n  * **checkoutRepo** (<code>boolean</code>)  Check out the repository at the pull request branch before commands are run. __*Default*__: false\n  * **installDeps** (<code>boolean</code>)  Install project dependencies before running commands. `checkoutRepo` must also be set to true. __*Default*__: false\n  * **runsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **tools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Tools that should be installed before the commands are run. __*Optional*__\n\n\n\n\n#### addPostBuildJobTask(task, options?)🔹 <a id=\"projen-build-buildworkflow-addpostbuildjobtask\"></a>\n\nRun a task as a job within the build workflow which is executed after the build job succeeded.\n\nThe job will have access to build artifacts and will install project\ndependencies in order to be able to run any commands used in the tasks.\n\nJobs are executed _only_ if the build did NOT self mutate. If the build\nself-mutate, the branch will either be updated or the build will fail (in\nforks), so there is no point in executing the post-build job.\n\n```ts\naddPostBuildJobTask(task: Task, options?: AddPostBuildJobTaskOptions): void\n```\n\n* **task** (<code>[Task](#projen-task)</code>)  *No description*\n* **options** (<code>[build.AddPostBuildJobTaskOptions](#projen-build-addpostbuildjobtaskoptions)</code>)  Specify tools and other options.\n  * **runsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **tools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Tools that should be installed before the task is run. __*Optional*__\n\n\n\n\n#### addPostBuildSteps(...steps)🔹 <a id=\"projen-build-buildworkflow-addpostbuildsteps\"></a>\n\nAdds steps that are executed after the build.\n\n```ts\naddPostBuildSteps(...steps: JobStep[]): void\n```\n\n* **steps** (<code>[github.workflows.JobStep](#projen-github-workflows-jobstep)</code>)  The job steps.\n  * **env** (<code>Map<string, string></code>)  Sets environment variables for steps to use in the runner environment. __*Optional*__\n  * **id** (<code>string</code>)  A unique identifier for the step. __*Optional*__\n  * **if** (<code>string</code>)  You can use the if conditional to prevent a job from running unless a condition is met. __*Optional*__\n  * **name** (<code>string</code>)  A name for your step to display on GitHub. __*Optional*__\n  * **run** (<code>string</code>)  Runs command-line programs using the operating system's shell. __*Optional*__\n  * **uses** (<code>string</code>)  Selects an action to run as part of a step in your job. __*Optional*__\n  * **with** (<code>Map<string, any></code>)  A map of the input parameters defined by the action. __*Optional*__\n  * **continueOnError** (<code>boolean</code>)  Prevents a job from failing when a step fails. __*Optional*__\n  * **timeoutMinutes** (<code>number</code>)  The maximum number of minutes to run the step before killing the process. __*Optional*__\n\n\n\n\n\n\n## class AutoDiscoverBase 🔹 <a id=\"projen-cdk-autodiscoverbase\"></a>\n\nBase class for auto-discovering and creating project subcomponents.\n\n__Submodule__: cdk\n\n__Extends__: [Component](#projen-component)\n__Implemented by__: [awscdk.EdgeLambdaAutoDiscover](#projen-awscdk-edgelambdaautodiscover), [awscdk.IntegrationTestAutoDiscover](#projen-awscdk-integrationtestautodiscover), [awscdk.LambdaAutoDiscover](#projen-awscdk-lambdaautodiscover), [awscdk.LambdaExtensionAutoDiscover](#projen-awscdk-lambdaextensionautodiscover), [cdk.IntegrationTestAutoDiscoverBase](#projen-cdk-integrationtestautodiscoverbase), [cdk8s.IntegrationTestAutoDiscover](#projen-cdk8s-integrationtestautodiscover)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk.AutoDiscoverBase(project: Project, options: AutoDiscoverBaseOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk.AutoDiscoverBaseOptions](#projen-cdk-autodiscoverbaseoptions)</code>)  *No description*\n  * **extension** (<code>string</code>)  Locate files with the given extension. \n  * **projectdir** (<code>string</code>)  Locate entrypoints in the given project directory. \n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**entrypoints**🔹 | <code>Array<string></code> | Auto-discovered entry points with paths relative to the project directory.\n\n\n\n## class ConstructLibrary 🔹 <a id=\"projen-cdk-constructlibrary\"></a>\n\nA multi-language library for CDK constructs.\n\n__Submodule__: cdk\n\n__Extends__: [cdk.JsiiProject](#projen-cdk-jsiiproject)\n__Implemented by__: [awscdk.AwsCdkConstructLibrary](#projen-awscdk-awscdkconstructlibrary), [awscdk.ConstructLibraryAws](#projen-awscdk-constructlibraryaws), [cdk8s.ConstructLibraryCdk8s](#projen-cdk8s-constructlibrarycdk8s), [cdktf.ConstructLibraryCdktf](#projen-cdktf-constructlibrarycdktf)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk.ConstructLibrary(options: ConstructLibraryOptions)\n```\n\n* **options** (<code>[cdk.ConstructLibraryOptions](#projen-cdk-constructlibraryoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **author** (<code>string</code>)  The name of the library author. \n  * **authorAddress** (<code>string</code>)  Email or URL of the library author. \n  * **repositoryUrl** (<code>string</code>)  Git repository URL. \n  * **compat** (<code>boolean</code>)  Automatically run API compatibility test against the latest version published to npm after compilation. __*Default*__: false\n  * **compatIgnore** (<code>string</code>)  Name of the ignore file for API compatibility tests. __*Default*__: \".compatignore\"\n  * **compressAssembly** (<code>boolean</code>)  Emit a compressed version of the assembly. __*Default*__: false\n  * **docgenFilePath** (<code>string</code>)  File path for generated docs. __*Default*__: \"API.md\"\n  * **dotnet** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  *No description* __*Optional*__\n  * **excludeTypescript** (<code>Array<string></code>)  Accepts a list of glob patterns. __*Optional*__\n  * **publishToGo** (<code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code>)  Publish Go bindings to a git repository. __*Default*__: no publishing\n  * **publishToMaven** (<code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code>)  Publish to maven. __*Default*__: no publishing\n  * **publishToNuget** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  Publish to NuGet. __*Default*__: no publishing\n  * **publishToPypi** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  Publish to pypi. __*Default*__: no publishing\n  * **python** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  *No description* __*Optional*__\n  * **rootdir** (<code>string</code>)  *No description* __*Default*__: \".\"\n  * **catalog** (<code>[cdk.Catalog](#projen-cdk-catalog)</code>)  Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:. __*Default*__: new version will be announced\n\n\n\n\n## class IntegrationTestAutoDiscoverBase 🔹 <a id=\"projen-cdk-integrationtestautodiscoverbase\"></a>\n\nBase class for locating integration tests in the project's test tree.\n\n__Submodule__: cdk\n\n__Extends__: [cdk.AutoDiscoverBase](#projen-cdk-autodiscoverbase)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk.IntegrationTestAutoDiscoverBase(project: Project, options: IntegrationTestAutoDiscoverBaseOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk.IntegrationTestAutoDiscoverBaseOptions](#projen-cdk-integrationtestautodiscoverbaseoptions)</code>)  *No description*\n  * **testdir** (<code>string</code>)  Test source tree. \n\n\n\n\n## class IntegrationTestBase 🔹 <a id=\"projen-cdk-integrationtestbase\"></a>\n\n\n\n__Submodule__: cdk\n\n__Extends__: [Component](#projen-component)\n__Implemented by__: [awscdk.IntegrationTest](#projen-awscdk-integrationtest), [cdk8s.IntegrationTest](#projen-cdk8s-integrationtest)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk.IntegrationTestBase(project: Project, options: IntegrationTestBaseOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk.IntegrationTestBaseOptions](#projen-cdk-integrationtestbaseoptions)</code>)  *No description*\n  * **entrypoint** (<code>string</code>)  A path from the project root directory to a TypeScript file which contains the integration test app. \n  * **tsconfigPath** (<code>string</code>)  The path of the tsconfig.json file to use when running integration test cdk apps. \n  * **name** (<code>string</code>)  Name of the integration test. __*Default*__: Derived from the entrypoint filename.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**assertTask**🔹 | <code>[Task](#projen-task)</code> | Synthesizes the integration test and compares against a local copy (runs during build).\n**deployTask**🔹 | <code>[Task](#projen-task)</code> | Deploy the integration test and update the snapshot upon success.\n**name**🔹 | <code>string</code> | Integration test name.\n**snapshotDir**🔹 | <code>string</code> | Snapshot output directory.\n**snapshotTask**🔹 | <code>[Task](#projen-task)</code> | Just update snapshot (without deployment).\n**tmpDir**🔹 | <code>string</code> | Temporary directory for each integration test.\n\n\n\n## class JsiiDocgen 🔹 <a id=\"projen-cdk-jsiidocgen\"></a>\n\nCreates a markdown file based on the jsii manifest: - Adds a `docgen` script to package.json - Runs `jsii-docgen` after compilation - Enforces that markdown file is checked in.\n\n__Submodule__: cdk\n\n\n### Initializer\n\n\n\n\n```ts\nnew cdk.JsiiDocgen(project: JsiiProject, options?: JsiiDocgenOptions)\n```\n\n* **project** (<code>[cdk.JsiiProject](#projen-cdk-jsiiproject)</code>)  *No description*\n* **options** (<code>[cdk.JsiiDocgenOptions](#projen-cdk-jsiidocgenoptions)</code>)  *No description*\n  * **filePath** (<code>string</code>)  File path for generated docs. __*Default*__: \"API.md\"\n\n\n\n\n## class JsiiProject 🔹 <a id=\"projen-cdk-jsiiproject\"></a>\n\nMulti-language jsii library project.\n\n__Submodule__: cdk\n\n__Extends__: [typescript.TypeScriptProject](#projen-typescript-typescriptproject)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk.JsiiProject(options: JsiiProjectOptions)\n```\n\n* **options** (<code>[cdk.JsiiProjectOptions](#projen-cdk-jsiiprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **author** (<code>string</code>)  The name of the library author. \n  * **authorAddress** (<code>string</code>)  Email or URL of the library author. \n  * **repositoryUrl** (<code>string</code>)  Git repository URL. \n  * **compat** (<code>boolean</code>)  Automatically run API compatibility test against the latest version published to npm after compilation. __*Default*__: false\n  * **compatIgnore** (<code>string</code>)  Name of the ignore file for API compatibility tests. __*Default*__: \".compatignore\"\n  * **compressAssembly** (<code>boolean</code>)  Emit a compressed version of the assembly. __*Default*__: false\n  * **docgenFilePath** (<code>string</code>)  File path for generated docs. __*Default*__: \"API.md\"\n  * **dotnet** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  *No description* __*Optional*__\n  * **excludeTypescript** (<code>Array<string></code>)  Accepts a list of glob patterns. __*Optional*__\n  * **publishToGo** (<code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code>)  Publish Go bindings to a git repository. __*Default*__: no publishing\n  * **publishToMaven** (<code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code>)  Publish to maven. __*Default*__: no publishing\n  * **publishToNuget** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  Publish to NuGet. __*Default*__: no publishing\n  * **publishToPypi** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  Publish to pypi. __*Default*__: no publishing\n  * **python** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  *No description* __*Optional*__\n  * **rootdir** (<code>string</code>)  *No description* __*Default*__: \".\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**eslint**?🔹 | <code>[javascript.Eslint](#projen-javascript-eslint)</code> | __*Optional*__\n\n\n\n## class AutoDiscover 🔹 <a id=\"projen-cdk8s-autodiscover\"></a>\n\nAutomatically discovers and creates `IntegrationTest`s from entry points found in the test tree.\n\n__Submodule__: cdk8s\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.AutoDiscover(project: Project, options: AutoDiscoverOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk8s.AutoDiscoverOptions](#projen-cdk8s-autodiscoveroptions)</code>)  *No description*\n  * **testdir** (<code>string</code>)  Test source tree. \n  * **tsconfigPath** (<code>string</code>)  Path to the tsconfig file to use for integration tests. \n  * **integrationTestAutoDiscover** (<code>boolean</code>)  Automatically discover integration tests. __*Default*__: true\n\n\n\n\n## class Cdk8sDeps 🔹 <a id=\"projen-cdk8s-cdk8sdeps\"></a>\n\nManages dependencies on the CDK8s.\n\n__Submodule__: cdk8s\n\n__Extends__: [Component](#projen-component)\n__Implemented by__: [cdk8s.Cdk8sDepsPy](#projen-cdk8s-cdk8sdepspy)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.Cdk8sDeps(project: Project, options: Cdk8sDepsOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk8s.Cdk8sDepsOptions](#projen-cdk8s-cdk8sdepsoptions)</code>)  *No description*\n  * **cdk8sVersion** (<code>string</code>)  Minumum version of the cdk8s to depend on. \n  * **cdk8sCliVersion** (<code>string</code>)  Minumum version of the cdk8s-cli to depend on. __*Default*__: \"2.0.28\"\n  * **cdk8sCliVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-cli. __*Default*__: false\n  * **cdk8sPlus** (<code>boolean</code>)  Include cdk8s-plus. __*Default*__: true\n  * **cdk8sPlusVersion** (<code>string</code>)  Minumum version of the cdk8s-plus-XX to depend on. __*Default*__: \"2.0.0-rc.26\"\n  * **cdk8sPlusVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-plus-17. __*Default*__: false\n  * **cdk8sVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s. __*Default*__: false\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: \"10.1.42\"\n  * **constructsVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for constructs. __*Default*__: false\n  * **k8sMinorVersion** (<code>number</code>)  The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0. __*Default*__: 22\n  * **cdk8sCliDependency** (<code>boolean</code>)  Add cdk8s-cli only to Node projects. \n  * **dependencyType** (<code>[DependencyType](#projen-dependencytype)</code>)  The type of dependency to use for runtime CDK8s and `constructs` modules. \n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**cdk8sMajorVersion**🔹 | <code>number</code> | The major version of the CDK8s (e.g. 1, 2, ...).\n**cdk8sMinimumVersion**🔹 | <code>string</code> | The minimum version of the CDK8s (e.g. `2.0.0`).\n**cdk8sVersion**🔹 | <code>string</code> | The dependency requirement for CDK8s.\n\n### Methods\n\n\n#### protected packageNames()🔹 <a id=\"projen-cdk8s-cdk8sdeps-packagenames\"></a>\n\nReturn a configuration object with information about package naming in various languages.\n\n```ts\nprotected packageNames(): Cdk8sPackageNames\n```\n\n\n__Returns__:\n* <code>[cdk8s.Cdk8sPackageNames](#projen-cdk8s-cdk8spackagenames)</code>\n\n\n\n## class Cdk8sDepsPy 🔹 <a id=\"projen-cdk8s-cdk8sdepspy\"></a>\n\n\n\n__Submodule__: cdk8s\n\n__Extends__: [cdk8s.Cdk8sDeps](#projen-cdk8s-cdk8sdeps)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.Cdk8sDepsPy(project: Project, options: Cdk8sDepsOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk8s.Cdk8sDepsOptions](#projen-cdk8s-cdk8sdepsoptions)</code>)  *No description*\n  * **cdk8sVersion** (<code>string</code>)  Minumum version of the cdk8s to depend on. \n  * **cdk8sCliVersion** (<code>string</code>)  Minumum version of the cdk8s-cli to depend on. __*Default*__: \"2.0.28\"\n  * **cdk8sCliVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-cli. __*Default*__: false\n  * **cdk8sPlus** (<code>boolean</code>)  Include cdk8s-plus. __*Default*__: true\n  * **cdk8sPlusVersion** (<code>string</code>)  Minumum version of the cdk8s-plus-XX to depend on. __*Default*__: \"2.0.0-rc.26\"\n  * **cdk8sPlusVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-plus-17. __*Default*__: false\n  * **cdk8sVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s. __*Default*__: false\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: \"10.1.42\"\n  * **constructsVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for constructs. __*Default*__: false\n  * **k8sMinorVersion** (<code>number</code>)  The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0. __*Default*__: 22\n  * **cdk8sCliDependency** (<code>boolean</code>)  Add cdk8s-cli only to Node projects. \n  * **dependencyType** (<code>[DependencyType](#projen-dependencytype)</code>)  The type of dependency to use for runtime CDK8s and `constructs` modules. \n\n\n### Methods\n\n\n#### protected packageNames()🔹 <a id=\"projen-cdk8s-cdk8sdepspy-packagenames\"></a>\n\nReturn a configuration object with information about package naming in various languages.\n\n```ts\nprotected packageNames(): Cdk8sPackageNames\n```\n\n\n__Returns__:\n* <code>[cdk8s.Cdk8sPackageNames](#projen-cdk8s-cdk8spackagenames)</code>\n\n\n\n## class Cdk8sPythonApp 🔹 <a id=\"projen-cdk8s-cdk8spythonapp\"></a>\n\nCDK8s app in Python.\n\n__Submodule__: cdk8s\n\n__Extends__: [python.PythonProject](#projen-python-pythonproject)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.Cdk8sPythonApp(options: Cdk8sPythonOptions)\n```\n\n* **options** (<code>[cdk8s.Cdk8sPythonOptions](#projen-cdk8s-cdk8spythonoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. \n  * **authorName** (<code>string</code>)  Author's name. \n  * **version** (<code>string</code>)  Version of the package. \n  * **classifiers** (<code>Array<string></code>)  A list of PyPI trove classifiers that describe the project. __*Optional*__\n  * **description** (<code>string</code>)  A short description of the package. __*Optional*__\n  * **homepage** (<code>string</code>)  A URL to the website of the project. __*Optional*__\n  * **license** (<code>string</code>)  License of this package as an SPDX identifier. __*Optional*__\n  * **packageName** (<code>string</code>)  Package name. __*Optional*__\n  * **poetryOptions** (<code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code>)  Additional options to set for poetry if using poetry. __*Optional*__\n  * **setupConfig** (<code>Map<string, any></code>)  Additional fields to pass in the setup() function if using setuptools. __*Optional*__\n  * **moduleName** (<code>string</code>)  Name of the python package as used in imports and filenames. \n  * **deps** (<code>Array<string></code>)  List of runtime dependencies for this project. __*Default*__: []\n  * **devDeps** (<code>Array<string></code>)  List of dev dependencies for this project. __*Default*__: []\n  * **pip** (<code>boolean</code>)  Use pip with a requirements.txt file to track project dependencies. __*Default*__: true\n  * **poetry** (<code>boolean</code>)  Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing. __*Default*__: false\n  * **projenrcJs** (<code>boolean</code>)  Use projenrc in javascript. __*Default*__: false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options related to projenrc in JavaScript. __*Default*__: default options\n  * **projenrcPython** (<code>boolean</code>)  Use projenrc in Python. __*Default*__: true\n  * **projenrcPythonOptions** (<code>[python.ProjenrcOptions](#projen-python-projenrcoptions)</code>)  Options related to projenrc in python. __*Default*__: default options\n  * **pytest** (<code>boolean</code>)  Include pytest tests. __*Default*__: true\n  * **pytestOptions** (<code>[python.PytestOptions](#projen-python-pytestoptions)</code>)  pytest options. __*Default*__: defaults\n  * **sample** (<code>boolean</code>)  Include sample code and test if the relevant directories don't exist. __*Default*__: true\n  * **setuptools** (<code>boolean</code>)  Use setuptools with a setup.py script for packaging and publishing. __*Default*__: true if the project type is library\n  * **venv** (<code>boolean</code>)  Use venv to manage a virtual environment for installing dependencies inside. __*Default*__: true\n  * **venvOptions** (<code>[python.VenvOptions](#projen-python-venvoptions)</code>)  Venv options. __*Default*__: defaults\n  * **cdk8sVersion** (<code>string</code>)  Minumum version of the cdk8s to depend on. \n  * **cdk8sCliVersion** (<code>string</code>)  Minumum version of the cdk8s-cli to depend on. __*Default*__: \"2.0.28\"\n  * **cdk8sCliVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-cli. __*Default*__: false\n  * **cdk8sPlus** (<code>boolean</code>)  Include cdk8s-plus. __*Default*__: true\n  * **cdk8sPlusVersion** (<code>string</code>)  Minumum version of the cdk8s-plus-XX to depend on. __*Default*__: \"2.0.0-rc.26\"\n  * **cdk8sPlusVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-plus-17. __*Default*__: false\n  * **cdk8sVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s. __*Default*__: false\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: \"10.1.42\"\n  * **constructsVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for constructs. __*Default*__: false\n  * **k8sMinorVersion** (<code>number</code>)  The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0. __*Default*__: 22\n  * **appEntrypoint** (<code>string</code>)  The CDK8s app's entrypoint. __*Default*__: \"app.py\"\n  * **cdk8sImports** (<code>Array<string></code>)  Import additional specs. __*Default*__: no additional specs imported\n  * **k8sSpecVersion** (<code>string</code>)  Import a specific Kubernetes spec version. __*Default*__: Use the cdk8s default\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**appEntrypoint**🔹 | <code>string</code> | The CDK8s app entrypoint.\n**cdk8sDeps**🔹 | <code>[cdk8s.Cdk8sDeps](#projen-cdk8s-cdk8sdeps)</code> | <span></span>\n\n\n\n## class Cdk8sTypeScriptApp 🔹 <a id=\"projen-cdk8s-cdk8stypescriptapp\"></a>\n\nCDK8s app in TypeScript.\n\n__Submodule__: cdk8s\n\n__Extends__: [typescript.TypeScriptAppProject](#projen-typescript-typescriptappproject)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.Cdk8sTypeScriptApp(options: Cdk8sTypeScriptAppOptions)\n```\n\n* **options** (<code>[cdk8s.Cdk8sTypeScriptAppOptions](#projen-cdk8s-cdk8stypescriptappoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **cdk8sVersion** (<code>string</code>)  Minumum version of the cdk8s to depend on. \n  * **cdk8sCliVersion** (<code>string</code>)  Minumum version of the cdk8s-cli to depend on. __*Default*__: \"2.0.28\"\n  * **cdk8sCliVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-cli. __*Default*__: false\n  * **cdk8sPlus** (<code>boolean</code>)  Include cdk8s-plus. __*Default*__: true\n  * **cdk8sPlusVersion** (<code>string</code>)  Minumum version of the cdk8s-plus-XX to depend on. __*Default*__: \"2.0.0-rc.26\"\n  * **cdk8sPlusVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-plus-17. __*Default*__: false\n  * **cdk8sVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s. __*Default*__: false\n  * **constructsVersion** (<code>string</code>)  Minimum version of the `constructs` library to depend on. __*Default*__: \"10.1.42\"\n  * **constructsVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for constructs. __*Default*__: false\n  * **k8sMinorVersion** (<code>number</code>)  The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0. __*Default*__: 22\n  * **appEntrypoint** (<code>string</code>)  The CDK8s app's entrypoint (relative to the source directory, which is \"src\" by default). __*Default*__: \"main.ts\"\n  * **cdk8sImports** (<code>Array<string></code>)  Import additional specs. __*Default*__: no additional specs imported\n  * **integrationTestAutoDiscover** (<code>boolean</code>)  Automatically adds an `cdk8s.IntegrationTest` for each `.integ.ts` app in your test directory. If this is disabled, you can manually add an `cdk8s.AutoDiscover` component to your project. __*Default*__: true\n  * **k8sSpecVersion** (<code>string</code>)  Import a specific Kubernetes spec version. __*Default*__: Use the cdk8s default\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**appEntrypoint**🔹 | <code>string</code> | The CDK8s app entrypoint.\n**cdk8sDeps**🔹 | <code>[cdk8s.Cdk8sDeps](#projen-cdk8s-cdk8sdeps)</code> | <span></span>\n\n\n\n## class ConstructLibraryCdk8s 🔹 <a id=\"projen-cdk8s-constructlibrarycdk8s\"></a>\n\nCDK8s construct library project.\n\nA multi-language (jsii) construct library which vends constructs designed to\nuse within the CDK for Kubernetes (CDK8s), with a friendly workflow and\nautomatic publishing to the construct catalog.\n\n__Submodule__: cdk8s\n\n__Extends__: [cdk.ConstructLibrary](#projen-cdk-constructlibrary)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.ConstructLibraryCdk8s(options: ConstructLibraryCdk8sOptions)\n```\n\n* **options** (<code>[cdk8s.ConstructLibraryCdk8sOptions](#projen-cdk8s-constructlibrarycdk8soptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **author** (<code>string</code>)  The name of the library author. \n  * **authorAddress** (<code>string</code>)  Email or URL of the library author. \n  * **repositoryUrl** (<code>string</code>)  Git repository URL. \n  * **compat** (<code>boolean</code>)  Automatically run API compatibility test against the latest version published to npm after compilation. __*Default*__: false\n  * **compatIgnore** (<code>string</code>)  Name of the ignore file for API compatibility tests. __*Default*__: \".compatignore\"\n  * **compressAssembly** (<code>boolean</code>)  Emit a compressed version of the assembly. __*Default*__: false\n  * **docgenFilePath** (<code>string</code>)  File path for generated docs. __*Default*__: \"API.md\"\n  * **dotnet** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  *No description* __*Optional*__\n  * **excludeTypescript** (<code>Array<string></code>)  Accepts a list of glob patterns. __*Optional*__\n  * **publishToGo** (<code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code>)  Publish Go bindings to a git repository. __*Default*__: no publishing\n  * **publishToMaven** (<code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code>)  Publish to maven. __*Default*__: no publishing\n  * **publishToNuget** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  Publish to NuGet. __*Default*__: no publishing\n  * **publishToPypi** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  Publish to pypi. __*Default*__: no publishing\n  * **python** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  *No description* __*Optional*__\n  * **rootdir** (<code>string</code>)  *No description* __*Default*__: \".\"\n  * **catalog** (<code>[cdk.Catalog](#projen-cdk-catalog)</code>)  Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:. __*Default*__: new version will be announced\n  * **cdk8sVersion** (<code>string</code>)  Minimum target version this library is tested against. \n  * **cdk8sPlusVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for cdk8s-plus-17. __*Default*__: false\n  * **cdk8sVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for CDK8s. __*Default*__: false\n  * **constructsVersion** (<code>string</code>)  constructs verion. __*Default*__: \"3.3.196\"\n  * **constructsVersionPinning** (<code>boolean</code>)  Use pinned version instead of caret version for constructs. __*Default*__: false\n  * **integrationTestAutoDiscover** (<code>boolean</code>)  Automatically adds an `cdk8s.IntegrationTest` for each `.integ.ts` app in your test directory. If this is disabled, you can manually add an `cdk8s.AutoDiscover` component to your project. __*Default*__: true\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**cdk8sVersion**🔹 | <code>string</code> | The CDK8s version this app is using.\n**constructsVersion**🔹 | <code>string</code> | The constructs version this app is using.\n\n\n\n## class IntegrationTest 🔹 <a id=\"projen-cdk8s-integrationtest\"></a>\n\nCDK8S integration test.\n\n__Submodule__: cdk8s\n\n__Extends__: [cdk.IntegrationTestBase](#projen-cdk-integrationtestbase)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.IntegrationTest(project: Project, options: IntegrationTestOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk8s.IntegrationTestOptions](#projen-cdk8s-integrationtestoptions)</code>)  *No description*\n  * **entrypoint** (<code>string</code>)  A path from the project root directory to a TypeScript file which contains the integration test app. \n  * **tsconfigPath** (<code>string</code>)  The path of the tsconfig.json file to use when running integration test cdk apps. \n  * **name** (<code>string</code>)  Name of the integration test. __*Default*__: Derived from the entrypoint filename.\n\n\n\n\n## class IntegrationTestAutoDiscover 🔹 <a id=\"projen-cdk8s-integrationtestautodiscover\"></a>\n\nDiscovers and creates integration tests from files in the test root.\n\n__Submodule__: cdk8s\n\n__Extends__: [cdk.IntegrationTestAutoDiscoverBase](#projen-cdk-integrationtestautodiscoverbase)\n\n### Initializer\n\n\n\n\n```ts\nnew cdk8s.IntegrationTestAutoDiscover(project: Project, options: IntegrationTestAutoDiscoverOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[cdk8s.IntegrationTestAutoDiscoverOptions](#projen-cdk8s-integrationtestautodiscoveroptions)</code>)  *No description*\n  * **testdir** (<code>string</code>)  Test source tree. \n  * **tsconfigPath** (<code>string</code>)  Path to the tsconfig file to use for integration tests. \n\n\n\n\n## class ConstructLibraryCdktf 🔹 <a id=\"projen-cdktf-constructlibrarycdktf\"></a>\n\nCDKTF construct library project.\n\nA multi-language (jsii) construct library which vends constructs designed to\nuse within the CDK for Terraform (CDKTF), with a friendly workflow and\nautomatic publishing to the construct catalog.\n\n__Submodule__: cdktf\n\n__Extends__: [cdk.ConstructLibrary](#projen-cdk-constructlibrary)\n\n### Initializer\n\n\n\n\n```ts\nnew cdktf.ConstructLibraryCdktf(options: ConstructLibraryCdktfOptions)\n```\n\n* **options** (<code>[cdktf.ConstructLibraryCdktfOptions](#projen-cdktf-constructlibrarycdktfoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **author** (<code>string</code>)  The name of the library author. \n  * **authorAddress** (<code>string</code>)  Email or URL of the library author. \n  * **repositoryUrl** (<code>string</code>)  Git repository URL. \n  * **compat** (<code>boolean</code>)  Automatically run API compatibility test against the latest version published to npm after compilation. __*Default*__: false\n  * **compatIgnore** (<code>string</code>)  Name of the ignore file for API compatibility tests. __*Default*__: \".compatignore\"\n  * **compressAssembly** (<code>boolean</code>)  Emit a compressed version of the assembly. __*Default*__: false\n  * **docgenFilePath** (<code>string</code>)  File path for generated docs. __*Default*__: \"API.md\"\n  * **dotnet** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  *No description* __*Optional*__\n  * **excludeTypescript** (<code>Array<string></code>)  Accepts a list of glob patterns. __*Optional*__\n  * **publishToGo** (<code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code>)  Publish Go bindings to a git repository. __*Default*__: no publishing\n  * **publishToMaven** (<code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code>)  Publish to maven. __*Default*__: no publishing\n  * **publishToNuget** (<code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code>)  Publish to NuGet. __*Default*__: no publishing\n  * **publishToPypi** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  Publish to pypi. __*Default*__: no publishing\n  * **python** (<code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code>)  *No description* __*Optional*__\n  * **rootdir** (<code>string</code>)  *No description* __*Default*__: \".\"\n  * **catalog** (<code>[cdk.Catalog](#projen-cdk-catalog)</code>)  Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:. __*Default*__: new version will be announced\n  * **cdktfVersion** (<code>string</code>)  Minimum target version this library is tested against. \n  * **constructsVersion** (<code>string</code>)  Construct version to use. __*Default*__: \"^10.0.12\"\n\n\n\n\n## class Circleci 🔹 <a id=\"projen-circleci-circleci\"></a>\n\nCircleci Class to manage `.circleci/config.yml`. Check projen's docs for more information.\n\n__Submodule__: circleci\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew circleci.Circleci(project: Project, options?: CircleCiProps)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[circleci.CircleCiProps](#projen-circleci-circleciprops)</code>)  *No description*\n  * **jobs** (<code>Array<[circleci.Job](#projen-circleci-job)></code>)  List of Jobs to create unique steps per pipeline, e.g. ```json jobs: [{   identifier: \"compile\",   docker: { image: \"golang:alpine\" }   steps: [\"checkout\", run: {command: \"go build .\"}] }] ```. __*Optional*__\n  * **orbs** (<code>Map<string, string></code>)  Contains a map of CirclCi Orbs ```json orbs: {   node: \"circleci/node@5.0.1\"   slack: \"circleci/slack@4.8.3\" } ```. __*Optional*__\n  * **setup** (<code>boolean</code>)  The setup field enables you to conditionally trigger configurations from outside the primary .circleci parent directory, update pipeline parameters, or generate customized configurations. __*Optional*__\n  * **version** (<code>number</code>)  pipeline version. __*Default*__: 2.1\n  * **workflows** (<code>Array<[circleci.Workflow](#projen-circleci-workflow)></code>)  List of Workflows of pipeline, e.g. ```json workflows: {    {      identifier: \"build\",        jobs: [{           identifier: \"node/install\",           context: [\"npm\"],        }]    } } ```. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**file**🔹 | <code>[YamlFile](#projen-yamlfile)</code> | The yaml file for the Circleci pipeline.\n\n### Methods\n\n\n#### addOrb(name, orb)🔹 <a id=\"projen-circleci-circleci-addorb\"></a>\n\nAdd a Circleci Orb to pipeline.\n\nWill throw error if the orb already exists\n\n```ts\naddOrb(name: string, orb: string): void\n```\n\n* **name** (<code>string</code>)  *No description*\n* **orb** (<code>string</code>)  *No description*\n\n\n\n\n#### addWorkflow(workflow)🔹 <a id=\"projen-circleci-circleci-addworkflow\"></a>\n\nadd new workflow to existing pipeline.\n\n```ts\naddWorkflow(workflow: Workflow): void\n```\n\n* **workflow** (<code>[circleci.Workflow](#projen-circleci-workflow)</code>)  *No description*\n  * **identifier** (<code>string</code>)  name of dynamic key *. \n  * **jobs** (<code>Array<[circleci.WorkflowJob](#projen-circleci-workflowjob)></code>)  *No description* __*Optional*__\n  * **triggers** (<code>Array<[circleci.Triggers](#projen-circleci-triggers)></code>)  *No description* __*Optional*__\n  * **when** (<code>any</code>)  when is too dynamic to be casted to interfaces. __*Optional*__\n\n\n\n\n\n\n## class AutoApprove 🔹 <a id=\"projen-github-autoapprove\"></a>\n\nAuto approve pull requests that meet a criteria.\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.AutoApprove(github: GitHub, options?: AutoApproveOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  *No description*\n  * **allowedUsernames** (<code>Array<string></code>)  Only pull requests authored by these Github usernames will be auto-approved. __*Default*__: ['github-bot']\n  * **label** (<code>string</code>)  Only pull requests with this label will be auto-approved. __*Default*__: 'auto-approve'\n  * **runsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **secret** (<code>string</code>)  A GitHub secret name which contains a GitHub Access Token with write permissions for the `pull_request` scope. __*Default*__: \"GITHUB_TOKEN\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**label**🔹 | <code>string</code> | <span></span>\n\n\n\n## class AutoMerge 🔹 <a id=\"projen-github-automerge\"></a>\n\nSets up mergify to merging approved pull requests.\n\nIf `buildJob` is specified, the specified GitHub workflow job ID is required\nto succeed in order for the PR to be merged.\n\n`approvedReviews` specified the number of code review approvals required for\nthe PR to be merged.\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.AutoMerge(github: GitHub, options?: AutoMergeOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  *No description*\n  * **approvedReviews** (<code>number</code>)  Number of approved code reviews. __*Default*__: 1\n  * **blockingLabels** (<code>Array<string></code>)  List of labels that will prevent auto-merging. __*Default*__: ['do-not-merge']\n\n\n### Methods\n\n\n#### addConditions(...conditions)🔹 <a id=\"projen-github-automerge-addconditions\"></a>\n\nAdds conditions to the auto merge rule.\n\n```ts\naddConditions(...conditions: string[]): void\n```\n\n* **conditions** (<code>string</code>)  The conditions to add (mergify syntax).\n\n\n\n\n#### addConditionsLater(later)🔹 <a id=\"projen-github-automerge-addconditionslater\"></a>\n\nAdds conditions that will be rendered only during synthesis.\n\n```ts\naddConditionsLater(later: IAddConditionsLater): void\n```\n\n* **later** (<code>[github.IAddConditionsLater](#projen-github-iaddconditionslater)</code>)  The later.\n\n\n\n\n\n\n## class Dependabot 🔹 <a id=\"projen-github-dependabot\"></a>\n\nDefines dependabot configuration for node projects.\n\nSince module versions are managed in projen, the versioning strategy will be\nconfigured to \"lockfile-only\" which means that only updates that can be done\non the lockfile itself will be proposed.\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.Dependabot(github: GitHub, options?: DependabotOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  *No description*\n  * **ignore** (<code>Array<[github.DependabotIgnore](#projen-github-dependabotignore)></code>)  You can use the `ignore` option to customize which dependencies are updated. __*Default*__: []\n  * **ignoreProjen** (<code>boolean</code>)  Ignores updates to `projen`. __*Default*__: true\n  * **labels** (<code>Array<string></code>)  List of labels to apply to the created PR's. __*Optional*__\n  * **registries** (<code>Map<string, [github.DependabotRegistry](#projen-github-dependabotregistry)></code>)  Map of package registries to use. __*Default*__: use public registries\n  * **scheduleInterval** (<code>[github.DependabotScheduleInterval](#projen-github-dependabotscheduleinterval)</code>)  How often to check for new versions and raise pull requests. __*Default*__: ScheduleInterval.DAILY\n  * **versioningStrategy** (<code>[github.VersioningStrategy](#projen-github-versioningstrategy)</code>)  The strategy to use when edits manifest and lock files. __*Default*__: VersioningStrategy.LOCKFILE_ONLY The default is to only update the lock file because package.json is controlled by projen and any outside updates will fail the build.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**config**🔹 | <code>any</code> | The raw dependabot configuration.\n**ignoresProjen**🔹 | <code>boolean</code> | Whether or not projen is also upgraded in this config,.\n\n### Methods\n\n\n#### addIgnore(dependencyName, ...versions)🔹 <a id=\"projen-github-dependabot-addignore\"></a>\n\nIgnores a dependency from automatic updates.\n\n```ts\naddIgnore(dependencyName: string, ...versions: string[]): void\n```\n\n* **dependencyName** (<code>string</code>)  Use to ignore updates for dependencies with matching names, optionally using `*` to match zero or more characters.\n* **versions** (<code>string</code>)  Use to ignore specific versions or ranges of versions.\n\n\n\n\n\n\n## class GitHub 🔹 <a id=\"projen-github-github\"></a>\n\n\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.GitHub(project: Project, options?: GitHubOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  *No description*\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for Mergify. __*Default*__: default options\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **pullRequestLint** (<code>boolean</code>)  Add a workflow that performs basic checks for pull requests, like validating that PRs follow Conventional Commits. __*Default*__: true\n  * **pullRequestLintOptions** (<code>[github.PullRequestLintOptions](#projen-github-pullrequestlintoptions)</code>)  Options for configuring a pull request linter. __*Default*__: see defaults in `PullRequestLintOptions`\n  * **workflows** (<code>boolean</code>)  Enables GitHub workflows. __*Default*__: true\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**projenCredentials**🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | GitHub API authentication method used by projen workflows.\n**workflows**🔹 | <code>Array<[github.GithubWorkflow](#projen-github-githubworkflow)></code> | All workflows.\n**workflowsEnabled**🔹 | <code>boolean</code> | Are workflows enabled?\n**mergify**?🔹 | <code>[github.Mergify](#projen-github-mergify)</code> | The `Mergify` configured on this repository.<br/>__*Optional*__\n\n### Methods\n\n\n#### addDependabot(options?)🔹 <a id=\"projen-github-github-adddependabot\"></a>\n\n\n\n```ts\naddDependabot(options?: DependabotOptions): Dependabot\n```\n\n* **options** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  *No description*\n  * **ignore** (<code>Array<[github.DependabotIgnore](#projen-github-dependabotignore)></code>)  You can use the `ignore` option to customize which dependencies are updated. __*Default*__: []\n  * **ignoreProjen** (<code>boolean</code>)  Ignores updates to `projen`. __*Default*__: true\n  * **labels** (<code>Array<string></code>)  List of labels to apply to the created PR's. __*Optional*__\n  * **registries** (<code>Map<string, [github.DependabotRegistry](#projen-github-dependabotregistry)></code>)  Map of package registries to use. __*Default*__: use public registries\n  * **scheduleInterval** (<code>[github.DependabotScheduleInterval](#projen-github-dependabotscheduleinterval)</code>)  How often to check for new versions and raise pull requests. __*Default*__: ScheduleInterval.DAILY\n  * **versioningStrategy** (<code>[github.VersioningStrategy](#projen-github-versioningstrategy)</code>)  The strategy to use when edits manifest and lock files. __*Default*__: VersioningStrategy.LOCKFILE_ONLY The default is to only update the lock file because package.json is controlled by projen and any outside updates will fail the build.\n\n__Returns__:\n* <code>[github.Dependabot](#projen-github-dependabot)</code>\n\n#### addPullRequestTemplate(...content)🔹 <a id=\"projen-github-github-addpullrequesttemplate\"></a>\n\n\n\n```ts\naddPullRequestTemplate(...content: string[]): PullRequestTemplate\n```\n\n* **content** (<code>string</code>)  *No description*\n\n__Returns__:\n* <code>[github.PullRequestTemplate](#projen-github-pullrequesttemplate)</code>\n\n#### addWorkflow(name)🔹 <a id=\"projen-github-github-addworkflow\"></a>\n\nAdds a workflow to the project.\n\n```ts\naddWorkflow(name: string): GithubWorkflow\n```\n\n* **name** (<code>string</code>)  Name of the workflow.\n\n__Returns__:\n* <code>[github.GithubWorkflow](#projen-github-githubworkflow)</code>\n\n#### tryFindWorkflow(name)🔹 <a id=\"projen-github-github-tryfindworkflow\"></a>\n\nFinds a GitHub workflow by name.\n\nReturns `undefined` if the workflow cannot be found.\n\n```ts\ntryFindWorkflow(name: string): GithubWorkflow\n```\n\n* **name** (<code>string</code>)  The name of the GitHub workflow.\n\n__Returns__:\n* <code>[github.GithubWorkflow](#projen-github-githubworkflow)</code>\n\n#### *static* of(project)🔹 <a id=\"projen-github-github-of\"></a>\n\nReturns the `GitHub` component of a project or `undefined` if the project does not have a GitHub component.\n\n```ts\nstatic of(project: Project): GitHub\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n__Returns__:\n* <code>[github.GitHub](#projen-github-github)</code>\n\n\n\n## class GitHubProject ⚠️ <a id=\"projen-github-githubproject\"></a>\n\nGitHub-based project.\n\n__Submodule__: github\n\n__Extends__: [Project](#projen-project)\n\n### Initializer\n\n\n\n\n```ts\nnew github.GitHubProject(options: GitHubProjectOptions)\n```\n\n* **options** (<code>[github.GitHubProjectOptions](#projen-github-githubprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**projectType**⚠️ | <code>[ProjectType](#projen-projecttype)</code> | <span></span>\n**autoApprove**?⚠️ | <code>[github.AutoApprove](#projen-github-autoapprove)</code> | Auto approve set up for this project.<br/>__*Optional*__\n**devContainer**?⚠️ | <code>[vscode.DevContainer](#projen-vscode-devcontainer)</code> | Access for .devcontainer.json (used for GitHub Codespaces).<br/>__*Optional*__\n**github**?⚠️ | <code>[github.GitHub](#projen-github-github)</code> | Access all github components.<br/>__*Optional*__\n**gitpod**?⚠️ | <code>[Gitpod](#projen-gitpod)</code> | Access for Gitpod.<br/>__*Optional*__\n**vscode**?⚠️ | <code>[vscode.VsCode](#projen-vscode-vscode)</code> | Access all VSCode components.<br/>__*Optional*__\n\n### Methods\n\n\n#### annotateGenerated(glob)⚠️ <a id=\"projen-github-githubproject-annotategenerated\"></a>\n\nMarks the provided file(s) as being generated.\n\nThis is achieved using the\ngithub-linguist attributes. Generated files do not count against the\nrepository statistics and language breakdown.\n\n```ts\nannotateGenerated(glob: string): void\n```\n\n* **glob** (<code>string</code>)  the glob pattern to match (could be a file path).\n\n\n\n\n\n\n## class GithubCredentials 🔹 <a id=\"projen-github-githubcredentials\"></a>\n\nRepresents a method of providing GitHub API access for projen workflows.\n\n__Submodule__: github\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**setupSteps**🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Setup steps to obtain GitHub credentials.\n**tokenRef**🔹 | <code>string</code> | The value to use in a workflow when a GitHub token is expected.\n\n### Methods\n\n\n#### *static* fromApp(options?)🔹 <a id=\"projen-github-githubcredentials-fromapp\"></a>\n\nProvide API access through a GitHub App.\n\nThe GitHub App must be installed on the GitHub repo, its App ID and a\nprivate key must be added as secrets to the repo. The name of the secrets\ncan be specified here.\n\n```ts\nstatic fromApp(options?: GithubCredentialsAppOptions): GithubCredentials\n```\n\n* **options** (<code>[github.GithubCredentialsAppOptions](#projen-github-githubcredentialsappoptions)</code>)  *No description*\n  * **appIdSecret** (<code>string</code>)  *No description* __*Optional*__\n  * **privateKeySecret** (<code>string</code>)  *No description* __*Optional*__\n\n__Returns__:\n* <code>[github.GithubCredentials](#projen-github-githubcredentials)</code>\n\n#### *static* fromPersonalAccessToken(options?)🔹 <a id=\"projen-github-githubcredentials-frompersonalaccesstoken\"></a>\n\nProvide API access through a GitHub personal access token.\n\nThe token must be added as a secret to the GitHub repo, and the name of the\nsecret can be specified here.\n\n```ts\nstatic fromPersonalAccessToken(options?: GithubCredentialsPersonalAccessTokenOptions): GithubCredentials\n```\n\n* **options** (<code>[github.GithubCredentialsPersonalAccessTokenOptions](#projen-github-githubcredentialspersonalaccesstokenoptions)</code>)  *No description*\n  * **secret** (<code>string</code>)  *No description* __*Optional*__\n\n__Returns__:\n* <code>[github.GithubCredentials](#projen-github-githubcredentials)</code>\n\n\n\n## class GithubWorkflow 🔹 <a id=\"projen-github-githubworkflow\"></a>\n\nWorkflow for GitHub.\n\nA workflow is a configurable automated process made up of one or more jobs.\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.GithubWorkflow(github: GitHub, name: string, options?: GithubWorkflowOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **name** (<code>string</code>)  *No description*\n* **options** (<code>[github.GithubWorkflowOptions](#projen-github-githubworkflowoptions)</code>)  *No description*\n  * **concurrency** (<code>string</code>)  Concurrency ensures that only a single job or workflow using the same concurrency group will run at a time. __*Default*__: disabled\n  * **force** (<code>boolean</code>)  Force the creation of the workflow even if `workflows` is disabled in `GitHub`. __*Default*__: false\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | The name of the workflow.\n**projenCredentials**🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | GitHub API authentication method used by projen workflows.\n**concurrency**?🔹 | <code>string</code> | Concurrency ensures that only a single job or workflow using the same concurrency group will run at a time.<br/>__*Default*__: disabled\n**file**?🔹 | <code>[YamlFile](#projen-yamlfile)</code> | The workflow YAML file.<br/>__*Optional*__\n\n### Methods\n\n\n#### addJob(id, job)🔹 <a id=\"projen-github-githubworkflow-addjob\"></a>\n\nAdds a single job to the workflow.\n\n```ts\naddJob(id: string, job: JobCallingReusableWorkflow &#124; Job): void\n```\n\n* **id** (<code>string</code>)  The job name (unique within the workflow).\n* **job** (<code>[github.workflows.JobCallingReusableWorkflow](#projen-github-workflows-jobcallingreusableworkflow) &#124; [github.workflows.Job](#projen-github-workflows-job)</code>)  The job specification.\n\n\n\n\n#### addJobs(jobs)🔹 <a id=\"projen-github-githubworkflow-addjobs\"></a>\n\nAdd jobs to the workflow.\n\n```ts\naddJobs(jobs: Map<string, JobCallingReusableWorkflow &#124; Job>): void\n```\n\n* **jobs** (<code>Map<string, [github.workflows.JobCallingReusableWorkflow](#projen-github-workflows-jobcallingreusableworkflow) &#124; [github.workflows.Job](#projen-github-workflows-job)></code>)  Jobs to add.\n\n\n\n\n#### on(events)🔹 <a id=\"projen-github-githubworkflow-on\"></a>\n\nAdd events to triggers the workflow.\n\n```ts\non(events: Triggers): void\n```\n\n* **events** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  The event(s) to trigger the workflow.\n  * **branchProtectionRule** (<code>[github.workflows.BranchProtectionRuleOptions](#projen-github-workflows-branchprotectionruleoptions)</code>)  Runs your workflow anytime the branch_protection_rule event occurs. __*Optional*__\n  * **checkRun** (<code>[github.workflows.CheckRunOptions](#projen-github-workflows-checkrunoptions)</code>)  Runs your workflow anytime the check_run event occurs. __*Optional*__\n  * **checkSuite** (<code>[github.workflows.CheckSuiteOptions](#projen-github-workflows-checksuiteoptions)</code>)  Runs your workflow anytime the check_suite event occurs. __*Optional*__\n  * **create** (<code>[github.workflows.CreateOptions](#projen-github-workflows-createoptions)</code>)  Runs your workflow anytime someone creates a branch or tag, which triggers the create event. __*Optional*__\n  * **delete** (<code>[github.workflows.DeleteOptions](#projen-github-workflows-deleteoptions)</code>)  Runs your workflow anytime someone deletes a branch or tag, which triggers the delete event. __*Optional*__\n  * **deployment** (<code>[github.workflows.DeploymentOptions](#projen-github-workflows-deploymentoptions)</code>)  Runs your workflow anytime someone creates a deployment, which triggers the deployment event. __*Optional*__\n  * **deploymentStatus** (<code>[github.workflows.DeploymentStatusOptions](#projen-github-workflows-deploymentstatusoptions)</code>)  Runs your workflow anytime a third party provides a deployment status, which triggers the deployment_status event. __*Optional*__\n  * **discussion** (<code>[github.workflows.DiscussionOptions](#projen-github-workflows-discussionoptions)</code>)  Runs your workflow anytime the discussion event occurs. __*Optional*__\n  * **discussionComment** (<code>[github.workflows.DiscussionCommentOptions](#projen-github-workflows-discussioncommentoptions)</code>)  Runs your workflow anytime the discussion_comment event occurs. __*Optional*__\n  * **fork** (<code>[github.workflows.ForkOptions](#projen-github-workflows-forkoptions)</code>)  Runs your workflow anytime when someone forks a repository, which triggers the fork event. __*Optional*__\n  * **gollum** (<code>[github.workflows.GollumOptions](#projen-github-workflows-gollumoptions)</code>)  Runs your workflow when someone creates or updates a Wiki page, which triggers the gollum event. __*Optional*__\n  * **issueComment** (<code>[github.workflows.IssueCommentOptions](#projen-github-workflows-issuecommentoptions)</code>)  Runs your workflow anytime the issue_comment event occurs. __*Optional*__\n  * **issues** (<code>[github.workflows.IssuesOptions](#projen-github-workflows-issuesoptions)</code>)  Runs your workflow anytime the issues event occurs. __*Optional*__\n  * **label** (<code>[github.workflows.LabelOptions](#projen-github-workflows-labeloptions)</code>)  Runs your workflow anytime the label event occurs. __*Optional*__\n  * **milestone** (<code>[github.workflows.MilestoneOptions](#projen-github-workflows-milestoneoptions)</code>)  Runs your workflow anytime the milestone event occurs. __*Optional*__\n  * **pageBuild** (<code>[github.workflows.PageBuildOptions](#projen-github-workflows-pagebuildoptions)</code>)  Runs your workflow anytime someone pushes to a GitHub Pages-enabled branch, which triggers the page_build event. __*Optional*__\n  * **project** (<code>[github.workflows.ProjectOptions](#projen-github-workflows-projectoptions)</code>)  Runs your workflow anytime the project event occurs. __*Optional*__\n  * **projectCard** (<code>[github.workflows.ProjectCardOptions](#projen-github-workflows-projectcardoptions)</code>)  Runs your workflow anytime the project_card event occurs. __*Optional*__\n  * **projectColumn** (<code>[github.workflows.ProjectColumnOptions](#projen-github-workflows-projectcolumnoptions)</code>)  Runs your workflow anytime the project_column event occurs. __*Optional*__\n  * **public** (<code>[github.workflows.PublicOptions](#projen-github-workflows-publicoptions)</code>)  Runs your workflow anytime someone makes a private repository public, which triggers the public event. __*Optional*__\n  * **pullRequest** (<code>[github.workflows.PullRequestOptions](#projen-github-workflows-pullrequestoptions)</code>)  Runs your workflow anytime the pull_request event occurs. __*Optional*__\n  * **pullRequestReview** (<code>[github.workflows.PullRequestReviewOptions](#projen-github-workflows-pullrequestreviewoptions)</code>)  Runs your workflow anytime the pull_request_review event occurs. __*Optional*__\n  * **pullRequestReviewComment** (<code>[github.workflows.PullRequestReviewCommentOptions](#projen-github-workflows-pullrequestreviewcommentoptions)</code>)  Runs your workflow anytime a comment on a pull request's unified diff is modified, which triggers the pull_request_review_comment event. __*Optional*__\n  * **pullRequestTarget** (<code>[github.workflows.PullRequestTargetOptions](#projen-github-workflows-pullrequesttargetoptions)</code>)  This event runs in the context of the base of the pull request, rather than in the merge commit as the pull_request event does. __*Optional*__\n  * **push** (<code>[github.workflows.PushOptions](#projen-github-workflows-pushoptions)</code>)  Runs your workflow when someone pushes to a repository branch, which triggers the push event. __*Optional*__\n  * **registryPackage** (<code>[github.workflows.RegistryPackageOptions](#projen-github-workflows-registrypackageoptions)</code>)  Runs your workflow anytime a package is published or updated. __*Optional*__\n  * **release** (<code>[github.workflows.ReleaseOptions](#projen-github-workflows-releaseoptions)</code>)  Runs your workflow anytime the release event occurs. __*Optional*__\n  * **repositoryDispatch** (<code>[github.workflows.RepositoryDispatchOptions](#projen-github-workflows-repositorydispatchoptions)</code>)  You can use the GitHub API to trigger a webhook event called repository_dispatch when you want to trigger a workflow for activity that happens outside of GitHub. __*Optional*__\n  * **schedule** (<code>Array<[github.workflows.CronScheduleOptions](#projen-github-workflows-cronscheduleoptions)></code>)  You can schedule a workflow to run at specific UTC times using POSIX cron syntax. __*Optional*__\n  * **status** (<code>[github.workflows.StatusOptions](#projen-github-workflows-statusoptions)</code>)  Runs your workflow anytime the status of a Git commit changes, which triggers the status event. __*Optional*__\n  * **watch** (<code>[github.workflows.WatchOptions](#projen-github-workflows-watchoptions)</code>)  Runs your workflow anytime the watch event occurs. __*Optional*__\n  * **workflowCall** (<code>[github.workflows.WorkflowCallOptions](#projen-github-workflows-workflowcalloptions)</code>)  Can be called from another workflow. __*Optional*__\n  * **workflowDispatch** (<code>[github.workflows.WorkflowDispatchOptions](#projen-github-workflows-workflowdispatchoptions)</code>)  You can configure custom-defined input properties, default input values, and required inputs for the event directly in your workflow. __*Optional*__\n  * **workflowRun** (<code>[github.workflows.WorkflowRunOptions](#projen-github-workflows-workflowrunoptions)</code>)  This event occurs when a workflow run is requested or completed, and allows you to execute a workflow based on the finished result of another workflow. __*Optional*__\n\n\n\n\n\n\n## class Mergify 🔹 <a id=\"projen-github-mergify\"></a>\n\n\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.Mergify(github: GitHub, options?: MergifyOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  *No description*\n  * **queues** (<code>Array<[github.MergifyQueue](#projen-github-mergifyqueue)></code>)  *No description* __*Optional*__\n  * **rules** (<code>Array<[github.MergifyRule](#projen-github-mergifyrule)></code>)  *No description* __*Optional*__\n\n\n### Methods\n\n\n#### addQueue(queue)🔹 <a id=\"projen-github-mergify-addqueue\"></a>\n\n\n\n```ts\naddQueue(queue: MergifyQueue): void\n```\n\n* **queue** (<code>[github.MergifyQueue](#projen-github-mergifyqueue)</code>)  *No description*\n  * **conditions** (<code>Array<string &#124; [github.MergifyConditionalOperator](#projen-github-mergifyconditionaloperator)></code>)  A list of Conditions string that must match against the pull request for the pull request to be added to the queue. \n  * **name** (<code>string</code>)  The name of the queue. \n\n\n\n\n#### addRule(rule)🔹 <a id=\"projen-github-mergify-addrule\"></a>\n\n\n\n```ts\naddRule(rule: MergifyRule): void\n```\n\n* **rule** (<code>[github.MergifyRule](#projen-github-mergifyrule)</code>)  *No description*\n  * **actions** (<code>Map<string, any></code>)  A dictionary made of Actions that will be executed on the matching pull requests. \n  * **conditions** (<code>Array<string &#124; [github.MergifyConditionalOperator](#projen-github-mergifyconditionaloperator)></code>)  A list of Conditions string that must match against the pull request for the rule to be applied. \n  * **name** (<code>string</code>)  The name of the rule. \n\n\n\n\n\n\n## class PullRequestLint 🔹 <a id=\"projen-github-pullrequestlint\"></a>\n\nConfigure validations to run on GitHub pull requests.\n\nOnly generates a file if at least one linter is configured.\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.PullRequestLint(github: GitHub, options?: PullRequestLintOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.PullRequestLintOptions](#projen-github-pullrequestlintoptions)</code>)  *No description*\n  * **runsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **semanticTitle** (<code>boolean</code>)  Validate that pull request titles follow Conventional Commits. __*Default*__: true\n  * **semanticTitleOptions** (<code>[github.SemanticTitleOptions](#projen-github-semantictitleoptions)</code>)  Options for validating the conventional commit title linter. __*Default*__: title must start with \"feat\", \"fix\", or \"chore\"\n\n\n\n\n## class PullRequestTemplate 🔹 <a id=\"projen-github-pullrequesttemplate\"></a>\n\nTemplate for GitHub pull requests.\n\n__Submodule__: github\n\n__Extends__: [TextFile](#projen-textfile)\n\n### Initializer\n\n\n\n\n```ts\nnew github.PullRequestTemplate(github: GitHub, options?: PullRequestTemplateOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.PullRequestTemplateOptions](#projen-github-pullrequesttemplateoptions)</code>)  *No description*\n  * **lines** (<code>Array<string></code>)  The contents of the template. __*Default*__: a standard default template will be created.\n\n\n\n\n## class Stale 🔹 <a id=\"projen-github-stale\"></a>\n\nWarns and then closes issues and PRs that have had no activity for a specified amount of time.\n\nThe default configuration will:\n\n  * Add a \"Stale\" label to pull requests after 14 days and closed after 2 days\n  * Add a \"Stale\" label to issues after 60 days and closed after 7 days\n  * If a comment is added, the label will be removed and timer is restarted.\n\n__Submodule__: github\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew github.Stale(github: GitHub, options?: StaleOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  *No description*\n  * **issues** (<code>[github.StaleBehavior](#projen-github-stalebehavior)</code>)  How to handle stale issues. __*Default*__: By default, stale issues with no activity will be marked as stale after 60 days and closed within 7 days.\n  * **pullRequest** (<code>[github.StaleBehavior](#projen-github-stalebehavior)</code>)  How to handle stale pull requests. __*Default*__: By default, pull requests with no activity will be marked as stale after 14 days and closed within 2 days with relevant comments.\n  * **runsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n\n\n\n\n## class TaskWorkflow 🔹 <a id=\"projen-github-taskworkflow\"></a>\n\nA GitHub workflow for common build tasks within a project.\n\n__Submodule__: github\n\n__Extends__: [github.GithubWorkflow](#projen-github-githubworkflow)\n\n### Initializer\n\n\n\n\n```ts\nnew github.TaskWorkflow(github: GitHub, options: TaskWorkflowOptions)\n```\n\n* **github** (<code>[github.GitHub](#projen-github-github)</code>)  *No description*\n* **options** (<code>[github.TaskWorkflowOptions](#projen-github-taskworkflowoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  The workflow name. \n  * **permissions** (<code>[github.workflows.JobPermissions](#projen-github-workflows-jobpermissions)</code>)  Permissions for the build job. \n  * **task** (<code>[Task](#projen-task)</code>)  The main task to be executed. \n  * **artifactsDirectory** (<code>string</code>)  A directory name which contains artifacts to be uploaded (e.g. `dist`). If this is set, the contents of this directory will be uploaded as an artifact at the end of the workflow run, even if other steps fail. __*Default*__: not set\n  * **checkoutWith** (<code>Map<string, any></code>)  Override for the `with` property of the source code checkout step. __*Default*__: not set\n  * **condition** (<code>string</code>)  Adds an 'if' condition to the workflow. __*Optional*__\n  * **container** (<code>[github.workflows.ContainerOptions](#projen-github-workflows-containeroptions)</code>)  *No description* __*Default*__: default image\n  * **env** (<code>Map<string, string></code>)  Workflow environment variables. __*Default*__: {}\n  * **gitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in this workflow. __*Optional*__\n  * **jobId** (<code>string</code>)  The primary job id. __*Default*__: \"build\"\n  * **outputs** (<code>Map<string, [github.workflows.JobStepOutput](#projen-github-workflows-jobstepoutput)></code>)  Mapping of job output names to values/expressions. __*Default*__: {}\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Actions to run after the main build step. __*Default*__: not set\n  * **preBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to run before the main build step. __*Default*__: not set\n  * **preCheckoutSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Initial steps to run before the source code checkout. __*Default*__: not set\n  * **runsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **triggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  The triggers for the workflow. __*Default*__: by default workflows can only be triggered by manually.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**jobId**🔹 | <code>string</code> | <span></span>\n**artifactsDirectory**?🔹 | <code>string</code> | __*Optional*__\n\n\n\n## class CiConfiguration 🔹 <a id=\"projen-gitlab-ciconfiguration\"></a>\n\nCI for GitLab.\n\nA CI is a configurable automated process made up of one or more stages/jobs.\n\n__Submodule__: gitlab\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew gitlab.CiConfiguration(project: Project, name: string, options?: CiConfigurationOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **name** (<code>string</code>)  *No description*\n* **options** (<code>[gitlab.CiConfigurationOptions](#projen-gitlab-ciconfigurationoptions)</code>)  *No description*\n  * **default** (<code>[gitlab.Default](#projen-gitlab-default)</code>)  Default settings for the CI Configuration. __*Optional*__\n  * **jobs** (<code>Map<string, [gitlab.Job](#projen-gitlab-job)></code>)  An initial set of jobs to add to the configuration. __*Optional*__\n  * **pages** (<code>[gitlab.Job](#projen-gitlab-job)</code>)  A special job used to upload static sites to Gitlab pages. __*Optional*__\n  * **stages** (<code>Array<string></code>)  Groups jobs into stages. __*Optional*__\n  * **variables** (<code>Map<string, any></code>)  Global variables that are passed to jobs. __*Optional*__\n  * **workflow** (<code>[gitlab.Workflow](#projen-gitlab-workflow)</code>)  Used to control pipeline behavior. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**defaultAfterScript**🔹 | <code>Array<string></code> | Defines default scripts that should run *after* all jobs.\n**defaultBeforeScript**🔹 | <code>Array<string></code> | Defines default scripts that should run *before* all jobs.\n**defaultTags**🔹 | <code>Array<string></code> | Used to select a specific runner from the list of all runners that are available for the project.\n**file**🔹 | <code>[YamlFile](#projen-yamlfile)</code> | The workflow YAML file.\n**jobs**🔹 | <code>Map<string, [gitlab.Job](#projen-gitlab-job)></code> | The jobs in the CI configuration.\n**name**🔹 | <code>string</code> | The name of the configuration.\n**path**🔹 | <code>string</code> | Path to CI file generated by the configuration.\n**project**🔹 | <code>[Project](#projen-project)</code> | The project the configuration belongs to.\n**stages**🔹 | <code>Array<string></code> | Groups jobs into stages.\n**variables**🔹 | <code>Map<string, string &#124; number &#124; [gitlab.VariableConfig](#projen-gitlab-variableconfig)></code> | Global variables that are passed to jobs.\n**defaultArtifacts**?🔹 | <code>[gitlab.Artifacts](#projen-gitlab-artifacts)</code> | Default list of files and directories that should be attached to the job if it succeeds.<br/>__*Optional*__\n**defaultCache**?🔹 | <code>[gitlab.Cache](#projen-gitlab-cache)</code> | A default list of files and directories to cache between jobs.<br/>__*Optional*__\n**defaultImage**?🔹 | <code>[gitlab.Image](#projen-gitlab-image)</code> | Specifies the default docker image to use globally for all jobs.<br/>__*Optional*__\n**defaultInterruptible**?🔹 | <code>boolean</code> | The default behavior for whether a job should be canceled when a newer pipeline starts before the job completes (Default: false).<br/>__*Optional*__\n**defaultRetry**?🔹 | <code>[gitlab.Retry](#projen-gitlab-retry)</code> | How many times a job is retried if it fails.<br/>__*Optional*__\n**defaultTimeout**?🔹 | <code>string</code> | A default timeout job written in natural language (Ex.<br/>__*Optional*__\n**pages**?🔹 | <code>[gitlab.Job](#projen-gitlab-job)</code> | A special job used to upload static sites to Gitlab pages.<br/>__*Optional*__\n**workflow**?🔹 | <code>[gitlab.Workflow](#projen-gitlab-workflow)</code> | Used to control pipeline behavior.<br/>__*Optional*__\n\n### Methods\n\n\n#### addGlobalVariables(variables)🔹 <a id=\"projen-gitlab-ciconfiguration-addglobalvariables\"></a>\n\nAdd a globally defined variable to the CI configuration.\n\n```ts\naddGlobalVariables(variables: Map<string, any>): void\n```\n\n* **variables** (<code>Map<string, any></code>)  The variables to add.\n\n\n\n\n#### addIncludes(...includes)🔹 <a id=\"projen-gitlab-ciconfiguration-addincludes\"></a>\n\nAdd additional yml/yaml files to the CI includes.\n\n```ts\naddIncludes(...includes: Include[]): void\n```\n\n* **includes** (<code>[gitlab.Include](#projen-gitlab-include)</code>)  The includes to add.\n  * **file** (<code>Array<string></code>)  Files from another private project on the same GitLab instance. __*Optional*__\n  * **local** (<code>string</code>)  Relative path from local repository root (`/`) to the `yaml`/`yml` file template. __*Optional*__\n  * **project** (<code>string</code>)  Path to the project, e.g. `group/project`, or `group/sub-group/project`. __*Optional*__\n  * **ref** (<code>string</code>)  Branch/Tag/Commit-hash for the target project. __*Optional*__\n  * **remote** (<code>string</code>)  URL to a `yaml`/`yml` template file using HTTP/HTTPS. __*Optional*__\n  * **rules** (<code>Array<[gitlab.IncludeRule](#projen-gitlab-includerule)></code>)  Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job. __*Optional*__\n  * **template** (<code>string</code>)  Use a `.gitlab-ci.yml` template as a base, e.g. `Nodejs.gitlab-ci.yml`. __*Optional*__\n\n\n\n\n#### addJobs(jobs)🔹 <a id=\"projen-gitlab-ciconfiguration-addjobs\"></a>\n\nAdd jobs and their stages to the CI configuration.\n\n```ts\naddJobs(jobs: Map<string, Job>): void\n```\n\n* **jobs** (<code>Map<string, [gitlab.Job](#projen-gitlab-job)></code>)  Jobs to add.\n\n\n\n\n#### addServices(...services)🔹 <a id=\"projen-gitlab-ciconfiguration-addservices\"></a>\n\nAdd additional services.\n\n```ts\naddServices(...services: Service[]): void\n```\n\n* **services** (<code>[gitlab.Service](#projen-gitlab-service)</code>)  The services to add.\n  * **name** (<code>string</code>)  Full name of the image that should be used. \n  * **alias** (<code>string</code>)  Additional alias that can be used to access the service from the job's container. __*Optional*__\n  * **command** (<code>Array<string></code>)  Command or script that should be used as the container's command. __*Optional*__\n  * **entrypoint** (<code>Array<string></code>)  Command or script that should be executed as the container's entrypoint. __*Optional*__\n\n\n\n\n#### addStages(...stages)🔹 <a id=\"projen-gitlab-ciconfiguration-addstages\"></a>\n\nAdd stages to the CI configuration if not already present.\n\n```ts\naddStages(...stages: string[]): void\n```\n\n* **stages** (<code>string</code>)  stages to add.\n\n\n\n\n\n\n## class GitlabConfiguration 🔹 <a id=\"projen-gitlab-gitlabconfiguration\"></a>\n\nA GitLab CI for the main `.gitlab-ci.yml` file.\n\n__Submodule__: gitlab\n\n__Extends__: [gitlab.CiConfiguration](#projen-gitlab-ciconfiguration)\n\n### Initializer\n\n\n\n\n```ts\nnew gitlab.GitlabConfiguration(project: Project, options?: CiConfigurationOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[gitlab.CiConfigurationOptions](#projen-gitlab-ciconfigurationoptions)</code>)  *No description*\n  * **default** (<code>[gitlab.Default](#projen-gitlab-default)</code>)  Default settings for the CI Configuration. __*Optional*__\n  * **jobs** (<code>Map<string, [gitlab.Job](#projen-gitlab-job)></code>)  An initial set of jobs to add to the configuration. __*Optional*__\n  * **pages** (<code>[gitlab.Job](#projen-gitlab-job)</code>)  A special job used to upload static sites to Gitlab pages. __*Optional*__\n  * **stages** (<code>Array<string></code>)  Groups jobs into stages. __*Optional*__\n  * **variables** (<code>Map<string, any></code>)  Global variables that are passed to jobs. __*Optional*__\n  * **workflow** (<code>[gitlab.Workflow](#projen-gitlab-workflow)</code>)  Used to control pipeline behavior. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**nestedTemplates**🔹 | <code>Map<string, [gitlab.NestedConfiguration](#projen-gitlab-nestedconfiguration)></code> | <span></span>\n\n### Methods\n\n\n#### createNestedTemplates(config)🔹 <a id=\"projen-gitlab-gitlabconfiguration-createnestedtemplates\"></a>\n\nCreates and adds nested templates to the includes of the main CI.\n\nAdditionally adds their stages to the main CI if they are not already present.\nYou can futher customize nested templates through the `nestedTemplates` property.\nE.g. gitlabConfig.nestedTemplates['templateName']?.addStages('stageName')\n\n```ts\ncreateNestedTemplates(config: Map<string, CiConfigurationOptions>): void\n```\n\n* **config** (<code>Map<string, [gitlab.CiConfigurationOptions](#projen-gitlab-ciconfigurationoptions)></code>)  a record the names and configuraitons of the templates.\n\n\n\n\n\n\n## class NestedConfiguration 🔹 <a id=\"projen-gitlab-nestedconfiguration\"></a>\n\nA GitLab CI for templates that are created and included in the `.gitlab-ci.yml` file.\n\n__Submodule__: gitlab\n\n__Extends__: [gitlab.CiConfiguration](#projen-gitlab-ciconfiguration)\n\n### Initializer\n\n\n\n\n```ts\nnew gitlab.NestedConfiguration(project: Project, parent: GitlabConfiguration, name: string, options?: CiConfigurationOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **parent** (<code>[gitlab.GitlabConfiguration](#projen-gitlab-gitlabconfiguration)</code>)  *No description*\n* **name** (<code>string</code>)  *No description*\n* **options** (<code>[gitlab.CiConfigurationOptions](#projen-gitlab-ciconfigurationoptions)</code>)  *No description*\n  * **default** (<code>[gitlab.Default](#projen-gitlab-default)</code>)  Default settings for the CI Configuration. __*Optional*__\n  * **jobs** (<code>Map<string, [gitlab.Job](#projen-gitlab-job)></code>)  An initial set of jobs to add to the configuration. __*Optional*__\n  * **pages** (<code>[gitlab.Job](#projen-gitlab-job)</code>)  A special job used to upload static sites to Gitlab pages. __*Optional*__\n  * **stages** (<code>Array<string></code>)  Groups jobs into stages. __*Optional*__\n  * **variables** (<code>Map<string, any></code>)  Global variables that are passed to jobs. __*Optional*__\n  * **workflow** (<code>[gitlab.Workflow](#projen-gitlab-workflow)</code>)  Used to control pipeline behavior. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**parent**🔹 | <code>[gitlab.GitlabConfiguration](#projen-gitlab-gitlabconfiguration)</code> | <span></span>\n\n\n\n## class JavaProject 🔹 <a id=\"projen-java-javaproject\"></a>\n\nJava project.\n\n__Submodule__: java\n\n__Extends__: [github.GitHubProject](#projen-github-githubproject)\n\n### Initializer\n\n\n\n\n```ts\nnew java.JavaProject(options: JavaProjectOptions)\n```\n\n* **options** (<code>[java.JavaProjectOptions](#projen-java-javaprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **artifactId** (<code>string</code>)  The artifactId is generally the name that the project is known by. \n  * **groupId** (<code>string</code>)  This is generally unique amongst an organization or a project. \n  * **version** (<code>string</code>)  This is the last piece of the naming puzzle. \n  * **description** (<code>string</code>)  Description of a project is always good. __*Default*__: undefined\n  * **packaging** (<code>string</code>)  Project packaging format. __*Default*__: \"jar\"\n  * **url** (<code>string</code>)  The URL, like the name, is not required. __*Default*__: undefined\n  * **compileOptions** (<code>[java.MavenCompileOptions](#projen-java-mavencompileoptions)</code>)  Compile options. __*Default*__: defaults\n  * **deps** (<code>Array<string></code>)  List of runtime dependencies for this project. __*Default*__: []\n  * **distdir** (<code>string</code>)  Final artifact output directory. __*Default*__: \"dist/java\"\n  * **junit** (<code>boolean</code>)  Include junit tests. __*Default*__: true\n  * **junitOptions** (<code>[java.JunitOptions](#projen-java-junitoptions)</code>)  junit options. __*Default*__: defaults\n  * **packagingOptions** (<code>[java.MavenPackagingOptions](#projen-java-mavenpackagingoptions)</code>)  Packaging options. __*Default*__: defaults\n  * **projenrcJava** (<code>boolean</code>)  Use projenrc in java. __*Default*__: true\n  * **projenrcJavaOptions** (<code>[java.ProjenrcOptions](#projen-java-projenrcoptions)</code>)  Options related to projenrc in java. __*Default*__: default options\n  * **testDeps** (<code>Array<string></code>)  List of test dependencies for this project. __*Default*__: []\n  * **sample** (<code>boolean</code>)  Include sample code and test if the relevant directories don't exist. __*Default*__: true\n  * **sampleJavaPackage** (<code>string</code>)  The java package to use for the code sample. __*Default*__: \"org.acme\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**compile**🔹 | <code>[java.MavenCompile](#projen-java-mavencompile)</code> | Compile component.\n**distdir**🔹 | <code>string</code> | Maven artifact output directory.\n**packaging**🔹 | <code>[java.MavenPackaging](#projen-java-mavenpackaging)</code> | Packaging component.\n**pom**🔹 | <code>[java.Pom](#projen-java-pom)</code> | API for managing `pom.xml`.\n**junit**?🔹 | <code>[java.Junit](#projen-java-junit)</code> | JUnit component.<br/>__*Optional*__\n**projenrc**?🔹 | <code>[java.Projenrc](#projen-java-projenrc)</code> | Projenrc component.<br/>__*Optional*__\n\n### Methods\n\n\n#### addDependency(spec)🔹 <a id=\"projen-java-javaproject-adddependency\"></a>\n\nAdds a runtime dependency.\n\n```ts\naddDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<groupId>/<artifactId>@<semver>`.\n\n\n\n\n#### addPlugin(spec, options?)🔹 <a id=\"projen-java-javaproject-addplugin\"></a>\n\nAdds a build plugin to the pom.\n\nThe plug in is also added as a BUILD dep to the project.\n\n```ts\naddPlugin(spec: string, options?: PluginOptions): Dependency\n```\n\n* **spec** (<code>string</code>)  dependency spec (`group/artifact@version`).\n* **options** (<code>[java.PluginOptions](#projen-java-pluginoptions)</code>)  plugin options.\n  * **configuration** (<code>Map<string, any></code>)  Plugin key/value configuration. __*Default*__: {}\n  * **dependencies** (<code>Array<string></code>)  You could configure the dependencies for the plugin. __*Default*__: []\n  * **executions** (<code>Array<[java.PluginExecution](#projen-java-pluginexecution)></code>)  Plugin executions. __*Default*__: []\n\n__Returns__:\n* <code>[Dependency](#projen-dependency)</code>\n\n#### addTestDependency(spec)🔹 <a id=\"projen-java-javaproject-addtestdependency\"></a>\n\nAdds a test dependency.\n\n```ts\naddTestDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<groupId>/<artifactId>@<semver>`.\n\n\n\n\n\n\n## class Junit 🔹 <a id=\"projen-java-junit\"></a>\n\nImplements JUnit-based testing.\n\n__Submodule__: java\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew java.Junit(project: Project, options: JunitOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[java.JunitOptions](#projen-java-junitoptions)</code>)  *No description*\n  * **pom** (<code>[java.Pom](#projen-java-pom)</code>)  Java pom. \n  * **sampleJavaPackage** (<code>string</code>)  Java package for test sample. __*Default*__: \"org.acme\"\n  * **version** (<code>string</code>)  Junit version. __*Default*__: \"5.7.0\"\n\n\n\n\n## class MavenCompile 🔹 <a id=\"projen-java-mavencompile\"></a>\n\nAdds the maven-compiler plugin to a POM file and the `compile` task.\n\n__Submodule__: java\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew java.MavenCompile(project: Project, pom: Pom, options?: MavenCompileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **pom** (<code>[java.Pom](#projen-java-pom)</code>)  *No description*\n* **options** (<code>[java.MavenCompileOptions](#projen-java-mavencompileoptions)</code>)  *No description*\n  * **source** (<code>string</code>)  Source language version. __*Default*__: \"1.8\"\n  * **target** (<code>string</code>)  Target JVM version. __*Default*__: \"1.8\"\n\n\n\n\n## class MavenPackaging 🔹 <a id=\"projen-java-mavenpackaging\"></a>\n\nConfigures a maven project to produce a .jar archive with sources and javadocs.\n\n__Submodule__: java\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew java.MavenPackaging(project: Project, pom: Pom, options?: MavenPackagingOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **pom** (<code>[java.Pom](#projen-java-pom)</code>)  *No description*\n* **options** (<code>[java.MavenPackagingOptions](#projen-java-mavenpackagingoptions)</code>)  *No description*\n  * **distdir** (<code>string</code>)  Where to place the package output? __*Default*__: \"dist/java\"\n  * **javadocs** (<code>boolean</code>)  Include javadocs jar in package. __*Default*__: true\n  * **javadocsExclude** (<code>Array<string></code>)  Exclude source files from docs. __*Default*__: []\n  * **sources** (<code>boolean</code>)  Include sources jar in package. __*Default*__: true\n\n\n\n\n## class MavenSample 🔹 <a id=\"projen-java-mavensample\"></a>\n\nJava code sample.\n\n__Submodule__: java\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew java.MavenSample(project: Project, options: MavenSampleOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[java.MavenSampleOptions](#projen-java-mavensampleoptions)</code>)  *No description*\n  * **package** (<code>string</code>)  Project root java package. \n\n\n\n\n## class Pom 🔹 <a id=\"projen-java-pom\"></a>\n\nA Project Object Model or POM is the fundamental unit of work in Maven.\n\nIt is\nan XML file that contains information about the project and configuration\ndetails used by Maven to build the project.\n\n__Submodule__: java\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew java.Pom(project: Project, options: PomOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[java.PomOptions](#projen-java-pomoptions)</code>)  *No description*\n  * **artifactId** (<code>string</code>)  The artifactId is generally the name that the project is known by. \n  * **groupId** (<code>string</code>)  This is generally unique amongst an organization or a project. \n  * **version** (<code>string</code>)  This is the last piece of the naming puzzle. \n  * **description** (<code>string</code>)  Description of a project is always good. __*Default*__: undefined\n  * **packaging** (<code>string</code>)  Project packaging format. __*Default*__: \"jar\"\n  * **url** (<code>string</code>)  The URL, like the name, is not required. __*Default*__: undefined\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**artifactId**🔹 | <code>string</code> | Maven artifact ID.\n**fileName**🔹 | <code>string</code> | The name of the pom file.\n**groupId**🔹 | <code>string</code> | Maven group ID.\n**packaging**🔹 | <code>string</code> | Maven packaging format.\n**version**🔹 | <code>string</code> | Project version.\n**description**?🔹 | <code>string</code> | Project description.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | Project display name.<br/>__*Optional*__\n**url**?🔹 | <code>string</code> | Project URL.<br/>__*Optional*__\n\n### Methods\n\n\n#### addDependency(spec)🔹 <a id=\"projen-java-pom-adddependency\"></a>\n\nAdds a runtime dependency.\n\n```ts\naddDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<groupId>/<artifactId>@<semver>`.\n\n\n\n\n#### addPlugin(spec, options?)🔹 <a id=\"projen-java-pom-addplugin\"></a>\n\nAdds a build plugin to the pom.\n\nThe plug in is also added as a BUILD dep to the project.\n\n```ts\naddPlugin(spec: string, options?: PluginOptions): Dependency\n```\n\n* **spec** (<code>string</code>)  dependency spec (`group/artifact@version`).\n* **options** (<code>[java.PluginOptions](#projen-java-pluginoptions)</code>)  plugin options.\n  * **configuration** (<code>Map<string, any></code>)  Plugin key/value configuration. __*Default*__: {}\n  * **dependencies** (<code>Array<string></code>)  You could configure the dependencies for the plugin. __*Default*__: []\n  * **executions** (<code>Array<[java.PluginExecution](#projen-java-pluginexecution)></code>)  Plugin executions. __*Default*__: []\n\n__Returns__:\n* <code>[Dependency](#projen-dependency)</code>\n\n#### addProperty(key, value)🔹 <a id=\"projen-java-pom-addproperty\"></a>\n\nAdds a key/value property to the pom.\n\n```ts\naddProperty(key: string, value: string): void\n```\n\n* **key** (<code>string</code>)  the key.\n* **value** (<code>string</code>)  the value.\n\n\n\n\n#### addRepository(repository)🔹 <a id=\"projen-java-pom-addrepository\"></a>\n\nAdds a repository to the pom.\n\n```ts\naddRepository(repository: MavenRepository): void\n```\n\n* **repository** (<code>[java.MavenRepository](#projen-java-mavenrepository)</code>)  the repository to add.\n  * **id** (<code>string</code>)  The identifier for the repository. \n  * **url** (<code>string</code>)  The url of the repository. \n  * **layout** (<code>string</code>)  The layout of the repository. __*Optional*__\n  * **name** (<code>string</code>)  The name of the repository. __*Optional*__\n\n\n\n\n#### addTestDependency(spec)🔹 <a id=\"projen-java-pom-addtestdependency\"></a>\n\nAdds a test dependency.\n\n```ts\naddTestDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<groupId>/<artifactId>@<semver>`.\n\n\n\n\n\n\n## class Projenrc 🔹 <a id=\"projen-java-projenrc\"></a>\n\nAllows writing projenrc files in java.\n\nThis will install `org.projen/projen` as a Maven dependency and will add a\n`synth` task which will compile & execute `main()` from\n`src/main/java/projenrc.java`.\n\n__Submodule__: java\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew java.Projenrc(project: Project, pom: Pom, options?: ProjenrcOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **pom** (<code>[java.Pom](#projen-java-pom)</code>)  *No description*\n* **options** (<code>[java.ProjenrcOptions](#projen-java-projenrcoptions)</code>)  *No description*\n  * **className** (<code>string</code>)  The name of the Java class which contains the `main()` method for projen. __*Default*__: \"projenrc\"\n  * **projenVersion** (<code>string</code>)  The projen version to use. __*Default*__: current version\n  * **testScope** (<code>boolean</code>)  Defines projenrc under the test scope instead of the main scope, which is reserved to the app. __*Default*__: true\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**className**🔹 | <code>string</code> | The name of the java class that includes the projen entrypoint.\n\n\n\n## class Bundler 🔹 <a id=\"projen-javascript-bundler\"></a>\n\nAdds support for bundling JavaScript applications and dependencies into a single file.\n\nIn the future, this will also supports bundling websites.\n\n__Submodule__: javascript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\nCreates a `Bundler`.\n\n```ts\nnew javascript.Bundler(project: Project, options?: BundlerOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  *No description*\n  * **addToPreCompile** (<code>boolean</code>)  Install the `bundle` command as a pre-compile phase. __*Default*__: true\n  * **assetsDir** (<code>string</code>)  Output directory for all bundles. __*Default*__: \"assets\"\n  * **esbuildVersion** (<code>string</code>)  The semantic version requirement for `esbuild`. __*Default*__: no specific version (implies latest)\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**bundleTask**🔹 | <code>[Task](#projen-task)</code> | Gets or creates the singleton \"bundle\" task of the project.\n**bundledir**🔹 | <code>string</code> | Root bundle directory.\n**esbuildVersion**?🔹 | <code>string</code> | The semantic version requirement for `esbuild` (if defined).<br/>__*Optional*__\n\n### Methods\n\n\n#### addBundle(entrypoint, options)🔹 <a id=\"projen-javascript-bundler-addbundle\"></a>\n\nAdds a task to the project which bundles a specific entrypoint and all of its dependencies into a single javascript output file.\n\n```ts\naddBundle(entrypoint: string, options: AddBundleOptions): Bundle\n```\n\n* **entrypoint** (<code>string</code>)  The relative path of the artifact within the project.\n* **options** (<code>[javascript.AddBundleOptions](#projen-javascript-addbundleoptions)</code>)  Bundling options.\n  * **externals** (<code>Array<string></code>)  You can mark a file or a package as external to exclude it from your build. __*Default*__: []\n  * **sourcemap** (<code>boolean</code>)  Include a source map in the bundle. __*Default*__: false\n  * **watchTask** (<code>boolean</code>)  In addition to the `bundle:xyz` task, creates `bundle:xyz:watch` task which will invoke the same esbuild command with the `--watch` flag. __*Default*__: true\n  * **platform** (<code>string</code>)  esbuild platform. \n  * **target** (<code>string</code>)  esbuild target. \n  * **executable** (<code>boolean</code>)  Mark the output file as executable. __*Default*__: false\n  * **outfile** (<code>string</code>)  Bundler output path relative to the asset's output directory. __*Default*__: \"index.js\"\n\n__Returns__:\n* <code>[javascript.Bundle](#projen-javascript-bundle)</code>\n\n#### *static* of(project)🔹 <a id=\"projen-javascript-bundler-of\"></a>\n\nReturns the `Bundler` instance associated with a project or `undefined` if there is no Bundler.\n\n```ts\nstatic of(project: Project): Bundler\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  The project.\n\n__Returns__:\n* <code>[javascript.Bundler](#projen-javascript-bundler)</code>\n\n\n\n## class Eslint 🔹 <a id=\"projen-javascript-eslint\"></a>\n\nRepresents eslint configuration.\n\n__Submodule__: javascript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.Eslint(project: NodeProject, options: EslintOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  *No description*\n  * **dirs** (<code>Array<string></code>)  Directories with source files to lint (e.g. [ \"src\" ]). \n  * **aliasExtensions** (<code>Array<string></code>)  Enable import alias for module paths. __*Default*__: undefined\n  * **aliasMap** (<code>Map<string, string></code>)  Enable import alias for module paths. __*Default*__: undefined\n  * **devdirs** (<code>Array<string></code>)  Directories with source files that include tests and build tools. __*Default*__: []\n  * **fileExtensions** (<code>Array<string></code>)  File types that should be linted (e.g. [ \".js\", \".ts\" ]). __*Default*__: [\".ts\"]\n  * **ignorePatterns** (<code>Array<string></code>)  List of file patterns that should not be linted, using the same syntax as .gitignore patterns. __*Default*__: [ '*.js', '*.d.ts', 'node_modules/', '*.generated.ts', 'coverage' ]\n  * **lintProjenRc** (<code>boolean</code>)  Should we lint .projenrc.js. __*Default*__: true\n  * **lintProjenRcFile** (<code>string</code>)  Projenrc file to lint. __*Default*__: PROJEN_RC\n  * **prettier** (<code>boolean</code>)  Enable prettier for code formatting. __*Default*__: false\n  * **tsAlwaysTryTypes** (<code>boolean</code>)  Always try to resolve types under `<root>@types` directory even it doesn't contain any source code. __*Default*__: true\n  * **tsconfigPath** (<code>string</code>)  Path to `tsconfig.json` which should be used by eslint. __*Default*__: \"./tsconfig.json\"\n  * **yaml** (<code>boolean</code>)  Write eslint configuration as YAML instead of JSON. __*Default*__: false\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**config**🔹 | <code>any</code> | Direct access to the eslint configuration (escape hatch).\n**ignorePatterns**🔹 | <code>Array<string></code> | File patterns that should not be linted.\n**overrides**🔹 | <code>Array<[javascript.EslintOverride](#projen-javascript-eslintoverride)></code> | eslint overrides.\n**rules**🔹 | <code>Map<string, Array<any>></code> | eslint rules.\n\n### Methods\n\n\n#### addExtends(...extendList)🔹 <a id=\"projen-javascript-eslint-addextends\"></a>\n\nAdds an `extends` item to the eslint configuration.\n\n```ts\naddExtends(...extendList: string[]): void\n```\n\n* **extendList** (<code>string</code>)  The list of \"extends\" to add.\n\n\n\n\n#### addIgnorePattern(pattern)🔹 <a id=\"projen-javascript-eslint-addignorepattern\"></a>\n\nDo not lint these files.\n\n```ts\naddIgnorePattern(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  *No description*\n\n\n\n\n#### addOverride(override)🔹 <a id=\"projen-javascript-eslint-addoverride\"></a>\n\nAdd an eslint override.\n\n```ts\naddOverride(override: EslintOverride): void\n```\n\n* **override** (<code>[javascript.EslintOverride](#projen-javascript-eslintoverride)</code>)  *No description*\n  * **files** (<code>Array<string></code>)  Files or file patterns on which to apply the override. \n  * **parser** (<code>string</code>)  The overridden parser. __*Optional*__\n  * **rules** (<code>Map<string, any></code>)  The overriden rules. __*Optional*__\n\n\n\n\n#### addPlugins(...plugins)🔹 <a id=\"projen-javascript-eslint-addplugins\"></a>\n\nAdds an eslint plugin.\n\n```ts\naddPlugins(...plugins: string[]): void\n```\n\n* **plugins** (<code>string</code>)  The names of plugins to add.\n\n\n\n\n#### addRules(rules)🔹 <a id=\"projen-javascript-eslint-addrules\"></a>\n\nAdd an eslint rule.\n\n```ts\naddRules(rules: Map<string, any>): void\n```\n\n* **rules** (<code>Map<string, any></code>)  *No description*\n\n\n\n\n#### allowDevDeps(pattern)🔹 <a id=\"projen-javascript-eslint-allowdevdeps\"></a>\n\nAdd a glob file pattern which allows importing dev dependencies.\n\n```ts\nallowDevDeps(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  glob pattern.\n\n\n\n\n#### *static* of(project)🔹 <a id=\"projen-javascript-eslint-of\"></a>\n\nReturns the singletone Eslint component of a project or undefined if there is none.\n\n```ts\nstatic of(project: Project): Eslint\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n__Returns__:\n* <code>[javascript.Eslint](#projen-javascript-eslint)</code>\n\n\n\n## class Jest 🔹 <a id=\"projen-javascript-jest\"></a>\n\nInstalls the following npm scripts:.\n\n- `test` will run `jest --passWithNoTests`\n- `test:watch` will run `jest --watch`\n- `test:update` will run `jest -u`\n\n__Submodule__: javascript\n\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.Jest(project: NodeProject, options?: JestOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  *No description*\n  * **configFilePath** (<code>string</code>)  Path to JSON config file for Jest. __*Default*__: No separate config file, jest settings are stored in package.json\n  * **coverage** (<code>boolean</code>)  Collect coverage. __*Default*__: true\n  * **coverageText** (<code>boolean</code>)  Include the `text` coverage reporter, which means that coverage summary is printed at the end of the jest execution. __*Default*__: true\n  * **extraCliOptions** (<code>Array<string></code>)  Additional options to pass to the Jest CLI invocation. __*Default*__: no extra options\n  * **ignorePatterns** (<code>Array<string></code>)  Defines `testPathIgnorePatterns` and `coveragePathIgnorePatterns`. __*Default*__: [\"/node_modules/\"]\n  * **jestConfig** (<code>[javascript.JestConfigOptions](#projen-javascript-jestconfigoptions)</code>)  Jest configuration. __*Default*__: default jest configuration\n  * **jestVersion** (<code>string</code>)  The version of jest to use. __*Default*__: installs the latest jest version\n  * **junitReporting** (<code>boolean</code>)  Result processing with jest-junit. __*Default*__: true\n  * **preserveDefaultReporters** (<code>boolean</code>)  Preserve the default Jest reporter when additional reporters are added. __*Default*__: true\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**config**🔹 | <code>any</code> | Escape hatch.\n**jestVersion**🔹 | <code>string</code> | <span></span>\n\n### Methods\n\n\n#### addIgnorePattern(pattern)🔹 <a id=\"projen-javascript-jest-addignorepattern\"></a>\n\n\n\n```ts\naddIgnorePattern(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  *No description*\n\n\n\n\n#### addReporter(reporter)🔹 <a id=\"projen-javascript-jest-addreporter\"></a>\n\n\n\n```ts\naddReporter(reporter: string &#124; json): void\n```\n\n* **reporter** (<code>string &#124; json</code>)  *No description*\n\n\n\n\n#### addSnapshotResolver(file)🔹 <a id=\"projen-javascript-jest-addsnapshotresolver\"></a>\n\n\n\n```ts\naddSnapshotResolver(file: string): void\n```\n\n* **file** (<code>string</code>)  *No description*\n\n\n\n\n#### addTestMatch(pattern)🔹 <a id=\"projen-javascript-jest-addtestmatch\"></a>\n\nAdds a test match pattern.\n\n```ts\naddTestMatch(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  glob pattern to match for tests.\n\n\n\n\n#### addWatchIgnorePattern(pattern)🔹 <a id=\"projen-javascript-jest-addwatchignorepattern\"></a>\n\nAdds a watch ignore pattern.\n\n```ts\naddWatchIgnorePattern(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  The pattern (regular expression).\n\n\n\n\n\n\n## class NodePackage 🔹 <a id=\"projen-javascript-nodepackage\"></a>\n\nRepresents the npm `package.json` file.\n\n__Submodule__: javascript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.NodePackage(project: Project, options?: NodePackageOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[javascript.NodePackageOptions](#projen-javascript-nodepackageoptions)</code>)  *No description*\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**allowLibraryDependencies**🔹 | <code>boolean</code> | Allow project to take library dependencies.\n**entrypoint**🔹 | <code>string</code> | The module's entrypoint (e.g. `lib/index.js`).\n**installAndUpdateLockfileCommand**🔹 | <code>string</code> | Renders `yarn install` or `npm install` with lockfile update (not frozen).\n**installCommand**🔹 | <code>string</code> | Returns the command to execute in order to install all dependencies (always frozen).\n**lockFile**🔹 | <code>string</code> | The name of the lock file.\n**manifest**⚠️ | <code>any</code> | <span></span>\n**npmAccess**🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | npm package access level.\n**npmRegistry**🔹 | <code>string</code> | The npm registry host (e.g. `registry.npmjs.org`).\n**npmRegistryUrl**🔹 | <code>string</code> | npm registry (e.g. `https://registry.npmjs.org`). Use `npmRegistryHost` to get just the host name.\n**packageManager**🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The package manager to use.\n**packageName**🔹 | <code>string</code> | The name of the npm package.\n**projenCommand**🔹 | <code>string</code> | The command which executes \"projen\".\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**license**?🔹 | <code>string</code> | The SPDX license of this module.<br/>__*Optional*__\n**maxNodeVersion**?🔹 | <code>string</code> | Maximum node version required by this pacakge.<br/>__*Default*__: no maximum.\n**minNodeVersion**?🔹 | <code>string</code> | Minimum node.js version required by this package.<br/>__*Default*__: no minimum\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Optional*__\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: undefined\n\n### Methods\n\n\n#### addBin(bins)🔹 <a id=\"projen-javascript-nodepackage-addbin\"></a>\n\n\n\n```ts\naddBin(bins: Map<string, string>): void\n```\n\n* **bins** (<code>Map<string, string></code>)  *No description*\n\n\n\n\n#### addBundledDeps(...deps)🔹 <a id=\"projen-javascript-nodepackage-addbundleddeps\"></a>\n\nDefines bundled dependencies.\n\nBundled dependencies will be added as normal dependencies as well as to the\n`bundledDependencies` section of your `package.json`.\n\n```ts\naddBundledDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addDeps(...deps)🔹 <a id=\"projen-javascript-nodepackage-adddeps\"></a>\n\nDefines normal dependencies.\n\n```ts\naddDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addDevDeps(...deps)🔹 <a id=\"projen-javascript-nodepackage-adddevdeps\"></a>\n\nDefines development/test dependencies.\n\n```ts\naddDevDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addEngine(engine, version)🔹 <a id=\"projen-javascript-nodepackage-addengine\"></a>\n\nAdds an `engines` requirement to your package.\n\n```ts\naddEngine(engine: string, version: string): void\n```\n\n* **engine** (<code>string</code>)  The engine (e.g. `node`).\n* **version** (<code>string</code>)  The semantic version requirement (e.g. `^10`).\n\n\n\n\n#### addField(name, value)🔹 <a id=\"projen-javascript-nodepackage-addfield\"></a>\n\nDirectly set fields in `package.json`.\n\n```ts\naddField(name: string, value: any): void\n```\n\n* **name** (<code>string</code>)  field name.\n* **value** (<code>any</code>)  field value.\n\n\n\n\n#### addKeywords(...keywords)🔹 <a id=\"projen-javascript-nodepackage-addkeywords\"></a>\n\nAdds keywords to package.json (deduplicated).\n\n```ts\naddKeywords(...keywords: string[]): void\n```\n\n* **keywords** (<code>string</code>)  The keywords to add.\n\n\n\n\n#### addPackageResolutions(...resolutions)🔹 <a id=\"projen-javascript-nodepackage-addpackageresolutions\"></a>\n\nDefines resolutions for dependencies to change the normally resolved version of a dependency to something else.\n\n```ts\naddPackageResolutions(...resolutions: string[]): void\n```\n\n* **resolutions** (<code>string</code>)  Names resolutions to be added.\n\n\n\n\n#### addPeerDeps(...deps)🔹 <a id=\"projen-javascript-nodepackage-addpeerdeps\"></a>\n\nDefines peer dependencies.\n\nWhen adding peer dependencies, a devDependency will also be added on the\npinned version of the declared peer. This will ensure that you are testing\nyour code against the minimum version required from your consumers.\n\n```ts\naddPeerDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addVersion(version)🔹 <a id=\"projen-javascript-nodepackage-addversion\"></a>\n\nSets the package version.\n\n```ts\naddVersion(version: string): void\n```\n\n* **version** (<code>string</code>)  Package version.\n\n\n\n\n#### hasScript(name)⚠️ <a id=\"projen-javascript-nodepackage-hasscript\"></a>\n\nIndicates if a script by the given name is defined.\n\n```ts\nhasScript(name: string): boolean\n```\n\n* **name** (<code>string</code>)  The name of the script.\n\n__Returns__:\n* <code>boolean</code>\n\n#### postSynthesize()🔹 <a id=\"projen-javascript-nodepackage-postsynthesize\"></a>\n\nCalled after synthesis.\n\nOrder is *not* guaranteed.\n\n```ts\npostSynthesize(): void\n```\n\n\n\n\n\n#### preSynthesize()🔹 <a id=\"projen-javascript-nodepackage-presynthesize\"></a>\n\nCalled before synthesis.\n\n```ts\npreSynthesize(): void\n```\n\n\n\n\n\n#### removeScript(name)🔹 <a id=\"projen-javascript-nodepackage-removescript\"></a>\n\nRemoves the npm script (always successful).\n\n```ts\nremoveScript(name: string): void\n```\n\n* **name** (<code>string</code>)  The name of the script.\n\n\n\n\n#### renderUpgradePackagesCommand(exclude, include?)🔹 <a id=\"projen-javascript-nodepackage-renderupgradepackagescommand\"></a>\n\nRender a package manager specific command to upgrade all requested dependencies.\n\n```ts\nrenderUpgradePackagesCommand(exclude: Array<string>, include?: Array<string>): string\n```\n\n* **exclude** (<code>Array<string></code>)  *No description*\n* **include** (<code>Array<string></code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n#### setScript(name, command)🔹 <a id=\"projen-javascript-nodepackage-setscript\"></a>\n\nOverride the contents of an npm package.json script.\n\n```ts\nsetScript(name: string, command: string): void\n```\n\n* **name** (<code>string</code>)  The script name.\n* **command** (<code>string</code>)  The command to execute.\n\n\n\n\n\n\n## class NodeProject 🔹 <a id=\"projen-javascript-nodeproject\"></a>\n\nNode.js project.\n\n__Submodule__: javascript\n\n__Extends__: [github.GitHubProject](#projen-github-githubproject)\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.NodeProject(options: NodeProjectOptions)\n```\n\n* **options** (<code>[javascript.NodeProjectOptions](#projen-javascript-nodeprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**allowLibraryDependencies**⚠️ | <code>boolean</code> | <span></span>\n**artifactsDirectory**🔹 | <code>string</code> | The build output directory.\n**artifactsJavascriptDirectory**🔹 | <code>string</code> | The location of the npm tarball after build (`${artifactsDirectory}/js`).\n**bundler**🔹 | <code>[javascript.Bundler](#projen-javascript-bundler)</code> | <span></span>\n**entrypoint**⚠️ | <code>string</code> | <span></span>\n**manifest**⚠️ | <code>any</code> | <span></span>\n**package**🔹 | <code>[javascript.NodePackage](#projen-javascript-nodepackage)</code> | API for managing the node package.\n**packageManager**⚠️ | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The package manager to use.\n**runScriptCommand**🔹 | <code>string</code> | The command to use to run scripts (e.g. `yarn run` or `npm run` depends on the package manager).\n**autoMerge**?🔹 | <code>[github.AutoMerge](#projen-github-automerge)</code> | Component that sets up mergify for merging approved pull requests.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>[build.BuildWorkflow](#projen-build-buildworkflow)</code> | The PR build GitHub workflow.<br/>__*Optional*__\n**buildWorkflowJobId**?🔹 | <code>string</code> | The job ID of the build workflow.<br/>__*Optional*__\n**jest**?🔹 | <code>[javascript.Jest](#projen-javascript-jest)</code> | The Jest configuration (if enabled).<br/>__*Optional*__\n**maxNodeVersion**?🔹 | <code>string</code> | Maximum node version required by this pacakge.<br/>__*Optional*__\n**minNodeVersion**?🔹 | <code>string</code> | Minimum node.js version required by this package.<br/>__*Optional*__\n**nodeVersion**?🔹 | <code>string</code> | __*Optional*__\n**npmignore**?🔹 | <code>[IgnoreFile](#projen-ignorefile)</code> | The .npmignore file.<br/>__*Optional*__\n**prettier**?🔹 | <code>[javascript.Prettier](#projen-javascript-prettier)</code> | __*Optional*__\n**publisher**?⚠️ | <code>[release.Publisher](#projen-release-publisher)</code> | Package publisher.<br/>__*Optional*__\n**release**?🔹 | <code>[release.Release](#projen-release-release)</code> | Release management.<br/>__*Optional*__\n**upgradeWorkflow**?🔹 | <code>[javascript.UpgradeDependencies](#projen-javascript-upgradedependencies)</code> | The upgrade workflow.<br/>__*Optional*__\n\n### Methods\n\n\n#### addBins(bins)🔹 <a id=\"projen-javascript-nodeproject-addbins\"></a>\n\n\n\n```ts\naddBins(bins: Map<string, string>): void\n```\n\n* **bins** (<code>Map<string, string></code>)  *No description*\n\n\n\n\n#### addBundledDeps(...deps)🔹 <a id=\"projen-javascript-nodeproject-addbundleddeps\"></a>\n\nDefines bundled dependencies.\n\nBundled dependencies will be added as normal dependencies as well as to the\n`bundledDependencies` section of your `package.json`.\n\n```ts\naddBundledDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addCompileCommand(...commands)⚠️ <a id=\"projen-javascript-nodeproject-addcompilecommand\"></a>\n\nDEPRECATED.\n\n```ts\naddCompileCommand(...commands: string[]): void\n```\n\n* **commands** (<code>string</code>)  *No description*\n\n\n\n\n#### addDeps(...deps)🔹 <a id=\"projen-javascript-nodeproject-adddeps\"></a>\n\nDefines normal dependencies.\n\n```ts\naddDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addDevDeps(...deps)🔹 <a id=\"projen-javascript-nodeproject-adddevdeps\"></a>\n\nDefines development/test dependencies.\n\n```ts\naddDevDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addFields(fields)🔹 <a id=\"projen-javascript-nodeproject-addfields\"></a>\n\nDirectly set fields in `package.json`.\n\n```ts\naddFields(fields: Map<string, any>): void\n```\n\n* **fields** (<code>Map<string, any></code>)  The fields to set.\n\n\n\n\n#### addKeywords(...keywords)🔹 <a id=\"projen-javascript-nodeproject-addkeywords\"></a>\n\nAdds keywords to package.json (deduplicated).\n\n```ts\naddKeywords(...keywords: string[]): void\n```\n\n* **keywords** (<code>string</code>)  The keywords to add.\n\n\n\n\n#### addPackageIgnore(pattern)🔹 <a id=\"projen-javascript-nodeproject-addpackageignore\"></a>\n\nExclude these files from the bundled package.\n\nImplemented by project types based on the\npackaging mechanism. For example, `NodeProject` delegates this to `.npmignore`.\n\n```ts\naddPackageIgnore(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  *No description*\n\n\n\n\n#### addPeerDeps(...deps)🔹 <a id=\"projen-javascript-nodeproject-addpeerdeps\"></a>\n\nDefines peer dependencies.\n\nWhen adding peer dependencies, a devDependency will also be added on the\npinned version of the declared peer. This will ensure that you are testing\nyour code against the minimum version required from your consumers.\n\n```ts\naddPeerDeps(...deps: string[]): void\n```\n\n* **deps** (<code>string</code>)  Names modules to install.\n\n\n\n\n#### addTestCommand(...commands)⚠️ <a id=\"projen-javascript-nodeproject-addtestcommand\"></a>\n\nDEPRECATED.\n\n```ts\naddTestCommand(...commands: string[]): void\n```\n\n* **commands** (<code>string</code>)  *No description*\n\n\n\n\n#### hasScript(name)🔹 <a id=\"projen-javascript-nodeproject-hasscript\"></a>\n\nIndicates if a script by the name name is defined.\n\n```ts\nhasScript(name: string): boolean\n```\n\n* **name** (<code>string</code>)  The name of the script.\n\n__Returns__:\n* <code>boolean</code>\n\n#### removeScript(name)🔹 <a id=\"projen-javascript-nodeproject-removescript\"></a>\n\nRemoves the npm script (always successful).\n\n```ts\nremoveScript(name: string): void\n```\n\n* **name** (<code>string</code>)  The name of the script.\n\n\n\n\n#### renderWorkflowSetup(options?)🔹 <a id=\"projen-javascript-nodeproject-renderworkflowsetup\"></a>\n\nReturns the set of workflow steps which should be executed to bootstrap a workflow.\n\n```ts\nrenderWorkflowSetup(options?: RenderWorkflowSetupOptions): Array<JobStep>\n```\n\n* **options** (<code>[javascript.RenderWorkflowSetupOptions](#projen-javascript-renderworkflowsetupoptions)</code>)  Options.\n  * **mutable** (<code>boolean</code>)  Should the pacakge lockfile be updated? __*Default*__: false\n\n__Returns__:\n* <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>\n\n#### runTaskCommand(task)🔹 <a id=\"projen-javascript-nodeproject-runtaskcommand\"></a>\n\nReturns the shell command to execute in order to run a task.\n\nThis will\ntypically be `npx projen TASK`.\n\n```ts\nrunTaskCommand(task: Task): string\n```\n\n* **task** (<code>[Task](#projen-task)</code>)  The task for which the command is required.\n\n__Returns__:\n* <code>string</code>\n\n#### setScript(name, command)🔹 <a id=\"projen-javascript-nodeproject-setscript\"></a>\n\nReplaces the contents of an npm package.json script.\n\n```ts\nsetScript(name: string, command: string): void\n```\n\n* **name** (<code>string</code>)  The script name.\n* **command** (<code>string</code>)  The command to execute.\n\n\n\n\n\n\n## class NpmConfig 🔹 <a id=\"projen-javascript-npmconfig\"></a>\n\nFile representing the local NPM config in .npmrc.\n\n__Submodule__: javascript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.NpmConfig(project: NodeProject, options?: NpmConfigOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[javascript.NpmConfigOptions](#projen-javascript-npmconfigoptions)</code>)  *No description*\n  * **registry** (<code>string</code>)  URL of the registry mirror to use. __*Default*__: use npmjs default registry\n\n\n### Methods\n\n\n#### addConfig(name, value)🔹 <a id=\"projen-javascript-npmconfig-addconfig\"></a>\n\nconfigure a generic property.\n\n```ts\naddConfig(name: string, value: string): void\n```\n\n* **name** (<code>string</code>)  the name of the property.\n* **value** (<code>string</code>)  the value of the property.\n\n\n\n\n#### addRegistry(url, scope?)🔹 <a id=\"projen-javascript-npmconfig-addregistry\"></a>\n\nconfigure a scoped registry.\n\n```ts\naddRegistry(url: string, scope?: string): void\n```\n\n* **url** (<code>string</code>)  the URL of the registry to use.\n* **scope** (<code>string</code>)  the scope the registry is used for;\n\n\n\n\n\n\n## class Prettier 🔹 <a id=\"projen-javascript-prettier\"></a>\n\nRepresents prettier configuration.\n\n__Submodule__: javascript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.Prettier(project: NodeProject, options: PrettierOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  *No description*\n  * **ignoreFile** (<code>boolean</code>)  Defines an .prettierIgnore file. __*Default*__: true\n  * **overrides** (<code>Array<[javascript.PrettierOverride](#projen-javascript-prettieroverride)></code>)  Provide a list of patterns to override prettier configuration. __*Default*__: []\n  * **settings** (<code>[javascript.PrettierSettings](#projen-javascript-prettiersettings)</code>)  Prettier settings. __*Default*__: default settings\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**overrides**🔹 | <code>Array<[javascript.PrettierOverride](#projen-javascript-prettieroverride)></code> | Access to the Prettieroverrides to extend those.\n**settings**🔹 | <code>[javascript.PrettierSettings](#projen-javascript-prettiersettings)</code> | Direct access to the prettier settings.\n**ignoreFile**?🔹 | <code>[IgnoreFile](#projen-ignorefile)</code> | The .prettierIgnore file.<br/>__*Optional*__\n\n### Methods\n\n\n#### addIgnorePattern(pattern)🔹 <a id=\"projen-javascript-prettier-addignorepattern\"></a>\n\nDefines Prettier ignore Patterns these patterns will be added to the file .prettierignore.\n\n```ts\naddIgnorePattern(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  filepatterns so exclude from prettier formatting.\n\n\n\n\n#### addOverride(override)🔹 <a id=\"projen-javascript-prettier-addoverride\"></a>\n\nAdd a prettier override.\n\n```ts\naddOverride(override: PrettierOverride): void\n```\n\n* **override** (<code>[javascript.PrettierOverride](#projen-javascript-prettieroverride)</code>)  *No description*\n  * **files** (<code>string &#124; Array<string></code>)  Include these files in this override. \n  * **settings** (<code>[javascript.PrettierSettings](#projen-javascript-prettiersettings)</code>)  The options to apply for this override. \n  * **excludeFiles** (<code>string &#124; Array<string></code>)  Exclude these files from this override. __*Optional*__\n\n\n\n\n#### preSynthesize()🔹 <a id=\"projen-javascript-prettier-presynthesize\"></a>\n\nCalled before synthesis.\n\n```ts\npreSynthesize(): void\n```\n\n\n\n\n\n#### *static* of(project)🔹 <a id=\"projen-javascript-prettier-of\"></a>\n\n\n\n```ts\nstatic of(project: Project): Prettier\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n__Returns__:\n* <code>[javascript.Prettier](#projen-javascript-prettier)</code>\n\n\n\n## class Projenrc 🔹 <a id=\"projen-javascript-projenrc\"></a>\n\nSets up a javascript project to use TypeScript for projenrc.\n\n__Submodule__: javascript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.Projenrc(project: Project, options?: ProjenrcOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  *No description*\n  * **filename** (<code>string</code>)  The name of the projenrc file. __*Default*__: \".projenrc.js\"\n\n\n\n\n## class TypescriptConfig 🔹 <a id=\"projen-javascript-typescriptconfig\"></a>\n\n\n\n__Submodule__: javascript\n\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.TypescriptConfig(project: NodeProject, options: TypescriptConfigOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  *No description*\n  * **compilerOptions** (<code>[javascript.TypeScriptCompilerOptions](#projen-javascript-typescriptcompileroptions)</code>)  Compiler options to use. \n  * **exclude** (<code>Array<string></code>)  Filters results from the \"include\" option. __*Default*__: node_modules is excluded by default\n  * **fileName** (<code>string</code>)  *No description* __*Default*__: \"tsconfig.json\"\n  * **include** (<code>Array<string></code>)  Specifies a list of glob patterns that match TypeScript files to be included in compilation. __*Default*__: all .ts files recursively\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**compilerOptions**🔹 | <code>[javascript.TypeScriptCompilerOptions](#projen-javascript-typescriptcompileroptions)</code> | <span></span>\n**exclude**🔹 | <code>Array<string></code> | <span></span>\n**file**🔹 | <code>[JsonFile](#projen-jsonfile)</code> | <span></span>\n**fileName**🔹 | <code>string</code> | <span></span>\n**include**🔹 | <code>Array<string></code> | <span></span>\n\n### Methods\n\n\n#### addExclude(pattern)🔹 <a id=\"projen-javascript-typescriptconfig-addexclude\"></a>\n\n\n\n```ts\naddExclude(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  *No description*\n\n\n\n\n#### addInclude(pattern)🔹 <a id=\"projen-javascript-typescriptconfig-addinclude\"></a>\n\n\n\n```ts\naddInclude(pattern: string): void\n```\n\n* **pattern** (<code>string</code>)  *No description*\n\n\n\n\n\n\n## class UpgradeDependencies 🔹 <a id=\"projen-javascript-upgradedependencies\"></a>\n\nUpgrade node project dependencies.\n\n__Submodule__: javascript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew javascript.UpgradeDependencies(project: NodeProject, options?: UpgradeDependenciesOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  *No description*\n  * **exclude** (<code>Array<string></code>)  List of package names to exclude during the upgrade. __*Default*__: Nothing is excluded.\n  * **include** (<code>Array<string></code>)  List of package names to include during the upgrade. __*Default*__: Everything is included.\n  * **pullRequestTitle** (<code>string</code>)  Title of the pull request to use (should be all lower-case). __*Default*__: \"upgrade dependencies\"\n  * **signoff** (<code>boolean</code>)  Add Signed-off-by line by the committer at the end of the commit log message. __*Default*__: true\n  * **taskName** (<code>string</code>)  The name of the task that will be created. __*Default*__: \"upgrade\".\n  * **workflow** (<code>boolean</code>)  Include a github workflow for creating PR's that upgrades the required dependencies, either by manual dispatch, or by a schedule. __*Default*__: true for root projects, false for sub-projects.\n  * **workflowOptions** (<code>[javascript.UpgradeDependenciesWorkflowOptions](#projen-javascript-upgradedependenciesworkflowoptions)</code>)  Options for the github workflow. __*Default*__: default options.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**postUpgradeTask**🔹 | <code>[Task](#projen-task)</code> | A task run after the upgrade task.\n**upgradeTask**🔹 | <code>[Task](#projen-task)</code> | The upgrade task.\n**workflows**🔹 | <code>Array<[github.GithubWorkflow](#projen-github-githubworkflow)></code> | The workflows that execute the upgrades.\n**containerOptions**?🔹 | <code>[github.workflows.ContainerOptions](#projen-github-workflows-containeroptions)</code> | Container definitions for the upgrade workflow.<br/>__*Optional*__\n\n### Methods\n\n\n#### addPostBuildSteps(...steps)🔹 <a id=\"projen-javascript-upgradedependencies-addpostbuildsteps\"></a>\n\nAdd steps to execute a successful build.\n\n```ts\naddPostBuildSteps(...steps: JobStep[]): void\n```\n\n* **steps** (<code>[github.workflows.JobStep](#projen-github-workflows-jobstep)</code>)  workflow steps.\n  * **env** (<code>Map<string, string></code>)  Sets environment variables for steps to use in the runner environment. __*Optional*__\n  * **id** (<code>string</code>)  A unique identifier for the step. __*Optional*__\n  * **if** (<code>string</code>)  You can use the if conditional to prevent a job from running unless a condition is met. __*Optional*__\n  * **name** (<code>string</code>)  A name for your step to display on GitHub. __*Optional*__\n  * **run** (<code>string</code>)  Runs command-line programs using the operating system's shell. __*Optional*__\n  * **uses** (<code>string</code>)  Selects an action to run as part of a step in your job. __*Optional*__\n  * **with** (<code>Map<string, any></code>)  A map of the input parameters defined by the action. __*Optional*__\n  * **continueOnError** (<code>boolean</code>)  Prevents a job from failing when a step fails. __*Optional*__\n  * **timeoutMinutes** (<code>number</code>)  The maximum number of minutes to run the step before killing the process. __*Optional*__\n\n\n\n\n\n\n## class UpgradeDependenciesSchedule 🔹 <a id=\"projen-javascript-upgradedependenciesschedule\"></a>\n\nHow often to check for new versions and raise pull requests for version upgrades.\n\n__Submodule__: javascript\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**cron**🔹 | <code>Array<string></code> | <span></span>\n*static* **DAILY**🔹 | <code>[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)</code> | At 00:00.\n*static* **MONTHLY**🔹 | <code>[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)</code> | At 00:00 on day-of-month 1.\n*static* **NEVER**🔹 | <code>[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)</code> | Disables automatic upgrades.\n*static* **WEEKDAY**🔹 | <code>[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)</code> | At 00:00 on every day-of-week from Monday through Friday.\n*static* **WEEKLY**🔹 | <code>[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)</code> | At 00:00 on Monday.\n\n### Methods\n\n\n#### *static* expressions(cron)🔹 <a id=\"projen-javascript-upgradedependenciesschedule-expressions\"></a>\n\nCreate a schedule from a raw cron expression.\n\n```ts\nstatic expressions(cron: Array<string>): UpgradeDependenciesSchedule\n```\n\n* **cron** (<code>Array<string></code>)  *No description*\n\n__Returns__:\n* <code>[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)</code>\n\n\n\n## class Pip 🔹 <a id=\"projen-python-pip\"></a>\n\nManages dependencies using a requirements.txt file and the pip CLI tool.\n\n__Implements__: [python.IPythonDeps](#projen-python-ipythondeps)\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.Pip(project: Project, _options?: PipOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **_options** (<code>[python.PipOptions](#projen-python-pipoptions)</code>)  *No description*\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**installTask**🔹 | <code>[Task](#projen-task)</code> | A task that installs and updates dependencies.\n\n### Methods\n\n\n#### addDependency(spec)🔹 <a id=\"projen-python-pip-adddependency\"></a>\n\nAdds a runtime dependency.\n\n```ts\naddDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### addDevDependency(spec)🔹 <a id=\"projen-python-pip-adddevdependency\"></a>\n\nAdds a dev dependency.\n\n```ts\naddDevDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### installDependencies()🔹 <a id=\"projen-python-pip-installdependencies\"></a>\n\nInstalls dependencies (called during post-synthesis).\n\n```ts\ninstallDependencies(): void\n```\n\n\n\n\n\n\n\n## class Poetry 🔹 <a id=\"projen-python-poetry\"></a>\n\nManage project dependencies, virtual environments, and packaging through the poetry CLI tool.\n\n__Implements__: [python.IPythonDeps](#projen-python-ipythondeps), [python.IPythonEnv](#projen-python-ipythonenv), [python.IPythonPackaging](#projen-python-ipythonpackaging)\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.Poetry(project: Project, options: PythonPackagingOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.PythonPackagingOptions](#projen-python-pythonpackagingoptions)</code>)  *No description*\n  * **authorEmail** (<code>string</code>)  Author's e-mail. \n  * **authorName** (<code>string</code>)  Author's name. \n  * **version** (<code>string</code>)  Version of the package. \n  * **classifiers** (<code>Array<string></code>)  A list of PyPI trove classifiers that describe the project. __*Optional*__\n  * **description** (<code>string</code>)  A short description of the package. __*Optional*__\n  * **homepage** (<code>string</code>)  A URL to the website of the project. __*Optional*__\n  * **license** (<code>string</code>)  License of this package as an SPDX identifier. __*Optional*__\n  * **packageName** (<code>string</code>)  Package name. __*Optional*__\n  * **poetryOptions** (<code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code>)  Additional options to set for poetry if using poetry. __*Optional*__\n  * **setupConfig** (<code>Map<string, any></code>)  Additional fields to pass in the setup() function if using setuptools. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**installTask**🔹 | <code>[Task](#projen-task)</code> | A task that installs and updates dependencies.\n**publishTask**🔹 | <code>[Task](#projen-task)</code> | A task that uploads the package to a package repository.\n**publishTestTask**🔹 | <code>[Task](#projen-task)</code> | A task that uploads the package to the Test PyPI repository.\n\n### Methods\n\n\n#### addDependency(spec)🔹 <a id=\"projen-python-poetry-adddependency\"></a>\n\nAdds a runtime dependency.\n\n```ts\naddDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### addDevDependency(spec)🔹 <a id=\"projen-python-poetry-adddevdependency\"></a>\n\nAdds a dev dependency.\n\n```ts\naddDevDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### installDependencies()🔹 <a id=\"projen-python-poetry-installdependencies\"></a>\n\nInstalls dependencies (called during post-synthesis).\n\n```ts\ninstallDependencies(): void\n```\n\n\n\n\n\n#### setupEnvironment()🔹 <a id=\"projen-python-poetry-setupenvironment\"></a>\n\nInitializes the virtual environment if it doesn't exist (called during post-synthesis).\n\n```ts\nsetupEnvironment(): void\n```\n\n\n\n\n\n\n\n## class PoetryPyproject 🔹 <a id=\"projen-python-poetrypyproject\"></a>\n\nRepresents configuration of a pyproject.toml file for a Poetry project.\n\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.PoetryPyproject(project: Project, options: PoetryPyprojectOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.PoetryPyprojectOptions](#projen-python-poetrypyprojectoptions)</code>)  *No description*\n  * **authors** (<code>Array<string></code>)  The authors of the package. __*Optional*__\n  * **classifiers** (<code>Array<string></code>)  A list of PyPI trove classifiers that describe the project. __*Optional*__\n  * **description** (<code>string</code>)  A short description of the package (required). __*Optional*__\n  * **documentation** (<code>string</code>)  A URL to the documentation of the project. __*Optional*__\n  * **exclude** (<code>Array<string></code>)  A list of patterns that will be excluded in the final package. __*Optional*__\n  * **extras** (<code>Map<string, Array<string>></code>)  Package extras. __*Optional*__\n  * **homepage** (<code>string</code>)  A URL to the website of the project. __*Optional*__\n  * **include** (<code>Array<string></code>)  A list of patterns that will be included in the final package. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  A list of keywords (max: 5) that the package is related to. __*Optional*__\n  * **license** (<code>string</code>)  License of this package as an SPDX identifier. __*Optional*__\n  * **maintainers** (<code>Array<string></code>)  the maintainers of the package. __*Optional*__\n  * **name** (<code>string</code>)  Name of the package (required). __*Optional*__\n  * **packages** (<code>Array<any></code>)  A list of packages and modules to include in the final distribution. __*Optional*__\n  * **plugins** (<code>any</code>)  Plugins. __*Optional*__\n  * **readme** (<code>string</code>)  The name of the readme file of the package. __*Optional*__\n  * **repository** (<code>string</code>)  A URL to the repository of the project. __*Optional*__\n  * **scripts** (<code>Map<string, any></code>)  The scripts or executables that will be installed when installing the package. __*Optional*__\n  * **source** (<code>Array<any></code>)  Source registries from which packages are retrieved. __*Optional*__\n  * **urls** (<code>Map<string, string></code>)  Project custom URLs, in addition to homepage, repository and documentation. __*Optional*__\n  * **version** (<code>string</code>)  Version of the package (required). __*Optional*__\n  * **dependencies** (<code>Map<string, any></code>)  A list of dependencies for the project. __*Optional*__\n  * **devDependencies** (<code>Map<string, any></code>)  A list of development dependencies for the project. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**file**🔹 | <code>[TomlFile](#projen-tomlfile)</code> | <span></span>\n\n\n\n## class Projenrc 🔹 <a id=\"projen-python-projenrc\"></a>\n\nAllows writing projenrc files in python.\n\nThis will install `projen` as a Python dependency and will add a\n`synth` task which will run `.projenrc.py`.\n\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.Projenrc(project: Project, options?: ProjenrcOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.ProjenrcOptions](#projen-python-projenrcoptions)</code>)  *No description*\n  * **filename** (<code>string</code>)  The name of the projenrc file. __*Default*__: \".projenrc.py\"\n  * **projenVersion** (<code>string</code>)  The projen version to use. __*Default*__: current version\n\n\n\n\n## class Pytest 🔹 <a id=\"projen-python-pytest\"></a>\n\n\n\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.Pytest(project: Project, options?: PytestOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.PytestOptions](#projen-python-pytestoptions)</code>)  *No description*\n  * **maxFailures** (<code>number</code>)  Stop the testing process after the first N failures. __*Optional*__\n  * **testdir** (<code>string</code>)  Directory with tests. __*Default*__: 'tests'\n  * **version** (<code>string</code>)  Pytest version. __*Default*__: \"6.2.1\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**testdir**🔹 | <code>string</code> | <span></span>\n\n\n\n## class PytestSample 🔹 <a id=\"projen-python-pytestsample\"></a>\n\nPython test code sample.\n\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.PytestSample(project: Project, options: PytestSampleOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.PytestSampleOptions](#projen-python-pytestsampleoptions)</code>)  *No description*\n  * **moduleName** (<code>string</code>)  Name of the python package as used in imports and filenames. \n  * **testdir** (<code>string</code>)  Test directory. \n\n\n\n\n## class PythonProject 🔹 <a id=\"projen-python-pythonproject\"></a>\n\nPython project.\n\n__Submodule__: python\n\n__Extends__: [github.GitHubProject](#projen-github-githubproject)\n\n### Initializer\n\n\n\n\n```ts\nnew python.PythonProject(options: PythonProjectOptions)\n```\n\n* **options** (<code>[python.PythonProjectOptions](#projen-python-pythonprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. \n  * **authorName** (<code>string</code>)  Author's name. \n  * **version** (<code>string</code>)  Version of the package. \n  * **classifiers** (<code>Array<string></code>)  A list of PyPI trove classifiers that describe the project. __*Optional*__\n  * **description** (<code>string</code>)  A short description of the package. __*Optional*__\n  * **homepage** (<code>string</code>)  A URL to the website of the project. __*Optional*__\n  * **license** (<code>string</code>)  License of this package as an SPDX identifier. __*Optional*__\n  * **packageName** (<code>string</code>)  Package name. __*Optional*__\n  * **poetryOptions** (<code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code>)  Additional options to set for poetry if using poetry. __*Optional*__\n  * **setupConfig** (<code>Map<string, any></code>)  Additional fields to pass in the setup() function if using setuptools. __*Optional*__\n  * **moduleName** (<code>string</code>)  Name of the python package as used in imports and filenames. \n  * **deps** (<code>Array<string></code>)  List of runtime dependencies for this project. __*Default*__: []\n  * **devDeps** (<code>Array<string></code>)  List of dev dependencies for this project. __*Default*__: []\n  * **pip** (<code>boolean</code>)  Use pip with a requirements.txt file to track project dependencies. __*Default*__: true\n  * **poetry** (<code>boolean</code>)  Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing. __*Default*__: false\n  * **projenrcJs** (<code>boolean</code>)  Use projenrc in javascript. __*Default*__: false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options related to projenrc in JavaScript. __*Default*__: default options\n  * **projenrcPython** (<code>boolean</code>)  Use projenrc in Python. __*Default*__: true\n  * **projenrcPythonOptions** (<code>[python.ProjenrcOptions](#projen-python-projenrcoptions)</code>)  Options related to projenrc in python. __*Default*__: default options\n  * **pytest** (<code>boolean</code>)  Include pytest tests. __*Default*__: true\n  * **pytestOptions** (<code>[python.PytestOptions](#projen-python-pytestoptions)</code>)  pytest options. __*Default*__: defaults\n  * **sample** (<code>boolean</code>)  Include sample code and test if the relevant directories don't exist. __*Default*__: true\n  * **setuptools** (<code>boolean</code>)  Use setuptools with a setup.py script for packaging and publishing. __*Default*__: true if the project type is library\n  * **venv** (<code>boolean</code>)  Use venv to manage a virtual environment for installing dependencies inside. __*Default*__: true\n  * **venvOptions** (<code>[python.VenvOptions](#projen-python-venvoptions)</code>)  Venv options. __*Default*__: defaults\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**depsManager**🔹 | <code>[python.IPythonDeps](#projen-python-ipythondeps)</code> | API for managing dependencies.\n**envManager**🔹 | <code>[python.IPythonEnv](#projen-python-ipythonenv)</code> | API for mangaging the Python runtime environment.\n**moduleName**🔹 | <code>string</code> | Python module name (the project name, with any hyphens or periods replaced with underscores).\n**version**🔹 | <code>string</code> | Version of the package for distribution (should follow semver).\n**packagingManager**?🔹 | <code>[python.IPythonPackaging](#projen-python-ipythonpackaging)</code> | API for managing packaging the project as a library.<br/>__*Optional*__\n**pytest**?🔹 | <code>[python.Pytest](#projen-python-pytest)</code> | Pytest component.<br/>__*Optional*__\n\n### Methods\n\n\n#### addDependency(spec)🔹 <a id=\"projen-python-pythonproject-adddependency\"></a>\n\nAdds a runtime dependency.\n\n```ts\naddDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### addDevDependency(spec)🔹 <a id=\"projen-python-pythonproject-adddevdependency\"></a>\n\nAdds a dev dependency.\n\n```ts\naddDevDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### postSynthesize()🔹 <a id=\"projen-python-pythonproject-postsynthesize\"></a>\n\nCalled after all components are synthesized.\n\nOrder is *not* guaranteed.\n\n```ts\npostSynthesize(): void\n```\n\n\n\n\n\n\n\n## class PythonSample 🔹 <a id=\"projen-python-pythonsample\"></a>\n\nPython code sample.\n\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.PythonSample(project: Project, options: PythonSampleOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.PythonSampleOptions](#projen-python-pythonsampleoptions)</code>)  *No description*\n  * **dir** (<code>string</code>)  Sample code directory. \n\n\n\n\n## class RequirementsFile 🔹 <a id=\"projen-python-requirementsfile\"></a>\n\nSpecifies a list of packages to be installed using pip.\n\n__Submodule__: python\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\n\n\n```ts\nnew python.RequirementsFile(project: Project, filePath: string, options: RequirementsFileOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[python.RequirementsFileOptions](#projen-python-requirementsfileoptions)</code>)  *No description*\n  * **packageProvider** (<code>[python.IPackageProvider](#projen-python-ipackageprovider)</code>)  Provide a list of packages that can be dynamically updated. __*Optional*__\n\n\n### Methods\n\n\n#### addPackages(...packages)🔹 <a id=\"projen-python-requirementsfile-addpackages\"></a>\n\nAdds the specified packages provided in semver format.\n\nComment lines (start with `#`) are ignored.\n\n```ts\naddPackages(...packages: string[]): void\n```\n\n* **packages** (<code>string</code>)  Package version in format `<module>@<semver>`.\n\n\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-python-requirementsfile-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class SetupPy 🔹 <a id=\"projen-python-setuppy\"></a>\n\nPython packaging script where package metadata can be placed.\n\n__Submodule__: python\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\n\n\n```ts\nnew python.SetupPy(project: Project, options: SetupPyOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.SetupPyOptions](#projen-python-setuppyoptions)</code>)  *No description*\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **classifiers** (<code>Array<string></code>)  A list of PyPI trove classifiers that describe the project. __*Optional*__\n  * **description** (<code>string</code>)  A short project description. __*Optional*__\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **license** (<code>string</code>)  The project license. __*Optional*__\n  * **name** (<code>string</code>)  Name of the package. __*Optional*__\n  * **packages** (<code>Array<string></code>)  List of submodules to be packaged. __*Optional*__\n  * **version** (<code>string</code>)  Manually specify package version. __*Optional*__\n\n\n### Methods\n\n\n#### protected synthesizeContent(resolver)🔹 <a id=\"projen-python-setuppy-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(resolver: IResolver): string\n```\n\n* **resolver** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class Setuptools 🔹 <a id=\"projen-python-setuptools\"></a>\n\nManages packaging through setuptools with a setup.py script.\n\n__Implements__: [python.IPythonPackaging](#projen-python-ipythonpackaging)\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.Setuptools(project: Project, options: PythonPackagingOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.PythonPackagingOptions](#projen-python-pythonpackagingoptions)</code>)  *No description*\n  * **authorEmail** (<code>string</code>)  Author's e-mail. \n  * **authorName** (<code>string</code>)  Author's name. \n  * **version** (<code>string</code>)  Version of the package. \n  * **classifiers** (<code>Array<string></code>)  A list of PyPI trove classifiers that describe the project. __*Optional*__\n  * **description** (<code>string</code>)  A short description of the package. __*Optional*__\n  * **homepage** (<code>string</code>)  A URL to the website of the project. __*Optional*__\n  * **license** (<code>string</code>)  License of this package as an SPDX identifier. __*Optional*__\n  * **packageName** (<code>string</code>)  Package name. __*Optional*__\n  * **poetryOptions** (<code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code>)  Additional options to set for poetry if using poetry. __*Optional*__\n  * **setupConfig** (<code>Map<string, any></code>)  Additional fields to pass in the setup() function if using setuptools. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**publishTask**🔹 | <code>[Task](#projen-task)</code> | A task that uploads the package to a package repository.\n**publishTestTask**🔹 | <code>[Task](#projen-task)</code> | A task that uploads the package to the Test PyPI repository.\n\n\n\n## class Venv 🔹 <a id=\"projen-python-venv\"></a>\n\nManages a virtual environment through the Python venv module.\n\n__Implements__: [python.IPythonEnv](#projen-python-ipythonenv)\n__Submodule__: python\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew python.Venv(project: Project, options?: VenvOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[python.VenvOptions](#projen-python-venvoptions)</code>)  *No description*\n  * **envdir** (<code>string</code>)  Name of directory to store the environment in. __*Default*__: \".env\"\n\n\n### Methods\n\n\n#### setupEnvironment()🔹 <a id=\"projen-python-venv-setupenvironment\"></a>\n\nInitializes the virtual environment if it doesn't exist (called during post-synthesis).\n\n```ts\nsetupEnvironment(): void\n```\n\n\n\n\n\n\n\n## class Publisher 🔹 <a id=\"projen-release-publisher\"></a>\n\nImplements GitHub jobs for publishing modules to package managers.\n\nUnder the hood, it uses https://github.com/aws/publib\n\n__Submodule__: release\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew release.Publisher(project: Project, options: PublisherOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[release.PublisherOptions](#projen-release-publisheroptions)</code>)  *No description*\n  * **artifactName** (<code>string</code>)  The name of the artifact to download (e.g. `dist`). \n  * **buildJobId** (<code>string</code>)  The job ID that produces the build artifacts. \n  * **condition** (<code>string</code>)  A GitHub workflow expression used as a condition for publishers. __*Default*__: no condition\n  * **dryRun** (<code>boolean</code>)  Do not actually publish, only print the commands that would be executed instead. __*Optional*__\n  * **failureIssue** (<code>boolean</code>)  Create an issue when a publish task fails. __*Default*__: false\n  * **failureIssueLabel** (<code>string</code>)  The label to apply to the issue marking failed publish tasks. __*Default*__: \"failed-release\"\n  * **jsiiReleaseVersion** (<code>string</code>)  *No description* __*Optional*__\n  * **publibVersion** (<code>string</code>)  Version requirement for `publib`. __*Default*__: \"latest\"\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **workflowNodeVersion** (<code>string</code>)  Node version to setup in GitHub workflows if any node-based CLI utilities are needed. __*Default*__: 14.x\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**artifactName**🔹 | <code>string</code> | <span></span>\n**buildJobId**🔹 | <code>string</code> | <span></span>\n**jsiiReleaseVersion**⚠️ | <code>string</code> | <span></span>\n**publibVersion**🔹 | <code>string</code> | <span></span>\n**condition**?🔹 | <code>string</code> | __*Optional*__\n*static* **PUBLISH_GIT_TASK_NAME**🔹 | <code>string</code> | <span></span>\n\n### Methods\n\n\n#### addGitHubPrePublishingSteps(...steps)🔹 <a id=\"projen-release-publisher-addgithubprepublishingsteps\"></a>\n\nAdds pre publishing steps for the GitHub release job.\n\n```ts\naddGitHubPrePublishingSteps(...steps: JobStep[]): void\n```\n\n* **steps** (<code>[github.workflows.JobStep](#projen-github-workflows-jobstep)</code>)  The steps.\n  * **env** (<code>Map<string, string></code>)  Sets environment variables for steps to use in the runner environment. __*Optional*__\n  * **id** (<code>string</code>)  A unique identifier for the step. __*Optional*__\n  * **if** (<code>string</code>)  You can use the if conditional to prevent a job from running unless a condition is met. __*Optional*__\n  * **name** (<code>string</code>)  A name for your step to display on GitHub. __*Optional*__\n  * **run** (<code>string</code>)  Runs command-line programs using the operating system's shell. __*Optional*__\n  * **uses** (<code>string</code>)  Selects an action to run as part of a step in your job. __*Optional*__\n  * **with** (<code>Map<string, any></code>)  A map of the input parameters defined by the action. __*Optional*__\n  * **continueOnError** (<code>boolean</code>)  Prevents a job from failing when a step fails. __*Optional*__\n  * **timeoutMinutes** (<code>number</code>)  The maximum number of minutes to run the step before killing the process. __*Optional*__\n\n\n\n\n#### publishToGit(options)🔹 <a id=\"projen-release-publisher-publishtogit\"></a>\n\nPublish to git.\n\nThis includes generating a project-level changelog and release tags.\n\n```ts\npublishToGit(options: GitPublishOptions): Task\n```\n\n* **options** (<code>[release.GitPublishOptions](#projen-release-gitpublishoptions)</code>)  Options.\n  * **changelogFile** (<code>string</code>)  The location of an .md file (relative to `dist/`) that includes the changelog for the release. \n  * **releaseTagFile** (<code>string</code>)  The location of a text file (relative to `dist/`) that contains the release tag. \n  * **versionFile** (<code>string</code>)  The location of a text file (relative to `dist/`) that contains the version number. \n  * **gitBranch** (<code>string</code>)  Branch to push to. __*Default*__: \"main\"\n  * **gitPushCommand** (<code>string</code>)  Override git-push command. __*Optional*__\n  * **projectChangelogFile** (<code>string</code>)  The location of an .md file that includes the project-level changelog. __*Optional*__\n\n__Returns__:\n* <code>[Task](#projen-task)</code>\n\n#### publishToGitHubReleases(options)🔹 <a id=\"projen-release-publisher-publishtogithubreleases\"></a>\n\nCreates a GitHub Release.\n\n```ts\npublishToGitHubReleases(options: GitHubReleasesPublishOptions): void\n```\n\n* **options** (<code>[release.GitHubReleasesPublishOptions](#projen-release-githubreleasespublishoptions)</code>)  Options.\n  * **prePublishSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede. __*Optional*__\n  * **publishTools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Additional tools to install in the publishing job. __*Default*__: no additional tools are installed\n  * **changelogFile** (<code>string</code>)  The location of an .md file (relative to `dist/`) that includes the changelog for the release. \n  * **releaseTagFile** (<code>string</code>)  The location of a text file (relative to `dist/`) that contains the release tag. \n  * **versionFile** (<code>string</code>)  The location of a text file (relative to `dist/`) that contains the version number. \n\n\n\n\n#### publishToGo(options?)🔹 <a id=\"projen-release-publisher-publishtogo\"></a>\n\nAdds a go publishing job.\n\n```ts\npublishToGo(options?: GoPublishOptions): void\n```\n\n* **options** (<code>[release.GoPublishOptions](#projen-release-gopublishoptions)</code>)  Options.\n  * **prePublishSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede. __*Optional*__\n  * **publishTools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Additional tools to install in the publishing job. __*Default*__: no additional tools are installed\n  * **gitBranch** (<code>string</code>)  Branch to push to. __*Default*__: \"main\"\n  * **gitCommitMessage** (<code>string</code>)  The commit message. __*Default*__: \"chore(release): $VERSION\"\n  * **githubDeployKeySecret** (<code>string</code>)  The name of the secret that includes a GitHub deploy key used to push to the GitHub repository. __*Default*__: \"GO_GITHUB_DEPLOY_KEY\"\n  * **githubRepo** (<code>string</code>)  GitHub repository to push to. __*Default*__: derived from `moduleName`\n  * **githubTokenSecret** (<code>string</code>)  The name of the secret that includes a personal GitHub access token used to push to the GitHub repository. __*Default*__: \"GO_GITHUB_TOKEN\"\n  * **githubUseSsh** (<code>boolean</code>)  Use SSH to push to GitHub instead of a personal accses token. __*Default*__: false\n  * **gitUserEmail** (<code>string</code>)  The email to use in the release git commit. __*Default*__: \"github-actions\n  * **gitUserName** (<code>string</code>)  The user name to use for the release git commit. __*Default*__: \"github-actions\"\n\n\n\n\n#### publishToMaven(options?)🔹 <a id=\"projen-release-publisher-publishtomaven\"></a>\n\nPublishes artifacts from `java/**` to Maven.\n\n```ts\npublishToMaven(options?: MavenPublishOptions): void\n```\n\n* **options** (<code>[release.MavenPublishOptions](#projen-release-mavenpublishoptions)</code>)  Options.\n  * **prePublishSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede. __*Optional*__\n  * **publishTools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Additional tools to install in the publishing job. __*Default*__: no additional tools are installed\n  * **mavenEndpoint** (<code>string</code>)  URL of Nexus repository. __*Default*__: \"https://oss.sonatype.org\"\n  * **mavenGpgPrivateKeyPassphrase** (<code>string</code>)  GitHub secret name which contains the GPG private key or file that includes it. __*Default*__: \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\" or not set when using GitHub Packages\n  * **mavenGpgPrivateKeySecret** (<code>string</code>)  GitHub secret name which contains the GPG private key or file that includes it. __*Default*__: \"MAVEN_GPG_PRIVATE_KEY\" or not set when using GitHub Packages\n  * **mavenPassword** (<code>string</code>)  GitHub secret name which contains the Password for maven repository. __*Default*__: \"MAVEN_PASSWORD\" or \"GITHUB_TOKEN\" when using GitHub Packages\n  * **mavenRepositoryUrl** (<code>string</code>)  Deployment repository when not deploying to Maven Central. __*Default*__: not set\n  * **mavenServerId** (<code>string</code>)  Used in maven settings for credential lookup (e.g. use github when publishing to GitHub). __*Default*__: \"ossrh\" (Maven Central) or \"github\" when using GitHub Packages\n  * **mavenStagingProfileId** (<code>string</code>)  GitHub secret name which contains the Maven Central (sonatype) staging profile ID (e.g. 68a05363083174). Staging profile ID can be found in the URL of the \"Releases\" staging profile under \"Staging Profiles\" in https://oss.sonatype.org (e.g. https://oss.sonatype.org/#stagingProfiles;11a33451234521). __*Default*__: \"MAVEN_STAGING_PROFILE_ID\" or not set when using GitHub Packages\n  * **mavenUsername** (<code>string</code>)  GitHub secret name which contains the Username for maven repository. __*Default*__: \"MAVEN_USERNAME\" or the GitHub Actor when using GitHub Packages\n\n\n\n\n#### publishToNpm(options?)🔹 <a id=\"projen-release-publisher-publishtonpm\"></a>\n\nPublishes artifacts from `js/**` to npm.\n\n```ts\npublishToNpm(options?: NpmPublishOptions): void\n```\n\n* **options** (<code>[release.NpmPublishOptions](#projen-release-npmpublishoptions)</code>)  Options.\n  * **prePublishSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede. __*Optional*__\n  * **publishTools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Additional tools to install in the publishing job. __*Default*__: no additional tools are installed\n  * **codeArtifactOptions** (<code>[release.CodeArtifactOptions](#projen-release-codeartifactoptions)</code>)  Options for publishing npm package to AWS CodeArtifact. __*Default*__: undefined\n  * **distTag** (<code>string</code>)  Tags can be used to provide an alias instead of version numbers. __*Default*__: \"latest\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\" or \"GITHUB_TOKEN\" if `registry` is set to `npm.pkg.github.com`.\n  * **registry** (<code>string</code>)  The domain name of the npm package registry. __*Default*__: \"registry.npmjs.org\"\n\n\n\n\n#### publishToNuget(options?)🔹 <a id=\"projen-release-publisher-publishtonuget\"></a>\n\nPublishes artifacts from `dotnet/**` to NuGet Gallery.\n\n```ts\npublishToNuget(options?: NugetPublishOptions): void\n```\n\n* **options** (<code>[release.NugetPublishOptions](#projen-release-nugetpublishoptions)</code>)  Options.\n  * **prePublishSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede. __*Optional*__\n  * **publishTools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Additional tools to install in the publishing job. __*Default*__: no additional tools are installed\n  * **nugetApiKeySecret** (<code>string</code>)  GitHub secret which contains the API key for NuGet. __*Default*__: \"NUGET_API_KEY\"\n  * **nugetServer** (<code>string</code>)  NuGet Server URL (defaults to nuget.org). __*Optional*__\n\n\n\n\n#### publishToPyPi(options?)🔹 <a id=\"projen-release-publisher-publishtopypi\"></a>\n\nPublishes wheel artifacts from `python` to PyPI.\n\n```ts\npublishToPyPi(options?: PyPiPublishOptions): void\n```\n\n* **options** (<code>[release.PyPiPublishOptions](#projen-release-pypipublishoptions)</code>)  Options.\n  * **prePublishSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede. __*Optional*__\n  * **publishTools** (<code>[github.workflows.Tools](#projen-github-workflows-tools)</code>)  Additional tools to install in the publishing job. __*Default*__: no additional tools are installed\n  * **twinePasswordSecret** (<code>string</code>)  The GitHub secret which contains PyPI password. __*Default*__: \"TWINE_PASSWORD\"\n  * **twineRegistryUrl** (<code>string</code>)  The registry url to use when releasing packages. __*Default*__: twine default\n  * **twineUsernameSecret** (<code>string</code>)  The GitHub secret which contains PyPI user name. __*Default*__: \"TWINE_USERNAME\"\n\n\n\n\n\n\n## class Release 🔹 <a id=\"projen-release-release\"></a>\n\nManages releases (currently through GitHub workflows).\n\nBy default, no branches are released. To add branches, call `addBranch()`.\n\n__Submodule__: release\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew release.Release(project: GitHubProject, options: ReleaseOptions)\n```\n\n* **project** (<code>[github.GitHubProject](#projen-github-githubproject)</code>)  *No description*\n* **options** (<code>[release.ReleaseOptions](#projen-release-releaseoptions)</code>)  *No description*\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. \n  * **branch** (<code>string</code>)  The default branch name to release from. \n  * **task** (<code>[Task](#projen-task)</code>)  The task to execute in order to create the release artifacts. \n  * **versionFile** (<code>string</code>)  A name of a .json file to set the `version` field in after a bump. \n  * **githubRelease** (<code>boolean</code>)  Create a GitHub release for each release. __*Default*__: true\n  * **workflowNodeVersion** (<code>string</code>)  Node version to setup in GitHub workflows if any node-based CLI utilities are needed. __*Default*__: 14.x\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**artifactsDirectory**🔹 | <code>string</code> | Location of build artifacts.\n**branches**🔹 | <code>Array<string></code> | Retrieve all release branch names.\n**publisher**🔹 | <code>[release.Publisher](#projen-release-publisher)</code> | Package publisher.\n*static* **ANTI_TAMPER_CMD**🔹 | <code>string</code> | <span></span>\n\n### Methods\n\n\n#### addBranch(branch, options)🔹 <a id=\"projen-release-release-addbranch\"></a>\n\nAdds a release branch.\n\nIt is a git branch from which releases are published. If a project has more than one release\nbranch, we require that `majorVersion` is also specified for the primary branch in order to\nensure branches always release the correct version.\n\n```ts\naddBranch(branch: string, options: BranchOptions): void\n```\n\n* **branch** (<code>string</code>)  The branch to monitor (e.g. `main`, `v2.x`).\n* **options** (<code>[release.BranchOptions](#projen-release-branchoptions)</code>)  Branch definition.\n  * **majorVersion** (<code>number</code>)  The major versions released from this branch. \n  * **minMajorVersion** (<code>number</code>)  The minimum major version to release. __*Optional*__\n  * **npmDistTag** (<code>string</code>)  The npm distribution tag to use for this branch. __*Default*__: \"latest\"\n  * **prerelease** (<code>string</code>)  Bump the version as a pre-release tag. __*Default*__: normal releases\n  * **tagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **workflowName** (<code>string</code>)  The name of the release workflow. __*Default*__: \"release-BRANCH\"\n\n\n\n\n#### addJobs(jobs)🔹 <a id=\"projen-release-release-addjobs\"></a>\n\nAdds jobs to all release workflows.\n\n```ts\naddJobs(jobs: Map<string, Job>): void\n```\n\n* **jobs** (<code>Map<string, [github.workflows.Job](#projen-github-workflows-job)></code>)  The jobs to add (name => job).\n\n\n\n\n#### preSynthesize()🔹 <a id=\"projen-release-release-presynthesize\"></a>\n\nCalled before synthesis.\n\n```ts\npreSynthesize(): void\n```\n\n\n\n\n\n#### *static* of(project)🔹 <a id=\"projen-release-release-of\"></a>\n\nReturns the `Release` component of a project or `undefined` if the project does not have a Release component.\n\n```ts\nstatic of(project: GitHubProject): Release\n```\n\n* **project** (<code>[github.GitHubProject](#projen-github-githubproject)</code>)  *No description*\n\n__Returns__:\n* <code>[release.Release](#projen-release-release)</code>\n\n\n\n## class ReleaseTrigger 🔹 <a id=\"projen-release-releasetrigger\"></a>\n\nUsed to manage release strategies.\n\nThis includes release\nand release artifact automation\n\n__Submodule__: release\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**isContinuous**🔹 | <code>boolean</code> | Whether or not this is a continuous release.\n**isManual**🔹 | <code>boolean</code> | Whether or not this is a manual release trigger.\n**changelogPath**?🔹 | <code>string</code> | Project-level changelog file path.<br/>__*Optional*__\n**gitPushCommand**?🔹 | <code>string</code> | Override git-push command used when releasing manually.<br/>__*Optional*__\n**schedule**?🔹 | <code>string</code> | Cron schedule for releases.<br/>__*Optional*__\n\n### Methods\n\n\n#### *static* continuous()🔹 <a id=\"projen-release-releasetrigger-continuous\"></a>\n\nCreates a continuous release trigger.\n\nAutomated releases will occur on every commit.\n\n```ts\nstatic continuous(): ReleaseTrigger\n```\n\n\n__Returns__:\n* <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>\n\n#### *static* manual(options?)🔹 <a id=\"projen-release-releasetrigger-manual\"></a>\n\nCreates a manual release trigger.\n\nUse this option if you want totally manual releases.\n\nThis will give you a release task that, in addition to the normal\nrelease activities will trigger a `publish:git` task. This task will\nhandle project-level changelog management, release tagging, and pushing\nthese artifacts to origin.\n\nThe command used for pushing can be customised by specifying\n`gitPushCommand`. Set to an empty string to disable pushing entirely.\n\nSimply run `yarn release` to trigger a manual release.\n\n```ts\nstatic manual(options?: ManualReleaseOptions): ReleaseTrigger\n```\n\n* **options** (<code>[release.ManualReleaseOptions](#projen-release-manualreleaseoptions)</code>)  release options.\n  * **changelog** (<code>boolean</code>)  Maintain a project-level changelog. __*Default*__: true\n  * **changelogPath** (<code>string</code>)  Project-level changelog file path. __*Default*__: 'CHANGELOG.md'\n  * **gitPushCommand** (<code>string</code>)  Override git-push command. __*Optional*__\n\n__Returns__:\n* <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>\n\n#### *static* scheduled(options)🔹 <a id=\"projen-release-releasetrigger-scheduled\"></a>\n\nCreates a scheduled release trigger.\n\nAutomated releases will occur based on the provided cron schedule.\n\n```ts\nstatic scheduled(options: ScheduledReleaseOptions): ReleaseTrigger\n```\n\n* **options** (<code>[release.ScheduledReleaseOptions](#projen-release-scheduledreleaseoptions)</code>)  release options.\n  * **schedule** (<code>string</code>)  Cron schedule for releases. \n\n__Returns__:\n* <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>\n\n\n\n## class Projenrc 🔹 <a id=\"projen-typescript-projenrc\"></a>\n\nSets up a typescript project to use TypeScript for projenrc.\n\n__Submodule__: typescript\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew typescript.Projenrc(project: TypeScriptProject, options?: ProjenrcOptions)\n```\n\n* **project** (<code>[typescript.TypeScriptProject](#projen-typescript-typescriptproject)</code>)  *No description*\n* **options** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  *No description*\n  * **filename** (<code>string</code>)  The name of the projenrc file. __*Default*__: \".projenrc.ts\"\n  * **projenCodeDir** (<code>string</code>)  A directory tree that may contain *.ts files that can be referenced from your projenrc typescript file. __*Default*__: \"projenrc\"\n\n\n\n\n## class TypeScriptAppProject 🔹 <a id=\"projen-typescript-typescriptappproject\"></a>\n\nTypeScript app.\n\n__Submodule__: typescript\n\n__Extends__: [typescript.TypeScriptProject](#projen-typescript-typescriptproject)\n\n### Initializer\n\n\n\n\n```ts\nnew typescript.TypeScriptAppProject(options: TypeScriptProjectOptions)\n```\n\n* **options** (<code>[typescript.TypeScriptProjectOptions](#projen-typescript-typescriptprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n\n\n\n\n## class TypeScriptLibraryProject ⚠️ <a id=\"projen-typescript-typescriptlibraryproject\"></a>\n\n\n\n__Submodule__: typescript\n\n__Extends__: [typescript.TypeScriptProject](#projen-typescript-typescriptproject)\n\n### Initializer\n\n\n\n\n```ts\nnew typescript.TypeScriptLibraryProject(options: TypeScriptProjectOptions)\n```\n\n* **options** (<code>[typescript.TypeScriptProjectOptions](#projen-typescript-typescriptprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n\n\n\n\n## class TypeScriptProject 🔹 <a id=\"projen-typescript-typescriptproject\"></a>\n\nTypeScript project.\n\n__Submodule__: typescript\n\n__Extends__: [javascript.NodeProject](#projen-javascript-nodeproject)\n\n### Initializer\n\n\n\n\n```ts\nnew typescript.TypeScriptProject(options: TypeScriptProjectOptions)\n```\n\n* **options** (<code>[typescript.TypeScriptProjectOptions](#projen-typescript-typescriptprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**docsDirectory**🔹 | <code>string</code> | <span></span>\n**libdir**🔹 | <code>string</code> | The directory in which compiled .js files reside.\n**srcdir**🔹 | <code>string</code> | The directory in which the .ts sources reside.\n**testdir**🔹 | <code>string</code> | The directory in which tests reside.\n**tsconfigDev**🔹 | <code>[javascript.TypescriptConfig](#projen-javascript-typescriptconfig)</code> | A typescript configuration file which covers all files (sources, tests, projen).\n**watchTask**🔹 | <code>[Task](#projen-task)</code> | The \"watch\" task.\n**docgen**?🔹 | <code>boolean</code> | __*Optional*__\n**eslint**?🔹 | <code>[javascript.Eslint](#projen-javascript-eslint)</code> | __*Optional*__\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfig](#projen-javascript-typescriptconfig)</code> | __*Optional*__\n**tsconfigEslint**?🔹 | <code>[javascript.TypescriptConfig](#projen-javascript-typescriptconfig)</code> | __*Optional*__\n\n\n\n## class TypedocDocgen 🔹 <a id=\"projen-typescript-typedocdocgen\"></a>\n\nAdds a simple Typescript documentation generator.\n\n__Submodule__: typescript\n\n\n### Initializer\n\n\n\n\n```ts\nnew typescript.TypedocDocgen(project: TypeScriptProject)\n```\n\n* **project** (<code>[typescript.TypeScriptProject](#projen-typescript-typescriptproject)</code>)  *No description*\n\n\n\n\n## class DevContainer 🔹 <a id=\"projen-vscode-devcontainer\"></a>\n\nA development environment running VSCode in a container;\n\nused by GitHub\ncodespaces.\n\n__Implements__: [IDevEnvironment](#projen-idevenvironment)\n__Submodule__: vscode\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew vscode.DevContainer(project: Project, options?: DevContainerOptions)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n* **options** (<code>[vscode.DevContainerOptions](#projen-vscode-devcontaineroptions)</code>)  *No description*\n  * **dockerImage** (<code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code>)  A Docker image or Dockerfile for the container. __*Optional*__\n  * **ports** (<code>Array<string></code>)  An array of ports that should be exposed from the container. __*Optional*__\n  * **tasks** (<code>Array<[Task](#projen-task)></code>)  An array of tasks that should be run when the container starts. __*Optional*__\n  * **vscodeExtensions** (<code>Array<string></code>)  An array of extension IDs that specify the extensions that should be installed inside the container when it is created. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**config**🔹 | <code>any</code> | Direct access to the devcontainer configuration (escape hatch).\n\n### Methods\n\n\n#### addDockerImage(image)🔹 <a id=\"projen-vscode-devcontainer-adddockerimage\"></a>\n\nAdd a custom Docker image or Dockerfile for the container.\n\n```ts\naddDockerImage(image: DevEnvironmentDockerImage): void\n```\n\n* **image** (<code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code>)  *No description*\n\n\n\n\n#### addPorts(...ports)🔹 <a id=\"projen-vscode-devcontainer-addports\"></a>\n\nAdds ports that should be exposed (forwarded) from the container.\n\n```ts\naddPorts(...ports: string[]): void\n```\n\n* **ports** (<code>string</code>)  The new ports.\n\n\n\n\n#### addTasks(...tasks)🔹 <a id=\"projen-vscode-devcontainer-addtasks\"></a>\n\nAdds tasks to run when the container starts.\n\nTasks will be run in sequence.\n\n```ts\naddTasks(...tasks: Task[]): void\n```\n\n* **tasks** (<code>[Task](#projen-task)</code>)  The new tasks.\n\n\n\n\n#### addVscodeExtensions(...extensions)🔹 <a id=\"projen-vscode-devcontainer-addvscodeextensions\"></a>\n\nAdds a list of VSCode extensions that should be automatically installed in the container.\n\n```ts\naddVscodeExtensions(...extensions: string[]): void\n```\n\n* **extensions** (<code>string</code>)  The extension IDs.\n\n\n\n\n\n\n## class VsCode 🔹 <a id=\"projen-vscode-vscode\"></a>\n\n\n\n__Submodule__: vscode\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew vscode.VsCode(project: Project)\n```\n\n* **project** (<code>[Project](#projen-project)</code>)  *No description*\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**extensions**🔹 | <code>[vscode.VsCodeRecommendedExtensions](#projen-vscode-vscoderecommendedextensions)</code> | <span></span>\n**launchConfiguration**🔹 | <code>[vscode.VsCodeLaunchConfig](#projen-vscode-vscodelaunchconfig)</code> | <span></span>\n**settings**🔹 | <code>[vscode.VsCodeSettings](#projen-vscode-vscodesettings)</code> | <span></span>\n\n\n\n## class VsCodeLaunchConfig 🔹 <a id=\"projen-vscode-vscodelaunchconfig\"></a>\n\nVSCode launch configuration file (launch.json), useful for enabling in-editor debugger.\n\n__Submodule__: vscode\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew vscode.VsCodeLaunchConfig(vscode: VsCode)\n```\n\n* **vscode** (<code>[vscode.VsCode](#projen-vscode-vscode)</code>)  *No description*\n\n\n### Methods\n\n\n#### addConfiguration(cfg)🔹 <a id=\"projen-vscode-vscodelaunchconfig-addconfiguration\"></a>\n\nAdds a VsCodeLaunchConfigurationEntry (e.g. a node.js debugger) to `.vscode/launch.json. Each configuration entry has following mandatory fields: type, request and name. See https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes for details.\n\n```ts\naddConfiguration(cfg: VsCodeLaunchConfigurationEntry): void\n```\n\n* **cfg** (<code>[vscode.VsCodeLaunchConfigurationEntry](#projen-vscode-vscodelaunchconfigurationentry)</code>)  VsCodeLaunchConfigurationEntry.\n  * **name** (<code>string</code>)  *No description* \n  * **request** (<code>string</code>)  *No description* \n  * **type** (<code>string</code>)  *No description* \n  * **args** (<code>Array<string></code>)  *No description* __*Optional*__\n  * **console** (<code>[vscode.Console](#projen-vscode-console)</code>)  *No description* __*Optional*__\n  * **cwd** (<code>string</code>)  *No description* __*Optional*__\n  * **debugServer** (<code>number</code>)  *No description* __*Optional*__\n  * **disableOptimisticBPs** (<code>boolean</code>)  *No description* __*Optional*__\n  * **env** (<code>Map<string, string &#124; boolean></code>)  Set value to `false` to unset an existing environment variable. __*Optional*__\n  * **envFile** (<code>string</code>)  *No description* __*Optional*__\n  * **internalConsoleOptions** (<code>[vscode.InternalConsoleOptions](#projen-vscode-internalconsoleoptions)</code>)  *No description* __*Optional*__\n  * **outFiles** (<code>Array<string></code>)  *No description* __*Optional*__\n  * **port** (<code>number</code>)  *No description* __*Optional*__\n  * **postDebugTask** (<code>string</code>)  *No description* __*Optional*__\n  * **preLaunchTask** (<code>string</code>)  *No description* __*Optional*__\n  * **presentation** (<code>[vscode.Presentation](#projen-vscode-presentation)</code>)  *No description* __*Optional*__\n  * **program** (<code>string</code>)  *No description* __*Optional*__\n  * **runtimeArgs** (<code>Array<string></code>)  *No description* __*Optional*__\n  * **serverReadyAction** (<code>[vscode.ServerReadyAction](#projen-vscode-serverreadyaction)</code>)  *No description* __*Optional*__\n  * **skipFiles** (<code>Array<string></code>)  *No description* __*Optional*__\n  * **stopOnEntry** (<code>boolean</code>)  *No description* __*Optional*__\n  * **url** (<code>string</code>)  *No description* __*Optional*__\n  * **webRoot** (<code>string</code>)  *No description* __*Optional*__\n\n\n\n\n\n\n## class VsCodeRecommendedExtensions 🔹 <a id=\"projen-vscode-vscoderecommendedextensions\"></a>\n\nVS Code Workspace recommended extensions Source: https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions.\n\n__Submodule__: vscode\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew vscode.VsCodeRecommendedExtensions(vscode: VsCode)\n```\n\n* **vscode** (<code>[vscode.VsCode](#projen-vscode-vscode)</code>)  *No description*\n\n\n### Methods\n\n\n#### addRecommendations(...extensions)🔹 <a id=\"projen-vscode-vscoderecommendedextensions-addrecommendations\"></a>\n\nAdds a list of VS Code extensions as recommendations for this workspace.\n\n```ts\naddRecommendations(...extensions: string[]): void\n```\n\n* **extensions** (<code>string</code>)  The extension IDs.\n\n\n\n\n#### addUnwantedRecommendations(...extensions)🔹 <a id=\"projen-vscode-vscoderecommendedextensions-addunwantedrecommendations\"></a>\n\nMarks a list of VS Code extensions as unwanted recommendations for this workspace.\n\nVS Code should not be recommend these extensions for users of this workspace.\n\n```ts\naddUnwantedRecommendations(...extensions: string[]): void\n```\n\n* **extensions** (<code>string</code>)  The extension IDs.\n\n\n\n\n\n\n## class VsCodeSettings 🔹 <a id=\"projen-vscode-vscodesettings\"></a>\n\nVS Code Workspace settings Source: https://code.visualstudio.com/docs/getstarted/settings#_workspace-settings.\n\n__Submodule__: vscode\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew vscode.VsCodeSettings(vscode: VsCode)\n```\n\n* **vscode** (<code>[vscode.VsCode](#projen-vscode-vscode)</code>)  *No description*\n\n\n### Methods\n\n\n#### addSetting(setting, value, language?)🔹 <a id=\"projen-vscode-vscodesettings-addsetting\"></a>\n\nAdds a workspace setting.\n\n```ts\naddSetting(setting: string, value: any, language?: string): void\n```\n\n* **setting** (<code>string</code>)  The setting ID.\n* **value** (<code>any</code>)  The value of the setting.\n* **language** (<code>string</code>)  Scope the setting to a specific language.\n\n\n\n\n#### addSettings(settings, languages?)🔹 <a id=\"projen-vscode-vscodesettings-addsettings\"></a>\n\nAdds a workspace setting.\n\n```ts\naddSettings(settings: Map<string, any>, languages?: string &#124; Array<string>): void\n```\n\n* **settings** (<code>Map<string, any></code>)  Array structure: [setting: string, value: any, languages?: string[]].\n* **languages** (<code>string &#124; Array<string></code>)  *No description*\n\n\n\n\n\n\n## class NextComponent 🔹 <a id=\"projen-web-nextcomponent\"></a>\n\n\n\n__Submodule__: web\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew web.NextComponent(project: NodeProject, options: NextComponentOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[web.NextComponentOptions](#projen-web-nextcomponentoptions)</code>)  *No description*\n  * **tailwind** (<code>boolean</code>)  Setup Tailwind as a PostCSS plugin. __*Default*__: true\n  * **typescript** (<code>boolean</code>)  Whether to apply options specific for TypeScript Next.js projects. __*Default*__: false\n\n\n\n\n## class NextJsProject 🔹 <a id=\"projen-web-nextjsproject\"></a>\n\nNext.js project without TypeScript.\n\n__Submodule__: web\n\n__Extends__: [javascript.NodeProject](#projen-javascript-nodeproject)\n\n### Initializer\n\n\n\n\n```ts\nnew web.NextJsProject(options: NextJsProjectOptions)\n```\n\n* **options** (<code>[web.NextJsProjectOptions](#projen-web-nextjsprojectoptions)</code>)  *No description*\n  * **assetsdir** (<code>string</code>)  Assets directory. __*Default*__: \"public\"\n  * **tailwind** (<code>boolean</code>)  Setup Tailwind CSS as a PostCSS plugin. __*Default*__: true\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `pages/` and `public/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**assetsdir**🔹 | <code>string</code> | The directory in which app assets reside.\n**srcdir**🔹 | <code>string</code> | The directory in which source files reside.\n**tailwind**🔹 | <code>boolean</code> | Setup Tailwind as a PostCSS plugin.\n\n\n\n## class NextJsTypeScriptProject 🔹 <a id=\"projen-web-nextjstypescriptproject\"></a>\n\nNext.js project with TypeScript.\n\n__Submodule__: web\n\n__Extends__: [typescript.TypeScriptAppProject](#projen-typescript-typescriptappproject)\n\n### Initializer\n\n\n\n\n```ts\nnew web.NextJsTypeScriptProject(options: NextJsTypeScriptProjectOptions)\n```\n\n* **options** (<code>[web.NextJsTypeScriptProjectOptions](#projen-web-nextjstypescriptprojectoptions)</code>)  *No description*\n  * **assetsdir** (<code>string</code>)  Assets directory. __*Default*__: \"public\"\n  * **tailwind** (<code>boolean</code>)  Setup Tailwind CSS as a PostCSS plugin. __*Default*__: true\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**assetsdir**🔹 | <code>string</code> | The directory in which app assets reside.\n**srcdir**🔹 | <code>string</code> | The directory in which source files reside.\n**tailwind**🔹 | <code>boolean</code> | Setup Tailwind as a PostCSS plugin.\n\n\n\n## class PostCss 🔹 <a id=\"projen-web-postcss\"></a>\n\nDeclares a PostCSS dependency with a default config file.\n\n__Submodule__: web\n\n\n### Initializer\n\n\n\n\n```ts\nnew web.PostCss(project: NodeProject, options?: PostCssOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[web.PostCssOptions](#projen-web-postcssoptions)</code>)  *No description*\n  * **fileName** (<code>string</code>)  *No description* __*Default*__: \"postcss.config.json\"\n  * **tailwind** (<code>boolean</code>)  Install Tailwind CSS as a PostCSS plugin. __*Default*__: true\n  * **tailwindOptions** (<code>[web.TailwindConfigOptions](#projen-web-tailwindconfigoptions)</code>)  Tailwind CSS options. __*Optional*__\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**file**🔹 | <code>[JsonFile](#projen-jsonfile)</code> | <span></span>\n**fileName**🔹 | <code>string</code> | <span></span>\n**tailwind**?🔹 | <code>[web.TailwindConfig](#projen-web-tailwindconfig)</code> | __*Optional*__\n\n\n\n## class ReactComponent 🔹 <a id=\"projen-web-reactcomponent\"></a>\n\n\n\n__Submodule__: web\n\n__Extends__: [Component](#projen-component)\n\n### Initializer\n\n\n\n\n```ts\nnew web.ReactComponent(project: NodeProject, options: ReactComponentOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[web.ReactComponentOptions](#projen-web-reactcomponentoptions)</code>)  *No description*\n  * **rewire** (<code>Map<string, any></code>)  Rewire webpack configuration. __*Default*__: No rewired config.\n  * **typescript** (<code>boolean</code>)  Whether to apply options specific for TypeScript React projects. __*Default*__: false\n\n\n\n\n## class ReactProject 🔹 <a id=\"projen-web-reactproject\"></a>\n\nReact project without TypeScript.\n\n__Submodule__: web\n\n__Extends__: [javascript.NodeProject](#projen-javascript-nodeproject)\n\n### Initializer\n\n\n\n\n```ts\nnew web.ReactProject(options: ReactProjectOptions)\n```\n\n* **options** (<code>[web.ReactProjectOptions](#projen-web-reactprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **rewire** (<code>Map<string, any></code>)  Rewire webpack configuration. __*Default*__: No rewired config.\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `public/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Source directory. __*Default*__: \"src\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**srcdir**🔹 | <code>string</code> | The directory in which source files reside.\n\n\n\n## class ReactTypeDef ⚠️ <a id=\"projen-web-reacttypedef\"></a>\n\n\n\n__Submodule__: web\n\n__Extends__: [FileBase](#projen-filebase)\n\n### Initializer\n\n\n\n\n```ts\nnew web.ReactTypeDef(project: ReactTypeScriptProject, filePath: string, options?: ReactTypeDefOptions)\n```\n\n* **project** (<code>[web.ReactTypeScriptProject](#projen-web-reacttypescriptproject)</code>)  *No description*\n* **filePath** (<code>string</code>)  *No description*\n* **options** (<code>[web.ReactTypeDefOptions](#projen-web-reacttypedefoptions)</code>)  *No description*\n  * **committed** (<code>boolean</code>)  Indicates whether this file should be committed to git or ignored. __*Default*__: true\n  * **editGitignore** (<code>boolean</code>)  Update the project's .gitignore file. __*Default*__: true\n  * **executable** (<code>boolean</code>)  Whether the generated file should be marked as executable. __*Default*__: false\n  * **marker** (<code>boolean</code>)  Adds the projen marker to the file. __*Default*__: marker will be included as long as the project is not ejected\n  * **readonly** (<code>boolean</code>)  Whether the generated file should be readonly. __*Default*__: true\n\n\n### Methods\n\n\n#### protected synthesizeContent(_)⚠️ <a id=\"projen-web-reacttypedef-synthesizecontent\"></a>\n\nImplemented by derived classes and returns the contents of the file to emit.\n\n```ts\nprotected synthesizeContent(_: IResolver): string\n```\n\n* **_** (<code>[IResolver](#projen-iresolver)</code>)  *No description*\n\n__Returns__:\n* <code>string</code>\n\n\n\n## class ReactTypeScriptProject 🔹 <a id=\"projen-web-reacttypescriptproject\"></a>\n\nReact project with TypeScript.\n\n__Submodule__: web\n\n__Extends__: [typescript.TypeScriptAppProject](#projen-typescript-typescriptappproject)\n\n### Initializer\n\n\n\n\n```ts\nnew web.ReactTypeScriptProject(options: ReactTypeScriptProjectOptions)\n```\n\n* **options** (<code>[web.ReactTypeScriptProjectOptions](#projen-web-reacttypescriptprojectoptions)</code>)  *No description*\n  * **name** (<code>string</code>)  This is the name of your project. \n  * **commitGenerated** (<code>boolean</code>)  Whether to commit the managed files by default. __*Default*__: true\n  * **logging** (<code>[LoggerOptions](#projen-loggeroptions)</code>)  Configure logging options such as verbosity. __*Default*__: {}\n  * **outdir** (<code>string</code>)  The root directory of the project. __*Default*__: \".\"\n  * **parent** (<code>[Project](#projen-project)</code>)  The parent project, if this project is part of a bigger project. __*Optional*__\n  * **projenCommand** (<code>string</code>)  The shell command to use in order to run the projen CLI. __*Default*__: \"npx projen\"\n  * **projenrcJson** (<code>boolean</code>)  Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation. __*Default*__: false\n  * **projenrcJsonOptions** (<code>[ProjenrcOptions](#projen-projenrcoptions)</code>)  Options for .projenrc.json. __*Default*__: default options\n  * **renovatebot** (<code>boolean</code>)  Use renovatebot to handle dependency upgrades. __*Default*__: false\n  * **renovatebotOptions** (<code>[RenovatebotOptions](#projen-renovatebotoptions)</code>)  Options for renovatebot. __*Default*__: default options\n  * **autoApproveOptions** (<code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code>)  Enable and configure the 'auto approve' workflow. __*Default*__: auto approve is disabled\n  * **autoMerge** (<code>boolean</code>)  Enable automatic merging on GitHub. __*Default*__: true\n  * **autoMergeOptions** (<code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code>)  Configure options for automatic merging on GitHub. __*Default*__: see defaults in `AutoMergeOptions`\n  * **clobber** (<code>boolean</code>)  Add a `clobber` task which resets the repo to origin. __*Default*__: true\n  * **devContainer** (<code>boolean</code>)  Add a VSCode development environment (used for GitHub Codespaces). __*Default*__: false\n  * **github** (<code>boolean</code>)  Enable GitHub integration. __*Default*__: true\n  * **githubOptions** (<code>[github.GitHubOptions](#projen-github-githuboptions)</code>)  Options for GitHub integration. __*Default*__: see GitHubOptions\n  * **gitpod** (<code>boolean</code>)  Add a Gitpod development environment. __*Default*__: false\n  * **mergify** (<code>boolean</code>)  Whether mergify should be enabled on this repository or not. __*Default*__: true\n  * **mergifyOptions** (<code>[github.MergifyOptions](#projen-github-mergifyoptions)</code>)  Options for mergify. __*Default*__: default options\n  * **projectType** (<code>[ProjectType](#projen-projecttype)</code>)  Which type of project this is (library/app). __*Default*__: ProjectType.UNKNOWN\n  * **projenCredentials** (<code>[github.GithubCredentials](#projen-github-githubcredentials)</code>)  Choose a method of providing GitHub API access for projen workflows. __*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n  * **projenTokenSecret** (<code>string</code>)  The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows. __*Default*__: \"PROJEN_GITHUB_TOKEN\"\n  * **readme** (<code>[SampleReadmeProps](#projen-samplereadmeprops)</code>)  The README setup. __*Default*__: { filename: 'README.md', contents: '# replace this' }\n  * **stale** (<code>boolean</code>)  Auto-close of stale issues and pull request. __*Default*__: false\n  * **staleOptions** (<code>[github.StaleOptions](#projen-github-staleoptions)</code>)  Auto-close stale issues and pull requests. __*Default*__: see defaults in `StaleOptions`\n  * **vscode** (<code>boolean</code>)  Enable VSCode integration. __*Default*__: true\n  * **allowLibraryDependencies** (<code>boolean</code>)  Allow the project to include `peerDependencies` and `bundledDependencies`. __*Default*__: true\n  * **authorEmail** (<code>string</code>)  Author's e-mail. __*Optional*__\n  * **authorName** (<code>string</code>)  Author's name. __*Optional*__\n  * **authorOrganization** (<code>boolean</code>)  Author's Organization. __*Optional*__\n  * **authorUrl** (<code>string</code>)  Author's URL / Website. __*Optional*__\n  * **autoDetectBin** (<code>boolean</code>)  Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section. __*Default*__: true\n  * **bin** (<code>Map<string, string></code>)  Binary programs vended with your module. __*Optional*__\n  * **bugsEmail** (<code>string</code>)  The email address to which issues should be reported. __*Optional*__\n  * **bugsUrl** (<code>string</code>)  The url to your project's issue tracker. __*Optional*__\n  * **bundledDeps** (<code>Array<string></code>)  List of dependencies to bundle into this module. __*Optional*__\n  * **codeArtifactOptions** (<code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code>)  Options for npm packages using AWS CodeArtifact. __*Default*__: undefined\n  * **deps** (<code>Array<string></code>)  Runtime dependencies of this module. __*Default*__: []\n  * **description** (<code>string</code>)  The description is just a string that helps people understand the purpose of the package. __*Optional*__\n  * **devDeps** (<code>Array<string></code>)  Build dependencies for this module. __*Default*__: []\n  * **entrypoint** (<code>string</code>)  Module entrypoint (`main` in `package.json`). __*Default*__: \"lib/index.js\"\n  * **homepage** (<code>string</code>)  Package's Homepage / Website. __*Optional*__\n  * **keywords** (<code>Array<string></code>)  Keywords to include in `package.json`. __*Optional*__\n  * **license** (<code>string</code>)  License's SPDX identifier. __*Default*__: \"Apache-2.0\"\n  * **licensed** (<code>boolean</code>)  Indicates if a license should be added. __*Default*__: true\n  * **maxNodeVersion** (<code>string</code>)  Minimum node.js version to require via `engines` (inclusive). __*Default*__: no max\n  * **minNodeVersion** (<code>string</code>)  Minimum Node.js version to require via package.json `engines` (inclusive). __*Default*__: no \"engines\" specified\n  * **npmAccess** (<code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code>)  Access level of the npm package. __*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n  * **npmRegistry** (<code>string</code>)  The host name of the npm registry to publish to. __*Optional*__\n  * **npmRegistryUrl** (<code>string</code>)  The base URL of the npm package registry. __*Default*__: \"https://registry.npmjs.org\"\n  * **npmTokenSecret** (<code>string</code>)  GitHub secret which contains the NPM token to use when publishing packages. __*Default*__: \"NPM_TOKEN\"\n  * **packageManager** (<code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code>)  The Node Package Manager used to execute scripts. __*Default*__: NodePackageManager.YARN\n  * **packageName** (<code>string</code>)  The \"name\" in package.json. __*Default*__: defaults to project name\n  * **peerDependencyOptions** (<code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code>)  Options for `peerDeps`. __*Optional*__\n  * **peerDeps** (<code>Array<string></code>)  Peer dependencies for this module. __*Default*__: []\n  * **repository** (<code>string</code>)  The repository is the location where the actual code for your package lives. __*Optional*__\n  * **repositoryDirectory** (<code>string</code>)  If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives. __*Optional*__\n  * **scopedPackagesOptions** (<code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code>)  Options for privately hosted scoped packages. __*Default*__: fetch all scoped packages from the public npm registry\n  * **scripts** (<code>Map<string, string></code>)  npm scripts to include. __*Default*__: {}\n  * **stability** (<code>string</code>)  Package's Stability. __*Optional*__\n  * **jsiiReleaseVersion** (<code>string</code>)  Version requirement of `publib` which is used to publish modules to npm. __*Default*__: \"latest\"\n  * **majorVersion** (<code>number</code>)  Major version to release from the default branch. __*Default*__: Major version is not enforced.\n  * **minMajorVersion** (<code>number</code>)  Minimal Major version to release. __*Default*__: No minimum version is being enforced\n  * **npmDistTag** (<code>string</code>)  The npmDistTag to use when publishing from the default branch. __*Default*__: \"latest\"\n  * **postBuildSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Steps to execute after build as part of the release workflow. __*Default*__: []\n  * **prerelease** (<code>string</code>)  Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\"). __*Default*__: normal semantic versions\n  * **publishDryRun** (<code>boolean</code>)  Instead of actually publishing to package managers, just print the publishing command. __*Default*__: false\n  * **publishTasks** (<code>boolean</code>)  Define publishing tasks that can be executed manually as well as workflows. __*Default*__: false\n  * **releaseBranches** (<code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code>)  Defines additional release branches. __*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n  * **releaseEveryCommit** (<code>boolean</code>)  Automatically release new versions every commit to one of branches in `releaseBranches`. __*Default*__: true\n  * **releaseFailureIssue** (<code>boolean</code>)  Create a github issue on every failed publishing task. __*Default*__: false\n  * **releaseFailureIssueLabel** (<code>string</code>)  The label to apply to issues indicating publish failures. __*Default*__: \"failed-release\"\n  * **releaseSchedule** (<code>string</code>)  CRON schedule to trigger new releases. __*Default*__: no scheduled releases\n  * **releaseTagPrefix** (<code>string</code>)  Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers. __*Default*__: no prefix\n  * **releaseTrigger** (<code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code>)  The release trigger to use. __*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n  * **releaseWorkflowName** (<code>string</code>)  The name of the default release workflow. __*Default*__: \"Release\"\n  * **releaseWorkflowSetupSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  A set of workflow steps to execute in order to setup the workflow container. __*Optional*__\n  * **versionrcOptions** (<code>Map<string, any></code>)  Custom configuration used when creating changelog with standard-version package. __*Default*__: standard configuration applicable for GitHub repositories\n  * **workflowContainerImage** (<code>string</code>)  Container image to use for GitHub workflows. __*Default*__: default image\n  * **workflowRunsOn** (<code>Array<string></code>)  Github Runner selection labels. __*Default*__: [\"ubuntu-latest\"]\n  * **defaultReleaseBranch** (<code>string</code>)  The name of the main release branch. \n  * **artifactsDirectory** (<code>string</code>)  A directory which will contain build artifacts. __*Default*__: \"dist\"\n  * **autoApproveUpgrades** (<code>boolean</code>)  Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued). __*Default*__: true\n  * **buildWorkflow** (<code>boolean</code>)  Define a GitHub workflow for building PRs. __*Default*__: true if not a subproject\n  * **buildWorkflowTriggers** (<code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code>)  Build workflow triggers. __*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n  * **bundlerOptions** (<code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code>)  Options for `Bundler`. __*Optional*__\n  * **codeCov** (<code>boolean</code>)  Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret. __*Default*__: false\n  * **codeCovTokenSecret** (<code>string</code>)  Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories. __*Default*__: if this option is not specified, only public repositories are supported\n  * **copyrightOwner** (<code>string</code>)  License copyright owner. __*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n  * **copyrightPeriod** (<code>string</code>)  The copyright years to put in the LICENSE file. __*Default*__: current year\n  * **dependabot** (<code>boolean</code>)  Use dependabot to handle dependency upgrades. __*Default*__: false\n  * **dependabotOptions** (<code>[github.DependabotOptions](#projen-github-dependabotoptions)</code>)  Options for dependabot. __*Default*__: default options\n  * **depsUpgrade** (<code>boolean</code>)  Use github workflows to handle dependency upgrades. __*Default*__: true\n  * **depsUpgradeOptions** (<code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code>)  Options for `UpgradeDependencies`. __*Default*__: default options\n  * **gitignore** (<code>Array<string></code>)  Additional entries to .gitignore. __*Optional*__\n  * **jest** (<code>boolean</code>)  Setup jest unit tests. __*Default*__: true\n  * **jestOptions** (<code>[javascript.JestOptions](#projen-javascript-jestoptions)</code>)  Jest options. __*Default*__: default options\n  * **mutableBuild** (<code>boolean</code>)  Automatically update files modified during builds to pull-request branches. __*Default*__: true\n  * **npmignore** (<code>Array<string></code>)  Additional entries to .npmignore. __*Optional*__\n  * **npmignoreEnabled** (<code>boolean</code>)  Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs. __*Default*__: true\n  * **package** (<code>boolean</code>)  Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`). __*Default*__: true\n  * **prettier** (<code>boolean</code>)  Setup prettier. __*Default*__: false\n  * **prettierOptions** (<code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code>)  Prettier options. __*Default*__: default options\n  * **projenDevDependency** (<code>boolean</code>)  Indicates of \"projen\" should be installed as a devDependency. __*Default*__: true\n  * **projenrcJs** (<code>boolean</code>)  Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation. __*Default*__: true if projenrcJson is false\n  * **projenrcJsOptions** (<code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code>)  Options for .projenrc.js. __*Default*__: default options\n  * **projenVersion** (<code>string</code>)  Version of projen to install. __*Default*__: Defaults to the latest version.\n  * **pullRequestTemplate** (<code>boolean</code>)  Include a GitHub pull request template. __*Default*__: true\n  * **pullRequestTemplateContents** (<code>Array<string></code>)  The contents of the pull request template. __*Default*__: default content\n  * **release** (<code>boolean</code>)  Add release management to this project. __*Default*__: true (false for subprojects)\n  * **releaseToNpm** (<code>boolean</code>)  Automatically release to npm when new versions are introduced. __*Default*__: false\n  * **releaseWorkflow** (<code>boolean</code>)  DEPRECATED: renamed to `release`. __*Default*__: true if not a subproject\n  * **workflowBootstrapSteps** (<code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code>)  Workflow steps to use in order to bootstrap this repo. __*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n  * **workflowGitIdentity** (<code>[github.GitIdentity](#projen-github-gitidentity)</code>)  The git identity to use in workflows. __*Default*__: GitHub Actions\n  * **workflowNodeVersion** (<code>string</code>)  The node version to use in GitHub workflows. __*Default*__: same as `minNodeVersion`\n  * **disableTsconfig** (<code>boolean</code>)  Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler). __*Default*__: false\n  * **docgen** (<code>boolean</code>)  Docgen by Typedoc. __*Default*__: false\n  * **docsDirectory** (<code>string</code>)  Docs directory. __*Default*__: \"docs\"\n  * **entrypointTypes** (<code>string</code>)  The .d.ts file that includes the type declarations for this module. __*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n  * **eslint** (<code>boolean</code>)  Setup eslint. __*Default*__: true\n  * **eslintOptions** (<code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code>)  Eslint options. __*Default*__: opinionated default options\n  * **libdir** (<code>string</code>)  Typescript  artifacts output directory. __*Default*__: \"lib\"\n  * **projenrcTs** (<code>boolean</code>)  Use TypeScript for your projenrc file (`.projenrc.ts`). __*Default*__: false\n  * **projenrcTsOptions** (<code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code>)  Options for .projenrc.ts. __*Optional*__\n  * **sampleCode** (<code>boolean</code>)  Generate one-time sample in `src/` and `test/` if there are no files there. __*Default*__: true\n  * **srcdir** (<code>string</code>)  Typescript sources directory. __*Default*__: \"src\"\n  * **testdir** (<code>string</code>)  Jest tests directory. Tests files should be named `xxx.test.ts`. __*Default*__: \"test\"\n  * **tsconfig** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom TSConfig. __*Default*__: default options\n  * **tsconfigDev** (<code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code>)  Custom tsconfig options for the development tsconfig.json file (used for testing). __*Default*__: use the production tsconfig options\n  * **tsconfigDevFile** (<code>string</code>)  The name of the development tsconfig.json file. __*Default*__: \"tsconfig.dev.json\"\n  * **typescriptVersion** (<code>string</code>)  TypeScript version to use. __*Default*__: \"latest\"\n  * **rewire** (<code>Map<string, any></code>)  Rewire webpack configuration. __*Default*__: No rewired config.\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**srcdir**🔹 | <code>string</code> | The directory in which source files reside.\n\n\n\n## class TailwindConfig 🔹 <a id=\"projen-web-tailwindconfig\"></a>\n\nDeclares a Tailwind CSS configuration file.\n\nThere are multiple ways to add Tailwind CSS in your node project - see:\nhttps://tailwindcss.com/docs/installation\n\n__Submodule__: web\n\n\n### Initializer\n\n\n\n\n```ts\nnew web.TailwindConfig(project: NodeProject, options?: TailwindConfigOptions)\n```\n\n* **project** (<code>[javascript.NodeProject](#projen-javascript-nodeproject)</code>)  *No description*\n* **options** (<code>[web.TailwindConfigOptions](#projen-web-tailwindconfigoptions)</code>)  *No description*\n  * **fileName** (<code>string</code>)  *No description* __*Default*__: \"tailwind.config.json\"\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**file**🔹 | <code>[JsonFile](#projen-jsonfile)</code> | <span></span>\n**fileName**🔹 | <code>string</code> | <span></span>\n\n\n\n## struct CreateProjectOptions 🔹 <a id=\"projen-createprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**dir**🔹 | <code>string</code> | Directory that the project will be generated in.\n**projectFqn**🔹 | <code>string</code> | Fully-qualified name of the project type (usually formatted as `module.ProjectType`).\n**projectOptions**🔹 | <code>Map<string, any></code> | Project options.\n**optionHints**?🔹 | <code>[InitProjectOptionHints](#projen-initprojectoptionhints)</code> | Should we render commented-out default options in the projenrc file?<br/>__*Default*__: InitProjectOptionHints.FEATURED\n**post**?🔹 | <code>boolean</code> | Should we execute post synthesis hooks?<br/>__*Default*__: true\n**synth**?🔹 | <code>boolean</code> | Should we call `project.synth()` or instantiate the project (could still have side-effects) and render the .projenrc file.<br/>__*Default*__: true\n\n\n\n## struct Dependency 🔹 <a id=\"projen-dependency\"></a>\n\n__Obtainable from__: [JavaProject](#projen-java-javaproject).[addPlugin](#projen-java-javaproject#projen-java-javaproject-addplugin)(), [Pom](#projen-java-pom).[addPlugin](#projen-java-pom#projen-java-pom-addplugin)(), [Dependencies](#projen-dependencies).[addDependency](#projen-dependencies#projen-dependencies-adddependency)(), [Dependencies](#projen-dependencies).[getDependency](#projen-dependencies#projen-dependencies-getdependency)(), [Dependencies](#projen-dependencies).[tryGetDependency](#projen-dependencies#projen-dependencies-trygetdependency)()\n\nRepresents a project dependency.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | The package manager name of the dependency (e.g. `leftpad` for npm).\n**type**🔹 | <code>[DependencyType](#projen-dependencytype)</code> | Which type of dependency this is (runtime, build-time, etc).\n**metadata**?🔹 | <code>Map<string, any></code> | Additional JSON metadata associated with the dependency (package manager specific).<br/>__*Default*__: {}\n**version**?🔹 | <code>string</code> | Semantic version version requirement.<br/>__*Default*__: requirement is managed by the package manager (e.g. npm/yarn).\n\n\n\n## struct DependencyCoordinates 🔹 <a id=\"projen-dependencycoordinates\"></a>\n\n__Obtainable from__: [Dependencies](#projen-dependencies).[parseDependency](#projen-dependencies#projen-dependencies-parsedependency)()\n\nCoordinates of the dependency (name and version).\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | The package manager name of the dependency (e.g. `leftpad` for npm).\n**version**?🔹 | <code>string</code> | Semantic version version requirement.<br/>__*Default*__: requirement is managed by the package manager (e.g. npm/yarn).\n\n\n\n## struct DepsManifest 🔹 <a id=\"projen-depsmanifest\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**dependencies**🔹 | <code>Array<[Dependency](#projen-dependency)></code> | All dependencies of this module.\n\n\n\n## struct DevEnvironmentOptions 🔹 <a id=\"projen-devenvironmentoptions\"></a>\n\n\nBase options for configuring a container-based development environment.\n\n\n\nName | Type | Description \n-----|------|-------------\n**dockerImage**?🔹 | <code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code> | A Docker image or Dockerfile for the container.<br/>__*Optional*__\n**ports**?🔹 | <code>Array<string></code> | An array of ports that should be exposed from the container.<br/>__*Optional*__\n**tasks**?🔹 | <code>Array<[Task](#projen-task)></code> | An array of tasks that should be run when the container starts.<br/>__*Optional*__\n**vscodeExtensions**?🔹 | <code>Array<string></code> | An array of extension IDs that specify the extensions that should be installed inside the container when it is created.<br/>__*Optional*__\n\n\n\n## struct DockerComposeBuild 🔹 <a id=\"projen-dockercomposebuild\"></a>\n\n\nBuild arguments for creating a docker image.\n\n\n\nName | Type | Description \n-----|------|-------------\n**context**🔹 | <code>string</code> | Docker build context directory.\n**args**?🔹 | <code>Map<string, string></code> | Build args.<br/>__*Default*__: none are provided\n**dockerfile**?🔹 | <code>string</code> | A dockerfile to build from.<br/>__*Default*__: \"Dockerfile\"\n\n\n\n## struct DockerComposePortMappingOptions 🔹 <a id=\"projen-dockercomposeportmappingoptions\"></a>\n\n\nOptions for port mappings.\n\n\n\nName | Type | Description \n-----|------|-------------\n**protocol**?🔹 | <code>[DockerComposeProtocol](#projen-dockercomposeprotocol)</code> | Port mapping protocol.<br/>__*Default*__: DockerComposeProtocol.TCP\n\n\n\n## struct DockerComposeProps 🔹 <a id=\"projen-dockercomposeprops\"></a>\n\n\nProps for DockerCompose.\n\n\n\nName | Type | Description \n-----|------|-------------\n**nameSuffix**?🔹 | <code>string</code> | A name to add to the docker-compose.yml filename.<br/>__*Default*__: no name is added\n**schemaVersion**?🔹 | <code>string</code> | Docker Compose schema version do be used.<br/>__*Default*__: 3.3\n**services**?🔹 | <code>Map<string, [DockerComposeServiceDescription](#projen-dockercomposeservicedescription)></code> | Service descriptions.<br/>__*Optional*__\n\n\n\n## struct DockerComposeServiceDescription 🔹 <a id=\"projen-dockercomposeservicedescription\"></a>\n\n\nDescription of a docker-compose.yml service.\n\n\n\nName | Type | Description \n-----|------|-------------\n**command**?🔹 | <code>Array<string></code> | Provide a command to the docker container.<br/>__*Default*__: use the container's default command\n**dependsOn**?🔹 | <code>Array<[IDockerComposeServiceName](#projen-idockercomposeservicename)></code> | Names of other services this service depends on.<br/>__*Default*__: no dependencies\n**environment**?🔹 | <code>Map<string, string></code> | Add environment variables.<br/>__*Default*__: no environment variables are provided\n**image**?🔹 | <code>string</code> | Use a docker image.<br/>__*Optional*__\n**imageBuild**?🔹 | <code>[DockerComposeBuild](#projen-dockercomposebuild)</code> | Build a docker image.<br/>__*Optional*__\n**ports**?🔹 | <code>Array<[DockerComposeServicePort](#projen-dockercomposeserviceport)></code> | Map some ports.<br/>__*Default*__: no ports are mapped\n**volumes**?🔹 | <code>Array<[IDockerComposeVolumeBinding](#projen-idockercomposevolumebinding)></code> | Mount some volumes into the service.<br/>__*Optional*__\n\n\n\n## struct DockerComposeServicePort 🔹 <a id=\"projen-dockercomposeserviceport\"></a>\n\n__Obtainable from__: [DockerCompose](#projen-dockercompose).[portMapping](#projen-dockercompose#projen-dockercompose-portmapping)()\n\nA service port mapping.\n\n\n\nName | Type | Description \n-----|------|-------------\n**mode**🔹 | <code>string</code> | Port mapping mode.\n**protocol**🔹 | <code>[DockerComposeProtocol](#projen-dockercomposeprotocol)</code> | Network protocol.\n**published**🔹 | <code>number</code> | Published port number.\n**target**🔹 | <code>number</code> | Target port number.\n\n\n\n## struct DockerComposeVolumeConfig 🔹 <a id=\"projen-dockercomposevolumeconfig\"></a>\n\n\nVolume configuration.\n\n\n\nName | Type | Description \n-----|------|-------------\n**driver**?🔹 | <code>string</code> | Driver to use for the volume.<br/>__*Default*__: value is not provided\n**driverOpts**?🔹 | <code>Map<string, string></code> | Options to provide to the driver.<br/>__*Optional*__\n**external**?🔹 | <code>boolean</code> | Set to true to indicate that the volume is externally created.<br/>__*Default*__: unset, indicating that docker-compose creates the volume\n**name**?🔹 | <code>string</code> | Name of the volume for when the volume name isn't going to work in YAML.<br/>__*Default*__: unset, indicating that docker-compose creates volumes as usual\n\n\n\n## struct DockerComposeVolumeMount 🔹 <a id=\"projen-dockercomposevolumemount\"></a>\n\n\nService volume mounting information.\n\n\n\nName | Type | Description \n-----|------|-------------\n**source**🔹 | <code>string</code> | Volume source.\n**target**🔹 | <code>string</code> | Volume target.\n**type**🔹 | <code>string</code> | Type of volume.\n\n\n\n## struct FileBaseOptions 🔹 <a id=\"projen-filebaseoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct GitpodOptions 🔹 <a id=\"projen-gitpodoptions\"></a>\n\n\nConstructor options for the Gitpod component.\n\nBy default, Gitpod uses the 'gitpod/workspace-full' docker image.\n\n\n\nName | Type | Description \n-----|------|-------------\n**dockerImage**?🔹 | <code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code> | A Docker image or Dockerfile for the container.<br/>__*Optional*__\n**ports**?🔹 | <code>Array<string></code> | An array of ports that should be exposed from the container.<br/>__*Optional*__\n**prebuilds**?🔹 | <code>[GitpodPrebuilds](#projen-gitpodprebuilds)</code> | Optional Gitpod's Github App integration for prebuilds If this is not set and Gitpod's Github App is installed, then Gitpod will apply these defaults: https://www.gitpod.io/docs/prebuilds/#configure-the-github-app.<br/>__*Default*__: undefined\n**tasks**?🔹 | <code>Array<[Task](#projen-task)></code> | An array of tasks that should be run when the container starts.<br/>__*Optional*__\n**vscodeExtensions**?🔹 | <code>Array<string></code> | An array of extension IDs that specify the extensions that should be installed inside the container when it is created.<br/>__*Optional*__\n\n\n\n## struct GitpodPort 🔹 <a id=\"projen-gitpodport\"></a>\n\n\nOptions for an exposed port on Gitpod.\n\n\n\nName | Type | Description \n-----|------|-------------\n**onOpen**?🔹 | <code>[GitpodOnOpen](#projen-gitpodonopen)</code> | What to do when a service on a port is detected.<br/>__*Default*__: GitpodOnOpen.NOTIFY\n**port**?🔹 | <code>string</code> | A port that should be exposed (forwarded) from the container.<br/>__*Optional*__\n**visibility**?🔹 | <code>[GitpodPortVisibility](#projen-gitpodportvisibility)</code> | Whether the port visibility should be private or public.<br/>__*Default*__: GitpodPortVisibility.PUBLIC\n\n\n\n## struct GitpodPrebuilds 🔹 <a id=\"projen-gitpodprebuilds\"></a>\n\n\nConfigure the Gitpod App for prebuilds.\n\nCurrently only GitHub is supported.\n\n\n\nName | Type | Description \n-----|------|-------------\n**addBadge**?🔹 | <code>boolean</code> | Add a \"Review in Gitpod\" button to the pull request's description.<br/>__*Default*__: false\n**addCheck**?🔹 | <code>boolean</code> | Add a check to pull requests.<br/>__*Default*__: true\n**addComment**?🔹 | <code>boolean</code> | Add a \"Review in Gitpod\" button as a comment to pull requests.<br/>__*Default*__: false\n**addLabel**?🔹 | <code>boolean</code> | Add a label once the prebuild is ready to pull requests.<br/>__*Default*__: false\n**branches**?🔹 | <code>boolean</code> | Enable for all branches in this repo.<br/>__*Default*__: false\n**master**?🔹 | <code>boolean</code> | Enable for the master/default branch.<br/>__*Default*__: true\n**pullRequests**?🔹 | <code>boolean</code> | Enable for pull requests coming from this repo.<br/>__*Default*__: true\n**pullRequestsFromForks**?🔹 | <code>boolean</code> | Enable for pull requests coming from forks.<br/>__*Default*__: false\n\n\n\n## struct GitpodTask 🔹 <a id=\"projen-gitpodtask\"></a>\n\n\nConfigure options for a task to be run when opening a Gitpod workspace (e.g. running tests, or starting a dev server).\n\nStart Mode         | Execution\nFresh Workspace    | before && init && command\nRestart Workspace  | before && command\nSnapshot           | before && command\nPrebuild           | before && init && prebuild\n\n\n\nName | Type | Description \n-----|------|-------------\n**command**🔹 | <code>string</code> | Required.\n**before**?🔹 | <code>string</code> | In case you need to run something even before init, that is a requirement for both init and command, you can use the before property.<br/>__*Optional*__\n**init**?🔹 | <code>string</code> | The init property can be used to specify shell commands that should only be executed after a workspace was freshly cloned and needs to be initialized somehow.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | A name for this task.<br/>__*Default*__: task names are omitted when blank\n**openIn**?🔹 | <code>[GitpodOpenIn](#projen-gitpodopenin)</code> | You can configure where in the IDE the terminal should be opened.<br/>__*Default*__: GitpodOpenIn.BOTTOM\n**openMode**?🔹 | <code>[GitpodOpenMode](#projen-gitpodopenmode)</code> | You can configure how the terminal should be opened relative to the previous task.<br/>__*Default*__: GitpodOpenMode.TAB_AFTER\n**prebuild**?🔹 | <code>string</code> | The optional prebuild command will be executed during prebuilds.<br/>__*Optional*__\n\n\n\n## interface IDevEnvironment 🔹 <a id=\"projen-idevenvironment\"></a>\n\n__Implemented by__: [vscode.DevContainer](#projen-vscode-devcontainer), [Gitpod](#projen-gitpod)\n\nAbstract interface for container-based development environments, such as Gitpod and GitHub Codespaces.\n### Methods\n\n\n#### addDockerImage(image)🔹 <a id=\"projen-idevenvironment-adddockerimage\"></a>\n\nAdd a custom Docker image or Dockerfile for the container.\n\n```ts\naddDockerImage(image: DevEnvironmentDockerImage): void\n```\n\n* **image** (<code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code>)  The Docker image.\n\n\n\n\n#### addPorts(...ports)🔹 <a id=\"projen-idevenvironment-addports\"></a>\n\nAdds ports that should be exposed (forwarded) from the container.\n\n```ts\naddPorts(...ports: string[]): void\n```\n\n* **ports** (<code>string</code>)  The new ports.\n\n\n\n\n#### addTasks(...tasks)🔹 <a id=\"projen-idevenvironment-addtasks\"></a>\n\nAdds tasks to run when the container starts.\n\n```ts\naddTasks(...tasks: Task[]): void\n```\n\n* **tasks** (<code>[Task](#projen-task)</code>)  The new tasks.\n\n\n\n\n#### addVscodeExtensions(...extensions)🔹 <a id=\"projen-idevenvironment-addvscodeextensions\"></a>\n\nAdds a list of VSCode extensions that should be automatically installed in the container.\n\n```ts\naddVscodeExtensions(...extensions: string[]): void\n```\n\n* **extensions** (<code>string</code>)  The extension IDs.\n\n\n\n\n\n\n## interface IDockerComposeServiceName 🔹 <a id=\"projen-idockercomposeservicename\"></a>\n\n__Implemented by__: [DockerComposeService](#projen-dockercomposeservice)\n__Obtainable from__: [DockerCompose](#projen-dockercompose).[serviceName](#projen-dockercompose#projen-dockercompose-servicename)()\n\nAn interface providing the name of a docker compose service.\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**serviceName**🔹 | <code>string</code> | The name of the docker compose service.\n\n\n\n## interface IDockerComposeVolumeBinding 🔹 <a id=\"projen-idockercomposevolumebinding\"></a>\n\n__Obtainable from__: [DockerCompose](#projen-dockercompose).[bindVolume](#projen-dockercompose#projen-dockercompose-bindvolume)(), [DockerCompose](#projen-dockercompose).[namedVolume](#projen-dockercompose#projen-dockercompose-namedvolume)()\n\nVolume binding information.\n### Methods\n\n\n#### bind(volumeConfig)🔹 <a id=\"projen-idockercomposevolumebinding-bind\"></a>\n\nBinds the requested volume to the docker-compose volume configuration and provide mounting instructions for synthesis.\n\n```ts\nbind(volumeConfig: IDockerComposeVolumeConfig): DockerComposeVolumeMount\n```\n\n* **volumeConfig** (<code>[IDockerComposeVolumeConfig](#projen-idockercomposevolumeconfig)</code>)  the volume configuration.\n\n__Returns__:\n* <code>[DockerComposeVolumeMount](#projen-dockercomposevolumemount)</code>\n\n\n\n## interface IDockerComposeVolumeConfig 🔹 <a id=\"projen-idockercomposevolumeconfig\"></a>\n\n\nStorage for volume configuration.\n### Methods\n\n\n#### addVolumeConfiguration(volumeName, configuration)🔹 <a id=\"projen-idockercomposevolumeconfig-addvolumeconfiguration\"></a>\n\nAdd volume configuration to the repository.\n\n```ts\naddVolumeConfiguration(volumeName: string, configuration: DockerComposeVolumeConfig): void\n```\n\n* **volumeName** (<code>string</code>)  *No description*\n* **configuration** (<code>[DockerComposeVolumeConfig](#projen-dockercomposevolumeconfig)</code>)  *No description*\n  * **driver** (<code>string</code>)  Driver to use for the volume. __*Default*__: value is not provided\n  * **driverOpts** (<code>Map<string, string></code>)  Options to provide to the driver. __*Optional*__\n  * **external** (<code>boolean</code>)  Set to true to indicate that the volume is externally created. __*Default*__: unset, indicating that docker-compose creates the volume\n  * **name** (<code>string</code>)  Name of the volume for when the volume name isn't going to work in YAML. __*Default*__: unset, indicating that docker-compose creates volumes as usual\n\n\n\n\n\n\n## interface IResolvable 🔹 <a id=\"projen-iresolvable\"></a>\n\n\n\n### Methods\n\n\n#### toJSON()🔹 <a id=\"projen-iresolvable-tojson\"></a>\n\nResolves and returns content.\n\n```ts\ntoJSON(): any\n```\n\n\n__Returns__:\n* <code>any</code>\n\n\n\n## interface IResolver 🔹 <a id=\"projen-iresolver\"></a>\n\n\nAPI for resolving tokens when synthesizing file content.\n### Methods\n\n\n#### resolve(value, options?)🔹 <a id=\"projen-iresolver-resolve\"></a>\n\nGiven a value (object/string/array/whatever, looks up any functions inside the object and returns an object where all functions are called.\n\n```ts\nresolve(value: any, options?: ResolveOptions): any\n```\n\n* **value** (<code>any</code>)  The value to resolve.\n* **options** (<code>[ResolveOptions](#projen-resolveoptions)</code>)  *No description*\n  * **args** (<code>Array<any></code>)  Context arguments. __*Default*__: []\n  * **omitEmpty** (<code>boolean</code>)  Omits empty arrays and objects. __*Default*__: false\n\n__Returns__:\n* <code>any</code>\n\n\n\n## struct IniFileOptions 🔹 <a id=\"projen-inifileoptions\"></a>\n\n\nOptions for `IniFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**obj**?🔹 | <code>any</code> | The object that will be serialized.<br/>__*Default*__: {} an empty object (use `file.obj` to mutate).\n**omitEmpty**?🔹 | <code>boolean</code> | Omits empty objects and arrays.<br/>__*Default*__: false\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct InitProject 🔹 <a id=\"projen-initproject\"></a>\n\n\nInformation passed from `projen new` to the project object when the project is first created.\n\nIt is used to generate projenrc files in various languages.\n\n\n\nName | Type | Description \n-----|------|-------------\n**args**🔹 | <code>Map<string, any></code> | Initial arguments passed to `projen new`.\n**comments**🔹 | <code>[InitProjectOptionHints](#projen-initprojectoptionhints)</code> | Include commented out options.\n**fqn**🔹 | <code>string</code> | The JSII FQN of the project type.\n**type**🔹 | <code>[ProjectType](#projen-projecttype)</code> | Project metadata.\n\n\n\n## struct JsonFileOptions 🔹 <a id=\"projen-jsonfileoptions\"></a>\n\n\nOptions for `JsonFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**allowComments**?🔹 | <code>boolean</code> | Allow the use of comments in this file.<br/>__*Default*__: false for .json files, true for .json5 and .jsonc files\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**newline**?🔹 | <code>boolean</code> | Adds a newline at the end of the file.<br/>__*Default*__: true\n**obj**?🔹 | <code>any</code> | The object that will be serialized.<br/>__*Default*__: {} an empty object (use `file.obj` to mutate).\n**omitEmpty**?🔹 | <code>boolean</code> | Omits empty objects and arrays.<br/>__*Default*__: false\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct LicenseOptions 🔹 <a id=\"projen-licenseoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**spdx**🔹 | <code>string</code> | License type (SPDX).\n**copyrightOwner**?🔹 | <code>string</code> | Copyright owner.<br/>__*Default*__: -\n**copyrightPeriod**?🔹 | <code>string</code> | Period of license (e.g. \"1998-2023\").<br/>__*Default*__: current year (e.g. \"2020\")\n\n\n\n## struct LoggerOptions 🔹 <a id=\"projen-loggeroptions\"></a>\n\n\nOptions for logging utilities.\n\n\n\nName | Type | Description \n-----|------|-------------\n**level**?🔹 | <code>[LogLevel](#projen-loglevel)</code> | The logging verbosity.<br/>__*Default*__: LogLevel.INFO\n**usePrefix**?🔹 | <code>boolean</code> | Include a prefix for all logging messages with the project name.<br/>__*Default*__: false\n\n\n\n## struct MakefileOptions 🔹 <a id=\"projen-makefileoptions\"></a>\n\n\nOptions for Makefiles.\n\n\n\nName | Type | Description \n-----|------|-------------\n**all**?🔹 | <code>Array<string></code> | List of targets to build when Make is invoked without specifying any targets.<br/>__*Default*__: []\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n**rules**?🔹 | <code>Array<[Rule](#projen-rule)></code> | Rules to include in the Makefile.<br/>__*Default*__: []\n\n\n\n## struct ObjectFileOptions 🔹 <a id=\"projen-objectfileoptions\"></a>\n\n\nOptions for `ObjectFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**obj**?🔹 | <code>any</code> | The object that will be serialized.<br/>__*Default*__: {} an empty object (use `file.obj` to mutate).\n**omitEmpty**?🔹 | <code>boolean</code> | Omits empty objects and arrays.<br/>__*Default*__: false\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct ProjectOptions 🔹 <a id=\"projen-projectoptions\"></a>\n\n\nOptions for `Project`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | This is the name of your project.\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n\n\n\n## struct ProjenrcOptions 🔹 <a id=\"projen-projenrcoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**filename**?🔹 | <code>string</code> | The name of the projenrc file.<br/>__*Default*__: \".projenrc.json\"\n\n\n\n## struct RenovatebotOptions 🔹 <a id=\"projen-renovatebotoptions\"></a>\n\n\nOptions for Renovatebot.\n\n\n\nName | Type | Description \n-----|------|-------------\n**ignore**?🔹 | <code>Array<string></code> | You can use the `ignore` option to customize which dependencies are updated.<br/>__*Default*__: []\n**ignoreProjen**?🔹 | <code>boolean</code> | Ignores updates to `projen`.<br/>__*Default*__: true\n**labels**?🔹 | <code>Array<string></code> | List of labels to apply to the created PR's.<br/>__*Optional*__\n**scheduleInterval**?🔹 | <code>Array<string></code> | How often to check for new versions and raise pull requests.<br/>__*Default*__: [\"at any time\"]\n\n\n\n## struct ResolveOptions 🔹 <a id=\"projen-resolveoptions\"></a>\n\n\nResolve options.\n\n\n\nName | Type | Description \n-----|------|-------------\n**args**?🔹 | <code>Array<any></code> | Context arguments.<br/>__*Default*__: []\n**omitEmpty**?🔹 | <code>boolean</code> | Omits empty arrays and objects.<br/>__*Default*__: false\n\n\n\n## struct Rule 🔹 <a id=\"projen-rule\"></a>\n\n\nA Make rule.\n\n\n\nName | Type | Description \n-----|------|-------------\n**targets**🔹 | <code>Array<string></code> | Files to be created or updated by this rule.\n**phony**?🔹 | <code>boolean</code> | Marks whether the target is phony.<br/>__*Default*__: false\n**prerequisites**?🔹 | <code>Array<string></code> | Files that are used as inputs to create a target.<br/>__*Default*__: []\n**recipe**?🔹 | <code>Array<string></code> | Commands that are run (using prerequisites as inputs) to create a target.<br/>__*Default*__: []\n\n\n\n## struct SampleDirOptions 🔹 <a id=\"projen-samplediroptions\"></a>\n\n\nSampleDir options.\n\n\n\nName | Type | Description \n-----|------|-------------\n**files**?🔹 | <code>Map<string, string></code> | The files to render into the directory.<br/>__*Optional*__\n**sourceDir**?🔹 | <code>string</code> | Absolute path to a directory to copy files from (does not need to be text files).<br/>__*Optional*__\n\n\n\n## struct SampleFileOptions 🔹 <a id=\"projen-samplefileoptions\"></a>\n\n\nOptions for the SampleFile object.\n\n\n\nName | Type | Description \n-----|------|-------------\n**contents**?🔹 | <code>string</code> | The contents of the file to write.<br/>__*Optional*__\n**sourcePath**?🔹 | <code>string</code> | Absolute path to a file to copy the contents from (does not need to be a text file).<br/>__*Optional*__\n\n\n\n## struct SampleReadmeProps 🔹 <a id=\"projen-samplereadmeprops\"></a>\n\n\nSampleReadme Properties.\n\n\n\nName | Type | Description \n-----|------|-------------\n**contents**?🔹 | <code>string</code> | The contents.<br/>__*Default*__: \"# replace this\"\n**filename**?🔹 | <code>string</code> | The name of the README.md file.<br/>__*Default*__: \"README.md\"\n\n\n\n## struct SnapshotOptions 🔹 <a id=\"projen-snapshotoptions\"></a>\n\n\nOptions for the Snapshot synthesis.\n\n\n\nName | Type | Description \n-----|------|-------------\n**parseJson**?🔹 | <code>boolean</code> | Parse .json files as a JS object for improved inspection. This will fail if the contents are invalid JSON.<br/>__*Default*__: true parse .json files into an object\n\n\n\n## struct SourceCodeOptions 🔹 <a id=\"projen-sourcecodeoptions\"></a>\n\n\nOptions for `SourceCodeFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**indent**?🔹 | <code>number</code> | Indentation size.<br/>__*Default*__: 2\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct TaskCommonOptions 🔹 <a id=\"projen-taskcommonoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**condition**?🔹 | <code>string</code> | A shell command which determines if the this task should be executed.<br/>__*Optional*__\n**cwd**?🔹 | <code>string</code> | The working directory for all steps in this task (unless overridden by the step).<br/>__*Default*__: process.cwd()\n**description**?🔹 | <code>string</code> | The description of this build command.<br/>__*Default*__: the task name\n**env**?🔹 | <code>Map<string, string></code> | Defines environment variables for the execution of this task.<br/>__*Default*__: {}\n**requiredEnv**?🔹 | <code>Array<string></code> | A set of environment variables that must be defined in order to execute this task.<br/>__*Optional*__\n\n\n\n## struct TaskOptions 🔹 <a id=\"projen-taskoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**condition**?🔹 | <code>string</code> | A shell command which determines if the this task should be executed.<br/>__*Optional*__\n**cwd**?🔹 | <code>string</code> | The working directory for all steps in this task (unless overridden by the step).<br/>__*Default*__: process.cwd()\n**description**?🔹 | <code>string</code> | The description of this build command.<br/>__*Default*__: the task name\n**env**?🔹 | <code>Map<string, string></code> | Defines environment variables for the execution of this task.<br/>__*Default*__: {}\n**exec**?🔹 | <code>string</code> | Shell command to execute as the first command of the task.<br/>__*Default*__: add steps using `task.exec(command)` or `task.spawn(subtask)`\n**requiredEnv**?🔹 | <code>Array<string></code> | A set of environment variables that must be defined in order to execute this task.<br/>__*Optional*__\n**steps**?🔹 | <code>Array<[TaskStep](#projen-taskstep)></code> | List of task steps to run.<br/>__*Optional*__\n\n\n\n## struct TaskSpec 🔹 <a id=\"projen-taskspec\"></a>\n\n__Obtainable from__: [TaskRuntime](#projen-taskruntime).[tryFindTask](#projen-taskruntime#projen-taskruntime-tryfindtask)()\n\nSpecification of a single task.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | Task name.\n**condition**?🔹 | <code>string</code> | A shell command which determines if the this task should be executed.<br/>__*Optional*__\n**cwd**?🔹 | <code>string</code> | The working directory for all steps in this task (unless overridden by the step).<br/>__*Default*__: process.cwd()\n**description**?🔹 | <code>string</code> | The description of this build command.<br/>__*Default*__: the task name\n**env**?🔹 | <code>Map<string, string></code> | Defines environment variables for the execution of this task.<br/>__*Default*__: {}\n**requiredEnv**?🔹 | <code>Array<string></code> | A set of environment variables that must be defined in order to execute this task.<br/>__*Optional*__\n**steps**?🔹 | <code>Array<[TaskStep](#projen-taskstep)></code> | Task steps.<br/>__*Optional*__\n\n\n\n## struct TaskStep 🔹 <a id=\"projen-taskstep\"></a>\n\n\nA single step within a task.\n\nThe step could either be  the execution of a\nshell command or execution of a sub-task, by name.\n\n\n\nName | Type | Description \n-----|------|-------------\n**builtin**?🔹 | <code>string</code> | The name of a built-in task to execute.<br/>__*Default*__: do not execute a builtin task\n**cwd**?🔹 | <code>string</code> | The working directory for this step.<br/>__*Default*__: determined by the task\n**exec**?🔹 | <code>string</code> | Shell command to execute.<br/>__*Default*__: don't execute a shell command\n**name**?🔹 | <code>string</code> | Step name.<br/>__*Default*__: no name\n**say**?🔹 | <code>string</code> | Print a message.<br/>__*Default*__: don't say anything\n**spawn**?🔹 | <code>string</code> | Subtask to execute.<br/>__*Default*__: don't spawn a subtask\n\n\n\n## struct TaskStepOptions 🔹 <a id=\"projen-taskstepoptions\"></a>\n\n\nOptions for task steps.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cwd**?🔹 | <code>string</code> | The working directory for this step.<br/>__*Default*__: determined by the task\n**name**?🔹 | <code>string</code> | Step name.<br/>__*Default*__: no name\n\n\n\n## struct TasksManifest 🔹 <a id=\"projen-tasksmanifest\"></a>\n\n\nSchema for `tasks.json`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**env**?🔹 | <code>Map<string, string></code> | Environment for all tasks.<br/>__*Optional*__\n**tasks**?🔹 | <code>Map<string, [TaskSpec](#projen-taskspec)></code> | All tasks available for this project.<br/>__*Optional*__\n\n\n\n## struct TextFileOptions 🔹 <a id=\"projen-textfileoptions\"></a>\n\n\nOptions for `TextFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**lines**?🔹 | <code>Array<string></code> | The contents of the text file.<br/>__*Default*__: [] empty file\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct TomlFileOptions 🔹 <a id=\"projen-tomlfileoptions\"></a>\n\n\nOptions for `TomlFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**obj**?🔹 | <code>any</code> | The object that will be serialized.<br/>__*Default*__: {} an empty object (use `file.obj` to mutate).\n**omitEmpty**?🔹 | <code>boolean</code> | Omits empty objects and arrays.<br/>__*Default*__: false\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct VersionOptions 🔹 <a id=\"projen-versionoptions\"></a>\n\n\nOptions for `Version`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactsDirectory**🔹 | <code>string</code> | The name of the directory into which `changelog.md` and `version.txt` files are emitted.\n**versionInputFile**🔹 | <code>string</code> | A name of a .json file to set the `version` field in after a bump.\n**tagPrefix**?🔹 | <code>string</code> | The tag prefix corresponding to this version.<br/>__*Optional*__\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration for versionrc file used by standard-release.<br/>__*Optional*__\n\n\n\n## struct XmlFileOptions 🔹 <a id=\"projen-xmlfileoptions\"></a>\n\n\nOptions for `XmlFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**obj**?🔹 | <code>any</code> | The object that will be serialized.<br/>__*Default*__: {} an empty object (use `file.obj` to mutate).\n**omitEmpty**?🔹 | <code>boolean</code> | Omits empty objects and arrays.<br/>__*Default*__: false\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct YamlFileOptions 🔹 <a id=\"projen-yamlfileoptions\"></a>\n\n\nOptions for `JsonFile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?🔹 | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?🔹 | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?🔹 | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**lineWidth**?🔹 | <code>number</code> | Maximum line width (set to 0 to disable folding).<br/>__*Default*__: 0\n**marker**?🔹 | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**obj**?🔹 | <code>any</code> | The object that will be serialized.<br/>__*Default*__: {} an empty object (use `file.obj` to mutate).\n**omitEmpty**?🔹 | <code>boolean</code> | Omits empty objects and arrays.<br/>__*Default*__: false\n**readonly**?🔹 | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct AutoDiscoverCommonOptions 🔹 <a id=\"projen-awscdk-autodiscovercommonoptions\"></a>\n\n\nCommon options for auto discovering project subcomponents.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n\n\n\n## struct AutoDiscoverOptions 🔹 <a id=\"projen-awscdk-autodiscoveroptions\"></a>\n\n\nOptions for `AutoDiscover`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**srcdir**🔹 | <code>string</code> | Project source tree (relative to project output directory).\n**testdir**🔹 | <code>string</code> | Test source tree.\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n**edgeLambdaAutoDiscover**?🔹 | <code>boolean</code> | Auto-discover edge lambda functions.<br/>__*Default*__: true\n**integrationTestAutoDiscover**?🔹 | <code>boolean</code> | Auto-discover integration tests.<br/>__*Default*__: true\n**integrationTestOptions**?🔹 | <code>[awscdk.IntegrationTestCommonOptions](#projen-awscdk-integrationtestcommonoptions)</code> | Options for integration tests.<br/>__*Optional*__\n**lambdaAutoDiscover**?🔹 | <code>boolean</code> | Auto-discover lambda functions.<br/>__*Default*__: true\n**lambdaExtensionAutoDiscover**?🔹 | <code>boolean</code> | Auto-discover lambda extensions.<br/>__*Default*__: true\n**lambdaExtensionOptions**?🔹 | <code>[awscdk.LambdaExtensionCommonOptions](#projen-awscdk-lambdaextensioncommonoptions)</code> | Options for lambda extensions.<br/>__*Optional*__\n**lambdaOptions**?🔹 | <code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code> | Options for AWS Lambda functions.<br/>__*Optional*__\n\n\n\n## struct AwsCdkConstructLibraryOptions 🔹 <a id=\"projen-awscdk-awscdkconstructlibraryoptions\"></a>\n\n\nOptions for `AwsCdkConstructLibrary`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**author**🔹 | <code>string</code> | The name of the library author.\n**authorAddress**🔹 | <code>string</code> | Email or URL of the library author.\n**cdkVersion**🔹 | <code>string</code> | Minimum version of the AWS CDK to depend on.\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**repositoryUrl**🔹 | <code>string</code> | Git repository URL.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**catalog**?🔹 | <code>[cdk.Catalog](#projen-cdk-catalog)</code> | Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.<br/>__*Default*__: new version will be announced\n**cdkAssert**?⚠️ | <code>boolean</code> | Warning: NodeJS only.<br/>__*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n**cdkAssertions**?🔹 | <code>boolean</code> | Install the assertions library?<br/>__*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n**cdkDependencies**?⚠️ | <code>Array<string></code> | Which AWS CDKv1 modules this project requires.<br/>__*Optional*__\n**cdkDependenciesAsDeps**?⚠️ | <code>boolean</code> | If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`).<br/>__*Default*__: true\n**cdkTestDependencies**?⚠️ | <code>Array<string></code> | AWS CDK modules required for testing.<br/>__*Optional*__\n**cdkVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for CDK.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compat**?🔹 | <code>boolean</code> | Automatically run API compatibility test against the latest version published to npm after compilation.<br/>__*Default*__: false\n**compatIgnore**?🔹 | <code>string</code> | Name of the ignore file for API compatibility tests.<br/>__*Default*__: \".compatignore\"\n**compressAssembly**?🔹 | <code>boolean</code> | Emit a compressed version of the assembly.<br/>__*Default*__: false\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docgenFilePath**?🔹 | <code>string</code> | File path for generated docs.<br/>__*Default*__: \"API.md\"\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**dotnet**?⚠️ | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | __*Optional*__\n**edgeLambdaAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `cloudfront.experimental.EdgeFunction` for each `.edge-lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project.<br/>__*Default*__: true\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**excludeTypescript**?🔹 | <code>Array<string></code> | Accepts a list of glob patterns.<br/>__*Optional*__\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**integrationTestAutoDiscover**?🔹 | <code>boolean</code> | Automatically discovers and creates integration tests for each `.integ.ts` file in under your test directory.<br/>__*Default*__: true\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**lambdaAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `aws_lambda.Function` for each `.lambda.ts` handler in your source tree. If this is disabled, you either need to explicitly call `aws_lambda.Function.autoDiscover()` or define a `new aws_lambda.Function()` for each handler.<br/>__*Default*__: true\n**lambdaExtensionAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts` entrypoint in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project.<br/>__*Default*__: true\n**lambdaOptions**?🔹 | <code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code> | Common options for all AWS Lambda functions.<br/>__*Default*__: default options\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**publishToGo**?🔹 | <code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code> | Publish Go bindings to a git repository.<br/>__*Default*__: no publishing\n**publishToMaven**?🔹 | <code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code> | Publish to maven.<br/>__*Default*__: no publishing\n**publishToNuget**?🔹 | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | Publish to NuGet.<br/>__*Default*__: no publishing\n**publishToPypi**?🔹 | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | Publish to pypi.<br/>__*Default*__: no publishing\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**python**?⚠️ | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | __*Optional*__\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rootdir**?🔹 | <code>string</code> | __*Default*__: \".\"\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct AwsCdkDepsCommonOptions 🔹 <a id=\"projen-awscdk-awscdkdepscommonoptions\"></a>\n\n\nOptions for `AwsCdkDeps`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkVersion**🔹 | <code>string</code> | Minimum version of the AWS CDK to depend on.\n**cdkAssert**?⚠️ | <code>boolean</code> | Warning: NodeJS only.<br/>__*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n**cdkAssertions**?🔹 | <code>boolean</code> | Install the assertions library?<br/>__*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n**cdkDependencies**?⚠️ | <code>Array<string></code> | Which AWS CDKv1 modules this project requires.<br/>__*Optional*__\n**cdkDependenciesAsDeps**?⚠️ | <code>boolean</code> | If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`).<br/>__*Default*__: true\n**cdkTestDependencies**?⚠️ | <code>Array<string></code> | AWS CDK modules required for testing.<br/>__*Optional*__\n**cdkVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for CDK.<br/>__*Optional*__\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n\n\n\n## struct AwsCdkDepsOptions 🔹 <a id=\"projen-awscdk-awscdkdepsoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkVersion**🔹 | <code>string</code> | Minimum version of the AWS CDK to depend on.\n**dependencyType**🔹 | <code>[DependencyType](#projen-dependencytype)</code> | The type of dependency to use for runtime AWS CDK and `constructs` modules.\n**cdkAssert**?⚠️ | <code>boolean</code> | Warning: NodeJS only.<br/>__*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n**cdkAssertions**?🔹 | <code>boolean</code> | Install the assertions library?<br/>__*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n**cdkDependencies**?⚠️ | <code>Array<string></code> | Which AWS CDKv1 modules this project requires.<br/>__*Optional*__\n**cdkDependenciesAsDeps**?⚠️ | <code>boolean</code> | If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`).<br/>__*Default*__: true\n**cdkTestDependencies**?⚠️ | <code>Array<string></code> | AWS CDK modules required for testing.<br/>__*Optional*__\n**cdkVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for CDK.<br/>__*Optional*__\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n\n\n\n## struct AwsCdkJavaAppOptions 🔹 <a id=\"projen-awscdk-awscdkjavaappoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactId**🔹 | <code>string</code> | The artifactId is generally the name that the project is known by.\n**cdkVersion**🔹 | <code>string</code> | Minimum version of the AWS CDK to depend on.\n**groupId**🔹 | <code>string</code> | This is generally unique amongst an organization or a project.\n**mainClass**🔹 | <code>string</code> | The name of the Java class with the static `main()` method.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**version**🔹 | <code>string</code> | This is the last piece of the naming puzzle.\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**buildCommand**?🔹 | <code>string</code> | A command to execute before synthesis.<br/>__*Default*__: no build command\n**cdkAssert**?⚠️ | <code>boolean</code> | Warning: NodeJS only.<br/>__*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n**cdkAssertions**?🔹 | <code>boolean</code> | Install the assertions library?<br/>__*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n**cdkDependencies**?⚠️ | <code>Array<string></code> | Which AWS CDKv1 modules this project requires.<br/>__*Optional*__\n**cdkDependenciesAsDeps**?⚠️ | <code>boolean</code> | If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`).<br/>__*Default*__: true\n**cdkTestDependencies**?⚠️ | <code>Array<string></code> | AWS CDK modules required for testing.<br/>__*Optional*__\n**cdkVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for CDK.<br/>__*Optional*__\n**cdkout**?🔹 | <code>string</code> | cdk.out directory.<br/>__*Default*__: \"cdk.out\"\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compileOptions**?🔹 | <code>[java.MavenCompileOptions](#projen-java-mavencompileoptions)</code> | Compile options.<br/>__*Default*__: defaults\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n**context**?🔹 | <code>Map<string, any></code> | Additional context to include in `cdk.json`.<br/>__*Default*__: no additional context\n**deps**?🔹 | <code>Array<string></code> | List of runtime dependencies for this project.<br/>__*Default*__: []\n**description**?🔹 | <code>string</code> | Description of a project is always good.<br/>__*Default*__: undefined\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**distdir**?🔹 | <code>string</code> | Final artifact output directory.<br/>__*Default*__: \"dist/java\"\n**featureFlags**?🔹 | <code>boolean</code> | Include all feature flags in cdk.json.<br/>__*Default*__: true\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**junit**?🔹 | <code>boolean</code> | Include junit tests.<br/>__*Default*__: true\n**junitOptions**?🔹 | <code>[java.JunitOptions](#projen-java-junitoptions)</code> | junit options.<br/>__*Default*__: defaults\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**packaging**?🔹 | <code>string</code> | Project packaging format.<br/>__*Default*__: \"jar\"\n**packagingOptions**?🔹 | <code>[java.MavenPackagingOptions](#projen-java-mavenpackagingoptions)</code> | Packaging options.<br/>__*Default*__: defaults\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenrcJava**?🔹 | <code>boolean</code> | Use projenrc in java.<br/>__*Default*__: true\n**projenrcJavaOptions**?🔹 | <code>[java.ProjenrcOptions](#projen-java-projenrcoptions)</code> | Options related to projenrc in java.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**requireApproval**?🔹 | <code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code> | To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.<br/>__*Default*__: ApprovalLevel.BROADENING\n**sample**?🔹 | <code>boolean</code> | Include sample code and test if the relevant directories don't exist.<br/>__*Default*__: true\n**sampleJavaPackage**?🔹 | <code>string</code> | The java package to use for the code sample.<br/>__*Default*__: \"org.acme\"\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testDeps**?🔹 | <code>Array<string></code> | List of test dependencies for this project.<br/>__*Default*__: []\n**url**?🔹 | <code>string</code> | The URL, like the name, is not required.<br/>__*Default*__: undefined\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**watchExcludes**?🔹 | <code>Array<string></code> | Glob patterns to exclude from `cdk watch`.<br/>__*Default*__: []\n**watchIncludes**?🔹 | <code>Array<string></code> | Glob patterns to include in `cdk watch`.<br/>__*Default*__: []\n\n\n\n## struct AwsCdkPackageNames 🔹 <a id=\"projen-awscdk-awscdkpackagenames\"></a>\n\n__Obtainable from__: [AwsCdkDeps](#projen-awscdk-awscdkdeps).[packageNames](#projen-awscdk-awscdkdeps#projen-awscdk-awscdkdeps-packagenames)(), [AwsCdkDepsJava](#projen-awscdk-awscdkdepsjava).[packageNames](#projen-awscdk-awscdkdepsjava#projen-awscdk-awscdkdepsjava-packagenames)(), [AwsCdkDepsJs](#projen-awscdk-awscdkdepsjs).[packageNames](#projen-awscdk-awscdkdepsjs#projen-awscdk-awscdkdepsjs-packagenames)()\n\nLanguage-specific AWS CDK package names.\n\n\n\nName | Type | Description \n-----|------|-------------\n**assertions**🔹 | <code>string</code> | Fully qualified name of the assertions library package.\n**constructs**🔹 | <code>string</code> | Fully qualified name of the constructs library package.\n**coreV1**🔹 | <code>string</code> | Fully qualified name of the core framework package for CDKv1.\n**coreV2**🔹 | <code>string</code> | Fully qualified name of the core framework package for CDKv2.\n**assert**?🔹 | <code>string</code> | Fully qualified name of the assert library package Can be empty as it's only really available for javascript projects.<br/>__*Optional*__\n\n\n\n## struct AwsCdkPythonAppOptions 🔹 <a id=\"projen-awscdk-awscdkpythonappoptions\"></a>\n\n\nOptions for `AwsCdkPythonApp`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**authorEmail**🔹 | <code>string</code> | Author's e-mail.\n**authorName**🔹 | <code>string</code> | Author's name.\n**cdkVersion**🔹 | <code>string</code> | Minimum version of the AWS CDK to depend on.\n**moduleName**🔹 | <code>string</code> | Name of the python package as used in imports and filenames.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**version**🔹 | <code>string</code> | Version of the package.\n**appEntrypoint**?🔹 | <code>string</code> | The CDK app's entrypoint (relative to the source directory, which is \"src\" by default).<br/>__*Default*__: \"app.py\"\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**buildCommand**?🔹 | <code>string</code> | A command to execute before synthesis.<br/>__*Default*__: no build command\n**cdkAssert**?⚠️ | <code>boolean</code> | Warning: NodeJS only.<br/>__*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n**cdkAssertions**?🔹 | <code>boolean</code> | Install the assertions library?<br/>__*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n**cdkDependencies**?⚠️ | <code>Array<string></code> | Which AWS CDKv1 modules this project requires.<br/>__*Optional*__\n**cdkDependenciesAsDeps**?⚠️ | <code>boolean</code> | If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`).<br/>__*Default*__: true\n**cdkTestDependencies**?⚠️ | <code>Array<string></code> | AWS CDK modules required for testing.<br/>__*Optional*__\n**cdkVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for CDK.<br/>__*Optional*__\n**cdkout**?🔹 | <code>string</code> | cdk.out directory.<br/>__*Default*__: \"cdk.out\"\n**classifiers**?🔹 | <code>Array<string></code> | A list of PyPI trove classifiers that describe the project.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n**context**?🔹 | <code>Map<string, any></code> | Additional context to include in `cdk.json`.<br/>__*Default*__: no additional context\n**deps**?🔹 | <code>Array<string></code> | List of runtime dependencies for this project.<br/>__*Default*__: []\n**description**?🔹 | <code>string</code> | A short description of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | List of dev dependencies for this project.<br/>__*Default*__: []\n**featureFlags**?🔹 | <code>boolean</code> | Include all feature flags in cdk.json.<br/>__*Default*__: true\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | A URL to the website of the project.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License of this package as an SPDX identifier.<br/>__*Optional*__\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**packageName**?🔹 | <code>string</code> | Package name.<br/>__*Optional*__\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**pip**?🔹 | <code>boolean</code> | Use pip with a requirements.txt file to track project dependencies.<br/>__*Default*__: true\n**poetry**?🔹 | <code>boolean</code> | Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing.<br/>__*Default*__: false\n**poetryOptions**?🔹 | <code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code> | Additional options to set for poetry if using poetry.<br/>__*Optional*__\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenrcJs**?🔹 | <code>boolean</code> | Use projenrc in javascript.<br/>__*Default*__: false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options related to projenrc in JavaScript.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcPython**?🔹 | <code>boolean</code> | Use projenrc in Python.<br/>__*Default*__: true\n**projenrcPythonOptions**?🔹 | <code>[python.ProjenrcOptions](#projen-python-projenrcoptions)</code> | Options related to projenrc in python.<br/>__*Default*__: default options\n**pytest**?🔹 | <code>boolean</code> | Include pytest tests.<br/>__*Default*__: true\n**pytestOptions**?🔹 | <code>[python.PytestOptions](#projen-python-pytestoptions)</code> | pytest options.<br/>__*Default*__: defaults\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**requireApproval**?🔹 | <code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code> | To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.<br/>__*Default*__: ApprovalLevel.BROADENING\n**sample**?🔹 | <code>boolean</code> | Include sample code and test if the relevant directories don't exist.<br/>__*Default*__: true\n**setupConfig**?🔹 | <code>Map<string, any></code> | Additional fields to pass in the setup() function if using setuptools.<br/>__*Optional*__\n**setuptools**?🔹 | <code>boolean</code> | Use setuptools with a setup.py script for packaging and publishing.<br/>__*Default*__: true if the project type is library\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Python sources directory.<br/>__*Default*__: \"tests\"\n**venv**?🔹 | <code>boolean</code> | Use venv to manage a virtual environment for installing dependencies inside.<br/>__*Default*__: true\n**venvOptions**?🔹 | <code>[python.VenvOptions](#projen-python-venvoptions)</code> | Venv options.<br/>__*Default*__: defaults\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**watchExcludes**?🔹 | <code>Array<string></code> | Glob patterns to exclude from `cdk watch`.<br/>__*Default*__: []\n**watchIncludes**?🔹 | <code>Array<string></code> | Glob patterns to include in `cdk watch`.<br/>__*Default*__: []\n\n\n\n## struct AwsCdkTypeScriptAppOptions 🔹 <a id=\"projen-awscdk-awscdktypescriptappoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkVersion**🔹 | <code>string</code> | Minimum version of the AWS CDK to depend on.\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**appEntrypoint**?🔹 | <code>string</code> | The CDK app's entrypoint (relative to the source directory, which is \"src\" by default).<br/>__*Default*__: \"main.ts\"\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildCommand**?🔹 | <code>string</code> | A command to execute before synthesis.<br/>__*Default*__: no build command\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**cdkAssert**?⚠️ | <code>boolean</code> | Warning: NodeJS only.<br/>__*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n**cdkAssertions**?🔹 | <code>boolean</code> | Install the assertions library?<br/>__*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n**cdkDependencies**?⚠️ | <code>Array<string></code> | Which AWS CDKv1 modules this project requires.<br/>__*Optional*__\n**cdkDependenciesAsDeps**?⚠️ | <code>boolean</code> | If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`).<br/>__*Default*__: true\n**cdkTestDependencies**?⚠️ | <code>Array<string></code> | AWS CDK modules required for testing.<br/>__*Optional*__\n**cdkVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for CDK.<br/>__*Optional*__\n**cdkout**?🔹 | <code>string</code> | cdk.out directory.<br/>__*Default*__: \"cdk.out\"\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n**context**?🔹 | <code>Map<string, any></code> | Additional context to include in `cdk.json`.<br/>__*Default*__: no additional context\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**edgeLambdaAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `cloudfront.experimental.EdgeFunction` for each `.edge-lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project.<br/>__*Default*__: true\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**featureFlags**?🔹 | <code>boolean</code> | Include all feature flags in cdk.json.<br/>__*Default*__: true\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**integrationTestAutoDiscover**?🔹 | <code>boolean</code> | Automatically discovers and creates integration tests for each `.integ.ts` file in under your test directory.<br/>__*Default*__: true\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**lambdaAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `awscdk.LambdaFunction` for each `.lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project.<br/>__*Default*__: true\n**lambdaExtensionAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts` entrypoint in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project.<br/>__*Default*__: true\n**lambdaOptions**?🔹 | <code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code> | Common options for all AWS Lambda functions.<br/>__*Default*__: default options\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**requireApproval**?🔹 | <code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code> | To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.<br/>__*Default*__: ApprovalLevel.BROADENING\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**watchExcludes**?🔹 | <code>Array<string></code> | Glob patterns to exclude from `cdk watch`.<br/>__*Default*__: []\n**watchIncludes**?🔹 | <code>Array<string></code> | Glob patterns to include in `cdk watch`.<br/>__*Default*__: []\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct CdkConfigCommonOptions 🔹 <a id=\"projen-awscdk-cdkconfigcommonoptions\"></a>\n\n\nCommon options for `cdk.json`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**buildCommand**?🔹 | <code>string</code> | A command to execute before synthesis.<br/>__*Default*__: no build command\n**cdkout**?🔹 | <code>string</code> | cdk.out directory.<br/>__*Default*__: \"cdk.out\"\n**context**?🔹 | <code>Map<string, any></code> | Additional context to include in `cdk.json`.<br/>__*Default*__: no additional context\n**featureFlags**?🔹 | <code>boolean</code> | Include all feature flags in cdk.json.<br/>__*Default*__: true\n**requireApproval**?🔹 | <code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code> | To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.<br/>__*Default*__: ApprovalLevel.BROADENING\n**watchExcludes**?🔹 | <code>Array<string></code> | Glob patterns to exclude from `cdk watch`.<br/>__*Default*__: []\n**watchIncludes**?🔹 | <code>Array<string></code> | Glob patterns to include in `cdk watch`.<br/>__*Default*__: []\n\n\n\n## struct CdkConfigOptions 🔹 <a id=\"projen-awscdk-cdkconfigoptions\"></a>\n\n\nOptions for `CdkJson`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**app**🔹 | <code>string</code> | The command line to execute in order to synthesize the CDK application (language specific).\n**buildCommand**?🔹 | <code>string</code> | A command to execute before synthesis.<br/>__*Default*__: no build command\n**cdkout**?🔹 | <code>string</code> | cdk.out directory.<br/>__*Default*__: \"cdk.out\"\n**context**?🔹 | <code>Map<string, any></code> | Additional context to include in `cdk.json`.<br/>__*Default*__: no additional context\n**featureFlags**?🔹 | <code>boolean</code> | Include all feature flags in cdk.json.<br/>__*Default*__: true\n**requireApproval**?🔹 | <code>[awscdk.ApprovalLevel](#projen-awscdk-approvallevel)</code> | To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.<br/>__*Default*__: ApprovalLevel.BROADENING\n**watchExcludes**?🔹 | <code>Array<string></code> | Glob patterns to exclude from `cdk watch`.<br/>__*Default*__: []\n**watchIncludes**?🔹 | <code>Array<string></code> | Glob patterns to include in `cdk watch`.<br/>__*Default*__: []\n\n\n\n## struct ConstructLibraryAwsOptions ⚠️ <a id=\"projen-awscdk-constructlibraryawsoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**author**⚠️ | <code>string</code> | The name of the library author.\n**authorAddress**⚠️ | <code>string</code> | Email or URL of the library author.\n**cdkVersion**⚠️ | <code>string</code> | Minimum version of the AWS CDK to depend on.\n**defaultReleaseBranch**⚠️ | <code>string</code> | The name of the main release branch.\n**name**⚠️ | <code>string</code> | This is the name of your project.\n**repositoryUrl**⚠️ | <code>string</code> | Git repository URL.\n**allowLibraryDependencies**?⚠️ | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?⚠️ | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?⚠️ | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?⚠️ | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?⚠️ | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?⚠️ | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?⚠️ | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?⚠️ | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?⚠️ | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?⚠️ | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?⚠️ | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?⚠️ | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?⚠️ | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?⚠️ | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?⚠️ | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?⚠️ | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?⚠️ | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?⚠️ | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**catalog**?⚠️ | <code>[cdk.Catalog](#projen-cdk-catalog)</code> | Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.<br/>__*Default*__: new version will be announced\n**cdkAssert**?⚠️ | <code>boolean</code> | Warning: NodeJS only.<br/>__*Default*__: will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n**cdkAssertions**?⚠️ | <code>boolean</code> | Install the assertions library?<br/>__*Default*__: will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n**cdkDependencies**?⚠️ | <code>Array<string></code> | Which AWS CDKv1 modules this project requires.<br/>__*Optional*__\n**cdkDependenciesAsDeps**?⚠️ | <code>boolean</code> | If this is enabled (default), all modules declared in `cdkDependencies` will be also added as normal `dependencies` (as well as `peerDependencies`).<br/>__*Default*__: true\n**cdkTestDependencies**?⚠️ | <code>Array<string></code> | AWS CDK modules required for testing.<br/>__*Optional*__\n**cdkVersionPinning**?⚠️ | <code>boolean</code> | Use pinned version instead of caret version for CDK.<br/>__*Optional*__\n**clobber**?⚠️ | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?⚠️ | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?⚠️ | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?⚠️ | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?⚠️ | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compat**?⚠️ | <code>boolean</code> | Automatically run API compatibility test against the latest version published to npm after compilation.<br/>__*Default*__: false\n**compatIgnore**?⚠️ | <code>string</code> | Name of the ignore file for API compatibility tests.<br/>__*Default*__: \".compatignore\"\n**compressAssembly**?⚠️ | <code>boolean</code> | Emit a compressed version of the assembly.<br/>__*Default*__: false\n**constructsVersion**?⚠️ | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is \"10.0.5\".\n**copyrightOwner**?⚠️ | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?⚠️ | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?⚠️ | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?⚠️ | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?⚠️ | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?⚠️ | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?⚠️ | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?⚠️ | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?⚠️ | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?⚠️ | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?⚠️ | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?⚠️ | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docgenFilePath**?⚠️ | <code>string</code> | File path for generated docs.<br/>__*Default*__: \"API.md\"\n**docsDirectory**?⚠️ | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**dotnet**?⚠️ | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | __*Optional*__\n**edgeLambdaAutoDiscover**?⚠️ | <code>boolean</code> | Automatically adds an `cloudfront.experimental.EdgeFunction` for each `.edge-lambda.ts` handler in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project.<br/>__*Default*__: true\n**entrypoint**?⚠️ | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?⚠️ | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?⚠️ | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?⚠️ | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**excludeTypescript**?⚠️ | <code>Array<string></code> | Accepts a list of glob patterns.<br/>__*Optional*__\n**github**?⚠️ | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?⚠️ | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?⚠️ | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?⚠️ | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?⚠️ | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**integrationTestAutoDiscover**?⚠️ | <code>boolean</code> | Automatically discovers and creates integration tests for each `.integ.ts` file in under your test directory.<br/>__*Default*__: true\n**jest**?⚠️ | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?⚠️ | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?⚠️ | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?⚠️ | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**lambdaAutoDiscover**?⚠️ | <code>boolean</code> | Automatically adds an `aws_lambda.Function` for each `.lambda.ts` handler in your source tree. If this is disabled, you either need to explicitly call `aws_lambda.Function.autoDiscover()` or define a `new aws_lambda.Function()` for each handler.<br/>__*Default*__: true\n**lambdaExtensionAutoDiscover**?⚠️ | <code>boolean</code> | Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts` entrypoint in your source tree. If this is disabled, you can manually add an `awscdk.AutoDiscover` component to your project.<br/>__*Default*__: true\n**lambdaOptions**?⚠️ | <code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code> | Common options for all AWS Lambda functions.<br/>__*Default*__: default options\n**libdir**?⚠️ | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?⚠️ | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?⚠️ | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?⚠️ | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?⚠️ | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?⚠️ | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?⚠️ | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?⚠️ | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?⚠️ | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?⚠️ | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?⚠️ | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?⚠️ | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?⚠️ | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?⚠️ | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?⚠️ | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?⚠️ | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?⚠️ | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?⚠️ | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?⚠️ | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?⚠️ | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?⚠️ | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?⚠️ | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?⚠️ | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?⚠️ | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?⚠️ | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?⚠️ | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?⚠️ | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?⚠️ | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?⚠️ | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?⚠️ | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?⚠️ | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?⚠️ | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?⚠️ | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?⚠️ | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?⚠️ | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?⚠️ | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**publishToGo**?⚠️ | <code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code> | Publish Go bindings to a git repository.<br/>__*Default*__: no publishing\n**publishToMaven**?⚠️ | <code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code> | Publish to maven.<br/>__*Default*__: no publishing\n**publishToNuget**?⚠️ | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | Publish to NuGet.<br/>__*Default*__: no publishing\n**publishToPypi**?⚠️ | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | Publish to pypi.<br/>__*Default*__: no publishing\n**pullRequestTemplate**?⚠️ | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?⚠️ | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**python**?⚠️ | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | __*Optional*__\n**readme**?⚠️ | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?⚠️ | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?⚠️ | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?⚠️ | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?⚠️ | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?⚠️ | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?⚠️ | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?⚠️ | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?⚠️ | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?⚠️ | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?⚠️ | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?⚠️ | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?⚠️ | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rootdir**?⚠️ | <code>string</code> | __*Default*__: \".\"\n**sampleCode**?⚠️ | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?⚠️ | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?⚠️ | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?⚠️ | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?⚠️ | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?⚠️ | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?⚠️ | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?⚠️ | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?⚠️ | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?⚠️ | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?⚠️ | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?⚠️ | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?⚠️ | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?⚠️ | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?⚠️ | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?⚠️ | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?⚠️ | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?⚠️ | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct EdgeLambdaAutoDiscoverOptions 🔹 <a id=\"projen-awscdk-edgelambdaautodiscoveroptions\"></a>\n\n\nOptions for `EdgeLambdaAutoDiscover`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**srcdir**🔹 | <code>string</code> | Project source tree (relative to project output directory).\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n**lambdaOptions**?🔹 | <code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code> | Options for AWS Lambda functions.<br/>__*Optional*__\n\n\n\n## struct IntegrationTestAutoDiscoverOptions 🔹 <a id=\"projen-awscdk-integrationtestautodiscoveroptions\"></a>\n\n\nOptions for `IntegrationTestAutoDiscover`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**testdir**🔹 | <code>string</code> | Test source tree.\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n**integrationTestOptions**?🔹 | <code>[awscdk.IntegrationTestCommonOptions](#projen-awscdk-integrationtestcommonoptions)</code> | Options for integration tests.<br/>__*Optional*__\n\n\n\n## struct IntegrationTestCommonOptions 🔹 <a id=\"projen-awscdk-integrationtestcommonoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**destroyAfterDeploy**?🔹 | <code>boolean</code> | Destroy the test app after a successful deployment.<br/>__*Default*__: true\n**pathMetadata**?🔹 | <code>boolean</code> | Enables path metadata, adding `aws:cdk:path`, with the defining construct's path, to the CloudFormation metadata for each synthesized resource.<br/>__*Default*__: false\n\n\n\n## struct IntegrationTestOptions 🔹 <a id=\"projen-awscdk-integrationtestoptions\"></a>\n\n\nOptions for `IntegrationTest`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**entrypoint**🔹 | <code>string</code> | A path from the project root directory to a TypeScript file which contains the integration test app.\n**tsconfigPath**🔹 | <code>string</code> | The path of the tsconfig.json file to use when running integration test cdk apps.\n**destroyAfterDeploy**?🔹 | <code>boolean</code> | Destroy the test app after a successful deployment.<br/>__*Default*__: true\n**name**?🔹 | <code>string</code> | Name of the integration test.<br/>__*Default*__: Derived from the entrypoint filename.\n**pathMetadata**?🔹 | <code>boolean</code> | Enables path metadata, adding `aws:cdk:path`, with the defining construct's path, to the CloudFormation metadata for each synthesized resource.<br/>__*Default*__: false\n**stacks**?🔹 | <code>Array<string></code> | A list of stacks within the integration test to deploy/destroy.<br/>__*Default*__: [\"**\"]\n\n\n\n## struct LambdaAutoDiscoverOptions 🔹 <a id=\"projen-awscdk-lambdaautodiscoveroptions\"></a>\n\n\nOptions for `LambdaAutoDiscover`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**srcdir**🔹 | <code>string</code> | Project source tree (relative to project output directory).\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n**lambdaOptions**?🔹 | <code>[awscdk.LambdaFunctionCommonOptions](#projen-awscdk-lambdafunctioncommonoptions)</code> | Options for AWS Lambda functions.<br/>__*Optional*__\n\n\n\n## struct LambdaExtensionAutoDiscoverOptions 🔹 <a id=\"projen-awscdk-lambdaextensionautodiscoveroptions\"></a>\n\n\nOptions for `LambdaExtensionAutoDiscover`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**srcdir**🔹 | <code>string</code> | Project source tree (relative to project output directory).\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n**lambdaExtensionOptions**?🔹 | <code>[awscdk.LambdaExtensionCommonOptions](#projen-awscdk-lambdaextensioncommonoptions)</code> | Options for lambda extensions.<br/>__*Optional*__\n\n\n\n## struct LambdaExtensionCommonOptions 🔹 <a id=\"projen-awscdk-lambdaextensioncommonoptions\"></a>\n\n\nCommon options for creating lambda extensions.\n\n\n\nName | Type | Description \n-----|------|-------------\n**bundlingOptions**?🔹 | <code>[javascript.BundlingOptions](#projen-javascript-bundlingoptions)</code> | Bundling options for this AWS Lambda extension.<br/>__*Default*__: defaults\n**compatibleRuntimes**?🔹 | <code>Array<[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)></code> | The extension's compatible runtimes.<br/>__*Optional*__\n\n\n\n## struct LambdaExtensionOptions 🔹 <a id=\"projen-awscdk-lambdaextensionoptions\"></a>\n\n\nOptions for creating lambda extensions.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**entrypoint**🔹 | <code>string</code> | A path from the project root directory to a TypeScript file which contains the AWS Lambda extension entrypoint (stand-alone script).\n**bundlingOptions**?🔹 | <code>[javascript.BundlingOptions](#projen-javascript-bundlingoptions)</code> | Bundling options for this AWS Lambda extension.<br/>__*Default*__: defaults\n**compatibleRuntimes**?🔹 | <code>Array<[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)></code> | The extension's compatible runtimes.<br/>__*Optional*__\n**constructFile**?🔹 | <code>string</code> | The name of the generated TypeScript source file.<br/>__*Default*__: The name of the entrypoint file, with the `-layer-version.ts` suffix instead of `.lambda-extension.ts`.\n**constructName**?🔹 | <code>string</code> | The name of the generated `lambda.LayerVersion` subclass.<br/>__*Default*__: A pascal cased version of the name of the entrypoint file, with the extension `LayerVersion` (e.g. `AppConfigLayerVersion`).\n**name**?🔹 | <code>string</code> | Name of the extension.<br/>__*Default*__: Derived from the entrypoint filename.\n\n\n\n## struct LambdaFunctionCommonOptions 🔹 <a id=\"projen-awscdk-lambdafunctioncommonoptions\"></a>\n\n\nCommon options for `LambdaFunction`.\n\nApplies to all functions in\nauto-discovery.\n\n\n\nName | Type | Description \n-----|------|-------------\n**awsSdkConnectionReuse**?🔹 | <code>boolean</code> | Whether to automatically reuse TCP connections when working with the AWS SDK for JavaScript.<br/>__*Default*__: true\n**bundlingOptions**?🔹 | <code>[javascript.BundlingOptions](#projen-javascript-bundlingoptions)</code> | Bundling options for this AWS Lambda function.<br/>__*Default*__: defaults\n**edgeLambda**?🔹 | <code>boolean</code> | Whether to create a `cloudfront.experimental.EdgeFunction` instead of a `lambda.Function`.<br/>__*Default*__: false\n**runtime**?🔹 | <code>[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)</code> | The node.js version to target.<br/>__*Default*__: Runtime.NODEJS_14_X\n\n\n\n## struct LambdaFunctionOptions 🔹 <a id=\"projen-awscdk-lambdafunctionoptions\"></a>\n\n\nOptions for `Function`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdkDeps**🔹 | <code>[awscdk.AwsCdkDeps](#projen-awscdk-awscdkdeps)</code> | AWS CDK dependency manager.\n**entrypoint**🔹 | <code>string</code> | A path from the project root directory to a TypeScript file which contains the AWS Lambda handler entrypoint (exports a `handler` function).\n**awsSdkConnectionReuse**?🔹 | <code>boolean</code> | Whether to automatically reuse TCP connections when working with the AWS SDK for JavaScript.<br/>__*Default*__: true\n**bundlingOptions**?🔹 | <code>[javascript.BundlingOptions](#projen-javascript-bundlingoptions)</code> | Bundling options for this AWS Lambda function.<br/>__*Default*__: defaults\n**constructFile**?🔹 | <code>string</code> | The name of the generated TypeScript source file.<br/>__*Default*__: The name of the entrypoint file, with the `-function.ts` suffix instead of `.lambda.ts`.\n**constructName**?🔹 | <code>string</code> | The name of the generated `lambda.Function` subclass.<br/>__*Default*__: A pascal cased version of the name of the entrypoint file, with the extension `Function` (e.g. `ResizeImageFunction`).\n**edgeLambda**?🔹 | <code>boolean</code> | Whether to create a `cloudfront.experimental.EdgeFunction` instead of a `lambda.Function`.<br/>__*Default*__: false\n**runtime**?🔹 | <code>[awscdk.LambdaRuntime](#projen-awscdk-lambdaruntime)</code> | The node.js version to target.<br/>__*Default*__: Runtime.NODEJS_14_X\n\n\n\n## struct AddPostBuildJobCommandsOptions 🔹 <a id=\"projen-build-addpostbuildjobcommandsoptions\"></a>\n\n\nOptions for `BuildWorkflow.addPostBuildJobCommands`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**checkoutRepo**?🔹 | <code>boolean</code> | Check out the repository at the pull request branch before commands are run.<br/>__*Default*__: false\n**installDeps**?🔹 | <code>boolean</code> | Install project dependencies before running commands. `checkoutRepo` must also be set to true.<br/>__*Default*__: false\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n**tools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Tools that should be installed before the commands are run.<br/>__*Optional*__\n\n\n\n## struct AddPostBuildJobTaskOptions 🔹 <a id=\"projen-build-addpostbuildjobtaskoptions\"></a>\n\n\nOptions for `BuildWorkflow.addPostBuildJobTask`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n**tools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Tools that should be installed before the task is run.<br/>__*Optional*__\n\n\n\n## struct BuildWorkflowOptions 🔹 <a id=\"projen-build-buildworkflowoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactsDirectory**🔹 | <code>string</code> | A name of a directory that includes build artifacts.\n**buildTask**🔹 | <code>[Task](#projen-task)</code> | The task to execute in order to build the project.\n**containerImage**?🔹 | <code>string</code> | The container image to use for builds.<br/>__*Default*__: the default workflow container\n**env**?🔹 | <code>Map<string, string></code> | Build environment variables.<br/>__*Default*__: {}\n**gitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | Git identity to use for the workflow.<br/>__*Default*__: default identity\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build.<br/>__*Default*__: []\n**preBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before the build.<br/>__*Default*__: []\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n**workflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n\n\n\n## struct AutoDiscoverBaseOptions 🔹 <a id=\"projen-cdk-autodiscoverbaseoptions\"></a>\n\n\nOptions for `AutoDiscoverBase`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**extension**🔹 | <code>string</code> | Locate files with the given extension.\n**projectdir**🔹 | <code>string</code> | Locate entrypoints in the given project directory.\n\n\n\n## struct Catalog 🔹 <a id=\"projen-cdk-catalog\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**announce**?🔹 | <code>boolean</code> | Should we announce new versions?<br/>__*Default*__: true\n**twitter**?🔹 | <code>string</code> | Twitter account to @mention in announcement tweet.<br/>__*Optional*__\n\n\n\n## struct ConstructLibraryOptions 🔹 <a id=\"projen-cdk-constructlibraryoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**author**🔹 | <code>string</code> | The name of the library author.\n**authorAddress**🔹 | <code>string</code> | Email or URL of the library author.\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**repositoryUrl**🔹 | <code>string</code> | Git repository URL.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**catalog**?🔹 | <code>[cdk.Catalog](#projen-cdk-catalog)</code> | Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.<br/>__*Default*__: new version will be announced\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compat**?🔹 | <code>boolean</code> | Automatically run API compatibility test against the latest version published to npm after compilation.<br/>__*Default*__: false\n**compatIgnore**?🔹 | <code>string</code> | Name of the ignore file for API compatibility tests.<br/>__*Default*__: \".compatignore\"\n**compressAssembly**?🔹 | <code>boolean</code> | Emit a compressed version of the assembly.<br/>__*Default*__: false\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docgenFilePath**?🔹 | <code>string</code> | File path for generated docs.<br/>__*Default*__: \"API.md\"\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**dotnet**?⚠️ | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | __*Optional*__\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**excludeTypescript**?🔹 | <code>Array<string></code> | Accepts a list of glob patterns.<br/>__*Optional*__\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**publishToGo**?🔹 | <code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code> | Publish Go bindings to a git repository.<br/>__*Default*__: no publishing\n**publishToMaven**?🔹 | <code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code> | Publish to maven.<br/>__*Default*__: no publishing\n**publishToNuget**?🔹 | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | Publish to NuGet.<br/>__*Default*__: no publishing\n**publishToPypi**?🔹 | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | Publish to pypi.<br/>__*Default*__: no publishing\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**python**?⚠️ | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | __*Optional*__\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rootdir**?🔹 | <code>string</code> | __*Default*__: \".\"\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct IntegrationTestAutoDiscoverBaseOptions 🔹 <a id=\"projen-cdk-integrationtestautodiscoverbaseoptions\"></a>\n\n\nOptions for `IntegrationTestAutoDiscoverBase`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**testdir**🔹 | <code>string</code> | Test source tree.\n\n\n\n## struct IntegrationTestBaseOptions 🔹 <a id=\"projen-cdk-integrationtestbaseoptions\"></a>\n\n\nOptions for IntegrationTest.\n\n\n\nName | Type | Description \n-----|------|-------------\n**entrypoint**🔹 | <code>string</code> | A path from the project root directory to a TypeScript file which contains the integration test app.\n**tsconfigPath**🔹 | <code>string</code> | The path of the tsconfig.json file to use when running integration test cdk apps.\n**name**?🔹 | <code>string</code> | Name of the integration test.<br/>__*Default*__: Derived from the entrypoint filename.\n\n\n\n## struct JsiiDocgenOptions 🔹 <a id=\"projen-cdk-jsiidocgenoptions\"></a>\n\n\nOptions for `JsiiDocgen`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**filePath**?🔹 | <code>string</code> | File path for generated docs.<br/>__*Default*__: \"API.md\"\n\n\n\n## struct JsiiDotNetTarget 🔹 <a id=\"projen-cdk-jsiidotnettarget\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**dotNetNamespace**🔹 | <code>string</code> | <span></span>\n**packageId**🔹 | <code>string</code> | <span></span>\n**iconUrl**?🔹 | <code>string</code> | __*Optional*__\n**nugetApiKeySecret**?🔹 | <code>string</code> | GitHub secret which contains the API key for NuGet.<br/>__*Default*__: \"NUGET_API_KEY\"\n**nugetServer**?🔹 | <code>string</code> | NuGet Server URL (defaults to nuget.org).<br/>__*Optional*__\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct JsiiGoTarget 🔹 <a id=\"projen-cdk-jsiigotarget\"></a>\n\n\nGo target configuration.\n\n\n\nName | Type | Description \n-----|------|-------------\n**moduleName**🔹 | <code>string</code> | The name of the target go module.\n**gitBranch**?🔹 | <code>string</code> | Branch to push to.<br/>__*Default*__: \"main\"\n**gitCommitMessage**?🔹 | <code>string</code> | The commit message.<br/>__*Default*__: \"chore(release): $VERSION\"\n**gitUserEmail**?🔹 | <code>string</code> | The email to use in the release git commit.<br/>__*Default*__: \"github-actions\n**gitUserName**?🔹 | <code>string</code> | The user name to use for the release git commit.<br/>__*Default*__: \"github-actions\"\n**githubDeployKeySecret**?🔹 | <code>string</code> | The name of the secret that includes a GitHub deploy key used to push to the GitHub repository.<br/>__*Default*__: \"GO_GITHUB_DEPLOY_KEY\"\n**githubRepo**?🔹 | <code>string</code> | GitHub repository to push to.<br/>__*Default*__: derived from `moduleName`\n**githubTokenSecret**?🔹 | <code>string</code> | The name of the secret that includes a personal GitHub access token used to push to the GitHub repository.<br/>__*Default*__: \"GO_GITHUB_TOKEN\"\n**githubUseSsh**?🔹 | <code>boolean</code> | Use SSH to push to GitHub instead of a personal accses token.<br/>__*Default*__: false\n**packageName**?🔹 | <code>string</code> | The name of the go package.<br/>__*Default*__: derived from the module name\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct JsiiJavaTarget 🔹 <a id=\"projen-cdk-jsiijavatarget\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**javaPackage**🔹 | <code>string</code> | <span></span>\n**mavenArtifactId**🔹 | <code>string</code> | <span></span>\n**mavenGroupId**🔹 | <code>string</code> | <span></span>\n**mavenEndpoint**?🔹 | <code>string</code> | URL of Nexus repository.<br/>__*Default*__: \"https://oss.sonatype.org\"\n**mavenGpgPrivateKeyPassphrase**?🔹 | <code>string</code> | GitHub secret name which contains the GPG private key or file that includes it.<br/>__*Default*__: \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\" or not set when using GitHub Packages\n**mavenGpgPrivateKeySecret**?🔹 | <code>string</code> | GitHub secret name which contains the GPG private key or file that includes it.<br/>__*Default*__: \"MAVEN_GPG_PRIVATE_KEY\" or not set when using GitHub Packages\n**mavenPassword**?🔹 | <code>string</code> | GitHub secret name which contains the Password for maven repository.<br/>__*Default*__: \"MAVEN_PASSWORD\" or \"GITHUB_TOKEN\" when using GitHub Packages\n**mavenRepositoryUrl**?🔹 | <code>string</code> | Deployment repository when not deploying to Maven Central.<br/>__*Default*__: not set\n**mavenServerId**?🔹 | <code>string</code> | Used in maven settings for credential lookup (e.g. use github when publishing to GitHub).<br/>__*Default*__: \"ossrh\" (Maven Central) or \"github\" when using GitHub Packages\n**mavenStagingProfileId**?🔹 | <code>string</code> | GitHub secret name which contains the Maven Central (sonatype) staging profile ID (e.g. 68a05363083174). Staging profile ID can be found in the URL of the \"Releases\" staging profile under \"Staging Profiles\" in https://oss.sonatype.org (e.g. https://oss.sonatype.org/#stagingProfiles;11a33451234521).<br/>__*Default*__: \"MAVEN_STAGING_PROFILE_ID\" or not set when using GitHub Packages\n**mavenUsername**?🔹 | <code>string</code> | GitHub secret name which contains the Username for maven repository.<br/>__*Default*__: \"MAVEN_USERNAME\" or the GitHub Actor when using GitHub Packages\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct JsiiProjectOptions 🔹 <a id=\"projen-cdk-jsiiprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**author**🔹 | <code>string</code> | The name of the library author.\n**authorAddress**🔹 | <code>string</code> | Email or URL of the library author.\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**repositoryUrl**🔹 | <code>string</code> | Git repository URL.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compat**?🔹 | <code>boolean</code> | Automatically run API compatibility test against the latest version published to npm after compilation.<br/>__*Default*__: false\n**compatIgnore**?🔹 | <code>string</code> | Name of the ignore file for API compatibility tests.<br/>__*Default*__: \".compatignore\"\n**compressAssembly**?🔹 | <code>boolean</code> | Emit a compressed version of the assembly.<br/>__*Default*__: false\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docgenFilePath**?🔹 | <code>string</code> | File path for generated docs.<br/>__*Default*__: \"API.md\"\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**dotnet**?⚠️ | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | __*Optional*__\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**excludeTypescript**?🔹 | <code>Array<string></code> | Accepts a list of glob patterns.<br/>__*Optional*__\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**publishToGo**?🔹 | <code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code> | Publish Go bindings to a git repository.<br/>__*Default*__: no publishing\n**publishToMaven**?🔹 | <code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code> | Publish to maven.<br/>__*Default*__: no publishing\n**publishToNuget**?🔹 | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | Publish to NuGet.<br/>__*Default*__: no publishing\n**publishToPypi**?🔹 | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | Publish to pypi.<br/>__*Default*__: no publishing\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**python**?⚠️ | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | __*Optional*__\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rootdir**?🔹 | <code>string</code> | __*Default*__: \".\"\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct JsiiPythonTarget 🔹 <a id=\"projen-cdk-jsiipythontarget\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**distName**🔹 | <code>string</code> | <span></span>\n**module**🔹 | <code>string</code> | <span></span>\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n**twinePasswordSecret**?🔹 | <code>string</code> | The GitHub secret which contains PyPI password.<br/>__*Default*__: \"TWINE_PASSWORD\"\n**twineRegistryUrl**?🔹 | <code>string</code> | The registry url to use when releasing packages.<br/>__*Default*__: twine default\n**twineUsernameSecret**?🔹 | <code>string</code> | The GitHub secret which contains PyPI user name.<br/>__*Default*__: \"TWINE_USERNAME\"\n\n\n\n## struct AutoDiscoverOptions 🔹 <a id=\"projen-cdk8s-autodiscoveroptions\"></a>\n\n\nOptions for `AutoDiscover`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**testdir**🔹 | <code>string</code> | Test source tree.\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n**integrationTestAutoDiscover**?🔹 | <code>boolean</code> | Automatically discover integration tests.<br/>__*Default*__: true\n\n\n\n## struct Cdk8sDepsCommonOptions 🔹 <a id=\"projen-cdk8s-cdk8sdepscommonoptions\"></a>\n\n\nOptions for `Cdk8sDeps`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdk8sVersion**🔹 | <code>string</code> | Minumum version of the cdk8s to depend on.\n**cdk8sCliVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-cli to depend on.<br/>__*Default*__: \"2.0.28\"\n**cdk8sCliVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-cli.<br/>__*Default*__: false\n**cdk8sPlus**?🔹 | <code>boolean</code> | Include cdk8s-plus.<br/>__*Default*__: true\n**cdk8sPlusVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-plus-XX to depend on.<br/>__*Default*__: \"2.0.0-rc.26\"\n**cdk8sPlusVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-plus-17.<br/>__*Default*__: false\n**cdk8sVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s.<br/>__*Default*__: false\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: \"10.1.42\"\n**constructsVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for constructs.<br/>__*Default*__: false\n**k8sMinorVersion**?🔹 | <code>number</code> | The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0.<br/>__*Default*__: 22\n\n\n\n## struct Cdk8sDepsOptions 🔹 <a id=\"projen-cdk8s-cdk8sdepsoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdk8sCliDependency**🔹 | <code>boolean</code> | Add cdk8s-cli only to Node projects.\n**cdk8sVersion**🔹 | <code>string</code> | Minumum version of the cdk8s to depend on.\n**dependencyType**🔹 | <code>[DependencyType](#projen-dependencytype)</code> | The type of dependency to use for runtime CDK8s and `constructs` modules.\n**cdk8sCliVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-cli to depend on.<br/>__*Default*__: \"2.0.28\"\n**cdk8sCliVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-cli.<br/>__*Default*__: false\n**cdk8sPlus**?🔹 | <code>boolean</code> | Include cdk8s-plus.<br/>__*Default*__: true\n**cdk8sPlusVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-plus-XX to depend on.<br/>__*Default*__: \"2.0.0-rc.26\"\n**cdk8sPlusVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-plus-17.<br/>__*Default*__: false\n**cdk8sVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s.<br/>__*Default*__: false\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: \"10.1.42\"\n**constructsVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for constructs.<br/>__*Default*__: false\n**k8sMinorVersion**?🔹 | <code>number</code> | The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0.<br/>__*Default*__: 22\n\n\n\n## struct Cdk8sPackageNames 🔹 <a id=\"projen-cdk8s-cdk8spackagenames\"></a>\n\n__Obtainable from__: [Cdk8sDeps](#projen-cdk8s-cdk8sdeps).[packageNames](#projen-cdk8s-cdk8sdeps#projen-cdk8s-cdk8sdeps-packagenames)(), [Cdk8sDepsPy](#projen-cdk8s-cdk8sdepspy).[packageNames](#projen-cdk8s-cdk8sdepspy#projen-cdk8s-cdk8sdepspy-packagenames)()\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdk8s**🔹 | <code>string</code> | Fully qualified name of the core framework package.\n**cdk8sPlus**🔹 | <code>string</code> | Fully qualified name of the cdk9s-plus-XX library package.\n**constructs**🔹 | <code>string</code> | Fully qualified name of the constructs library package.\n**cdk8sClient**?🔹 | <code>string</code> | Fully qualified name of the client package.<br/>__*Optional*__\n\n\n\n## struct Cdk8sPythonOptions 🔹 <a id=\"projen-cdk8s-cdk8spythonoptions\"></a>\n\n\nOptions for `Cdk8sPythonApp`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**authorEmail**🔹 | <code>string</code> | Author's e-mail.\n**authorName**🔹 | <code>string</code> | Author's name.\n**cdk8sVersion**🔹 | <code>string</code> | Minumum version of the cdk8s to depend on.\n**moduleName**🔹 | <code>string</code> | Name of the python package as used in imports and filenames.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**version**🔹 | <code>string</code> | Version of the package.\n**appEntrypoint**?🔹 | <code>string</code> | The CDK8s app's entrypoint.<br/>__*Default*__: \"app.py\"\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**cdk8sCliVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-cli to depend on.<br/>__*Default*__: \"2.0.28\"\n**cdk8sCliVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-cli.<br/>__*Default*__: false\n**cdk8sImports**?🔹 | <code>Array<string></code> | Import additional specs.<br/>__*Default*__: no additional specs imported\n**cdk8sPlus**?🔹 | <code>boolean</code> | Include cdk8s-plus.<br/>__*Default*__: true\n**cdk8sPlusVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-plus-XX to depend on.<br/>__*Default*__: \"2.0.0-rc.26\"\n**cdk8sPlusVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-plus-17.<br/>__*Default*__: false\n**cdk8sVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s.<br/>__*Default*__: false\n**classifiers**?🔹 | <code>Array<string></code> | A list of PyPI trove classifiers that describe the project.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: \"10.1.42\"\n**constructsVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for constructs.<br/>__*Default*__: false\n**deps**?🔹 | <code>Array<string></code> | List of runtime dependencies for this project.<br/>__*Default*__: []\n**description**?🔹 | <code>string</code> | A short description of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | List of dev dependencies for this project.<br/>__*Default*__: []\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | A URL to the website of the project.<br/>__*Optional*__\n**k8sMinorVersion**?🔹 | <code>number</code> | The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0.<br/>__*Default*__: 22\n**k8sSpecVersion**?🔹 | <code>string</code> | Import a specific Kubernetes spec version.<br/>__*Default*__: Use the cdk8s default\n**license**?🔹 | <code>string</code> | License of this package as an SPDX identifier.<br/>__*Optional*__\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**packageName**?🔹 | <code>string</code> | Package name.<br/>__*Optional*__\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**pip**?🔹 | <code>boolean</code> | Use pip with a requirements.txt file to track project dependencies.<br/>__*Default*__: true\n**poetry**?🔹 | <code>boolean</code> | Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing.<br/>__*Default*__: false\n**poetryOptions**?🔹 | <code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code> | Additional options to set for poetry if using poetry.<br/>__*Optional*__\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenrcJs**?🔹 | <code>boolean</code> | Use projenrc in javascript.<br/>__*Default*__: false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options related to projenrc in JavaScript.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcPython**?🔹 | <code>boolean</code> | Use projenrc in Python.<br/>__*Default*__: true\n**projenrcPythonOptions**?🔹 | <code>[python.ProjenrcOptions](#projen-python-projenrcoptions)</code> | Options related to projenrc in python.<br/>__*Default*__: default options\n**pytest**?🔹 | <code>boolean</code> | Include pytest tests.<br/>__*Default*__: true\n**pytestOptions**?🔹 | <code>[python.PytestOptions](#projen-python-pytestoptions)</code> | pytest options.<br/>__*Default*__: defaults\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**sample**?🔹 | <code>boolean</code> | Include sample code and test if the relevant directories don't exist.<br/>__*Default*__: true\n**setupConfig**?🔹 | <code>Map<string, any></code> | Additional fields to pass in the setup() function if using setuptools.<br/>__*Optional*__\n**setuptools**?🔹 | <code>boolean</code> | Use setuptools with a setup.py script for packaging and publishing.<br/>__*Default*__: true if the project type is library\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**venv**?🔹 | <code>boolean</code> | Use venv to manage a virtual environment for installing dependencies inside.<br/>__*Default*__: true\n**venvOptions**?🔹 | <code>[python.VenvOptions](#projen-python-venvoptions)</code> | Venv options.<br/>__*Default*__: defaults\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n\n\n\n## struct Cdk8sTypeScriptAppOptions 🔹 <a id=\"projen-cdk8s-cdk8stypescriptappoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**cdk8sVersion**🔹 | <code>string</code> | Minumum version of the cdk8s to depend on.\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**appEntrypoint**?🔹 | <code>string</code> | The CDK8s app's entrypoint (relative to the source directory, which is \"src\" by default).<br/>__*Default*__: \"main.ts\"\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**cdk8sCliVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-cli to depend on.<br/>__*Default*__: \"2.0.28\"\n**cdk8sCliVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-cli.<br/>__*Default*__: false\n**cdk8sImports**?🔹 | <code>Array<string></code> | Import additional specs.<br/>__*Default*__: no additional specs imported\n**cdk8sPlus**?🔹 | <code>boolean</code> | Include cdk8s-plus.<br/>__*Default*__: true\n**cdk8sPlusVersion**?🔹 | <code>string</code> | Minumum version of the cdk8s-plus-XX to depend on.<br/>__*Default*__: \"2.0.0-rc.26\"\n**cdk8sPlusVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-plus-17.<br/>__*Default*__: false\n**cdk8sVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s.<br/>__*Default*__: false\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**constructsVersion**?🔹 | <code>string</code> | Minimum version of the `constructs` library to depend on.<br/>__*Default*__: \"10.1.42\"\n**constructsVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for constructs.<br/>__*Default*__: false\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**integrationTestAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `cdk8s.IntegrationTest` for each `.integ.ts` app in your test directory. If this is disabled, you can manually add an `cdk8s.AutoDiscover` component to your project.<br/>__*Default*__: true\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**k8sMinorVersion**?🔹 | <code>number</code> | The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0.<br/>__*Default*__: 22\n**k8sSpecVersion**?🔹 | <code>string</code> | Import a specific Kubernetes spec version.<br/>__*Default*__: Use the cdk8s default\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct ConstructLibraryCdk8sOptions 🔹 <a id=\"projen-cdk8s-constructlibrarycdk8soptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**author**🔹 | <code>string</code> | The name of the library author.\n**authorAddress**🔹 | <code>string</code> | Email or URL of the library author.\n**cdk8sVersion**🔹 | <code>string</code> | Minimum target version this library is tested against.\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**repositoryUrl**🔹 | <code>string</code> | Git repository URL.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**catalog**?🔹 | <code>[cdk.Catalog](#projen-cdk-catalog)</code> | Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.<br/>__*Default*__: new version will be announced\n**cdk8sPlusVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for cdk8s-plus-17.<br/>__*Default*__: false\n**cdk8sVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for CDK8s.<br/>__*Default*__: false\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compat**?🔹 | <code>boolean</code> | Automatically run API compatibility test against the latest version published to npm after compilation.<br/>__*Default*__: false\n**compatIgnore**?🔹 | <code>string</code> | Name of the ignore file for API compatibility tests.<br/>__*Default*__: \".compatignore\"\n**compressAssembly**?🔹 | <code>boolean</code> | Emit a compressed version of the assembly.<br/>__*Default*__: false\n**constructsVersion**?🔹 | <code>string</code> | constructs verion.<br/>__*Default*__: \"3.3.196\"\n**constructsVersionPinning**?🔹 | <code>boolean</code> | Use pinned version instead of caret version for constructs.<br/>__*Default*__: false\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docgenFilePath**?🔹 | <code>string</code> | File path for generated docs.<br/>__*Default*__: \"API.md\"\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**dotnet**?⚠️ | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | __*Optional*__\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**excludeTypescript**?🔹 | <code>Array<string></code> | Accepts a list of glob patterns.<br/>__*Optional*__\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**integrationTestAutoDiscover**?🔹 | <code>boolean</code> | Automatically adds an `cdk8s.IntegrationTest` for each `.integ.ts` app in your test directory. If this is disabled, you can manually add an `cdk8s.AutoDiscover` component to your project.<br/>__*Default*__: true\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**publishToGo**?🔹 | <code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code> | Publish Go bindings to a git repository.<br/>__*Default*__: no publishing\n**publishToMaven**?🔹 | <code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code> | Publish to maven.<br/>__*Default*__: no publishing\n**publishToNuget**?🔹 | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | Publish to NuGet.<br/>__*Default*__: no publishing\n**publishToPypi**?🔹 | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | Publish to pypi.<br/>__*Default*__: no publishing\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**python**?⚠️ | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | __*Optional*__\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rootdir**?🔹 | <code>string</code> | __*Default*__: \".\"\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct IntegrationTestAutoDiscoverOptions 🔹 <a id=\"projen-cdk8s-integrationtestautodiscoveroptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**testdir**🔹 | <code>string</code> | Test source tree.\n**tsconfigPath**🔹 | <code>string</code> | Path to the tsconfig file to use for integration tests.\n\n\n\n## struct IntegrationTestOptions 🔹 <a id=\"projen-cdk8s-integrationtestoptions\"></a>\n\n\nOptions for IntegrationTest.\n\n\n\nName | Type | Description \n-----|------|-------------\n**entrypoint**🔹 | <code>string</code> | A path from the project root directory to a TypeScript file which contains the integration test app.\n**tsconfigPath**🔹 | <code>string</code> | The path of the tsconfig.json file to use when running integration test cdk apps.\n**name**?🔹 | <code>string</code> | Name of the integration test.<br/>__*Default*__: Derived from the entrypoint filename.\n\n\n\n## struct ConstructLibraryCdktfOptions 🔹 <a id=\"projen-cdktf-constructlibrarycdktfoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**author**🔹 | <code>string</code> | The name of the library author.\n**authorAddress**🔹 | <code>string</code> | Email or URL of the library author.\n**cdktfVersion**🔹 | <code>string</code> | Minimum target version this library is tested against.\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**repositoryUrl**🔹 | <code>string</code> | Git repository URL.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**catalog**?🔹 | <code>[cdk.Catalog](#projen-cdk-catalog)</code> | Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.<br/>__*Default*__: new version will be announced\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compat**?🔹 | <code>boolean</code> | Automatically run API compatibility test against the latest version published to npm after compilation.<br/>__*Default*__: false\n**compatIgnore**?🔹 | <code>string</code> | Name of the ignore file for API compatibility tests.<br/>__*Default*__: \".compatignore\"\n**compressAssembly**?🔹 | <code>boolean</code> | Emit a compressed version of the assembly.<br/>__*Default*__: false\n**constructsVersion**?🔹 | <code>string</code> | Construct version to use.<br/>__*Default*__: \"^10.0.12\"\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docgenFilePath**?🔹 | <code>string</code> | File path for generated docs.<br/>__*Default*__: \"API.md\"\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**dotnet**?⚠️ | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | __*Optional*__\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**excludeTypescript**?🔹 | <code>Array<string></code> | Accepts a list of glob patterns.<br/>__*Optional*__\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**publishToGo**?🔹 | <code>[cdk.JsiiGoTarget](#projen-cdk-jsiigotarget)</code> | Publish Go bindings to a git repository.<br/>__*Default*__: no publishing\n**publishToMaven**?🔹 | <code>[cdk.JsiiJavaTarget](#projen-cdk-jsiijavatarget)</code> | Publish to maven.<br/>__*Default*__: no publishing\n**publishToNuget**?🔹 | <code>[cdk.JsiiDotNetTarget](#projen-cdk-jsiidotnettarget)</code> | Publish to NuGet.<br/>__*Default*__: no publishing\n**publishToPypi**?🔹 | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | Publish to pypi.<br/>__*Default*__: no publishing\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**python**?⚠️ | <code>[cdk.JsiiPythonTarget](#projen-cdk-jsiipythontarget)</code> | __*Optional*__\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rootdir**?🔹 | <code>string</code> | __*Default*__: \".\"\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct CircleCiProps 🔹 <a id=\"projen-circleci-circleciprops\"></a>\n\n\nOptions for class {@link Circleci}.\n\n\n\nName | Type | Description \n-----|------|-------------\n**jobs**?🔹 | <code>Array<[circleci.Job](#projen-circleci-job)></code> | List of Jobs to create unique steps per pipeline, e.g. ```json jobs: [{   identifier: \"compile\",   docker: { image: \"golang:alpine\" }   steps: [\"checkout\", run: {command: \"go build .\"}] }] ```.<br/>__*Optional*__\n**orbs**?🔹 | <code>Map<string, string></code> | Contains a map of CirclCi Orbs ```json orbs: {   node: \"circleci/node@5.0.1\"   slack: \"circleci/slack@4.8.3\" } ```.<br/>__*Optional*__\n**setup**?🔹 | <code>boolean</code> | The setup field enables you to conditionally trigger configurations from outside the primary .circleci parent directory, update pipeline parameters, or generate customized configurations.<br/>__*Optional*__\n**version**?🔹 | <code>number</code> | pipeline version.<br/>__*Default*__: 2.1\n**workflows**?🔹 | <code>Array<[circleci.Workflow](#projen-circleci-workflow)></code> | List of Workflows of pipeline, e.g. ```json workflows: {    {      identifier: \"build\",        jobs: [{           identifier: \"node/install\",           context: [\"npm\"],        }]    } } ```.<br/>__*Optional*__\n\n\n\n## struct Docker 🔹 <a id=\"projen-circleci-docker\"></a>\n\n\nOptions for docker executor.\n\n\n\nName | Type | Description \n-----|------|-------------\n**image**🔹 | <code>string</code> | The name of a custom docker image to use.\n**auth**?🔹 | <code>Map<string, string></code> | Authentication for registries using standard docker login credentials.<br/>__*Optional*__\n**awsAuth**?🔹 | <code>Map<string, string></code> | Authentication for AWS Elastic Container Registry (ECR).<br/>__*Optional*__\n**command**?🔹 | <code>Array<string></code> | The command used as pid 1 (or args for entrypoint) when launching the container.<br/>__*Optional*__\n**entrypoint**?🔹 | <code>Array<string></code> | The command used as executable when launching the container.<br/>__*Optional*__\n**environment**?🔹 | <code>Map<string, string &#124; number &#124; boolean></code> | A map of environment variable names and values.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | The name the container is reachable by.<br/>__*Optional*__\n**user**?🔹 | <code>string</code> | Which user to run commands as within the Docker container.<br/>__*Optional*__\n\n\n\n## struct Filter 🔹 <a id=\"projen-circleci-filter\"></a>\n\n\nThe branches key controls whether the current branch should have a schedule trigger created for it, where current branch is the branch containing the config.yml file with the trigger stanza. That is, a push on the main branch will only schedule a workflow for the main branch.\n\nBranches can have the keys only and ignore which either map to a single string naming a branch.\nYou may also use regular expressions to match against branches by enclosing them with /’s, or map to a list of such strings.\nRegular expressions must match the entire string.\n\nAny branches that match only will run the job.\nAny branches that match ignore will not run the job.\nIf neither only nor ignore are specified then all branches will run the job.\nIf both only and ignore are specified the only is considered before ignore.\n\n\n\nName | Type | Description \n-----|------|-------------\n**branches**?🔹 | <code>[circleci.FilterConfig](#projen-circleci-filterconfig)</code> | __*Optional*__\n**tags**?🔹 | <code>[circleci.FilterConfig](#projen-circleci-filterconfig)</code> | __*Optional*__\n\n\n\n## struct FilterConfig 🔹 <a id=\"projen-circleci-filterconfig\"></a>\n\n\nset an inclusive or exclusive filter.\n\n\n\nName | Type | Description \n-----|------|-------------\n**ignore**?🔹 | <code>Array<string></code> | Either a single branch specifier, or a list of branch specifiers.<br/>__*Optional*__\n**only**?🔹 | <code>Array<string></code> | Either a single branch specifier, or a list of branch specifiers.<br/>__*Optional*__\n\n\n\n## struct Job 🔹 <a id=\"projen-circleci-job\"></a>\n\n\nA Workflow is comprised of one or more uniquely named jobs.\n\nJobs are specified in the jobs map,\nsee Sample 2.0 config.yml for two examples of a job map.\nThe name of the job is the key in the map, and the value is a map describing the job.\nEach job consists of the job’s name as a key and a map as a value. A name should be case insensitive unique within a current jobs list.\n\n\n\nName | Type | Description \n-----|------|-------------\n**identifier**🔹 | <code>string</code> | name of dynamic key *.\n**docker**?🔹 | <code>Array<[circleci.Docker](#projen-circleci-docker)></code> | __*Optional*__\n**environment**?🔹 | <code>Map<string, string &#124; number &#124; boolean></code> | A map of environment variable names and values.<br/>__*Optional*__\n**machine**?🔹 | <code>[circleci.Machine](#projen-circleci-machine)</code> | __*Optional*__\n**macos**?🔹 | <code>[circleci.Macos](#projen-circleci-macos)</code> | __*Optional*__\n**parallelism**?🔹 | <code>number</code> | Number of parallel instances of this job to run (default: 1).<br/>__*Optional*__\n**parameters**?🔹 | <code>Map<string, [circleci.PipelineParameter](#projen-circleci-pipelineparameter)></code> | Parameters for making a job explicitly configurable in a workflow.<br/>__*Optional*__\n**resourceClass**?🔹 | <code>string</code> | {@link ResourceClass}.<br/>__*Optional*__\n**shell**?🔹 | <code>string</code> | Shell to use for execution command in all steps.<br/>__*Optional*__\n**steps**?🔹 | <code>Array<any></code> | no type support here, for syntax {@see https://circleci.com/docs/2.0/configuration-reference/#steps}.<br/>__*Optional*__\n**workingDirectory**?🔹 | <code>string</code> | In which directory to run the steps.<br/>__*Optional*__\n\n\n\n## struct Machine 🔹 <a id=\"projen-circleci-machine\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**image**🔹 | <code>string</code> | The VM image to use.\n**dockerLayerCaching**?🔹 | <code>string</code> | enable docker layer caching.<br/>__*Optional*__\n\n\n\n## struct Macos 🔹 <a id=\"projen-circleci-macos\"></a>\n\n\nCircleCI supports running jobs on macOS, to allow you to build, test, and deploy apps for macOS, iOS, tvOS and watchOS.\n\nTo run a job in a macOS virtual machine,\nyou must add the macos key to the top-level configuration for the job and specify\nthe version of Xcode you would like to use.\n\n\n\nName | Type | Description \n-----|------|-------------\n**xcode**🔹 | <code>string</code> | The version of Xcode that is installed on the virtual machine.\n\n\n\n## struct Matrix 🔹 <a id=\"projen-circleci-matrix\"></a>\n\n\nThe matrix stanza allows you to run a parameterized job multiple times with different arguments.\n\n\n\nName | Type | Description \n-----|------|-------------\n**alias**?🔹 | <code>string</code> | An alias for the matrix, usable from another job’s requires stanza.<br/>__*Optional*__\n**parameters**?🔹 | <code>Map<string, Array<string> &#124; Array<number>></code> | A map of parameter names to every value the job should be called with.<br/>__*Optional*__\n\n\n\n## struct PipelineParameter 🔹 <a id=\"projen-circleci-pipelineparameter\"></a>\n\n\nParameters are declared by name under a job, command, or executor.\n\n\n\nName | Type | Description \n-----|------|-------------\n**type**🔹 | <code>[circleci.PipelineParameterType](#projen-circleci-pipelineparametertype)</code> | The parameter type, required.\n**default**?🔹 | <code>string &#124; number &#124; boolean</code> | The default value for the parameter.<br/>__*Optional*__\n**description**?🔹 | <code>string</code> | Used to generate documentation for your orb.<br/>__*Optional*__\n\n\n\n## struct Run 🔹 <a id=\"projen-circleci-run\"></a>\n\n\nUsed for invoking all command-line programs, taking either a map of configuration values, or, when called in its short-form, a string that will be used as both the command and name.\n\nRun commands are executed using non-login shells by default,\nso you must explicitly source any dotfiles as part of the command.\n\nNot used because type incompatible types in steps array\n\n\n\nName | Type | Description \n-----|------|-------------\n**command**🔹 | <code>string</code> | Command to run via the shell.\n**background**?🔹 | <code>string</code> | Whether this step should run in the background (default: false).<br/>__*Optional*__\n**environment**?🔹 | <code>string</code> | Additional environmental variables, locally scoped to command.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | Title of the step to be shown in the CircleCI UI (default: full command).<br/>__*Optional*__\n**noOutputTimeout**?🔹 | <code>string</code> | Elapsed time the command can run without output such as “20m”, “1.25h”, “5s”. The default is 10 minutes.<br/>__*Optional*__\n**shell**?🔹 | <code>string</code> | Shell to use for execution command.<br/>__*Optional*__\n**when**?🔹 | <code>string</code> | Specify when to enable or disable the step.<br/>__*Optional*__\n**workingDirectory**?🔹 | <code>string</code> | In which directory to run this step.<br/>__*Optional*__\n\n\n\n## struct Schedule 🔹 <a id=\"projen-circleci-schedule\"></a>\n\n\nA workflow may have a schedule indicating it runs at a certain time.\n\n\n\nName | Type | Description \n-----|------|-------------\n**filters**🔹 | <code>[circleci.Filter](#projen-circleci-filter)</code> | <span></span>\n**cron**?🔹 | <code>string</code> | The cron key is defined using POSIX crontab syntax.<br/>__*Optional*__\n\n\n\n## struct StepRun 🔹 <a id=\"projen-circleci-steprun\"></a>\n\n\nExecution steps for Job.\n\n\n\nName | Type | Description \n-----|------|-------------\n**run**?🔹 | <code>[circleci.Run](#projen-circleci-run)</code> | __*Optional*__\n\n\n\n## struct Triggers 🔹 <a id=\"projen-circleci-triggers\"></a>\n\n\nSpecifies which triggers will cause this workflow to be executed.\n\nDefault behavior is to trigger the workflow when pushing to a branch.\n\n\n\nName | Type | Description \n-----|------|-------------\n**schedule**?🔹 | <code>[circleci.Schedule](#projen-circleci-schedule)</code> | __*Optional*__\n\n\n\n## struct Workflow 🔹 <a id=\"projen-circleci-workflow\"></a>\n\n\nUsed for orchestrating all jobs.\n\nEach workflow consists of the workflow name as a key and a map as a value.\nA name should be unique within the current config.yml.\nThe top-level keys for the Workflows configuration are version and jobs.\n\n\n\nName | Type | Description \n-----|------|-------------\n**identifier**🔹 | <code>string</code> | name of dynamic key *.\n**jobs**?🔹 | <code>Array<[circleci.WorkflowJob](#projen-circleci-workflowjob)></code> | __*Optional*__\n**triggers**?🔹 | <code>Array<[circleci.Triggers](#projen-circleci-triggers)></code> | __*Optional*__\n**when**?🔹 | <code>any</code> | when is too dynamic to be casted to interfaces.<br/>__*Optional*__\n\n\n\n## struct WorkflowJob 🔹 <a id=\"projen-circleci-workflowjob\"></a>\n\n\nA Job is part of Workflow.\n\nA Job can be created with {@link Job} or it can be provided by the orb\n\n\n\nName | Type | Description \n-----|------|-------------\n**identifier**🔹 | <code>string</code> | name of dynamic key *.\n**context**?🔹 | <code>Array<string></code> | The name of the context(s).<br/>__*Optional*__\n**filters**?🔹 | <code>[circleci.Filter](#projen-circleci-filter)</code> | Job Filters can have the key branches or tags.<br/>__*Optional*__\n**matrix**?🔹 | <code>[circleci.Matrix](#projen-circleci-matrix)</code> | __*Optional*__\n**name**?🔹 | <code>string</code> | A replacement for the job name.<br/>__*Optional*__\n**orbParameters**?🔹 | <code>Map<string, string &#124; number &#124; boolean></code> | Parameters passed to job when referencing a job from orb.<br/>__*Optional*__\n**requires**?🔹 | <code>Array<string></code> | A list of jobs that must succeed for the job to start.<br/>__*Optional*__\n**type**?🔹 | <code>[circleci.JobType](#projen-circleci-jobtype)</code> | A job may have a type of approval indicating it must be manually approved before downstream jobs may proceed.<br/>__*Optional*__\n\n\n\n## struct AutoApproveOptions 🔹 <a id=\"projen-github-autoapproveoptions\"></a>\n\n\nOptions for 'AutoApprove'.\n\n\n\nName | Type | Description \n-----|------|-------------\n**allowedUsernames**?🔹 | <code>Array<string></code> | Only pull requests authored by these Github usernames will be auto-approved.<br/>__*Default*__: ['github-bot']\n**label**?🔹 | <code>string</code> | Only pull requests with this label will be auto-approved.<br/>__*Default*__: 'auto-approve'\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n**secret**?🔹 | <code>string</code> | A GitHub secret name which contains a GitHub Access Token with write permissions for the `pull_request` scope.<br/>__*Default*__: \"GITHUB_TOKEN\"\n\n\n\n## struct AutoMergeOptions 🔹 <a id=\"projen-github-automergeoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**approvedReviews**?🔹 | <code>number</code> | Number of approved code reviews.<br/>__*Default*__: 1\n**blockingLabels**?🔹 | <code>Array<string></code> | List of labels that will prevent auto-merging.<br/>__*Default*__: ['do-not-merge']\n\n\n\n## struct DependabotIgnore 🔹 <a id=\"projen-github-dependabotignore\"></a>\n\n\nYou can use the `ignore` option to customize which dependencies are updated.\n\nThe ignore option supports the following options.\n\n\n\nName | Type | Description \n-----|------|-------------\n**dependencyName**🔹 | <code>string</code> | Use to ignore updates for dependencies with matching names, optionally using `*` to match zero or more characters.\n**versions**?🔹 | <code>Array<string></code> | Use to ignore specific versions or ranges of versions.<br/>__*Optional*__\n\n\n\n## struct DependabotOptions 🔹 <a id=\"projen-github-dependabotoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**ignore**?🔹 | <code>Array<[github.DependabotIgnore](#projen-github-dependabotignore)></code> | You can use the `ignore` option to customize which dependencies are updated.<br/>__*Default*__: []\n**ignoreProjen**?🔹 | <code>boolean</code> | Ignores updates to `projen`.<br/>__*Default*__: true\n**labels**?🔹 | <code>Array<string></code> | List of labels to apply to the created PR's.<br/>__*Optional*__\n**registries**?🔹 | <code>Map<string, [github.DependabotRegistry](#projen-github-dependabotregistry)></code> | Map of package registries to use.<br/>__*Default*__: use public registries\n**scheduleInterval**?🔹 | <code>[github.DependabotScheduleInterval](#projen-github-dependabotscheduleinterval)</code> | How often to check for new versions and raise pull requests.<br/>__*Default*__: ScheduleInterval.DAILY\n**versioningStrategy**?🔹 | <code>[github.VersioningStrategy](#projen-github-versioningstrategy)</code> | The strategy to use when edits manifest and lock files.<br/>__*Default*__: VersioningStrategy.LOCKFILE_ONLY The default is to only update the lock file because package.json is controlled by projen and any outside updates will fail the build.\n\n\n\n## struct DependabotRegistry 🔹 <a id=\"projen-github-dependabotregistry\"></a>\n\n\nUse to add private registry support for dependabot.\n\n\n\nName | Type | Description \n-----|------|-------------\n**type**🔹 | <code>[github.DependabotRegistryType](#projen-github-dependabotregistrytype)</code> | Registry type e.g. 'npm-registry' or 'docker-registry'.\n**url**🔹 | <code>string</code> | Url for the registry e.g. 'https://npm.pkg.github.com' or 'registry.hub.docker.com'.\n**key**?🔹 | <code>string</code> | A reference to a Dependabot secret containing an access key for this registry.<br/>__*Default*__: undefined\n**organization**?🔹 | <code>string</code> | Used with the hex-organization registry type.<br/>__*Default*__: undefined\n**password**?🔹 | <code>string</code> | A reference to a Dependabot secret containing the password for the specified user.<br/>__*Default*__: undefined\n**replacesBase**?🔹 | <code>boolean</code> | For registries with type: python-index, if the boolean value is true, pip esolves dependencies by using the specified URL rather than the base URL of the Python Package Index (by default https://pypi.org/simple).<br/>__*Default*__: undefined\n**token**?🔹 | <code>string</code> | Secret token for dependabot access e.g. '${{ secrets.DEPENDABOT_PACKAGE_TOKEN }}'.<br/>__*Default*__: undefined\n**username**?🔹 | <code>string</code> | The username that Dependabot uses to access the registry.<br/>__*Default*__: do not authenticate\n\n\n\n## struct GitHubOptions 🔹 <a id=\"projen-github-githuboptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**mergify**?🔹 | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?🔹 | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for Mergify.<br/>__*Default*__: default options\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**pullRequestLint**?🔹 | <code>boolean</code> | Add a workflow that performs basic checks for pull requests, like validating that PRs follow Conventional Commits.<br/>__*Default*__: true\n**pullRequestLintOptions**?🔹 | <code>[github.PullRequestLintOptions](#projen-github-pullrequestlintoptions)</code> | Options for configuring a pull request linter.<br/>__*Default*__: see defaults in `PullRequestLintOptions`\n**workflows**?🔹 | <code>boolean</code> | Enables GitHub workflows.<br/>__*Default*__: true\n\n\n\n## struct GitHubProjectOptions 🔹 <a id=\"projen-github-githubprojectoptions\"></a>\n\n\nOptions for `GitHubProject`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | This is the name of your project.\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n\n\n\n## struct GitIdentity 🔹 <a id=\"projen-github-gitidentity\"></a>\n\n\nRepresents the git identity.\n\n\n\nName | Type | Description \n-----|------|-------------\n**email**🔹 | <code>string</code> | The email address of the git user.\n**name**🔹 | <code>string</code> | The name of the user.\n\n\n\n## struct GithubCredentialsAppOptions 🔹 <a id=\"projen-github-githubcredentialsappoptions\"></a>\n\n\nOptions for `GithubCredentials.fromApp`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**appIdSecret**?🔹 | <code>string</code> | __*Optional*__\n**privateKeySecret**?🔹 | <code>string</code> | __*Optional*__\n\n\n\n## struct GithubCredentialsPersonalAccessTokenOptions 🔹 <a id=\"projen-github-githubcredentialspersonalaccesstokenoptions\"></a>\n\n\nOptions for `GithubCredentials.fromPersonalAccessToken`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**secret**?🔹 | <code>string</code> | __*Optional*__\n\n\n\n## struct GithubWorkflowOptions 🔹 <a id=\"projen-github-githubworkflowoptions\"></a>\n\n\nOptions for `GithubWorkflow`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**concurrency**?🔹 | <code>string</code> | Concurrency ensures that only a single job or workflow using the same concurrency group will run at a time.<br/>__*Default*__: disabled\n**force**?🔹 | <code>boolean</code> | Force the creation of the workflow even if `workflows` is disabled in `GitHub`.<br/>__*Default*__: false\n\n\n\n## interface IAddConditionsLater 🔹 <a id=\"projen-github-iaddconditionslater\"></a>\n\n\n\n### Methods\n\n\n#### render()🔹 <a id=\"projen-github-iaddconditionslater-render\"></a>\n\n\n\n```ts\nrender(): Array<string>\n```\n\n\n__Returns__:\n* <code>Array<string></code>\n\n\n\n## interface IJobProvider 🔹 <a id=\"projen-github-ijobprovider\"></a>\n\n\n\n### Methods\n\n\n#### renderJobs()🔹 <a id=\"projen-github-ijobprovider-renderjobs\"></a>\n\nGenerates a collection of named GitHub workflow jobs.\n\n```ts\nrenderJobs(): Map<string, Job>\n```\n\n\n__Returns__:\n* <code>Map<string, [github.workflows.Job](#projen-github-workflows-job)></code>\n\n\n\n## struct MergifyConditionalOperator 🔹 <a id=\"projen-github-mergifyconditionaloperator\"></a>\n\n\nThe Mergify conditional operators that can be used are: `or` and `and`.\n\nNote: The number of nested conditions is limited to 3.\n\n\n\nName | Type | Description \n-----|------|-------------\n**and**?🔹 | <code>Array<string &#124; [github.MergifyConditionalOperator](#projen-github-mergifyconditionaloperator)></code> | __*Optional*__\n**or**?🔹 | <code>Array<string &#124; [github.MergifyConditionalOperator](#projen-github-mergifyconditionaloperator)></code> | __*Optional*__\n\n\n\n## struct MergifyOptions 🔹 <a id=\"projen-github-mergifyoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**queues**?🔹 | <code>Array<[github.MergifyQueue](#projen-github-mergifyqueue)></code> | __*Optional*__\n**rules**?🔹 | <code>Array<[github.MergifyRule](#projen-github-mergifyrule)></code> | __*Optional*__\n\n\n\n## struct MergifyQueue 🔹 <a id=\"projen-github-mergifyqueue\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**conditions**🔹 | <code>Array<string &#124; [github.MergifyConditionalOperator](#projen-github-mergifyconditionaloperator)></code> | A list of Conditions string that must match against the pull request for the pull request to be added to the queue.\n**name**🔹 | <code>string</code> | The name of the queue.\n\n\n\n## struct MergifyRule 🔹 <a id=\"projen-github-mergifyrule\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**actions**🔹 | <code>Map<string, any></code> | A dictionary made of Actions that will be executed on the matching pull requests.\n**conditions**🔹 | <code>Array<string &#124; [github.MergifyConditionalOperator](#projen-github-mergifyconditionaloperator)></code> | A list of Conditions string that must match against the pull request for the rule to be applied.\n**name**🔹 | <code>string</code> | The name of the rule.\n\n\n\n## struct PullRequestLintOptions 🔹 <a id=\"projen-github-pullrequestlintoptions\"></a>\n\n\nOptions for PullRequestLint.\n\n\n\nName | Type | Description \n-----|------|-------------\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n**semanticTitle**?🔹 | <code>boolean</code> | Validate that pull request titles follow Conventional Commits.<br/>__*Default*__: true\n**semanticTitleOptions**?🔹 | <code>[github.SemanticTitleOptions](#projen-github-semantictitleoptions)</code> | Options for validating the conventional commit title linter.<br/>__*Default*__: title must start with \"feat\", \"fix\", or \"chore\"\n\n\n\n## struct PullRequestTemplateOptions 🔹 <a id=\"projen-github-pullrequesttemplateoptions\"></a>\n\n\nOptions for `PullRequestTemplate`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**lines**?🔹 | <code>Array<string></code> | The contents of the template.<br/>__*Default*__: a standard default template will be created.\n\n\n\n## struct SemanticTitleOptions 🔹 <a id=\"projen-github-semantictitleoptions\"></a>\n\n\nOptions for linting that PR titles follow Conventional Commits.\n\n\n\nName | Type | Description \n-----|------|-------------\n**requireScope**?🔹 | <code>boolean</code> | Configure that a scope must always be provided.<br/>__*Default*__: false\n**types**?🔹 | <code>Array<string></code> | Configure a list of commit types that are allowed.<br/>__*Default*__: [\"feat\", \"fix\", \"chore\"]\n\n\n\n## struct StaleBehavior 🔹 <a id=\"projen-github-stalebehavior\"></a>\n\n\nStale behavior.\n\n\n\nName | Type | Description \n-----|------|-------------\n**closeMessage**?🔹 | <code>string</code> | The comment to add to the issue/PR when it's closed.<br/>__*Default*__: \"Closing this pull request as it hasn\\'t seen activity for a while. Please add a comment\n**daysBeforeClose**?🔹 | <code>number</code> | Days until the issue/PR is closed after it is marked as \"Stale\".<br/>__*Default*__: -\n**daysBeforeStale**?🔹 | <code>number</code> | How many days until the issue or pull request is marked as \"Stale\".<br/>__*Default*__: -\n**enabled**?🔹 | <code>boolean</code> | Determines if this behavior is enabled.<br/>__*Default*__: true\n**exemptLabels**?🔹 | <code>Array<string></code> | Label which exempt an issue/PR from becoming stale.<br/>__*Default*__: [\"backlog\"]\n**staleLabel**?🔹 | <code>string</code> | The label to apply to the issue/PR when it becomes stale.<br/>__*Default*__: \"stale\"\n**staleMessage**?🔹 | <code>string</code> | The comment to add to the issue/PR when it becomes stale.<br/>__*Default*__: \"This pull request is now marked as stale because hasn\\'t seen activity for a while. Add a comment or it will be closed soon.\"\n\n\n\n## struct StaleOptions 🔹 <a id=\"projen-github-staleoptions\"></a>\n\n\nOptions for `Stale`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**issues**?🔹 | <code>[github.StaleBehavior](#projen-github-stalebehavior)</code> | How to handle stale issues.<br/>__*Default*__: By default, stale issues with no activity will be marked as stale after 60 days and closed within 7 days.\n**pullRequest**?🔹 | <code>[github.StaleBehavior](#projen-github-stalebehavior)</code> | How to handle stale pull requests.<br/>__*Default*__: By default, pull requests with no activity will be marked as stale after 14 days and closed within 2 days with relevant comments.\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct TaskWorkflowOptions 🔹 <a id=\"projen-github-taskworkflowoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | The workflow name.\n**permissions**🔹 | <code>[github.workflows.JobPermissions](#projen-github-workflows-jobpermissions)</code> | Permissions for the build job.\n**task**🔹 | <code>[Task](#projen-task)</code> | The main task to be executed.\n**artifactsDirectory**?🔹 | <code>string</code> | A directory name which contains artifacts to be uploaded (e.g. `dist`). If this is set, the contents of this directory will be uploaded as an artifact at the end of the workflow run, even if other steps fail.<br/>__*Default*__: not set\n**checkoutWith**?🔹 | <code>Map<string, any></code> | Override for the `with` property of the source code checkout step.<br/>__*Default*__: not set\n**condition**?🔹 | <code>string</code> | Adds an 'if' condition to the workflow.<br/>__*Optional*__\n**container**?🔹 | <code>[github.workflows.ContainerOptions](#projen-github-workflows-containeroptions)</code> | __*Default*__: default image\n**env**?🔹 | <code>Map<string, string></code> | Workflow environment variables.<br/>__*Default*__: {}\n**gitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in this workflow.<br/>__*Optional*__\n**jobId**?🔹 | <code>string</code> | The primary job id.<br/>__*Default*__: \"build\"\n**outputs**?🔹 | <code>Map<string, [github.workflows.JobStepOutput](#projen-github-workflows-jobstepoutput)></code> | Mapping of job output names to values/expressions.<br/>__*Default*__: {}\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Actions to run after the main build step.<br/>__*Default*__: not set\n**preBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to run before the main build step.<br/>__*Default*__: not set\n**preCheckoutSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Initial steps to run before the source code checkout.<br/>__*Default*__: not set\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n**triggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | The triggers for the workflow.<br/>__*Default*__: by default workflows can only be triggered by manually.\n\n\n\n## struct AllowFailure 🔹 <a id=\"projen-gitlab-allowfailure\"></a>\n\n\nExit code that are not considered failure.\n\nThe job fails for any other exit code.\nYou can list which exit codes are not considered failures. The job fails for any other\nexit code.\n\n\n\nName | Type | Description \n-----|------|-------------\n**exitCodes**🔹 | <code>number &#124; Array<number></code> | <span></span>\n\n\n\n## struct Artifacts 🔹 <a id=\"projen-gitlab-artifacts\"></a>\n\n\nUsed to specify a list of files and directories that should be attached to the job if it succeeds.\n\nArtifacts are sent to Gitlab where they can be downloaded.\n\n\n\nName | Type | Description \n-----|------|-------------\n**exclude**?🔹 | <code>Array<string></code> | A list of paths to files/folders that should be excluded in the artifact.<br/>__*Optional*__\n**expireIn**?🔹 | <code>string</code> | How long artifacts should be kept.<br/>__*Optional*__\n**exposeAs**?🔹 | <code>string</code> | Can be used to expose job artifacts in the merge request UI.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | Name for the archive created on job success.<br/>__*Optional*__\n**paths**?🔹 | <code>Array<string></code> | A list of paths to files/folders that should be included in the artifact.<br/>__*Optional*__\n**reports**?🔹 | <code>[gitlab.Reports](#projen-gitlab-reports)</code> | Reports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in Merge Requests.<br/>__*Optional*__\n**untracked**?🔹 | <code>boolean</code> | Whether to add all untracked files (along with 'artifacts.paths') to the artifact.<br/>__*Optional*__\n**when**?🔹 | <code>[gitlab.CacheWhen](#projen-gitlab-cachewhen)</code> | Configure when artifacts are uploaded depended on job status.<br/>__*Optional*__\n\n\n\n## struct Assets 🔹 <a id=\"projen-gitlab-assets\"></a>\n\n\nAsset configuration for a release.\n\n\n\nName | Type | Description \n-----|------|-------------\n**links**🔹 | <code>Array<[gitlab.Link](#projen-gitlab-link)></code> | Include asset links in the release.\n\n\n\n## struct Cache 🔹 <a id=\"projen-gitlab-cache\"></a>\n\n\nCache Definition.\n\n\n\nName | Type | Description \n-----|------|-------------\n**key**?🔹 | <code>string &#124; [gitlab.CacheKeyFiles](#projen-gitlab-cachekeyfiles)</code> | Used the to give each cache a unique identifying key.<br/>__*Optional*__\n**paths**?🔹 | <code>Array<string></code> | Defines which files or directories to cache.<br/>__*Optional*__\n**policy**?🔹 | <code>[gitlab.CachePolicy](#projen-gitlab-cachepolicy)</code> | Defines the upload and download behaviour of the cache.<br/>__*Optional*__\n**untracked**?🔹 | <code>boolean</code> | If set to true all files that are untracked in your Git repository will be cached.<br/>__*Optional*__\n**when**?🔹 | <code>[gitlab.CacheWhen](#projen-gitlab-cachewhen)</code> | Defines when to save the cache, based on the status of the job (Default: Job Success).<br/>__*Optional*__\n\n\n\n## struct CacheKeyFiles 🔹 <a id=\"projen-gitlab-cachekeyfiles\"></a>\n\n\nUse this construct to generate a new key when one or two specific files change.\n\n\n\nName | Type | Description \n-----|------|-------------\n**files**🔹 | <code>Array<string></code> | The files that are checked against.\n**prefix**?🔹 | <code>string</code> | Adds a custom prefix to the checksums computed.<br/>__*Optional*__\n\n\n\n## struct CiConfigurationOptions 🔹 <a id=\"projen-gitlab-ciconfigurationoptions\"></a>\n\n\nOptions for `CiConfiguration`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**default**?🔹 | <code>[gitlab.Default](#projen-gitlab-default)</code> | Default settings for the CI Configuration.<br/>__*Optional*__\n**jobs**?🔹 | <code>Map<string, [gitlab.Job](#projen-gitlab-job)></code> | An initial set of jobs to add to the configuration.<br/>__*Optional*__\n**pages**?🔹 | <code>[gitlab.Job](#projen-gitlab-job)</code> | A special job used to upload static sites to Gitlab pages.<br/>__*Optional*__\n**stages**?🔹 | <code>Array<string></code> | Groups jobs into stages.<br/>__*Optional*__\n**variables**?🔹 | <code>Map<string, any></code> | Global variables that are passed to jobs.<br/>__*Optional*__\n**workflow**?🔹 | <code>[gitlab.Workflow](#projen-gitlab-workflow)</code> | Used to control pipeline behavior.<br/>__*Optional*__\n\n\n\n## struct Default 🔹 <a id=\"projen-gitlab-default\"></a>\n\n\nDefault settings for the CI Configuration.\n\nJobs that do not define one or more of the listed keywords use the value defined in the default section.\n\n\n\nName | Type | Description \n-----|------|-------------\n**afterScript**?🔹 | <code>Array<string></code> | __*Optional*__\n**artifacts**?🔹 | <code>[gitlab.Artifacts](#projen-gitlab-artifacts)</code> | __*Optional*__\n**beforeScript**?🔹 | <code>Array<string></code> | __*Optional*__\n**cache**?🔹 | <code>[gitlab.Cache](#projen-gitlab-cache)</code> | __*Optional*__\n**image**?🔹 | <code>[gitlab.Image](#projen-gitlab-image)</code> | __*Optional*__\n**interruptible**?🔹 | <code>boolean</code> | __*Optional*__\n**retry**?🔹 | <code>[gitlab.Retry](#projen-gitlab-retry)</code> | __*Optional*__\n**services**?🔹 | <code>Array<[gitlab.Service](#projen-gitlab-service)></code> | __*Optional*__\n**tags**?🔹 | <code>Array<string></code> | __*Optional*__\n**timeout**?🔹 | <code>string</code> | __*Optional*__\n\n\n\n## struct Engine 🔹 <a id=\"projen-gitlab-engine\"></a>\n\n\nThe engine configuration for a secret.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | Name of the secrets engine.\n**path**🔹 | <code>string</code> | Path to the secrets engine.\n\n\n\n## struct Environment 🔹 <a id=\"projen-gitlab-environment\"></a>\n\n\nThe environment that a job deploys to.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | The name of the environment, e.g. 'qa', 'staging', 'production'.\n**action**?🔹 | <code>[gitlab.Action](#projen-gitlab-action)</code> | Specifies what this job will do.<br/>__*Optional*__\n**autoStopIn**?🔹 | <code>string</code> | The amount of time it should take before Gitlab will automatically stop the environment.<br/>__*Optional*__\n**deploymentTier**?🔹 | <code>[gitlab.DeploymentTier](#projen-gitlab-deploymenttier)</code> | Explicitly specifies the tier of the deployment environment if non-standard environment name is used.<br/>__*Optional*__\n**kubernetes**?🔹 | <code>[gitlab.KubernetesConfig](#projen-gitlab-kubernetesconfig)</code> | Used to configure the kubernetes deployment for this environment.<br/>__*Optional*__\n**onStop**?🔹 | <code>string</code> | The name of a job to execute when the environment is about to be stopped.<br/>__*Optional*__\n**url**?🔹 | <code>string</code> | When set, this will expose buttons in various places for the current environment in Gitlab, that will take you to the defined URL.<br/>__*Optional*__\n\n\n\n## struct Filter 🔹 <a id=\"projen-gitlab-filter\"></a>\n\n\nFiltering options for when a job will run.\n\n\n\nName | Type | Description \n-----|------|-------------\n**changes**?🔹 | <code>Array<string></code> | Filter job creation based on files that were modified in a git push.<br/>__*Optional*__\n**kubernetes**?🔹 | <code>[gitlab.KubernetesEnum](#projen-gitlab-kubernetesenum)</code> | Filter job based on if Kubernetes integration is active.<br/>__*Optional*__\n**refs**?🔹 | <code>Array<string></code> | Control when to add jobs to a pipeline based on branch names or pipeline types.<br/>__*Optional*__\n**variables**?🔹 | <code>Array<string></code> | Filter job by checking comparing values of environment variables.<br/>__*Optional*__\n\n\n\n## struct Image 🔹 <a id=\"projen-gitlab-image\"></a>\n\n\nSpecifies the docker image to use for the job or globally for all jobs.\n\nJob configuration\ntakes precedence over global setting. Requires a certain kind of Gitlab runner executor.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | Full name of the image that should be used.\n**entrypoint**?🔹 | <code>Array<any></code> | Command or script that should be executed as the container's entrypoint.<br/>__*Optional*__\n\n\n\n## struct Include 🔹 <a id=\"projen-gitlab-include\"></a>\n\n\nAn included YAML file.\n\n\n\nName | Type | Description \n-----|------|-------------\n**file**?🔹 | <code>Array<string></code> | Files from another private project on the same GitLab instance.<br/>__*Optional*__\n**local**?🔹 | <code>string</code> | Relative path from local repository root (`/`) to the `yaml`/`yml` file template.<br/>__*Optional*__\n**project**?🔹 | <code>string</code> | Path to the project, e.g. `group/project`, or `group/sub-group/project`.<br/>__*Optional*__\n**ref**?🔹 | <code>string</code> | Branch/Tag/Commit-hash for the target project.<br/>__*Optional*__\n**remote**?🔹 | <code>string</code> | URL to a `yaml`/`yml` template file using HTTP/HTTPS.<br/>__*Optional*__\n**rules**?🔹 | <code>Array<[gitlab.IncludeRule](#projen-gitlab-includerule)></code> | Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job.<br/>__*Optional*__\n**template**?🔹 | <code>string</code> | Use a `.gitlab-ci.yml` template as a base, e.g. `Nodejs.gitlab-ci.yml`.<br/>__*Optional*__\n\n\n\n## struct IncludeRule 🔹 <a id=\"projen-gitlab-includerule\"></a>\n\n\nRules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job.\n\n\n\nName | Type | Description \n-----|------|-------------\n**allowFailure**?🔹 | <code>boolean &#124; [gitlab.AllowFailure](#projen-gitlab-allowfailure)</code> | __*Optional*__\n**changes**?🔹 | <code>Array<string></code> | __*Optional*__\n**exists**?🔹 | <code>Array<string></code> | __*Optional*__\n**if**?🔹 | <code>string</code> | __*Optional*__\n**startIn**?🔹 | <code>string</code> | __*Optional*__\n**variables**?🔹 | <code>Map<string, string &#124; number></code> | __*Optional*__\n**when**?🔹 | <code>[gitlab.JobWhen](#projen-gitlab-jobwhen)</code> | __*Optional*__\n\n\n\n## struct Inherit 🔹 <a id=\"projen-gitlab-inherit\"></a>\n\n\nControls inheritance of globally-defined defaults and variables.\n\nBoolean values control\ninheritance of all default: or variables: keywords. To inherit only a subset of default:\nor variables: keywords, specify what you wish to inherit. Anything not listed is not\ninherited.\n\n\n\nName | Type | Description \n-----|------|-------------\n**default**?🔹 | <code>boolean &#124; Array<[gitlab.DefaultElement](#projen-gitlab-defaultelement)></code> | Whether to inherit all globally-defined defaults or not.<br/>__*Optional*__\n**variables**?🔹 | <code>boolean &#124; Array<string></code> | Whether to inherit all globally-defined variables or not.<br/>__*Optional*__\n\n\n\n## struct Job 🔹 <a id=\"projen-gitlab-job\"></a>\n\n\nJobs are the most fundamental element of a .gitlab-ci.yml file.\n\n\n\nName | Type | Description \n-----|------|-------------\n**afterScript**?🔹 | <code>Array<string></code> | __*Optional*__\n**allowFailure**?🔹 | <code>boolean &#124; [gitlab.AllowFailure](#projen-gitlab-allowfailure)</code> | Whether to allow the pipeline to continue running on job failure (Default: false).<br/>__*Optional*__\n**artifacts**?🔹 | <code>[gitlab.Artifacts](#projen-gitlab-artifacts)</code> | __*Optional*__\n**beforeScript**?🔹 | <code>Array<string></code> | __*Optional*__\n**cache**?🔹 | <code>[gitlab.Cache](#projen-gitlab-cache)</code> | __*Optional*__\n**coverage**?🔹 | <code>string</code> | Must be a regular expression, optionally but recommended to be quoted, and must be surrounded with '/'.<br/>__*Optional*__\n**dependencies**?🔹 | <code>Array<string></code> | Specify a list of job names from earlier stages from which artifacts should be loaded.<br/>__*Optional*__\n**environment**?🔹 | <code>string &#124; [gitlab.Environment](#projen-gitlab-environment)</code> | Used to associate environment metadata with a deploy.<br/>__*Optional*__\n**except**?🔹 | <code>[gitlab.Filter](#projen-gitlab-filter) &#124; Array<string></code> | Job will run *except* for when these filtering options match.<br/>__*Optional*__\n**extends**?🔹 | <code>Array<string></code> | The name of one or more jobs to inherit configuration from.<br/>__*Optional*__\n**image**?🔹 | <code>[gitlab.Image](#projen-gitlab-image)</code> | __*Optional*__\n**inherit**?🔹 | <code>[gitlab.Inherit](#projen-gitlab-inherit)</code> | Controls inheritance of globally-defined defaults and variables.<br/>__*Optional*__\n**interruptible**?🔹 | <code>boolean</code> | __*Optional*__\n**needs**?🔹 | <code>Array<string &#124; [gitlab.Need](#projen-gitlab-need)></code> | The list of jobs in previous stages whose sole completion is needed to start the current job.<br/>__*Optional*__\n**only**?🔹 | <code>[gitlab.Filter](#projen-gitlab-filter) &#124; Array<string></code> | Job will run *only* when these filtering options match.<br/>__*Optional*__\n**parallel**?🔹 | <code>number &#124; [gitlab.Parallel](#projen-gitlab-parallel)</code> | Parallel will split up a single job into several, and provide `CI_NODE_INDEX` and `CI_NODE_TOTAL` environment variables for the running jobs.<br/>__*Optional*__\n**release**?🔹 | <code>[gitlab.Release](#projen-gitlab-release)</code> | Indicates that the job creates a Release.<br/>__*Optional*__\n**resourceGroup**?🔹 | <code>string</code> | Limit job concurrency.<br/>__*Optional*__\n**retry**?🔹 | <code>[gitlab.Retry](#projen-gitlab-retry)</code> | __*Optional*__\n**rules**?🔹 | <code>Array<[gitlab.IncludeRule](#projen-gitlab-includerule)></code> | Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job.<br/>__*Optional*__\n**script**?🔹 | <code>Array<string></code> | Shell scripts executed by the Runner.<br/>__*Optional*__\n**secrets**?🔹 | <code>Map<string, Map<string, [gitlab.Secret](#projen-gitlab-secret)>></code> | CI/CD secrets.<br/>__*Optional*__\n**services**?🔹 | <code>Array<[gitlab.Service](#projen-gitlab-service)></code> | __*Optional*__\n**stage**?🔹 | <code>string</code> | Define what stage the job will run in.<br/>__*Optional*__\n**startIn**?🔹 | <code>string</code> | __*Optional*__\n**tags**?🔹 | <code>Array<string></code> | __*Optional*__\n**timeout**?🔹 | <code>string</code> | __*Optional*__\n**trigger**?🔹 | <code>string &#124; [gitlab.Trigger](#projen-gitlab-trigger)</code> | Trigger allows you to define downstream pipeline trigger.<br/>__*Optional*__\n**variables**?🔹 | <code>Map<string, string &#124; number></code> | Configurable values that are passed to the Job.<br/>__*Optional*__\n**when**?🔹 | <code>[gitlab.JobWhen](#projen-gitlab-jobwhen)</code> | Describes the conditions for when to run the job.<br/>__*Optional*__\n\n\n\n## struct KubernetesConfig 🔹 <a id=\"projen-gitlab-kubernetesconfig\"></a>\n\n\nUsed to configure the kubernetes deployment for this environment.\n\nThis is currently not\nsupported for kubernetes clusters that are managed by Gitlab.\n\n\n\nName | Type | Description \n-----|------|-------------\n**namespace**?🔹 | <code>string</code> | The kubernetes namespace where this environment should be deployed to.<br/>__*Optional*__\n\n\n\n## struct Link 🔹 <a id=\"projen-gitlab-link\"></a>\n\n\nLink configuration for an asset.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | The name of the link.\n**url**🔹 | <code>string</code> | The URL to download a file.\n**filepath**?🔹 | <code>string</code> | The redirect link to the url.<br/>__*Optional*__\n**linkType**?🔹 | <code>[gitlab.LinkType](#projen-gitlab-linktype)</code> | The content kind of what users can download via url.<br/>__*Optional*__\n\n\n\n## struct Need 🔹 <a id=\"projen-gitlab-need\"></a>\n\n\nA jobs in a previous stage whose sole completion is needed to start the current job.\n\n\n\nName | Type | Description \n-----|------|-------------\n**job**🔹 | <code>string</code> | <span></span>\n**artifacts**?🔹 | <code>boolean</code> | __*Optional*__\n**optional**?🔹 | <code>boolean</code> | __*Optional*__\n**pipeline**?🔹 | <code>string</code> | __*Optional*__\n**project**?🔹 | <code>string</code> | __*Optional*__\n**ref**?🔹 | <code>string</code> | __*Optional*__\n\n\n\n## struct Parallel 🔹 <a id=\"projen-gitlab-parallel\"></a>\n\n\nUsed to run a job multiple times in parallel in a single pipeline.\n\n\n\nName | Type | Description \n-----|------|-------------\n**matrix**🔹 | <code>Array<Map<string, Array<any>>></code> | Defines different variables for jobs that are running in parallel.\n\n\n\n## struct Release 🔹 <a id=\"projen-gitlab-release\"></a>\n\n\nIndicates that the job creates a Release.\n\n\n\nName | Type | Description \n-----|------|-------------\n**description**🔹 | <code>string</code> | Specifies the longer description of the Release.\n**tagName**🔹 | <code>string</code> | The tag_name must be specified.\n**assets**?🔹 | <code>[gitlab.Assets](#projen-gitlab-assets)</code> | __*Optional*__\n**milestones**?🔹 | <code>Array<string></code> | The title of each milestone the release is associated with.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | The Release name.<br/>__*Optional*__\n**ref**?🔹 | <code>string</code> | If the release: tag_name doesn’t exist yet, the release is created from ref.<br/>__*Optional*__\n**releasedAt**?🔹 | <code>string</code> | The date and time when the release is ready.<br/>__*Optional*__\n\n\n\n## struct Reports 🔹 <a id=\"projen-gitlab-reports\"></a>\n\n\nReports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in Merge Requests.\n\n\n\nName | Type | Description \n-----|------|-------------\n**cobertura**?🔹 | <code>Array<string></code> | Path for file(s) that should be parsed as Cobertura XML coverage report.<br/>__*Optional*__\n**codequality**?🔹 | <code>Array<string></code> | Path to file or list of files with code quality report(s) (such as Code Climate).<br/>__*Optional*__\n**containerScanning**?🔹 | <code>Array<string></code> | Path to file or list of files with Container scanning vulnerabilities report(s).<br/>__*Optional*__\n**dast**?🔹 | <code>Array<string></code> | Path to file or list of files with DAST vulnerabilities report(s).<br/>__*Optional*__\n**dependencyScanning**?🔹 | <code>Array<string></code> | Path to file or list of files with Dependency scanning vulnerabilities report(s).<br/>__*Optional*__\n**dotenv**?🔹 | <code>Array<string></code> | Path to file or list of files containing runtime-created variables for this job.<br/>__*Optional*__\n**junit**?🔹 | <code>Array<string></code> | Path for file(s) that should be parsed as JUnit XML result.<br/>__*Optional*__\n**licenseManagement**?🔹 | <code>Array<string></code> | Deprecated in 12.8: Path to file or list of files with license report(s).<br/>__*Optional*__\n**licenseScanning**?🔹 | <code>Array<string></code> | Path to file or list of files with license report(s).<br/>__*Optional*__\n**lsif**?🔹 | <code>Array<string></code> | Path to file or list of files containing code intelligence (Language Server Index Format).<br/>__*Optional*__\n**metrics**?🔹 | <code>Array<string></code> | Path to file or list of files with custom metrics report(s).<br/>__*Optional*__\n**performance**?🔹 | <code>Array<string></code> | Path to file or list of files with performance metrics report(s).<br/>__*Optional*__\n**requirements**?🔹 | <code>Array<string></code> | Path to file or list of files with requirements report(s).<br/>__*Optional*__\n**sast**?🔹 | <code>Array<string></code> | Path to file or list of files with SAST vulnerabilities report(s).<br/>__*Optional*__\n**secretDetection**?🔹 | <code>Array<string></code> | Path to file or list of files with secret detection report(s).<br/>__*Optional*__\n**terraform**?🔹 | <code>Array<string></code> | Path to file or list of files with terraform plan(s).<br/>__*Optional*__\n\n\n\n## struct Retry 🔹 <a id=\"projen-gitlab-retry\"></a>\n\n\nHow many times a job is retried if it fails.\n\nIf not defined, defaults to 0 and jobs do not retry.\n\n\n\nName | Type | Description \n-----|------|-------------\n**max**?🔹 | <code>number</code> | 0 (default), 1, or 2.<br/>__*Optional*__\n**when**?🔹 | <code>any</code> | Either a single or array of error types to trigger job retry.<br/>__*Optional*__\n\n\n\n## struct Secret 🔹 <a id=\"projen-gitlab-secret\"></a>\n\n\nA CI/CD secret.\n\n\n\nName | Type | Description \n-----|------|-------------\n**vault**🔹 | <code>[gitlab.VaultConfig](#projen-gitlab-vaultconfig)</code> | <span></span>\n\n\n\n## struct Service 🔹 <a id=\"projen-gitlab-service\"></a>\n\n\nUsed to specify an additional Docker image to run scripts in.\n\nThe service image is linked to the image specified in the @Default image keyword.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | Full name of the image that should be used.\n**alias**?🔹 | <code>string</code> | Additional alias that can be used to access the service from the job's container.<br/>__*Optional*__\n**command**?🔹 | <code>Array<string></code> | Command or script that should be used as the container's command.<br/>__*Optional*__\n**entrypoint**?🔹 | <code>Array<string></code> | Command or script that should be executed as the container's entrypoint.<br/>__*Optional*__\n\n\n\n## struct Trigger 🔹 <a id=\"projen-gitlab-trigger\"></a>\n\n\nTrigger a multi-project or a child pipeline.\n\nRead more:\n\n\n\nName | Type | Description \n-----|------|-------------\n**branch**?🔹 | <code>string</code> | The branch name that a downstream pipeline will use.<br/>__*Optional*__\n**include**?🔹 | <code>Array<[gitlab.TriggerInclude](#projen-gitlab-triggerinclude)></code> | A list of local files or artifacts from other jobs to define the pipeline.<br/>__*Optional*__\n**project**?🔹 | <code>string</code> | Path to the project, e.g. `group/project`, or `group/sub-group/project`.<br/>__*Optional*__\n**strategy**?🔹 | <code>[gitlab.Strategy](#projen-gitlab-strategy)</code> | You can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend.<br/>__*Optional*__\n\n\n\n## struct TriggerInclude 🔹 <a id=\"projen-gitlab-triggerinclude\"></a>\n\n\nReferences a local file or an artifact from another job to define the pipeline configuration.\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifact**?🔹 | <code>string</code> | Relative path to the generated YAML file which is extracted from the artifacts and used as the configuration for triggering the child pipeline.<br/>__*Optional*__\n**file**?🔹 | <code>string</code> | Relative path from repository root (`/`) to the pipeline configuration YAML file.<br/>__*Optional*__\n**job**?🔹 | <code>string</code> | Job name which generates the artifact.<br/>__*Optional*__\n**local**?🔹 | <code>string</code> | Relative path from local repository root (`/`) to the local YAML file to define the pipeline configuration.<br/>__*Optional*__\n**project**?🔹 | <code>string</code> | Path to another private project under the same GitLab instance, like `group/project` or `group/sub-group/project`.<br/>__*Optional*__\n**ref**?🔹 | <code>string</code> | Branch/Tag/Commit hash for the target project.<br/>__*Optional*__\n**template**?🔹 | <code>string</code> | Name of the template YAML file to use in the pipeline configuration.<br/>__*Optional*__\n\n\n\n## struct VariableConfig 🔹 <a id=\"projen-gitlab-variableconfig\"></a>\n\n\nExplains what the global variable is used for, what the acceptable values are.\n\n\n\nName | Type | Description \n-----|------|-------------\n**description**?🔹 | <code>string</code> | Define a global variable that is prefilled when running a pipeline manually.<br/>__*Optional*__\n**value**?🔹 | <code>string</code> | The variable value.<br/>__*Optional*__\n\n\n\n## struct VaultConfig 🔹 <a id=\"projen-gitlab-vaultconfig\"></a>\n\n\nSpecification for a secret provided by a HashiCorp Vault.\n\n\n\nName | Type | Description \n-----|------|-------------\n**engine**🔹 | <code>[gitlab.Engine](#projen-gitlab-engine)</code> | <span></span>\n**field**🔹 | <code>string</code> | <span></span>\n**path**🔹 | <code>string</code> | Path to the secret.\n\n\n\n## struct Workflow 🔹 <a id=\"projen-gitlab-workflow\"></a>\n\n\nUsed to control pipeline behavior.\n\n\n\nName | Type | Description \n-----|------|-------------\n**rules**?🔹 | <code>Array<[gitlab.WorkflowRule](#projen-gitlab-workflowrule)></code> | Used to control whether or not a whole pipeline is created.<br/>__*Optional*__\n\n\n\n## struct WorkflowRule 🔹 <a id=\"projen-gitlab-workflowrule\"></a>\n\n\nUsed to control whether or not a whole pipeline is created.\n\n\n\nName | Type | Description \n-----|------|-------------\n**changes**?🔹 | <code>Array<string></code> | __*Optional*__\n**exists**?🔹 | <code>Array<string></code> | __*Optional*__\n**if**?🔹 | <code>string</code> | __*Optional*__\n**variables**?🔹 | <code>Map<string, string &#124; number></code> | __*Optional*__\n**when**?🔹 | <code>[gitlab.JobWhen](#projen-gitlab-jobwhen)</code> | __*Optional*__\n\n\n\n## struct JavaProjectCommonOptions 🔹 <a id=\"projen-java-javaprojectcommonoptions\"></a>\n\n\nOptions for `JavaProject`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactId**🔹 | <code>string</code> | The artifactId is generally the name that the project is known by.\n**groupId**🔹 | <code>string</code> | This is generally unique amongst an organization or a project.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**version**🔹 | <code>string</code> | This is the last piece of the naming puzzle.\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compileOptions**?🔹 | <code>[java.MavenCompileOptions](#projen-java-mavencompileoptions)</code> | Compile options.<br/>__*Default*__: defaults\n**deps**?🔹 | <code>Array<string></code> | List of runtime dependencies for this project.<br/>__*Default*__: []\n**description**?🔹 | <code>string</code> | Description of a project is always good.<br/>__*Default*__: undefined\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**distdir**?🔹 | <code>string</code> | Final artifact output directory.<br/>__*Default*__: \"dist/java\"\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**junit**?🔹 | <code>boolean</code> | Include junit tests.<br/>__*Default*__: true\n**junitOptions**?🔹 | <code>[java.JunitOptions](#projen-java-junitoptions)</code> | junit options.<br/>__*Default*__: defaults\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**packaging**?🔹 | <code>string</code> | Project packaging format.<br/>__*Default*__: \"jar\"\n**packagingOptions**?🔹 | <code>[java.MavenPackagingOptions](#projen-java-mavenpackagingoptions)</code> | Packaging options.<br/>__*Default*__: defaults\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenrcJava**?🔹 | <code>boolean</code> | Use projenrc in java.<br/>__*Default*__: true\n**projenrcJavaOptions**?🔹 | <code>[java.ProjenrcOptions](#projen-java-projenrcoptions)</code> | Options related to projenrc in java.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testDeps**?🔹 | <code>Array<string></code> | List of test dependencies for this project.<br/>__*Default*__: []\n**url**?🔹 | <code>string</code> | The URL, like the name, is not required.<br/>__*Default*__: undefined\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n\n\n\n## struct JavaProjectOptions 🔹 <a id=\"projen-java-javaprojectoptions\"></a>\n\n\nOptions for `JavaProject`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactId**🔹 | <code>string</code> | The artifactId is generally the name that the project is known by.\n**groupId**🔹 | <code>string</code> | This is generally unique amongst an organization or a project.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**version**🔹 | <code>string</code> | This is the last piece of the naming puzzle.\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**compileOptions**?🔹 | <code>[java.MavenCompileOptions](#projen-java-mavencompileoptions)</code> | Compile options.<br/>__*Default*__: defaults\n**deps**?🔹 | <code>Array<string></code> | List of runtime dependencies for this project.<br/>__*Default*__: []\n**description**?🔹 | <code>string</code> | Description of a project is always good.<br/>__*Default*__: undefined\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**distdir**?🔹 | <code>string</code> | Final artifact output directory.<br/>__*Default*__: \"dist/java\"\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**junit**?🔹 | <code>boolean</code> | Include junit tests.<br/>__*Default*__: true\n**junitOptions**?🔹 | <code>[java.JunitOptions](#projen-java-junitoptions)</code> | junit options.<br/>__*Default*__: defaults\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**packaging**?🔹 | <code>string</code> | Project packaging format.<br/>__*Default*__: \"jar\"\n**packagingOptions**?🔹 | <code>[java.MavenPackagingOptions](#projen-java-mavenpackagingoptions)</code> | Packaging options.<br/>__*Default*__: defaults\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenrcJava**?🔹 | <code>boolean</code> | Use projenrc in java.<br/>__*Default*__: true\n**projenrcJavaOptions**?🔹 | <code>[java.ProjenrcOptions](#projen-java-projenrcoptions)</code> | Options related to projenrc in java.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**sample**?🔹 | <code>boolean</code> | Include sample code and test if the relevant directories don't exist.<br/>__*Default*__: true\n**sampleJavaPackage**?🔹 | <code>string</code> | The java package to use for the code sample.<br/>__*Default*__: \"org.acme\"\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testDeps**?🔹 | <code>Array<string></code> | List of test dependencies for this project.<br/>__*Default*__: []\n**url**?🔹 | <code>string</code> | The URL, like the name, is not required.<br/>__*Default*__: undefined\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n\n\n\n## struct JunitOptions 🔹 <a id=\"projen-java-junitoptions\"></a>\n\n\nOptions for `Junit`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**pom**🔹 | <code>[java.Pom](#projen-java-pom)</code> | Java pom.\n**sampleJavaPackage**?🔹 | <code>string</code> | Java package for test sample.<br/>__*Default*__: \"org.acme\"\n**version**?🔹 | <code>string</code> | Junit version.<br/>__*Default*__: \"5.7.0\"\n\n\n\n## struct MavenCompileOptions 🔹 <a id=\"projen-java-mavencompileoptions\"></a>\n\n\nOptions for `MavenCompile`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**source**?🔹 | <code>string</code> | Source language version.<br/>__*Default*__: \"1.8\"\n**target**?🔹 | <code>string</code> | Target JVM version.<br/>__*Default*__: \"1.8\"\n\n\n\n## struct MavenPackagingOptions 🔹 <a id=\"projen-java-mavenpackagingoptions\"></a>\n\n\nOptions for `MavenPackage`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**distdir**?🔹 | <code>string</code> | Where to place the package output?<br/>__*Default*__: \"dist/java\"\n**javadocs**?🔹 | <code>boolean</code> | Include javadocs jar in package.<br/>__*Default*__: true\n**javadocsExclude**?🔹 | <code>Array<string></code> | Exclude source files from docs.<br/>__*Default*__: []\n**sources**?🔹 | <code>boolean</code> | Include sources jar in package.<br/>__*Default*__: true\n\n\n\n## struct MavenRepository 🔹 <a id=\"projen-java-mavenrepository\"></a>\n\n\nRepresents a Maven repository.\n\n\n\nName | Type | Description \n-----|------|-------------\n**id**🔹 | <code>string</code> | The identifier for the repository.\n**url**🔹 | <code>string</code> | The url of the repository.\n**layout**?🔹 | <code>string</code> | The layout of the repository.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | The name of the repository.<br/>__*Optional*__\n\n\n\n## struct MavenSampleOptions 🔹 <a id=\"projen-java-mavensampleoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**package**🔹 | <code>string</code> | Project root java package.\n\n\n\n## struct PluginExecution 🔹 <a id=\"projen-java-pluginexecution\"></a>\n\n\nPlugin execution definition.\n\n\n\nName | Type | Description \n-----|------|-------------\n**goals**🔹 | <code>Array<string></code> | Which Maven goals this plugin should be associated with.\n**id**🔹 | <code>string</code> | The ID.\n**phase**?🔹 | <code>string</code> | The phase in which the plugin should execute.<br/>__*Optional*__\n\n\n\n## struct PluginOptions 🔹 <a id=\"projen-java-pluginoptions\"></a>\n\n\nOptions for Maven plugins.\n\n\n\nName | Type | Description \n-----|------|-------------\n**configuration**?🔹 | <code>Map<string, any></code> | Plugin key/value configuration.<br/>__*Default*__: {}\n**dependencies**?🔹 | <code>Array<string></code> | You could configure the dependencies for the plugin.<br/>__*Default*__: []\n**executions**?🔹 | <code>Array<[java.PluginExecution](#projen-java-pluginexecution)></code> | Plugin executions.<br/>__*Default*__: []\n\n\n\n## struct PomOptions 🔹 <a id=\"projen-java-pomoptions\"></a>\n\n\nOptions for `Pom`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactId**🔹 | <code>string</code> | The artifactId is generally the name that the project is known by.\n**groupId**🔹 | <code>string</code> | This is generally unique amongst an organization or a project.\n**version**🔹 | <code>string</code> | This is the last piece of the naming puzzle.\n**description**?🔹 | <code>string</code> | Description of a project is always good.<br/>__*Default*__: undefined\n**packaging**?🔹 | <code>string</code> | Project packaging format.<br/>__*Default*__: \"jar\"\n**url**?🔹 | <code>string</code> | The URL, like the name, is not required.<br/>__*Default*__: undefined\n\n\n\n## struct ProjenrcOptions 🔹 <a id=\"projen-java-projenrcoptions\"></a>\n\n\nOptions for `Projenrc`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**className**?🔹 | <code>string</code> | The name of the Java class which contains the `main()` method for projen.<br/>__*Default*__: \"projenrc\"\n**projenVersion**?🔹 | <code>string</code> | The projen version to use.<br/>__*Default*__: current version\n**testScope**?🔹 | <code>boolean</code> | Defines projenrc under the test scope instead of the main scope, which is reserved to the app.<br/>__*Default*__: true\n\n\n\n## struct AddBundleOptions 🔹 <a id=\"projen-javascript-addbundleoptions\"></a>\n\n\nOptions for `addBundle()`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**platform**🔹 | <code>string</code> | esbuild platform.\n**target**🔹 | <code>string</code> | esbuild target.\n**executable**?🔹 | <code>boolean</code> | Mark the output file as executable.<br/>__*Default*__: false\n**externals**?🔹 | <code>Array<string></code> | You can mark a file or a package as external to exclude it from your build.<br/>__*Default*__: []\n**outfile**?🔹 | <code>string</code> | Bundler output path relative to the asset's output directory.<br/>__*Default*__: \"index.js\"\n**sourcemap**?🔹 | <code>boolean</code> | Include a source map in the bundle.<br/>__*Default*__: false\n**watchTask**?🔹 | <code>boolean</code> | In addition to the `bundle:xyz` task, creates `bundle:xyz:watch` task which will invoke the same esbuild command with the `--watch` flag.<br/>__*Default*__: true\n\n\n\n## struct Bundle 🔹 <a id=\"projen-javascript-bundle\"></a>\n\n__Obtainable from__: [Bundler](#projen-javascript-bundler).[addBundle](#projen-javascript-bundler#projen-javascript-bundler-addbundle)()\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**bundleTask**🔹 | <code>[Task](#projen-task)</code> | The task that produces this bundle.\n**outdir**🔹 | <code>string</code> | Base directory containing the output file (relative to project root).\n**outfile**🔹 | <code>string</code> | Location of the output file (relative to project root).\n**watchTask**?🔹 | <code>[Task](#projen-task)</code> | The \"watch\" task for this bundle.<br/>__*Optional*__\n\n\n\n## struct BundlerOptions 🔹 <a id=\"projen-javascript-bundleroptions\"></a>\n\n\nOptions for `Bundler`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**addToPreCompile**?🔹 | <code>boolean</code> | Install the `bundle` command as a pre-compile phase.<br/>__*Default*__: true\n**assetsDir**?🔹 | <code>string</code> | Output directory for all bundles.<br/>__*Default*__: \"assets\"\n**esbuildVersion**?🔹 | <code>string</code> | The semantic version requirement for `esbuild`.<br/>__*Default*__: no specific version (implies latest)\n\n\n\n## struct BundlingOptions 🔹 <a id=\"projen-javascript-bundlingoptions\"></a>\n\n\nOptions for bundling.\n\n\n\nName | Type | Description \n-----|------|-------------\n**externals**?🔹 | <code>Array<string></code> | You can mark a file or a package as external to exclude it from your build.<br/>__*Default*__: []\n**sourcemap**?🔹 | <code>boolean</code> | Include a source map in the bundle.<br/>__*Default*__: false\n**watchTask**?🔹 | <code>boolean</code> | In addition to the `bundle:xyz` task, creates `bundle:xyz:watch` task which will invoke the same esbuild command with the `--watch` flag.<br/>__*Default*__: true\n\n\n\n## struct CodeArtifactOptions 🔹 <a id=\"projen-javascript-codeartifactoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**accessKeyIdSecret**?🔹 | <code>string</code> | GitHub secret which contains the AWS access key ID to use when publishing packages to AWS CodeArtifact.<br/>__*Default*__: \"AWS_ACCESS_KEY_ID\"\n**roleToAssume**?🔹 | <code>string</code> | ARN of AWS role to be assumed prior to get authorization token from AWS CodeArtifact This property must be specified only when publishing to AWS CodeArtifact (`registry` contains AWS CodeArtifact URL).<br/>__*Default*__: undefined\n**secretAccessKeySecret**?🔹 | <code>string</code> | GitHub secret which contains the AWS secret access key to use when publishing packages to AWS CodeArtifact.<br/>__*Default*__: \"AWS_SECRET_ACCESS_KEY\"\n\n\n\n## struct CoverageThreshold 🔹 <a id=\"projen-javascript-coveragethreshold\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**branches**?🔹 | <code>number</code> | __*Optional*__\n**functions**?🔹 | <code>number</code> | __*Optional*__\n**lines**?🔹 | <code>number</code> | __*Optional*__\n**statements**?🔹 | <code>number</code> | __*Optional*__\n\n\n\n## struct EslintOptions 🔹 <a id=\"projen-javascript-eslintoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**dirs**🔹 | <code>Array<string></code> | Directories with source files to lint (e.g. [ \"src\" ]).\n**aliasExtensions**?🔹 | <code>Array<string></code> | Enable import alias for module paths.<br/>__*Default*__: undefined\n**aliasMap**?🔹 | <code>Map<string, string></code> | Enable import alias for module paths.<br/>__*Default*__: undefined\n**devdirs**?🔹 | <code>Array<string></code> | Directories with source files that include tests and build tools.<br/>__*Default*__: []\n**fileExtensions**?🔹 | <code>Array<string></code> | File types that should be linted (e.g. [ \".js\", \".ts\" ]).<br/>__*Default*__: [\".ts\"]\n**ignorePatterns**?🔹 | <code>Array<string></code> | List of file patterns that should not be linted, using the same syntax as .gitignore patterns.<br/>__*Default*__: [ '*.js', '*.d.ts', 'node_modules/', '*.generated.ts', 'coverage' ]\n**lintProjenRc**?⚠️ | <code>boolean</code> | Should we lint .projenrc.js.<br/>__*Default*__: true\n**lintProjenRcFile**?🔹 | <code>string</code> | Projenrc file to lint.<br/>__*Default*__: PROJEN_RC\n**prettier**?🔹 | <code>boolean</code> | Enable prettier for code formatting.<br/>__*Default*__: false\n**tsAlwaysTryTypes**?🔹 | <code>boolean</code> | Always try to resolve types under `<root>@types` directory even it doesn't contain any source code.<br/>__*Default*__: true\n**tsconfigPath**?🔹 | <code>string</code> | Path to `tsconfig.json` which should be used by eslint.<br/>__*Default*__: \"./tsconfig.json\"\n**yaml**?🔹 | <code>boolean</code> | Write eslint configuration as YAML instead of JSON.<br/>__*Default*__: false\n\n\n\n## struct EslintOverride 🔹 <a id=\"projen-javascript-eslintoverride\"></a>\n\n\neslint rules override.\n\n\n\nName | Type | Description \n-----|------|-------------\n**files**🔹 | <code>Array<string></code> | Files or file patterns on which to apply the override.\n**parser**?🔹 | <code>string</code> | The overridden parser.<br/>__*Optional*__\n**rules**?🔹 | <code>Map<string, any></code> | The overriden rules.<br/>__*Optional*__\n\n\n\n## struct HasteConfig 🔹 <a id=\"projen-javascript-hasteconfig\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**computeSha1**?🔹 | <code>boolean</code> | __*Optional*__\n**defaultPlatform**?🔹 | <code>string</code> | __*Optional*__\n**hasteImplModulePath**?🔹 | <code>string</code> | __*Optional*__\n**platforms**?🔹 | <code>Array<string></code> | __*Optional*__\n**throwOnModuleCollision**?🔹 | <code>boolean</code> | __*Optional*__\n\n\n\n## struct JestConfigOptions 🔹 <a id=\"projen-javascript-jestconfigoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**automock**?🔹 | <code>boolean</code> | This option tells Jest that all imported modules in your tests should be mocked automatically.<br/>__*Default*__: false\n**bail**?🔹 | <code>number &#124; boolean</code> | By default, Jest runs all tests and produces all errors into the console upon completion.<br/>__*Default*__: 0\n**cacheDirectory**?🔹 | <code>string</code> | The directory where Jest should store its cached dependency information.<br/>__*Default*__: \"/tmp/<path>\"\n**clearMocks**?🔹 | <code>boolean</code> | Automatically clear mock calls and instances before every test.<br/>__*Default*__: true\n**collectCoverage**?🔹 | <code>boolean</code> | Indicates whether the coverage information should be collected while executing the test.<br/>__*Default*__: true\n**collectCoverageFrom**?🔹 | <code>Array<string></code> | An array of glob patterns indicating a set of files for which coverage information should be collected.<br/>__*Default*__: undefined\n**coverageDirectory**?🔹 | <code>string</code> | The directory where Jest should output its coverage files.<br/>__*Default*__: \"coverage\"\n**coveragePathIgnorePatterns**?🔹 | <code>Array<string></code> | An array of regexp pattern strings that are matched against all file paths before executing the test.<br/>__*Default*__: \"/node_modules/\"\n**coverageProvider**?🔹 | <code>string</code> | Indicates which provider should be used to instrument code for coverage.<br/>__*Default*__: \"babel\"\n**coverageReporters**?🔹 | <code>Array<string></code> | A list of reporter names that Jest uses when writing coverage reports.<br/>__*Default*__: [\"json\", \"lcov\", \"text\", \"clover\", \"cobertura\"]\n**coverageThreshold**?🔹 | <code>[javascript.CoverageThreshold](#projen-javascript-coveragethreshold)</code> | Specify the global coverage thresholds.<br/>__*Default*__: undefined\n**dependencyExtractor**?🔹 | <code>string</code> | This option allows the use of a custom dependency extractor.<br/>__*Default*__: undefined\n**displayName**?🔹 | <code>any</code> | Allows for a label to be printed alongside a test while it is running.<br/>__*Default*__: undefined\n**errorOnDeprecated**?🔹 | <code>boolean</code> | Make calling deprecated APIs throw helpful error messages.<br/>__*Default*__: false\n**extraGlobals**?🔹 | <code>Array<string></code> | Test files run inside a vm, which slows calls to global context properties (e.g. Math). With this option you can specify extra properties to be defined inside the vm for faster lookups.<br/>__*Default*__: undefined\n**forceCoverageMatch**?🔹 | <code>Array<string></code> | Test files are normally ignored from collecting code coverage.<br/>__*Default*__: ['']\n**globalSetup**?🔹 | <code>string</code> | This option allows the use of a custom global setup module which exports an async function that is triggered once before all test suites.<br/>__*Default*__: undefined\n**globalTeardown**?🔹 | <code>string</code> | This option allows the use of a custom global teardown module which exports an async function that is triggered once after all test suites.<br/>__*Default*__: undefined\n**globals**?🔹 | <code>any</code> | A set of global variables that need to be available in all test environments.<br/>__*Default*__: {}\n**haste**?🔹 | <code>[javascript.HasteConfig](#projen-javascript-hasteconfig)</code> | This will be used to configure the behavior of jest-haste-map, Jest's internal file crawler/cache system.<br/>__*Default*__: {}\n**injectGlobals**?🔹 | <code>boolean</code> | Insert Jest's globals (expect, test, describe, beforeEach etc.) into the global environment. If you set this to false, you should import from @jest/globals.<br/>__*Default*__: true\n**maxConcurrency**?🔹 | <code>number</code> | A number limiting the number of tests that are allowed to run at the same time when using test.concurrent. Any test above this limit will be queued and executed once a slot is released.<br/>__*Default*__: 5\n**maxWorkers**?🔹 | <code>string &#124; number</code> | Specifies the maximum number of workers the worker-pool will spawn for running tests.<br/>__*Default*__: the number of the cores available on your machine minus one for the main thread\n**moduleDirectories**?🔹 | <code>Array<string></code> | An array of directory names to be searched recursively up from the requiring module's location.<br/>__*Default*__: [\"node_modules\"]\n**moduleFileExtensions**?🔹 | <code>Array<string></code> | An array of file extensions your modules use.<br/>__*Default*__: [\"js\", \"json\", \"jsx\", \"ts\", \"tsx\", \"node\"]\n**moduleNameMapper**?🔹 | <code>Map<string, string &#124; Array<string>></code> | A map from regular expressions to module names or to arrays of module names that allow to stub out resources, like images or styles with a single module.<br/>__*Default*__: null\n**modulePathIgnorePatterns**?🔹 | <code>Array<string></code> | An array of regexp pattern strings that are matched against all module paths before those paths are to be considered 'visible' to the module loader.<br/>__*Default*__: []\n**modulePaths**?🔹 | <code>Array<string></code> | An alternative API to setting the NODE_PATH env variable, modulePaths is an array of absolute paths to additional locations to search when resolving modules.<br/>__*Default*__: []\n**notify**?🔹 | <code>boolean</code> | Activates notifications for test results.<br/>__*Default*__: false\n**notifyMode**?🔹 | <code>string</code> | Specifies notification mode.<br/>__*Default*__: failure-change\n**preset**?🔹 | <code>string</code> | A preset that is used as a base for Jest's configuration.<br/>__*Default*__: undefined\n**prettierPath**?🔹 | <code>string</code> | Sets the path to the prettier node module used to update inline snapshots.<br/>__*Default*__: \"prettier\"\n**projects**?🔹 | <code>Array<string &#124; Map<string, any>></code> | When the projects configuration is provided with an array of paths or glob patterns, Jest will run tests in all of the specified projects at the same time.<br/>__*Default*__: undefined\n**reporters**?🔹 | <code>Array<string &#124; json></code> | Use this configuration option to add custom reporters to Jest.<br/>__*Default*__: undefined\n**resetMocks**?🔹 | <code>boolean</code> | Automatically reset mock state before every test.<br/>__*Default*__: false\n**resetModules**?🔹 | <code>boolean</code> | By default, each test file gets its own independent module registry.<br/>__*Default*__: false\n**resolver**?🔹 | <code>string</code> | This option allows the use of a custom resolver.<br/>__*Default*__: undefined\n**restoreMocks**?🔹 | <code>boolean</code> | Automatically restore mock state before every test.<br/>__*Default*__: false\n**rootDir**?🔹 | <code>string</code> | The root directory that Jest should scan for tests and modules within.<br/>__*Default*__: directory of the package.json\n**roots**?🔹 | <code>Array<string></code> | A list of paths to directories that Jest should use to search for files in.<br/>__*Default*__: [\"<rootDir>\"]\n**runner**?🔹 | <code>string</code> | This option allows you to use a custom runner instead of Jest's default test runner.<br/>__*Default*__: \"jest-runner\"\n**setupFiles**?🔹 | <code>Array<string></code> | A list of paths to modules that run some code to configure or set up the testing environment.<br/>__*Default*__: []\n**setupFilesAfterEnv**?🔹 | <code>Array<string></code> | A list of paths to modules that run some code to configure or set up the testing framework before each test file in the suite is executed.<br/>__*Default*__: []\n**slowTestThreshold**?🔹 | <code>number</code> | The number of seconds after which a test is considered as slow and reported as such in the results.<br/>__*Default*__: 5\n**snapshotResolver**?🔹 | <code>string</code> | The path to a module that can resolve test<->snapshot path.<br/>__*Default*__: undefined\n**snapshotSerializers**?🔹 | <code>Array<string></code> | A list of paths to snapshot serializer modules Jest should use for snapshot testing.<br/>__*Default*__: = []\n**testEnvironment**?🔹 | <code>string</code> | The test environment that will be used for testing.<br/>__*Default*__: \"jsdom\"\n**testEnvironmentOptions**?🔹 | <code>any</code> | Test environment options that will be passed to the testEnvironment.<br/>__*Default*__: {}\n**testFailureExitCode**?🔹 | <code>number</code> | The exit code Jest returns on test failure.<br/>__*Default*__: 1\n**testMatch**?🔹 | <code>Array<string></code> | The glob patterns Jest uses to detect test files.<br/>__*Default*__: ['**\\/__tests__/**\\/*.[jt]s?(x)', '**\\/?(*.)+(spec|test).[tj]s?(x)']\n**testPathIgnorePatterns**?🔹 | <code>Array<string></code> | An array of regexp pattern strings that are matched against all test paths before executing the test.<br/>__*Default*__: [\"/node_modules/\"]\n**testRegex**?🔹 | <code>string &#124; Array<string></code> | The pattern or patterns Jest uses to detect test files.<br/>__*Default*__: (/__tests__/.*|(\\\\.|/)(test|spec))\\\\.[jt]sx?$\n**testResultsProcessor**?🔹 | <code>string</code> | This option allows the use of a custom results processor.<br/>__*Default*__: undefined\n**testRunner**?🔹 | <code>string</code> | This option allows the use of a custom test runner.<br/>__*Default*__: \"jasmine2\"\n**testSequencer**?🔹 | <code>string</code> | This option allows you to use a custom sequencer instead of Jest's default.<br/>__*Default*__: \"\n**testTimeout**?🔹 | <code>number</code> | Default timeout of a test in milliseconds.<br/>__*Default*__: 5000\n**testURL**?🔹 | <code>string</code> | This option sets the URL for the jsdom environment.<br/>__*Default*__: \"http://localhost\"\n**timers**?🔹 | <code>string</code> | Setting this value to legacy or fake allows the use of fake timers for functions such as setTimeout.<br/>__*Default*__: \"real\"\n**transform**?🔹 | <code>Map<string, string &#124; json></code> | A map from regular expressions to paths to transformers.<br/>__*Default*__: {\"\\\\.[jt]sx?$\": \"babel-jest\"}\n**transformIgnorePatterns**?🔹 | <code>Array<string></code> | An array of regexp pattern strings that are matched against all source file paths before transformation.<br/>__*Default*__: [\"/node_modules/\", \"\\\\.pnp\\\\.[^\\\\\\/]+$\"]\n**unmockedModulePathPatterns**?🔹 | <code>Array<string></code> | An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them.<br/>__*Default*__: []\n**verbose**?🔹 | <code>boolean</code> | Indicates whether each individual test should be reported during the run.<br/>__*Default*__: false\n**watchPathIgnorePatterns**?🔹 | <code>Array<string></code> | An array of RegExp patterns that are matched against all source file paths before re-running tests in watch mode.<br/>__*Default*__: []\n**watchPlugins**?🔹 | <code>json</code> | __*Default*__: -\n**watchman**?🔹 | <code>boolean</code> | Whether to use watchman for file crawling.<br/>__*Default*__: true\n\n\n\n## struct JestOptions 🔹 <a id=\"projen-javascript-jestoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**configFilePath**?🔹 | <code>string</code> | Path to JSON config file for Jest.<br/>__*Default*__: No separate config file, jest settings are stored in package.json\n**coverage**?⚠️ | <code>boolean</code> | Collect coverage.<br/>__*Default*__: true\n**coverageText**?🔹 | <code>boolean</code> | Include the `text` coverage reporter, which means that coverage summary is printed at the end of the jest execution.<br/>__*Default*__: true\n**extraCliOptions**?🔹 | <code>Array<string></code> | Additional options to pass to the Jest CLI invocation.<br/>__*Default*__: no extra options\n**ignorePatterns**?⚠️ | <code>Array<string></code> | Defines `testPathIgnorePatterns` and `coveragePathIgnorePatterns`.<br/>__*Default*__: [\"/node_modules/\"]\n**jestConfig**?🔹 | <code>[javascript.JestConfigOptions](#projen-javascript-jestconfigoptions)</code> | Jest configuration.<br/>__*Default*__: default jest configuration\n**jestVersion**?🔹 | <code>string</code> | The version of jest to use.<br/>__*Default*__: installs the latest jest version\n**junitReporting**?🔹 | <code>boolean</code> | Result processing with jest-junit.<br/>__*Default*__: true\n**preserveDefaultReporters**?🔹 | <code>boolean</code> | Preserve the default Jest reporter when additional reporters are added.<br/>__*Default*__: true\n\n\n\n## struct NodePackageOptions 🔹 <a id=\"projen-javascript-nodepackageoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n\n\n\n## struct NodeProjectOptions 🔹 <a id=\"projen-javascript-nodeprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct NpmConfigOptions 🔹 <a id=\"projen-javascript-npmconfigoptions\"></a>\n\n\nOptions to configure the local NPM config.\n\n\n\nName | Type | Description \n-----|------|-------------\n**registry**?🔹 | <code>string</code> | URL of the registry mirror to use.<br/>__*Default*__: use npmjs default registry\n\n\n\n## struct PeerDependencyOptions 🔹 <a id=\"projen-javascript-peerdependencyoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**pinnedDevDependency**?🔹 | <code>boolean</code> | Automatically add a pinned dev dependency.<br/>__*Default*__: true\n\n\n\n## struct PrettierOptions 🔹 <a id=\"projen-javascript-prettieroptions\"></a>\n\n\nOptions for Prettier.\n\n\n\nName | Type | Description \n-----|------|-------------\n**ignoreFile**?🔹 | <code>boolean</code> | Defines an .prettierIgnore file.<br/>__*Default*__: true\n**overrides**?🔹 | <code>Array<[javascript.PrettierOverride](#projen-javascript-prettieroverride)></code> | Provide a list of patterns to override prettier configuration.<br/>__*Default*__: []\n**settings**?🔹 | <code>[javascript.PrettierSettings](#projen-javascript-prettiersettings)</code> | Prettier settings.<br/>__*Default*__: default settings\n\n\n\n## struct PrettierOverride 🔹 <a id=\"projen-javascript-prettieroverride\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**files**🔹 | <code>string &#124; Array<string></code> | Include these files in this override.\n**settings**🔹 | <code>[javascript.PrettierSettings](#projen-javascript-prettiersettings)</code> | The options to apply for this override.\n**excludeFiles**?🔹 | <code>string &#124; Array<string></code> | Exclude these files from this override.<br/>__*Optional*__\n\n\n\n## struct PrettierSettings 🔹 <a id=\"projen-javascript-prettiersettings\"></a>\n\n\nOptions to set in Prettier directly or through overrides.\n\n\n\nName | Type | Description \n-----|------|-------------\n**arrowParens**?🔹 | <code>[javascript.ArrowParens](#projen-javascript-arrowparens)</code> | Include parentheses around a sole arrow function parameter.<br/>__*Default*__: ArrowParens.ALWAYS\n**bracketSameLine**?🔹 | <code>boolean</code> | Put > of opening tags on the last line instead of on a new line.<br/>__*Default*__: false\n**bracketSpacing**?🔹 | <code>boolean</code> | Print spaces between brackets.<br/>__*Default*__: true\n**cursorOffset**?🔹 | <code>number</code> | Print (to stderr) where a cursor at the given position would move to after formatting.<br/>__*Default*__: -1\n**embeddedLanguageFormatting**?🔹 | <code>[javascript.EmbeddedLanguageFormatting](#projen-javascript-embeddedlanguageformatting)</code> | Control how Prettier formats quoted code embedded in the file.<br/>__*Default*__: EmbeddedLanguageFormatting.AUTO\n**endOfLine**?🔹 | <code>[javascript.EndOfLine](#projen-javascript-endofline)</code> | Which end of line characters to apply.<br/>__*Default*__: EndOfLine.LF\n**filepath**?🔹 | <code>string</code> | Specify the input filepath.<br/>__*Default*__: none\n**htmlWhitespaceSensitivity**?🔹 | <code>[javascript.HTMLWhitespaceSensitivity](#projen-javascript-htmlwhitespacesensitivity)</code> | How to handle whitespaces in HTML.<br/>__*Default*__: HTMLWhitespaceSensitivity.CSS\n**insertPragma**?🔹 | <code>boolean</code> | Insert @format pragma into file's first docblock comment.<br/>__*Default*__: false\n**jsxSingleQuote**?🔹 | <code>boolean</code> | Use single quotes in JSX.<br/>__*Default*__: false\n**parser**?🔹 | <code>string</code> | Which parser to use.<br/>__*Default*__: Prettier automatically infers the parser from the input file path, so you shouldn’t have to change this setting.\n**pluginSearchDirs**?🔹 | <code>Array<string></code> | Custom directory that contains prettier plugins in node_modules subdirectory.<br/>__*Default*__: []\n**plugins**?🔹 | <code>Array<string></code> | Add a plugin.<br/>__*Default*__: []\n**printWidth**?🔹 | <code>number</code> | The line length where Prettier will try wrap.<br/>__*Default*__: 80\n**proseWrap**?🔹 | <code>[javascript.ProseWrap](#projen-javascript-prosewrap)</code> | How to wrap prose.<br/>__*Default*__: ProseWrap.PRESERVE\n**quoteProps**?🔹 | <code>[javascript.QuoteProps](#projen-javascript-quoteprops)</code> | Change when properties in objects are quoted.<br/>__*Default*__: QuoteProps.ASNEEDED\n**rangeEnd**?🔹 | <code>number</code> | Format code ending at a given character offset (exclusive).<br/>__*Default*__: null\n**rangeStart**?🔹 | <code>number</code> | Format code starting at a given character offset.<br/>__*Default*__: 0\n**requirePragma**?🔹 | <code>boolean</code> | Require either '@prettier' or '@format' to be present in the file's first docblock comment in order for it to be formatted.<br/>__*Default*__: false\n**semi**?🔹 | <code>boolean</code> | Print semicolons.<br/>__*Default*__: true\n**singleQuote**?🔹 | <code>boolean</code> | Use single quotes instead of double quotes.<br/>__*Default*__: false\n**tabWidth**?🔹 | <code>number</code> | Number of spaces per indentation level.<br/>__*Default*__: 2\n**trailingComma**?🔹 | <code>[javascript.TrailingComma](#projen-javascript-trailingcomma)</code> | Print trailing commas wherever possible when multi-line.<br/>__*Default*__: TrailingComma.ES5\n**useTabs**?🔹 | <code>boolean</code> | Indent with tabs instead of spaces.<br/>__*Default*__: false\n**vueIndentScriptAndStyle**?🔹 | <code>boolean</code> | Indent script and style tags in Vue files.<br/>__*Default*__: false\n\n\n\n## struct ProjenrcOptions 🔹 <a id=\"projen-javascript-projenrcoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**filename**?🔹 | <code>string</code> | The name of the projenrc file.<br/>__*Default*__: \".projenrc.js\"\n\n\n\n## struct RenderWorkflowSetupOptions 🔹 <a id=\"projen-javascript-renderworkflowsetupoptions\"></a>\n\n\nOptions for `renderInstallSteps()`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**mutable**?🔹 | <code>boolean</code> | Should the pacakge lockfile be updated?<br/>__*Default*__: false\n\n\n\n## struct ScopedPackagesOptions 🔹 <a id=\"projen-javascript-scopedpackagesoptions\"></a>\n\n\nOptions for scoped packages.\n\n\n\nName | Type | Description \n-----|------|-------------\n**registryUrl**🔹 | <code>string</code> | URL of the registry for scoped packages.\n**scope**🔹 | <code>string</code> | Scope of the packages.\n\n\n\n## struct TypeScriptCompilerOptions 🔹 <a id=\"projen-javascript-typescriptcompileroptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**allowJs**?🔹 | <code>boolean</code> | Allow JavaScript files to be compiled.<br/>__*Default*__: false\n**allowSyntheticDefaultImports**?🔹 | <code>boolean</code> | Allow default imports from modules with no default export.<br/>__*Optional*__\n**alwaysStrict**?🔹 | <code>boolean</code> | Ensures that your files are parsed in the ECMAScript strict mode, and emit “use strict” for each source file.<br/>__*Default*__: true\n**baseUrl**?🔹 | <code>string</code> | Lets you set a base directory to resolve non-absolute module names.<br/>__*Optional*__\n**declaration**?🔹 | <code>boolean</code> | To be specified along with the above.<br/>__*Optional*__\n**declarationDir**?🔹 | <code>string</code> | Offers a way to configure the root directory for where declaration files are emitted.<br/>__*Optional*__\n**emitDecoratorMetadata**?🔹 | <code>boolean</code> | Enables experimental support for decorators, which is in stage 2 of the TC39 standardization process.<br/>__*Default*__: undefined\n**esModuleInterop**?🔹 | <code>boolean</code> | Emit __importStar and __importDefault helpers for runtime babel ecosystem compatibility and enable --allowSyntheticDefaultImports for typesystem compatibility.<br/>__*Default*__: false\n**experimentalDecorators**?🔹 | <code>boolean</code> | Enables experimental support for decorators, which is in stage 2 of the TC39 standardization process.<br/>__*Default*__: true\n**forceConsistentCasingInFileNames**?🔹 | <code>boolean</code> | Disallow inconsistently-cased references to the same file.<br/>__*Default*__: false\n**inlineSourceMap**?🔹 | <code>boolean</code> | When set, instead of writing out a .js.map file to provide source maps, TypeScript will embed the source map content in the .js files.<br/>__*Default*__: true\n**inlineSources**?🔹 | <code>boolean</code> | When set, TypeScript will include the original content of the .ts file as an embedded string in the source map. This is often useful in the same cases as inlineSourceMap.<br/>__*Default*__: true\n**isolatedModules**?🔹 | <code>boolean</code> | Perform additional checks to ensure that separate compilation (such as with transpileModule or @babel/plugin-transform-typescript) would be safe.<br/>__*Default*__: false\n**jsx**?🔹 | <code>[javascript.TypeScriptJsxMode](#projen-javascript-typescriptjsxmode)</code> | Support JSX in .tsx files: \"react\", \"preserve\", \"react-native\" etc.<br/>__*Default*__: undefined\n**lib**?🔹 | <code>Array<string></code> | Reference for type definitions / libraries to use (eg.<br/>__*Default*__: [ \"es2018\" ]\n**module**?🔹 | <code>string</code> | Sets the module system for the program.<br/>__*Default*__: \"CommonJS\"\n**moduleResolution**?🔹 | <code>[javascript.TypeScriptModuleResolution](#projen-javascript-typescriptmoduleresolution)</code> | Determine how modules get resolved.<br/>__*Default*__: \"node\"\n**noEmit**?🔹 | <code>boolean</code> | Do not emit outputs.<br/>__*Default*__: false\n**noEmitOnError**?🔹 | <code>boolean</code> | Do not emit compiler output files like JavaScript source code, source-maps or declarations if any errors were reported.<br/>__*Default*__: true\n**noFallthroughCasesInSwitch**?🔹 | <code>boolean</code> | Report errors for fallthrough cases in switch statements.<br/>__*Default*__: true\n**noImplicitAny**?🔹 | <code>boolean</code> | In some cases where no type annotations are present, TypeScript will fall back to a type of any for a variable when it cannot infer the type.<br/>__*Default*__: true\n**noImplicitReturns**?🔹 | <code>boolean</code> | When enabled, TypeScript will check all code paths in a function to ensure they return a value.<br/>__*Default*__: true\n**noImplicitThis**?🔹 | <code>boolean</code> | Raise error on ‘this’ expressions with an implied ‘any’ type.<br/>__*Default*__: true\n**noPropertyAccessFromIndexSignature**?🔹 | <code>boolean</code> | Raise error on use of the dot syntax to access fields which are not defined.<br/>__*Default*__: true\n**noUncheckedIndexedAccess**?🔹 | <code>boolean</code> | Raise error when accessing indexes on objects with unknown keys defined in index signatures.<br/>__*Default*__: true\n**noUnusedLocals**?🔹 | <code>boolean</code> | Report errors on unused local variables.<br/>__*Default*__: true\n**noUnusedParameters**?🔹 | <code>boolean</code> | Report errors on unused parameters in functions.<br/>__*Default*__: true\n**outDir**?🔹 | <code>string</code> | Output directory for the compiled files.<br/>__*Optional*__\n**paths**?🔹 | <code>Map<string, Array<string>></code> | A series of entries which re-map imports to lookup locations relative to the baseUrl, there is a larger coverage of paths in the handbook.<br/>__*Optional*__\n**resolveJsonModule**?🔹 | <code>boolean</code> | Allows importing modules with a ‘.json’ extension, which is a common practice in node projects. This includes generating a type for the import based on the static JSON shape.<br/>__*Default*__: true\n**rootDir**?🔹 | <code>string</code> | Specifies the root directory of input files.<br/>__*Optional*__\n**skipLibCheck**?🔹 | <code>boolean</code> | Skip type checking of all declaration files (*.d.ts).<br/>__*Default*__: false\n**strict**?🔹 | <code>boolean</code> | The strict flag enables a wide range of type checking behavior that results in stronger guarantees of program correctness.<br/>__*Default*__: true\n**strictNullChecks**?🔹 | <code>boolean</code> | When strictNullChecks is false, null and undefined are effectively ignored by the language.<br/>__*Default*__: true\n**strictPropertyInitialization**?🔹 | <code>boolean</code> | When set to true, TypeScript will raise an error when a class property was declared but not set in the constructor.<br/>__*Default*__: true\n**stripInternal**?🔹 | <code>boolean</code> | Do not emit declarations for code that has an @internal annotation in it’s JSDoc comment.<br/>__*Default*__: true\n**target**?🔹 | <code>string</code> | Modern browsers support all ES6 features, so ES6 is a good choice.<br/>__*Default*__: \"ES2018\"\n\n\n\n## struct TypescriptConfigOptions 🔹 <a id=\"projen-javascript-typescriptconfigoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**compilerOptions**🔹 | <code>[javascript.TypeScriptCompilerOptions](#projen-javascript-typescriptcompileroptions)</code> | Compiler options to use.\n**exclude**?🔹 | <code>Array<string></code> | Filters results from the \"include\" option.<br/>__*Default*__: node_modules is excluded by default\n**fileName**?🔹 | <code>string</code> | __*Default*__: \"tsconfig.json\"\n**include**?🔹 | <code>Array<string></code> | Specifies a list of glob patterns that match TypeScript files to be included in compilation.<br/>__*Default*__: all .ts files recursively\n\n\n\n## struct UpgradeDependenciesOptions 🔹 <a id=\"projen-javascript-upgradedependenciesoptions\"></a>\n\n\nOptions for `UpgradeDependencies`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**exclude**?🔹 | <code>Array<string></code> | List of package names to exclude during the upgrade.<br/>__*Default*__: Nothing is excluded.\n**include**?🔹 | <code>Array<string></code> | List of package names to include during the upgrade.<br/>__*Default*__: Everything is included.\n**pullRequestTitle**?🔹 | <code>string</code> | Title of the pull request to use (should be all lower-case).<br/>__*Default*__: \"upgrade dependencies\"\n**signoff**?🔹 | <code>boolean</code> | Add Signed-off-by line by the committer at the end of the commit log message.<br/>__*Default*__: true\n**taskName**?🔹 | <code>string</code> | The name of the task that will be created.<br/>__*Default*__: \"upgrade\".\n**workflow**?🔹 | <code>boolean</code> | Include a github workflow for creating PR's that upgrades the required dependencies, either by manual dispatch, or by a schedule.<br/>__*Default*__: true for root projects, false for sub-projects.\n**workflowOptions**?🔹 | <code>[javascript.UpgradeDependenciesWorkflowOptions](#projen-javascript-upgradedependenciesworkflowoptions)</code> | Options for the github workflow.<br/>__*Default*__: default options.\n\n\n\n## struct UpgradeDependenciesWorkflowOptions 🔹 <a id=\"projen-javascript-upgradedependenciesworkflowoptions\"></a>\n\n\nOptions for `UpgradeDependencies.workflowOptions`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**assignees**?🔹 | <code>Array<string></code> | Assignees to add on the PR.<br/>__*Default*__: no assignees\n**branches**?🔹 | <code>Array<string></code> | List of branches to create PR's for.<br/>__*Default*__: All release branches configured for the project.\n**container**?🔹 | <code>[github.workflows.ContainerOptions](#projen-github-workflows-containeroptions)</code> | Job container options.<br/>__*Default*__: defaults\n**gitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use for commits.<br/>__*Default*__: \"github-actions\n**labels**?🔹 | <code>Array<string></code> | Labels to apply on the PR.<br/>__*Default*__: no labels.\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method for authenticating with GitHub for creating the PR.<br/>__*Default*__: personal access token named PROJEN_GITHUB_TOKEN\n**runsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n**schedule**?🔹 | <code>[javascript.UpgradeDependenciesSchedule](#projen-javascript-upgradedependenciesschedule)</code> | Schedule to run on.<br/>__*Default*__: UpgradeDependenciesSchedule.DAILY\n\n\n\n## interface IPackageProvider 🔹 <a id=\"projen-python-ipackageprovider\"></a>\n\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**packages**🔹 | <code>Array<[Dependency](#projen-dependency)></code> | An array of packages (may be dynamically generated).\n\n\n\n## interface IPythonDeps 🔹 <a id=\"projen-python-ipythondeps\"></a>\n\n__Implemented by__: [python.Pip](#projen-python-pip), [python.Poetry](#projen-python-poetry)\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**installTask**🔹 | <code>[Task](#projen-task)</code> | A task that installs and updates dependencies.\n\n### Methods\n\n\n#### addDependency(spec)🔹 <a id=\"projen-python-ipythondeps-adddependency\"></a>\n\nAdds a runtime dependency.\n\n```ts\naddDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### addDevDependency(spec)🔹 <a id=\"projen-python-ipythondeps-adddevdependency\"></a>\n\nAdds a dev dependency.\n\n```ts\naddDevDependency(spec: string): void\n```\n\n* **spec** (<code>string</code>)  Format `<module>@<semver>`.\n\n\n\n\n#### installDependencies()🔹 <a id=\"projen-python-ipythondeps-installdependencies\"></a>\n\nInstalls dependencies (called during post-synthesis).\n\n```ts\ninstallDependencies(): void\n```\n\n\n\n\n\n\n\n## interface IPythonEnv 🔹 <a id=\"projen-python-ipythonenv\"></a>\n\n__Implemented by__: [python.Poetry](#projen-python-poetry), [python.Venv](#projen-python-venv)\n\n\n### Methods\n\n\n#### setupEnvironment()🔹 <a id=\"projen-python-ipythonenv-setupenvironment\"></a>\n\nInitializes the virtual environment if it doesn't exist (called during post-synthesis).\n\n```ts\nsetupEnvironment(): void\n```\n\n\n\n\n\n\n\n## interface IPythonPackaging 🔹 <a id=\"projen-python-ipythonpackaging\"></a>\n\n__Implemented by__: [python.Poetry](#projen-python-poetry), [python.Setuptools](#projen-python-setuptools)\n\n\n\n### Properties\n\n\nName | Type | Description \n-----|------|-------------\n**publishTask**🔹 | <code>[Task](#projen-task)</code> | A task that uploads the package to a package repository.\n\n\n\n## struct PipOptions 🔹 <a id=\"projen-python-pipoptions\"></a>\n\n\nOptions for pip.\n\n\n## struct PoetryPyprojectOptions 🔹 <a id=\"projen-python-poetrypyprojectoptions\"></a>\n\n\nPoetry-specific options.\n\n\n\nName | Type | Description \n-----|------|-------------\n**authors**?🔹 | <code>Array<string></code> | The authors of the package.<br/>__*Optional*__\n**classifiers**?🔹 | <code>Array<string></code> | A list of PyPI trove classifiers that describe the project.<br/>__*Optional*__\n**dependencies**?🔹 | <code>Map<string, any></code> | A list of dependencies for the project.<br/>__*Optional*__\n**description**?🔹 | <code>string</code> | A short description of the package (required).<br/>__*Optional*__\n**devDependencies**?🔹 | <code>Map<string, any></code> | A list of development dependencies for the project.<br/>__*Optional*__\n**documentation**?🔹 | <code>string</code> | A URL to the documentation of the project.<br/>__*Optional*__\n**exclude**?🔹 | <code>Array<string></code> | A list of patterns that will be excluded in the final package.<br/>__*Optional*__\n**extras**?🔹 | <code>Map<string, Array<string>></code> | Package extras.<br/>__*Optional*__\n**homepage**?🔹 | <code>string</code> | A URL to the website of the project.<br/>__*Optional*__\n**include**?🔹 | <code>Array<string></code> | A list of patterns that will be included in the final package.<br/>__*Optional*__\n**keywords**?🔹 | <code>Array<string></code> | A list of keywords (max: 5) that the package is related to.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License of this package as an SPDX identifier.<br/>__*Optional*__\n**maintainers**?🔹 | <code>Array<string></code> | the maintainers of the package.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | Name of the package (required).<br/>__*Optional*__\n**packages**?🔹 | <code>Array<any></code> | A list of packages and modules to include in the final distribution.<br/>__*Optional*__\n**plugins**?🔹 | <code>any</code> | Plugins.<br/>__*Optional*__\n**readme**?🔹 | <code>string</code> | The name of the readme file of the package.<br/>__*Optional*__\n**repository**?🔹 | <code>string</code> | A URL to the repository of the project.<br/>__*Optional*__\n**scripts**?🔹 | <code>Map<string, any></code> | The scripts or executables that will be installed when installing the package.<br/>__*Optional*__\n**source**?🔹 | <code>Array<any></code> | Source registries from which packages are retrieved.<br/>__*Optional*__\n**urls**?🔹 | <code>Map<string, string></code> | Project custom URLs, in addition to homepage, repository and documentation.<br/>__*Optional*__\n**version**?🔹 | <code>string</code> | Version of the package (required).<br/>__*Optional*__\n\n\n\n## struct PoetryPyprojectOptionsWithoutDeps 🔹 <a id=\"projen-python-poetrypyprojectoptionswithoutdeps\"></a>\n\n\nPoetry-specific options.\n\n\n\nName | Type | Description \n-----|------|-------------\n**authors**?🔹 | <code>Array<string></code> | The authors of the package.<br/>__*Optional*__\n**classifiers**?🔹 | <code>Array<string></code> | A list of PyPI trove classifiers that describe the project.<br/>__*Optional*__\n**description**?🔹 | <code>string</code> | A short description of the package (required).<br/>__*Optional*__\n**documentation**?🔹 | <code>string</code> | A URL to the documentation of the project.<br/>__*Optional*__\n**exclude**?🔹 | <code>Array<string></code> | A list of patterns that will be excluded in the final package.<br/>__*Optional*__\n**extras**?🔹 | <code>Map<string, Array<string>></code> | Package extras.<br/>__*Optional*__\n**homepage**?🔹 | <code>string</code> | A URL to the website of the project.<br/>__*Optional*__\n**include**?🔹 | <code>Array<string></code> | A list of patterns that will be included in the final package.<br/>__*Optional*__\n**keywords**?🔹 | <code>Array<string></code> | A list of keywords (max: 5) that the package is related to.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License of this package as an SPDX identifier.<br/>__*Optional*__\n**maintainers**?🔹 | <code>Array<string></code> | the maintainers of the package.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | Name of the package (required).<br/>__*Optional*__\n**packages**?🔹 | <code>Array<any></code> | A list of packages and modules to include in the final distribution.<br/>__*Optional*__\n**plugins**?🔹 | <code>any</code> | Plugins.<br/>__*Optional*__\n**readme**?🔹 | <code>string</code> | The name of the readme file of the package.<br/>__*Optional*__\n**repository**?🔹 | <code>string</code> | A URL to the repository of the project.<br/>__*Optional*__\n**scripts**?🔹 | <code>Map<string, any></code> | The scripts or executables that will be installed when installing the package.<br/>__*Optional*__\n**source**?🔹 | <code>Array<any></code> | Source registries from which packages are retrieved.<br/>__*Optional*__\n**urls**?🔹 | <code>Map<string, string></code> | Project custom URLs, in addition to homepage, repository and documentation.<br/>__*Optional*__\n**version**?🔹 | <code>string</code> | Version of the package (required).<br/>__*Optional*__\n\n\n\n## struct ProjenrcOptions 🔹 <a id=\"projen-python-projenrcoptions\"></a>\n\n\nOptions for `Projenrc`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**filename**?🔹 | <code>string</code> | The name of the projenrc file.<br/>__*Default*__: \".projenrc.py\"\n**projenVersion**?🔹 | <code>string</code> | The projen version to use.<br/>__*Default*__: current version\n\n\n\n## struct PytestOptions 🔹 <a id=\"projen-python-pytestoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**maxFailures**?🔹 | <code>number</code> | Stop the testing process after the first N failures.<br/>__*Optional*__\n**testdir**?🔹 | <code>string</code> | Directory with tests.<br/>__*Default*__: 'tests'\n**version**?🔹 | <code>string</code> | Pytest version.<br/>__*Default*__: \"6.2.1\"\n\n\n\n## struct PytestSampleOptions 🔹 <a id=\"projen-python-pytestsampleoptions\"></a>\n\n\nOptions for python test code sample.\n\n\n\nName | Type | Description \n-----|------|-------------\n**moduleName**🔹 | <code>string</code> | Name of the python package as used in imports and filenames.\n**testdir**🔹 | <code>string</code> | Test directory.\n\n\n\n## struct PythonPackagingOptions 🔹 <a id=\"projen-python-pythonpackagingoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**authorEmail**🔹 | <code>string</code> | Author's e-mail.\n**authorName**🔹 | <code>string</code> | Author's name.\n**version**🔹 | <code>string</code> | Version of the package.\n**classifiers**?🔹 | <code>Array<string></code> | A list of PyPI trove classifiers that describe the project.<br/>__*Optional*__\n**description**?🔹 | <code>string</code> | A short description of the package.<br/>__*Optional*__\n**homepage**?🔹 | <code>string</code> | A URL to the website of the project.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License of this package as an SPDX identifier.<br/>__*Optional*__\n**packageName**?🔹 | <code>string</code> | Package name.<br/>__*Optional*__\n**poetryOptions**?🔹 | <code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code> | Additional options to set for poetry if using poetry.<br/>__*Optional*__\n**setupConfig**?🔹 | <code>Map<string, any></code> | Additional fields to pass in the setup() function if using setuptools.<br/>__*Optional*__\n\n\n\n## struct PythonProjectOptions 🔹 <a id=\"projen-python-pythonprojectoptions\"></a>\n\n\nOptions for `PythonProject`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**authorEmail**🔹 | <code>string</code> | Author's e-mail.\n**authorName**🔹 | <code>string</code> | Author's name.\n**moduleName**🔹 | <code>string</code> | Name of the python package as used in imports and filenames.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**version**🔹 | <code>string</code> | Version of the package.\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**classifiers**?🔹 | <code>Array<string></code> | A list of PyPI trove classifiers that describe the project.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**deps**?🔹 | <code>Array<string></code> | List of runtime dependencies for this project.<br/>__*Default*__: []\n**description**?🔹 | <code>string</code> | A short description of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | List of dev dependencies for this project.<br/>__*Default*__: []\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | A URL to the website of the project.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License of this package as an SPDX identifier.<br/>__*Optional*__\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**packageName**?🔹 | <code>string</code> | Package name.<br/>__*Optional*__\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**pip**?🔹 | <code>boolean</code> | Use pip with a requirements.txt file to track project dependencies.<br/>__*Default*__: true\n**poetry**?🔹 | <code>boolean</code> | Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing.<br/>__*Default*__: false\n**poetryOptions**?🔹 | <code>[python.PoetryPyprojectOptionsWithoutDeps](#projen-python-poetrypyprojectoptionswithoutdeps)</code> | Additional options to set for poetry if using poetry.<br/>__*Optional*__\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenrcJs**?🔹 | <code>boolean</code> | Use projenrc in javascript.<br/>__*Default*__: false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options related to projenrc in JavaScript.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcPython**?🔹 | <code>boolean</code> | Use projenrc in Python.<br/>__*Default*__: true\n**projenrcPythonOptions**?🔹 | <code>[python.ProjenrcOptions](#projen-python-projenrcoptions)</code> | Options related to projenrc in python.<br/>__*Default*__: default options\n**pytest**?🔹 | <code>boolean</code> | Include pytest tests.<br/>__*Default*__: true\n**pytestOptions**?🔹 | <code>[python.PytestOptions](#projen-python-pytestoptions)</code> | pytest options.<br/>__*Default*__: defaults\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**sample**?🔹 | <code>boolean</code> | Include sample code and test if the relevant directories don't exist.<br/>__*Default*__: true\n**setupConfig**?🔹 | <code>Map<string, any></code> | Additional fields to pass in the setup() function if using setuptools.<br/>__*Optional*__\n**setuptools**?🔹 | <code>boolean</code> | Use setuptools with a setup.py script for packaging and publishing.<br/>__*Default*__: true if the project type is library\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**venv**?🔹 | <code>boolean</code> | Use venv to manage a virtual environment for installing dependencies inside.<br/>__*Default*__: true\n**venvOptions**?🔹 | <code>[python.VenvOptions](#projen-python-venvoptions)</code> | Venv options.<br/>__*Default*__: defaults\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n\n\n\n## struct PythonSampleOptions 🔹 <a id=\"projen-python-pythonsampleoptions\"></a>\n\n\nOptions for python sample code.\n\n\n\nName | Type | Description \n-----|------|-------------\n**dir**🔹 | <code>string</code> | Sample code directory.\n\n\n\n## struct RequirementsFileOptions 🔹 <a id=\"projen-python-requirementsfileoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**packageProvider**?🔹 | <code>[python.IPackageProvider](#projen-python-ipackageprovider)</code> | Provide a list of packages that can be dynamically updated.<br/>__*Optional*__\n\n\n\n## struct SetupPyOptions 🔹 <a id=\"projen-python-setuppyoptions\"></a>\n\n\nFields to pass in the setup() function of setup.py.\n\n\n\nName | Type | Description \n-----|------|-------------\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**classifiers**?🔹 | <code>Array<string></code> | A list of PyPI trove classifiers that describe the project.<br/>__*Optional*__\n**description**?🔹 | <code>string</code> | A short project description.<br/>__*Optional*__\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | The project license.<br/>__*Optional*__\n**name**?🔹 | <code>string</code> | Name of the package.<br/>__*Optional*__\n**packages**?🔹 | <code>Array<string></code> | List of submodules to be packaged.<br/>__*Optional*__\n**version**?🔹 | <code>string</code> | Manually specify package version.<br/>__*Optional*__\n\n\n\n## struct VenvOptions 🔹 <a id=\"projen-python-venvoptions\"></a>\n\n\nOptions for venv.\n\n\n\nName | Type | Description \n-----|------|-------------\n**envdir**?🔹 | <code>string</code> | Name of directory to store the environment in.<br/>__*Default*__: \".env\"\n\n\n\n## struct BranchOptions 🔹 <a id=\"projen-release-branchoptions\"></a>\n\n\nOptions for a release branch.\n\n\n\nName | Type | Description \n-----|------|-------------\n**majorVersion**🔹 | <code>number</code> | The major versions released from this branch.\n**minMajorVersion**?🔹 | <code>number</code> | The minimum major version to release.<br/>__*Optional*__\n**npmDistTag**?🔹 | <code>string</code> | The npm distribution tag to use for this branch.<br/>__*Default*__: \"latest\"\n**prerelease**?🔹 | <code>string</code> | Bump the version as a pre-release tag.<br/>__*Default*__: normal releases\n**tagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**workflowName**?🔹 | <code>string</code> | The name of the release workflow.<br/>__*Default*__: \"release-BRANCH\"\n\n\n\n## struct CodeArtifactOptions 🔹 <a id=\"projen-release-codeartifactoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**accessKeyIdSecret**?🔹 | <code>string</code> | GitHub secret which contains the AWS access key ID to use when publishing packages to AWS CodeArtifact.<br/>__*Default*__: \"AWS_ACCESS_KEY_ID\"\n**roleToAssume**?🔹 | <code>string</code> | ARN of AWS role to be assumed prior to get authorization token from AWS CodeArtifact This property must be specified only when publishing to AWS CodeArtifact (`registry` contains AWS CodeArtifact URL).<br/>__*Default*__: undefined\n**secretAccessKeySecret**?🔹 | <code>string</code> | GitHub secret which contains the AWS secret access key to use when publishing packages to AWS CodeArtifact.<br/>__*Default*__: \"AWS_SECRET_ACCESS_KEY\"\n\n\n\n## struct CommonPublishOptions 🔹 <a id=\"projen-release-commonpublishoptions\"></a>\n\n\nCommon publishing options.\n\n\n\nName | Type | Description \n-----|------|-------------\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct GitHubReleasesPublishOptions 🔹 <a id=\"projen-release-githubreleasespublishoptions\"></a>\n\n\nPublishing options for GitHub releases.\n\n\n\nName | Type | Description \n-----|------|-------------\n**changelogFile**🔹 | <code>string</code> | The location of an .md file (relative to `dist/`) that includes the changelog for the release.\n**releaseTagFile**🔹 | <code>string</code> | The location of a text file (relative to `dist/`) that contains the release tag.\n**versionFile**🔹 | <code>string</code> | The location of a text file (relative to `dist/`) that contains the version number.\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct GitPublishOptions 🔹 <a id=\"projen-release-gitpublishoptions\"></a>\n\n\nPublishing options for Git releases.\n\n\n\nName | Type | Description \n-----|------|-------------\n**changelogFile**🔹 | <code>string</code> | The location of an .md file (relative to `dist/`) that includes the changelog for the release.\n**releaseTagFile**🔹 | <code>string</code> | The location of a text file (relative to `dist/`) that contains the release tag.\n**versionFile**🔹 | <code>string</code> | The location of a text file (relative to `dist/`) that contains the version number.\n**gitBranch**?🔹 | <code>string</code> | Branch to push to.<br/>__*Default*__: \"main\"\n**gitPushCommand**?🔹 | <code>string</code> | Override git-push command.<br/>__*Optional*__\n**projectChangelogFile**?🔹 | <code>string</code> | The location of an .md file that includes the project-level changelog.<br/>__*Optional*__\n\n\n\n## struct GoPublishOptions 🔹 <a id=\"projen-release-gopublishoptions\"></a>\n\n\nOptions for Go releases.\n\n\n\nName | Type | Description \n-----|------|-------------\n**gitBranch**?🔹 | <code>string</code> | Branch to push to.<br/>__*Default*__: \"main\"\n**gitCommitMessage**?🔹 | <code>string</code> | The commit message.<br/>__*Default*__: \"chore(release): $VERSION\"\n**gitUserEmail**?🔹 | <code>string</code> | The email to use in the release git commit.<br/>__*Default*__: \"github-actions\n**gitUserName**?🔹 | <code>string</code> | The user name to use for the release git commit.<br/>__*Default*__: \"github-actions\"\n**githubDeployKeySecret**?🔹 | <code>string</code> | The name of the secret that includes a GitHub deploy key used to push to the GitHub repository.<br/>__*Default*__: \"GO_GITHUB_DEPLOY_KEY\"\n**githubRepo**?🔹 | <code>string</code> | GitHub repository to push to.<br/>__*Default*__: derived from `moduleName`\n**githubTokenSecret**?🔹 | <code>string</code> | The name of the secret that includes a personal GitHub access token used to push to the GitHub repository.<br/>__*Default*__: \"GO_GITHUB_TOKEN\"\n**githubUseSsh**?🔹 | <code>boolean</code> | Use SSH to push to GitHub instead of a personal accses token.<br/>__*Default*__: false\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct JsiiReleaseGo ⚠️ <a id=\"projen-release-jsiireleasego\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**gitBranch**?⚠️ | <code>string</code> | Branch to push to.<br/>__*Default*__: \"main\"\n**gitCommitMessage**?⚠️ | <code>string</code> | The commit message.<br/>__*Default*__: \"chore(release): $VERSION\"\n**gitUserEmail**?⚠️ | <code>string</code> | The email to use in the release git commit.<br/>__*Default*__: \"github-actions\n**gitUserName**?⚠️ | <code>string</code> | The user name to use for the release git commit.<br/>__*Default*__: \"github-actions\"\n**githubDeployKeySecret**?⚠️ | <code>string</code> | The name of the secret that includes a GitHub deploy key used to push to the GitHub repository.<br/>__*Default*__: \"GO_GITHUB_DEPLOY_KEY\"\n**githubRepo**?⚠️ | <code>string</code> | GitHub repository to push to.<br/>__*Default*__: derived from `moduleName`\n**githubTokenSecret**?⚠️ | <code>string</code> | The name of the secret that includes a personal GitHub access token used to push to the GitHub repository.<br/>__*Default*__: \"GO_GITHUB_TOKEN\"\n**githubUseSsh**?⚠️ | <code>boolean</code> | Use SSH to push to GitHub instead of a personal accses token.<br/>__*Default*__: false\n**prePublishSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?⚠️ | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct JsiiReleaseMaven ⚠️ <a id=\"projen-release-jsiireleasemaven\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**mavenEndpoint**?⚠️ | <code>string</code> | URL of Nexus repository.<br/>__*Default*__: \"https://oss.sonatype.org\"\n**mavenGpgPrivateKeyPassphrase**?⚠️ | <code>string</code> | GitHub secret name which contains the GPG private key or file that includes it.<br/>__*Default*__: \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\" or not set when using GitHub Packages\n**mavenGpgPrivateKeySecret**?⚠️ | <code>string</code> | GitHub secret name which contains the GPG private key or file that includes it.<br/>__*Default*__: \"MAVEN_GPG_PRIVATE_KEY\" or not set when using GitHub Packages\n**mavenPassword**?⚠️ | <code>string</code> | GitHub secret name which contains the Password for maven repository.<br/>__*Default*__: \"MAVEN_PASSWORD\" or \"GITHUB_TOKEN\" when using GitHub Packages\n**mavenRepositoryUrl**?⚠️ | <code>string</code> | Deployment repository when not deploying to Maven Central.<br/>__*Default*__: not set\n**mavenServerId**?⚠️ | <code>string</code> | Used in maven settings for credential lookup (e.g. use github when publishing to GitHub).<br/>__*Default*__: \"ossrh\" (Maven Central) or \"github\" when using GitHub Packages\n**mavenStagingProfileId**?⚠️ | <code>string</code> | GitHub secret name which contains the Maven Central (sonatype) staging profile ID (e.g. 68a05363083174). Staging profile ID can be found in the URL of the \"Releases\" staging profile under \"Staging Profiles\" in https://oss.sonatype.org (e.g. https://oss.sonatype.org/#stagingProfiles;11a33451234521).<br/>__*Default*__: \"MAVEN_STAGING_PROFILE_ID\" or not set when using GitHub Packages\n**mavenUsername**?⚠️ | <code>string</code> | GitHub secret name which contains the Username for maven repository.<br/>__*Default*__: \"MAVEN_USERNAME\" or the GitHub Actor when using GitHub Packages\n**prePublishSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?⚠️ | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct JsiiReleaseNpm ⚠️ <a id=\"projen-release-jsiireleasenpm\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**codeArtifactOptions**?⚠️ | <code>[release.CodeArtifactOptions](#projen-release-codeartifactoptions)</code> | Options for publishing npm package to AWS CodeArtifact.<br/>__*Default*__: undefined\n**distTag**?⚠️ | <code>string</code> | Tags can be used to provide an alias instead of version numbers.<br/>__*Default*__: \"latest\"\n**npmTokenSecret**?⚠️ | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\" or \"GITHUB_TOKEN\" if `registry` is set to `npm.pkg.github.com`.\n**prePublishSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?⚠️ | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n**registry**?⚠️ | <code>string</code> | The domain name of the npm package registry.<br/>__*Default*__: \"registry.npmjs.org\"\n\n\n\n## struct JsiiReleaseNuget ⚠️ <a id=\"projen-release-jsiireleasenuget\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**nugetApiKeySecret**?⚠️ | <code>string</code> | GitHub secret which contains the API key for NuGet.<br/>__*Default*__: \"NUGET_API_KEY\"\n**nugetServer**?⚠️ | <code>string</code> | NuGet Server URL (defaults to nuget.org).<br/>__*Optional*__\n**prePublishSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?⚠️ | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct JsiiReleasePyPi ⚠️ <a id=\"projen-release-jsiireleasepypi\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**prePublishSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?⚠️ | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n**twinePasswordSecret**?⚠️ | <code>string</code> | The GitHub secret which contains PyPI password.<br/>__*Default*__: \"TWINE_PASSWORD\"\n**twineRegistryUrl**?⚠️ | <code>string</code> | The registry url to use when releasing packages.<br/>__*Default*__: twine default\n**twineUsernameSecret**?⚠️ | <code>string</code> | The GitHub secret which contains PyPI user name.<br/>__*Default*__: \"TWINE_USERNAME\"\n\n\n\n## struct ManualReleaseOptions 🔹 <a id=\"projen-release-manualreleaseoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**changelog**?🔹 | <code>boolean</code> | Maintain a project-level changelog.<br/>__*Default*__: true\n**changelogPath**?🔹 | <code>string</code> | Project-level changelog file path.<br/>__*Default*__: 'CHANGELOG.md'\n**gitPushCommand**?🔹 | <code>string</code> | Override git-push command.<br/>__*Optional*__\n\n\n\n## struct MavenPublishOptions 🔹 <a id=\"projen-release-mavenpublishoptions\"></a>\n\n\nOptions for Maven releases.\n\n\n\nName | Type | Description \n-----|------|-------------\n**mavenEndpoint**?🔹 | <code>string</code> | URL of Nexus repository.<br/>__*Default*__: \"https://oss.sonatype.org\"\n**mavenGpgPrivateKeyPassphrase**?🔹 | <code>string</code> | GitHub secret name which contains the GPG private key or file that includes it.<br/>__*Default*__: \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\" or not set when using GitHub Packages\n**mavenGpgPrivateKeySecret**?🔹 | <code>string</code> | GitHub secret name which contains the GPG private key or file that includes it.<br/>__*Default*__: \"MAVEN_GPG_PRIVATE_KEY\" or not set when using GitHub Packages\n**mavenPassword**?🔹 | <code>string</code> | GitHub secret name which contains the Password for maven repository.<br/>__*Default*__: \"MAVEN_PASSWORD\" or \"GITHUB_TOKEN\" when using GitHub Packages\n**mavenRepositoryUrl**?🔹 | <code>string</code> | Deployment repository when not deploying to Maven Central.<br/>__*Default*__: not set\n**mavenServerId**?🔹 | <code>string</code> | Used in maven settings for credential lookup (e.g. use github when publishing to GitHub).<br/>__*Default*__: \"ossrh\" (Maven Central) or \"github\" when using GitHub Packages\n**mavenStagingProfileId**?🔹 | <code>string</code> | GitHub secret name which contains the Maven Central (sonatype) staging profile ID (e.g. 68a05363083174). Staging profile ID can be found in the URL of the \"Releases\" staging profile under \"Staging Profiles\" in https://oss.sonatype.org (e.g. https://oss.sonatype.org/#stagingProfiles;11a33451234521).<br/>__*Default*__: \"MAVEN_STAGING_PROFILE_ID\" or not set when using GitHub Packages\n**mavenUsername**?🔹 | <code>string</code> | GitHub secret name which contains the Username for maven repository.<br/>__*Default*__: \"MAVEN_USERNAME\" or the GitHub Actor when using GitHub Packages\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct NpmPublishOptions 🔹 <a id=\"projen-release-npmpublishoptions\"></a>\n\n\nOptions for npm release.\n\n\n\nName | Type | Description \n-----|------|-------------\n**codeArtifactOptions**?🔹 | <code>[release.CodeArtifactOptions](#projen-release-codeartifactoptions)</code> | Options for publishing npm package to AWS CodeArtifact.<br/>__*Default*__: undefined\n**distTag**?⚠️ | <code>string</code> | Tags can be used to provide an alias instead of version numbers.<br/>__*Default*__: \"latest\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\" or \"GITHUB_TOKEN\" if `registry` is set to `npm.pkg.github.com`.\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n**registry**?🔹 | <code>string</code> | The domain name of the npm package registry.<br/>__*Default*__: \"registry.npmjs.org\"\n\n\n\n## struct NugetPublishOptions 🔹 <a id=\"projen-release-nugetpublishoptions\"></a>\n\n\nOptions for NuGet releases.\n\n\n\nName | Type | Description \n-----|------|-------------\n**nugetApiKeySecret**?🔹 | <code>string</code> | GitHub secret which contains the API key for NuGet.<br/>__*Default*__: \"NUGET_API_KEY\"\n**nugetServer**?🔹 | <code>string</code> | NuGet Server URL (defaults to nuget.org).<br/>__*Optional*__\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n\n\n\n## struct PublisherOptions 🔹 <a id=\"projen-release-publisheroptions\"></a>\n\n\nOptions for `Publisher`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactName**🔹 | <code>string</code> | The name of the artifact to download (e.g. `dist`).\n**buildJobId**🔹 | <code>string</code> | The job ID that produces the build artifacts.\n**condition**?🔹 | <code>string</code> | A GitHub workflow expression used as a condition for publishers.<br/>__*Default*__: no condition\n**dryRun**?🔹 | <code>boolean</code> | Do not actually publish, only print the commands that would be executed instead.<br/>__*Optional*__\n**failureIssue**?🔹 | <code>boolean</code> | Create an issue when a publish task fails.<br/>__*Default*__: false\n**failureIssueLabel**?🔹 | <code>string</code> | The label to apply to the issue marking failed publish tasks.<br/>__*Default*__: \"failed-release\"\n**jsiiReleaseVersion**?⚠️ | <code>string</code> | __*Optional*__\n**publibVersion**?🔹 | <code>string</code> | Version requirement for `publib`.<br/>__*Default*__: \"latest\"\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**workflowNodeVersion**?🔹 | <code>string</code> | Node version to setup in GitHub workflows if any node-based CLI utilities are needed.<br/>__*Default*__: 14.x\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct PyPiPublishOptions 🔹 <a id=\"projen-release-pypipublishoptions\"></a>\n\n\nOptions for PyPI release.\n\n\n\nName | Type | Description \n-----|------|-------------\n**prePublishSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute before executing the publishing command. These can be used to prepare the artifact for publishing if neede.<br/>__*Optional*__\n**publishTools**?🔹 | <code>[github.workflows.Tools](#projen-github-workflows-tools)</code> | Additional tools to install in the publishing job.<br/>__*Default*__: no additional tools are installed\n**twinePasswordSecret**?🔹 | <code>string</code> | The GitHub secret which contains PyPI password.<br/>__*Default*__: \"TWINE_PASSWORD\"\n**twineRegistryUrl**?🔹 | <code>string</code> | The registry url to use when releasing packages.<br/>__*Default*__: twine default\n**twineUsernameSecret**?🔹 | <code>string</code> | The GitHub secret which contains PyPI user name.<br/>__*Default*__: \"TWINE_USERNAME\"\n\n\n\n## struct ReleaseOptions 🔹 <a id=\"projen-release-releaseoptions\"></a>\n\n\nOptions for `Release`.\n\n\n\nName | Type | Description \n-----|------|-------------\n**artifactsDirectory**🔹 | <code>string</code> | A directory which will contain build artifacts.\n**branch**🔹 | <code>string</code> | The default branch name to release from.\n**task**🔹 | <code>[Task](#projen-task)</code> | The task to execute in order to create the release artifacts.\n**versionFile**🔹 | <code>string</code> | A name of a .json file to set the `version` field in after a bump.\n**githubRelease**?🔹 | <code>boolean</code> | Create a GitHub release for each release.<br/>__*Default*__: true\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowNodeVersion**?🔹 | <code>string</code> | Node version to setup in GitHub workflows if any node-based CLI utilities are needed.<br/>__*Default*__: 14.x\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct ReleaseProjectOptions 🔹 <a id=\"projen-release-releaseprojectoptions\"></a>\n\n\nProject options for release.\n\n\n\nName | Type | Description \n-----|------|-------------\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct ScheduledReleaseOptions 🔹 <a id=\"projen-release-scheduledreleaseoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**schedule**🔹 | <code>string</code> | Cron schedule for releases.\n\n\n\n## struct ProjenrcOptions 🔹 <a id=\"projen-typescript-projenrcoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**filename**?🔹 | <code>string</code> | The name of the projenrc file.<br/>__*Default*__: \".projenrc.ts\"\n**projenCodeDir**?🔹 | <code>string</code> | A directory tree that may contain *.ts files that can be referenced from your projenrc typescript file.<br/>__*Default*__: \"projenrc\"\n\n\n\n## struct TypeScriptLibraryProjectOptions ⚠️ <a id=\"projen-typescript-typescriptlibraryprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**defaultReleaseBranch**⚠️ | <code>string</code> | The name of the main release branch.\n**name**⚠️ | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?⚠️ | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?⚠️ | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?⚠️ | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?⚠️ | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?⚠️ | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?⚠️ | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?⚠️ | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?⚠️ | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?⚠️ | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?⚠️ | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?⚠️ | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?⚠️ | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?⚠️ | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?⚠️ | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?⚠️ | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?⚠️ | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?⚠️ | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?⚠️ | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?⚠️ | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?⚠️ | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?⚠️ | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?⚠️ | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?⚠️ | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**copyrightOwner**?⚠️ | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?⚠️ | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?⚠️ | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?⚠️ | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?⚠️ | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?⚠️ | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?⚠️ | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?⚠️ | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?⚠️ | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?⚠️ | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?⚠️ | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?⚠️ | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docsDirectory**?⚠️ | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**entrypoint**?⚠️ | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?⚠️ | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?⚠️ | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?⚠️ | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**github**?⚠️ | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?⚠️ | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?⚠️ | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?⚠️ | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?⚠️ | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?⚠️ | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?⚠️ | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?⚠️ | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?⚠️ | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?⚠️ | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?⚠️ | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?⚠️ | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?⚠️ | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?⚠️ | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?⚠️ | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?⚠️ | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?⚠️ | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?⚠️ | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?⚠️ | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?⚠️ | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?⚠️ | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?⚠️ | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?⚠️ | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?⚠️ | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?⚠️ | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?⚠️ | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?⚠️ | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?⚠️ | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?⚠️ | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?⚠️ | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?⚠️ | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?⚠️ | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?⚠️ | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?⚠️ | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?⚠️ | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?⚠️ | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?⚠️ | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?⚠️ | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?⚠️ | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?⚠️ | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?⚠️ | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?⚠️ | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?⚠️ | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?⚠️ | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?⚠️ | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?⚠️ | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?⚠️ | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?⚠️ | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?⚠️ | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?⚠️ | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?⚠️ | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?⚠️ | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?⚠️ | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?⚠️ | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?⚠️ | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?⚠️ | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?⚠️ | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?⚠️ | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?⚠️ | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?⚠️ | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**sampleCode**?⚠️ | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?⚠️ | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?⚠️ | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?⚠️ | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?⚠️ | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?⚠️ | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?⚠️ | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?⚠️ | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?⚠️ | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?⚠️ | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?⚠️ | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?⚠️ | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?⚠️ | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?⚠️ | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?⚠️ | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?⚠️ | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?⚠️ | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?⚠️ | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?⚠️ | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct TypeScriptProjectOptions 🔹 <a id=\"projen-typescript-typescriptprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct DevContainerOptions 🔹 <a id=\"projen-vscode-devcontaineroptions\"></a>\n\n\nConstructor options for the DevContainer component.\n\nThe default docker image used for GitHub Codespaces is defined here:\n\n\n\nName | Type | Description \n-----|------|-------------\n**dockerImage**?🔹 | <code>[DevEnvironmentDockerImage](#projen-devenvironmentdockerimage)</code> | A Docker image or Dockerfile for the container.<br/>__*Optional*__\n**ports**?🔹 | <code>Array<string></code> | An array of ports that should be exposed from the container.<br/>__*Optional*__\n**tasks**?🔹 | <code>Array<[Task](#projen-task)></code> | An array of tasks that should be run when the container starts.<br/>__*Optional*__\n**vscodeExtensions**?🔹 | <code>Array<string></code> | An array of extension IDs that specify the extensions that should be installed inside the container when it is created.<br/>__*Optional*__\n\n\n\n## struct Presentation 🔹 <a id=\"projen-vscode-presentation\"></a>\n\n\nVSCode launch configuration Presentation interface \"using the order, group, and hidden attributes in the presentation object you can sort, group, and hide configurations and compounds in the Debug configuration dropdown and in the Debug quick pick.\" Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n\n\n\nName | Type | Description \n-----|------|-------------\n**group**🔹 | <code>string</code> | <span></span>\n**hidden**🔹 | <code>boolean</code> | <span></span>\n**order**🔹 | <code>number</code> | <span></span>\n\n\n\n## struct ServerReadyAction 🔹 <a id=\"projen-vscode-serverreadyaction\"></a>\n\n\nVSCode launch configuration ServerReadyAction interface \"if you want to open a URL in a web browser whenever the program under debugging outputs a specific message to the debug console or integrated terminal.\" Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n\n\n\nName | Type | Description \n-----|------|-------------\n**action**🔹 | <code>string</code> | <span></span>\n**pattern**?🔹 | <code>string</code> | __*Optional*__\n**uriFormat**?🔹 | <code>string</code> | __*Optional*__\n\n\n\n## struct VsCodeLaunchConfigurationEntry 🔹 <a id=\"projen-vscode-vscodelaunchconfigurationentry\"></a>\n\n\nOptions for a 'VsCodeLaunchConfigurationEntry' Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n\n\n\nName | Type | Description \n-----|------|-------------\n**name**🔹 | <code>string</code> | <span></span>\n**request**🔹 | <code>string</code> | <span></span>\n**type**🔹 | <code>string</code> | <span></span>\n**args**?🔹 | <code>Array<string></code> | __*Optional*__\n**console**?🔹 | <code>[vscode.Console](#projen-vscode-console)</code> | __*Optional*__\n**cwd**?🔹 | <code>string</code> | __*Optional*__\n**debugServer**?🔹 | <code>number</code> | __*Optional*__\n**disableOptimisticBPs**?🔹 | <code>boolean</code> | __*Optional*__\n**env**?🔹 | <code>Map<string, string &#124; boolean></code> | Set value to `false` to unset an existing environment variable.<br/>__*Optional*__\n**envFile**?🔹 | <code>string</code> | __*Optional*__\n**internalConsoleOptions**?🔹 | <code>[vscode.InternalConsoleOptions](#projen-vscode-internalconsoleoptions)</code> | __*Optional*__\n**outFiles**?🔹 | <code>Array<string></code> | __*Optional*__\n**port**?🔹 | <code>number</code> | __*Optional*__\n**postDebugTask**?🔹 | <code>string</code> | __*Optional*__\n**preLaunchTask**?🔹 | <code>string</code> | __*Optional*__\n**presentation**?🔹 | <code>[vscode.Presentation](#projen-vscode-presentation)</code> | __*Optional*__\n**program**?🔹 | <code>string</code> | __*Optional*__\n**runtimeArgs**?🔹 | <code>Array<string></code> | __*Optional*__\n**serverReadyAction**?🔹 | <code>[vscode.ServerReadyAction](#projen-vscode-serverreadyaction)</code> | __*Optional*__\n**skipFiles**?🔹 | <code>Array<string></code> | __*Optional*__\n**stopOnEntry**?🔹 | <code>boolean</code> | __*Optional*__\n**url**?🔹 | <code>string</code> | __*Optional*__\n**webRoot**?🔹 | <code>string</code> | __*Optional*__\n\n\n\n## struct NextComponentOptions 🔹 <a id=\"projen-web-nextcomponentoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**tailwind**?🔹 | <code>boolean</code> | Setup Tailwind as a PostCSS plugin.<br/>__*Default*__: true\n**typescript**?🔹 | <code>boolean</code> | Whether to apply options specific for TypeScript Next.js projects.<br/>__*Default*__: false\n\n\n\n## struct NextJsCommonProjectOptions 🔹 <a id=\"projen-web-nextjscommonprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**assetsdir**?🔹 | <code>string</code> | Assets directory.<br/>__*Default*__: \"public\"\n**tailwind**?🔹 | <code>boolean</code> | Setup Tailwind CSS as a PostCSS plugin.<br/>__*Default*__: true\n\n\n\n## struct NextJsProjectOptions 🔹 <a id=\"projen-web-nextjsprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**assetsdir**?🔹 | <code>string</code> | Assets directory.<br/>__*Default*__: \"public\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `pages/` and `public/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**tailwind**?🔹 | <code>boolean</code> | Setup Tailwind CSS as a PostCSS plugin.<br/>__*Default*__: true\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct NextJsTypeScriptProjectOptions 🔹 <a id=\"projen-web-nextjstypescriptprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**assetsdir**?🔹 | <code>string</code> | Assets directory.<br/>__*Default*__: \"public\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**tailwind**?🔹 | <code>boolean</code> | Setup Tailwind CSS as a PostCSS plugin.<br/>__*Default*__: true\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct PostCssOptions 🔹 <a id=\"projen-web-postcssoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**fileName**?🔹 | <code>string</code> | __*Default*__: \"postcss.config.json\"\n**tailwind**?🔹 | <code>boolean</code> | Install Tailwind CSS as a PostCSS plugin.<br/>__*Default*__: true\n**tailwindOptions**?🔹 | <code>[web.TailwindConfigOptions](#projen-web-tailwindconfigoptions)</code> | Tailwind CSS options.<br/>__*Optional*__\n\n\n\n## struct ReactComponentOptions 🔹 <a id=\"projen-web-reactcomponentoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**rewire**?🔹 | <code>Map<string, any></code> | Rewire webpack configuration.<br/>__*Default*__: No rewired config.\n**typescript**?🔹 | <code>boolean</code> | Whether to apply options specific for TypeScript React projects.<br/>__*Default*__: false\n\n\n\n## struct ReactProjectOptions 🔹 <a id=\"projen-web-reactprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rewire**?🔹 | <code>Map<string, any></code> | Rewire webpack configuration.<br/>__*Default*__: No rewired config.\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `public/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Source directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct ReactRewireOptions 🔹 <a id=\"projen-web-reactrewireoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**rewire**?🔹 | <code>Map<string, any></code> | Rewire webpack configuration.<br/>__*Default*__: No rewired config.\n\n\n\n## struct ReactTypeDefOptions ⚠️ <a id=\"projen-web-reacttypedefoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**committed**?⚠️ | <code>boolean</code> | Indicates whether this file should be committed to git or ignored.<br/>__*Default*__: true\n**editGitignore**?⚠️ | <code>boolean</code> | Update the project's .gitignore file.<br/>__*Default*__: true\n**executable**?⚠️ | <code>boolean</code> | Whether the generated file should be marked as executable.<br/>__*Default*__: false\n**marker**?⚠️ | <code>boolean</code> | Adds the projen marker to the file.<br/>__*Default*__: marker will be included as long as the project is not ejected\n**readonly**?⚠️ | <code>boolean</code> | Whether the generated file should be readonly.<br/>__*Default*__: true\n\n\n\n## struct ReactTypeScriptProjectOptions 🔹 <a id=\"projen-web-reacttypescriptprojectoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**defaultReleaseBranch**🔹 | <code>string</code> | The name of the main release branch.\n**name**🔹 | <code>string</code> | This is the name of your project.\n**allowLibraryDependencies**?🔹 | <code>boolean</code> | Allow the project to include `peerDependencies` and `bundledDependencies`.<br/>__*Default*__: true\n**artifactsDirectory**?🔹 | <code>string</code> | A directory which will contain build artifacts.<br/>__*Default*__: \"dist\"\n**authorEmail**?🔹 | <code>string</code> | Author's e-mail.<br/>__*Optional*__\n**authorName**?🔹 | <code>string</code> | Author's name.<br/>__*Optional*__\n**authorOrganization**?🔹 | <code>boolean</code> | Author's Organization.<br/>__*Optional*__\n**authorUrl**?🔹 | <code>string</code> | Author's URL / Website.<br/>__*Optional*__\n**autoApproveOptions**?🔹 | <code>[github.AutoApproveOptions](#projen-github-autoapproveoptions)</code> | Enable and configure the 'auto approve' workflow.<br/>__*Default*__: auto approve is disabled\n**autoApproveUpgrades**?🔹 | <code>boolean</code> | Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).<br/>__*Default*__: true\n**autoDetectBin**?🔹 | <code>boolean</code> | Automatically add all executables under the `bin` directory to your `package.json` file under the `bin` section.<br/>__*Default*__: true\n**autoMerge**?🔹 | <code>boolean</code> | Enable automatic merging on GitHub.<br/>__*Default*__: true\n**autoMergeOptions**?🔹 | <code>[github.AutoMergeOptions](#projen-github-automergeoptions)</code> | Configure options for automatic merging on GitHub.<br/>__*Default*__: see defaults in `AutoMergeOptions`\n**bin**?🔹 | <code>Map<string, string></code> | Binary programs vended with your module.<br/>__*Optional*__\n**bugsEmail**?🔹 | <code>string</code> | The email address to which issues should be reported.<br/>__*Optional*__\n**bugsUrl**?🔹 | <code>string</code> | The url to your project's issue tracker.<br/>__*Optional*__\n**buildWorkflow**?🔹 | <code>boolean</code> | Define a GitHub workflow for building PRs.<br/>__*Default*__: true if not a subproject\n**buildWorkflowTriggers**?🔹 | <code>[github.workflows.Triggers](#projen-github-workflows-triggers)</code> | Build workflow triggers.<br/>__*Default*__: \"{ pullRequest: {}, workflowDispatch: {} }\"\n**bundledDeps**?🔹 | <code>Array<string></code> | List of dependencies to bundle into this module.<br/>__*Optional*__\n**bundlerOptions**?🔹 | <code>[javascript.BundlerOptions](#projen-javascript-bundleroptions)</code> | Options for `Bundler`.<br/>__*Optional*__\n**clobber**?🔹 | <code>boolean</code> | Add a `clobber` task which resets the repo to origin.<br/>__*Default*__: true\n**codeArtifactOptions**?🔹 | <code>[javascript.CodeArtifactOptions](#projen-javascript-codeartifactoptions)</code> | Options for npm packages using AWS CodeArtifact.<br/>__*Default*__: undefined\n**codeCov**?🔹 | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.<br/>__*Default*__: false\n**codeCovTokenSecret**?🔹 | <code>string</code> | Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.<br/>__*Default*__: if this option is not specified, only public repositories are supported\n**commitGenerated**?🔹 | <code>boolean</code> | Whether to commit the managed files by default.<br/>__*Default*__: true\n**copyrightOwner**?🔹 | <code>string</code> | License copyright owner.<br/>__*Default*__: defaults to the value of authorName or \"\" if `authorName` is undefined.\n**copyrightPeriod**?🔹 | <code>string</code> | The copyright years to put in the LICENSE file.<br/>__*Default*__: current year\n**dependabot**?🔹 | <code>boolean</code> | Use dependabot to handle dependency upgrades.<br/>__*Default*__: false\n**dependabotOptions**?🔹 | <code>[github.DependabotOptions](#projen-github-dependabotoptions)</code> | Options for dependabot.<br/>__*Default*__: default options\n**deps**?🔹 | <code>Array<string></code> | Runtime dependencies of this module.<br/>__*Default*__: []\n**depsUpgrade**?🔹 | <code>boolean</code> | Use github workflows to handle dependency upgrades.<br/>__*Default*__: true\n**depsUpgradeOptions**?🔹 | <code>[javascript.UpgradeDependenciesOptions](#projen-javascript-upgradedependenciesoptions)</code> | Options for `UpgradeDependencies`.<br/>__*Default*__: default options\n**description**?🔹 | <code>string</code> | The description is just a string that helps people understand the purpose of the package.<br/>__*Optional*__\n**devContainer**?🔹 | <code>boolean</code> | Add a VSCode development environment (used for GitHub Codespaces).<br/>__*Default*__: false\n**devDeps**?🔹 | <code>Array<string></code> | Build dependencies for this module.<br/>__*Default*__: []\n**disableTsconfig**?🔹 | <code>boolean</code> | Do not generate a `tsconfig.json` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).<br/>__*Default*__: false\n**docgen**?🔹 | <code>boolean</code> | Docgen by Typedoc.<br/>__*Default*__: false\n**docsDirectory**?🔹 | <code>string</code> | Docs directory.<br/>__*Default*__: \"docs\"\n**entrypoint**?🔹 | <code>string</code> | Module entrypoint (`main` in `package.json`).<br/>__*Default*__: \"lib/index.js\"\n**entrypointTypes**?🔹 | <code>string</code> | The .d.ts file that includes the type declarations for this module.<br/>__*Default*__: .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n**eslint**?🔹 | <code>boolean</code> | Setup eslint.<br/>__*Default*__: true\n**eslintOptions**?🔹 | <code>[javascript.EslintOptions](#projen-javascript-eslintoptions)</code> | Eslint options.<br/>__*Default*__: opinionated default options\n**github**?🔹 | <code>boolean</code> | Enable GitHub integration.<br/>__*Default*__: true\n**githubOptions**?🔹 | <code>[github.GitHubOptions](#projen-github-githuboptions)</code> | Options for GitHub integration.<br/>__*Default*__: see GitHubOptions\n**gitignore**?🔹 | <code>Array<string></code> | Additional entries to .gitignore.<br/>__*Optional*__\n**gitpod**?🔹 | <code>boolean</code> | Add a Gitpod development environment.<br/>__*Default*__: false\n**homepage**?🔹 | <code>string</code> | Package's Homepage / Website.<br/>__*Optional*__\n**jest**?🔹 | <code>boolean</code> | Setup jest unit tests.<br/>__*Default*__: true\n**jestOptions**?🔹 | <code>[javascript.JestOptions](#projen-javascript-jestoptions)</code> | Jest options.<br/>__*Default*__: default options\n**jsiiReleaseVersion**?🔹 | <code>string</code> | Version requirement of `publib` which is used to publish modules to npm.<br/>__*Default*__: \"latest\"\n**keywords**?🔹 | <code>Array<string></code> | Keywords to include in `package.json`.<br/>__*Optional*__\n**libdir**?🔹 | <code>string</code> | Typescript  artifacts output directory.<br/>__*Default*__: \"lib\"\n**license**?🔹 | <code>string</code> | License's SPDX identifier.<br/>__*Default*__: \"Apache-2.0\"\n**licensed**?🔹 | <code>boolean</code> | Indicates if a license should be added.<br/>__*Default*__: true\n**logging**?🔹 | <code>[LoggerOptions](#projen-loggeroptions)</code> | Configure logging options such as verbosity.<br/>__*Default*__: {}\n**majorVersion**?🔹 | <code>number</code> | Major version to release from the default branch.<br/>__*Default*__: Major version is not enforced.\n**maxNodeVersion**?🔹 | <code>string</code> | Minimum node.js version to require via `engines` (inclusive).<br/>__*Default*__: no max\n**mergify**?⚠️ | <code>boolean</code> | Whether mergify should be enabled on this repository or not.<br/>__*Default*__: true\n**mergifyOptions**?⚠️ | <code>[github.MergifyOptions](#projen-github-mergifyoptions)</code> | Options for mergify.<br/>__*Default*__: default options\n**minMajorVersion**?🔹 | <code>number</code> | Minimal Major version to release.<br/>__*Default*__: No minimum version is being enforced\n**minNodeVersion**?🔹 | <code>string</code> | Minimum Node.js version to require via package.json `engines` (inclusive).<br/>__*Default*__: no \"engines\" specified\n**mutableBuild**?🔹 | <code>boolean</code> | Automatically update files modified during builds to pull-request branches.<br/>__*Default*__: true\n**npmAccess**?🔹 | <code>[javascript.NpmAccess](#projen-javascript-npmaccess)</code> | Access level of the npm package.<br/>__*Default*__: for scoped packages (e.g. `foo@bar`), the default is `NpmAccess.RESTRICTED`, for non-scoped packages, the default is `NpmAccess.PUBLIC`.\n**npmDistTag**?🔹 | <code>string</code> | The npmDistTag to use when publishing from the default branch.<br/>__*Default*__: \"latest\"\n**npmRegistry**?⚠️ | <code>string</code> | The host name of the npm registry to publish to.<br/>__*Optional*__\n**npmRegistryUrl**?🔹 | <code>string</code> | The base URL of the npm package registry.<br/>__*Default*__: \"https://registry.npmjs.org\"\n**npmTokenSecret**?🔹 | <code>string</code> | GitHub secret which contains the NPM token to use when publishing packages.<br/>__*Default*__: \"NPM_TOKEN\"\n**npmignore**?⚠️ | <code>Array<string></code> | Additional entries to .npmignore.<br/>__*Optional*__\n**npmignoreEnabled**?🔹 | <code>boolean</code> | Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.<br/>__*Default*__: true\n**outdir**?🔹 | <code>string</code> | The root directory of the project.<br/>__*Default*__: \".\"\n**package**?🔹 | <code>boolean</code> | Defines a `package` task that will produce an npm tarball under the artifacts directory (e.g. `dist`).<br/>__*Default*__: true\n**packageManager**?🔹 | <code>[javascript.NodePackageManager](#projen-javascript-nodepackagemanager)</code> | The Node Package Manager used to execute scripts.<br/>__*Default*__: NodePackageManager.YARN\n**packageName**?🔹 | <code>string</code> | The \"name\" in package.json.<br/>__*Default*__: defaults to project name\n**parent**?🔹 | <code>[Project](#projen-project)</code> | The parent project, if this project is part of a bigger project.<br/>__*Optional*__\n**peerDependencyOptions**?🔹 | <code>[javascript.PeerDependencyOptions](#projen-javascript-peerdependencyoptions)</code> | Options for `peerDeps`.<br/>__*Optional*__\n**peerDeps**?🔹 | <code>Array<string></code> | Peer dependencies for this module.<br/>__*Default*__: []\n**postBuildSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Steps to execute after build as part of the release workflow.<br/>__*Default*__: []\n**prerelease**?🔹 | <code>string</code> | Bump versions from the default branch as pre-releases (e.g. \"beta\", \"alpha\", \"pre\").<br/>__*Default*__: normal semantic versions\n**prettier**?🔹 | <code>boolean</code> | Setup prettier.<br/>__*Default*__: false\n**prettierOptions**?🔹 | <code>[javascript.PrettierOptions](#projen-javascript-prettieroptions)</code> | Prettier options.<br/>__*Default*__: default options\n**projectType**?⚠️ | <code>[ProjectType](#projen-projecttype)</code> | Which type of project this is (library/app).<br/>__*Default*__: ProjectType.UNKNOWN\n**projenCommand**?🔹 | <code>string</code> | The shell command to use in order to run the projen CLI.<br/>__*Default*__: \"npx projen\"\n**projenCredentials**?🔹 | <code>[github.GithubCredentials](#projen-github-githubcredentials)</code> | Choose a method of providing GitHub API access for projen workflows.<br/>__*Default*__: use a personal access token named PROJEN_GITHUB_TOKEN\n**projenDevDependency**?🔹 | <code>boolean</code> | Indicates of \"projen\" should be installed as a devDependency.<br/>__*Default*__: true\n**projenTokenSecret**?⚠️ | <code>string</code> | The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.<br/>__*Default*__: \"PROJEN_GITHUB_TOKEN\"\n**projenVersion**?🔹 | <code>string</code> | Version of projen to install.<br/>__*Default*__: Defaults to the latest version.\n**projenrcJs**?🔹 | <code>boolean</code> | Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable .projenrc.js generation.<br/>__*Default*__: true if projenrcJson is false\n**projenrcJsOptions**?🔹 | <code>[javascript.ProjenrcOptions](#projen-javascript-projenrcoptions)</code> | Options for .projenrc.js.<br/>__*Default*__: default options\n**projenrcJson**?🔹 | <code>boolean</code> | Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable .projenrc.json generation.<br/>__*Default*__: false\n**projenrcJsonOptions**?🔹 | <code>[ProjenrcOptions](#projen-projenrcoptions)</code> | Options for .projenrc.json.<br/>__*Default*__: default options\n**projenrcTs**?🔹 | <code>boolean</code> | Use TypeScript for your projenrc file (`.projenrc.ts`).<br/>__*Default*__: false\n**projenrcTsOptions**?🔹 | <code>[typescript.ProjenrcOptions](#projen-typescript-projenrcoptions)</code> | Options for .projenrc.ts.<br/>__*Optional*__\n**publishDryRun**?🔹 | <code>boolean</code> | Instead of actually publishing to package managers, just print the publishing command.<br/>__*Default*__: false\n**publishTasks**?🔹 | <code>boolean</code> | Define publishing tasks that can be executed manually as well as workflows.<br/>__*Default*__: false\n**pullRequestTemplate**?🔹 | <code>boolean</code> | Include a GitHub pull request template.<br/>__*Default*__: true\n**pullRequestTemplateContents**?🔹 | <code>Array<string></code> | The contents of the pull request template.<br/>__*Default*__: default content\n**readme**?🔹 | <code>[SampleReadmeProps](#projen-samplereadmeprops)</code> | The README setup.<br/>__*Default*__: { filename: 'README.md', contents: '# replace this' }\n**release**?🔹 | <code>boolean</code> | Add release management to this project.<br/>__*Default*__: true (false for subprojects)\n**releaseBranches**?🔹 | <code>Map<string, [release.BranchOptions](#projen-release-branchoptions)></code> | Defines additional release branches.<br/>__*Default*__: no additional branches are used for release. you can use `addBranch()` to add additional branches.\n**releaseEveryCommit**?⚠️ | <code>boolean</code> | Automatically release new versions every commit to one of branches in `releaseBranches`.<br/>__*Default*__: true\n**releaseFailureIssue**?🔹 | <code>boolean</code> | Create a github issue on every failed publishing task.<br/>__*Default*__: false\n**releaseFailureIssueLabel**?🔹 | <code>string</code> | The label to apply to issues indicating publish failures.<br/>__*Default*__: \"failed-release\"\n**releaseSchedule**?⚠️ | <code>string</code> | CRON schedule to trigger new releases.<br/>__*Default*__: no scheduled releases\n**releaseTagPrefix**?🔹 | <code>string</code> | Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.<br/>__*Default*__: no prefix\n**releaseToNpm**?🔹 | <code>boolean</code> | Automatically release to npm when new versions are introduced.<br/>__*Default*__: false\n**releaseTrigger**?🔹 | <code>[release.ReleaseTrigger](#projen-release-releasetrigger)</code> | The release trigger to use.<br/>__*Default*__: Continuous releases (`ReleaseTrigger.continuous()`)\n**releaseWorkflow**?⚠️ | <code>boolean</code> | DEPRECATED: renamed to `release`.<br/>__*Default*__: true if not a subproject\n**releaseWorkflowName**?🔹 | <code>string</code> | The name of the default release workflow.<br/>__*Default*__: \"Release\"\n**releaseWorkflowSetupSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | A set of workflow steps to execute in order to setup the workflow container.<br/>__*Optional*__\n**renovatebot**?🔹 | <code>boolean</code> | Use renovatebot to handle dependency upgrades.<br/>__*Default*__: false\n**renovatebotOptions**?🔹 | <code>[RenovatebotOptions](#projen-renovatebotoptions)</code> | Options for renovatebot.<br/>__*Default*__: default options\n**repository**?🔹 | <code>string</code> | The repository is the location where the actual code for your package lives.<br/>__*Optional*__\n**repositoryDirectory**?🔹 | <code>string</code> | If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.<br/>__*Optional*__\n**rewire**?🔹 | <code>Map<string, any></code> | Rewire webpack configuration.<br/>__*Default*__: No rewired config.\n**sampleCode**?🔹 | <code>boolean</code> | Generate one-time sample in `src/` and `test/` if there are no files there.<br/>__*Default*__: true\n**scopedPackagesOptions**?🔹 | <code>Array<[javascript.ScopedPackagesOptions](#projen-javascript-scopedpackagesoptions)></code> | Options for privately hosted scoped packages.<br/>__*Default*__: fetch all scoped packages from the public npm registry\n**scripts**?🔹 | <code>Map<string, string></code> | npm scripts to include.<br/>__*Default*__: {}\n**srcdir**?🔹 | <code>string</code> | Typescript sources directory.<br/>__*Default*__: \"src\"\n**stability**?🔹 | <code>string</code> | Package's Stability.<br/>__*Optional*__\n**stale**?🔹 | <code>boolean</code> | Auto-close of stale issues and pull request.<br/>__*Default*__: false\n**staleOptions**?🔹 | <code>[github.StaleOptions](#projen-github-staleoptions)</code> | Auto-close stale issues and pull requests.<br/>__*Default*__: see defaults in `StaleOptions`\n**testdir**?🔹 | <code>string</code> | Jest tests directory. Tests files should be named `xxx.test.ts`.<br/>__*Default*__: \"test\"\n**tsconfig**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom TSConfig.<br/>__*Default*__: default options\n**tsconfigDev**?🔹 | <code>[javascript.TypescriptConfigOptions](#projen-javascript-typescriptconfigoptions)</code> | Custom tsconfig options for the development tsconfig.json file (used for testing).<br/>__*Default*__: use the production tsconfig options\n**tsconfigDevFile**?🔹 | <code>string</code> | The name of the development tsconfig.json file.<br/>__*Default*__: \"tsconfig.dev.json\"\n**typescriptVersion**?🔹 | <code>string</code> | TypeScript version to use.<br/>__*Default*__: \"latest\"\n**versionrcOptions**?🔹 | <code>Map<string, any></code> | Custom configuration used when creating changelog with standard-version package.<br/>__*Default*__: standard configuration applicable for GitHub repositories\n**vscode**?🔹 | <code>boolean</code> | Enable VSCode integration.<br/>__*Default*__: true\n**workflowBootstrapSteps**?🔹 | <code>Array<[github.workflows.JobStep](#projen-github-workflows-jobstep)></code> | Workflow steps to use in order to bootstrap this repo.<br/>__*Default*__: \"yarn install --frozen-lockfile && yarn projen\"\n**workflowContainerImage**?🔹 | <code>string</code> | Container image to use for GitHub workflows.<br/>__*Default*__: default image\n**workflowGitIdentity**?🔹 | <code>[github.GitIdentity](#projen-github-gitidentity)</code> | The git identity to use in workflows.<br/>__*Default*__: GitHub Actions\n**workflowNodeVersion**?🔹 | <code>string</code> | The node version to use in GitHub workflows.<br/>__*Default*__: same as `minNodeVersion`\n**workflowRunsOn**?🔹 | <code>Array<string></code> | Github Runner selection labels.<br/>__*Default*__: [\"ubuntu-latest\"]\n\n\n\n## struct TailwindConfigOptions 🔹 <a id=\"projen-web-tailwindconfigoptions\"></a>\n\n\n\n\n\n\nName | Type | Description \n-----|------|-------------\n**fileName**?🔹 | <code>string</code> | __*Default*__: \"tailwind.config.json\"\n\n\n\n## enum DependencyType 🔹 <a id=\"projen-dependencytype\"></a>\n\nType of dependency.\n\nName | Description\n-----|-----\n**RUNTIME** 🔹|The dependency is required for the program/library during runtime.\n**PEER** 🔹|The dependency is required at runtime but expected to be installed by the consumer.\n**BUNDLED** 🔹|The dependency is bundled and shipped with the module, so consumers are not required to install it.\n**BUILD** 🔹|The dependency is required to run the `build` task.\n**TEST** 🔹|The dependency is required to run the `test` task.\n**DEVENV** 🔹|The dependency is required for development (e.g. IDE plugins).\n\n\n## enum DockerComposeProtocol 🔹 <a id=\"projen-dockercomposeprotocol\"></a>\n\nNetwork protocol for port mapping.\n\nName | Description\n-----|-----\n**TCP** 🔹|TCP protocol.\n**UDP** 🔹|UDP protocol.\n\n\n## enum GitpodOnOpen 🔹 <a id=\"projen-gitpodonopen\"></a>\n\nWhat to do when a service on a port is detected.\n\nName | Description\n-----|-----\n**OPEN_BROWSER** 🔹|Open a new browser tab.\n**OPEN_PREVIEW** 🔹|Open a preview on the right side of the IDE.\n**NOTIFY** 🔹|Show a notification asking the user what to do (default).\n**IGNORE** 🔹|Do nothing.\n\n\n## enum GitpodOpenIn 🔹 <a id=\"projen-gitpodopenin\"></a>\n\nConfigure where in the IDE the terminal should be opened.\n\nName | Description\n-----|-----\n**BOTTOM** 🔹|the bottom panel (default).\n**LEFT** 🔹|the left panel.\n**RIGHT** 🔹|the right panel.\n**MAIN** 🔹|the main editor area.\n\n\n## enum GitpodOpenMode 🔹 <a id=\"projen-gitpodopenmode\"></a>\n\nConfigure how the terminal should be opened relative to the previous task.\n\nName | Description\n-----|-----\n**TAB_AFTER** 🔹|Opens in the same tab group right after the previous tab.\n**TAB_BEFORE** 🔹|Opens in the same tab group left before the previous tab.\n**SPLIT_RIGHT** 🔹|Splits and adds the terminal to the right.\n**SPLIT_LEFT** 🔹|Splits and adds the terminal to the left.\n**SPLIT_TOP** 🔹|Splits and adds the terminal to the top.\n**SPLIT_BOTTOM** 🔹|Splits and adds the terminal to the bottom.\n\n\n## enum GitpodPortVisibility 🔹 <a id=\"projen-gitpodportvisibility\"></a>\n\nWhether the port visibility should be private or public.\n\nName | Description\n-----|-----\n**PUBLIC** 🔹|Allows everyone with the port URL to access the port (default).\n**PRIVATE** 🔹|Only allows users with workspace access to access the port.\n\n\n## enum InitProjectOptionHints 🔹 <a id=\"projen-initprojectoptionhints\"></a>\n\nChoices for how to display commented out options in projenrc files.\n\nDoes not apply to projenrc.json files.\n\nName | Description\n-----|-----\n**ALL** 🔹|Display all possible options (grouped by which interface they belong to).\n**FEATURED** 🔹|Display only featured options, in alphabetical order.\n**NONE** 🔹|Display no extra options.\n\n\n## enum LogLevel 🔹 <a id=\"projen-loglevel\"></a>\n\nLogging verbosity.\n\nName | Description\n-----|-----\n**OFF** 🔹|\n**ERROR** 🔹|\n**WARN** 🔹|\n**INFO** 🔹|\n**DEBUG** 🔹|\n**VERBOSE** 🔹|\n\n\n## enum ProjectType ⚠️ <a id=\"projen-projecttype\"></a>\n\nWhich type of project this is.\n\nName | Description\n-----|-----\n**UNKNOWN** ⚠️|This module may be a either a library or an app.\n**LIB** ⚠️|This is a library, intended to be published to a package manager and consumed by other projects.\n**APP** ⚠️|This is an app (service, tool, website, etc).\n\n\n## enum RenovatebotScheduleInterval 🔹 <a id=\"projen-renovatebotscheduleinterval\"></a>\n\nHow often to check for new versions and raise pull requests for version updates.\n\nName | Description\n-----|-----\n**ANY_TIME** 🔹|Run at any time.\n**EARLY_MONDAYS** 🔹|Weekly schedule on early monday mornings.\n**DAILY** 🔹|Schedule daily.\n**MONTHLY** 🔹|Schedule monthly.\n**QUARTERLY** 🔹|Schedule quarterly.\n**WEEKENDS** 🔹|Schedule for weekends.\n**WEEKDAYS** 🔹|Schedule for weekdays.\n\n\n## enum ApprovalLevel 🔹 <a id=\"projen-awscdk-approvallevel\"></a>\n\nWhich approval is required when deploying CDK apps.\n\nName | Description\n-----|-----\n**NEVER** 🔹|Approval is never required.\n**ANY_CHANGE** 🔹|Requires approval on any IAM or security-group-related change.\n**BROADENING** 🔹|Requires approval when IAM statements or traffic rules are added;\n\n\n## enum Stability 🔹 <a id=\"projen-cdk-stability\"></a>\n\n\n\nName | Description\n-----|-----\n**EXPERIMENTAL** 🔹|\n**STABLE** 🔹|\n**DEPRECATED** 🔹|\n\n\n## enum JobType 🔹 <a id=\"projen-circleci-jobtype\"></a>\n\nA job may have a type of approval indicating it must be manually approved before downstream jobs may proceed.\n\nName | Description\n-----|-----\n**APPROVAL** 🔹|\n\n\n## enum JobWhen 🔹 <a id=\"projen-circleci-jobwhen\"></a>\n\nSpecify when to enable or disable the step.\n\nName | Description\n-----|-----\n**ALWAYS** 🔹|\n**ON_SUCCESS** 🔹|\n**ON_FAIL** 🔹|\n\n\n## enum PipelineParameterType 🔹 <a id=\"projen-circleci-pipelineparametertype\"></a>\n\nPipeline parameter types.\n\nName | Description\n-----|-----\n**STRING** 🔹|\n**BOOLEAN** 🔹|\n**INTEGER** 🔹|\n**ENUM** 🔹|\n\n\n## enum ResourceClass 🔹 <a id=\"projen-circleci-resourceclass\"></a>\n\nThe resource_class feature allows configuring CPU and RAM resources for each job.\n\nDifferent resource classes are available for different executors, as described in the tables below.\n\nName | Description\n-----|-----\n**SMALL** 🔹|\n**MEDIUM** 🔹|\n**MEDIUM_PLUS** 🔹|\n**LARGE_X** 🔹|\n**LARGE_2X** 🔹|\n**LARGE_2X_PLUS** 🔹|\n\n\n## enum DependabotRegistryType 🔹 <a id=\"projen-github-dependabotregistrytype\"></a>\n\nEach configuration type requires you to provide particular settings.\n\nSome types allow more than one way to connect\n\nName | Description\n-----|-----\n**COMPOSER_REGISTRY** 🔹|The composer-repository type supports username and password.\n**DOCKER_REGISTRY** 🔹|The docker-registry type supports username and password.\n**GIT** 🔹|The git type supports username and password.\n**HEX_ORGANIZATION** 🔹|The hex-organization type supports organization and key.\n**MAVEN_REPOSITORY** 🔹|The maven-repository type supports username and password, or token.\n**NPM_REGISTRY** 🔹|The npm-registry type supports username and password, or token.\n**NUGET_FEED** 🔹|The nuget-feed type supports username and password, or token.\n**PYTHON_INDEX** 🔹|The python-index type supports username and password, or token.\n**RUBYGEMS_SERVER** 🔹|The rubygems-server type supports username and password, or token.\n**TERRAFORM_REGISTRY** 🔹|The terraform-registry type supports a token.\n\n\n## enum DependabotScheduleInterval 🔹 <a id=\"projen-github-dependabotscheduleinterval\"></a>\n\nHow often to check for new versions and raise pull requests for version updates.\n\nName | Description\n-----|-----\n**DAILY** 🔹|Runs on every weekday, Monday to Friday.\n**WEEKLY** 🔹|Runs once each week.\n**MONTHLY** 🔹|Runs once each month.\n\n\n## enum VersioningStrategy 🔹 <a id=\"projen-github-versioningstrategy\"></a>\n\nThe strategy to use when edits manifest and lock files.\n\nName | Description\n-----|-----\n**LOCKFILE_ONLY** 🔹|Only create pull requests to update lockfiles updates.\n**AUTO** 🔹|- For apps, the version requirements are increased.\n**WIDEN** 🔹|Relax the version requirement to include both the new and old version, when possible.\n**INCREASE** 🔹|Always increase the version requirement to match the new version.\n**INCREASE_IF_NECESSARY** 🔹|Increase the version requirement only when required by the new version.\n\n\n## enum Action 🔹 <a id=\"projen-gitlab-action\"></a>\n\nSpecifies what this job will do.\n\n'start' (default) indicates the job will start the\ndeployment. 'prepare' indicates this will not affect the deployment. 'stop' indicates\nthis will stop the deployment.\n\nName | Description\n-----|-----\n**PREPARE** 🔹|\n**START** 🔹|\n**STOP** 🔹|\n\n\n## enum CachePolicy 🔹 <a id=\"projen-gitlab-cachepolicy\"></a>\n\nConfigure the upload and download behaviour of a cache.\n\nName | Description\n-----|-----\n**PULL** 🔹|Only download the cache when the job starts, but never upload changes when the job finishes.\n**PUSH** 🔹|Only upload a cache when the job finishes, but never download the cache when the job starts.\n**PULL_PUSH** 🔹|The job downloads the cache when the job starts, and uploads changes to the cache when the job ends.\n\n\n## enum CacheWhen 🔹 <a id=\"projen-gitlab-cachewhen\"></a>\n\nConfigure when artifacts are uploaded depended on job status.\n\nName | Description\n-----|-----\n**ALWAYS** 🔹|Upload artifacts regardless of job status.\n**ON_FAILURE** 🔹|Upload artifacts only when the job fails.\n**ON_SUCCESS** 🔹|Upload artifacts only when the job succeeds (this is the default).\n\n\n## enum DefaultElement 🔹 <a id=\"projen-gitlab-defaultelement\"></a>\n\n\n\nName | Description\n-----|-----\n**AFTER_SCRIPT** 🔹|\n**ARTIFACTS** 🔹|\n**BEFORE_SCRIPT** 🔹|\n**CACHE** 🔹|\n**IMAGE** 🔹|\n**INTERRUPTIBLE** 🔹|\n**RETRY** 🔹|\n**SERVICES** 🔹|\n**TAGS** 🔹|\n**TIMEOUT** 🔹|\n\n\n## enum DeploymentTier 🔹 <a id=\"projen-gitlab-deploymenttier\"></a>\n\nExplicitly specifies the tier of the deployment environment if non-standard environment name is used.\n\nName | Description\n-----|-----\n**DEVELOPMENT** 🔹|\n**OTHER** 🔹|\n**PRODUCTION** 🔹|\n**STAGING** 🔹|\n**TESTING** 🔹|\n\n\n## enum JobWhen 🔹 <a id=\"projen-gitlab-jobwhen\"></a>\n\nDescribes the conditions for when to run the job.\n\nDefaults to 'on_success'.\n\nName | Description\n-----|-----\n**ALWAYS** 🔹|\n**DELAYED** 🔹|\n**MANUAL** 🔹|\n**NEVER** 🔹|\n**ON_FAILURE** 🔹|\n**ON_SUCCESS** 🔹|\n\n\n## enum KubernetesEnum 🔹 <a id=\"projen-gitlab-kubernetesenum\"></a>\n\nFilter job based on if Kubernetes integration is active.\n\nName | Description\n-----|-----\n**ACTIVE** 🔹|\n\n\n## enum LinkType 🔹 <a id=\"projen-gitlab-linktype\"></a>\n\nThe content kind of what users can download via url.\n\nName | Description\n-----|-----\n**IMAGE** 🔹|\n**OTHER** 🔹|\n**PACKAGE** 🔹|\n**RUNBOOK** 🔹|\n\n\n## enum Strategy 🔹 <a id=\"projen-gitlab-strategy\"></a>\n\nYou can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend.\n\nName | Description\n-----|-----\n**DEPEND** 🔹|\n\n\n## enum WorkflowWhen 🔹 <a id=\"projen-gitlab-workflowwhen\"></a>\n\nDescribes the conditions for when to run the job.\n\nDefaults to 'on_success'.\nThe value can only be 'always' or 'never' when used with workflow.\n\nName | Description\n-----|-----\n**ALWAYS** 🔹|\n**NEVER** 🔹|\n\n\n## enum ArrowParens 🔹 <a id=\"projen-javascript-arrowparens\"></a>\n\n\n\nName | Description\n-----|-----\n**ALWAYS** 🔹|Always include parens.\n**AVOID** 🔹|Omit parens when possible.\n\n\n## enum AutoRelease 🔹 <a id=\"projen-javascript-autorelease\"></a>\n\nAutomatic bump modes.\n\nName | Description\n-----|-----\n**EVERY_COMMIT** 🔹|Automatically bump & release a new version for every commit to \"main\".\n**DAILY** 🔹|Automatically bump & release a new version on a daily basis.\n\n\n## enum EmbeddedLanguageFormatting 🔹 <a id=\"projen-javascript-embeddedlanguageformatting\"></a>\n\n\n\nName | Description\n-----|-----\n**AUTO** 🔹|Format embedded code if Prettier can automatically identify it.\n**OFF** 🔹|Never automatically format embedded code.\n\n\n## enum EndOfLine 🔹 <a id=\"projen-javascript-endofline\"></a>\n\n\n\nName | Description\n-----|-----\n**AUTO** 🔹|Maintain existing (mixed values within one file are normalised by looking at what's used after the first line).\n**CR** 🔹|Carriage Return character only (\\r), used very rarely.\n**CRLF** 🔹|Carriage Return + Line Feed characters (\\r\\n), common on Windows.\n**LF** 🔹|Line Feed only (\\n), common on Linux and macOS as well as inside git repos.\n\n\n## enum HTMLWhitespaceSensitivity 🔹 <a id=\"projen-javascript-htmlwhitespacesensitivity\"></a>\n\n\n\nName | Description\n-----|-----\n**CSS** 🔹|Respect the default value of CSS display property.\n**IGNORE** 🔹|Whitespaces are considered insignificant.\n**STRICT** 🔹|Whitespaces are considered significant.\n\n\n## enum NodePackageManager 🔹 <a id=\"projen-javascript-nodepackagemanager\"></a>\n\nThe node package manager to use.\n\nName | Description\n-----|-----\n**YARN** 🔹|Use `yarn` as the package manager.\n**NPM** 🔹|Use `npm` as the package manager.\n**PNPM** 🔹|Use `pnpm` as the package manager.\n\n\n## enum NpmAccess 🔹 <a id=\"projen-javascript-npmaccess\"></a>\n\nNpm package access level.\n\nName | Description\n-----|-----\n**PUBLIC** 🔹|Package is public.\n**RESTRICTED** 🔹|Package can only be accessed with credentials.\n\n\n## enum ProseWrap 🔹 <a id=\"projen-javascript-prosewrap\"></a>\n\n\n\nName | Description\n-----|-----\n**ALWAYS** 🔹|Wrap prose if it exceeds the print width.\n**NEVER** 🔹|Do not wrap prose.\n**PRESERVE** 🔹|Wrap prose as-is.\n\n\n## enum QuoteProps 🔹 <a id=\"projen-javascript-quoteprops\"></a>\n\n\n\nName | Description\n-----|-----\n**ASNEEDED** 🔹|Only add quotes around object properties where required.\n**CONSISTENT** 🔹|If at least one property in an object requires quotes, quote all properties.\n**PRESERVE** 🔹|Respect the input use of quotes in object properties.\n\n\n## enum TrailingComma 🔹 <a id=\"projen-javascript-trailingcomma\"></a>\n\n\n\nName | Description\n-----|-----\n**ALL** 🔹|Trailing commas wherever possible (including function arguments).\n**ES5** 🔹|Trailing commas where valid in ES5 (objects, arrays, etc.).\n**NONE** 🔹|No trailing commas.\n\n\n## enum TypeScriptJsxMode 🔹 <a id=\"projen-javascript-typescriptjsxmode\"></a>\n\nDetermines how JSX should get transformed into valid JavaScript.\n\nName | Description\n-----|-----\n**PRESERVE** 🔹|Keeps the JSX as part of the output to be further consumed by another transform step (e.g. Babel).\n**REACT** 🔹|Converts JSX syntax into React.createElement, does not need to go through a JSX transformation before use, and the output will have a .js file extension.\n**REACT_NATIVE** 🔹|Keeps all JSX like 'preserve' mode, but output will have a .js extension.\n**REACT_JSX** 🔹|Passes `key` separately from props and always passes `children` as props (since React 17).\n**REACT_JSXDEV** 🔹|Same as `REACT_JSX` with additional debug data.\n\n\n## enum TypeScriptModuleResolution 🔹 <a id=\"projen-javascript-typescriptmoduleresolution\"></a>\n\nDetermines how modules get resolved.\n\nName | Description\n-----|-----\n**CLASSIC** 🔹|TypeScript's former default resolution strategy.\n**NODE** 🔹|Resolution strategy which attempts to mimic the Node.js module resolution strategy at runtime.\n\n\n## enum Console 🔹 <a id=\"projen-vscode-console\"></a>\n\nControls where to launch the debug target Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n\nName | Description\n-----|-----\n**INTERNAL_CONSOLE** 🔹|\n**INTEGRATED_TERMINAL** 🔹|\n**EXTERNAL_TERMINAL** 🔹|\n\n\n## enum InternalConsoleOptions 🔹 <a id=\"projen-vscode-internalconsoleoptions\"></a>\n\nControls the visibility of the VSCode Debug Console panel during a debugging session Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes.\n\nName | Description\n-----|-----\n**NEVER_OPEN** 🔹|\n**OPEN_ON_FIRST_SESSION_START** 🔹|\n**OPEN_ON_SESSION_START** 🔹|\n\n\n"
  },
  {
    "path": "docs/awscdk-apps.md",
    "content": "# AWS CDK Applications\n\nProject types: `awscdk-app-java`, `awscdk-app-py`, `awscdk-app-ts`.\n\n## Deployment (NOT IMPLEMENTED YET)\n\nCDK application projects produce complete cloud applications. When a commit is\nmerged into the default branch, the app is rolled out by the release workflow to\nAWS environments.\n\n## Dev Stage (NOT IMPLEMENTED YET)\n\nEvery app includes an instance of the application stage which can be deployed to\na development AWS account. This allows each developer to use their AWS account\nas part of their development environment.\n"
  },
  {
    "path": "docs/awscdk-construct.md",
    "content": "# AWS CDK Construct Library\n\nAWS CDK library projects produce artifacts with reusable constructs which can be\nconsumed by other AWS CDK libraries or apps. Library artifacts are published to\nprivate or public package managers under a semantic version.\n\nBy default, for every commit to the default branch, a new version is released\n(trunk-based development). This includes the following steps:\n\n1. Compile, lint and test the code.\n1. Use [JSII](https://github.com/aws/jsii) to produce library artifacts for all\n   target languages.\n1. Determine the next minor/patch version based on [conventional\n   commits](https://www.conventionalcommits.org). Major versions must be\n   explicitly bumped to protect consumers against breaking changes.\n1. A changelog entry is generated based on commit history.\n1. Packages are published to all target package managers.\n\n## Getting Started\n\nStart like all projen projects:\n\n```sh\nnpx projen new awscdk-construct\n```\n\nReview the resulting .projenrc.js file and make changes as needed. The following are some specific areas\nyou may want to set explicitly.\n\n## Module Metadata\n\nThese fields are your basic Node module setup:\n\n```typescript\nauthorAddress: 'benisrae@amazon.com',\nauthorName: 'Elad Ben-Israel',\ndescription: 'Watching your CDK apps since 2019',\nname: 'cdk-watchful',\nlicense: 'MIT',\nrepository: 'https://github.com/eladb/cdk-watchful.git',\nkeywords: ['cloudwatch', 'monitoring']\n```\n\nAll are pretty standard setup and nothing CDK-specific at this point. The `keywords` automatically gets 'cdk' so you don't\nneed to specify it.\n\n## Dependencies\n\n### Depending on AWS CDK modules\n\nNext are getting CDK dependencies added:\n\n```typescript\ncdkVersion: '1.67.0',\ncdkDependencies: ['@aws-cdk/aws-ec2'],\ncdkTestDependencies: ['@aws-cdk/assert'],\n```\n\n`cdkDependencies` will add both dependencies and peerDependencies to your package.json file with a caret semver\nrequirement (e.g. `^1.67.0`). CDK dependencies must be both direct and peer dependencies,\nsee [this issue](https://github.com/aws/aws-cdk/issues/5064). You can set `cdkVersionPinning` to `true` to use a fixed\nversion, but this means that any consumer of your library will have to use this exact CDK version.\nLikewise, `cdkTestDependencies` will add dependencies to the `devDependencies`.\n\nAdditionally, you can add CDK dependencies using the methods:\n\n```typescript\nproject.addCdkDependencies('aws-cdk/aws-sqs', 'aws-cdk/aws-sns');\nproject.addCdkTestDependencies('aws-cdk/something-else');\n```\n\n> The `@aws-cdk/assert` library is already added to the `cdkTestDependencies` for you.\n\n### Depending on other modules\n\nIf your library consumes other jsii modules, you should declare them thorugh the `deps` or `peerDeps` options. `deps` should be used if\ntypes from the consumed module is _not_ part of the public API of the library (the module is used as an implementation detail),\nwhile `peerDeps` _must_ be used if types from the consumed module are exported as part of your library's API. You can read more\n[here](https://github.com/aws/jsii/blob/master/docs/configuration.md#dependency-considerations).\n\n```ts\ndeps: [ 'cdk-time-bomb' ]\n```\n\nA [dependabot](https://dependabot.com/) file will be added unless `dependabot` is set to 'false'.\n\n## Publishing\n\nAs this is a [jsii project](./jsii.md), it will cross-compile to other languages.  You can set up\nany number of jsii target languages.\n\n```typescript\n  dotnet: {\n    dotNetNamespace: 'Acme.HelloNamespace',\n    packageId: 'Acme.HelloPackage'\n  },\n  java: {\n    javaPackage: 'com.acme.hello',\n    mavenArtifactId: 'hello-jsii',\n    mavenGroupId: 'com.acme.hello'\n    serverId: 'github',\n    repositoryUrl: 'https://maven.pkg.github.com/example/hello-jsii',\n  },\n  python: {\n    distName: 'acme.hello-jsii',\n    module: 'acme.hello_jsii'\n  },\n```\n\n[jsii-release](https://github.com/aws/jsii-release) is used for publishing, and requires uploading [Github project secrets](https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets) based on the repositories you wish to publish to:\n\n* npm - `NPM_TOKEN` ([docs](https://github.com/aws/jsii-release#npm))\n* .NET - `NUGET_API_KEY` ([docs](https://github.com/aws/jsii-release#nuget))\n* Java: `MAVEN_GPG_PRIVATE_KEY`, `MAVEN_GPG_PRIVATE_KEY_PASSPHRASE`, `MAVEN_PASSWORD`, `MAVEN_USERNAME`, `MAVEN_STAGING_PROFILE_ID` ([docs](https://github.com/aws/jsii-release#maven))\n* Python: `TWINE_USERNAME`, `TWINE_PASSWORD` ([docs](https://github.com/aws/jsii-release#pypi))\n  \nFor help in getting these secrets for your project, read the [jsii-release](https://github.com/aws/jsii-release).\n  \nIf you don't want to publish a particular package, do not include the `dotnet`, `java`, or `python` field.\n\n## Workflows\n\nTwo workflows will be created as Github Actions:\n\n* The Build workflow - controlled by the `buildWorkflow` field. On a 'pull_request' or 'workflow_dispatch' the library\nwill be built and checked for anti-tamper (ensure no manual changes to generated files).\n* The Release workflow - controlled by the `releaseWorkflow` field. On a push to `main` (overridden at\n `props.defaultReleaseBranch`) the library is built, anti-tampered, version bumped with a commit, pushed back to git,\n and then published to the configured artifact repositories (e.g. npm, pypi).\n\n## Tasks\n\nThere are a number of package scripts that are created for you. Any of them can be overwritten using the `addScript*`\nmethods.\n\nscript|description\n---|---\nstart|starts an interactive command menu\nprojen|regenerates the projen config. Run this if you edit .projenrc.js\nno-changes|a helper script to prevent unnecessary releases.\nbump|bumps the package version number\nrelease|bumps the library's version and pushes to origin\nprojen:upgrade|upgrades the projen cli tool\ncompile|builds the library and generates docs\nwatch|compiles and then re-compiles of further changes\npackage|runs jsii-pacmak to package your library for publishing\ntest|compiles and runs automated tests\ntest:watch|watches for file changes, re-compiles and re-tests\ntest:update|update any test snapshots\neslint|runs eslint against all `src` and `test` .ts files\ncompat|checks for jsii compatibility. See [here](https://github.com/aws/jsii/tree/master/packages/jsii-diff) for more info.\ndocgen|generate documentation\n\nAs you develop your library you'll likely be using the `test:watch` command the most.\n\n## API Documentation\n\nDocs will be generated from [Typescript comments](https://typedoc.org/guides/doccomments/) and saved in the `API.md` file.\nPlease review this file regularly and document your constructs liberally.\n\n## Project structure\n\n```\n.\n|--lib/ (build output)\n|--src/\n   |--main.ts\n|--test/\n   |--main.test.ts\n```\n\nSource .ts files should reside in the `src` directory. Constructs should be exported from the main.ts file.\nCompiled files will be put in the `lib` directory. Tests are in the `test` directory. If you need additional\nresources that are packaged with your library, add those to a `resources` directory that is besides the `src` directory\nand modify your references accordingly:\n\n```typescript\nconst thing = require('../resources/some-resource.json')\n```\n\n## Migrating existing projects\n\nYour existing CDK constructs likely have a different file structure than what this projen project expects. Projen projects\nare highly opinionated. There are a few expectations of this project you should modify your existing library to conform to:\n\n* All .ts files are expected to be in the `src/` directory. Existing constructs should all be moved there. However,\nyou can override this directory by setting `srcdir`.\n* Compiled .js and .d.ts files will go into the `lib/` directory. This directory will be removed and rebuilt each build.\nDo not store source .ts files in your `lib/` or 'libdir'.\n* The entrypoint file for all constructs should be `src/main.ts`. If your existing library is not in the main.ts file,\nyou can add the following to export it:\n\n```typescript\nexport * from './our-s3-bucket'\n```\n"
  },
  {
    "path": "docs/awscdk.md",
    "content": "# AWS Cloud Projects\n\nWe support two types of projects for cloud development powered by the AWS Cloud\nDevelopment Kit (AWS CDK): **apps** and **libraries**. Apps represent complete\ncloud applications while libraries vend constructs which can be consumed by\nother libraries or by apps. Libraries are published to public or internal\npackage managers (npm, PyPI, Maven, NuGet, etc) while apps are deployed into AWS\nenvironments.\n\nThis section describes features that are available in both cloud libraries and\napplications. See [AWS CDK Construct Library](./awscdk-construct.md) and [AWS\nCDK Applications](./awscdk-apps.md) for specific details about libraries and\napplications.\n\n## AWS Lambda Functions\n\nAWS Lambda is a serverless compute platform which executes short running code\nwithin a managed runtime environment.\n\nTo define AWS Lambda functions, create a file with a `.lambda.ts` suffix under\nthe source tree with AWS Lambda handler code.\n\nFor example, say we create `src/resize-image.lambda.ts` with the following\ncontent:\n\n```ts\nexport async function handler(event: any) {\n  console.log('I am resizing the image now!');\n}\n```\n\nNow run:\n\n```sh\n$ npx projen\n```\n\nYou'll notice that a new file `src/resize-image-function.ts` has been added to\nyour project. This is a generated source file which exports a construct named\n`ResizeImageFunction`. This construct is a subclass of\n`@aws-cdk/aws-lambda.Function`, bound to your specific handler. This means that\nyou don't need to specify neither the `code` nor the `runtime` options when you\nadd it to your app:\n\n```ts\nimport { ResizeImageFunction } from './resize-image-function.ts';\n\nconst handler = new ResizeImageFunction(this, 'ResizeImageFunction', {\n  env: {\n    FOO: '1234',\n  },\n\n  // all lambda options are supported...\n});\n```\n\nUnder the hood, we also added a compilation task to your project which creates a\n.zip bundle for each handler. This bundle is created with\n[esbuild](https://github.com/evanw/esbuild) and includes only your handler code\nand all of its dependencies. This means that you can freely install and use any\ndependencies in your project and use them in your handlers. You can manually\nbundle your handler by executing the `bundle:HANDLER` or `bundle:watch:HANDLER`\ntasks.\n\nTo customize this behavior for all functions, use `lambdaOptions` at the project\nlevel. For example:\n\n```ts\nconst { awscdk } = require('projen');\n\nnew AwsCdkConstructLibrary({\n  // ...\n  lambdaOptions: {\n    // target node.js runtime\n    runtime: awscdk.LambdaRuntime.NODEJS_14_X,\n\n    bundlingOptions: {\n      // list of node modules to exclude from the bundle\n      externals: [ 'aws-sdk' ],\n      sourcemap: true,\n    }\n  }\n});\n```\n\nYou can also disable auto-discovery by setting `lambdaAutoDiscover` to\n`false` and then create explicitly add a `awscdk.LambdaFunction` component for\neach function in your project. This will allow you to perform more\ncustomizations as needed.\n\n```ts\nconst { awscdk } = require('projen');\n\nconst p = new AwsCdkTypeScriptApp({\n  lambdaAutoDiscover: false\n});\n\nnew awscdk.LambdaFunction(p, {\n  entrypoint: 'src/foo.lambda.ts', // .lambda.ts extension is still required\n  runtime: aws_lambda.Runtime.NODEJS_12_X,\n});\n```\n\n## AWS Lambda Extensions\n\nAn AWS [Lambda Extension][lambda-extensions-blog] is a way to integrate your\npreferred development, monitoring, observability, and governance tools with\nAWS Lambda.\n\nFunctionally, AWS [Lambda Extensions][lambda-extensions-blog] are long-running\nexecutable files that reside in the `extensions` subdirectory of your code\nasset. AWS Lambda executes all extensions before starting your handler's main\nprocess. These AWS Lambda Extensions interact with your function's main process\nand the [Lambda Extension API][lambda-extensions-api] to integrate with tools\noutside the Lambda environment. Projen helps with bundling and preparing your\ncode as reusable Lambda Layers.\n\n[lambda-extensions-blog]: https://aws.amazon.com/blogs/aws/getting-started-with-using-your-favorite-operational-tools-on-aws-lambda-extensions-are-now-generally-available/\n[lambda-extensions-api]: https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html\n\nTo create an AWS Lambda Extension with Projen:\n\n- Create a file in your project's source tree called\n  `my-extension.lambda-extension.ts`\n- Run `npx projen`\n- Projen will automatically discover this file, generating an AWS Lambda Layer\n  Version named `MyExtensionLayerVersion` in a file named\n  `my-extension-layer-version.ts`.\n- Now you can instantiate `MyExtensionLayerVersion` and add it to your Lambda\n  functions.\n\nOffical AWS extension examples are available in the [AWS Samples][ext-samples]\nrepository.\n\n[ext-samples]: https://github.com/aws-samples/aws-lambda-extensions\n\n**Example of an extension:**\n\nA skeleton for a Lambda extension follows below. Comments with `TODO` describe\nlocations where you can provide your custom functionality.\n\n```ts\n#!/usr/bin/env node\n// ^ Don't forget this shebang - Lambda executes the bundled version of this\n// file directly and doesn't otherwise know it's a node script.\n\nimport { basename } from 'path';\n\n// This example uses the `got` HTTP client and assumes that you have included\n// `got` in your `devDependencies`. But, you can use any HTTP client you like.\nimport got from 'got';\n\n/**\n * Your Lambda Extension's main loop\n */\nasync function main() {\n  const extensionInfo = await registerExtension([\n    ExtensionEventType.SHUTDOWN,\n    ExtensionEventType.INVOKE,\n  ]);\n\n  // TODO: Put your initialization code here. You can do things like\n  // testing a connection to your external tooling here.\n\n  while (true) {\n    const event = await getNextEvent(extensionInfo.extensionId);\n\n    switch (event.eventType) {\n      case ExtensionEventType.SHUTDOWN:\n        // TODO: Do something when the lambda extension is being\n        // shut down. You might do things here like de-registering\n        // your extension from your external tooling.\n        return 0;\n\n      case ExtensionEventType.INVOKE:\n        // TODO: Do something every time your function is invoked,\n        // such as re-establishing a connection with your external\n        // tooling after the Lambda has thawed from a period of\n        // freezing due to inactivity.\n        break;\n\n      default:\n        console.log(`Unhandled event type ${event.eventType}`);\n    }\n  }\n}\n\nconst EXTENSION_API_BASE_URL = `http://${process.env.AWS_LAMBDA_RUNTIME_API}/2020-01-01/extension`;\n\nenum ExtensionEventType {\n  INVOKE = 'INVOKE',\n  SHUTDOWN = 'SHUTDOWN',\n}\n\ninterface ExtensionEvent {\n  readonly eventType: ExtensionEventType;\n  // For complete event structures, see:\n  // https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html\n}\n\nasync function registerExtension(events: ExtensionEventType[]) {\n  // Do not set a timeout on the GET call, as the extension can be suspended\n  // for a period of time until there is an event to return.\n  const res = await got.post(`${EXTENSION_API_BASE_URL}/register`, {\n    json: { events },\n    headers: {\n      'Lambda-Extension-Name': basename(__filename),\n    },\n  });\n\n  const header = res.headers['lambda-extension-identifier'];\n  const extensionId = Array.isArray(header) ? header[0] : header;\n  const json = JSON.parse(res.body);\n\n  return {\n    extensionId,\n    functionName: json.functionName as string,\n    functionVersion: json.functionVersion as string,\n  };\n}\n\nfunction getNextEvent(extensionId: string): Promise<ExtensionEvent> {\n  return got(`${EXTENSION_API_BASE_URL}/event/next`, {\n    headers: {\n      'Lambda-Extension-Identifier': extensionId,\n    },\n  }).json();\n}\n\nmain()\n  .then(statusCode => {\n    process.exit(statusCode);\n  })\n  .catch(e => {\n    console.error(e);\n    process.exit(1);\n  });\n```\n\n## Integration Snapshot Tests\n\nFiles in the `test/` tree with the `.integ.ts` suffix are recognized as\n*integration snapshot tests*.\n\nEach test is a simple CDK app (e.g. calls `app.synth()`) which exercises certain\nconstruct(s) within the project. A test is considered passing if the app can be\nsuccessfully deployed.\n\nTo create/update the snapshot, developers are expected to execute the task\n`integ:NAME:deploy` with AWS credentials for their personal development\nenvironment. This task will deploy the test app to their account. Upon\nsuccessful deployment (i.e. the test passed), the snapshot will be captured and\nstored under a directory called `xxx.integ.snapshot` next to the test\nentrypoint. This directory should be committed to the repository.\n\nDuring builds (either local or within a workflow), the task `integ:NAME:assert`\nwill be executed. This task synthesizes the test app and compares the output to\nthe captured snapshot. The build will fail if the output differs.\n\nFor each integration test, the following set of tasks are created:\n\n|Task|Description|\n|----|-----------|\n|`integ:NAME:deploy`|Deploys & destroys the test app and updates the snapshot.|\n|`integ:NAME:assert`|Synthesizes the test app and compares it with the snapshot (this is the task that runs during build)|\n|`integ:NAME:snapshot`|Synthesizes the test app and updates the snapshot (not recommended to use because it bypasses deployment).|\n|`integ:NAME:destroy`|Destroys a previously deployed test app.|\n\n### Writing test assertions\n\nYou can write your test assertions as AWS Lambda handlers and use the AWS CDK\n[triggers][cdk-trigger-docs] module to execute them as part of the deployment.\n\nHere is an example of a test:\n\n```ts\nimport { App,Stack } from '@aws-cdk/core';\nimport { Trigger } from '@aws-cdk/triggers';\nimport { ConstructUnderTest } from '../src';\nimport { AssertSomeStuffFunction } from './assert-some-stuff-function.ts'; // <-- generated\n\nconst app = new App();\nconst stack = new Stack(app, 'Test');\n\n// this is the construct we want to test\nconst testee = new ConstructUnderTest(stack, 'ConstructUnderTest');\n\n// execute a lambda handler with some assertions after all testee\n// resources are created\nnew Trigger(stack, 'RunAssertions', {\n  executeAfter: [testee],\n  handler: new AssertSomeStuffFunction(stack, 'AssertSomeStuffFunction', {\n    env: {\n      URL: testee.url // <-- some reference to the created construct\n    }\n  }),\n});\n```\n\n[cdk-trigger-docs]:https://docs.aws.amazon.com/cdk/api/v1/docs/triggers-readme.html\n\n## Watch\n\n> Only relevant for app projects\n\nThe `watch` command will use [cdk watch] in order to trigger deployments (with\nopportunistic hot-swapping) when source files or asset bundles are updated.\n`cdk.json` will automatically be configured to watch both source code changes\nand bundles, and rebuild bundles as needed.\n\n[cdk watch]: https://aws.amazon.com/blogs/developer/increasing-development-speed-with-cdk-watch/\n\nTo start watching, set up your environment with AWS credentials and `AWS_REGION`\npointing to your development AWS account and execute:\n\n```sh\nnpx projen watch\n```\n\nThis will:\n\n* Bundle your assets (if you have any).\n* Perform an initial deployment of your app into your development environment.\n* Start watching for changes.\n\nIf you change a source file in your project, this change will be picked up by\n`cdk watch`, assets will be re-bundled and a hotswap deployment will be\nperformed. For example, if you only change some AWS Lambda code, the CDK CLI\nwill simply update the AWS Lambda service with the location of your new code\nbundle instead of going through an AWS CloudFormation deployment.\n\n## Roadmap\n\n* Additional bundling targets: web apps, ECS\n* Local execution for AWS Lambda, ECS containers, Step Functions\n* Support different provisioning engines (CloudFormation/Terraform) using Terraform L2 support\n* Generate types for strong-typing AWS Lambda/ECS environment bindings.\n"
  },
  {
    "path": "docs/build.md",
    "content": "# Build\n\nProjen defines a standard way for building software through a fixed set of\n*build phases*. This is implemented via a set of [tasks](./tasks.md) defined in\nthe `Project` base class.\n\nThe `build` task spawns a set of sub-tasks which represent the various build phases:\n\n* `default` - this task is responsible to execute your projenrc and synthesize all project files.\n* `pre-compile` - runs before compilation (eg. bundle assets)\n* `compile` - compile your code (if needed)\n* `post-compile` - runs immediately after a successful compilation\n* `test` - runs tests\n* `package` - creates a distribution package\n\nTo extend the build process, components and projects can use\n`project.projectBuild.xxxTask` and interact with the `Task` object (i.e.\n`project.projectBuild.postCompileTask.exec(\"echo hi\")` will execute `echo hi` after\ncompilation).\n\n> NOTE: the `build` task is locked. This means that any attempt to extend it\n> (i.e. call `spawn`, `exec`, `reset`, etc) will throw an exception. Instead of\n> extending `build`, just extend one of the phases. This ensures that phases are\n> always executed in the right order.\n\n## Build Workflow\n\nThe `build` workflow is responsible to build your project when a pull request is\nsubmitted against it.\n\n### Self-mutation\n\nProjen synthesizes files that are part of your source repository. This means\nthat when you change you projenrc file, and execute `projen`, other files in\nyour repo may change as a result.\n\nThis is also relevant in other situations where your build process _mutates_\nyour repository. For example, if you use **snapshot testing**, your repository\nincludes snapshots which represent expected test results. When your code\nchanges, you will likely need to update those snapshots as well.\n\nTo ensure that a pull request branch always represent the final state of the\nrepository, you can enable the `mutableBuild` option in your project\nconfiguration (currently only supported for projects derived from\n`NodeProject`).\n\nWhen enabled, the PR build workflow (also called `build`) will push any modified\nfiles to the PR branch after a successful build, so that the branch will always\nreflect the most up-to-date version of all generated files.\n\n> This feature does not work for forks since it is impossible to safely push\n> changes to a fork from a PR build. If a PR is created from a fork of the\n> repository and there are build mutations, the PR build will fail (indicating\n> that it cannot push to the fork). To fix this, the branch needs to be updated\n> (same behavior as if mutable builds was disabled).\n"
  },
  {
    "path": "docs/bundling.md",
    "content": "# Bundling\n\nThe `Bundler` component (for Node.js projects) can be used to produce JavaScript\nbundles from source files.\n\nIt is included by default in all projects derived from `NodeProject`.\n\nTo customize, use `bundlerOptions`:\n\n```ts\nconst project = new NodeProject({\n  esbuildVersion: '^0.13.13', // default to \"latest\"\n  assetsDir: 'resources', // defaults to \"assets\"\n});\n```\n\nTo add bundles, call `bundler.addBundle()`:\n\n```ts\nproject.bundler.addBundle('name-of-bundle', {\n  entrypoint: 'src/foo.ts',\n  target: 'node14',\n  platform: 'node',\n  bundlingOptions: {\n    externals: ['aws-sdk'], // modules not to include in bundles\n    sourcemap: true, // default is false\n    watchTask: false, // should we create a \"bundle:watch\" task for each bundle\n  }\n});\n```\n"
  },
  {
    "path": "docs/cdk8s.md",
    "content": "# CDK8s Projects\n\nWe support two types of projects for Kubernetes powered by the CDK8s:\n**apps** and **libraries**. Apps represent complete Kubernetes applications\nwhile libraries vend constructs which can be consumed by other libraries or\nby apps. Libraries are published to public or internal package managers (npm,\nPyPI, Maven, NuGet, etc) while apps are deployed into Kubernetes clusters.\n\nThis section describes features that are available in both CDK8s libraries and\napplications.\n\n## Integration Snapshot Tests\n\nFiles in the `test/` tree with the `.integ.ts` suffix are recognized as\n*integration snapshot tests*.\n\nEach test is a simple CDK8s app which exercises certain construct(s) within\nthe project. A test is considered passing if the app can be successfully\ndeployed.\n\nTo create/update the snapshot, developers are expected to execute the task\n`integ:NAME:deploy` with a kubectl configuration for their personal development\nenvironment, such as K3s, Microk8s, Kind, Rancher Desktop, or otherwise. This\ntask will deploy the test app by applying it with kubectl. Upon successful\ndeployment (i.e. the test passed), the snapshot will be captured and stored\nunder a directory called `xxx.integ.snapshot` next to the test entrypoint. This\ndirectory should be committed to the repository.\n\nDuring builds (either local or within a workflow), the task `integ:NAME:assert`\nwill be executed. This task synthesizes the test app and compares the output to\nthe captured snapshot. The build will fail if the output differs.\n\nFor each integration test, the following set of tasks are created:\n\n|Task|Description|\n|----|-----------|\n|`integ:NAME:deploy`|Deploys the test app and updates the snapshot.|\n|`integ:NAME:assert`|Synthesizes the test app and compares it with the snapshot (this is the task that runs during build)|\n|`integ:NAME:snapshot`|Synthesizes the test app and updates the snapshot (not recommended to use because it bypasses deployment).|"
  },
  {
    "path": "docs/circleci.md",
    "content": "# CircleCi\n\nCircleCi uses `.circleci/config.yml` to specify the configuration of a pipeline. \nConfiguration reference can be found [here](https://circleci.com/docs/2.0/configuration-reference).\n\nInitial configuration can be created through options of [CircleCiProps](src/circleci/model.ts).\nAdditionally, you can add workflows or orbs later to your pipeline.\nFor full configuration example checkout [Circleci Tests](test/cirlceci/circleci.test.ts)\n\n```js\nconst { circleci, typescript } = require('projen');\n\nconst project = new typescript.TypeScriptProject({\n    name: 'projen-example',\n    defaultReleaseBranch: 'main',\n});\n\nconst c = new circleci.Circleci(project, {\n    orbs: {\n        node: 'circleci/node@5.0.1',\n    },\n    jobs: [\n        {\n            identifier: \"release\",\n            resourceClass: circleci.ResourceClass.SMALL,\n            docker: [{\n                image: \"cimg/node:lts\"\n            }],\n            steps: [\n                \"checkout\",\n                {run: {command: \"npx semantic-release\"}},\n            ]\n        },\n        {\n            identifier: 'integ-test',\n            docker: [{\n                image: \"cimg/golang:lts\"\n            }],\n            steps: [\n                \"checkout\",\n                {\n                    \"go/test\": {\n                        covermode: \"atomic\",\n                        failfast: true,\n                        race: true,\n                    },\n                }\n            ]\n        }\n    ],\n    workflows: [\n        {\n            identifier: 'build',\n            jobs: [\n                {\n                    identifier: 'node/test',\n                    orbParameters: {\n                        \"test-results-for\": \"jest\"\n                    }\n                },\n                {\n                    identifier: \"release\",\n                    filters: circleci.FilterMainBranchOnly,\n                }\n            ],\n        },\n    ],\n});\nc.addOrb(\"go\", \"circleci/go@1.7.1\")\nc.addWorkflow({\n    identifier: 'nightly',\n    triggers: [\n        {\n            schedule: {\n                cron: '0 0 * * *',\n                filters: circleci.FilterMainBranchOnly,\n            }\n        }\n    ],\n    jobs: [\n        {\n            identifier: 'integ-test'\n        }\n    ]\n})\nproject.synth();\n```\n"
  },
  {
    "path": "docs/components.md",
    "content": "# Components\n\nComponents are building blocks that can be composed together into projects. They\nrepresent a self-contained project feature.\n\nWhen a component is created, it is associated with a specific project:\n\n```ts\nconst p = new Project(...);\n\nnew MyComponent(p);\nnew YourComponent(p, { /* options */ });\n```\n\nProjects can be queried for which components have been added to them:\n\n```ts\nfor (const c of p.components) {\n  // do something with `component`\n}\n```\n"
  },
  {
    "path": "docs/deps.md",
    "content": "# Dependencies\n\nDependencies are an intrinsic part of every software project.\n\nThe `Dependencies` component is responsible to track the list of dependencies a\nproject has, and then used by project types as the model for rendering\nproject-specific dependency manifests such as the dependencies section\n`package.json` files.\n\nTo add a dependency you can use a project-type specific API such as\n`nodeProject.addDeps()` or use the generic API of `project.deps`:\n\n```ts\nproject.deps.addDependency(dep, type);\n```\n\nBy default, `npx projen` will automatically install dependencies in your\nproject if they are not already installed.\n\n## Semantic Requirements\n\nThe first argument (`dep`) is a string in the form `MODULE[@VERSION]` where\n`MODULE` is the package-manager specific name of the dependency (i.e. for node\nprojects, this is the npm module name) and `VERSION` is an optional [semantic\nversion] requirement (e.g. `@^7`).\n\n## Dependency Types\n\nThe second argument (`type`) defines the dependency type and is one of:\n\n- `DependencyType.RUNTIME`: The dependency is required for the program/library during runtime.\n- `DependencyType.PEER`: The dependency is required at runtime but only a single\n  copy of the module must exist in the dependency closure of the consumer. In\n  most package managers (PyPI, NuGet, Maven) there is no difference between\n  runtime and peer dependencies (since all dependencies are installed as peers),\n  but in npm, this is an important distinction. Prior to npm@7, peer\n  dependencies must be installed explicitly by consumers.\n- `DependencyType.BUNDLED`: A runtime dependency that is bundled and shipped\n  with the module, so consumers are not required to install it.\n- `DependencyType.BUILD`: The dependency is required to run the `build` task.\n- `DependencyType.TEST`: The dependency is required to run the `test` task.\n- `DependencyType.DEVENV`: The dependency is required for development (e.g. IDE plugins).\n\n[semantic version]: https://semver.org\n\n## Overriding Dependency Specifications\n\nIf a dependency is added multiple times, the last specification will prevail.\nThis allows you to override dependency specs added by projects or components.\n\nFor example, if you wish to change the version of the TypeScript compiler used\nin TypeScript projects:\n\n```ts\nconst { typescript } = require('projen');\n\nconst project = new typescript.TypeScriptProject({ \n  /* ... */ \n});\nproject.addDevDeps('typescript@^5');\nproject.synth();\n```\n"
  },
  {
    "path": "docs/eject.md",
    "content": "# Ejecting\n\nTo stop from using projen to manage your project configuration,\nyou can `eject` at any time and continue to manage your configuration manually.\n\nRunning `projen eject` will do the following:\n\n- uninstall projen as a project dependency\n- change projen-managed files from readonly to user-writeable\n- remove \"Generated by projen\" markers from projen-generated files\n- remove projen metadata files\n- remove the projen synthesis step from the `build` task\n- remove the `default` and `eject` tasks\n- \"backup\" projenrc files to `.projenrc.xyz.bak`\n- a separate task runner file is added to the root directory (see Tasks below\n  for more information)\n\nYou do not need to ever use `eject`, but the option is available if the means of\ncustomization provided by projen are no longer suitable your project.\n\n## Tasks\n\nA script will be added to your project so that you can continue using existing\ntasks by running `scripts/run-task <task>` in your command line (or running `npm\nrun <task>` in node-based projects) if you so choose. You must retain the\n`tasks.json` file found in the `.projen/` folder to use the task runner.\n\n> Note: it is possible some tasks may not work after projen is ejected due to\nthe use of projen \"builtin\" steps. See\nhttps://github.com/projen/projen/issues/1563 for more information.\n"
  },
  {
    "path": "docs/escape-hatches.md",
    "content": "# Escape hatches\n\nIt's possible projen doesn't have the right high-level or low-level APIs that\nyou need for managing your project configuration. If you think there's an API\nthat would be useful, first consider checking on GitHub to see if anyone else\nhas the same problem, or consider opening an issue! But in the meantime, there\nare ways you can bypass projen's regular APIs to add special configuration code.\n\n## Overrides\n\nFor any \"object\"-based files, such as JSON, YAML, TOML, or XML, you can\noverride properties through the `addOverride`, `addDeletionOverride`,\n`addToArray` and `patch` methods accessible on file objects:\n\n```ts\n// Get the ObjectFile\nconst packageJson = project.tryFindObjectFile('package.json');\n\n// Use dot notation to address inside the object\npackageJson.addOverride('description', 'the next generation of logging!');\npackageJson.addOverride('keywords', ['experimental', 'web', 'productivity', 'exciting']);\npackageJson.addDeletionOverride('author.organization');\npackageJson.addToArray('keywords', 'logging', 'next-gen');\npackageJson.patch(JsonPatch.add('/author/name','A. Mused'));\n\n// Use array indices to override specific array elements\npackageJson.addOverride('bundledDependencies.3', 'react');\n```\n\n## Removing files\n\nYou can remove a file from the project through `tryRemoveFile` method on the\n`Project` class.\n\n```ts\nnew TextFile(project, \"hello.txt\", { lines: \"original\" });\n\nproject.tryRemoveFile(\"hello.txt\");\n\nnew TextFile(project, \"hello.txt\", { lines: \"better\" });\n```\n\n> Note: It's recommended that this used carefully since removing files may be\nunexpected for users depending on where it's used. For example, if you created a\ncomponent named `MyFancyGitIgnore` and had it remove any existing `.gitignore`\nfiles in the project, then users may be surprised when customizations for their\nexisting `.gitignore` file are nullified.\n"
  },
  {
    "path": "docs/github.md",
    "content": "# GitHub\n\nBy default, many projects are initialized with `GitHub` component to enabled GitHub as the default provider for CI/CD workflows. See https://docs.github.com/en/actions for more information.\n\nThe use of GitHub (and generating corresponding files in `.github`) can be disabled by specifying `github: false` in your project options.\n\n## GitHub API access\n\nSeveral workflows generated by projen use APIs that are not available through\nthe permissions of [GITHUB_TOKEN]. To use these workflows, you must provide\neither a Personal Access Token (PAT) or a GitHub App to provide API access.\n\n[GITHUB_TOKEN]: https://docs.github.com/en/actions/security-guides/automatic-token-authentication\n\n### Personal Access Token\n\nFollow the [GitHub docs\ninstructions](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)\nfor creating a personal access token. When creating the PAT, grant the token\n`repo`, `workflow` and `write:packages` and `admin:repo_hook` permissions.\n\nAdd the token as a secret to your repo under the name `PROJEN_GITHUB_TOKEN`.\n\n### GitHub App\n\nFollow the [GitHub docs instructions](https://docs.github.com/en/developers/apps/building-github-apps/creating-a-github-app) for creating a GitHub App. Enable read & write permission for \"Contents\" and \"Pull Request\" scopes.\n\nAdd the App ID as a secret to your repo under the name `PROJEN_APP_ID` and the private key you generate as a secret to your repo under the name `PROJEN_APP_PRIVATE_KEY`.\n\nThen, configure your projenrc file to use the GitHub app for API access:\n\n```ts\nconst { NodeProject } = require('projen/javascript');\n\nconst project = new javascript.NodeProject({\n  // ...other options\n  githubOptions: {\n    projenCredentials: github.GithubCredentials.fromApp({ ... }),\n  },\n});\n```\n\n## Workflows\n\nTODO\n\nSee the `GitHub`, `GithubWorkflow`, and `Job` types in the [API\nreference](./api/API.md) for currently available APIs.\n\nExample code of creating a GitHub workflow:\n<https://github.com/projen/projen/blob/65b4194c163f47ba4842981b0c92dbe516be787b/src/github/auto-approve.ts#L67-L105>\n\n### Stale workflow\n\nA \"stale\" workflow can be added which will automatically close issues or pull\nrequests on your GitHub repository after time has passed without the issue\nseeing any comments or updates. You can enable as shown below:\n\n```ts\n// or PythonProject, etc.\nnew typescript.TypeScriptProject({\n  stale: true,\n  staleOptions: {\n    issues: {\n      closeMessage: \"closing pull request\",\n      staleLabel: \"I-AM-STALE\",\n      daysBeforeStale: 180,\n    },\n  }\n})\n```\n\nCheck the API reference for a list of all available options.\n\nWhen enabled, by default issues with no activity with will be marked as stale\nafter 60 days and closed within 7 days, and pull requests with no activity will\nbe marked as stale after 14 days and closed within 2 days.\n"
  },
  {
    "path": "docs/gitlab.md",
    "content": "# GitLab\n\n[GitLab CI/CD](https://docs.gitlab.com/ee/ci/yaml/gitlab_ci_yaml.html) uses a `.gitlab-ci.yml` file located at the root of your repository to specify continuous integration and continuous deployment processes. GitLab CI configuration files can be split into multiple files using the [include](https://docs.gitlab.com/ee/ci/yaml/#include) fields in order to increase readability or reduce duplication of the same configuration in multiple places.\n\n## Creating a configuration\n\nWe support the creation of GitLab CI/CD Configurations through a `CiConfiguration` class and a higher level `GitlabConfiguration` and `NestedConfiguration` classes. To create a GitLab configuration you must first create a [project](./project.md) to assign the configuration to.\n\nWhen using GitLab for CI, the `.gitlab-ci.yml` is always located at the root of the project while other configuration files are located in the `.gitlab\\ci-templates\\` subdirectory.\n\n```js\nconst { typescript, gitlab } = require('projen');\nconst project = new typescript.TypeScriptProject({\n  defaultReleaseBranch: 'main',\n  name: 'my-project',\n});\nconst gitlabMain = new gitlab.GitlabConfiguration(project,\n  {\n    jobs: {\n      myJob: {\n        script: 'echo Hello',\n      },\n    },\n  });\ngitlabMain.createNestedTemplates({\n  myNestedTemplate: {\n    jobs: {\n      myOtherJob: {\n        script: 'echo World!',\n      },\n    },\n  },\n});\nproject.synth();\n```\nThis creates the following directory structure.\n\n```shell\n├── .gitlab-ci.yml\n└── .gitlab\n    └── ci-templates\n         └── mynestedtemplate.yml\n```\n\n## Updating Nested Configurations\n\nYou can modify a `NestedConfiguration` through the `nestedTemplates` property of a `GitlabConfiguration`. \n```js\nconst { typescript, gitlab } = require('projen');\nconst project = new typescript.TypeScriptProject({\n  defaultReleaseBranch: 'main',\n  name: 'my-project',\n});\nconst gitlabMain = new gitlab.GitlabConfiguration(project,\n  {\n    jobs: {\n      myJob: {\n        script: 'echo Hello',\n      },\n    },\n  });\ngitlabMain.createNestedTemplates({\n  myNestedTemplate: {},\n});\ngitlabMain.nestedTemplates.myNestedTemplate.addStages('stage');\nproject.synth();\n```"
  },
  {
    "path": "docs/java.md",
    "content": "# Java Projects\n\nTo create a new Java project, use `projen new java`:\n\n```shell\n$ projen new java --group-id org.acme --artifact-id hello-maven\n```\n\nThis will synthesize a standard Maven project directory structure with a\n`pom.xml` file and some sample code:\n\n```shell\n├── pom.xml\n└── src\n    ├── main/java/org/acme\n    │   └── Main.java\n    └── test/java/org/acme\n         └── MyTest.java\n```\n\nAt this point, you should be able to now simply run `projen build` to build your\nproject:\n\n```shell\n$ projen build\n[INFO] BUILD SUCCESS\n```\n\n> Since this is a standard Maven project, so you can also use `mvn package`,\n> `mvn test`, etc. IDEs should also feel at home with this project.\n\nThe `projen new` command will also generate a `.projenrc.js` file which includes\nthe definition of your project with any options you specified in the command\nline:\n\n```js\nconst { java } = require('projen');\n\nconst project = new java.JavaProject({\n  artifactId: 'hello-maven',\n  groupId: 'org.acme',\n  name: 'hello-maven',\n  version: '0.1.0',\n});\n\nproject.synth();\n```\n\nIt is possible to create your projenrc file in java. In the future, this will be\nthe default, but at the moment you need to add some configuration. See the\n[`projenrc.java`](#projenrcjava) section for details.\n\nTo modify your project definitions, edit `.projenrc.js` and run `projen` again\nto re-synthesize your project. The following sections describe the various features of Java projects.\n\n## Versioning\n\nYou can set the project version through the `version` options:\n\n```ts\nconst project = new java.MavenProject({\n  version: '1.2.3'\n};\n```\n\n## Project Metadata\n\nYou can specify additional metadata for your project by passing options to the\nconstructor of `MavenProject`. For example, let's add a description and a URL\nfor your project:\n\n```ts\nconst project = new java.JavaProject({\n  // ...\n\n  description: 'My first java projen project',\n  url: 'https://github.com/projen/projen'\n});\n```\n\nSee the API reference for [PomOptions](../API.md#projen-java-pomoptions) for a\ndetailed list of options.\n\n## Dependencies\n\nJava projects have three types of supported dependencies:\n\n1. Runtime dependencies (or just \"dependencies\").\n2. Test dependencies\n3. Maven plugins (modeled as build dependencies).\n\nYou can define dependencies when defining the project itself:\n\n```ts\nconst project = new JavaProject({\n  deps: [\n    'software.amazon.awscdk/core@^1.2.3',\n    'software.amazon.awscdk/aws-s3@^1',\n  ]\n});\n```\n\nOr using the APIs:\n\n```ts\nproject.addTestDependency('org.assertj/assertj-core@^3');\n```\n\nNotice the syntax for dependencies:\n\n```text\n<groupId>/<artifactId>[@version]\n```\n\nWhere `groupID` and `artifactId` are the Maven coordinates and `version` is the\n[semantic version requirement](https://semver.org) for the dependency. The\nsemver syntax will be converted to POM syntax. For example, `^3.1.0` will be\nconverted to `[3.1.0,4.0.0)`.\n\n## `projenrc.java`\n\nIt is possible to write your projenrc file in Java. In the future this will be\nthe default for Java projects, but at the moment this needs to be enabled when\nthe project is created:\n\n```shell\n$ projen new java --projenrc-java\n```\n\nOr set through:\n\n```ts\nnew java.JavaProject({\n  // ...\n  projenrcJava: true\n});\n```\n\nThen, create a file `src/test/java/projenrc.java` that looks like this:\n\n```java\nimport org.projen.java.JavaProject;\nimport org.projen.java.JavaProjectOptions;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        JavaProject project = new JavaProject(JavaProjectOptions.builder()\n            .name(\"my-app\")\n            .groupId(\"org.acme\")\n            .artifactId(\"my-app\")\n            .version(\"1.0.0\")\n            .build());\n    \n        project.synth();\n    }\n}\n```\n\nIn order to synthesize, run: `pj synth`, which will compile your test code and\nexecute this program.\n\nBy default, `projenrc.java` is placed under the `test` scope (and\n`io.github.cdklabs/projen` test dependency is added). This ensures that\napplication code does not take a dependency on projen code. You can change this\nbehavior by setting the `testScope` option to `false`.\n\n## Maven Plugins\n\nYou can add Maven build plugins to your project using `project.addPlugin()`:\n\n```ts\nproject.addPlugin('org.apache.maven.plugins/maven-compiler-plugin@3.8.1', {\n  configuration: {\n    source: '1.8',\n    target: '1.8',\n  },\n});\n```\n\n## Unit Testing with JUnit\n\nThe `JUnit` component adds support for writing Java tests with\n[JUnit](https://junit.org/). The component will add the required test\ndependencies to your POM file.\n\nTest sources are placed under `src/test` and can be executed via `mvn test` or\n`projen test` (same).\n\nTo disable JUnit tests, set `junit: false` when you define the `MavenProject`.\n\n## Packaging\n\nJava projects include definitionds for producing an output that is\nready-to-publish to Maven using tools like\n[jsii-release](https://www.npmjs.com/package/jsii-release). In future versions\nof projen we will also support auto-publishing through CI/CD.\n\nThe packaging component adds a `package` task which uses `mvn deploy` to create\na local maven directory with artifacts that can be uploaded to a Maven\nrepository such as Maven Central, CodeArtifact or GitHub Packages.\n\nBy default, packages includes *javadocs* and *sources*. Those can be disabled\nthrough `packagingOptions`.\n\n## Publishing\n\nTBD.\n\n> Publishing to Maven is still not supported output of the box. Since the\n> package output of `JavaProject` is compatible with\n> [jsii-release](https://www.npmjs.com/package/jsii-release), and we already\n> release to Maven from jsii projects, it should be possible to reuse quite a\n> lot.\n"
  },
  {
    "path": "docs/node.md",
    "content": "# Node.js Projects\n\nThis topic describes all the features of `NodeProject` projects and their\nderivatives.\n\n## Node versioning\n\nYou can specify the minimum version of node that your project supports, and the version of node used in GitHub workflows:\n\n```js\nconst project = new javascript.NodeProject({\n  // ...\n  minNodeVersion: '16.0.0',\n  workflowNodeVersion: '16.1.0', // defaults to minNodeVersion\n});\n```\n\n## Development Workflow\n\nTODO\n\n## GitHub workflows\n\nNode.js projects with GitHub enabled come bundled with components for running\nbuild workflows on every pull request, automatically upgrading dependencies, and\nother conveniences.\n\nFor more general information about managing GitHub configuration, check out\n[GitHub](./github.md).\n\n## Dependencies\n\nSee [Dependencies](#dependencies) for general information about how dependencies\nare managed by projen, and how to add new dependencies to your project. By\ndefault, every Node.js project includes a `Dependencies` component which will\nmanage the dependencies in `package.json`.\n\nWhen a dependency is managed by projen, it gets added to `package.json` and will\nautomatically installed after running `npx projen`. Packages will be installed\naccording to the package manager being used. This can be configured:\n\n```ts\nconst project = new javascript.NodeProject({\n  // ...\n  packageManager: javascript.NodePackageManager.YARN, // or NPM, PNPM, etc.\n});\n```\n\nAny dependencies without specific version ranges set (such as `react` or\n`react@*`) will given a version range in `package.json` so that future package\nupgrades and changes to the generated lockfiles such as `package-lock.json` or\n`yarn.lock` will follow semver.\n\nA list of all dependencies managed by projen is also reported in\n`.projen/deps.json`.\n\n### Dependency upgrades\n\nNode.js projects include an `upgrade` [task] and `upgrade.yml` [GitHub workflow]\nthat updates node dependencies following semver. The GitHub workflow will\nautomatically run once a day, and can also be automatically approved for\nhands-off dependency managed.\n\n> If you want to upgrade a dependency to a new **major** version (with possible\n> breaking changes), you should update its version range via the projenrc file.\n\nIn order to create these PRs, permissions to GitHub APIs are needed beyond those\nprovided by GITHUB_TOKEN, otherwise no subsequent workflows will be triggered,\nsuch as the build workflow (see [create-pull-request#48] for details). Because\nof this we require, [GitHub API access] to be provided for these workflows.\n\nIt's possible to create a separate workflow and task just for upgrading projen:\n\n```ts\nconst project = new javascript.NodeProject({\n  depsUpgrade: true,\n  depsUpgradeOptions: {\n    exclude: ['projen'],\n  },\n});\n\nnew javascript.UpgradeDependencies(project, {\n  include: ['projen'],\n  taskName: \"upgrade-projen\",\n  workflow: false, // or true\n  // workflowOptions: { ... }\n});\n```\n\nYou can also use dependabot or renovatebot to get Pull requests on dependency updates\n\n* Dependabot:\n  ```ts\n  new javascript.NodeProject({\n    depsUpgrade: false,\n    dependabot: true,\n    // dependabotOptions: { ... }\n  })\n  ```\n* Renovatebot: \n  ```ts\n  new javascript.NodeProject({\n    depsUpgrade: false,\n    renovatebot: true,\n    // renovatebotOptions: { ... }\n  })\n  ```\n\n[task]: ./tasks.md\n[GitHub workflow]: ./github.md#workflows\n[create-pull-request#48]: https://github.com/peter-evans/create-pull-request/issues/48\n[GitHub API access]: ./github.md#github-api-access\n\n## Pull Request Builds (CI)\n\nTODO\n\n## Releases (CI/CD)\n\nTODO\n\n## Features\n\n### Scoped Private Packages\n\nScoped private packages can be configured in this project and its ancestors.\n\nAll npm packages have a name. Some package names also have a scope. A scope follows the usual rules for package names (URL-safe characters, no leading dots or underscores). When used in package names, scopes are preceded by an @ symbol and followed by a slash, e.g. `@somescope/somepackagename`\n\nThis feature supports specifying options on how package managers should access packages in each of the scopes. If no options are specified, npm or yarn will try to install scoped packages from the public npm registry.\n\nCurrently, it only supports fetching packages from AWS CodeArtifact, either by directly access via credentials or by assuming a role using the specified credentials. Credentials must be provided in the CodeArtifactOptions property.\n\nMultiple scoped package options may be specified if required.\n\nexample\n```js\nconst { javascript } = require('projen');\nconst project = new javascript.NodeProject({\n  defaultReleaseBranch: 'main',\n  name: 'my-project',\n  scopedPackagesOptions: [\n      {\n          registryUrl: '<code-artifact-registry-url>',\n          scope: '@somescope',\n      }\n  ]\n});\nproject.synth();\n```"
  },
  {
    "path": "docs/programmatic-api.md",
    "content": "# Programmatic API\n\nProjen exposes a programmatic API that allows you to create new projects through\ncode instead of the regular CLI command `npx projen new`. This allows projen to\nbe used to create new projects within scripts and other contexts.\n\n## Example\n\n```js\nconst { Projects } = require('projen');\n\nProjects.createProject({\n  dir: '/path/to/mydir',\n  projectFqn: 'projen.TypeScriptProject',\n  projectOptions: {\n    name: 'my-test-project',\n    defaultReleaseBranch: 'main',\n    projenrcTs: true,\n    eslintOptions: {\n      dirs: ['src', 'test'],\n      prettier: true,\n      aliasMap: {\n        '@src': './src',\n        '@components': './src/components',\n      },\n    },\n  },\n  post: false,\n  // synth: true (default)\n  // optionHints: 'featured' (default)\n});\n```\n\nThis script creates a new TypeScript project at `/path/to/mydir` in my file\nsystem. The `.projenrc.ts` file it generates comes pre-included with options\nspecified, including complex values for fields that cannot normally be provided\nthrough the CLI, like `eslintOptions` (because the field requires an object\nvalue).\n\nIn the above example, the provided option `post: false` was also added to\ndisable post-installation steps such as installing NPM dependencies.\n\n> **Note:** It is important that you provide all fields that are required by the\nproject type, otherwise the project may not synthesize properly.\n\nIt is also possible to use this for installing external project types.\nCurrently, this requires you to install the package so that it can be used by\nprojen.\n\n```js\nProjects.createProject({\n  // ...\n  projectFqn: '@myorg/my-package.MyJsiiProject',\n});\n```\n\n"
  },
  {
    "path": "docs/publisher.md",
    "content": "# Publishing Modules\n\nThe `Publisher` component supports publishing modules to various package\nmanagers. It is designed to be attached to a GitHub workflow that takes care of\nbuilding the module and uploading a \"ready to publish\" artifact.\n\n> This component is utilized in `NodeProject` and `JsiiProject` to publish modules.\n\nSupported package managers:\n\n- npm\n- Maven\n- PyPI\n- NuGet\n- Go (GitHub)\n\nThis is how a publisher is initialized:\n\n```ts\nconst publisher = new Publisher(project, {\n  workflow: releaseWorkflow,\n  buildJobId: 'my-build-job',\n  artifactName: 'dist',\n});\n```\n\n`workflow` is a `GithubWorkflow` with at least one job (in this case named\n`my-build-job`) which is responsible to build the code and upload a GitHub\nworkflows artifact (named `dist` in this case) which will then be consumed by\nthe publishing jobs.\n\nThis component is opinionated about the subdirectory structure of the artifact:\n\n|Subdirectory|Type|Contents|\n|-|-|-|\n|`js/*.tgz`|NPM|npm tarballs\n|`dotnet/*.nupkg`|NuGet|Nuget packages\n|`python/*.whl`|PyPI|Python wheels\n|`go/**/go.mod`|Go|Go modules. Each subdirectory should have its own `go.mod` file\n|`java/**`|Maven|Maven artifacts in local repository structure\n\nThen, you should call `publishToXxx` to add publishing jobs to the workflow:\n\nFor example:\n\n```ts\npublisher.publishToNuGet();\npublisher.publishToMaven(/* options */);\n// ...\n```\n\nSee API reference for options for each target.\n\n## Customizing Publishing Jobs\n\nYou can customize the publishing jobs by specifying `prePublishSteps` which is a\nset of GitHub workflow steps to be executed before publishing. The\n`publishTools` option can be used to setup the toolchain required for the\npublishing job.\n\nFor example:\n\n```ts\npublisher.publishToNuGet({\n  publishTools: { dotnet: { version: '5.x' } },\n  prePublishSteps: [\n    { run: 'dotnet ...' }\n  ]\n});\n```\n\n## Publishing to GitHub Packages\n\nSome targets come with dynamic defaults that support GitHub Packages.\nIf the respective registry URL is detected to be GitHub, other relevant options will automatically be set to fitting values.\nIt will also ensure that the workflow token has write permissions for Packages.\n\n**npm**\n\n```ts\npublisher.publishToNpm({\n  registry: 'npm.pkg.github.com'\n  // also sets npmTokenSecret\n})\n```\n\n**Maven**\n\n```ts\npublisher.publishToMaven({\n  mavenRepositoryUrl: 'https://maven.pkg.github.com/USER/REPO'\n  // also sets mavenServerId, mavenUsername, mavenPassword\n  // disables mavenGpgPrivateKeySecret, mavenGpgPrivateKeyPassphrase, mavenStagingProfileId\n})\n```\n\n## Publishing to AWS CodeArtifact\n\nThe NPM target comes with dynamic defaults that support AWS CodeArtifact.\nIf the respective registry URL is detected to be AWS CodeArtifact, other relevant options will automatically be set to fitting values.\nThe authentication will done using [AWS CLI](https://docs.aws.amazon.com/codeartifact/latest/ug/tokens-authentication.html). It is neccessary to provide AWS IAM CLI `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` in GitHub Secrets.\n\n**npm**\n\n```ts\npublisher.publishToNpm({ \n  registry: 'my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/',\n});\n```\n\nThe names of the GitHub Secrets can be overridden if different names should be used.\n\n```ts\npublisher.publishToNpm({ \n  registry: 'my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/',\n  codeArtifactOptions: {\n    accessKeyIdSecret: 'CUSTOM_AWS_ACCESS_KEY_ID',\n    secretAccessKeySecret: 'CUSTOM_AWS_SECRET_ACCESS_KEY',\n  },\n});\n```\n\n## Handling Failures\n\nYou can instruct the publisher to create GitHub issues for publish failures:\n\n```ts\nconst publisher = new Publisher(project, {\n  workflow: releaseWorkflow,\n  buildJobId: 'my-build-job',\n  artifactName: 'dist',\n  issueOnFailure: true,\n  failureIssueLabel: 'failed-release'\n});\n```\n\nThis will create an issue labeled with the `failed-release` label for every individual failed publish task.\nFor example, if Nuget publishing failed for a specific version, it will create an issue titled *Publishing v1.0.4 to Nuget gallery failed*.\n\nThis can be helpful to keep track of failed releases as well as integrate with third-party ticketing systems by querying issues labeled with `failed-release`.\n\n## Dry run\n\nIf you wish to completely disable publishing, you can enable the `dryRun` option on\n`Publisher` or `publishDryRun` on the project.\n\nThis will cause all publishing tasks and jobs to just print the publishing\ncommand but not actually publish.\n"
  },
  {
    "path": "docs/python.md",
    "content": "# Python Projects\n\nBefore creating a new project, make sure you have the version of Python you want\nto use set up in your terminal. Running `which python` on UNIX/macOS or\n`Get-Command python` on Windows should print the path to the python version you\nwant to use.\n\nTo create a new Python project, use `projen new python`:\n\n```shell\n$ projen new python --name=my-project\n```\n\nThis will synthesize a standard project directory structure with some sample\ncode.\n\n```shell\n├── my_project\n│   ├── __init__.py\n│   ├── __main__.py\n│   └── example.py\n└── tests\n    ├── __init__.py\n    └── test_example.py\n```\n\nThe default options will setup a Python environment using `venv`, and will\ncreate a `requirements.txt` file for installing dependencies via `pip`.\n\nThe `projen new` command will also generate a `.projenrc.py` file which includes\nthe definition of your project with any options you specified in the command\nline:\n\n```python\nfrom projen.python import PythonProject\n\nproject = PythonProject(\n    author_email=\"Author email\",\n    author_name=\"Author name\",\n    module_name=\"your_python_project\",\n    name=\"project_name\",\n    version=\"0.1.0\",\n)\n\nproject.synth()\n```\n\nTo modify your project definitions, edit `.projenrc.py` and run `projen` again\nto re-synthesize your project. The following sections describe the various features of Python projects.\n\n## Managing environments, dependencies, and packaging\n\nEvery Python project must have a component for managing/installing dependencies,\na component for managing the Python virtual environment, and if it is a library,\na component for packaging the library. Some components satisfy multiple\nrequirements. See the list below:\n\n- pip: dependency manager\n- venv: environment manager\n- setuptools: packaging manager\n- poetry: dependency, environment, and packaging manager\n- pipenv (TBD): dependency and environment manager\n- conda (TBD): dependency and environment manager\n\nBy default, pip, and venv will be used, along with setuptools if the project is a library:\n\n```python\nfrom projen import ProjectType\nfrom projen.python import PythonProject\n\nproject = PythonProject(\n    ...\n    project_type=ProjectType.LIB\n)\n```\n\nBut these can be swapped out as needed by using the provided flags, for example:\n\n```python\nfrom projen.python import PythonProject\n\nproject = PythonProject(\n    ...\n    pip=False,\n    venv=False,\n    setuptools=False,\n    poetry=True\n)\n```\n\n## Dependencies\n\nPython projects have two types of supported dependencies:\n\n1. Runtime dependencies (or just \"dependencies\").\n2. Development dependencies\n\nYou can define dependencies when defining the project itself:\n\n```python\nfrom projen.python import PythonProject\n\nproject = PythonProject(\n    ...\n    deps=[\n        'Django@3.1.5',\n        'aws-cdk.core',  # implies\"@*\"\n    ],\n    dev_deps=[\n        'hypothesis@^6.0.3',\n    ]\n)\n```\n\nOr using the APIs:\n\n```python\nproject.add_dev_dependency('hypothesis@^6.0.3');\n```\n\nNotice the syntax for dependencies:\n\n```text\n<module>[@version]\n```\n\nWhere `module` is the module name and `version` is the [semantic version\nrequirement](https://semver.org) for the dependency. The semver syntax will be\nconverted to the appropriate dependency manager syntax in synthesized files. For\nexample, `lib^3.1.0` will be converted to `lib>=3.1.0, <4.0.0` in\n`requirements.txt`.\n\n### Poetry Dependencies\n\nWhen using the `poetry` project type, note the following:\n\n* Poetry requires the `python` version to be specified as a dependency e.g. `python@^3.7,<=3.9`.\n  When not specified, projen will set it to a default value of `python@^3.6`.\n* The `[@version]` part of the dependency declaration must be present for all dependencies\n* Dependencies that require additional metadata regarding extras etc. may be declared as\n  follows:\n\n  ```text\n  deps: [\n    ...\n    \"mypackage@{version = '^3.3.3', extras = ['mypackage-extra']}\",\n  ],\n  ```\n\n## Unit Testing with Pytest\n\nThe `Pytest` component adds support for writing Python tests with\n[pytest](https://pytest.org/). The component will add the required test\ndependencies to your project.\n\nTest sources are placed under `tests` and can be executed via `projen test`.\n\nTo disable pytest tests, set `pytest: false` when you define the\n`PythonProject`.\n\n## `projenrc.py`\n\n## Packaging and Publishing\n\nPython projects can be packaged by using either the `Setuptools` or `Poetry`\ncomponent. `Setuptools` records package metadata within a traditional `setup.py`\nscript, while `Poetry` stores metadata in the more-recent `pyproject.toml` file\nformat as introduced in PEP 518.\n\nRun `projen package` to generate a source distribution and wheel, and run\n`projen upload` to upload the package to PyPI.\n"
  },
  {
    "path": "docs/releases.md",
    "content": "# Releases and Versioning\n\nProjen takes care of managing versioning and releases of your project. A project starts with version `0.0.0` and the version \nis \"bumped\" automatically in every release, based on the contents of the release.\n\nThe content of the release is determined by listing all the commits since the last release and parsing them according to\n[conventional commits spec](https://www.conventionalcommits.org/en/v1.0.0/). If the release only includes `fix` commits, then\nthe new version will be a patch version. If the release includes `feat` commits, then the new version will be a minor version.\n\nIf the release includes breaking changes and the major version was not explicitly updated in projenrc (see below), the release will fail.\n\n## Major Versions\n\nEach branch is associated with a major version. By default, the major version of the default branch is `0`. \n\nTo bump the major version for the default branch, set the `majorVersion` option to the desired version and push the change.\n\nFor example:\n\n```js\nmajorVersion: 1\n```\n\nIt is possible to release the same major version to different branches by specifying a prefix that is applied to all tags for a particular branch.\n\nFor example:\n\n```js\ntagPrefix: 'stable/'\n```\n\nIt is also possible to release multiple major versions from the same branch. By adding a `!` to your commit message you can indicate a breaking change, thus triggering a major version change. If you start out with the `0` major version a breaking change in this pre-stable version will lead to the minor version increasing. You can set the `minMajorVersion` to `1` so that breaking changes increase the major version.\n\n```js\nminMajorVersion: 1\n```\n\n\n## Forcing Versions\n\nYou may be adopting projen in a project that has already been published to previous versions. Projen uses tags to determine the version to start with\nbefore bumping according to the rules previously mentioned.\n\nYou can force the base version number by adding a tag to your repo. For example, if the latest version of your project is 1.2.3, then add a tag to your trunk ('main') branch of `v1.2.3`. The next time the release workflow runs it will bump from version 1.2.3. As mentioned above, this is based on the conventional commits so on the next release you will either get 1.2.4 or 1.3.0.\n\n## Release Branches\n\nOur release model is based on [trunk-based development](https://trunkbaseddevelopment.com/). This means that commits to the default \nbranch (`main`) are considered ready for production and by default every commit will be released and published to package managers.\n\nYou can add additional release branches (e.g. for different major versions) through the `releaseBranches` option. Each release branch must\nbe associated with a different major version.\n\n```js\nreleaseBranches: {\n  '2.x': {\n    majorVersion: 2,\n  },\n  '3.x': {\n    majorVersion: 3,\n    prerelease: true,\n  },\n}\n```\n\n## Release Triggers\n\nIf the project type supports it, then you can specify a `releaseTrigger`. You can use this to control whether\nor not your releases are automated as well as any unique artifacts associated with releases such as project-level\nchangelogs.\n\n```js\nreleaseTrigger: ReleaseTrigger.scheduled({ schedule: '0 17 * * *' }),\n```\n\n### Manual Releases\n\n```js\nreleaseTrigger: ReleaseTrigger.manual(),\n```\n\nUsing manual releases disables the generation of the github release workflow and provides an extra\n`publish:git` task which is triggered as part of the `release` task. `publish:git` will manage a\nproject-level changelog, commit any changes, tag the release, and push any commits and tags to\nremote. \n"
  },
  {
    "path": "docs/subproject.md",
    "content": "# Subprojects\n\n* Pass a project to the `parent` prop\n* `outdir` must be specified in project props for a subproject\n\n## Example Subproject\n\n```js\n// .projenrc.js\n\nconst { AwsCdkTypeScriptApp, web } = require('projen');\n\nconst nextProject = new web.NextJsProject({\n  name: 'my-frontend'\n});\n\nnextProject.synth();\n\nconst pipelineProject = new AwsCdkTypeScriptApp({\n  name: 'my-frontend-pipeline',\n  parent: nextProject,\n  outdir: 'pipeline',\n\n  cdkVersion: '1.78.0',\n  cdkDependencies: [\n    '@aws-cdk/aws-cloudfront',\n    '@aws-cdk/aws-s3',\n    '@aws-cdk/aws-s3-deployment',\n    '@aws-cdk/core'\n  ]\n});\n\npipelineProject.synth();\n```\n\nBy default, GitHub workflows will not be created for subprojects since config\nfiles in `.github/` only work if they are in the root directory.\n"
  },
  {
    "path": "docs/tasks.md",
    "content": "# Tasks\n\nTasks are a project-level feature to define a project command system backed by\nshell scripts. Tasks are used to implement development workflows and are\naccessible through the projen CLI as subcommands.\n\nThe following example defines a task named \"hello\" which executes the shell\ncommand `echo hello, world!`:\n\n```js\nconst hello = project.addTask('hello');\nhello.exec('echo hello, world!');\n```\n\nRun `pj` and the task will be available in the CLI:\n\n```shell\n$ projen hello\n🤖 hello | echo hello, world!\nhello, world!\n```\n\nYou can also define some metadata and the first exec step declaratively:\n\n```js\nconst projen = require('projen');\n\nconst hello = project.addTask('hello', {\n  description: 'say hello',\n  category: projen.tasks.TaskCategory.TEST,  \n  exec: 'echo hello, world!'\n});\n```\n\n## Steps\n\nTasks can include any number of _steps_:\n\n```ts\nhello.exec('echo step number 2');\n\n// a name can be added to a step if desired\nhello.exec('echo foo bar', { name: 'print the text \"foo bar\"' });\n```\n\nThe `--inspect` option can be used to display the contents of a task:\n\n```shell\n$ projen hello --inspect\necho hello, world!\necho step number 2\necho foo bar\n```\n\nIf a step fails, the task will fail and all subsequent steps will not be\nexecuted.\n\nYou can also add steps to the beginning of a task:\n\n```ts\nconst hello = project.addTask('hello');\nhello.exec('echo hello');\nhello.prepend('echo world');\n```\n\nThen:\n\n```shell\n$ projen hello 2> /dev/null\nworld\nhello\n```\n\n## Subtasks\n\nTasks can also spawn sub-tasks as a step:\n\n```ts\nconst world = project.addTask('world');\nworld.exec('echo world!');\n\nconst hello = project.addTask('hello');\nhello.exec('echo hello');\nhello.spawn(world);\n```\n\nThe output will be:\n\n```shell\n$ projen hello\n🤖 hello | echo hello\nhello\n🤖 hello » world | echo world!\nworld!\n\n$ projen hello --inspect\necho hello\nworld:\n   echo world!\n```\n\n## Environment\n\nEnvironment variables can be defined at the project level (for all tasks) or the task level:\n\n```ts\nproject.tasks.addEnvironment('FOO', 'hello');\n\nconst hello = project.addTask('hello');\nhello.env('BAR', 'world');\nhello.exec('echo $FOO, $BAR!');\n```\n\nThen:\n\n```shell\n$ projen hello\n🤖 hello | echo $FOO, $BAR!\nhello, world!\n```\n\nYou can also evaluate environment variable values from a shell command:\n\n```ts\nconst hello = project.addTask('hello');\nhello.env('TIME', '$(date)');\nhello.exec('echo current time is $TIME');\n```\n\nThen:\n\n```shell\n$ projen hello\n🤖 hello | echo current time is $TIME\ncurrent time is Tue Dec 1 09:32:33 IST 2020\n```\n\n## Conditions\n\nThe `condition` option includes a command that determines if the task is\nexecuted. If the command exits successfully (with a zero exit code), steps will\nbe executed. Otherwise, the task will be skipped (successfully).\n\n```ts\nconst hello = project.addTask('hello', {\n  condition: '[ -n \"$CI\" ]', // only execute if the CI environment variable is defined\n  exec: 'echo running in a CI environment'\n});\n```\n\nThen:\n\n```shell\n$ projen hello\n🤖 hello | condition: [ -n \"$CI\" ]\n🤖 hello | condition exited with non-zero - skipping\n\n$ CI=1 projen hello\n🤖 hello | condition: [ -n \"$CI\" ]\n🤖 hello | echo running in a CI environment\nrunning in a CI environment\n```\n\n## Tasks as npm scripts\n\nBy default, npm scripts in `NodeProject`s (or derivatives) are implemented by delegating the\ncommand to the projen CLI:\n\n```json\n{\n  \"scripts\": {\n    \"compile\": \"npx projen compile\"\n  }\n}\n```\n\nThis means that when `yarn compile` or `npm run compile` are executed, the\nprojen CLI will be invoked and the task will be executed.\n\nYou can see a list of all steps in a task from the command line by passing\nthe `--inspect` flag, e.g. `yarn compile --inspect`.\n"
  },
  {
    "path": "docs/typescript.md",
    "content": "# TypeScript Projects\n\nTo create a new TypeScript project, use `projen new typescript`:\n\n```shell\nnpx projen new typescript\n```\n\nThis will create a `.projenrc.js` file which defines your project. If you\ninstead would like to define your project in TypeScript, use the\n`--projenrc-ts` flag to create a `.projenrc.ts` file:\n\n```shell\nnpx projen new typescript --projenrc-ts\n```\n\n`projen new` will synthesize a standard project directory structure with some sample\ncode.\n\n```shell\n├── src\n│   ├── index.ts\n├── test\n│   ├── hello.test.ts\n├── node_modules\n├── package.json\n└── tsconfig.json\n```\n\nThe default options will set up your `tsconfig` root directory as `src` and your\nout directory as `lib`. By default the `test` directory is not compiled to\nJavaScript and instead compiled when `npx projen test` is executed.\n\nThe `projen new` command will also generate a `.projenrc.js` file which includes\nthe definition of your project with any options you specified in the command\nline:\n\n```js\nconst { typescript } = require('projen');\nconst project = new typescript.TypeScriptProject({\n  defaultReleaseBranch: 'main',\n  name: 'my-project',\n});\nproject.synth();\n```\n\nTo modify your project definitions, edit `.projenrc.js` and run `projen` again\nto re-synthesize your project. The following sections describe the various\nfeatures of your TypeScript project.\n\n## Dependencies\n\nYou can specify dependencies in your project via the `deps`, `devDeps`, and\n`peerDeps` options similar to what you might expect in a `package.json` file.\n\nThe recommendation is to only specify the module name here (e.g. `express`).\nThis will behave similar to yarn add or npm install in the sense that it will\nadd the module as a dependency to your package.json file with the latest version\n(`^`). You can specify semver requirements in the same syntax passed to npm i or\nyarn add (e.g. `express@^2`) and this will be what your `package.json` will\neventually include.\n\n## Migrating your TypeScript Project to Projen\n\nProjen provides some opinionated defaults that may be different than the defaults\nyou rely on in your existing TypeScript Project. This section attempts to document\nsome of the common themes to look out for when migrating an existing TypeScript\nproject to Projen.\n\n## Migrating .projenrc.js to .projenrc.ts\n\nIf you'd like to upgrade an existing project that was creating using a JS-based \nprojen RC file (.projenrc.js) to a TS-based projen RC file (.projenrc.ts):\n\n1. Add `projenrcTs: true` to your project.\n2. Run `npx projen`.\n3. Rename `.projenrc.js` to `.projenrc.ts`.\n4. Update `require`s to `import`s.\n5. Run `npx projen`.\n\n### Default Directory Structure\n\nThe most important is the default project structure. Projen expects all source code\nto be in the `src` directory and will write compiled `.js` and `.d.ts` files to the\n`lib` directory. Test files are expected in the `test` directory and not compiled\nto javascript. Instead, Projen configures `Jest` to compile `.ts` files when testing.\n\nAs this is only one of many structures for valid TypeScript projects, your migrated\nproject may not work out-of-the-box with Projen. We recommend that you take the\ntime to fully migrate to the expected project structure so that you can take full\nadvantage of Projen management on your repository.\n\nHowever, you can also configure your `.projenrc.js` file to reflect your current\nproject structure. A `TypeScriptProject` exposes all options in a `tsConfig` file\nso you can manually set the structure you want. Here is an example for specifying a\nstructure where the TypeScript compiler finds all TypeScript files recursively in your\nrepository:\n\n```js\nconst { typescript } = require('projen');\nconst project = new typescript.TypeScriptProject({\n  ...\n  tsConfig: {\n    compilerOptions: {\n      rootDir: '.',\n      outDir: '.',\n    },\n    include: ['**/*.ts'], // all typescript files recursively\n  },\n});\n```\n\n### Dependency Versions\n\nAs described in the section above, Projen recommends that you list your dependencies\nonly by module name and have Projen install the latest version of the package. A\nconsequence of this recommendation is that when migrating, you may unknowingly update\nyour dependencies to incompatible versions. You can always specify specific semvar\nrequirements (e.g. `express@^2`) if necessary.\n"
  },
  {
    "path": "license-text/Apache-2.0.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "license-text/Artistic-1.0.txt",
    "content": "Artistic License 1.0\n\nPreamble\n\nThe intent of this document is to state the conditions under which a\nPackage may be copied, such that the Copyright Holder maintains some\nsemblance of artistic control over the development of the package, while\ngiving the users of the package the right to use and distribute the Package\nin a more-or-less customary fashion, plus the right to make reasonable\nmodifications.  Definitions:\n\n\"Package\" refers to the collection of files distributed by the Copyright\nHolder, and derivatives of that collection of files created through textual\nmodification.\n\n\"Standard Version\" refers to such a Package if it has not been modified, or\nhas been modified in accordance with the wishes of the Copyright Holder as\nspecified below.\n\n\"Copyright Holder\" is whoever is named in the copyright or copyrights for\nthe package.\n\n\"You\" is you, if you're thinking about copying or distributing this\nPackage.\n\n\"Reasonable copying fee\" is whatever you can justify on the basis of media\ncost, duplication charges, time of people involved, and so on. (You will\nnot be required to justify it to the Copyright Holder, but only to the\ncomputing community at large as a market that must bear the fee.)\n\n\"Freely Available\" means that no fee is charged for the item itself, though\nthere may be fees involved in handling the item. It also means that\nrecipients of the item may redistribute it under the same conditions they\nreceived it.\n\n1. You may make and give away verbatim copies of the source form of the\nStandard Version of this Package without restriction, provided that you\nduplicate all of the original copyright notices and associated disclaimers.\n\n2. You may apply bug fixes, portability fixes and other modifications\nderived from the Public Domain or from the Copyright Holder. A Package\nmodified in such a way shall still be considered the Standard Version.\n\n3. You may otherwise modify your copy of this Package in any way, provided\nthat you insert a prominent notice in each changed file stating how and\nwhen you changed that file, and provided that you do at least ONE of the\nfollowing:\n\na) place your modifications in the Public Domain or otherwise make them\nFreely Available, such as by posting said modifications to Usenet or an\nequivalent medium, or placing the modifications on a major archive site\nsuch as uunet.uu.net, or by allowing the Copyright Holder to include your\nmodifications in the Standard Version of the Package.\n\nb) use the modified Package only within your corporation or organization.\n\nc) rename any non-standard executables so the names do not conflict with\nstandard executables, which must also be provided, and provide a separate\nmanual page for each non-standard executable that clearly documents how it\ndiffers from the Standard Version.\n\nd) make other distribution arrangements with the Copyright Holder.\n\n4.You may distribute the programs of this Package in object code or\nexecutable form, provided that you do at least ONE of the following:\n\na) distribute a Standard Version of the executables and library files,\ntogether with instructions (in the manual page or equivalent) on where to\nget the Standard Version.\n\nb) accompany the distribution with the machine-readable source of the\nPackage with your modifications.\n\nc) give non-standard executables non-standard names, and clearly document\nthe differences in manual pages (or equivalent), together with instructions\non where to get the Standard Version.\n\nd) make other distribution arrangements with the Copyright Holder.\n\n5. You may charge a reasonable copying fee for any distribution of this\nPackage. You may charge any fee you choose for support of this Package. You\nmay not charge a fee for this Package itself. However, you may distribute\nthis Package in aggregate with other (possibly commercial) programs as part\nof a larger (possibly commercial) software distribution provided that you\ndo not advertise this Package as a product of your own. You may embed this\nPackage's interpreter within an executable of yours (by linking); this\nshall be construed as a mere form of aggregation, provided that the\ncomplete Standard Version of the interpreter is so embedded.\n\n6. The scripts and library files supplied as input to or produced as output\nfrom the programs of this Package do not automatically fall under the\ncopyright of this Package, but belong to whoever generated them, and may be\nsold commercially, and may be aggregated with this Package. If such scripts\nor library files are aggregated with this Package via the so-called\n\"undump\" or \"unexec\" methods of producing a binary executable image, then\ndistribution of such an image shall neither be construed as a distribution\nof this Package nor shall it fall under the restrictions of Paragraphs 3\nand 4, provided that you do not represent such an executable image as a\nStandard Version of this Package.\n\n7. C subroutines (or comparably compiled subroutines in other languages)\nsupplied by you and linked into this Package in order to emulate\nsubroutines and variables of the language defined by this Package shall not\nbe considered part of this Package, but are the equivalent of input as in\nParagraph 6, provided these subroutines do not change the language in any\nway that would cause it to fail the regression tests for the language.\n\n8. Aggregation of this Package with a commercial distribution is always\npermitted provided that the use of this Package is embedded; that is, when\nno overt attempt is made to make this Package's interfaces visible to the\nend user of the commercial distribution. Such use shall not be construed as\na distribution of this Package.\n\n9. The name of the Copyright Holder may not be used to endorse or promote\nproducts derived from this software without specific prior written\npermission.\n\n10. THIS PACKAGE IS PROVIDED \"AS IS\" AND WITHOUT ANY EXPRESS OR IMPLIED\nWARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\nMERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\nThe End\n"
  },
  {
    "path": "license-text/Artistic-2.0.txt",
    "content": "Artistic License 2.0\nCopyright (c) 2000-2006, The Perl Foundation.\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\nPreamble\n\nThis license establishes the terms under which a given free software\nPackage may be copied, modified, distributed, and/or redistributed. The\nintent is that the Copyright Holder maintains some artistic control over\nthe development of that Package while still keeping the Package available\nas open source and free software.\n\nYou are always permitted to make arrangements wholly outside of this\nlicense directly with the Copyright Holder of a given Package. If the terms\nof this license do not permit the full use that you propose to make of the\nPackage, you should contact the Copyright Holder and seek a different\nlicensing arrangement.\n\nDefinitions\n\n\"Copyright Holder\" means the individual(s) or organization(s) named in the\ncopyright notice for the entire Package.\n\n\"Contributor\" means any party that has contributed code or other material\nto the Package, in accordance with the Copyright Holder's procedures.\n\n\"You\" and \"your\" means any person who would like to copy, distribute, or\nmodify the Package.\n\n\"Package\" means the collection of files distributed by the Copyright\nHolder, and derivatives of that collection and/or of those files. A given\nPackage may consist of either the Standard Version, or a Modified Version.\n\n\"Distribute\" means providing a copy of the Package or making it accessible\nto anyone else, or in the case of a company or organization, to others\noutside of your company or organization.\n\n\"Distributor Fee\" means any fee that you charge for Distributing this\nPackage or providing support for this Package to another party. It does not\nmean licensing fees.\n\n\"Standard Version\" refers to the Package if it has not been modified, or\nhas been modified only in ways explicitly requested by the Copyright\nHolder.\n\n\"Modified Version\" means the Package, if it has been changed, and such\nchanges were not explicitly requested by the Copyright Holder.\n\n\"Original License\" means this Artistic License as Distributed with the\nStandard Version of the Package, in its current version or as it may be\nmodified by The Perl Foundation in the future.\n\n\"Source\" form means the source code, documentation source, and\nconfiguration files for the Package.\n\n\"Compiled\" form means the compiled bytecode, object code, binary, or any\nother form resulting from mechanical transformation or translation of the\nSource form.\n\nPermission for Use and Modification Without Distribution\n\n(1) You are permitted to use the Standard Version and create and use\nModified Versions for any purpose without restriction, provided that you do\nnot Distribute the Modified Version.\n\nPermissions for Redistribution of the Standard Version\n\n(2) You may Distribute verbatim copies of the Source form of the Standard\nVersion of this Package in any medium without restriction, either gratis or\nfor a Distributor Fee, provided that you duplicate all of the original\ncopyright notices and associated disclaimers. At your discretion, such\nverbatim copies may or may not include a Compiled form of the Package.\n\n(3) You may apply any bug fixes, portability changes, and other\nmodifications made available from the Copyright Holder. The resulting\nPackage will still be considered the Standard Version, and as such will be\nsubject to the Original License.\n\nDistribution of Modified Versions of the Package as Source\n\n(4) You may Distribute your Modified Version as Source (either gratis or\nfor a Distributor Fee, and with or without a Compiled form of the Modified\nVersion) provided that you clearly document how it differs from the\nStandard Version, including, but not limited to, documenting any\nnon-standard features, executables, or modules, and provided that you do at\nleast ONE of the following:\n\n(a) make the Modified Version available to the Copyright Holder of the\nStandard Version, under the Original License, so that the Copyright Holder\nmay include your modifications in the Standard Version.\n\n(b) ensure that installation of your Modified Version does not prevent the\nuser installing or running the Standard Version. In addition, the Modified\nVersion must bear a name that is different from the name of the Standard\nVersion.\n\n(c) allow anyone who receives a copy of the Modified Version to make the\nSource form of the Modified Version available to others under\n\n(i) the Original License or\n\n(ii) a license that permits the licensee to freely copy, modify and\nredistribute the Modified Version using the same licensing terms that apply\nto the copy that the licensee received, and requires that the Source form\nof the Modified Version, and of any works derived from it, be made freely\navailable in that license fees are prohibited but Distributor Fees are\nallowed.\n\nDistribution of Compiled Forms of the Standard Version or Modified Versions\nwithout the Source\n\n(5) You may Distribute Compiled forms of the Standard Version without the\nSource, provided that you include complete instructions on how to get the\nSource of the Standard Version. Such instructions must be valid at the time\nof your distribution. If these instructions, at any time while you are\ncarrying out such distribution, become invalid, you must provide new\ninstructions on demand or cease further distribution. If you provide valid\ninstructions or cease distribution within thirty days after you become\naware that the instructions are invalid, then you do not forfeit any of\nyour rights under this license.\n\n(6) You may Distribute a Modified Version in Compiled form without the\nSource, provided that you comply with Section 4 with respect to the Source\nof the Modified Version.\n\nAggregating or Linking the Package\n\n(7) You may aggregate the Package (either the Standard Version or Modified\nVersion) with other packages and Distribute the resulting aggregation\nprovided that you do not charge a licensing fee for the Package.\nDistributor Fees are permitted, and licensing fees for other components in\nthe aggregation are permitted. The terms of this license apply to the use\nand Distribution of the Standard or Modified Versions as included in the\naggregation.\n\n(8) You are permitted to link Modified and Standard Versions with other\nworks, to embed the Package in a larger work of your own, or to build\nstand-alone binary or bytecode versions of applications that include the\nPackage, and Distribute the result without restriction, provided the result\ndoes not expose a direct interface to the Package.\n\nItems That are Not Considered Part of a Modified Version\n\n(9) Works (including, but not limited to, modules and scripts) that merely\nextend or make use of the Package, do not, by themselves, cause the Package\nto be a Modified Version. In addition, such works are not considered parts\nof the Package itself, and are not subject to the terms of this license.\n\nGeneral Provisions\n\n(10) Any use, modification, and distribution of the Standard or Modified\nVersions is governed by this Artistic License. By using, modifying or\ndistributing the Package, you accept this license. Do not use, modify, or\ndistribute the Package, if you do not accept this license.\n\n(11) If your Modified Version has been derived from a Modified Version made\nby someone other than you, you are nevertheless required to ensure that\nyour Modified Version complies with the requirements of this license.\n\n(12) This license does not grant you the right to use any trademark,\nservice mark, tradename, or logo of the Copyright Holder.\n\n(13) This license includes the non-exclusive, worldwide, free-of-charge\npatent license to make, have made, use, offer to sell, sell, import and\notherwise transfer the Package with respect to any patent claims licensable\nby the Copyright Holder that are necessarily infringed by the Package. If\nyou institute patent litigation (including a cross-claim or counterclaim)\nagainst any party alleging that the Package constitutes direct or\ncontributory patent infringement, then this Artistic License to you shall\nterminate on the date that such litigation is filed.\n\n(14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT\nHOLDER AND CONTRIBUTORS \"AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED\nWARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT\nPERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR\nCONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR\nCONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE,\nEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "license-text/EUPL-1.2.txt",
    "content": "                      EUROPEAN UNION PUBLIC LICENCE v. 1.2\n                      EUPL © the European Union 2007, 2016\n\nThis European Union Public Licence (the ‘EUPL’) applies to the Work (as defined\nbelow) which is provided under the terms of this Licence. Any use of the Work,\nother than as authorised under this Licence is prohibited (to the extent such\nuse is covered by a right of the copyright holder of the Work).\n\nThe Work is provided under the terms of this Licence when the Licensor (as\ndefined below) has placed the following notice immediately following the\ncopyright notice for the Work:\n\n        Licensed under the EUPL\n\nor has expressed by any other means his willingness to license under the EUPL.\n\n1. Definitions\n\nIn this Licence, the following terms have the following meaning:\n\n- ‘The Licence’: this Licence.\n\n- ‘The Original Work’: the work or software distributed or communicated by the\n  Licensor under this Licence, available as Source Code and also as Executable\n  Code as the case may be.\n\n- ‘Derivative Works’: the works or software that could be created by the\n  Licensee, based upon the Original Work or modifications thereof. This Licence\n  does not define the extent of modification or dependence on the Original Work\n  required in order to classify a work as a Derivative Work; this extent is\n  determined by copyright law applicable in the country mentioned in Article 15.\n\n- ‘The Work’: the Original Work or its Derivative Works.\n\n- ‘The Source Code’: the human-readable form of the Work which is the most\n  convenient for people to study and modify.\n\n- ‘The Executable Code’: any code which has generally been compiled and which is\n  meant to be interpreted by a computer as a program.\n\n- ‘The Licensor’: the natural or legal person that distributes or communicates\n  the Work under the Licence.\n\n- ‘Contributor(s)’: any natural or legal person who modifies the Work under the\n  Licence, or otherwise contributes to the creation of a Derivative Work.\n\n- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of\n  the Work under the terms of the Licence.\n\n- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,\n  renting, distributing, communicating, transmitting, or otherwise making\n  available, online or offline, copies of the Work or providing access to its\n  essential functionalities at the disposal of any other natural or legal\n  person.\n\n2. Scope of the rights granted by the Licence\n\nThe Licensor hereby grants You a worldwide, royalty-free, non-exclusive,\nsublicensable licence to do the following, for the duration of copyright vested\nin the Original Work:\n\n- use the Work in any circumstance and for all usage,\n- reproduce the Work,\n- modify the Work, and make Derivative Works based upon the Work,\n- communicate to the public, including the right to make available or display\n  the Work or copies thereof to the public and perform publicly, as the case may\n  be, the Work,\n- distribute the Work or copies thereof,\n- lend and rent the Work or copies thereof,\n- sublicense rights in the Work or copies thereof.\n\nThose rights can be exercised on any media, supports and formats, whether now\nknown or later invented, as far as the applicable law permits so.\n\nIn the countries where moral rights apply, the Licensor waives his right to\nexercise his moral right to the extent allowed by law in order to make effective\nthe licence of the economic rights here above listed.\n\nThe Licensor grants to the Licensee royalty-free, non-exclusive usage rights to\nany patents held by the Licensor, to the extent necessary to make use of the\nrights granted on the Work under this Licence.\n\n3. Communication of the Source Code\n\nThe Licensor may provide the Work either in its Source Code form, or as\nExecutable Code. If the Work is provided as Executable Code, the Licensor\nprovides in addition a machine-readable copy of the Source Code of the Work\nalong with each copy of the Work that the Licensor distributes or indicates, in\na notice following the copyright notice attached to the Work, a repository where\nthe Source Code is easily and freely accessible for as long as the Licensor\ncontinues to distribute or communicate the Work.\n\n4. Limitations on copyright\n\nNothing in this Licence is intended to deprive the Licensee of the benefits from\nany exception or limitation to the exclusive rights of the rights owners in the\nWork, of the exhaustion of those rights or of other applicable limitations\nthereto.\n\n5. Obligations of the Licensee\n\nThe grant of the rights mentioned above is subject to some restrictions and\nobligations imposed on the Licensee. Those obligations are the following:\n\nAttribution right: The Licensee shall keep intact all copyright, patent or\ntrademarks notices and all notices that refer to the Licence and to the\ndisclaimer of warranties. The Licensee must include a copy of such notices and a\ncopy of the Licence with every copy of the Work he/she distributes or\ncommunicates. The Licensee must cause any Derivative Work to carry prominent\nnotices stating that the Work has been modified and the date of modification.\n\nCopyleft clause: If the Licensee distributes or communicates copies of the\nOriginal Works or Derivative Works, this Distribution or Communication will be\ndone under the terms of this Licence or of a later version of this Licence\nunless the Original Work is expressly distributed only under this version of the\nLicence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee\n(becoming Licensor) cannot offer or impose any additional terms or conditions on\nthe Work or Derivative Work that alter or restrict the terms of the Licence.\n\nCompatibility clause: If the Licensee Distributes or Communicates Derivative\nWorks or copies thereof based upon both the Work and another work licensed under\na Compatible Licence, this Distribution or Communication can be done under the\nterms of this Compatible Licence. For the sake of this clause, ‘Compatible\nLicence’ refers to the licences listed in the appendix attached to this Licence.\nShould the Licensee's obligations under the Compatible Licence conflict with\nhis/her obligations under this Licence, the obligations of the Compatible\nLicence shall prevail.\n\nProvision of Source Code: When distributing or communicating copies of the Work,\nthe Licensee will provide a machine-readable copy of the Source Code or indicate\na repository where this Source will be easily and freely available for as long\nas the Licensee continues to distribute or communicate the Work.\n\nLegal Protection: This Licence does not grant permission to use the trade names,\ntrademarks, service marks, or names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the copyright notice.\n\n6. Chain of Authorship\n\nThe original Licensor warrants that the copyright in the Original Work granted\nhereunder is owned by him/her or licensed to him/her and that he/she has the\npower and authority to grant the Licence.\n\nEach Contributor warrants that the copyright in the modifications he/she brings\nto the Work are owned by him/her or licensed to him/her and that he/she has the\npower and authority to grant the Licence.\n\nEach time You accept the Licence, the original Licensor and subsequent\nContributors grant You a licence to their contributions to the Work, under the\nterms of this Licence.\n\n7. Disclaimer of Warranty\n\nThe Work is a work in progress, which is continuously improved by numerous\nContributors. It is not a finished work and may therefore contain defects or\n‘bugs’ inherent to this type of development.\n\nFor the above reason, the Work is provided under the Licence on an ‘as is’ basis\nand without warranties of any kind concerning the Work, including without\nlimitation merchantability, fitness for a particular purpose, absence of defects\nor errors, accuracy, non-infringement of intellectual property rights other than\ncopyright as stated in Article 6 of this Licence.\n\nThis disclaimer of warranty is an essential part of the Licence and a condition\nfor the grant of any rights to the Work.\n\n8. Disclaimer of Liability\n\nExcept in the cases of wilful misconduct or damages directly caused to natural\npersons, the Licensor will in no event be liable for any direct or indirect,\nmaterial or moral, damages of any kind, arising out of the Licence or of the use\nof the Work, including without limitation, damages for loss of goodwill, work\nstoppage, computer failure or malfunction, loss of data or any commercial\ndamage, even if the Licensor has been advised of the possibility of such damage.\nHowever, the Licensor will be liable under statutory product liability laws as\nfar such laws apply to the Work.\n\n9. Additional agreements\n\nWhile distributing the Work, You may choose to conclude an additional agreement,\ndefining obligations or services consistent with this Licence. However, if\naccepting obligations, You may act only on your own behalf and on your sole\nresponsibility, not on behalf of the original Licensor or any other Contributor,\nand only if You agree to indemnify, defend, and hold each Contributor harmless\nfor any liability incurred by, or claims asserted against such Contributor by\nthe fact You have accepted any warranty or additional liability.\n\n10. Acceptance of the Licence\n\nThe provisions of this Licence can be accepted by clicking on an icon ‘I agree’\nplaced under the bottom of a window displaying the text of this Licence or by\naffirming consent in any other similar way, in accordance with the rules of\napplicable law. Clicking on that icon indicates your clear and irrevocable\nacceptance of this Licence and all of its terms and conditions.\n\nSimilarly, you irrevocably accept this Licence and all of its terms and\nconditions by exercising any rights granted to You by Article 2 of this Licence,\nsuch as the use of the Work, the creation by You of a Derivative Work or the\nDistribution or Communication by You of the Work or copies thereof.\n\n11. Information to the public\n\nIn case of any Distribution or Communication of the Work by means of electronic\ncommunication by You (for example, by offering to download the Work from a\nremote location) the distribution channel or media (for example, a website) must\nat least provide to the public the information requested by the applicable law\nregarding the Licensor, the Licence and the way it may be accessible, concluded,\nstored and reproduced by the Licensee.\n\n12. Termination of the Licence\n\nThe Licence and the rights granted hereunder will terminate automatically upon\nany breach by the Licensee of the terms of the Licence.\n\nSuch a termination will not terminate the licences of any person who has\nreceived the Work from the Licensee under the Licence, provided such persons\nremain in full compliance with the Licence.\n\n13. Miscellaneous\n\nWithout prejudice of Article 9 above, the Licence represents the complete\nagreement between the Parties as to the Work.\n\nIf any provision of the Licence is invalid or unenforceable under applicable\nlaw, this will not affect the validity or enforceability of the Licence as a\nwhole. Such provision will be construed or reformed so as necessary to make it\nvalid and enforceable.\n\nThe European Commission may publish other linguistic versions or new versions of\nthis Licence or updated versions of the Appendix, so far this is required and\nreasonable, without reducing the scope of the rights granted by the Licence. New\nversions of the Licence will be published with a unique version number.\n\nAll linguistic versions of this Licence, approved by the European Commission,\nhave identical value. Parties can take advantage of the linguistic version of\ntheir choice.\n\n14. Jurisdiction\n\nWithout prejudice to specific agreement between parties,\n\n- any litigation resulting from the interpretation of this License, arising\n  between the European Union institutions, bodies, offices or agencies, as a\n  Licensor, and any Licensee, will be subject to the jurisdiction of the Court\n  of Justice of the European Union, as laid down in article 272 of the Treaty on\n  the Functioning of the European Union,\n\n- any litigation arising between other parties and resulting from the\n  interpretation of this License, will be subject to the exclusive jurisdiction\n  of the competent court where the Licensor resides or conducts its primary\n  business.\n\n15. Applicable Law\n\nWithout prejudice to specific agreement between parties,\n\n- this Licence shall be governed by the law of the European Union Member State\n  where the Licensor has his seat, resides or has his registered office,\n\n- this licence shall be governed by Belgian law if the Licensor has no seat,\n  residence or registered office inside a European Union Member State.\n\nAppendix\n\n‘Compatible Licences’ according to Article 5 EUPL are:\n\n- GNU General Public License (GPL) v. 2, v. 3\n- GNU Affero General Public License (AGPL) v. 3\n- Open Software License (OSL) v. 2.1, v. 3.0\n- Eclipse Public License (EPL) v. 1.0\n- CeCILL v. 2.0, v. 2.1\n- Mozilla Public Licence (MPL) v. 2\n- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3\n- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for\n  works other than software\n- European Union Public Licence (EUPL) v. 1.1, v. 1.2\n- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong\n  Reciprocity (LiLiQ-R+).\n\nThe European Commission may update this Appendix to later versions of the above\nlicences without producing a new version of the EUPL, as long as they provide\nthe rights granted in Article 2 of this Licence and protect the covered Source\nCode from exclusive appropriation.\n\nAll other changes or additions to this Appendix require the production of a new\nEUPL version.\n"
  },
  {
    "path": "license-text/GPL-2.0-or-later.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "license-text/GPL-3.0-WITH-GCC-exception-3.1.txt",
    "content": "GCC RUNTIME LIBRARY EXCEPTION\n\nVersion 3.1, 31 March 2009\n\nCopyright (C) 2009 Free Software Foundation, Inc. <http://fsf.org/>\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\nThis GCC Runtime Library Exception (\"Exception\") is an additional\npermission under section 7 of the GNU General Public License, version\n3 (\"GPLv3\"). It applies to a given file (the \"Runtime Library\") that\nbears a notice placed by the copyright holder of the file stating that\nthe file is governed by GPLv3 along with this Exception.\n\nWhen you use GCC to compile a program, GCC may combine portions of\ncertain GCC header files and runtime libraries with the compiled\nprogram. The purpose of this Exception is to allow compilation of\nnon-GPL (including proprietary) programs to use, in this way, the\nheader files and runtime libraries covered by this Exception.\n\n0. Definitions.\n\nA file is an \"Independent Module\" if it either requires the Runtime\nLibrary for execution after a Compilation Process, or makes use of an\ninterface provided by the Runtime Library, but is not otherwise based\non the Runtime Library.\n\n\"GCC\" means a version of the GNU Compiler Collection, with or without\nmodifications, governed by version 3 (or a specified later version) of\nthe GNU General Public License (GPL) with the option of using any\nsubsequent versions published by the FSF.\n\n\"GPL-compatible Software\" is software whose conditions of propagation,\nmodification and use would permit combination with GCC in accord with\nthe license of GCC.\n\n\"Target Code\" refers to output from any compiler for a real or virtual\ntarget processor architecture, in executable form or suitable for\ninput to an assembler, loader, linker and/or execution\nphase. Notwithstanding that, Target Code does not include data in any\nformat that is used as a compiler intermediate representation, or used\nfor producing a compiler intermediate representation.\n\nThe \"Compilation Process\" transforms code entirely represented in\nnon-intermediate languages designed for human-written code, and/or in\nJava Virtual Machine byte code, into Target Code. Thus, for example,\nuse of source code generators and preprocessors need not be considered\npart of the Compilation Process, since the Compilation Process can be\nunderstood as starting with the output of the generators or\npreprocessors.\n\nA Compilation Process is \"Eligible\" if it is done using GCC, alone or\nwith other GPL-compatible software, or if it is done without using any\nwork based on GCC. For example, using non-GPL-compatible Software to\noptimize any GCC intermediate representations would not qualify as an\nEligible Compilation Process.\n\n1. Grant of Additional Permission.\n\nYou have permission to propagate a work of Target Code formed by\ncombining the Runtime Library with Independent Modules, even if such\npropagation would otherwise violate the terms of GPLv3, provided that\nall Target Code was generated by Eligible Compilation Processes. You\nmay then convey such a combination under terms of your choice,\nconsistent with the licensing of the Independent Modules.\n\n2. No Weakening of GCC Copyleft.\n\nThe availability of this Exception does not imply any general\npresumption that third-party software is unaffected by the copyleft\nrequirements of the license of GCC.\n\n"
  },
  {
    "path": "license-text/GPL-3.0-or-later.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "license-text/LGPL-2.1-or-later.txt",
    "content": "                  GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n                  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n\n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n                            NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n"
  },
  {
    "path": "license-text/LGPL-3.0-or-later.txt",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "license-text/MIT-0.txt",
    "content": "Copyright $copyright_period $copyright_owner\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \n\n"
  },
  {
    "path": "license-text/MIT.txt",
    "content": "Copyright (c) $copyright_period $copyright_owner\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "license-text/MPL-2.0.txt",
    "content": "Mozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. “Contributor”\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. “Contributor Version”\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor’s Contribution.\n\n1.3. “Contribution”\n\n     means Covered Software of a particular Contributor.\n\n1.4. “Covered Software”\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. “Incompatible With Secondary Licenses”\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of version\n        1.1 or earlier of the License, but not also under the terms of a\n        Secondary License.\n\n1.6. “Executable Form”\n\n     means any form of the work other than Source Code Form.\n\n1.7. “Larger Work”\n\n     means a work that combines Covered Software with other material, in a separate\n     file or files, that is not Covered Software.\n\n1.8. “License”\n\n     means this document.\n\n1.9. “Licensable”\n\n     means having the right to grant, to the maximum extent possible, whether at the\n     time of the initial grant or subsequently, any and all of the rights conveyed by\n     this License.\n\n1.10. “Modifications”\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to, deletion\n        from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. “Patent Claims” of a Contributor\n\n      means any patent claim(s), including without limitation, method, process,\n      and apparatus claims, in any patent Licensable by such Contributor that\n      would be infringed, but for the grant of the License, by the making,\n      using, selling, offering for sale, having made, import, or transfer of\n      either its Contributions or its Contributor Version.\n\n1.12. “Secondary License”\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. “Source Code Form”\n\n      means the form of the work preferred for making modifications.\n\n1.14. “You” (or “Your”)\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, “You” includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, “control” means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or as\n        part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its Contributions\n        or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution become\n     effective for each Contribution on the date the Contributor first distributes\n     such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under this\n     License. No additional rights or licenses will be implied from the distribution\n     or licensing of Covered Software under this License. Notwithstanding Section\n     2.1(b) above, no patent license is granted by a Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party’s\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of its\n        Contributions.\n\n     This License does not grant any rights in the trademarks, service marks, or\n     logos of any Contributor (except as may be necessary to comply with the\n     notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this License\n     (see Section 10.2) or under the terms of a Secondary License (if permitted\n     under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its Contributions\n     are its original creation(s) or it has sufficient rights to grant the\n     rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under applicable\n     copyright doctrines of fair use, fair dealing, or other equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under the\n     terms of this License. You must inform recipients that the Source Code Form\n     of the Covered Software is governed by the terms of this License, and how\n     they can obtain a copy of this License. You may not attempt to alter or\n     restrict the recipients’ rights in the Source Code Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this License,\n        or sublicense it under different terms, provided that the license for\n        the Executable Form does not attempt to limit or alter the recipients’\n        rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for the\n     Covered Software. If the Larger Work is a combination of Covered Software\n     with a work governed by one or more Secondary Licenses, and the Covered\n     Software is not Incompatible With Secondary Licenses, this License permits\n     You to additionally distribute such Covered Software under the terms of\n     such Secondary License(s), so that the recipient of the Larger Work may, at\n     their option, further distribute the Covered Software under the terms of\n     either this License or such Secondary License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices (including\n     copyright notices, patent notices, disclaimers of warranty, or limitations\n     of liability) contained within the Source Code Form of the Covered\n     Software, except that You may alter any license notices to the extent\n     required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on behalf\n     of any Contributor. You must make it absolutely clear that any such\n     warranty, support, indemnity, or liability obligation is offered by You\n     alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute, judicial\n   order, or regulation then You must: (a) comply with the terms of this License\n   to the maximum extent possible; and (b) describe the limitations and the code\n   they affect. Such description must be placed in a text file included with all\n   distributions of the Covered Software under this License. Except to the\n   extent prohibited by statute or regulation, such description must be\n   sufficiently detailed for a recipient of ordinary skill to be able to\n   understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing basis,\n     if such Contributor fails to notify You of the non-compliance by some\n     reasonable means prior to 60 days after You have come back into compliance.\n     Moreover, Your grants from a particular Contributor are reinstated on an\n     ongoing basis if such Contributor notifies You of the non-compliance by\n     some reasonable means, this is the first time You have received notice of\n     non-compliance with this License from such Contributor, and You become\n     compliant prior to 30 days after Your receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions, counter-claims,\n     and cross-claims) alleging that a Contributor Version directly or\n     indirectly infringes any patent, then the rights granted to You by any and\n     all Contributors for the Covered Software under Section 2.1 of this License\n     shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an “as is” basis, without\n   warranty of any kind, either expressed, implied, or statutory, including,\n   without limitation, warranties that the Covered Software is free of defects,\n   merchantable, fit for a particular purpose or non-infringing. The entire\n   risk as to the quality and performance of the Covered Software is with You.\n   Should any Covered Software prove defective in any respect, You (not any\n   Contributor) assume the cost of any necessary servicing, repair, or\n   correction. This disclaimer of warranty constitutes an essential part of this\n   License. No use of  any Covered Software is authorized under this License\n   except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from such\n   party’s negligence to the extent applicable law prohibits such limitation.\n   Some jurisdictions do not allow the exclusion or limitation of incidental or\n   consequential damages, so this exclusion and limitation may not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts of\n   a jurisdiction where the defendant maintains its principal place of business\n   and such litigation shall be governed by laws of that jurisdiction, without\n   reference to its conflict-of-law provisions. Nothing in this Section shall\n   prevent a party’s ability to bring cross-claims or counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject matter\n   hereof. If any provision of this License is held to be unenforceable, such\n   provision shall be reformed only to the extent necessary to make it\n   enforceable. Any law or regulation which provides that the language of a\n   contract shall be construed against the drafter shall not be used to construe\n   this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version of\n      the License under which You originally received the Covered Software, or\n      under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a modified\n      version of this License if you rename the license and remove any\n      references to the name of the license steward (except to note that such\n      modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses\n      If You choose to distribute Source Code Form that is Incompatible With\n      Secondary Licenses under the terms of this version of the License, the\n      notice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file, then\nYou may include the notice in a location (such as a LICENSE file in a relevant\ndirectory) where a recipient would be likely to look for such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - “Incompatible With Secondary Licenses” Notice\n\n      This Source Code Form is “Incompatible\n      With Secondary Licenses”, as defined by\n      the Mozilla Public License, v. 2.0.\n"
  },
  {
    "path": "license-text/OFL-1.1.txt",
    "content": "This Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded, \nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "license-text/PHP-3.01.txt",
    "content": "-------------------------------------------------------------------- \n                  The PHP License, version 3.01\nCopyright (c) 1999 - 2010 The PHP Group. All rights reserved.\n-------------------------------------------------------------------- \n\nRedistribution and use in source and binary forms, with or without\nmodification, is permitted provided that the following conditions\nare met:\n\n  1. Redistributions of source code must retain the above copyright\n     notice, this list of conditions and the following disclaimer.\n \n  2. Redistributions in binary form must reproduce the above copyright\n     notice, this list of conditions and the following disclaimer in\n     the documentation and/or other materials provided with the\n     distribution.\n \n  3. The name \"PHP\" must not be used to endorse or promote products\n     derived from this software without prior written permission. For\n     written permission, please contact group@php.net.\n  \n  4. Products derived from this software may not be called \"PHP\", nor\n     may \"PHP\" appear in their name, without prior written permission\n     from group@php.net.  You may indicate that your software works in\n     conjunction with PHP by saying \"Foo for PHP\" instead of calling\n     it \"PHP Foo\" or \"phpfoo\"\n \n  5. The PHP Group may publish revised and/or new versions of the\n     license from time to time. Each version will be given a\n     distinguishing version number.\n     Once covered code has been published under a particular version\n     of the license, you may always continue to use it under the terms\n     of that version. You may also choose to use such covered code\n     under the terms of any subsequent version of the license\n     published by the PHP Group. No one other than the PHP Group has\n     the right to modify the terms applicable to covered code created\n     under this License.\n\n  6. Redistributions of any form whatsoever must retain the following\n     acknowledgment:\n     \"This product includes PHP software, freely available from\n     <http://www.php.net/software/>\".\n\nTHIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND \nANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A \nPARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE PHP\nDEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \nINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR \nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\nSTRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\nOF THE POSSIBILITY OF SUCH DAMAGE.\n\n-------------------------------------------------------------------- \n\nThis software consists of voluntary contributions made by many\nindividuals on behalf of the PHP Group.\n\nThe PHP Group can be contacted via Email at group@php.net.\n\nFor more information on the PHP Group and the PHP project, \nplease see <http://www.php.net>.\n\nPHP includes the Zend Engine, freely available at\n<http://www.zend.com>.\n"
  },
  {
    "path": "license-text/Ruby.txt",
    "content": "  1. You may make and give away verbatim copies of the source form of the\n     software without restriction, provided that you duplicate all of the\n     original copyright notices and associated disclaimers.\n\n  2. You may modify your copy of the software in any way, provided that\n     you do at least ONE of the following:\n\n       a) place your modifications in the Public Domain or otherwise\n          make them Freely Available, such as by posting said\n\t  modifications to Usenet or an equivalent medium, or by allowing\n\t  the author to include your modifications in the software.\n\n       b) use the modified software only within your corporation or\n          organization.\n\n       c) give non-standard binaries non-standard names, with\n          instructions on where to get the original software distribution.\n\n       d) make other distribution arrangements with the author.\n\n  3. You may distribute the software in object code or binary form,\n     provided that you do at least ONE of the following:\n\n       a) distribute the binaries and library files of the software,\n\t  together with instructions (in the manual page or equivalent)\n\t  on where to get the original distribution.\n\n       b) accompany the distribution with the machine-readable source of\n\t  the software.\n\n       c) give non-standard binaries non-standard names, with\n          instructions on where to get the original software distribution.\n\n       d) make other distribution arrangements with the author.\n\n  4. You may modify and include the part of the software into any other\n     software (possibly commercial).  But some files in the distribution\n     are not written by the author, so that they are not under these terms.\n\n     For the list of those files and their copying conditions, see the\n     file LEGAL.\n\n  5. The scripts and library files supplied as input to or produced as \n     output from the software do not automatically fall under the\n     copyright of the software, but belong to whomever generated them, \n     and may be sold commercially, and may be aggregated with this\n     software.\n\n  6. THIS SOFTWARE IS PROVIDED \"AS IS\" AND WITHOUT ANY EXPRESS OR\n     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n     PURPOSE.\n"
  },
  {
    "path": "license-text/Unlicense.txt",
    "content": "This is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org/>\n"
  },
  {
    "path": "license-text/WTFPL.txt",
    "content": "           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n                   Version 2, December 2004\n\nCopyright (C) 2004 Sam Hocevar <sam@hocevar.net>\n\nEveryone is permitted to copy and distribute verbatim or modified\ncopies of this license document, and changing it is allowed as long\nas the name is changed.\n\n           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n  TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n 0. You just DO WHAT THE FUCK YOU WANT TO.\n\n"
  },
  {
    "path": "license-text/ZPL-2.1.txt",
    "content": "Zope Public License (ZPL) Version 2.1\n\nA copyright notice accompanies this license document that identifies the\ncopyright holders.\n\nThis license has been certified as open source. It has also been designated\nas GPL compatible by the Free Software Foundation (FSF).\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\nRedistributions in source code must retain the accompanying copyright\nnotice, this list of conditions, and the following disclaimer.\n\nRedistributions in binary form must reproduce the accompanying copyright\nnotice, this list of conditions, and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nNames of the copyright holders must not be used to endorse or promote\nproducts derived from this software without prior written permission from\nthe copyright holders.\n\nThe right to distribute this software or to use it for any purpose does not\ngive you the right to use Servicemarks (sm) or Trademarks (tm) of the\ncopyright holders. Use of them is covered by separate agreement with the\ncopyright holders.\n\nIf any files are modified, you must cause the modified files to carry\nprominent notices stating that you changed the files and the date of any\nchange.\n\nDisclaimer\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY\nEXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"projen\",\n  \"description\": \"CDK for software projects\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/projen/projen.git\"\n  },\n  \"bin\": {\n    \"projen\": \"bin/projen\"\n  },\n  \"scripts\": {\n    \"build\": \"/bin/bash ./projen.bash build\",\n    \"bump\": \"/bin/bash ./projen.bash bump\",\n    \"bundle:task-runner\": \"/bin/bash ./projen.bash bundle:task-runner\",\n    \"clobber\": \"/bin/bash ./projen.bash clobber\",\n    \"compat\": \"/bin/bash ./projen.bash compat\",\n    \"compile\": \"/bin/bash ./projen.bash compile\",\n    \"contributors:update\": \"/bin/bash ./projen.bash contributors:update\",\n    \"default\": \"/bin/bash ./projen.bash default\",\n    \"devenv:setup\": \"/bin/bash ./projen.bash devenv:setup\",\n    \"docgen\": \"/bin/bash ./projen.bash docgen\",\n    \"eject\": \"/bin/bash ./projen.bash eject\",\n    \"eslint\": \"/bin/bash ./projen.bash eslint\",\n    \"integ\": \"/bin/bash ./projen.bash integ\",\n    \"integ:python-compat\": \"/bin/bash ./projen.bash integ:python-compat\",\n    \"package\": \"/bin/bash ./projen.bash package\",\n    \"package-all\": \"/bin/bash ./projen.bash package-all\",\n    \"package:go\": \"/bin/bash ./projen.bash package:go\",\n    \"package:java\": \"/bin/bash ./projen.bash package:java\",\n    \"package:js\": \"/bin/bash ./projen.bash package:js\",\n    \"package:python\": \"/bin/bash ./projen.bash package:python\",\n    \"post-compile\": \"/bin/bash ./projen.bash post-compile\",\n    \"post-upgrade\": \"/bin/bash ./projen.bash post-upgrade\",\n    \"pre-compile\": \"/bin/bash ./projen.bash pre-compile\",\n    \"readme-macros\": \"/bin/bash ./projen.bash readme-macros\",\n    \"release\": \"/bin/bash ./projen.bash release\",\n    \"test\": \"/bin/bash ./projen.bash test\",\n    \"test:update\": \"/bin/bash ./projen.bash test:update\",\n    \"test:watch\": \"/bin/bash ./projen.bash test:watch\",\n    \"unbump\": \"/bin/bash ./projen.bash unbump\",\n    \"upgrade\": \"/bin/bash ./projen.bash upgrade\",\n    \"watch\": \"/bin/bash ./projen.bash watch\",\n    \"projen\": \"/bin/bash ./projen.bash\"\n  },\n  \"author\": {\n    \"name\": \"Amazon Web Services\",\n    \"url\": \"https://aws.amazon.com\",\n    \"organization\": true\n  },\n  \"devDependencies\": {\n    \"@types/conventional-changelog-config-spec\": \"^2.1.1\",\n    \"@types/fs-extra\": \"^8\",\n    \"@types/glob\": \"^7.2.0\",\n    \"@types/ini\": \"^1.3.31\",\n    \"@types/jest\": \"^27\",\n    \"@types/node\": \"^14\",\n    \"@types/semver\": \"^7.3.12\",\n    \"@types/yargs\": \"^15.0.14\",\n    \"@typescript-eslint/eslint-plugin\": \"^5\",\n    \"@typescript-eslint/parser\": \"^5\",\n    \"all-contributors-cli\": \"^6.20.0\",\n    \"esbuild\": \"^0.15.6\",\n    \"eslint\": \"^8\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-import-resolver-node\": \"^0.3.6\",\n    \"eslint-import-resolver-typescript\": \"^2.7.1\",\n    \"eslint-plugin-import\": \"^2.26.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"jest\": \"^27\",\n    \"jest-junit\": \"^13\",\n    \"jsii\": \"^1.66.0\",\n    \"jsii-diff\": \"^1.66.0\",\n    \"jsii-docgen\": \"^1.8.110\",\n    \"jsii-pacmak\": \"^1.66.0\",\n    \"json-schema\": \"^0.4.0\",\n    \"json5\": \"^2.2.1\",\n    \"markmac\": \"^0.1.146\",\n    \"npm-check-updates\": \"^15\",\n    \"prettier\": \"^2.7.1\",\n    \"standard-version\": \"^9\",\n    \"ts-jest\": \"^27\",\n    \"typescript\": \"^3.9.10\"\n  },\n  \"dependencies\": {\n    \"@iarna/toml\": \"^2.2.5\",\n    \"case\": \"^1.6.3\",\n    \"chalk\": \"^4.1.2\",\n    \"conventional-changelog-config-spec\": \"^2.1.0\",\n    \"fast-json-patch\": \"^3.1.1\",\n    \"fs-extra\": \"^9.1.0\",\n    \"glob\": \"^7\",\n    \"ini\": \"^2.0.0\",\n    \"semver\": \"^7.3.7\",\n    \"shx\": \"^0.3.4\",\n    \"xmlbuilder2\": \"^2.4.1\",\n    \"yaml\": \"2.0.0\",\n    \"yargs\": \"^16.2.0\",\n    \"zlib\": \"^1.0.5\"\n  },\n  \"bundledDependencies\": [\n    \"@iarna/toml\",\n    \"case\",\n    \"chalk\",\n    \"conventional-changelog-config-spec\",\n    \"fast-json-patch\",\n    \"fs-extra\",\n    \"glob\",\n    \"ini\",\n    \"semver\",\n    \"shx\",\n    \"xmlbuilder2\",\n    \"yaml\",\n    \"yargs\",\n    \"zlib\"\n  ],\n  \"keywords\": [\n    \"cdk\",\n    \"cicd\",\n    \"generator\",\n    \"management\",\n    \"project\",\n    \"scaffolding\"\n  ],\n  \"engines\": {\n    \"node\": \">= 14.0.0\"\n  },\n  \"main\": \"lib/index.js\",\n  \"license\": \"Apache-2.0\",\n  \"version\": \"0.0.0\",\n  \"jest\": {\n    \"maxWorkers\": \"50%\",\n    \"testMatch\": [\n      \"<rootDir>/src/**/__tests__/**/*.ts?(x)\",\n      \"<rootDir>/(test|src)/**/*(*.)@(spec|test).ts?(x)\"\n    ],\n    \"clearMocks\": true,\n    \"collectCoverage\": true,\n    \"coverageReporters\": [\n      \"json\",\n      \"lcov\",\n      \"clover\",\n      \"cobertura\"\n    ],\n    \"coverageDirectory\": \"coverage\",\n    \"coveragePathIgnorePatterns\": [\n      \"/node_modules/\"\n    ],\n    \"testPathIgnorePatterns\": [\n      \"/node_modules/\"\n    ],\n    \"watchPathIgnorePatterns\": [\n      \"/node_modules/\"\n    ],\n    \"reporters\": [\n      \"default\",\n      [\n        \"jest-junit\",\n        {\n          \"outputDirectory\": \"test-reports\"\n        }\n      ]\n    ],\n    \"preset\": \"ts-jest\",\n    \"globals\": {\n      \"ts-jest\": {\n        \"tsconfig\": \"tsconfig.dev.json\"\n      }\n    }\n  },\n  \"types\": \"lib/index.d.ts\",\n  \"stability\": \"experimental\",\n  \"jsii\": {\n    \"outdir\": \"dist\",\n    \"targets\": {\n      \"java\": {\n        \"package\": \"io.github.cdklabs.projen\",\n        \"maven\": {\n          \"groupId\": \"io.github.cdklabs\",\n          \"artifactId\": \"projen\"\n        }\n      },\n      \"python\": {\n        \"distName\": \"projen\",\n        \"module\": \"projen\"\n      },\n      \"go\": {\n        \"moduleName\": \"github.com/projen/projen-go\"\n      }\n    },\n    \"tsc\": {\n      \"outDir\": \"lib\",\n      \"rootDir\": \"src\"\n    }\n  },\n  \"resolutions\": {\n    \"@types/prettier\": \"2.6.0\"\n  },\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}"
  },
  {
    "path": "projen.bash",
    "content": "#!/bin/bash\n# ~~ Generated by projen\nset -euo pipefail\nif [ ! -f lib/cli/index.js ]; then\n  echo \"bootstrapping...\"\n  npx jsii --silence-warnings=reserved-word --no-fix-peer-dependencies\nfi\nexec bin/projen $@"
  },
  {
    "path": "rfcs/github-project-settings.md",
    "content": "# External GitHub Repository Settings (RFC #1014)\n\n> **Author**: [@eladb](https://github.com/eladb), **Status**: Draft\n\nProjen is great for managing project-related configuration that is modeled in\nfiles within the git repository. Much of GitHub's configuration (such as issue\ntemplates, workflows, etc) is managed through files under `.github` and to that\nextend, projen lends itself well to maintain these files.\n\nHowever, there are some GitHub repository settings that are not managed through\nfiles in the repos. These include things like branch protection rules,\nauto-merge options, and most noteable are repository secrets. Projen heavily\nrelies on repository secrets for things like publishing tokens.\n\nWhen maintaining many projects, manaing publishing secrets becomes a major\nburden. It is also error prone and has potential security implications. Ideally\nthese secrets should be managed by tooling and not by humans.\n\nGitHub offers some support for centrally managing secrets but these require\norganization-level permissions which are not always available.\n\n## README (working backwards)\n\nLet’s say we have a JSII project. By default, it does not publish to PyPI. Let's\nadd Python publishing to our project.\n\nFirst, we need edit your `projenrc.js` file and add the `publishToPyPi` setting.\nAdditionally, set the `secrets` option to tell Projen to retrieve secrets from\nAWS Secrets Manager (in the future other secret sources will be supported):\n\n```js\nconst projen = require('projen');\n\nconst project = new projen.JsiiProject({\n  // ...\n  \n  secrets: projen.Secrets.fromAwsSecretsManager('arn:aws:secretsmanager:us-east-1:111111111111:secret:projen-publishing-tokens'),\n  publishToPyPi: {\n    distName: 'foo-bar',\n    module: 'foo_bar',\n  },\n});\n```\n\n> NOTE: not sure I like the union-like API, but we can debate that later.\n\nNow, as usual, execute `npx projen`.\n\nUnder the hood, projen uses `gh secret list` to check if your repo has the\ndesired secrets. If not, it will retrieve them from AWS Secrets Manager and\nstore them in your repository via the GitHub API.\n\n```shell\n$ npx projen\nSynthesizing project...\nStoring TWINE_USERNAME from arn:aws:secretsmanager:us-east-1:111111111111:secret:projen-publishing-tokens\nStoring TWINE_PASSWORD from arn:aws:secretsmanager:us-east-1:111111111111:secret:projen-publishing-tokens\nDone\n```\n\n_not sure that’s feasible:_ You will also notice that your\n`.github/workflows/release.yml` workflow was updated and now includes a check\nthat verifeis that your repository has the desired secrets. This is sort of an\n\"anti-tamper check\" for external settings. If your repository does not have the\nneeded secerts, an error will be displayed with instructions on how to store\nthem.\n\nA similar approach can be taken to configure other non-source-code repository\nsettings such as branch protection rules:\n\n```js\n# this should be the default probably\nproject.addBranchProtection(project.defaultBranch);\n```\n\nSimilarly, during synth, given the proper credentials, projen can actually setup\nthe project to align with the definition and a workflow on the default branch\ncan be used to ensure that the project is compliant.\n\n**Prerequisites:** For this to work, you'll need your development box to have\nGitHub CLI installed and logged in, as well as default AWS credentials with\naccess to a secret called `projen-publishing-token` secret in `us-east-1` (as\ndefined by the ARN specified under `secrets`). Projen expects to find a field by\nthe same name as the secret name (e.g. `TWINE_USERNAME` and `TWINE_PASSWORD`)\nstored in JSON format in the secret. Secrets can be stored using the AWS CLI or\nvia the AWS Console.\n\nIn the future we can offer a CLI command to store secrets:\n\n```shell\n$ projen secrets store TWINE_USERNAME \"Boom\"\n$ projen secrets store TWINE_PASSWORD \"Bam\"\n```\n\nSomething like that.\n"
  },
  {
    "path": "rfcs/project-creation-prompt.md",
    "content": "# Project Creation Prompts (RFC #1365)\n\n> **Author**: [@MarkMcCulloh](https://github.com/MarkMcCulloh), **Status**: Draft\n\nWhen hearing about projen for the first time, the typical comparisons one may think of are tools such as `yeoman` or the various projects making use of `npm init`.\nObviously the underlying methodology of projen is quite different, but there is a great UX feature these other tools typically employ that projen can make use of: Guided prompts. This allows users to create a project from an opinionated set of options with friendly guidance. This is especially useful in scenarios where the project requires a value that has no reasonable default (and thus could not be created with projen as it is now without it being provided as a CLI arg).\n\n## Example user flows\n\nNote: All prompts are assuming to be run from a TTY. We should check if in a TTY before a prompt is presented and error otherwise.\n\n`$ npx projen new`\n1. User is shown a list of base projen project types\n1. User selects the `typescript` project\n1. Project is synthesized\n\n`$ npx projen new typescript`\n1. No prompts are shown because a project is selected and the `typescript` project type has no `@featured` required options that do not also have a default\n1. Project is synthesized\n\n`$ npx projen new typescript --prompt`\n1. Prompts are shown for (currently) `packageName` and `description`, as those options are `@featured` and have no default value\n1. Project is synthesized\n\n`$ npx projen new typescript --prompt --package-name cool-name --description 'Terse but useful'`\n1. No prompts are shown because all `@featured` options have been given supplied values already\n1. Project is synthesized\n\n## Details\n\n### Prompt library to use\n\n[Prompts](https://github.com/terkelg/prompts) is an extremely common library for CLI-based prompts. It's relatively small and has very few dependencies.\n\n### Project type prompt\n\nA user should be prompted to select a project type to create. This should be prompted during `projen new` when:\n\n- A project id has not been specified\n- There is more than one project type available\n\nCurrently projen will exit and show the user the help menu. Instead, it should show the user a list of available projects to choose from in the current context. After choosing a project, projen can continue is it normally would have if the user has provided it during the original invocation.\n\n[autocomplete](https://github.com/terkelg/prompts#autocompletemessage-choices-initial-suggest-limit-style) would be a good input type for this as it has a filtering feature.\n\n### Project option prompts\n\nAfter a project type has been selected, the user can be shown a list of featured options to set interactively. For a project option to be available as a prompt during `projen new`:\n\n- `@featured` tag in property docstring\n- Must be able to be set via CLI arg (is a primitive or enum)\n- Must not have already been provided as a CLI arg\n\nBy default, `projen new <project>` will not show prompts unless the `--prompt` flag is provided.\nThere is one exception: If a project option meets the above criteria but is also:\n\n- Non-nullable\n- Not already provided as a CLI arg\n\n### Prompt format\n\nBy default, values sent to the `prompts` library will be derived by the information in the JSII. For example, enums should have their choices populated automatically.\n\nIn case the default logic is insufficient,  `@prompt...` doc tags can be added to override the default. See below for reference.\n\n#### Docstring tag reference\n\n<https://github.com/terkelg/prompts#multiselectmessage-choices-initial-max-hint-warn>\n\n- `@featured` - Functions as it did before, but now also signifies that this option is prompt-able\n- `@promptType` - The type of prompt (text, toggle, etc.). See <https://github.com/terkelg/prompts#-types>.\n  - **Example:** An array type would have a default prompt type of [list](https://github.com/terkelg/prompts#listmessage-initial).  \n  `@promptType multiselect` would allow you to provide a set of distinct options instead.\n- `@promptMessage` - The actual prompt, derived from the docstring summary. See <https://github.com/terkelg/prompts#message>.\n  - Can be used when the type documentation insufficient for use as a prompt.\n- `@promptChoices` - Comma-separated list of choices for this prompt.\n  - Important for types that can't have their available choices automatically derived.  \n  - **Example:** `@promptChoices choice1,choice2` would limit a plain text field into only have those two choices.\n\n## Testing\n\n`prompts` [provides a utility](https://github.com/terkelg/prompts#injectvalues) for injecting responses to prompts. This can be used for testing this functionality without any interaction.\n\n## Documentation\n\nUsage of `--prompt` should be mentioned in the README. Documentation on specifics of this feature should be added into `/docs`.\n\n## Proposed implementation phases\n\nTo keep the implementation PRs small-ish:\n\n1. Add `--prompt` flag to `projen new` that shows basic `text` prompts for `@featured` options\n1. Show certain option prompts even when `--prompt` is not supplied (see above)\n1. Add project type prompts\n1. Derive specific option prompts (text, number, select, etc.) from JSII type info and `@prompt...` overrides\n"
  },
  {
    "path": "scripts/python-compat.sh",
    "content": "#!/bin/bash\nset -euo pipefail\nscriptdir=$(cd $(dirname $0) && pwd)\ndistdir=${scriptdir}/../dist\npythonwheel=${distdir}/python/projen-0.0.0-py3-none-any.whl\n\n# check that projen has been packaged to python\nif [ ! -f ${pythonwheel} ]; then\n  echo \"No python wheel was found. Run a full build of Projen first.\"\n  exit 1\nfi\n\n# prepare testing directory\ntestdir=$(mktemp -d)\nmkdir -p ${testdir}\ncd ${testdir}\n\n# install the packed version of projen for python\npip3 install ${pythonwheel}\n\n# create a projenrc.py file\ncat > ${testdir}/.projenrc.py <<HERE\nfrom projen import Project\n\nproject = Project(name=\"my-project\")\n\nproject.synth()\nHERE\n\n# run the script to make sure there are no import issues\npython3 ${testdir}/.projenrc.py\n\necho \"Success!\"\n"
  },
  {
    "path": "scripts/readme-projects.js",
    "content": "const inventory = require('../lib/inventory');\n\nfor (const p of inventory.discover()) {\n  console.log(`* [${p.pjid}](${p.docsurl}) - ${p.docs}`);\n}"
  },
  {
    "path": "src/_resolve.ts",
    "content": "import { ResolveOptions, IResolvable } from \"./file\";\n\nfunction isResolvable(obj: any): obj is IResolvable {\n  return (obj as IResolvable).toJSON !== undefined;\n}\n\nexport function resolve(value: any, options: ResolveOptions = {}): any {\n  const args = options.args ?? [];\n  const omitEmpty = options.omitEmpty ?? false;\n\n  if (value == null) {\n    return value;\n  }\n\n  if (isResolvable(value)) {\n    const resolved = value.toJSON();\n    return resolve(resolved, options);\n  }\n\n  // if value is a function, call it and resolve the result.\n  if (typeof value === \"function\") {\n    const resolved = value.apply(undefined, args);\n    return resolve(resolved, options);\n  }\n\n  if (typeof value !== \"object\") {\n    return value;\n  }\n\n  if (Array.isArray(value)) {\n    if (omitEmpty && value.length === 0) {\n      return undefined;\n    }\n    return value.map((x) => resolve(x, options)).filter((x) => x != null); // filter undefined/null/omitted\n  }\n\n  // only allow data types (i.e. objects without constructors)\n  if (value.constructor && value.constructor?.name !== \"Object\") {\n    throw new Error(\n      `only data types can be resolved. trying to resolve object of type ${value.constructor?.name}`\n    );\n  }\n\n  const result: any = {};\n\n  for (const [k, v] of Object.entries(value)) {\n    const resolved = resolve(v, options);\n\n    // skip undefined values\n    if (resolved === undefined) {\n      continue;\n    }\n\n    result[k] = resolved;\n  }\n\n  if (omitEmpty && Object.keys(result).length === 0) {\n    return undefined;\n  }\n\n  return result;\n}\n"
  },
  {
    "path": "src/awscdk/auto-discover.ts",
    "content": "import {\n  AutoDiscoverBase,\n  IntegrationTestAutoDiscoverBase,\n  IntegrationTestAutoDiscoverBaseOptions,\n} from \"../cdk\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { AwsCdkDeps } from \"./awscdk-deps\";\nimport {\n  IntegrationTest,\n  IntegrationTestCommonOptions,\n} from \"./integration-test\";\nimport {\n  TYPESCRIPT_EDGE_LAMBDA_EXT,\n  TYPESCRIPT_LAMBDA_EXT,\n  TYPESCRIPT_LAMBDA_EXTENSION_EXT,\n} from \"./internal\";\nimport {\n  LambdaExtension,\n  LambdaExtensionCommonOptions,\n} from \"./lambda-extension\";\nimport { LambdaFunction, LambdaFunctionCommonOptions } from \"./lambda-function\";\n\n/**\n * Common options for auto discovering project subcomponents.\n */\nexport interface AutoDiscoverCommonOptions {\n  /**\n   * Path to the tsconfig file to use for integration tests.\n   */\n  readonly tsconfigPath: string;\n\n  /**\n   * AWS CDK dependency manager.\n   */\n  readonly cdkDeps: AwsCdkDeps;\n}\n\n/**\n * Options for `IntegrationTestAutoDiscover`\n */\nexport interface IntegrationTestAutoDiscoverOptions\n  extends AutoDiscoverCommonOptions,\n    IntegrationTestAutoDiscoverBaseOptions {\n  /**\n   * Options for integration tests.\n   */\n  readonly integrationTestOptions?: IntegrationTestCommonOptions;\n}\n\n/**\n * Creates integration tests from entry points discovered in the test tree.\n */\nexport class IntegrationTestAutoDiscover extends IntegrationTestAutoDiscoverBase {\n  constructor(project: Project, options: IntegrationTestAutoDiscoverOptions) {\n    super(project, options);\n\n    for (const entrypoint of this.entrypoints) {\n      new IntegrationTest(this.project, {\n        entrypoint,\n        cdkDeps: options.cdkDeps,\n        tsconfigPath: options.tsconfigPath,\n        ...options.integrationTestOptions,\n      });\n    }\n  }\n}\n\n/**\n * Options for `LambdaAutoDiscover`\n */\nexport interface LambdaAutoDiscoverOptions extends AutoDiscoverCommonOptions {\n  /**\n   * Project source tree (relative to project output directory).\n   */\n  readonly srcdir: string;\n\n  /**\n   * Options for AWS Lambda functions.\n   */\n  readonly lambdaOptions?: LambdaFunctionCommonOptions;\n}\n\n/**\n * Creates lambdas from entry points discovered in the project's source tree.\n */\nexport class LambdaAutoDiscover extends AutoDiscoverBase {\n  constructor(project: Project, options: LambdaAutoDiscoverOptions) {\n    super(project, {\n      projectdir: options.srcdir,\n      extension: TYPESCRIPT_LAMBDA_EXT,\n    });\n\n    for (const entrypoint of this.entrypoints) {\n      new LambdaFunction(this.project, {\n        entrypoint,\n        cdkDeps: options.cdkDeps,\n        ...options.lambdaOptions,\n      });\n    }\n  }\n}\n\n/**\n * Options for `EdgeLambdaAutoDiscover`\n */\nexport interface EdgeLambdaAutoDiscoverOptions\n  extends AutoDiscoverCommonOptions {\n  /**\n   * Project source tree (relative to project output directory).\n   */\n  readonly srcdir: string;\n\n  /**\n   * Options for AWS Lambda functions.\n   */\n  readonly lambdaOptions?: LambdaFunctionCommonOptions;\n}\n\n/**\n * Creates edge lambdas from entry points discovered in the project's source tree.\n */\nexport class EdgeLambdaAutoDiscover extends AutoDiscoverBase {\n  constructor(project: Project, options: EdgeLambdaAutoDiscoverOptions) {\n    super(project, {\n      projectdir: options.srcdir,\n      extension: TYPESCRIPT_EDGE_LAMBDA_EXT,\n    });\n\n    for (const entrypoint of this.entrypoints) {\n      new LambdaFunction(this.project, {\n        entrypoint,\n        cdkDeps: options.cdkDeps,\n        ...options.lambdaOptions,\n        edgeLambda: true,\n      });\n    }\n  }\n}\n\n/**\n * Options for `LambdaExtensionAutoDiscover`\n */\nexport interface LambdaExtensionAutoDiscoverOptions\n  extends AutoDiscoverCommonOptions {\n  /**\n   * Project source tree (relative to project output directory).\n   */\n  readonly srcdir: string;\n\n  /**\n   * Options for lambda extensions.\n   */\n  readonly lambdaExtensionOptions?: LambdaExtensionCommonOptions;\n}\n\n/**\n * Creates Lambda Extensions from entrypoints discovered in the project's\n * source tree.\n */\nexport class LambdaExtensionAutoDiscover extends AutoDiscoverBase {\n  constructor(project: Project, options: LambdaExtensionAutoDiscoverOptions) {\n    super(project, {\n      projectdir: options.srcdir,\n      extension: TYPESCRIPT_LAMBDA_EXTENSION_EXT,\n    });\n\n    for (const entrypoint of this.entrypoints) {\n      new LambdaExtension(this.project, {\n        entrypoint,\n        cdkDeps: options.cdkDeps,\n        ...options.lambdaExtensionOptions,\n      });\n    }\n  }\n}\n\n/**\n * Options for `AutoDiscover`\n */\nexport interface AutoDiscoverOptions\n  extends LambdaAutoDiscoverOptions,\n    LambdaExtensionAutoDiscoverOptions,\n    IntegrationTestAutoDiscoverOptions {\n  /**\n   * Auto-discover lambda functions.\n   *\n   * @default true\n   */\n  readonly lambdaAutoDiscover?: boolean;\n\n  /**\n   * Auto-discover edge lambda functions.\n   *\n   * @default true\n   */\n  readonly edgeLambdaAutoDiscover?: boolean;\n\n  /**\n   * Auto-discover lambda extensions.\n   *\n   * @default true\n   */\n  readonly lambdaExtensionAutoDiscover?: boolean;\n\n  /**\n   * Auto-discover integration tests.\n   *\n   * @default true\n   */\n  readonly integrationTestAutoDiscover?: boolean;\n}\n\n/**\n * Discovers and creates integration tests and lambdas from code in the\n * project's source and test trees.\n */\nexport class AutoDiscover extends Component {\n  constructor(project: Project, options: AutoDiscoverOptions) {\n    super(project);\n\n    if (options.lambdaAutoDiscover ?? true) {\n      new LambdaAutoDiscover(this.project, {\n        cdkDeps: options.cdkDeps,\n        tsconfigPath: options.tsconfigPath,\n        srcdir: options.srcdir,\n        lambdaOptions: options.lambdaOptions,\n      });\n    }\n\n    if (options.edgeLambdaAutoDiscover ?? true) {\n      new EdgeLambdaAutoDiscover(this.project, {\n        cdkDeps: options.cdkDeps,\n        tsconfigPath: options.tsconfigPath,\n        srcdir: options.srcdir,\n        lambdaOptions: options.lambdaOptions,\n      });\n    }\n\n    if (options.lambdaExtensionAutoDiscover ?? true) {\n      new LambdaExtensionAutoDiscover(this.project, {\n        cdkDeps: options.cdkDeps,\n        tsconfigPath: options.tsconfigPath,\n        srcdir: options.srcdir,\n        lambdaExtensionOptions: options.lambdaExtensionOptions,\n      });\n    }\n\n    if (options.integrationTestAutoDiscover ?? true) {\n      new IntegrationTestAutoDiscover(this.project, {\n        cdkDeps: options.cdkDeps,\n        testdir: options.testdir,\n        tsconfigPath: options.tsconfigPath,\n        integrationTestOptions: options.integrationTestOptions,\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-app-java.ts",
    "content": "import { join } from \"path\";\nimport { DependencyType, SampleDir } from \"..\";\nimport { JavaProject, JavaProjectOptions } from \"../java\";\nimport { AwsCdkDeps, AwsCdkDepsCommonOptions } from \"./awscdk-deps\";\nimport { AwsCdkDepsJava } from \"./awscdk-deps-java\";\nimport { CdkConfig, CdkConfigCommonOptions } from \"./cdk-config\";\nimport { CdkTasks } from \"./cdk-tasks\";\n\nexport interface AwsCdkJavaAppOptions\n  extends JavaProjectOptions,\n    CdkConfigCommonOptions,\n    AwsCdkDepsCommonOptions {\n  /**\n   * The name of the Java class with the static `main()` method. This method\n   * should call `app.synth()` on the CDK app.\n   *\n   * @default \"org.acme.MyApp\"\n   */\n  readonly mainClass: string;\n}\n\n/**\n * AWS CDK app in Java.\n *\n * @pjid awscdk-app-java\n */\nexport class AwsCdkJavaApp extends JavaProject {\n  /**\n   * The `cdk.json` file.\n   */\n  public readonly cdkConfig: CdkConfig;\n\n  /**\n   * CDK dependency management helper class\n   */\n  public readonly cdkDeps: AwsCdkDeps;\n\n  /**\n   * The full name of the main class of the java app (package.Class).\n   */\n  public readonly mainClass: string;\n\n  /**\n   * CDK tasks.\n   */\n  public readonly cdkTasks: CdkTasks;\n\n  /**\n   * The name of the Java package that includes the main class.\n   */\n  public readonly mainPackage: string;\n\n  /**\n   * The name of the Java class with the static `main()` method.\n   */\n  public readonly mainClassName: string;\n\n  constructor(options: AwsCdkJavaAppOptions) {\n    const mainClassComponents = options.mainClass.split(\".\");\n    const mainPackage = mainClassComponents.slice(0, -1);\n    const mainClassName = mainClassComponents[mainClassComponents.length - 1];\n\n    super({\n      ...options,\n      sample: false,\n      sampleJavaPackage: mainPackage.join(\".\"),\n    });\n\n    this.mainClass = options.mainClass;\n    this.mainPackage = mainPackage.join(\".\");\n    this.mainClassName = mainClassName;\n\n    this.cdkDeps = new AwsCdkDepsJava(this, {\n      dependencyType: DependencyType.RUNTIME,\n      ...options,\n    });\n\n    this.cdkTasks = new CdkTasks(this);\n    this.postCompileTask.spawn(this.cdkTasks.synth);\n\n    this.cdkConfig = new CdkConfig(this, {\n      app: `mvn exec:java --quiet -Dexec.mainClass=${this.mainClass}`,\n      featureFlags: this.cdkDeps.cdkMajorVersion < 2,\n      ...options,\n    });\n\n    if (options.sample ?? true) {\n      this.addSample();\n    }\n  }\n\n  /**\n   * Adds an AWS CDK module dependencies\n   *\n   * @param modules The list of modules to depend on (e.g. \"software.amazon.awscdk/aws-lambda\", \"software.amazon.awscdk/aws-iam\", etc)\n   * @deprecated In CDK 2.x all modules are available by default. Alpha modules should be added using the standard 'deps'\n   */\n  public addCdkDependency(...modules: string[]) {\n    for (const m of modules) {\n      this.cdkDeps.addV1Dependencies(m);\n    }\n  }\n\n  private addSample() {\n    const pkg = this.mainPackage.split(\".\");\n    const javaFile = `${this.mainClassName}.java`;\n    new SampleDir(this, join(\"src\", \"main\", \"java\", ...pkg), {\n      files: {\n        [javaFile]: [\n          `package ${pkg.join(\".\")};`,\n          \"\",\n          this.cdkDeps.cdkMajorVersion == 1\n            ? \"import software.amazon.awscdk.core.App;\"\n            : \"import software.amazon.awscdk.App;\",\n          this.cdkDeps.cdkMajorVersion == 1\n            ? \"import software.amazon.awscdk.core.Stack;\"\n            : \"import software.amazon.awscdk.Stack;\",\n          \"\",\n          `public class ${this.mainClassName} {`,\n          \"  public static void main(final String[] args) {\",\n          \"    App app = new App();\",\n          `    new Stack(app, \"${this.name}\");`,\n          \"    app.synth();\",\n          \"  }\",\n          \"}\",\n        ].join(\"\\n\"),\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-app-py.ts",
    "content": "import {\n  AwsCdkDeps,\n  AwsCdkDepsCommonOptions,\n  CdkConfig,\n  CdkConfigCommonOptions,\n  CdkTasks,\n} from \".\";\nimport { Component, DependencyType, SampleDir, SampleFile } from \"..\";\nimport { Pytest } from \"../python/pytest\";\nimport { PythonProject, PythonProjectOptions } from \"../python/python-project\";\nimport { AwsCdkDepsPy } from \"./awscdk-deps-py\";\nimport { AwsCdkPytestSample } from \"./awscdk-pytest-sample\";\n\n/**\n * Options for `AwsCdkPythonApp`\n */\nexport interface AwsCdkPythonAppOptions\n  extends PythonProjectOptions,\n    CdkConfigCommonOptions,\n    AwsCdkDepsCommonOptions {\n  /**\n   * The CDK app's entrypoint (relative to the source directory, which is\n   * \"src\" by default).\n   *\n   * @default \"app.py\"\n   */\n  readonly appEntrypoint?: string;\n  /**\n   * Python sources directory.\n   *\n   * @default \"tests\"\n   */\n  readonly testdir?: string;\n}\n\n/**\n * AWS CDK app in Python\n *\n * @pjid awscdk-app-py\n */\nexport class AwsCdkPythonApp extends PythonProject {\n  /**\n   * Common CDK tasks.\n   */\n  public readonly cdkTasks: CdkTasks;\n\n  /**\n   * cdk.json configuration.\n   */\n  public readonly cdkConfig: CdkConfig;\n\n  public readonly cdkDeps: AwsCdkDeps;\n\n  /**\n   * The CDK app entrypoint\n   */\n  public readonly appEntrypoint: string;\n\n  /**\n   * The directory in which the python tests reside.\n   */\n  public readonly testdir: string;\n\n  /**\n   * The CDK version this app is using.\n   */\n  public get cdkVersion() {\n    return this.cdkDeps.cdkVersion;\n  }\n\n  constructor(options: AwsCdkPythonAppOptions) {\n    super({ ...options, pytest: false, sample: false });\n\n    this.cdkDeps = new AwsCdkDepsPy(this, {\n      dependencyType: DependencyType.RUNTIME,\n      ...options,\n    });\n    this.appEntrypoint = options.appEntrypoint ?? \"app.py\";\n    this.testdir = options.testdir ?? \"tests\";\n\n    this.cdkTasks = new CdkTasks(this);\n    this.postCompileTask.spawn(this.cdkTasks.synthSilent);\n\n    this.cdkConfig = new CdkConfig(this, {\n      app: `python ${this.appEntrypoint}`,\n      featureFlags: this.cdkDeps.cdkMajorVersion < 2,\n      watchIncludes: [\"**\"],\n      watchExcludes: [\n        \"README.md\",\n        \"cdk*.json\",\n        \"requirements*.txt\",\n        \"source.bat\",\n        \"**/__init__.py\",\n        \"python/__pycache__\",\n        \"tests\",\n      ],\n      ...options,\n    });\n\n    if (options.sample ?? true) {\n      new AppCode(this, \"app.py\", this.cdkDeps.cdkMajorVersion);\n      new MyStackCode(this, this.moduleName, this.cdkDeps.cdkMajorVersion);\n    }\n\n    if (options.pytest ?? true) {\n      this.pytest = new Pytest(this, options.pytestOptions);\n      new AwsCdkPytestSample(this, this.pytest.testdir);\n    }\n  }\n}\n\nclass AppCode extends Component {\n  constructor(project: AwsCdkPythonApp, fileName: string, cdkVersion: number) {\n    super(project);\n\n    let versionImport: string;\n    if (cdkVersion < 2) {\n      versionImport = \"from aws_cdk.core import App, Environment\";\n    } else {\n      versionImport = \"from aws_cdk import App, Environment\";\n    }\n\n    new SampleFile(project, fileName, {\n      contents: [\n        \"import os\",\n        versionImport,\n        `from ${project.moduleName}.main import MyStack`,\n        \"\",\n        \"# for development, use account/region from cdk cli\",\n        \"dev_env = Environment(\",\n        \"  account=os.getenv('CDK_DEFAULT_ACCOUNT'),\",\n        \"  region=os.getenv('CDK_DEFAULT_REGION')\",\n        \")\",\n        \"\",\n        \"app = App()\",\n        `MyStack(app, \"${this.project.name}-dev\", env=dev_env)`,\n        `# MyStack(app, \"${this.project.name}-prod\", env=prod_env)`,\n        \"\",\n        \"app.synth()\",\n      ].join(\"\\n\"),\n    });\n  }\n}\n\nclass MyStackCode extends Component {\n  constructor(project: AwsCdkPythonApp, dir: string, cdkMajorVersion: number) {\n    super(project);\n\n    let appFile: string[] = [];\n    appFile.push(\"import os\");\n    if (cdkMajorVersion < 2) {\n      appFile.push(\"from aws_cdk.core import Construct, Stack\");\n    } else {\n      appFile.push(\"from aws_cdk import Stack\");\n      appFile.push(\"from constructs import Construct\");\n    }\n    appFile.push(\"\");\n    appFile.push(\"\");\n    appFile.push(\"class MyStack(Stack):\");\n    appFile.push(\n      \"  def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\"\n    );\n    appFile.push(\"    super().__init__(scope, construct_id, **kwargs)\");\n    appFile.push(\"\");\n    appFile.push(\"    # The code that defines your stack goes here\");\n    appFile.push(\"\");\n\n    new SampleDir(project, dir, {\n      files: {\n        \"__init__.py\": \"\",\n        \"main.py\": appFile.join(\"\\n\"),\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-app-ts.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { TypeScriptAppProject, TypeScriptProjectOptions } from \"../typescript\";\nimport { AutoDiscover } from \"./auto-discover\";\nimport { AwsCdkDeps, AwsCdkDepsCommonOptions } from \"./awscdk-deps\";\nimport { AwsCdkDepsJs } from \"./awscdk-deps-js\";\nimport { CdkConfig, CdkConfigCommonOptions } from \"./cdk-config\";\nimport { CdkTasks } from \"./cdk-tasks\";\nimport { LambdaFunctionCommonOptions } from \"./lambda-function\";\n\nexport interface AwsCdkTypeScriptAppOptions\n  extends TypeScriptProjectOptions,\n    CdkConfigCommonOptions,\n    AwsCdkDepsCommonOptions {\n  /**\n   * The CDK app's entrypoint (relative to the source directory, which is\n   * \"src\" by default).\n   *\n   * @default \"main.ts\"\n   */\n  readonly appEntrypoint?: string;\n\n  /**\n   * Automatically adds an `awscdk.LambdaFunction` for each `.lambda.ts` handler\n   * in your source tree. If this is disabled, you can manually add an\n   * `awscdk.AutoDiscover` component to your project.\n   *\n   * @default true\n   */\n  readonly lambdaAutoDiscover?: boolean;\n\n  /**\n   * Automatically adds an `cloudfront.experimental.EdgeFunction` for each\n   * `.edge-lambda.ts` handler in your source tree. If this is disabled, you can\n   * manually add an `awscdk.AutoDiscover` component to your project.\n   *\n   * @default true\n   */\n  readonly edgeLambdaAutoDiscover?: boolean;\n\n  /**\n   * Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts`\n   * entrypoint in your source tree. If this is disabled, you can manually add an\n   * `awscdk.AutoDiscover` component to your project\n   *\n   * @default true\n   */\n  readonly lambdaExtensionAutoDiscover?: boolean;\n\n  /**\n   * Automatically discovers and creates integration tests for each `.integ.ts`\n   * file in under your test directory.\n   *\n   * @default true\n   */\n  readonly integrationTestAutoDiscover?: boolean;\n\n  /**\n   * Common options for all AWS Lambda functions.\n   *\n   * @default - default options\n   */\n  readonly lambdaOptions?: LambdaFunctionCommonOptions;\n}\n\n/**\n * AWS CDK app in TypeScript\n *\n * @pjid awscdk-app-ts\n */\nexport class AwsCdkTypeScriptApp extends TypeScriptAppProject {\n  /**\n   * The CDK version this app is using.\n   */\n  public get cdkVersion() {\n    return this.cdkDeps.cdkVersion;\n  }\n\n  /**\n   * The CDK app entrypoint\n   */\n  public readonly appEntrypoint: string;\n\n  /**\n   * Common CDK tasks.\n   */\n  public readonly cdkTasks: CdkTasks;\n\n  /**\n   * cdk.json configuration.\n   */\n  public readonly cdkConfig: CdkConfig;\n\n  public readonly cdkDeps: AwsCdkDeps;\n\n  constructor(options: AwsCdkTypeScriptAppOptions) {\n    super({\n      ...options,\n      sampleCode: false,\n      bundlerOptions: {\n        ...options.bundlerOptions,\n\n        // we invoke the \"bundle\" task as part of the build step in cdk.json so\n        // we don't want it to be added to the pre-compile phase.\n        addToPreCompile: false,\n      },\n    });\n\n    this.cdkDeps = new AwsCdkDepsJs(this, {\n      dependencyType: DependencyType.RUNTIME,\n      ...options,\n    });\n    this.appEntrypoint = options.appEntrypoint ?? \"main.ts\";\n\n    // CLI\n    this.addDevDeps(`aws-cdk@${this.cdkDeps.cdkVersion}`);\n\n    // no compile step because we do all of it in typescript directly\n    this.compileTask.reset();\n\n    this.cdkTasks = new CdkTasks(this);\n\n    // add synth to the build\n    this.postCompileTask.spawn(this.cdkTasks.synthSilent);\n\n    const tsConfigFile = this.tsconfig?.fileName;\n    if (!tsConfigFile) {\n      throw new Error(\"Expecting tsconfig.json\");\n    }\n\n    this.cdkConfig = new CdkConfig(this, {\n      app: `npx ts-node -P ${tsConfigFile} --prefer-ts-exts ${path.posix.join(\n        this.srcdir,\n        this.appEntrypoint\n      )}`,\n      featureFlags: this.cdkDeps.cdkMajorVersion < 2,\n      buildCommand: this.runTaskCommand(this.bundler.bundleTask),\n      watchIncludes: [`${this.srcdir}/**/*.ts`, `${this.testdir}/**/*.ts`],\n      watchExcludes: [\n        \"README.md\",\n        \"cdk*.json\",\n        \"**/*.d.ts\",\n        \"**/*.js\",\n        \"tsconfig.json\",\n        \"package*.json\",\n        \"yarn.lock\",\n        \"node_modules\",\n      ],\n      ...options,\n    });\n\n    this.gitignore.exclude(\".parcel-cache/\");\n\n    this.npmignore?.exclude(`${this.cdkConfig.cdkout}/`);\n    this.npmignore?.exclude(\".cdk.staging/\");\n\n    if (this.tsconfig) {\n      this.tsconfig.exclude.push(this.cdkConfig.cdkout);\n    }\n\n    this.addDevDeps(\"ts-node\");\n    if (options.sampleCode ?? true) {\n      new SampleCode(this, this.cdkDeps.cdkMajorVersion);\n    }\n\n    new AutoDiscover(this, {\n      srcdir: this.srcdir,\n      testdir: this.testdir,\n      lambdaOptions: options.lambdaOptions,\n      tsconfigPath: this.tsconfigDev.fileName,\n      cdkDeps: this.cdkDeps,\n      lambdaAutoDiscover: options.lambdaAutoDiscover ?? true,\n      edgeLambdaAutoDiscover: options.edgeLambdaAutoDiscover ?? true,\n      lambdaExtensionAutoDiscover: options.lambdaExtensionAutoDiscover ?? true,\n      integrationTestAutoDiscover: options.integrationTestAutoDiscover ?? true,\n    });\n  }\n\n  /**\n   * Adds an AWS CDK module dependencies\n   * @param modules The list of modules to depend on\n   */\n  public addCdkDependency(...modules: string[]) {\n    return this.cdkDeps.addV1Dependencies(...modules);\n  }\n}\n\nclass SampleCode extends Component {\n  private readonly appProject: AwsCdkTypeScriptApp;\n\n  constructor(\n    project: AwsCdkTypeScriptApp,\n    private readonly cdkMajorVersion: number\n  ) {\n    super(project);\n    this.appProject = project;\n  }\n\n  public synthesize() {\n    const outdir = this.project.outdir;\n    const srcdir = path.join(outdir, this.appProject.srcdir);\n    if (\n      fs.pathExistsSync(srcdir) &&\n      fs.readdirSync(srcdir).filter((x) => x.endsWith(\".ts\"))\n    ) {\n      return;\n    }\n\n    const srcImports = new Array<string>();\n    if (this.cdkMajorVersion < 2) {\n      srcImports.push(\n        \"import { App, Construct, Stack, StackProps } from '@aws-cdk/core';\"\n      );\n    } else {\n      srcImports.push(\"import { App, Stack, StackProps } from 'aws-cdk-lib';\");\n      srcImports.push(\"import { Construct } from 'constructs';\");\n    }\n\n    const srcCode = `${srcImports.join(\"\\n\")}\n\nexport class MyStack extends Stack {\n  constructor(scope: Construct, id: string, props: StackProps = {}) {\n    super(scope, id, props);\n\n    // define resources here...\n  }\n}\n\n// for development, use account/region from cdk cli\nconst devEnv = {\n  account: process.env.CDK_DEFAULT_ACCOUNT,\n  region: process.env.CDK_DEFAULT_REGION,\n};\n\nconst app = new App();\n\nnew MyStack(app, '${this.project.name}-dev', { env: devEnv });\n// new MyStack(app, '${this.project.name}-prod', { env: prodEnv });\n\napp.synth();`;\n\n    fs.mkdirpSync(srcdir);\n    fs.writeFileSync(path.join(srcdir, this.appProject.appEntrypoint), srcCode);\n\n    const testdir = path.join(outdir, this.appProject.testdir);\n    if (\n      fs.pathExistsSync(testdir) &&\n      fs.readdirSync(testdir).filter((x) => x.endsWith(\".ts\"))\n    ) {\n      return;\n    }\n\n    const testImports = new Array<string>();\n    if (this.cdkMajorVersion < 2) {\n      testImports.push(\"import { App } from '@aws-cdk/core';\");\n      testImports.push(\"import { Template } from '@aws-cdk/assertions';\");\n    } else {\n      testImports.push(\"import { App } from 'aws-cdk-lib';\");\n      testImports.push(\"import { Template } from 'aws-cdk-lib/assertions';\");\n    }\n\n    const appEntrypointName = path.basename(\n      this.appProject.appEntrypoint,\n      \".ts\"\n    );\n    const testCode = `${testImports.join(\"\\n\")}\nimport { MyStack } from '../src/${appEntrypointName}';\n\ntest('Snapshot', () => {\n  const app = new App();\n  const stack = new MyStack(app, 'test');\n\n  const template = Template.fromStack(stack);\n  expect(template.toJSON()).toMatchSnapshot();\n});`;\n\n    fs.mkdirpSync(testdir);\n    fs.writeFileSync(\n      path.join(testdir, `${appEntrypointName}.test.ts`),\n      testCode\n    );\n  }\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-construct.ts",
    "content": "import * as semver from \"semver\";\nimport { ConstructLibrary, ConstructLibraryOptions } from \"../cdk\";\nimport { DependencyType } from \"../dependencies\";\nimport { AutoDiscover } from \"./auto-discover\";\nimport { AwsCdkDeps, AwsCdkDepsCommonOptions } from \"./awscdk-deps\";\nimport { AwsCdkDepsJs } from \"./awscdk-deps-js\";\nimport { LambdaFunctionCommonOptions } from \"./lambda-function\";\n\n/**\n * Options for `AwsCdkConstructLibrary`.\n */\nexport interface AwsCdkConstructLibraryOptions\n  extends ConstructLibraryOptions,\n    AwsCdkDepsCommonOptions {\n  /**\n   * Automatically adds an `aws_lambda.Function` for each `.lambda.ts` handler\n   * in your source tree. If this is disabled, you either need to explicitly\n   * call `aws_lambda.Function.autoDiscover()` or define a `new\n   * aws_lambda.Function()` for each handler.\n   *\n   * @default true\n   */\n  readonly lambdaAutoDiscover?: boolean;\n\n  /**\n   * Automatically adds an `cloudfront.experimental.EdgeFunction` for each\n   * `.edge-lambda.ts` handler in your source tree. If this is disabled, you can\n   * manually add an `awscdk.AutoDiscover` component to your project.\n   *\n   * @default true\n   */\n  readonly edgeLambdaAutoDiscover?: boolean;\n\n  /**\n   * Automatically adds an `awscdk.LambdaExtension` for each `.lambda-extension.ts`\n   * entrypoint in your source tree. If this is disabled, you can manually add an\n   * `awscdk.AutoDiscover` component to your project\n   *\n   * @default true\n   */\n  readonly lambdaExtensionAutoDiscover?: boolean;\n\n  /**\n   * Automatically discovers and creates integration tests for each `.integ.ts`\n   * file in under your test directory.\n   *\n   * @default true\n   */\n  readonly integrationTestAutoDiscover?: boolean;\n\n  /**\n   * Common options for all AWS Lambda functions.\n   *\n   * @default - default options\n   */\n  readonly lambdaOptions?: LambdaFunctionCommonOptions;\n}\n\n/**\n * AWS CDK construct library project\n *\n * A multi-language (jsii) construct library which vends constructs designed to\n * use within the AWS CDK with a friendly workflow and automatic publishing to\n * the construct catalog.\n *\n * @pjid awscdk-construct\n */\nexport class AwsCdkConstructLibrary extends ConstructLibrary {\n  public readonly cdkDeps: AwsCdkDeps;\n\n  constructor(options: AwsCdkConstructLibraryOptions) {\n    const cdkMajorVersion = semver.parse(options.cdkVersion)?.major;\n\n    super({\n      peerDependencyOptions:\n        cdkMajorVersion === 1\n          ? {\n              pinnedDevDependency: false,\n            }\n          : undefined,\n      workflowContainerImage: determineWorkflowContainerImage(\n        options,\n        cdkMajorVersion\n      ),\n      ...options,\n    });\n\n    this.cdkDeps = new AwsCdkDepsJs(this, {\n      // since this we are a library, dependencies should be added a peers\n      dependencyType: DependencyType.PEER,\n      ...options,\n    });\n\n    new AutoDiscover(this, {\n      srcdir: this.srcdir,\n      testdir: this.testdir,\n      lambdaOptions: options.lambdaOptions,\n      tsconfigPath: this.tsconfigDev.fileName,\n      cdkDeps: this.cdkDeps,\n      lambdaAutoDiscover: options.lambdaAutoDiscover ?? true,\n      edgeLambdaAutoDiscover: options.edgeLambdaAutoDiscover ?? true,\n      lambdaExtensionAutoDiscover: options.lambdaExtensionAutoDiscover ?? true,\n      integrationTestAutoDiscover: options.integrationTestAutoDiscover ?? true,\n    });\n  }\n\n  /**\n   * The target CDK version for this library.\n   */\n  public get cdkVersion() {\n    return this.cdkDeps.cdkVersion;\n  }\n\n  /**\n   * @deprecated use `cdkVersion`\n   */\n  public get version() {\n    return this.cdkVersion;\n  }\n\n  /**\n   * Adds dependencies to AWS CDK modules.\n   *\n   * Since this is a library project, dependencies will be added as peer dependencies.\n   *\n   * @param deps names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n   * @deprecated Not supported in v2. For v1, use `project.cdkDeps.addV1Dependencies()`\n   */\n  public addCdkDependencies(...deps: string[]) {\n    return this.cdkDeps.addV1Dependencies(...deps);\n  }\n\n  /**\n   * Adds AWS CDK modules as dev dependencies.\n   *\n   * @param deps names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n   * @deprecated Not supported in v2. For v1, use `project.cdkDeps.addV1DevDependencies()`\n   */\n  public addCdkTestDependencies(...deps: string[]) {\n    return this.cdkDeps.addV1DevDependencies(...deps);\n  }\n}\n\nfunction determineWorkflowContainerImage(\n  options: AwsCdkConstructLibraryOptions,\n  cdkMajorVersion: number | undefined\n): string | undefined {\n  // if the user specifies the workflow container image explicitly, use that\n  if (options.workflowContainerImage) {\n    return options.workflowContainerImage;\n  }\n\n  // if the user specifies minimum node version, then JsiiProject will take care of\n  // determining the workflow container image from that, so we return \"undefined\"\n  if (options.minNodeVersion) {\n    return undefined;\n  }\n\n  // otherwise, choose a workflow container image based on the CDK version\n  if (cdkMajorVersion === 1) {\n    return \"jsii/superchain:1-buster-slim\";\n  }\n\n  if (cdkMajorVersion === 2) {\n    return \"jsii/superchain:1-buster-slim-node14\";\n  }\n\n  return undefined;\n}\n\n/** @deprecated use `AwsCdkConstructLibraryOptions` */\nexport interface ConstructLibraryAwsOptions\n  extends AwsCdkConstructLibraryOptions {}\n\n/** @deprecated use `AwsCdkConstructLibrary` */\nexport class ConstructLibraryAws extends AwsCdkConstructLibrary {}\n"
  },
  {
    "path": "src/awscdk/awscdk-deps-java.ts",
    "content": "import { AwsCdkDeps, AwsCdkPackageNames } from \"./awscdk-deps\";\n\n/**\n * Manages dependencies on the AWS CDK for Java projects.\n */\nexport class AwsCdkDepsJava extends AwsCdkDeps {\n  protected packageNames(): AwsCdkPackageNames {\n    return {\n      coreV1: \"software.amazon.awscdk/core\",\n      coreV2: \"software.amazon.awscdk/aws-cdk-lib\",\n      constructs: \"software.constructs/constructs\",\n      assertions: \"software.amazon.awscdk/assertions\",\n    };\n  }\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-deps-js.ts",
    "content": "import { AwsCdkDeps, AwsCdkPackageNames } from \"./awscdk-deps\";\n\n/**\n * Manages dependencies on the AWS CDK for Node.js projects.\n */\nexport class AwsCdkDepsJs extends AwsCdkDeps {\n  protected packageNames(): AwsCdkPackageNames {\n    return {\n      coreV1: \"@aws-cdk/core\",\n      coreV2: \"aws-cdk-lib\",\n      constructs: \"constructs\",\n      assert: \"@aws-cdk/assert\",\n      assertions: \"@aws-cdk/assertions\",\n    };\n  }\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-deps-py.ts",
    "content": "import { AwsCdkDeps, AwsCdkPackageNames } from \"./awscdk-deps\";\n\n/**\n * Manages dependencies on the AWS CDK for Python projects.\n */\nexport class AwsCdkDepsPy extends AwsCdkDeps {\n  protected packageNames(): AwsCdkPackageNames {\n    return {\n      coreV1: \"aws_cdk.core\",\n      coreV2: \"aws-cdk-lib\",\n      constructs: \"constructs\",\n      assert: \"aws_cdk.assert\",\n      assertions: \"aws_cdk.assertions\",\n    };\n  }\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-deps.ts",
    "content": "import * as semver from \"semver\";\nimport { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\n\n/**\n * Options for `AwsCdkDeps`\n */\nexport interface AwsCdkDepsCommonOptions {\n  /**\n   * Minimum version of the AWS CDK to depend on.\n   *\n   * @default \"2.1.0\"\n   */\n  readonly cdkVersion: string;\n\n  /**\n   * Minimum version of the `constructs` library to depend on.\n   *\n   * @default - for CDK 1.x the default is \"3.2.27\", for CDK 2.x the default is\n   * \"10.0.5\".\n   */\n  readonly constructsVersion?: string;\n\n  /**\n   * Use pinned version instead of caret version for CDK.\n   *\n   * You can use this to prevent mixed versions for your CDK dependencies and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   */\n  readonly cdkVersionPinning?: boolean;\n\n  /**\n   * Which AWS CDKv1 modules this project requires\n   *\n   * @deprecated For CDK 2.x use \"deps\" instead. (or \"peerDeps\" if you're building a library)\n   */\n  readonly cdkDependencies?: string[];\n\n  /**\n   * If this is enabled (default), all modules declared in `cdkDependencies` will be also added as\n   * normal `dependencies` (as well as `peerDependencies`).\n   *\n   * This is to ensure that downstream consumers actually have your CDK dependencies installed\n   * when using npm < 7 or yarn, where peer dependencies are not automatically installed.\n   * If this is disabled, `cdkDependencies` will be added to `devDependencies` to ensure\n   * they are present during development.\n   *\n   * Note: this setting only applies to construct library projects\n   *\n   * @default true\n   * @deprecated Not supported in CDK v2.\n   */\n  readonly cdkDependenciesAsDeps?: boolean;\n\n  /**\n   * Warning: NodeJS only.\n   * Install the @aws-cdk/assert library?\n   *\n   * @default - will be included by default for AWS CDK >= 1.0.0 < 2.0.0\n   * @deprecated The @aws-cdk/assert library is deprecated in favor of\n   * @aws-cdk/assertions (in V1) and included in `aws-cdk-lib` for V2.\n   */\n  readonly cdkAssert?: boolean;\n\n  /**\n   * Install the assertions library?\n   *\n   * Only needed for CDK 1.x. If using CDK 2.x then\n   * assertions is already included in 'aws-cdk-lib'\n   *\n   * @default - will be included by default for AWS CDK >= 1.111.0 < 2.0.0\n   */\n  readonly cdkAssertions?: boolean;\n\n  /**\n   * AWS CDK modules required for testing.\n   *\n   * @deprecated For CDK 2.x use 'devDeps' (in node.js projects) or 'testDeps' (in java projects) instead\n   */\n  readonly cdkTestDependencies?: string[];\n}\n\nexport interface AwsCdkDepsOptions extends AwsCdkDepsCommonOptions {\n  /**\n   * The type of dependency to use for runtime AWS CDK and `constructs` modules.\n   *\n   * For libraries, use peer dependencies and for apps use runtime dependencies.\n   */\n  readonly dependencyType: DependencyType;\n}\n\n/**\n * Language-specific AWS CDK package names.\n */\nexport interface AwsCdkPackageNames {\n  /**\n   * Fully qualified name of the core framework package for CDKv1\n   */\n  readonly coreV1: string;\n  /**\n   * Fully qualified name of the core framework package for CDKv2\n   */\n  readonly coreV2: string;\n  /**\n   * Fully qualified name of the constructs library package\n   */\n  readonly constructs: string;\n  /**\n   * Fully qualified name of the assertions library package\n   */\n  readonly assertions: string;\n  /**\n   * Fully qualified name of the assert library package\n   * Can be empty as it's only really available for javascript projects\n   */\n  readonly assert?: string;\n}\n\n/**\n * Manages dependencies on the AWS CDK.\n */\nexport abstract class AwsCdkDeps extends Component {\n  /**\n   * The dependency requirement for AWS CDK (e.g. `^2.0.0`).\n   */\n  public readonly cdkVersion: string;\n\n  /**\n   * The minimum version of the AWS CDK (e.g. `2.0.0`).\n   */\n  public readonly cdkMinimumVersion: string;\n\n  /**\n   * Whether CDK dependencies are added as normal dependencies (and peer dependencies).\n   * @deprecated Not used for CDK 2.x\n   */\n  public readonly cdkDependenciesAsDeps: boolean;\n\n  /**\n   * The major version of the AWS CDK (e.g. 1, 2, ...)\n   */\n  public readonly cdkMajorVersion: number;\n\n  private readonly dependencyType: DependencyType;\n\n  private readonly _packageNames: AwsCdkPackageNames;\n\n  constructor(project: Project, options: AwsCdkDepsOptions) {\n    super(project);\n\n    this.cdkDependenciesAsDeps = options.cdkDependenciesAsDeps ?? true;\n\n    this.dependencyType = options.dependencyType;\n    this._packageNames = this.packageNames();\n\n    const framework = determineFrameworkVersion(options);\n\n    this.cdkVersion = framework.range;\n    this.cdkMajorVersion = framework.major;\n    this.cdkMinimumVersion = framework.minimum;\n\n    this.addFrameworkDependency(options);\n\n    // assert/assertions library\n    this.addV1AssertionLibraryDependency(options);\n\n    // constructs library\n    this.addConstructsDependency(options.constructsVersion);\n\n    // user-defined v1 dependencies (will only fail in CDK v2 if these have values)\n    this.addV1Dependencies(...(options.cdkDependencies ?? []));\n    this.addV1DevDependencies(...(options.cdkTestDependencies ?? []));\n  }\n\n  public preSynthesize(): void {\n    // Log a warning if any AWS CDK v1-only deps are found in the dependencies.\n    const depNames = Array.from(\n      new Set(this.project.deps.all.map((dep) => dep.name))\n    );\n    const v1Deps = depNames\n      .filter((dep) =>\n        [PACKAGE_AWS_CDK_VERSION.V1].includes(cdkVersionOfPackage(dep))\n      )\n      .sort();\n    if (this.cdkMajorVersion === 2 && v1Deps.length > 0) {\n      this.project.logger.warn(\n        `WARNING: Found CDK v1 deps in your project, even though your \"cdkVersion\" is 2.x: [${v1Deps.join(\n          \", \"\n        )}]. Check out https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html for more information about using CDK v2 dependencies.`\n      );\n    }\n  }\n\n  /**\n   * Adds dependencies to AWS CDK modules.\n   *\n   * The type of dependency is determined by the `dependencyType` option.\n   *\n   * This method is not supported in CDK v2. Use `project.addPeerDeps()` or\n   * `project.addDeps()` as appropriate.\n   *\n   * @param deps names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n   */\n  public addV1Dependencies(...deps: string[]) {\n    if (deps.length > 0 && this.cdkMajorVersion !== 1) {\n      throw new Error(\n        \"addV1Dependencies() is not supported for CDK 2.x and above, use addDeps() or addPeerDeps() instead\"\n      );\n    }\n\n    // this will add dependencies based on the type requested by the user\n    // for libraries, this will be \"peer\" and for apps it will be \"runtime\"\n    this.addV1DependenciesByType(this.dependencyType, ...deps);\n\n    // add deps as runtime deps if `cdkDepsAsDeps` is true\n    if (this.cdkDependenciesAsDeps) {\n      this.addV1DependenciesByType(DependencyType.RUNTIME, ...deps);\n    }\n  }\n\n  /**\n   * Adds AWS CDK modules as dev dependencies.\n   *\n   * This method is not supported in CDK v2. Use `project.addPeerDeps()` or\n   * `project.addDeps()` as appropriate.\n   *\n   * @param deps fully qualified names of cdk modules (e.g. `@aws-cdk/aws-lambda`).\n   */\n  public addV1DevDependencies(...deps: string[]) {\n    if (deps.length > 0 && this.cdkMajorVersion !== 1) {\n      throw new Error(\n        \"addV1DevDependencies() is not supported for CDK 2.x and above, use addDevDeps()/addTestDeps() instead\"\n      );\n    }\n\n    this.addV1DependenciesByType(DependencyType.BUILD, ...deps);\n  }\n\n  private addConstructsDependency(requestedVersion: string | undefined) {\n    if (requestedVersion && !semver.parse(requestedVersion)) {\n      throw new Error(\n        `\"constructsVersion\" cannot be parsed as a semver version: ${requestedVersion}`\n      );\n    }\n\n    const defaultVersion = this.cdkMajorVersion === 1 ? \"3.2.27\" : \"10.0.5\";\n    const versionRequirement = `^${requestedVersion ?? defaultVersion}`;\n\n    const constructsMajorVersion = semver.minVersion(versionRequirement)?.major;\n    if (!constructsMajorVersion) {\n      throw new Error(\n        `Cannot determine major version of constructs version '${versionRequirement}'`\n      );\n    }\n\n    switch (this.cdkMajorVersion) {\n      case 1:\n        if (constructsMajorVersion !== 3) {\n          throw new Error(\"AWS CDK 1.x requires constructs 3.x\");\n        }\n        break;\n\n      case 2:\n        if (constructsMajorVersion !== 10) {\n          throw new Error(\"AWS CDK 2.x requires constructs 10.x\");\n        }\n        break;\n    }\n\n    this.project.deps.addDependency(\n      `${this._packageNames.constructs}@${versionRequirement}`,\n      this.dependencyType\n    );\n\n    return versionRequirement;\n  }\n\n  /**\n   * Adds a dependency on the AWS CDK framework (e.g. `@aws-cdk/core` for V1 or `aws-cdk-lib` for V1).\n   */\n  private addFrameworkDependency(options: AwsCdkDepsOptions) {\n    switch (this.cdkMajorVersion) {\n      case 1:\n        this.addV1Dependencies(this._packageNames.coreV1);\n        break;\n\n      case 2:\n        if (options.cdkDependencies !== undefined) {\n          throw new Error(\n            'cdkDependencies is not used for CDK 2.x. Use \"peerDeps\" or \"deps\" instead'\n          );\n        }\n        if (options.cdkDependenciesAsDeps !== undefined) {\n          throw new Error(\"cdkDependenciesAsDeps is not used for CDK 2.x\");\n        }\n        if (options.cdkTestDependencies !== undefined) {\n          throw new Error(\n            'cdkTestDependencies is not used for CDK 2.x. Use \"devDeps\" or \"testDeps\" instead'\n          );\n        }\n\n        this.project.deps.addDependency(\n          `${this._packageNames.coreV2}@${this.cdkVersion}`,\n          this.dependencyType\n        );\n        break;\n\n      default:\n        throw new Error(\n          `Unsupported AWS CDK major version ${this.cdkMajorVersion}.x`\n        );\n    }\n  }\n\n  private addV1AssertionLibraryDependency(options: AwsCdkDepsOptions) {\n    if (this.cdkMajorVersion !== 1) {\n      if (options.cdkAssert !== undefined) {\n        throw new Error(\n          \"cdkAssert is not used for CDK 2.x. Use the assertions library that is provided in aws-cdk-lib\"\n        );\n      }\n      if (options.cdkAssertions !== undefined) {\n        throw new Error(\n          \"cdkAssertion is not used for CDK 2.x. Use the assertions library that is provided in aws-cdk-lib\"\n        );\n      }\n\n      return;\n    }\n\n    const testDeps = new Array<string>();\n\n    if ((options.cdkAssert ?? true) && this._packageNames.assert) {\n      testDeps.push(this._packageNames.assert);\n    }\n\n    // @aws-cdk/assertions is only available starting v1.111.0\n    if (\n      semver.gte(this.cdkMinimumVersion, \"1.111.0\") &&\n      (options.cdkAssertions ?? true)\n    ) {\n      testDeps.push(this._packageNames.assertions);\n    }\n\n    this.addV1DependenciesByType(DependencyType.TEST, ...testDeps);\n  }\n\n  /**\n   * Adds a set of dependencies with the user-specified dependency type.\n   * @param deps The set of dependency specifications\n   */\n  private addV1DependenciesByType(type: DependencyType, ...modules: string[]) {\n    for (const module of modules) {\n      this.project.deps.addDependency(`${module}@${this.cdkVersion}`, type);\n    }\n  }\n\n  /**\n   * Return a configuration object with information about package naming in various languages\n   */\n  protected abstract packageNames(): AwsCdkPackageNames;\n}\n\n/**\n * Which AWS CDK version a construct library package belongs to.\n */\nenum PACKAGE_AWS_CDK_VERSION {\n  V1 = \"v1\",\n  V2 = \"v2\",\n  EITHER = \"either\", // This package has been published both for v1 and v2.\n  UNKNOWN = \"unknown\",\n}\n\nfunction cdkVersionOfPackage(packageName: string) {\n  if (packageName === \"aws-cdk-lib\") {\n    return PACKAGE_AWS_CDK_VERSION.V2;\n  } else if (packageName.startsWith(\"@aws-cdk/\")) {\n    if (packageName.endsWith(\"-alpha\")) {\n      return PACKAGE_AWS_CDK_VERSION.V2;\n    } else if (AWS_CDK_V1_V2_SCOPED_PACKAGES.includes(packageName)) {\n      return PACKAGE_AWS_CDK_VERSION.EITHER;\n    } else {\n      return PACKAGE_AWS_CDK_VERSION.V1;\n    }\n  } else {\n    return PACKAGE_AWS_CDK_VERSION.UNKNOWN;\n  }\n}\n\n/**\n * A list of all known packages in the \"@aws-cdk/\" scope that are published\n * both for v1 and v2.\n */\nconst AWS_CDK_V1_V2_SCOPED_PACKAGES = [\n  \"@aws-cdk/cfnspec\",\n  \"@aws-cdk/cx-api\",\n  \"@aws-cdk/region-info\",\n  \"@aws-cdk/cloud-assembly-schema\",\n  \"@aws-cdk/assert\",\n  \"@aws-cdk/cloudformation-diff\",\n];\n\nfunction determineFrameworkVersion(options: AwsCdkDepsOptions) {\n  const ver = semver.parse(options.cdkVersion);\n  if (!ver) {\n    throw new Error(\n      `\"cdkVersion\" cannot be parsed as a semver version: ${options.cdkVersion}`\n    );\n  }\n\n  return {\n    minimum: ver.format(),\n    range: options.cdkVersionPinning\n      ? options.cdkVersion\n      : `^${options.cdkVersion}`,\n    major: ver.major,\n  };\n}\n"
  },
  {
    "path": "src/awscdk/awscdk-pytest-sample.ts",
    "content": "import { Component, SampleDir } from \"..\";\nimport { AwsCdkPythonApp } from \"./awscdk-app-py\";\n\nexport class AwsCdkPytestSample extends Component {\n  constructor(project: AwsCdkPythonApp, testdir: string) {\n    super(project);\n\n    new SampleDir(project, testdir, {\n      files: {\n        \"__init__.py\": \"\",\n        \"test_example.py\": [\n          \"import pytest\",\n          \"from aws_cdk import App\",\n          \"from aws_cdk.assertions import Template\",\n          \"\",\n          `from ${project.moduleName}.main import MyStack`,\n          \"\",\n          \"@pytest.fixture(scope='module')\",\n          \"def template():\",\n          \"  app = App()\",\n          '  stack = MyStack(app, \"my-stack-test\")',\n          \"  template = Template.from_stack(stack)\",\n          \"  yield template\",\n          \"\",\n          `def test_no_buckets_found(template):`,\n          '  template.resource_count_is(\"AWS::S3::Bucket\", 0)',\n          \"\",\n        ].join(\"\\n\"),\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/awscdk/cdk-config.ts",
    "content": "import { Component } from \"../component\";\nimport { JsonFile } from \"../json\";\nimport { Project } from \"../project\";\nimport { FEATURE_FLAGS } from \"./internal\";\n\n/**\n * Common options for `cdk.json`.\n */\nexport interface CdkConfigCommonOptions {\n  /**\n   * Additional context to include in `cdk.json`.\n   *\n   * @default - no additional context\n   */\n  readonly context?: { [key: string]: any };\n\n  /**\n   * Include all feature flags in cdk.json\n   *\n   * @default true\n   */\n  readonly featureFlags?: boolean;\n\n  /**\n   * To protect you against unintended changes that affect your security posture,\n   * the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.\n   *\n   * @default ApprovalLevel.BROADENING\n   */\n  readonly requireApproval?: ApprovalLevel;\n\n  /**\n   * cdk.out directory.\n   *\n   * @default \"cdk.out\"\n   */\n  readonly cdkout?: string;\n\n  /**\n   * A command to execute before synthesis. This command will be called when\n   * running `cdk synth` or when `cdk watch` identifies a change in your source\n   * code before redeployment.\n   *\n   * @default - no build command\n   */\n  readonly buildCommand?: string;\n\n  /**\n   * Glob patterns to include in `cdk watch`.\n   *\n   * @default []\n   */\n  readonly watchIncludes?: string[];\n\n  /**\n   * Glob patterns to exclude from `cdk watch`.\n   *\n   * @default []\n   */\n  readonly watchExcludes?: string[];\n}\n\n/**\n * Options for `CdkJson`.\n */\nexport interface CdkConfigOptions extends CdkConfigCommonOptions {\n  /**\n   * The command line to execute in order to synthesize the CDK application\n   * (language specific).\n   */\n  readonly app: string;\n}\n\n/**\n * Represents cdk.json file.\n */\nexport class CdkConfig extends Component {\n  /**\n   * Represents the JSON file.\n   */\n  public readonly json: JsonFile;\n\n  /**\n   * Name of the cdk.out directory.\n   */\n  public readonly cdkout: string;\n\n  /**\n   * List of glob patterns to be included by CDK.\n   */\n  private readonly _include: string[];\n\n  /**\n   * List of glob patterns to be excluded by CDK.\n   */\n  private readonly _exclude: string[];\n\n  constructor(project: Project, options: CdkConfigOptions) {\n    super(project);\n\n    this.cdkout = options.cdkout ?? \"cdk.out\";\n    this._include = options.watchIncludes ?? [];\n    this._exclude = options.watchExcludes ?? [];\n\n    const context: Record<string, any> = { ...options.context };\n    const fflags = options.featureFlags ?? true;\n    if (fflags) {\n      for (const flag of FEATURE_FLAGS) {\n        context[flag] = true;\n      }\n    }\n\n    this.json = new JsonFile(project, \"cdk.json\", {\n      omitEmpty: true,\n      obj: {\n        app: options.app,\n        context: context,\n        requireApproval: options.requireApproval,\n        output: this.cdkout,\n        build: options.buildCommand,\n        watch: {\n          include: () => this._include,\n          exclude: () => this._exclude,\n        },\n      },\n    });\n\n    project.gitignore.exclude(`/${this.cdkout}/`);\n    project.gitignore.exclude(\".cdk.staging/\");\n  }\n\n  /**\n   * Add includes to `cdk.json`.\n   * @param patterns The includes to add.\n   */\n  public addIncludes(...patterns: string[]) {\n    this._include.push(...patterns);\n  }\n\n  /**\n   * Add excludes to `cdk.json`.\n   * @param patterns The excludes to add.\n   */\n  public addExcludes(...patterns: string[]) {\n    this._exclude.push(...patterns);\n  }\n\n  /**\n   * List of glob patterns to be included by CDK.\n   */\n  public get include(): string[] {\n    return [...this._include];\n  }\n\n  /**\n   * List of glob patterns to be excluded by CDK.\n   */\n  public get exclude(): string[] {\n    return [...this._exclude];\n  }\n}\n\n/**\n * Which approval is required when deploying CDK apps.\n */\nexport enum ApprovalLevel {\n  /**\n   * Approval is never required\n   */\n  NEVER = \"never\",\n  /**\n   * Requires approval on any IAM or security-group-related change\n   */\n  ANY_CHANGE = \"any-change\",\n  /**\n   * Requires approval when IAM statements or traffic rules are added; removals don't require approval\n   */\n  BROADENING = \"broadening\",\n}\n"
  },
  {
    "path": "src/awscdk/cdk-tasks.ts",
    "content": "import { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\n\n/**\n * Adds standard AWS CDK tasks to your project.\n */\nexport class CdkTasks extends Component {\n  /**\n   * Synthesizes your app.\n   */\n  public readonly synth: Task;\n\n  /**\n   * Synthesizes your app and suppresses stdout.\n   */\n  public readonly synthSilent: Task;\n\n  /**\n   * Deploys your app.\n   */\n  public readonly deploy: Task;\n\n  /**\n   * Destroys all the stacks.\n   */\n  public readonly destroy: Task;\n\n  /**\n   * Diff against production.\n   */\n  public readonly diff: Task;\n\n  /**\n   * Watch task.\n   */\n  public readonly watch: Task;\n\n  constructor(project: Project) {\n    super(project);\n\n    this.synth = project.addTask(\"synth\", {\n      description: \"Synthesizes your cdk app into cdk.out\",\n      exec: \"cdk synth\",\n    });\n\n    this.synthSilent = project.addTask(\"synth:silent\", {\n      description:\n        'Synthesizes your cdk app into cdk.out and suppresses the template in stdout (part of \"yarn build\")',\n      exec: \"cdk synth -q\",\n    });\n\n    this.deploy = project.addTask(\"deploy\", {\n      description: \"Deploys your CDK app to the AWS cloud\",\n      exec: \"cdk deploy\",\n    });\n\n    this.destroy = project.addTask(\"destroy\", {\n      description: \"Destroys your cdk app in the AWS cloud\",\n      exec: \"cdk destroy\",\n    });\n\n    this.diff = project.addTask(\"diff\", {\n      description: \"Diffs the currently deployed app against your code\",\n      exec: \"cdk diff\",\n    });\n\n    // typescript projects already have a \"watch\" task, we we will repurpose it\n    const watch = project.tasks.tryFind(\"watch\") ?? project.addTask(\"watch\");\n\n    watch.reset();\n    watch.description =\n      \"Watches changes in your source code and rebuilds and deploys to the current account\";\n\n    // deploy first because surprisingly watch is not deploying first\n    // see https://github.com/aws/aws-cdk/issues/17776\n    watch.exec(\"cdk deploy --hotswap\");\n\n    // now we are ready to watch\n    watch.exec(\"cdk watch\");\n\n    this.watch = watch;\n  }\n}\n"
  },
  {
    "path": "src/awscdk/index.ts",
    "content": "export * from \"./auto-discover\";\nexport * from \"./awscdk-app-java\";\nexport * from \"./awscdk-app-py\";\nexport * from \"./awscdk-app-ts\";\nexport * from \"./awscdk-construct\";\nexport * from \"./awscdk-deps\";\nexport * from \"./awscdk-deps-java\";\nexport * from \"./awscdk-deps-js\";\nexport * from \"./cdk-config\";\nexport * from \"./cdk-tasks\";\nexport * from \"./integration-test\";\nexport * from \"./lambda-function\";\nexport * from \"./lambda-extension\";\n"
  },
  {
    "path": "src/awscdk/integration-test.ts",
    "content": "import { join } from \"path\";\nimport { IntegrationTestBase, IntegrationTestBaseOptions } from \"../cdk\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\nimport { AwsCdkDeps } from \"./awscdk-deps\";\nimport { FEATURE_FLAGS } from \"./internal\";\n\nexport interface IntegrationTestCommonOptions {\n  /**\n   * Destroy the test app after a successful deployment. If disabled, leaves the\n   * app deployed in the dev account.\n   * @default true\n   */\n  readonly destroyAfterDeploy?: boolean;\n\n  /**\n   * Enables path metadata, adding `aws:cdk:path`, with the defining construct's\n   * path, to the CloudFormation metadata for each synthesized resource.\n   * @default false\n   */\n  readonly pathMetadata?: boolean;\n}\n\n/**\n * Options for `IntegrationTest`.\n */\nexport interface IntegrationTestOptions\n  extends IntegrationTestCommonOptions,\n    IntegrationTestBaseOptions {\n  /**\n   * A list of stacks within the integration test to deploy/destroy.\n   * @default [\"**\"]\n   */\n  readonly stacks?: string[];\n\n  /**\n   * AWS CDK dependency manager.\n   */\n  readonly cdkDeps: AwsCdkDeps;\n}\n\n/**\n * Cloud integration tests.\n */\nexport class IntegrationTest extends IntegrationTestBase {\n  /**\n   * Destroy the integration test resources\n   */\n  public readonly destroyTask: Task;\n\n  /**\n   * The watch task.\n   */\n  public readonly watchTask: Task;\n\n  constructor(project: Project, options: IntegrationTestOptions) {\n    super(project, options);\n\n    if (!project.deps.tryGetDependency(\"aws-cdk\")) {\n      project.deps.addDependency(\n        `aws-cdk@^${options.cdkDeps.cdkMajorVersion}`,\n        DependencyType.BUILD\n      );\n    }\n\n    if (!project.deps.tryGetDependency(\"ts-node\")) {\n      project.deps.addDependency(\"ts-node\", DependencyType.BUILD);\n    }\n\n    const deployDir = join(this.tmpDir, \"deploy.cdk.out\");\n    const assertDir = join(this.tmpDir, \"assert.cdk.out\");\n    const app = `ts-node -P ${options.tsconfigPath} ${options.entrypoint}`;\n\n    const opts = [\n      `--app \"${app}\"`,\n      \"--no-version-reporting\",\n      // don't inject cloudformation metadata into template\n      \"--no-asset-metadata\",\n    ];\n\n    const pathMetadata = options.pathMetadata ?? false;\n    if (!pathMetadata) {\n      opts.push(\"--no-path-metadata\");\n    }\n\n    if (options.cdkDeps.cdkMajorVersion === 1) {\n      // add all feature flags\n      const features = [\n        ...FEATURE_FLAGS,\n        \"@aws-cdk/core:newStyleStackSynthesis\", // simplifies asset coordinates in synth output\n      ];\n\n      for (const feature of features) {\n        opts.push(`--context ${feature}=true`);\n      }\n    }\n\n    const cdkopts = opts.join(\" \");\n\n    // Determine which stacks to deploy\n    const stacks = options.stacks ?? [\"**\"];\n    const stackOpts = stacks.map((stack) => `'${stack}'`).join(\" \");\n\n    this.deployTask.exec(`rm -fr ${deployDir}`);\n    this.deployTask.exec(\n      `cdk deploy ${cdkopts} ${stackOpts} --require-approval=never -o ${deployDir}`\n    );\n\n    // if deployment was successful, copy the deploy dir to the expected dir\n    this.deployTask.exec(`rm -fr ${this.snapshotDir}`);\n    this.deployTask.exec(`mv ${deployDir} ${this.snapshotDir}`);\n\n    this.watchTask = project.addTask(`integ:${this.name}:watch`, {\n      description: `watch integration test '${this.name}' (without updating snapshots)`,\n      exec: `cdk watch ${cdkopts} ${stackOpts} -o ${deployDir}`,\n    });\n\n    this.destroyTask = project.addTask(`integ:${this.name}:destroy`, {\n      description: `destroy integration test '${this.name}'`,\n      exec: `cdk destroy --app ${this.snapshotDir} ${stackOpts} --no-version-reporting`,\n    });\n\n    const destroyAfterDeploy = options.destroyAfterDeploy ?? true;\n    if (destroyAfterDeploy) {\n      this.deployTask.spawn(this.destroyTask);\n    }\n\n    this.snapshotTask.exec(\n      `cdk synth ${cdkopts} -o ${this.snapshotDir} > /dev/null`\n    );\n\n    const exclude = [\"asset.*\", \"cdk.out\", \"manifest.json\", \"tree.json\"];\n\n    this.assertTask.exec(`cdk synth ${cdkopts} -o ${assertDir} > /dev/null`);\n    this.assertTask.exec(\n      `diff -r ${exclude.map((x) => `-x ${x}`).join(\" \")} ${\n        this.snapshotDir\n      }/ ${assertDir}/`\n    );\n\n    // do not commit all files we are excluding\n    for (const x of exclude) {\n      project.addGitIgnore(`${this.snapshotDir}/${x}`);\n      project.addGitIgnore(`${this.snapshotDir}/**/${x}`); // nested assemblies\n    }\n  }\n}\n"
  },
  {
    "path": "src/awscdk/internal.ts",
    "content": "import { sep, posix } from \"path\";\n\n/**\n * Feature flags as of v1.130.0\n */\nexport const FEATURE_FLAGS = [\n  \"aws-cdk:enableDiffNoFail\",\n  \"@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId\",\n  \"@aws-cdk/core:enableStackNameDuplicates\",\n  \"@aws-cdk/core:stackRelativeExports\",\n  \"@aws-cdk/aws-ecr-assets:dockerIgnoreSupport\",\n  \"@aws-cdk/aws-secretsmanager:parseOwnedSecretName\",\n  \"@aws-cdk/aws-kms:defaultKeyPolicies\",\n  \"@aws-cdk/aws-s3:grantWriteWithoutAcl\",\n  \"@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount\",\n  \"@aws-cdk/aws-rds:lowercaseDbIdentifier\",\n  \"@aws-cdk/aws-efs:defaultEncryptionAtRest\",\n  \"@aws-cdk/aws-lambda:recognizeVersionProps\",\n  \"@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021\",\n];\n\n/**\n * Suffix for AWS Lambda handlers.\n */\nexport const TYPESCRIPT_LAMBDA_EXT = \".lambda.ts\";\n\n/**\n * Suffix for AWS Edge Lambda handlers.\n */\nexport const TYPESCRIPT_EDGE_LAMBDA_EXT = \".edge-lambda.ts\";\n\n/**\n * Suffix for AWS Lambda Extensions.\n */\nexport const TYPESCRIPT_LAMBDA_EXTENSION_EXT = \".lambda-extension.ts\";\n\n/**\n * Converts the given path string to posix if it wasn't already.\n */\nexport function convertToPosixPath(p: string) {\n  return p.split(sep).join(posix.sep);\n}\n"
  },
  {
    "path": "src/awscdk/lambda-extension.ts",
    "content": "import { basename, dirname, join, relative } from \"path\";\nimport { pascal } from \"case\";\nimport { Component } from \"../component\";\nimport { Bundler, BundlingOptions, Eslint } from \"../javascript\";\nimport { Project } from \"../project\";\nimport { SourceCode } from \"../source-code\";\nimport { AwsCdkDeps } from \"./awscdk-deps\";\nimport {\n  convertToPosixPath,\n  TYPESCRIPT_LAMBDA_EXTENSION_EXT,\n} from \"./internal\";\nimport { LambdaRuntime } from \"./lambda-function\";\n\n/**\n * Common options for creating lambda extensions.\n */\nexport interface LambdaExtensionCommonOptions {\n  /**\n   * The extension's compatible runtimes.\n   */\n  readonly compatibleRuntimes?: LambdaRuntime[];\n\n  /**\n   * Bundling options for this AWS Lambda extension.\n   *\n   * If not specified the default bundling options specified for the project\n   * `Bundler` instance will be used.\n   *\n   * @default - defaults\n   */\n  readonly bundlingOptions?: BundlingOptions;\n}\n\n/**\n * Options for creating lambda extensions.\n */\nexport interface LambdaExtensionOptions extends LambdaExtensionCommonOptions {\n  /**\n   * Name of the extension\n   *\n   * @default - Derived from the entrypoint filename.\n   */\n  readonly name?: string;\n\n  /**\n   * A path from the project root directory to a TypeScript file which contains\n   * the AWS Lambda extension entrypoint (stand-alone script).\n   *\n   * This is relative to the root directory of the project.\n   *\n   * @example \"src/subdir/foo.lambda-extension.ts\"\n   */\n  readonly entrypoint: string;\n\n  /**\n   * AWS CDK dependency manager.\n   */\n  readonly cdkDeps: AwsCdkDeps;\n\n  /**\n   * The name of the generated TypeScript source file. This file should also be\n   * under the source tree.\n   *\n   * @default - The name of the entrypoint file, with the `-layer-version.ts`\n   * suffix instead of `.lambda-extension.ts`.\n   */\n  readonly constructFile?: string;\n\n  /**\n   * The name of the generated `lambda.LayerVersion` subclass.\n   *\n   * @default - A pascal cased version of the name of the entrypoint file, with\n   * the extension `LayerVersion` (e.g. `AppConfigLayerVersion`).\n   */\n  readonly constructName?: string;\n}\n\n/**\n * Create a Lambda Extension\n */\nexport class LambdaExtension extends Component {\n  constructor(project: Project, options: LambdaExtensionOptions) {\n    super(project);\n\n    const basePath = join(\n      dirname(options.entrypoint),\n      basename(options.entrypoint, TYPESCRIPT_LAMBDA_EXTENSION_EXT)\n    );\n\n    const name = options.name ?? basename(basePath);\n\n    const bundler = Bundler.of(project);\n    if (!bundler) {\n      throw new Error(\n        \"No bundler found. Please add a Bundler component to your project.\"\n      );\n    }\n\n    const compatibleRuntimes = options.compatibleRuntimes ?? [\n      LambdaRuntime.NODEJS_16_X,\n      LambdaRuntime.NODEJS_14_X,\n      LambdaRuntime.NODEJS_12_X,\n    ];\n\n    if (compatibleRuntimes.length === 0) {\n      throw new Error(\"Compatible runtimes must include at least one runtime\");\n    }\n\n    // Use the lowest runtime version to bundle\n    const [bundlerRuntime] = compatibleRuntimes.sort((a, b) =>\n      a.functionRuntime.localeCompare(b.functionRuntime)\n    );\n\n    // Allow extension code to import dev-deps since they are only needed\n    // during bundling\n    const eslint = Eslint.of(project);\n    eslint?.allowDevDeps(options.entrypoint);\n\n    const bundle = bundler.addBundle(options.entrypoint, {\n      platform: bundlerRuntime.esbuildPlatform,\n      target: bundlerRuntime.esbuildTarget,\n      externals: [\"aws-sdk\"],\n      outfile: `extensions/${name}`,\n      // Make the output executable because Lambda expects to run\n      // extensions as stand-alone programs alongside the main lambda\n      // process.\n      executable: true,\n      ...options.bundlingOptions,\n    });\n\n    const constructFile =\n      options.constructFile ?? `${basePath}-layer-version.ts`;\n\n    new LambdaLayerConstruct(project, {\n      constructFile: constructFile,\n      constructName: options.constructName,\n      assetDir: bundle.outdir,\n      compatibleRuntimes: compatibleRuntimes,\n      description: `Provides a Lambda Extension \\`${name}\\` from ${convertToPosixPath(\n        options.entrypoint\n      )}`,\n      cdkDeps: options.cdkDeps,\n    });\n  }\n}\n\ninterface LambdaLayerConstructOptions {\n  readonly assetDir: string;\n  readonly compatibleRuntimes: LambdaRuntime[];\n  readonly description: string;\n  readonly constructFile: string;\n  readonly constructName?: string;\n  readonly cdkDeps: AwsCdkDeps;\n}\n\nclass LambdaLayerConstruct extends SourceCode {\n  constructor(project: Project, options: LambdaLayerConstructOptions) {\n    super(project, options.constructFile);\n\n    const src = this;\n    const cdkDeps = options.cdkDeps;\n\n    const constructName =\n      options.constructName ?? pascal(basename(options.constructFile, \".ts\"));\n    const propsType = `${constructName}Props`;\n\n    const assetDir = relative(dirname(options.constructFile), options.assetDir);\n\n    if (src.marker) {\n      src.line(`// ${src.marker}`);\n    }\n    src.line(\"import * as path from 'path';\");\n\n    if (cdkDeps.cdkMajorVersion === 1) {\n      src.line(\"import * as lambda from '@aws-cdk/aws-lambda';\");\n      src.line(\"import { Construct } from '@aws-cdk/core';\");\n      cdkDeps.addV1Dependencies(\"@aws-cdk/aws-lambda\");\n      cdkDeps.addV1Dependencies(\"@aws-cdk/core\");\n    } else {\n      src.line(\"import * as lambda from 'aws-cdk-lib/aws-lambda';\");\n      src.line(\"import { Construct } from 'constructs';\");\n    }\n\n    src.line();\n\n    src.line(\"/**\");\n    src.line(` * Props for ${constructName}`);\n    src.line(\" */\");\n    src.open(\n      `export interface ${propsType} extends lambda.LayerVersionOptions {`\n    );\n    src.close(\"}\");\n    src.line();\n\n    src.line(\"/**\");\n    src.line(` * ${options.description}`);\n    src.line(\" */\");\n    src.open(`export class ${constructName} extends lambda.LayerVersion {`);\n    src.open(\n      `constructor(scope: Construct, id: string, props?: ${propsType}) {`\n    );\n\n    src.open(\"super(scope, id, {\");\n    src.line(`description: ${encodeCodeString(options.description)},`);\n    src.line(\"...props,\");\n\n    src.open(\"compatibleRuntimes: [\");\n    for (const runtime of options.compatibleRuntimes) {\n      src.line(\n        `new lambda.Runtime('${runtime.functionRuntime}', lambda.RuntimeFamily.NODEJS),`\n      );\n    }\n    src.close(\"],\");\n\n    src.open(`code: lambda.Code.fromAsset(path.join(__dirname,`);\n    src.line(`${encodeCodeString(convertToPosixPath(assetDir))})),`);\n    src.close();\n    src.close(\"});\");\n\n    src.close(\"}\");\n    src.close(\"}\");\n  }\n}\n\n/**\n * Encodes a string for embedding in source code.\n */\nfunction encodeCodeString(value: string) {\n  const json = JSON.stringify(value);\n  const escapedString = json.substring(1, json.length - 1).replace(/'/g, \"\\\\'\");\n  return `'${escapedString}'`;\n}\n"
  },
  {
    "path": "src/awscdk/lambda-function.ts",
    "content": "import { basename, dirname, extname, join, relative } from \"path\";\nimport { pascal } from \"case\";\nimport { Component } from \"../component\";\nimport { Bundler, BundlingOptions, Eslint } from \"../javascript\";\nimport { Project } from \"../project\";\nimport { SourceCode } from \"../source-code\";\nimport { AwsCdkDeps } from \"./awscdk-deps\";\nimport {\n  convertToPosixPath,\n  TYPESCRIPT_EDGE_LAMBDA_EXT,\n  TYPESCRIPT_LAMBDA_EXT,\n} from \"./internal\";\n\n/**\n * Common options for `LambdaFunction`. Applies to all functions in\n * auto-discovery.\n */\nexport interface LambdaFunctionCommonOptions {\n  /**\n   * The node.js version to target.\n   *\n   * @default Runtime.NODEJS_14_X\n   */\n  readonly runtime?: LambdaRuntime;\n\n  /**\n   * Bundling options for this AWS Lambda function.\n   *\n   * If not specified the default bundling options specified for the project\n   * `Bundler` instance will be used.\n   *\n   * @default - defaults\n   */\n  readonly bundlingOptions?: BundlingOptions;\n\n  /**\n   * Whether to automatically reuse TCP connections when working with the AWS\n   * SDK for JavaScript.\n   *\n   * This sets the `AWS_NODEJS_CONNECTION_REUSE_ENABLED` environment variable\n   * to `1`.\n   *\n   * Not applicable when `edgeLambda` is set to `true` because environment\n   * variables are not supported in Lambda@Edge.\n   *\n   * @see https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html\n   *\n   * @default true\n   */\n  readonly awsSdkConnectionReuse?: boolean;\n\n  /**\n   * Whether to create a `cloudfront.experimental.EdgeFunction` instead\n   * of a `lambda.Function`.\n   *\n   * @default false\n   */\n  readonly edgeLambda?: boolean;\n}\n\n/**\n * Options for `Function`.\n */\nexport interface LambdaFunctionOptions extends LambdaFunctionCommonOptions {\n  /**\n   * A path from the project root directory to a TypeScript file which contains\n   * the AWS Lambda handler entrypoint (exports a `handler` function).\n   *\n   * This is relative to the root directory of the project.\n   *\n   * @example \"src/subdir/foo.lambda.ts\"\n   */\n  readonly entrypoint: string;\n\n  /**\n   * The name of the generated TypeScript source file. This file should also be\n   * under the source tree.\n   *\n   * @default - The name of the entrypoint file, with the `-function.ts` suffix\n   * instead of `.lambda.ts`.\n   */\n  readonly constructFile?: string;\n\n  /**\n   * The name of the generated `lambda.Function` subclass.\n   *\n   * @default - A pascal cased version of the name of the entrypoint file, with\n   * the extension `Function` (e.g. `ResizeImageFunction`).\n   */\n  readonly constructName?: string;\n\n  /**\n   * AWS CDK dependency manager.\n   */\n  readonly cdkDeps: AwsCdkDeps;\n}\n\n/**\n * Generates a pre-bundled AWS Lambda function construct from handler code.\n *\n * To use this, create an AWS Lambda handler file under your source tree with\n * the `.lambda.ts` extension and add a `LambdaFunction` component to your\n * typescript project pointing to this entrypoint.\n *\n * This will add a task to your \"compile\" step which will use `esbuild` to\n * bundle the handler code into the build directory. It will also generate a\n * file `src/foo-function.ts` with a custom AWS construct called `FooFunction`\n * which extends `@aws-cdk/aws-lambda.Function` which is bound to the bundled\n * handle through an asset.\n *\n * @example\n *\n * new LambdaFunction(myProject, {\n *   srcdir: myProject.srcdir,\n *   entrypoint: 'src/foo.lambda.ts',\n * });\n */\nexport class LambdaFunction extends Component {\n  /**\n   * Defines a pre-bundled AWS Lambda function construct from handler code.\n   *\n   * @param project The project to use\n   * @param options Options\n   */\n  constructor(project: Project, options: LambdaFunctionOptions) {\n    super(project);\n\n    const cdkDeps = options.cdkDeps;\n    const bundler = Bundler.of(project);\n    if (!bundler) {\n      throw new Error(\n        \"No bundler found. Please add a Bundler component to your project.\"\n      );\n    }\n\n    const runtime = options.runtime ?? LambdaRuntime.NODEJS_14_X;\n\n    // allow Lambda handler code to import dev-deps since they are only needed\n    // during bundling\n    const eslint = Eslint.of(project);\n    eslint?.allowDevDeps(options.entrypoint);\n\n    const entrypoint = options.entrypoint;\n\n    if (\n      !entrypoint.endsWith(TYPESCRIPT_LAMBDA_EXT) &&\n      !entrypoint.endsWith(TYPESCRIPT_EDGE_LAMBDA_EXT)\n    ) {\n      throw new Error(\n        `${entrypoint} must have a ${TYPESCRIPT_LAMBDA_EXT} or ${TYPESCRIPT_EDGE_LAMBDA_EXT} extension`\n      );\n    }\n\n    const basePath = join(\n      dirname(entrypoint),\n      basename(\n        entrypoint,\n        options.edgeLambda ? TYPESCRIPT_EDGE_LAMBDA_EXT : TYPESCRIPT_LAMBDA_EXT\n      )\n    );\n    const constructFile = options.constructFile ?? `${basePath}-function.ts`;\n\n    if (extname(constructFile) !== \".ts\") {\n      throw new Error(\n        `Construct file name \"${constructFile}\" must have a .ts extension`\n      );\n    }\n\n    // type names\n    const constructName =\n      options.constructName ?? pascal(basename(basePath)) + \"Function\";\n    const propsType = `${constructName}Props`;\n\n    const bundle = bundler.addBundle(entrypoint, {\n      target: runtime.esbuildTarget,\n      platform: runtime.esbuildPlatform,\n      externals: [\"aws-sdk\"],\n      ...options.bundlingOptions,\n    });\n\n    // calculate the relative path between the directory containing the\n    // generated construct source file to the directory containing the bundle\n    // index.js by resolving them as absolute paths first.\n    // e.g:\n    //  - outfileAbs => `/project-outdir/assets/foo/bar/baz/foo-function/index.js`\n    //  - constructAbs => `/project-outdir/src/foo/bar/baz/foo-function.ts`\n    const outfileAbs = join(project.outdir, bundle.outfile);\n    const constructAbs = join(project.outdir, constructFile);\n    const relativeOutfile = relative(\n      dirname(constructAbs),\n      dirname(outfileAbs)\n    );\n\n    const src = new SourceCode(project, constructFile);\n    if (src.marker) {\n      src.line(`// ${src.marker}`);\n    }\n    src.line(\"import * as path from 'path';\");\n\n    if (cdkDeps.cdkMajorVersion === 1) {\n      if (options.edgeLambda) {\n        src.line(\"import * as cloudfront from '@aws-cdk/aws-cloudfront';\");\n        cdkDeps.addV1Dependencies(\"@aws-cdk/aws-cloudfront\");\n      }\n      src.line(\"import * as lambda from '@aws-cdk/aws-lambda';\");\n      src.line(\"import { Construct } from '@aws-cdk/core';\");\n      cdkDeps.addV1Dependencies(\"@aws-cdk/aws-lambda\");\n      cdkDeps.addV1Dependencies(\"@aws-cdk/core\");\n    } else {\n      if (options.edgeLambda) {\n        src.line(\"import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';\");\n      }\n      src.line(\"import * as lambda from 'aws-cdk-lib/aws-lambda';\");\n      src.line(\"import { Construct } from 'constructs';\");\n    }\n\n    src.line();\n    src.line(\"/**\");\n    src.line(` * Props for ${constructName}`);\n    src.line(\" */\");\n    if (options.edgeLambda) {\n      src.open(\n        `export interface ${propsType} extends cloudfront.experimental.EdgeFunctionProps {`\n      );\n    } else {\n      src.open(\n        `export interface ${propsType} extends lambda.FunctionOptions {`\n      );\n    }\n    src.close(\"}\");\n    src.line();\n    src.line(\"/**\");\n    src.line(\n      ` * An AWS Lambda function which executes ${convertToPosixPath(\n        basePath\n      )}.`\n    );\n    src.line(\" */\");\n    if (options.edgeLambda) {\n      src.open(\n        `export class ${constructName} extends cloudfront.experimental.EdgeFunction {`\n      );\n    } else {\n      src.open(`export class ${constructName} extends lambda.Function {`);\n    }\n    src.open(\n      `constructor(scope: Construct, id: string, props?: ${propsType}) {`\n    );\n    src.open(\"super(scope, id, {\");\n    src.line(`description: '${convertToPosixPath(entrypoint)}',`);\n    src.line(\"...props,\");\n    src.line(\n      `runtime: new lambda.Runtime('${runtime.functionRuntime}', lambda.RuntimeFamily.NODEJS),`\n    );\n    src.line(\"handler: 'index.handler',\");\n    src.line(\n      `code: lambda.Code.fromAsset(path.join(__dirname, '${convertToPosixPath(\n        relativeOutfile\n      )}')),`\n    );\n    src.close(\"});\");\n    if ((options.awsSdkConnectionReuse ?? true) && !options.edgeLambda) {\n      src.line(\n        \"this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\"\n      );\n    }\n    src.close(\"}\");\n    src.close(\"}\");\n\n    this.project.logger.verbose(\n      `${basePath}: construct \"${constructName}\" generated under \"${constructFile}\"`\n    );\n    this.project.logger.verbose(\n      `${basePath}: bundle task \"${bundle.bundleTask.name}\"`\n    );\n    if (bundle.watchTask) {\n      this.project.logger.verbose(\n        `${basePath}: bundle watch task \"${bundle.watchTask.name}\"`\n      );\n    }\n  }\n}\n\n/**\n * The runtime for the AWS Lambda function.\n */\nexport class LambdaRuntime {\n  /**\n   * Node.js 10.x\n   */\n  public static readonly NODEJS_10_X = new LambdaRuntime(\n    \"nodejs10.x\",\n    \"node10\"\n  );\n\n  /**\n   * Node.js 12.x\n   */\n  public static readonly NODEJS_12_X = new LambdaRuntime(\n    \"nodejs12.x\",\n    \"node12\"\n  );\n\n  /**\n   * Node.js 14.x\n   */\n  public static readonly NODEJS_14_X = new LambdaRuntime(\n    \"nodejs14.x\",\n    \"node14\"\n  );\n\n  /**\n   * Node.js 16.x\n   */\n  public static readonly NODEJS_16_X = new LambdaRuntime(\n    \"nodejs16.x\",\n    \"node16\"\n  );\n\n  public readonly esbuildPlatform = \"node\";\n\n  public constructor(\n    /**\n     * The Node.js runtime to use\n     */\n    public readonly functionRuntime: string,\n\n    /**\n     * The esbuild setting to use.\n     */\n    public readonly esbuildTarget: string\n  ) {}\n}\n"
  },
  {
    "path": "src/build/build-workflow.ts",
    "content": "import { Task } from \"..\";\nimport { Component } from \"../component\";\nimport { GitHub, GithubWorkflow, GitIdentity } from \"../github\";\nimport {\n  BUILD_ARTIFACT_NAME,\n  DEFAULT_GITHUB_ACTIONS_USER,\n} from \"../github/constants\";\nimport { WorkflowActions } from \"../github/workflow-actions\";\nimport {\n  Job,\n  JobPermission,\n  JobStep,\n  Tools,\n  Triggers,\n} from \"../github/workflows-model\";\nimport { NodeProject } from \"../javascript\";\nimport { Project } from \"../project\";\n\nconst PULL_REQUEST_REF = \"${{ github.event.pull_request.head.ref }}\";\nconst PULL_REQUEST_REPOSITORY =\n  \"${{ github.event.pull_request.head.repo.full_name }}\";\nconst BUILD_JOBID = \"build\";\nconst SELF_MUTATION_STEP = \"self_mutation\";\nconst SELF_MUTATION_HAPPENED_OUTPUT = \"self_mutation_happened\";\nconst IS_FORK =\n  \"github.event.pull_request.head.repo.full_name != github.repository\";\nconst NOT_FORK = `!(${IS_FORK})`;\nconst SELF_MUTATION_CONDITION = `needs.${BUILD_JOBID}.outputs.${SELF_MUTATION_HAPPENED_OUTPUT}`;\n\nexport interface BuildWorkflowOptions {\n  /**\n   * The task to execute in order to build the project.\n   */\n  readonly buildTask: Task;\n\n  /**\n   * A name of a directory that includes build artifacts.\n   */\n  readonly artifactsDirectory: string;\n\n  /**\n   * The container image to use for builds.\n   * @default - the default workflow container\n   */\n  readonly containerImage?: string;\n\n  /**\n   * Automatically update files modified during builds to pull-request branches.\n   * This means that any files synthesized by projen or e.g. test snapshots will\n   * always be up-to-date before a PR is merged.\n   *\n   * Implies that PR builds do not have anti-tamper checks.\n   *\n   * This is enabled by default only if `githubTokenSecret` is set. Otherwise it\n   * is disabled, which implies that file changes that happen during build will\n   * not be pushed back to the branch.\n   *\n   * @default true\n   */\n  readonly mutableBuild?: boolean;\n\n  /**\n   * Steps to execute before the build.\n   * @default []\n   */\n  readonly preBuildSteps?: JobStep[];\n\n  /**\n   * Steps to execute after build.\n   * @default []\n   */\n  readonly postBuildSteps?: JobStep[];\n\n  /**\n   * Git identity to use for the workflow.\n   * @default - default identity\n   */\n  readonly gitIdentity?: GitIdentity;\n\n  /**\n   * Build environment variables.\n   * @default {}\n   */\n  readonly env?: { [key: string]: string };\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n\n  /**\n   * Build workflow triggers\n   * @default \"{ pullRequest: {}, workflowDispatch: {} }\"\n   */\n  readonly workflowTriggers?: Triggers;\n}\n\nexport class BuildWorkflow extends Component {\n  private readonly postBuildSteps: JobStep[];\n  private readonly preBuildSteps: JobStep[];\n  private readonly gitIdentity: GitIdentity;\n  private readonly buildTask: Task;\n  private readonly github: GitHub;\n  private readonly workflow: GithubWorkflow;\n  private readonly artifactsDirectory: string;\n  private readonly defaultRunners: string[] = [\"ubuntu-latest\"];\n\n  private readonly _postBuildJobs: string[] = [];\n\n  constructor(project: Project, options: BuildWorkflowOptions) {\n    super(project);\n\n    const github = GitHub.of(project);\n    if (!github) {\n      throw new Error(\n        \"BuildWorkflow is currently only supported for GitHub projects\"\n      );\n    }\n\n    this.github = github;\n    this.preBuildSteps = options.preBuildSteps ?? [];\n    this.postBuildSteps = options.postBuildSteps ?? [];\n    this.gitIdentity = options.gitIdentity ?? DEFAULT_GITHUB_ACTIONS_USER;\n    this.buildTask = options.buildTask;\n    this.artifactsDirectory = options.artifactsDirectory;\n    const mutableBuilds = options.mutableBuild ?? true;\n\n    this.workflow = new GithubWorkflow(github, \"build\");\n    this.workflow.on(\n      options.workflowTriggers ?? {\n        pullRequest: {},\n        workflowDispatch: {}, // allow manual triggering\n      }\n    );\n\n    this.addBuildJob(options);\n\n    if (mutableBuilds) {\n      this.addSelfMutationJob(options);\n    }\n  }\n\n  private addBuildJob(options: BuildWorkflowOptions) {\n    this.workflow.addJob(BUILD_JOBID, {\n      runsOn: options.runsOn ?? this.defaultRunners,\n      container: options.containerImage\n        ? { image: options.containerImage }\n        : undefined,\n      env: {\n        CI: \"true\",\n        ...options.env,\n      },\n      permissions: {\n        contents: JobPermission.WRITE,\n      },\n      steps: (() => this.renderBuildSteps()) as any,\n      outputs: {\n        [SELF_MUTATION_HAPPENED_OUTPUT]: {\n          stepId: SELF_MUTATION_STEP,\n          outputName: SELF_MUTATION_HAPPENED_OUTPUT,\n        },\n      },\n    });\n  }\n\n  /**\n   * Returns a list of job IDs that are part of the build.\n   */\n  public get buildJobIds(): string[] {\n    return [BUILD_JOBID, ...this._postBuildJobs];\n  }\n\n  /**\n   * Adds steps that are executed after the build.\n   * @param steps The job steps\n   */\n  public addPostBuildSteps(...steps: JobStep[]): void {\n    this.postBuildSteps.push(...steps);\n  }\n\n  /**\n   * Adds another job to the build workflow which is executed after the build\n   * job succeeded.\n   *\n   * Jobs are executed _only_ if the build did NOT self mutate. If the build\n   * self-mutate, the branch will either be updated or the build will fail (in\n   * forks), so there is no point in executing the post-build job.\n   *\n   * @param id The id of the new job\n   * @param job The job specification\n   */\n  public addPostBuildJob(id: string, job: Job) {\n    const steps = [];\n\n    if (this.artifactsDirectory) {\n      steps.push({\n        name: \"Download build artifacts\",\n        uses: \"actions/download-artifact@v3\",\n        with: {\n          name: BUILD_ARTIFACT_NAME,\n          path: this.artifactsDirectory,\n        },\n      });\n    }\n\n    steps.push(...(job.steps ?? []));\n\n    this.workflow.addJob(id, {\n      needs: [BUILD_JOBID],\n      // only run if build did not self-mutate\n      if: `! ${SELF_MUTATION_CONDITION}`,\n      ...job,\n      steps: steps,\n    });\n\n    // add to the list of build job IDs\n    this._postBuildJobs.push(id);\n  }\n\n  /**\n   * Run a task as a job within the build workflow which is executed after the\n   * build job succeeded.\n   *\n   * The job will have access to build artifacts and will install project\n   * dependencies in order to be able to run any commands used in the tasks.\n   *\n   * Jobs are executed _only_ if the build did NOT self mutate. If the build\n   * self-mutate, the branch will either be updated or the build will fail (in\n   * forks), so there is no point in executing the post-build job.\n   *\n   * @param options Specify tools and other options\n   */\n  public addPostBuildJobTask(\n    task: Task,\n    options: AddPostBuildJobTaskOptions = {}\n  ) {\n    this.addPostBuildJobCommands(\n      `post-build-${task.name}`,\n      [`${this.project.projenCommand} ${task.name}`],\n      {\n        checkoutRepo: true,\n        installDeps: true,\n        tools: options.tools,\n        runsOn: options.runsOn,\n      }\n    );\n  }\n\n  /**\n   * Run a sequence of commands as a job within the build workflow which is\n   * executed after the build job succeeded.\n   *\n   * Jobs are executed _only_ if the build did NOT self mutate. If the build\n   * self-mutate, the branch will either be updated or the build will fail (in\n   * forks), so there is no point in executing the post-build job.\n   *\n   * @param options Specify tools and other options\n   */\n  public addPostBuildJobCommands(\n    id: string,\n    commands: string[],\n    options?: AddPostBuildJobCommandsOptions\n  ) {\n    const steps = [];\n\n    if (options?.checkoutRepo) {\n      steps.push({\n        name: \"Checkout\",\n        uses: \"actions/checkout@v3\",\n        with: {\n          ref: PULL_REQUEST_REF,\n          repository: PULL_REQUEST_REPOSITORY,\n        },\n      });\n    }\n\n    if (\n      options?.checkoutRepo &&\n      options?.installDeps &&\n      this.project instanceof NodeProject\n    ) {\n      steps.push({\n        name: \"Install dependencies\",\n        run: `${this.project.package.installCommand}`,\n      });\n    }\n\n    steps.push({ run: commands.join(\"\\n\") });\n\n    this.addPostBuildJob(id, {\n      permissions: {\n        contents: JobPermission.READ,\n      },\n      tools: options?.tools,\n      runsOn: options?.runsOn ?? this.defaultRunners,\n      steps,\n    });\n  }\n\n  private addSelfMutationJob(options: BuildWorkflowOptions) {\n    this.workflow.addJob(\"self-mutation\", {\n      runsOn: options.runsOn ?? this.defaultRunners,\n      permissions: {\n        contents: JobPermission.WRITE,\n      },\n      needs: [BUILD_JOBID],\n      if: `always() && ${SELF_MUTATION_CONDITION} && ${NOT_FORK}`,\n      steps: [\n        ...this.workflow.projenCredentials.setupSteps,\n        ...WorkflowActions.checkoutWithPatch({\n          // we need to use a PAT so that our push will trigger the build workflow\n          token: this.workflow.projenCredentials.tokenRef,\n          ref: PULL_REQUEST_REF,\n          repository: PULL_REQUEST_REPOSITORY,\n        }),\n        ...WorkflowActions.setGitIdentity(this.gitIdentity),\n        {\n          name: \"Push changes\",\n          run: [\n            \"  git add .\",\n            '  git commit -s -m \"chore: self mutation\"',\n            `  git push origin HEAD:${PULL_REQUEST_REF}`,\n          ].join(\"\\n\"),\n        },\n      ],\n    });\n  }\n\n  /**\n   * Called (lazily) during synth to render the build job steps.\n   */\n  private renderBuildSteps(): JobStep[] {\n    return [\n      {\n        name: \"Checkout\",\n        uses: \"actions/checkout@v3\",\n        with: {\n          ref: PULL_REQUEST_REF,\n          repository: PULL_REQUEST_REPOSITORY,\n        },\n      },\n\n      ...this.preBuildSteps,\n\n      {\n        name: this.buildTask.name,\n        run: this.github.project.runTaskCommand(this.buildTask),\n      },\n\n      ...this.postBuildSteps,\n\n      // check for mutations and upload a git patch file as an artifact\n      ...WorkflowActions.createUploadGitPatch({\n        stepId: SELF_MUTATION_STEP,\n        outputName: SELF_MUTATION_HAPPENED_OUTPUT,\n        mutationError:\n          \"Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\",\n      }),\n\n      // upload the build artifact only if we have post-build jobs (otherwise, there's no point)\n      ...(this._postBuildJobs.length == 0\n        ? []\n        : [\n            {\n              name: \"Upload artifact\",\n              uses: \"actions/upload-artifact@v2.1.1\",\n              with: {\n                name: BUILD_ARTIFACT_NAME,\n                path: this.artifactsDirectory,\n              },\n            },\n          ]),\n    ];\n  }\n}\n\n/**\n * Options for `BuildWorkflow.addPostBuildJobTask`\n */\nexport interface AddPostBuildJobTaskOptions {\n  /**\n   * Tools that should be installed before the task is run.\n   */\n  readonly tools?: Tools;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n}\n\n/**\n * Options for `BuildWorkflow.addPostBuildJobCommands`\n */\nexport interface AddPostBuildJobCommandsOptions {\n  /**\n   * Tools that should be installed before the commands are run.\n   */\n  readonly tools?: Tools;\n\n  /**\n   * Check out the repository at the pull request branch before commands are\n   * run.\n   *\n   * @default false\n   */\n  readonly checkoutRepo?: boolean;\n\n  /**\n   * Install project dependencies before running commands. `checkoutRepo` must\n   * also be set to true.\n   *\n   * Currently only supported for `NodeProject`.\n   *\n   * @default false\n   */\n  readonly installDeps?: boolean;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n}\n"
  },
  {
    "path": "src/build/index.ts",
    "content": "export * from \"./build-workflow\";\n"
  },
  {
    "path": "src/builtin-example.task.ts",
    "content": "console.log(\"hello, I am a builtin task\");\nconsole.log(\"second line\");\n"
  },
  {
    "path": "src/cdk/auto-discover-base.ts",
    "content": "import { join } from \"path\";\nimport * as glob from \"glob\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { TYPESCRIPT_INTEG_EXT } from \"./internal\";\n\n/**\n * Options for `AutoDiscoverBase`\n */\nexport interface AutoDiscoverBaseOptions {\n  /**\n   * Locate files with the given extension.\n   *\n   * @example \".integ.ts\"\n   */\n  readonly extension: string;\n\n  /**\n   * Locate entrypoints in the given project directory.\n   *\n   * @example \"test\"\n   */\n  readonly projectdir: string;\n}\n\n/**\n * Base class for auto-discovering and creating project subcomponents.\n */\nexport abstract class AutoDiscoverBase extends Component {\n  /**\n   * Auto-discovered entry points with paths relative to the project\n   * directory.\n   */\n  public readonly entrypoints: string[];\n\n  constructor(project: Project, options: AutoDiscoverBaseOptions) {\n    super(project);\n\n    const cwd = join(this.project.outdir, options.projectdir);\n\n    this.entrypoints = glob\n      .sync(`**/*${options.extension}`, { cwd })\n      .map((p) => join(options.projectdir, p));\n  }\n}\n\n/**\n * Options for `IntegrationTestAutoDiscoverBase`\n */\nexport interface IntegrationTestAutoDiscoverBaseOptions {\n  /**\n   * Test source tree.\n   */\n  readonly testdir: string;\n}\n\n/**\n * Base class for locating integration tests in the project's test tree.\n */\nexport class IntegrationTestAutoDiscoverBase extends AutoDiscoverBase {\n  constructor(\n    project: Project,\n    options: IntegrationTestAutoDiscoverBaseOptions\n  ) {\n    super(project, {\n      extension: TYPESCRIPT_INTEG_EXT,\n      projectdir: options.testdir,\n    });\n  }\n}\n"
  },
  {
    "path": "src/cdk/construct-lib.ts",
    "content": "import { JsiiProject, JsiiProjectOptions } from \"./jsii-project\";\n\nexport interface ConstructLibraryOptions extends JsiiProjectOptions {\n  /**\n   * Libraries will be picked up by the construct catalog when they are\n   * published to npm as jsii modules and will be published under:\n   *\n   *     https://awscdk.io/packages/[@SCOPE/]PACKAGE@VERSION\n   *\n   * The catalog will also post a tweet to https://twitter.com/awscdkio with the\n   * package name, description and the above link. You can disable these tweets\n   * through `{ announce: false }`.\n   *\n   * You can also add a Twitter handle through `{ twitter: 'xx' }` which will be\n   * mentioned in the tweet.\n   *\n   * @see https://github.com/construct-catalog/catalog\n   *\n   * @default - new version will be announced\n   */\n  readonly catalog?: Catalog;\n}\n\nexport interface Catalog {\n  /**\n   * Twitter account to @mention in announcement tweet.\n   */\n  readonly twitter?: string;\n\n  /**\n   * Should we announce new versions?\n   * @default true\n   */\n  readonly announce?: boolean;\n}\n\n/**\n * A multi-language library for CDK constructs.\n */\nexport abstract class ConstructLibrary extends JsiiProject {\n  constructor(options: ConstructLibraryOptions) {\n    super(options);\n\n    this.addKeywords(\"cdk\"); // publish to the catalog\n    if (options.catalog) {\n      this.package.addField(\"awscdkio\", {\n        twitter: options.catalog.twitter,\n        announce: options.catalog.announce,\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "src/cdk/consts.ts",
    "content": "import { Tools } from \"../github/workflows-model\";\n\nexport type JsiiPacmakTarget = \"js\" | \"go\" | \"java\" | \"python\" | \"dotnet\";\n\n/**\n * GitHub workflow job steps for setting up the tools required for various JSII targets.\n */\nexport const JSII_TOOLCHAIN: Record<JsiiPacmakTarget, Tools> = {\n  js: {},\n  java: { java: { version: \"11.x\" } },\n  python: { python: { version: \"3.x\" } },\n  go: { go: { version: \"^1.16.0\" } },\n  dotnet: { dotnet: { version: \"3.x\" } },\n};\n"
  },
  {
    "path": "src/cdk/index.ts",
    "content": "export * from \"./construct-lib\";\nexport * from \"./jsii-docgen\";\nexport * from \"./jsii-project\";\nexport * from \"./integration-test-base\";\nexport * from \"./auto-discover-base\";\n"
  },
  {
    "path": "src/cdk/integration-test-base.ts",
    "content": "import { basename, dirname, join } from \"path\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\nimport { TYPESCRIPT_INTEG_EXT } from \"./internal\";\n\n/**\n * Options for IntegrationTest\n */\nexport interface IntegrationTestBaseOptions {\n  /**\n   * Name of the integration test\n   * @default - Derived from the entrypoint filename.\n   */\n  readonly name?: string;\n\n  /**\n   * A path from the project root directory to a TypeScript file which contains\n   * the integration test app.\n   *\n   * This is relative to the root directory of the project.\n   *\n   * @example \"test/subdir/foo.integ.ts\"\n   */\n  readonly entrypoint: string;\n\n  /**\n   * The path of the tsconfig.json file to use when running integration test cdk apps.\n   */\n  readonly tsconfigPath: string;\n}\n\nexport abstract class IntegrationTestBase extends Component {\n  /**\n   * Deploy the integration test and update the snapshot upon success.\n   */\n  public readonly deployTask: Task;\n\n  /**\n   * Synthesizes the integration test and compares against a local copy (runs during build).\n   */\n  public readonly assertTask: Task;\n\n  /**\n   * Just update snapshot (without deployment).\n   */\n  public readonly snapshotTask: Task;\n\n  /**\n   * Temporary directory for each integration test.\n   */\n  protected readonly tmpDir: string;\n\n  /**\n   * Snapshot output directory.\n   */\n  protected readonly snapshotDir: string;\n\n  /**\n   * Integration test name.\n   */\n  protected readonly name: string;\n\n  constructor(project: Project, options: IntegrationTestBaseOptions) {\n    super(project);\n\n    const entry = options.entrypoint;\n    const name = options.name ?? basename(entry, TYPESCRIPT_INTEG_EXT);\n    this.name = name;\n    const dir = dirname(entry);\n\n    const tmpRoot = join(dir, \".tmp\");\n    project.addGitIgnore(tmpRoot);\n    project.addPackageIgnore(tmpRoot);\n\n    this.tmpDir = join(tmpRoot, `${name}.integ`);\n\n    this.snapshotDir = join(dir, `${name}.integ.snapshot`);\n    project.addPackageIgnore(this.snapshotDir);\n\n    this.deployTask = project.addTask(`integ:${name}:deploy`, {\n      description: `deploy integration test '${name}' and capture snapshot`,\n    });\n\n    this.snapshotTask = project.addTask(`integ:${name}:snapshot`, {\n      description: `update snapshot for integration test \"${name}\"`,\n    });\n\n    this.assertTask = project.addTask(`integ:${name}:assert`, {\n      description: `assert the snapshot of integration test '${name}'`,\n      exec: `[ -d \"${this.snapshotDir}\" ] || (echo \"No snapshot available for integration test '${name}'. Run 'projen ${this.deployTask.name}' to capture.\" && exit 1)`,\n    });\n\n    // synth as part of our tests, which means that if outdir changes, anti-tamper will fail\n    project.testTask.spawn(this.assertTask);\n\n    let snapshotAllTask = project.tasks.tryFind(\"integ:snapshot-all\");\n    if (!snapshotAllTask) {\n      snapshotAllTask = project.addTask(\"integ:snapshot-all\", {\n        description: \"update snapshot for all integration tests\",\n      });\n    }\n\n    // integ:snapshot-all should snapshot all integration tests, including\n    // this one.\n    snapshotAllTask.spawn(this.snapshotTask);\n  }\n}\n"
  },
  {
    "path": "src/cdk/internal.ts",
    "content": "/**\n * Suffix for integration tests.\n */\nexport const TYPESCRIPT_INTEG_EXT = \".integ.ts\";\n"
  },
  {
    "path": "src/cdk/jsii-docgen.ts",
    "content": "import { JsiiProject } from \"./jsii-project\";\n\n/**\n * Options for `JsiiDocgen`\n */\nexport interface JsiiDocgenOptions {\n  /**\n   * File path for generated docs.\n   * @default \"API.md\"\n   */\n  readonly filePath?: string;\n}\n\n/**\n * Creates a markdown file based on the jsii manifest:\n * - Adds a `docgen` script to package.json\n * - Runs `jsii-docgen` after compilation\n * - Enforces that markdown file is checked in\n */\nexport class JsiiDocgen {\n  constructor(project: JsiiProject, options: JsiiDocgenOptions = {}) {\n    project.addDevDeps(\"jsii-docgen\");\n\n    const filePath = options.filePath ?? \"API.md\";\n\n    const docgen = project.addTask(\"docgen\", {\n      description: \"Generate API.md from .jsii manifest\",\n      exec: `jsii-docgen -o ${filePath}`,\n    });\n\n    // spawn docgen after compilation (requires the .jsii manifest).\n    project.postCompileTask.spawn(docgen);\n    project.gitignore.include(`/${filePath}`);\n    project.annotateGenerated(`/${filePath}`);\n  }\n}\n"
  },
  {
    "path": "src/cdk/jsii-project.ts",
    "content": "import { Task } from \"..\";\nimport { Job } from \"../github/workflows-model\";\nimport { Eslint } from \"../javascript\";\nimport {\n  CommonPublishOptions,\n  GoPublishOptions,\n  MavenPublishOptions,\n  NugetPublishOptions,\n  PyPiPublishOptions,\n} from \"../release\";\nimport { TypeScriptProject, TypeScriptProjectOptions } from \"../typescript\";\nimport { deepMerge } from \"../util\";\nimport { JsiiPacmakTarget, JSII_TOOLCHAIN } from \"./consts\";\nimport { JsiiDocgen } from \"./jsii-docgen\";\n\nconst EMAIL_REGEX =\n  /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])/;\nconst URL_REGEX =\n  /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9\\.\\-]+|(?:www\\.|[\\-;:&=\\+\\$,\\w]+@)[A-Za-z0-9\\.\\-]+)((?:\\/[\\+~%\\/\\.\\w\\-_]*)?\\??(?:[\\-\\+=&;%@\\.\\w_]*)#?(?:[\\.\\!\\/\\\\\\w]*))?)/;\nconst REPO_TEMP_DIRECTORY = \".repo\";\n\nexport interface JsiiProjectOptions extends TypeScriptProjectOptions {\n  /**\n   * @default \".\"\n   */\n  readonly rootdir?: string;\n\n  /**\n   * Git repository URL.\n   * @default $GIT_REMOTE\n   */\n  readonly repositoryUrl: string;\n\n  /**\n   * The name of the library author.\n   * @default $GIT_USER_NAME\n   */\n  readonly author: string;\n\n  /**\n   * Email or URL of the library author.\n   * @default $GIT_USER_EMAIL\n   */\n  readonly authorAddress: string;\n\n  /**\n   * Publish to maven\n   * @default - no publishing\n   */\n  readonly publishToMaven?: JsiiJavaTarget;\n\n  /**\n   * Publish to pypi\n   * @default - no publishing\n   */\n  readonly publishToPypi?: JsiiPythonTarget;\n\n  /**\n   * Publish Go bindings to a git repository.\n   * @default - no publishing\n   */\n  readonly publishToGo?: JsiiGoTarget;\n\n  /**\n   * @deprecated use `publishToPyPi`\n   */\n  readonly python?: JsiiPythonTarget;\n\n  /**\n   * Publish to NuGet\n   * @default - no publishing\n   */\n  readonly publishToNuget?: JsiiDotNetTarget;\n\n  /**\n   * @deprecated use `publishToNuget`\n   */\n  readonly dotnet?: JsiiDotNetTarget;\n\n  /**\n   * Automatically run API compatibility test against the latest version published to npm after compilation.\n   *\n   * - You can manually run compatibility tests using `yarn compat` if this feature is disabled.\n   * - You can ignore compatibility failures by adding lines to a \".compatignore\" file.\n   *\n   * @default false\n   */\n  readonly compat?: boolean;\n\n  /**\n   * Name of the ignore file for API compatibility tests.\n   *\n   * @default \".compatignore\"\n   */\n  readonly compatIgnore?: string;\n\n  /**\n   * Accepts a list of glob patterns. Files matching any of those patterns will be excluded from the TypeScript compiler input.\n   *\n   * By default, jsii will include all *.ts files (except .d.ts files) in the TypeScript compiler input.\n   * This can be problematic for example when the package's build or test procedure generates .ts files\n   * that cannot be compiled with jsii's compiler settings.\n   */\n  readonly excludeTypescript?: string[];\n\n  /**\n   * File path for generated docs.\n   * @default \"API.md\"\n   */\n  readonly docgenFilePath?: string;\n\n  /**\n   * Emit a compressed version of the assembly\n   * @default false\n   */\n  readonly compressAssembly?: boolean;\n}\n\nexport enum Stability {\n  EXPERIMENTAL = \"experimental\",\n  STABLE = \"stable\",\n  DEPRECATED = \"deprecated\",\n}\n\nexport interface JsiiJavaTarget extends MavenPublishOptions {\n  readonly javaPackage: string;\n  readonly mavenGroupId: string;\n  readonly mavenArtifactId: string;\n}\n\nexport interface JsiiPythonTarget extends PyPiPublishOptions {\n  readonly distName: string;\n  readonly module: string;\n}\n\nexport interface JsiiDotNetTarget extends NugetPublishOptions {\n  readonly dotNetNamespace: string;\n  readonly packageId: string;\n  readonly iconUrl?: string;\n}\n\n/**\n * Go target configuration\n */\nexport interface JsiiGoTarget extends GoPublishOptions {\n  /**\n   * The name of the target go module.\n   *\n   * @example github.com/owner/repo\n   * @example github.com/owner/repo/subdir\n   */\n  readonly moduleName: string;\n\n  /**\n   * The name of the go package.\n   *\n   * @default - derived from the module name\n   */\n  readonly packageName?: string;\n}\n\n/**\n * Multi-language jsii library project\n *\n * @pjid jsii\n */\nexport class JsiiProject extends TypeScriptProject {\n  public readonly eslint?: Eslint;\n\n  private readonly packageAllTask: Task;\n\n  constructor(options: JsiiProjectOptions) {\n    const { authorEmail, authorUrl } = parseAuthorAddress(options);\n\n    const defaultOptions = {\n      repository: options.repositoryUrl,\n      authorName: options.author,\n      authorEmail,\n      authorUrl,\n      jestOptions: {\n        jestVersion: \"^27\",\n      },\n    };\n\n    const forcedOptions = {\n      releaseToNpm: false, // we have a jsii release workflow\n      disableTsconfig: true, // jsii generates its own tsconfig.json\n      docgen: false, // we use jsii-docgen here so disable typescript docgen\n    };\n\n    const mergedOptions = deepMerge([\n      defaultOptions,\n      options,\n      forcedOptions,\n    ]) as TypeScriptProjectOptions;\n\n    super(mergedOptions);\n\n    const srcdir = this.srcdir;\n    const libdir = this.libdir;\n\n    this.addFields({ types: `${libdir}/index.d.ts` });\n\n    const compressAssembly = options.compressAssembly ?? false;\n\n    // this is an unhelpful warning\n    const jsiiFlags = [\"--silence-warnings=reserved-word\"];\n    if (compressAssembly) {\n      jsiiFlags.push(\"--compress-assembly\");\n    }\n\n    const compatIgnore = options.compatIgnore ?? \".compatignore\";\n\n    this.addFields({ stability: options.stability ?? Stability.STABLE });\n\n    if (options.stability === Stability.DEPRECATED) {\n      this.addFields({ deprecated: true });\n    }\n\n    const compatTask = this.addTask(\"compat\", {\n      description: \"Perform API compatibility check against latest version\",\n      exec: `jsii-diff npm:$(node -p \"require(\\'./package.json\\').name\") -k --ignore-file ${compatIgnore} || (echo \"\\nUNEXPECTED BREAKING CHANGES: add keys such as \\'removed:constructs.Node.of\\' to ${compatIgnore} to skip.\\n\" && exit 1)`,\n    });\n\n    const compat = options.compat ?? false;\n    if (compat) {\n      this.compileTask.spawn(compatTask);\n    }\n\n    this.compileTask.reset([\"jsii\", ...jsiiFlags].join(\" \"));\n    this.watchTask.reset([\"jsii\", \"-w\", ...jsiiFlags].join(\" \"));\n    this.packageAllTask = this.addTask(\"package-all\", {\n      description: \"Packages artifacts for all target languages\",\n    });\n\n    // in jsii we consider the entire repo (post build) as the build artifact\n    // which is then used to create the language bindings in separate jobs.\n    const prepareRepoForCI = [\n      `rsync -a . .repo --exclude .git --exclude node_modules`,\n      `rm -rf ${this.artifactsDirectory}`,\n      `mv .repo ${this.artifactsDirectory}`,\n    ].join(\" && \");\n\n    // when running inside CI we just prepare the repo for packaging, which\n    // takes place in separate tasks.\n    // outside of CI (i.e locally) we simply package all targets.\n    this.packageTask.reset(\n      `if [ ! -z \\${CI} ]; then ${prepareRepoForCI}; else ${this.runTaskCommand(\n        this.packageAllTask\n      )}; fi`\n    );\n\n    const targets: Record<string, any> = {};\n\n    const jsii: any = {\n      outdir: this.artifactsDirectory,\n      targets,\n      tsc: {\n        outDir: libdir,\n        rootDir: srcdir,\n      },\n    };\n\n    if (options.excludeTypescript) {\n      jsii.excludeTypescript = options.excludeTypescript;\n    }\n\n    this.addFields({ jsii });\n\n    this.release?.publisher.addGitHubPrePublishingSteps(\n      {\n        name: \"Prepare Repository\",\n        run: `mv ${this.artifactsDirectory} ${REPO_TEMP_DIRECTORY}`,\n      },\n      {\n        name: \"Collect GitHub Metadata\",\n        run: `mv ${REPO_TEMP_DIRECTORY}/${this.artifactsDirectory} ${this.artifactsDirectory}`,\n      }\n    );\n\n    const extraJobOptions: Partial<Job> = options.workflowRunsOn\n      ? { runsOn: options.workflowRunsOn }\n      : {};\n\n    if (options.releaseToNpm != false) {\n      const task = this.addPackagingTask(\"js\");\n      this.release?.publisher.publishToNpm({\n        ...this.pacmakForLanguage(\"js\", task),\n        registry: this.package.npmRegistry,\n        npmTokenSecret: this.package.npmTokenSecret,\n        codeArtifactOptions: options.codeArtifactOptions,\n      });\n      this.addPackagingTarget(\"js\", task, extraJobOptions);\n    }\n\n    // we cannot call an option `java` because the java code generated by jsii\n    // does not compile due to a conflict between this option name and the `java`\n    // package (e.g. when `java.util.Objects` is referenced).\n    if (\"java\" in options) {\n      throw new Error('the \"java\" option is now called \"publishToMaven\"');\n    }\n\n    if (options.publishToMaven) {\n      targets.java = {\n        package: options.publishToMaven.javaPackage,\n        maven: {\n          groupId: options.publishToMaven.mavenGroupId,\n          artifactId: options.publishToMaven.mavenArtifactId,\n        },\n      };\n\n      const task = this.addPackagingTask(\"java\");\n\n      this.release?.publisher.publishToMaven({\n        ...this.pacmakForLanguage(\"java\", task),\n        ...options.publishToMaven,\n      });\n\n      this.addPackagingTarget(\"java\", task, extraJobOptions);\n    }\n\n    const pypi = options.publishToPypi ?? options.python;\n    if (pypi) {\n      targets.python = {\n        distName: pypi.distName,\n        module: pypi.module,\n      };\n\n      const task = this.addPackagingTask(\"python\");\n      this.release?.publisher.publishToPyPi({\n        ...this.pacmakForLanguage(\"python\", task),\n        ...pypi,\n      });\n\n      this.addPackagingTarget(\"python\", task, extraJobOptions);\n    }\n\n    const nuget = options.publishToNuget ?? options.dotnet;\n    if (nuget) {\n      targets.dotnet = {\n        namespace: nuget.dotNetNamespace,\n        packageId: nuget.packageId,\n        iconUrl: nuget.iconUrl,\n      };\n\n      const task = this.addPackagingTask(\"dotnet\");\n      this.release?.publisher.publishToNuget({\n        ...this.pacmakForLanguage(\"dotnet\", task),\n        ...nuget,\n      });\n\n      this.addPackagingTarget(\"dotnet\", task, extraJobOptions);\n    }\n\n    const golang = options.publishToGo;\n    if (golang) {\n      targets.go = {\n        moduleName: golang.moduleName,\n        packageName: golang.packageName,\n      };\n\n      const task = this.addPackagingTask(\"go\");\n      this.release?.publisher.publishToGo({\n        ...this.pacmakForLanguage(\"go\", task),\n        ...golang,\n      });\n\n      this.addPackagingTarget(\"go\", task, extraJobOptions);\n    }\n\n    this.addDevDeps(\"jsii\", \"jsii-diff\", \"jsii-pacmak\");\n\n    this.gitignore.exclude(\".jsii\", \"tsconfig.json\");\n    this.npmignore?.include(\".jsii\");\n\n    if (options.docgen ?? true) {\n      new JsiiDocgen(this, { filePath: options.docgenFilePath });\n    }\n\n    // jsii updates .npmignore, so we make it writable\n    if (this.npmignore) {\n      this.npmignore.readonly = false;\n    }\n\n    // jsii relies on typescript < 4.0, which causes build errors\n    // since @types/prettier@2.6.1 only supports typescript >= 4.2.\n    // add a package resolution override to fix this.\n    // this should have no effect if @types/prettier is not a transitive dependency\n    this.package.addPackageResolutions(\"@types/prettier@2.6.0\");\n  }\n\n  /**\n   * Adds a target language to the build workflow and creates a package task.\n   * @param language\n   * @returns\n   */\n  private addPackagingTarget(\n    language: JsiiPacmakTarget,\n    packTask: Task,\n    extraJobOptions: Partial<Job>\n  ) {\n    if (!this.buildWorkflow) {\n      return;\n    }\n    const pacmak = this.pacmakForLanguage(language, packTask);\n\n    this.buildWorkflow.addPostBuildJob(`package-${language}`, {\n      runsOn: [\"ubuntu-latest\"],\n      permissions: {},\n      tools: {\n        node: { version: this.nodeVersion ?? \"14.x\" },\n        ...pacmak.publishTools,\n      },\n      steps: pacmak.prePublishSteps ?? [],\n      ...extraJobOptions,\n    });\n  }\n\n  private addPackagingTask(language: JsiiPacmakTarget): Task {\n    const packageTask = this.tasks.addTask(`package:${language}`, {\n      description: `Create ${language} language bindings`,\n    });\n    packageTask.exec(`jsii-pacmak -v --target ${language}`);\n    this.packageAllTask.spawn(packageTask);\n    return packageTask;\n  }\n\n  private pacmakForLanguage(\n    target: JsiiPacmakTarget,\n    packTask: Task\n  ): CommonPublishOptions {\n    // at this stage, `artifactsDirectory` contains the prebuilt repository.\n    // for the publishing to work seamlessely, that directory needs to contain the actual artifact.\n    // so we move the repo, create the artifact, and put it in the expected place.\n\n    return {\n      publishTools: JSII_TOOLCHAIN[target],\n      prePublishSteps: [\n        {\n          name: \"Prepare Repository\",\n          run: `mv ${this.artifactsDirectory} ${REPO_TEMP_DIRECTORY}`,\n        },\n        {\n          name: \"Install Dependencies\",\n          run: `cd ${REPO_TEMP_DIRECTORY} && ${this.package.installCommand}`,\n        },\n        {\n          name: `Create ${target} artifact`,\n          run: `cd ${REPO_TEMP_DIRECTORY} && npx projen ${packTask.name}`,\n        },\n        {\n          name: `Collect ${target} Artifact`,\n          run: `mv ${REPO_TEMP_DIRECTORY}/${this.artifactsDirectory} ${this.artifactsDirectory}`,\n        },\n      ],\n    };\n  }\n}\n\nfunction parseAuthorAddress(options: JsiiProjectOptions) {\n  let authorEmail = options.authorEmail;\n  let authorUrl = options.authorUrl;\n  if (options.authorAddress) {\n    if (options.authorEmail && options.authorEmail !== options.authorAddress) {\n      throw new Error(\n        \"authorEmail is deprecated and cannot be used in conjunction with authorAddress\"\n      );\n    }\n\n    if (options.authorUrl && options.authorUrl !== options.authorAddress) {\n      throw new Error(\n        \"authorUrl is deprecated and cannot be used in conjunction with authorAddress.\"\n      );\n    }\n\n    if (EMAIL_REGEX.test(options.authorAddress)) {\n      authorEmail = options.authorAddress;\n    } else if (URL_REGEX.test(options.authorAddress)) {\n      authorUrl = options.authorAddress;\n    } else {\n      throw new Error(\n        `authorAddress must be either an email address or a URL: ${options.authorAddress}`\n      );\n    }\n  }\n  return { authorEmail, authorUrl };\n}\n"
  },
  {
    "path": "src/cdk8s/auto-discover.ts",
    "content": "import {\n  IntegrationTestAutoDiscoverBase,\n  IntegrationTestAutoDiscoverBaseOptions,\n} from \"../cdk\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { IntegrationTest } from \"./integration-test\";\n\n/**\n * Options for `AutoDiscover`.\n */\nexport interface AutoDiscoverOptions\n  extends IntegrationTestAutoDiscoverOptions {\n  /**\n   * Automatically discover integration tests\n   *\n   * @default true\n   */\n  readonly integrationTestAutoDiscover?: boolean;\n}\n\n/**\n * Automatically discovers and creates `IntegrationTest`s from entry points\n * found in the test tree.\n */\nexport class AutoDiscover extends Component {\n  constructor(project: Project, options: AutoDiscoverOptions) {\n    super(project);\n\n    if (options.integrationTestAutoDiscover ?? true) {\n      new IntegrationTestAutoDiscover(this.project, options);\n    }\n  }\n}\n\nexport interface IntegrationTestAutoDiscoverOptions\n  extends IntegrationTestAutoDiscoverBaseOptions {\n  /**\n   * Path to the tsconfig file to use for integration tests.\n   */\n  readonly tsconfigPath: string;\n}\n\n/**\n * Discovers and creates integration tests from files in the test root.\n */\nexport class IntegrationTestAutoDiscover extends IntegrationTestAutoDiscoverBase {\n  constructor(project: Project, options: IntegrationTestAutoDiscoverOptions) {\n    super(project, options);\n\n    for (const entrypoint of this.entrypoints) {\n      new IntegrationTest(this.project, {\n        entrypoint,\n        tsconfigPath: options.tsconfigPath,\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "src/cdk8s/cdk8s-app-py.ts",
    "content": "import { Component, DependencyType, YamlFile, SampleFile } from \"..\";\nimport { PythonProject, PythonProjectOptions } from \"../python/python-project\";\nimport { Cdk8sDeps, Cdk8sDepsCommonOptions } from \"./cdk8s-deps\";\nimport { Cdk8sDepsPy } from \"./cdk8s-deps-py\";\n\n/**\n * Options for `Cdk8sPythonApp`\n */\nexport interface Cdk8sPythonOptions\n  extends PythonProjectOptions,\n    Cdk8sDepsCommonOptions {\n  /**\n   * Import a specific Kubernetes spec version.\n   *\n   * @default - Use the cdk8s default\n   */\n  readonly k8sSpecVersion?: string;\n\n  /**\n   * Import additional specs\n   *\n   * @default - no additional specs imported\n   */\n  readonly cdk8sImports?: string[];\n\n  /**\n   * The CDK8s app's entrypoint\n   *\n   * @default \"app.py\"\n   */\n  readonly appEntrypoint?: string;\n}\n\n/**\n * CDK8s app in Python\n *\n *\n * @pjid cdk8s-app-py\n */\nexport class Cdk8sPythonApp extends PythonProject {\n  /**\n   * The CDK8s app entrypoint\n   */\n  public readonly appEntrypoint: string;\n\n  public readonly cdk8sDeps: Cdk8sDeps;\n\n  constructor(options: Cdk8sPythonOptions) {\n    super({ ...options, pytest: false, sample: false });\n\n    this.cdk8sDeps = new Cdk8sDepsPy(this, {\n      dependencyType: DependencyType.RUNTIME,\n      cdk8sCliDependency: false,\n      ...options,\n    });\n\n    if (!options.cdk8sVersion) {\n      throw new Error(\"Required field cdk8sVersion is not specified.\");\n    }\n\n    this.appEntrypoint = options.appEntrypoint ?? \"app.py\";\n\n    const synth = this.addTask(\"synth\", {\n      description: \"Synthesizes your cdk8s app into dist\",\n      exec: \"cdk8s synth\",\n    });\n\n    // add synth to the build\n    this.postCompileTask.spawn(synth);\n\n    const cdk8sImports = options.cdk8sImports ?? [];\n    const k8sSpec = options.k8sSpecVersion\n      ? `k8s@${options.k8sSpecVersion}`\n      : \"k8s\";\n\n    new YamlFile(this, \"cdk8s.yaml\", {\n      committed: true,\n      editGitignore: true,\n      obj: {\n        language: \"python\",\n        app: `python ${this.appEntrypoint}`,\n        imports: [k8sSpec, ...cdk8sImports],\n      },\n    });\n\n    if (options.sample ?? true) {\n      new AppCode(this, this.appEntrypoint);\n    }\n  }\n}\n\nclass AppCode extends Component {\n  constructor(project: Cdk8sPythonApp, filename: string) {\n    super(project);\n\n    new SampleFile(project, filename, {\n      contents: [\n        \"from constructs import Construct\",\n        \"from cdk8s import App, Chart\",\n        \"\",\n        \"\",\n        \"class MyChart(Chart):\",\n        \"  def __init__(self, scope: Construct, id:str):\",\n        \"    super().__init__(scope, id)\",\n        \"\",\n        \"\",\n        \"app = App()\",\n        'MyChart(app, \"${project.name}\")',\n        \"\",\n        \"app.synth()\",\n      ].join(\"\\n\"),\n    });\n  }\n}\n"
  },
  {
    "path": "src/cdk8s/cdk8s-app-ts.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { TypeScriptAppProject, TypeScriptProjectOptions } from \"../typescript\";\nimport { YamlFile } from \"../yaml\";\nimport { AutoDiscover } from \"./auto-discover\";\nimport { Cdk8sDeps, Cdk8sDepsCommonOptions } from \"./cdk8s-deps\";\nimport { Cdk8sDepsJs } from \"./cdk8s-deps-js\";\n\nexport interface Cdk8sTypeScriptAppOptions\n  extends TypeScriptProjectOptions,\n    Cdk8sDepsCommonOptions {\n  /**\n   * Import a specific Kubernetes spec version.\n   *\n   * @default - Use the cdk8s default\n   */\n  readonly k8sSpecVersion?: string;\n\n  /**\n   * Import additional specs\n   *\n   * @default - no additional specs imported\n   */\n  readonly cdk8sImports?: string[];\n\n  /**\n   * The CDK8s app's entrypoint (relative to the source directory, which is\n   * \"src\" by default).\n   *\n   * @default \"main.ts\"\n   */\n  readonly appEntrypoint?: string;\n\n  /**\n   * Automatically adds an `cdk8s.IntegrationTest` for each `.integ.ts` app\n   * in your test directory. If this is disabled, you can manually add an\n   * `cdk8s.AutoDiscover` component to your project.\n   *\n   * @default true\n   */\n  readonly integrationTestAutoDiscover?: boolean;\n}\n\n/**\n * CDK8s app in TypeScript\n *\n *\n * @pjid cdk8s-app-ts\n */\n\nexport class Cdk8sTypeScriptApp extends TypeScriptAppProject {\n  /**\n   * The CDK8s app entrypoint\n   */\n  public readonly appEntrypoint: string;\n\n  public readonly cdk8sDeps: Cdk8sDeps;\n\n  constructor(options: Cdk8sTypeScriptAppOptions) {\n    super({\n      ...options,\n      sampleCode: false,\n    });\n\n    this.cdk8sDeps = new Cdk8sDepsJs(this, {\n      dependencyType: DependencyType.RUNTIME,\n      cdk8sCliDependency: true,\n      ...options,\n    });\n\n    if (!options.cdk8sVersion) {\n      throw new Error(\"Required field cdk8sVersion is not specified.\");\n    }\n\n    // encode a hidden assumption further down the chain\n    if (this.srcdir !== \"src\") {\n      throw new Error('sources are expected under the \"src\" directory');\n    }\n\n    // encode a hidden assumption further down the chain\n    if (this.testdir !== \"test\") {\n      throw new Error('test sources are expected under the \"test\" directory');\n    }\n\n    this.appEntrypoint = options.appEntrypoint ?? \"main.ts\";\n\n    const synth = this.addTask(\"synth\", {\n      description:\n        'Synthesizes your cdk8s app into dist (part of \"yarn build\")',\n      exec: \"cdk8s synth\",\n    });\n\n    this.addTask(\"import\", {\n      description: \"Imports API objects to your app by generating constructs.\",\n      exec: \"cdk8s import -o src/imports\",\n    });\n\n    // add synth to the build\n    this.postCompileTask.spawn(synth);\n\n    const cdk8sImports = options.cdk8sImports ?? [];\n    const k8sSpec = options.k8sSpecVersion\n      ? `k8s@${options.k8sSpecVersion}`\n      : \"k8s\";\n\n    const appEntrypointBaseName = path.basename(this.appEntrypoint, \".ts\");\n\n    new YamlFile(this, \"cdk8s.yaml\", {\n      committed: true,\n      editGitignore: true,\n      obj: {\n        language: \"typescript\",\n        app: `node lib/${appEntrypointBaseName}.js`,\n        imports: [k8sSpec, ...cdk8sImports],\n      },\n    });\n\n    if (options.sampleCode ?? true) {\n      new SampleCode(this);\n    }\n\n    new AutoDiscover(this, {\n      testdir: this.testdir,\n      tsconfigPath: this.tsconfigDev.fileName,\n      integrationTestAutoDiscover: options.integrationTestAutoDiscover ?? true,\n    });\n  }\n}\n\nclass SampleCode extends Component {\n  private readonly appProject: Cdk8sTypeScriptApp;\n  constructor(project: Cdk8sTypeScriptApp) {\n    super(project);\n    this.appProject = project;\n  }\n\n  public synthesize() {\n    const outdir = this.project.outdir;\n    const srcdir = path.join(outdir, this.appProject.srcdir);\n    if (\n      fs.pathExistsSync(srcdir) &&\n      fs.readdirSync(srcdir).filter((x) => x.endsWith(\".ts\"))\n    ) {\n      return;\n    }\n\n    const srcCode = `import { Construct } from 'constructs';\nimport { App, Chart, ChartProps, ApiObject } from 'cdk8s';\n\nexport class MyChart extends Chart {\n  constructor(scope: Construct, id: string, props: ChartProps = { }) {\n    super(scope, id, props);\n\n    const label = { app: 'hello-k8s' };\n\n\n\n    new ApiObject(this, 'deployment', {\n      apiVersion: \"v1\",\n      kind: \"Pod\",\n      metadata: {\n          namespace: \"frontend\",\n          name: \"nginx\",\n          labels: label,\n      },\n      spec: {\n          containers: [{\n              name: \"nginx\",\n              image: \"nginx:1.14-alpine\",\n              resources: {\n                  limits: {\n                      memory: \"20Mi\",\n                      cpu: 0.2,\n                  },\n              },\n          }],\n      },\n    });\n  }\n}\n\nconst app = new App();\nnew MyChart(app, 'hello');\napp.synth();`;\n\n    fs.mkdirpSync(srcdir);\n    fs.writeFileSync(path.join(srcdir, this.appProject.appEntrypoint), srcCode);\n  }\n}\n"
  },
  {
    "path": "src/cdk8s/cdk8s-construct.ts",
    "content": "import * as semver from \"semver\";\nimport { ConstructLibrary, ConstructLibraryOptions } from \"../cdk\";\nimport { AutoDiscover } from \"./auto-discover\";\n\nexport interface ConstructLibraryCdk8sOptions extends ConstructLibraryOptions {\n  /**\n   * Minimum target version this library is tested against.\n   *\n   * @default \"1.4.10\"\n   * @featured\n   */\n  readonly cdk8sVersion: string;\n\n  /**\n   * constructs verion\n   *\n   * @default \"3.3.196\"\n   */\n\n  readonly constructsVersion?: string;\n\n  /**\n   * Use pinned version instead of caret version for CDK8s.\n   *\n   * You can use this to prevent yarn to mix versions for your CDK8s package and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   *\n   * @default false\n   */\n  readonly cdk8sVersionPinning?: boolean;\n\n  /**\n   * Use pinned version instead of caret version for constructs.\n   *\n   * You can use this to prevent yarn to mix versions for your consructs package and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   *\n   * @default false\n   */\n  readonly constructsVersionPinning?: boolean;\n\n  /**\n   * Use pinned version instead of caret version for cdk8s-plus-17.\n   *\n   * You can use this to prevent yarn to mix versions for your CDK8s package and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   *\n   * @default false\n   */\n  readonly cdk8sPlusVersionPinning?: boolean;\n\n  /**\n   * Automatically adds an `cdk8s.IntegrationTest` for each `.integ.ts` app\n   * in your test directory. If this is disabled, you can manually add an\n   * `cdk8s.AutoDiscover` component to your project.\n   *\n   * @default true\n   */\n  readonly integrationTestAutoDiscover?: boolean;\n}\n\n/**\n * CDK8s construct library project\n *\n * A multi-language (jsii) construct library which vends constructs designed to\n * use within the CDK for Kubernetes (CDK8s), with a friendly workflow and\n * automatic publishing to the construct catalog.\n *\n * @pjid cdk8s-construct\n */\nexport class ConstructLibraryCdk8s extends ConstructLibrary {\n  /**\n   * The CDK8s version this app is using.\n   */\n  public readonly cdk8sVersion: string;\n\n  /**\n   * The constructs version this app is using.\n   */\n  public readonly constructsVersion: string;\n\n  constructor(options: ConstructLibraryCdk8sOptions) {\n    super(options);\n\n    if (!options.cdk8sVersion) {\n      throw new Error(\"Required field cdk8sVersion is not specified.\");\n    }\n\n    const cdk8sVersion = semver.parse(options.cdk8sVersion);\n    if (!cdk8sVersion) {\n      throw new Error(\n        `\"cdk8sVersion\" cannot be parsed as a semver version: ${options.cdk8sVersion}`\n      );\n    }\n\n    this.cdk8sVersion = options.cdk8sVersionPinning\n      ? options.cdk8sVersion\n      : `^${options.cdk8sVersion}`;\n\n    const defaultConstructsVersion =\n      cdk8sVersion.major === 1 ? \"3.3.196\" : \"10.0.0\";\n    const resolvedConstructsVersion =\n      options.constructsVersion ?? defaultConstructsVersion;\n    const resolvedMajorConstructVersion = semver.parse(\n      resolvedConstructsVersion\n    )?.major;\n\n    if (!resolvedMajorConstructVersion) {\n      throw new Error(\n        `\"constructsVersion\" cannot be parsed as a semver version: ${options.constructsVersion}`\n      );\n    }\n\n    switch (cdk8sVersion.major) {\n      case 1:\n        if (resolvedMajorConstructVersion !== 3) {\n          throw new Error(\"cdk8s 1.x requires constructs 3.x\");\n        }\n        break;\n      case 2:\n        if (resolvedMajorConstructVersion !== 10) {\n          throw new Error(\"cdk8s 2.x requires constructs 10.x\");\n        }\n        break;\n    }\n\n    this.constructsVersion = options.constructsVersionPinning\n      ? resolvedConstructsVersion\n      : `^${resolvedConstructsVersion}`;\n\n    this.addPeerDeps(\n      `constructs@${this.constructsVersion}`,\n      `cdk8s@${this.cdk8sVersion}`\n    );\n\n    new AutoDiscover(this, {\n      testdir: this.testdir,\n      tsconfigPath: this.tsconfigDev.fileName,\n      integrationTestAutoDiscover: options.integrationTestAutoDiscover ?? true,\n    });\n  }\n}\n"
  },
  {
    "path": "src/cdk8s/cdk8s-deps-js.ts",
    "content": "import { Cdk8sDeps, Cdk8sPackageNames } from \"./cdk8s-deps\";\n\nexport class Cdk8sDepsJs extends Cdk8sDeps {\n  protected packageNames(): Cdk8sPackageNames {\n    return {\n      cdk8s: \"cdk8s\",\n      cdk8sClient: \"cdk8s-cli\",\n      constructs: \"constructs\",\n      cdk8sPlus: \"cdk8s-plus\",\n    };\n  }\n}\n"
  },
  {
    "path": "src/cdk8s/cdk8s-deps-py.ts",
    "content": "import { Cdk8sDeps, Cdk8sPackageNames } from \"./cdk8s-deps\";\n\nexport class Cdk8sDepsPy extends Cdk8sDeps {\n  protected packageNames(): Cdk8sPackageNames {\n    return {\n      cdk8s: \"cdk8s\",\n      constructs: \"constructs\",\n      cdk8sPlus: \"cdk8s-plus\",\n    };\n  }\n}\n"
  },
  {
    "path": "src/cdk8s/cdk8s-deps.ts",
    "content": "import * as semver from \"semver\";\nimport { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\n\n/**\n * Options for `Cdk8sDeps`\n */\nexport interface Cdk8sDepsCommonOptions {\n  /**\n   * Minumum version of the cdk8s to depend on.\n   *\n   * @default \"2.3.33\"\n   */\n  readonly cdk8sVersion: string;\n\n  /**\n   * Minumum version of the cdk8s-cli to depend on.\n   *\n   * @default \"2.0.28\"\n   */\n  readonly cdk8sCliVersion?: string;\n\n  /**\n   * Minimum version of the `constructs` library to depend on.\n   *\n   * @default \"10.1.42\"\n   */\n  readonly constructsVersion?: string;\n\n  /**\n   * Use pinned version instead of caret version for cdk8s.\n   *\n   * You can use this to prevent yarn to mix versions for your CDK8s package and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   *\n   * @default false\n   */\n  readonly cdk8sVersionPinning?: boolean;\n\n  /**\n   * Use pinned version instead of caret version for cdk8s-cli.\n   *\n   * You can use this to prevent yarn to mix versions for your CDK8s package and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   *\n   * @default false\n   */\n  readonly cdk8sCliVersionPinning?: boolean;\n\n  /**\n   * Use pinned version instead of caret version for constructs.\n   *\n   * You can use this to prevent yarn to mix versions for your consructs package and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   *\n   * @default false\n   */\n  readonly constructsVersionPinning?: boolean;\n\n  /**\n   * Include cdk8s-plus\n   *\n   * @default true\n   */\n  readonly cdk8sPlus?: boolean;\n\n  /**\n   * The cdk8s-plus library depends of Kubernetes minor version\n   * For example, cdk8s-plus-22 targets kubernetes version 1.22.0\n   * cdk8s-plus-21 targets kubernetes version 1.21.0\n   *\n   * @default 22\n   */\n  readonly k8sMinorVersion?: number;\n\n  /**\n   * Minumum version of the cdk8s-plus-XX to depend on.\n   *\n   * @default \"2.0.0-rc.26\"\n   */\n  readonly cdk8sPlusVersion?: string;\n\n  /**\n   * Use pinned version instead of caret version for cdk8s-plus-17.\n   *\n   * You can use this to prevent yarn to mix versions for your CDK8s package and to prevent auto-updates.\n   * If you use experimental features this will let you define the moment you include breaking changes.\n   *\n   * @default false\n   */\n  readonly cdk8sPlusVersionPinning?: boolean;\n}\n\nexport interface Cdk8sDepsOptions extends Cdk8sDepsCommonOptions {\n  /**\n   * The type of dependency to use for runtime CDK8s and `constructs` modules.\n   *\n   * For libraries, use peer dependencies and for apps use runtime dependencies.\n   */\n  readonly dependencyType: DependencyType;\n\n  /**\n   * Add cdk8s-cli only to Node projects\n   *\n   * @default false\n   */\n  readonly cdk8sCliDependency: boolean;\n}\n\nexport interface Cdk8sPackageNames {\n  /**\n   * Fully qualified name of the core framework package\n   */\n  readonly cdk8s: string;\n  /**\n   * Fully qualified name of the client package.\n   * Used only on Node projects\n   */\n  readonly cdk8sClient?: string;\n  /**\n   * Fully qualified name of the constructs library package\n   */\n  readonly constructs: string;\n  /**\n   * Fully qualified name of the cdk9s-plus-XX library package\n   */\n  readonly cdk8sPlus: string;\n}\n\n/**\n * Manages dependencies on the CDK8s.\n */\nexport abstract class Cdk8sDeps extends Component {\n  /**\n   * The dependency requirement for CDK8s.\n   */\n  public readonly cdk8sVersion: string;\n\n  /**\n   * The minimum version of the CDK8s (e.g. `2.0.0`)\n   */\n  public readonly cdk8sMinimumVersion: string;\n\n  /**\n   * The major version of the CDK8s (e.g. 1, 2, ...)\n   */\n  public readonly cdk8sMajorVersion: number;\n\n  private readonly dependencyType: DependencyType;\n\n  private readonly _packageNames: Cdk8sPackageNames;\n\n  constructor(project: Project, options: Cdk8sDepsOptions) {\n    super(project);\n\n    this.dependencyType = options.dependencyType;\n    this._packageNames = this.packageNames();\n\n    const framework = determineFrameworkVersion(options);\n\n    this.cdk8sVersion = framework.range;\n    this.cdk8sMajorVersion = framework.major;\n    this.cdk8sMinimumVersion = framework.minimum;\n\n    // constructs library\n    this.addConstructsDependency(\n      options.constructsVersion,\n      options.constructsVersionPinning\n    );\n\n    this.addFrameworkDependency(\n      options.cdk8sVersion,\n      options.cdk8sVersionPinning\n    );\n\n    if (options.cdk8sCliDependency) {\n      this.addClientDependency(\n        options.cdk8sCliVersion,\n        options.cdk8sCliVersionPinning\n      );\n    }\n\n    if (options.cdk8sPlus ?? true) {\n      const k8MinorVersion = options.k8sMinorVersion ?? 22;\n      this.addCdk8sPlusDependency(\n        k8MinorVersion,\n        options.cdk8sPlusVersion,\n        // (project instanceof Cdk8sPythonApp) ? true : false,\n        options.cdk8sPlusVersionPinning\n      );\n    }\n  }\n\n  /**\n   * Return a configuration object with information about package naming in various languages\n   */\n  protected abstract packageNames(): Cdk8sPackageNames;\n\n  private getVersionRequirement(\n    requestedVersion: string | undefined,\n    v1Version: string,\n    v2Version: string,\n    pinning?: boolean\n  ) {\n    const defaultVersion = this.cdk8sMajorVersion === 1 ? v1Version : v2Version;\n    const version = `${requestedVersion ?? defaultVersion}`;\n    const versionRequirement = pinning ? `${version}` : `^${version}`;\n    return versionRequirement;\n  }\n\n  private addCdk8sPlusDependency(\n    k8MinorVersion: number,\n    requestedVersion: string | undefined,\n    pinning?: boolean\n  ) {\n    const versionRequirement = this.getVersionRequirement(\n      requestedVersion,\n      \"1.0.0-beta.222\",\n      \"2.0.0-rc.26\",\n      pinning\n    );\n\n    const cdk8sPlusMajorVersion = semver.minVersion(versionRequirement)?.major;\n    if (!cdk8sPlusMajorVersion) {\n      throw new Error(\n        `Cannot determine major version of cdk8s-plus version '${versionRequirement}'`\n      );\n    }\n\n    const cdk8sPlusLib = this._packageNames.cdk8sPlus.concat(\n      \"-\",\n      k8MinorVersion.toString()\n    );\n    this.project.deps.addDependency(\n      `${cdk8sPlusLib}@${versionRequirement}`,\n      this.dependencyType\n    );\n\n    return versionRequirement;\n  }\n\n  private addClientDependency(\n    requestedVersion: string | undefined,\n    pinning?: boolean\n  ) {\n    const versionRequirement = this.getVersionRequirement(\n      requestedVersion,\n      \"1.1.34\",\n      \"2.0.28\",\n      pinning\n    );\n\n    const cdk8sCliMajorVersion = semver.minVersion(versionRequirement)?.major;\n    if (!cdk8sCliMajorVersion) {\n      throw new Error(\n        `Cannot determine major version of cdk8s version '${versionRequirement}'`\n      );\n    }\n\n    this.project.deps.addDependency(\n      `${this._packageNames.cdk8sClient}@${versionRequirement}`,\n      DependencyType.BUILD\n    );\n\n    return versionRequirement;\n  }\n\n  private addFrameworkDependency(\n    requestedVersion: string | undefined,\n    pinning?: boolean\n  ) {\n    const versionRequirement = this.getVersionRequirement(\n      requestedVersion,\n      \"1.6.33\",\n      \"2.3.33\",\n      pinning\n    );\n\n    const cdk8sMajorVersion = semver.minVersion(versionRequirement)?.major;\n    if (!cdk8sMajorVersion) {\n      throw new Error(\n        `Cannot determine major version of cdk8s version '${versionRequirement}'`\n      );\n    }\n\n    this.project.deps.addDependency(\n      `${this._packageNames.cdk8s}@${versionRequirement}`,\n      this.dependencyType\n    );\n\n    return versionRequirement;\n  }\n\n  private addConstructsDependency(\n    requestedVersion: string | undefined,\n    pinning?: boolean\n  ) {\n    if (requestedVersion && !semver.parse(requestedVersion)) {\n      throw new Error(\n        `\"constructsVersion\" cannot be parsed as a semver version: ${requestedVersion}`\n      );\n    }\n\n    const versionRequirement = this.getVersionRequirement(\n      requestedVersion,\n      \"3.4.39\",\n      \"10.1.42\",\n      pinning\n    );\n\n    const constructsMajorVersion = semver.minVersion(versionRequirement)?.major;\n    if (!constructsMajorVersion) {\n      throw new Error(\n        `Cannot determine major version of constructs version '${versionRequirement}'`\n      );\n    }\n\n    switch (this.cdk8sMajorVersion) {\n      case 1:\n        if (constructsMajorVersion !== 3) {\n          throw new Error(\"AWS CDK 1.x requires constructs 3.x\");\n        }\n        break;\n\n      case 2:\n        if (constructsMajorVersion !== 10) {\n          throw new Error(\"AWS CDK 2.x requires constructs 10.x\");\n        }\n        break;\n    }\n\n    this.project.deps.addDependency(\n      `${this._packageNames.constructs}@${versionRequirement}`,\n      this.dependencyType\n    );\n\n    return versionRequirement;\n  }\n}\n\nfunction determineFrameworkVersion(options: Cdk8sDepsOptions) {\n  const ver = semver.parse(options.cdk8sVersion);\n  if (!ver) {\n    throw new Error(\n      `\"cdk8sVersion\" cannot be parsed as a semver version: ${options.cdk8sVersion}`\n    );\n  }\n\n  return {\n    minimum: ver.format(),\n    range: options.cdk8sVersionPinning\n      ? options.cdk8sVersion\n      : `^${options.cdk8sVersion}`,\n    major: ver.major,\n  };\n}\n"
  },
  {
    "path": "src/cdk8s/index.ts",
    "content": "export * from \"./auto-discover\";\nexport * from \"./cdk8s-app-py\";\nexport * from \"./cdk8s-app-ts\";\nexport * from \"./cdk8s-construct\";\nexport * from \"./integration-test\";\nexport * from \"./cdk8s-deps\";\nexport * from \"./cdk8s-deps-py\";\n"
  },
  {
    "path": "src/cdk8s/integration-test.ts",
    "content": "import { join } from \"path\";\nimport { IntegrationTestBaseOptions, IntegrationTestBase } from \"../cdk\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\n\n/**\n * Options for IntegrationTest\n */\nexport interface IntegrationTestOptions extends IntegrationTestBaseOptions {}\n\n/**\n * CDK8S integration test.\n */\nexport class IntegrationTest extends IntegrationTestBase {\n  constructor(project: Project, options: IntegrationTestOptions) {\n    super(project, options);\n\n    if (!project.deps.tryGetDependency(\"cdk8s-cli\")) {\n      project.deps.addDependency(`cdk8s-cli`, DependencyType.BUILD);\n    }\n\n    if (!project.deps.tryGetDependency(\"ts-node\")) {\n      project.deps.addDependency(\"ts-node\", DependencyType.BUILD);\n    }\n\n    const deployDir = join(this.tmpDir, \"deploy.cdk.out\");\n    const assertDir = join(this.tmpDir, \"assert.cdk.out\");\n    const app = `ts-node -P ${options.tsconfigPath} ${options.entrypoint}`;\n\n    // Synth, deploy, and capture the snapshot\n    this.deployTask.exec(`rm -fr ${deployDir}`);\n    this.deployTask.exec(`cdk8s synth --app \"${app}\" -o ${deployDir}`);\n    this.deployTask.exec(`kubectl apply -f ${deployDir}`);\n    // If deployment was successful, copy the deploy dir to the expected dir\n    this.deployTask.exec(`rm -fr ${this.snapshotDir}`);\n    this.deployTask.exec(`mv ${deployDir} ${this.snapshotDir}`);\n\n    // Run a snapshot\n    this.snapshotTask.exec(`rm -fr ${this.snapshotDir}`);\n    this.snapshotTask.exec(`cdk8s synth --app \"${app}\" -o ${this.snapshotDir}`);\n\n    // Assert that the snapshot has not changed (run during tests)\n    this.assertTask.exec(\n      `cdk8s synth --app \"${app}\" -o ${assertDir} > /dev/null`\n    );\n    this.assertTask.exec(`diff ${this.snapshotDir}/ ${assertDir}/`);\n  }\n}\n"
  },
  {
    "path": "src/cdktf/cdktf-construct.ts",
    "content": "import * as semver from \"semver\";\nimport { ConstructLibrary, ConstructLibraryOptions } from \"../cdk\";\n\nexport interface ConstructLibraryCdktfOptions extends ConstructLibraryOptions {\n  /**\n   * Minimum target version this library is tested against.\n   * @default \"^0.8.3\"\n   * @featured\n   */\n  readonly cdktfVersion: string;\n\n  /**\n   * Construct version to use\n   * @default \"^10.0.12\"\n   */\n  readonly constructsVersion?: string;\n}\n\n/**\n * CDKTF construct library project\n *\n * A multi-language (jsii) construct library which vends constructs designed to\n * use within the CDK for Terraform (CDKTF), with a friendly workflow and\n * automatic publishing to the construct catalog.\n *\n * @pjid cdktf-construct\n */\nexport class ConstructLibraryCdktf extends ConstructLibrary {\n  constructor(options: ConstructLibraryCdktfOptions) {\n    super(options);\n\n    if (!options.cdktfVersion) {\n      throw new Error(\"Required field cdktfVersion is not specified.\");\n    }\n\n    function getDefaultConstructVersion() {\n      const semverCDKTFVersion = semver.coerce(options.cdktfVersion);\n      if (semverCDKTFVersion && semver.lte(semverCDKTFVersion, \"0.5.0\")) {\n        return \"^3.0.0\";\n      }\n\n      return \"^10.0.12\";\n    }\n\n    const ver = options.cdktfVersion;\n    const constructVersion =\n      options.constructsVersion ?? getDefaultConstructVersion();\n\n    this.addPeerDeps(`constructs@${constructVersion}`, `cdktf@${ver}`);\n    this.addKeywords(\"cdktf\");\n  }\n}\n"
  },
  {
    "path": "src/cdktf/index.ts",
    "content": "export * from \"./cdktf-construct\";\n"
  },
  {
    "path": "src/circleci/circleci.ts",
    "content": "import { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { snakeCaseKeys } from \"../util\";\nimport { YamlFile } from \"../yaml\";\nimport { WorkflowJob, Workflow, Job } from \"./model\";\n\n/**\n * Options for class {@link Circleci}\n *\n * @see https://circleci.com/docs/2.0/configuration-reference/\n */\nexport interface CircleCiProps {\n  /**\n   * Contains a map of CirclCi Orbs\n   * ```json\n   * orbs: {\n   *  node: \"circleci/node@5.0.1\"\n   *  slack: \"circleci/slack@4.8.3\"\n   * }\n   * ```\n   */\n  readonly orbs?: Record<string, string>;\n  /**\n   * pipeline version\n   *\n   * @default 2.1\n   * @see https://circleci.com/docs/2.0/configuration-reference/#version\n   */\n  readonly version?: number;\n  /**\n   * List of Workflows of pipeline, e.g.\n   * ```json\n   * workflows: {\n   *   {\n   *     identifier: \"build\",\n   *       jobs: [{\n   *          identifier: \"node/install\",\n   *          context: [\"npm\"],\n   *       }]\n   *   }\n   * }\n   * ```\n   *\n   * @see https://circleci.com/docs/2.0/configuration-reference/#workflows\n   */\n  readonly workflows?: Workflow[];\n  /**\n   * List of Jobs to create unique steps per pipeline, e.g.\n   * ```json\n   * jobs: [{\n   *  identifier: \"compile\",\n   *  docker: { image: \"golang:alpine\" }\n   *  steps: [\"checkout\", run: {command: \"go build .\"}]\n   * }]\n   * ```\n   *\n   * @see https://circleci.com/docs/2.0/configuration-reference/#jobs\n   */\n  readonly jobs?: Job[];\n  /**\n   * The setup field enables you to conditionally trigger configurations from outside\n   * the primary .circleci parent directory, update pipeline parameters, or generate customized configurations.\n   *\n   * @see https://circleci.com/docs/2.0/configuration-reference/#setup\n   */\n  readonly setup?: boolean;\n}\n\n/**\n * Circleci Class to manage `.circleci/config.yml`.\n * Check projen's docs for more information.\n *\n * @see https://circleci.com/docs/2.0/configuration-reference/\n */\nexport class Circleci extends Component {\n  /**\n   * The yaml file for the Circleci pipeline\n   * */\n  public readonly file: YamlFile;\n  /**\n   * internal copy of options to share options between functions\n   * @private\n   */\n  private options: CircleCiProps;\n  /**\n   * internal map of orbs\n   * @private\n   */\n  private readonly orbs: Record<string, string>;\n  /**\n   * internal list of workflows\n   * @private\n   */\n  private workflows: Workflow[];\n  /**\n   * internal list of jobs\n   * @private\n   */\n  private readonly jobs: Job[];\n\n  constructor(project: Project, options: CircleCiProps = {}) {\n    super(project);\n    this.options = options;\n    this.orbs = options.orbs ?? {};\n    this.workflows = options.workflows ?? [];\n    this.jobs = options.jobs ?? [];\n    this.file = new YamlFile(project, \".circleci/config.yml\", {\n      obj: () => this.renderCircleCi(),\n    });\n  }\n\n  /**\n   * function to prepare the rendering of the yaml file.\n   * Objects with dynamic keys like workflows and jobs required the field `identifier` to be set.\n   * Those object will be reduced by `identifier` field before rendering\n   * @private\n   */\n  private renderCircleCi() {\n    // render dynamic keys for workflow\n    const workflowRecords: Record<string, any> = {};\n    for (const workflow of this.workflows) {\n      const { identifier, ...reduced } = workflow;\n      reduced.jobs = this.renderJobs(workflow.jobs);\n      workflowRecords[identifier] = this.snakeCase(reduced);\n    }\n\n    // render dynamic keys for jobs\n    const jobRecords: Record<string, any> = {};\n    for (const job of this.jobs) {\n      const { identifier, ...reduced } = job;\n      jobRecords[identifier] = this.snakeCase(reduced);\n    }\n\n    return {\n      version: this.options.version || 2.1,\n      setup: this.options.setup,\n      orbs: this.orbs,\n      jobs: Object.keys(jobRecords).length > 0 ? jobRecords : undefined,\n      workflows: workflowRecords,\n    };\n  }\n\n  /**\n   * add new workflow to existing pipeline\n   * @param workflow\n   */\n  public addWorkflow(workflow: Workflow) {\n    this.workflows = [...this.workflows, workflow];\n  }\n\n  /**\n   * reduce objects with `identifier` field for WorkflowJobs.\n   * A workflow job can contain `orbParameter` which are passed to orbs.\n   * This map is directly added as `Record<string,any>` to job.\n   * So we gonna add those after the default field of WorkflowJob.\n   * @see https://circleci.com/developer/orbs/orb/circleci/node#usage-install_nodejs\n   * @param jobs\n   */\n  private renderJobs = (jobs: WorkflowJob[] = []): any => {\n    let result: any = [];\n    for (const job of jobs ?? []) {\n      const { identifier, orbParameters, ...reduced } = job;\n      if (isObjectContainingFieldExactly(job, \"identifier\")) {\n        result = [...result, identifier];\n      } else {\n        result = [\n          ...result,\n          { [identifier]: { ...reduced, ...orbParameters } },\n        ];\n      }\n    }\n    return result;\n  };\n\n  /**\n   * Add a Circleci Orb to pipeline. Will throw error if the orb already exists\n   * @param name\n   * @param orb\n   */\n  public addOrb(name: string, orb: string) {\n    if (this.orbs[name] !== undefined) {\n      throw new Error(`Circleci Config already contains an orb named ${name}.`);\n    }\n    this.orbs[name] = orb;\n  }\n\n  /**\n   * Snake case for listed keys. There are too many exceptions needed to do it recursive without a whitelist.\n   * This list needs to be updated once we add field with snake case like `aws_auth`.\n   * @param input\n   */\n  private snakeCase = (input: any): any => {\n    const snakeCaseKeyWords = [\n      \"awsAuth\",\n      \"workingDirectory\",\n      \"resourceClass\",\n      \"dockerLayerCaching\",\n      \"noOutputTimeout\",\n    ];\n    return snakeCaseKeys(input, true, snakeCaseKeyWords);\n  };\n}\n\nexport const isObjectContainingFieldExactly = (\n  obj: any,\n  field: string\n): boolean => {\n  return Object.keys(obj).length == 1 && Object.keys(obj).includes(field);\n};\n"
  },
  {
    "path": "src/circleci/constant.ts",
    "content": "import { Filter } from \"./model\";\n\n/**\n * constant to create a filter to make a job or workflow only run on master\n */\nexport const FilterMainBranchOnly: Filter = {\n  branches: { only: [\"master\", \"main\"] },\n};\n"
  },
  {
    "path": "src/circleci/index.ts",
    "content": "export * from \"./circleci\";\nexport * from \"./constant\";\nexport * from \"./model\";\n"
  },
  {
    "path": "src/circleci/model.ts",
    "content": "// @see https://circleci.com/docs/2.0/configuration-reference\n\n/**\n * Used to represent objects with a dynamic key.\n * Dynamic are marked with `<>` in configuration reference like '<workflow_name>' and '<job_name>'\n * This field is required for objects with dynamic keys.\n */\ninterface INamed {\n  /** name of dynamic key **/\n  readonly identifier: string;\n}\n\n/**\n * Used for orchestrating all jobs. Each workflow consists of the workflow name as a key and a map as a value.\n * A name should be unique within the current config.yml.\n * The top-level keys for the Workflows configuration are version and jobs.\n * @see https://circleci.com/docs/2.0/configuration-reference/#workflows\n */\nexport interface Workflow extends INamed {\n  readonly jobs?: WorkflowJob[];\n  readonly triggers?: Triggers[];\n  /** when is too dynamic to be casted to interfaces. Check Docu as reference\n   * @see https://circleci.com/docs/2.0/configuration-reference/#logic-statement-examples\n   */\n  readonly when?: any;\n}\n\n/**\n * A job may have a type of approval indicating it must be manually approved before downstream jobs may proceed\n * @see https://circleci.com/docs/2.0/configuration-reference/#type\n */\nexport enum JobType {\n  APPROVAL = \"approval\",\n}\n\n/**\n * The resource_class feature allows configuring CPU and RAM resources for each job.\n * Different resource classes are available for different executors, as described in the tables below.\n * @see https://circleci.com/docs/2.0/configuration-reference/#resourceclass\n */\nexport enum ResourceClass {\n  SMALL = \"small\",\n  MEDIUM = \"medium\",\n  MEDIUM_PLUS = \"medium+\",\n  LARGE_X = \"xlarge\",\n  LARGE_2X = \"2xlarge\",\n  LARGE_2X_PLUS = \"2xlarge+\",\n}\n\n/**\n * Specify when to enable or disable the step.\n * @see https://circleci.com/docs/2.0/configuration-reference/#steps\n */\nexport enum JobWhen {\n  ALWAYS = \"always\",\n  ON_SUCCESS = \"on_success\",\n  ON_FAIL = \"on_fail\",\n}\n\n/**\n * Pipeline parameter types\n * @see https://circleci.com/docs/2.0/reusing-config#parameter-syntax\n */\nexport enum PipelineParameterType {\n  STRING = \"string\",\n  BOOLEAN = \"boolean\",\n  INTEGER = \"integer\",\n  ENUM = \"enum\",\n}\n\n/**\n * A Workflow is comprised of one or more uniquely named jobs. Jobs are specified in the jobs map,\n * see Sample 2.0 config.yml for two examples of a job map.\n * The name of the job is the key in the map, and the value is a map describing the job.\n * @see https://circleci.com/docs/2.0/configuration-reference/#jobs\n */\nexport interface Job extends INamed {}\n\n/**\n * A Job is part of Workflow. A Job can be created with {@link Job} or it can be provided by the orb\n * @see https://circleci.com/docs/2.0/configuration-reference/#jobs-in-workflow\n */\nexport interface WorkflowJob extends INamed {\n  /** A list of jobs that must succeed for the job to start. */\n  readonly requires?: string[];\n  /** A replacement for the job name. Useful when calling a job multiple times */\n  readonly name?: string;\n  /** The name of the context(s). The initial default name is org-global. Each context name must be unique. */\n  readonly context?: string[];\n  /** A job may have a type of approval indicating it must be manually approved before downstream jobs may proceed. */\n  readonly type?: JobType;\n  /** Job Filters can have the key branches or tags */\n  readonly filters?: Filter;\n  readonly matrix?: Matrix;\n  /** Parameters passed to job when referencing a job from orb */\n  readonly orbParameters?: Record<string, string | number | boolean>;\n}\n\n/**\n * Parameters are declared by name under a job, command, or executor.\n * @see https://circleci.com/docs/2.0/reusing-config#using-the-parameters-declaration\n */\nexport interface PipelineParameter {\n  /** Used to generate documentation for your orb. */\n  readonly description?: string;\n  /** The parameter type, required. */\n  readonly type: PipelineParameterType;\n  /** The default value for the parameter. If not present, the parameter is implied to be required. */\n  readonly default?: string | number | boolean;\n}\n\n/**\n * The matrix stanza allows you to run a parameterized job multiple times with different arguments.\n * @see https://circleci.com/docs/2.0/configuration-reference/#matrix-requires-version-21\n */\nexport interface Matrix {\n  /** A map of parameter names to every value the job should be called with */\n  readonly parameters?: Record<string, string[] | number[]>;\n  /** An alias for the matrix, usable from another job’s requires stanza. Defaults to the name of the job being executed */\n  readonly alias?: string;\n}\n\n/**\n * Specifies which triggers will cause this workflow to be executed.\n * Default behavior is to trigger the workflow when pushing to a branch.\n * @see https://circleci.com/docs/2.0/configuration-reference/#triggers\n */\nexport interface Triggers {\n  readonly schedule?: Schedule;\n}\n\n/**\n *  A workflow may have a schedule indicating it runs at a certain time.\n *  @see https://circleci.com/docs/2.0/configuration-reference/#schedule\n */\nexport interface Schedule {\n  /** The cron key is defined using POSIX crontab syntax. */\n  readonly cron?: string;\n  readonly filters: Filter;\n}\n\n/**\n * The branches key controls whether the current branch should have a schedule trigger created for it,\n * where current branch is the branch containing the config.yml file with the trigger stanza.\n * That is, a push on the main branch will only schedule a workflow for the main branch.\n *\n * Branches can have the keys only and ignore which either map to a single string naming a branch.\n * You may also use regular expressions to match against branches by enclosing them with /’s, or map to a list of such strings.\n * Regular expressions must match the entire string.\n *\n * Any branches that match only will run the job.\n * Any branches that match ignore will not run the job.\n * If neither only nor ignore are specified then all branches will run the job.\n * If both only and ignore are specified the only is considered before ignore.\n * @see https://circleci.com/docs/2.0/configuration-reference/#filters\n */\nexport interface Filter {\n  readonly branches?: FilterConfig;\n  readonly tags?: FilterConfig;\n}\n\n/**\n * set an inclusive or exclusive filter\n * @see https://circleci.com/docs/2.0/configuration-reference/#filters\n */\nexport interface FilterConfig {\n  /** Either a single branch specifier, or a list of branch specifiers */\n  readonly only?: string[];\n  /** Either a single branch specifier, or a list of branch specifiers */\n  readonly ignore?: string[];\n}\n\n/**\n * Each job consists of the job’s name as a key and a map as a value. A name should be case insensitive unique within a current jobs list.\n * @see https://circleci.com/docs/2.0/configuration-reference/#job_name\n */\nexport interface Job {\n  readonly docker?: Docker[];\n  readonly machine?: Machine;\n  readonly macos?: Macos;\n  /** Shell to use for execution command in all steps. Can be overridden by shell in each step */\n  readonly shell?: string;\n  /** Parameters for making a job explicitly configurable in a workflow. */\n  readonly parameters?: Record<string, PipelineParameter>;\n  /** no type support here, for syntax {@see https://circleci.com/docs/2.0/configuration-reference/#steps} */\n  readonly steps?: any[];\n  /** In which directory to run the steps. Will be interpreted as an absolute path. Default: `~/project` */\n  readonly workingDirectory?: string;\n  /** Number of parallel instances of this job to run (default: 1) */\n  readonly parallelism?: number;\n  /** A map of environment variable names and values. */\n  readonly environment?: Record<string, string | number | boolean>;\n  /** {@link ResourceClass} */\n  readonly resourceClass?: ResourceClass | string;\n}\n\n/**\n * Options for docker executor\n * @see https://circleci.com/docs/2.0/configuration-reference/#docker\n */\nexport interface Docker {\n  /** The name of a custom docker image to use */\n  readonly image: string;\n  /** The name the container is reachable by. By default, container services are accessible through localhost */\n  readonly name?: string;\n  /** The command used as executable when launching the container */\n  readonly entrypoint?: string[];\n  /** The command used as pid 1 (or args for entrypoint) when launching the container */\n  readonly command?: string[];\n  /** Which user to run commands as within the Docker container */\n  readonly user?: string;\n  /** A map of environment variable names and values */\n  readonly environment?: Record<string, string | number | boolean>;\n  /** Authentication for registries using standard docker login credentials */\n  readonly auth?: Record<string, string>;\n  /** Authentication for AWS Elastic Container Registry (ECR) */\n  readonly awsAuth?: Record<string, string>;\n}\n\nexport interface Machine {\n  /**\n   * The VM image to use.\n   * @see https://circleci.com/docs/2.0/configuration-reference/#available-machine-images\n   */\n  readonly image: string;\n  /** enable docker layer caching\n   * @see https://circleci.com/docs/2.0/configuration-reference/#available-machine-images\n   */\n  readonly dockerLayerCaching?: string;\n}\n\n/**\n * CircleCI supports running jobs on macOS, to allow you to build, test,\n * and deploy apps for macOS, iOS, tvOS and watchOS. To run a job in a macOS virtual machine,\n * you must add the macos key to the top-level configuration for the job and specify\n * the version of Xcode you would like to use.\n * @see https://circleci.com/docs/2.0/configuration-reference/#macos\n */\nexport interface Macos {\n  /** The version of Xcode that is installed on the virtual machine */\n  readonly xcode: string;\n}\n\n/**\n * Execution steps for Job\n * @see https://circleci.com/docs/2.0/configuration-reference/#steps\n */\nexport interface StepRun {\n  readonly run?: Run;\n}\n\n/**\n * Used for invoking all command-line programs, taking either a map of configuration values,\n * or, when called in its short-form, a string that will be used as both the command and name.\n * Run commands are executed using non-login shells by default,\n * so you must explicitly source any dotfiles as part of the command.\n *\n * Not used because type incompatible types in steps array\n *\n * @see https://circleci.com/docs/2.0/configuration-reference/#run\n */\nexport interface Run {\n  /** Command to run via the shell */\n  readonly command: string;\n  /** Title of the step to be shown in the CircleCI UI (default: full command) */\n  readonly name?: string;\n  /** Shell to use for execution command */\n  readonly shell?: string;\n  /** Additional environmental variables, locally scoped to command */\n  readonly environment?: string;\n  /** Whether this step should run in the background (default: false) */\n  readonly background?: string;\n  /** In which directory to run this step. Will be interpreted relative to the working_directory of the job). (default: .) */\n  readonly workingDirectory?: string;\n  /** Elapsed time the command can run without output such as “20m”, “1.25h”, “5s”. The default is 10 minutes */\n  readonly noOutputTimeout?: string;\n  /** Specify when to enable or disable the step. */\n  readonly when?: JobWhen | string;\n}\n"
  },
  {
    "path": "src/cleanup.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { existsSync, readFileSync } from \"fs-extra\";\nimport * as glob from \"glob\";\nimport { PROJEN_DIR, PROJEN_MARKER } from \"./common\";\nimport * as logging from \"./logging\";\n\nexport const FILE_MANIFEST = `${PROJEN_DIR}/files.json`;\n\nexport function cleanup(dir: string, newFiles: string[], exclude: string[]) {\n  try {\n    const manifestFiles = getFilesFromManifest(dir);\n    if (manifestFiles.length > 0) {\n      // Use `FILE_MANIFEST` to remove files that are no longer managed by projen\n      removeFiles(findOrphanedFiles(dir, manifestFiles, newFiles));\n    } else {\n      // Remove all files managed by projen with legacy logic\n      removeFiles(findGeneratedFiles(dir, exclude));\n    }\n  } catch (e) {\n    logging.warn(`warning: failed to clean up generated files: ${e.stack}`);\n  }\n}\n\nfunction removeFiles(files: string[]) {\n  for (const file of files) {\n    fs.removeSync(file);\n  }\n}\n\nfunction findGeneratedFiles(dir: string, exclude: string[]) {\n  const ignore = [\n    ...readGitIgnore(dir),\n    \"node_modules/**\",\n    ...exclude,\n    \".git/**\",\n  ];\n\n  const files = glob.sync(\"**\", {\n    ignore,\n    cwd: dir,\n    dot: true,\n    nodir: true,\n    absolute: true,\n  });\n\n  const generated = new Array<string>();\n\n  for (const file of files) {\n    const contents = fs.readFileSync(file, \"utf-8\");\n\n    if (contents.includes(PROJEN_MARKER)) {\n      generated.push(file);\n    }\n  }\n\n  return generated;\n}\n\nfunction findOrphanedFiles(\n  dir: string,\n  oldFiles: string[],\n  newFiles: string[]\n) {\n  return oldFiles\n    .filter((old) => !newFiles.includes(old))\n    .map((f: string) => path.resolve(dir, f));\n}\n\nfunction getFilesFromManifest(dir: string): string[] {\n  try {\n    const fileManifestPath = path.resolve(dir, FILE_MANIFEST);\n    if (existsSync(fileManifestPath)) {\n      const fileManifest = JSON.parse(readFileSync(fileManifestPath, \"utf-8\"));\n      if (fileManifest.files) {\n        return fileManifest.files;\n      }\n    }\n  } catch (e) {\n    logging.warn(\n      `warning: unable to get files to clean from file manifest: ${e.stack}`\n    );\n  }\n\n  return [];\n}\n\nfunction readGitIgnore(dir: string) {\n  const filepath = path.join(dir, \".gitignore\");\n  if (!fs.pathExistsSync(filepath)) {\n    return [];\n  }\n\n  return fs\n    .readFileSync(filepath, \"utf-8\")\n    .split(\"\\n\")\n    .filter((x) => x?.trim() !== \"\")\n    .filter((x) => !x.startsWith(\"#\") && !x.startsWith(\"!\"))\n    .map((x) => x.replace(/^\\//, \"\")) // remove \"/\" prefix\n    .map((x) => `${x}\\n${x}/**`)\n    .join(\"\\n\")\n    .split(\"\\n\");\n}\n"
  },
  {
    "path": "src/cli/cmds/new.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport * as semver from \"semver\";\nimport * as yargs from \"yargs\";\nimport * as inventory from \"../../inventory\";\nimport * as logging from \"../../logging\";\nimport { InitProjectOptionHints } from \"../../option-hints\";\nimport { Projects } from \"../../projects\";\nimport { exec, execCapture, getGitVersion, isTruthy } from \"../../util\";\nimport { tryProcessMacro } from \"../macros\";\nimport { installPackage, renderInstallCommand } from \"../util\";\n\nclass Command implements yargs.CommandModule {\n  public readonly command = \"new [PROJECT-TYPE-NAME] [OPTIONS]\";\n  public readonly describe = \"Creates a new projen project\";\n\n  public builder(args: yargs.Argv) {\n    args.positional(\"PROJECT-TYPE-NAME\", {\n      describe:\n        \"optional only when --from is used and there is a single project type in the external module\",\n      type: \"string\",\n    });\n    args.option(\"synth\", {\n      type: \"boolean\",\n      default: true,\n      desc: \"Synthesize after creating .projenrc.js\",\n    });\n    args.option(\"comments\", {\n      type: \"boolean\",\n      default: true,\n      desc: \"Include commented out options in .projenrc.js (use --no-comments to disable)\",\n    });\n    args.option(\"from\", {\n      type: \"string\",\n      alias: \"f\",\n      desc: 'External jsii npm module to create project from. Supports any package spec supported by npm (such as \"my-pack@^2.0\")',\n    });\n    args.option(\"git\", {\n      type: \"boolean\",\n      default: true,\n      desc: \"Run `git init` and create an initial commit (use --no-git to disable)\",\n    });\n    args.example(\n      \"projen new awscdk-app-ts\",\n      'Creates a new project of built-in type \"awscdk-app-ts\"'\n    );\n    args.example(\n      \"projen new --from projen-vue@^2\",\n      'Creates a new project from an external module \"projen-vue\" with the specified version'\n    );\n\n    for (const type of inventory.discover()) {\n      args.command(type.pjid, type.docs ?? \"\", {\n        builder: (cargs) => {\n          cargs.showHelpOnFail(false);\n\n          for (const option of type.options ?? []) {\n            if (\n              option.simpleType !== \"string\" &&\n              option.simpleType !== \"number\" &&\n              option.simpleType !== \"boolean\" &&\n              option.kind !== \"enum\"\n            ) {\n              continue; // we only support primitive and enum fields as command line options\n            }\n\n            let desc = [option.docs?.replace(/\\ *\\.$/, \"\") ?? \"\"];\n\n            const required = !option.optional;\n            let defaultValue;\n\n            if (option.default && option.default !== \"undefined\") {\n              if (!required) {\n                // if the field is not required, just describe the default but don't actually assign a value\n                desc.push(\n                  `[default: ${option.default\n                    .replace(/^\\ *-/, \"\")\n                    .replace(/\\.$/, \"\")\n                    .trim()}]`\n                );\n              } else {\n                // if the field is required and we have a @default, then assign\n                // the value here so it appears in `--help`\n                defaultValue = renderDefault(process.cwd(), option.default);\n              }\n            }\n\n            const argType =\n              option.kind === \"enum\" ? \"string\" : option.simpleType;\n\n            cargs.option(option.switch, {\n              group: required ? \"Required:\" : \"Optional:\",\n              type: argType as \"string\" | \"boolean\" | \"number\",\n              description: desc.join(\" \"),\n              default: defaultValue,\n              required,\n            });\n          }\n\n          return cargs;\n        },\n        handler: (argv) => initProject(process.cwd(), type, argv),\n      });\n    }\n\n    return args;\n  }\n\n  public async handler(args: any) {\n    // handle --from which means we want to first install a jsii module and then\n    // create a project defined within this module.\n    if (args.from) {\n      return initProjectFromModule(process.cwd(), args.from, args);\n    }\n\n    // project type is defined but was not matched by yargs, so print the list of supported types\n    if (args.projectTypeName) {\n      console.log(\n        `Invalid project type ${args.projectTypeName}. Supported types:`\n      );\n      for (const pjid of inventory.discover().map((x) => x.pjid)) {\n        console.log(`  ${pjid}`);\n      }\n      return;\n    }\n\n    // Handles the use case that nothing was specified since PROJECT-TYPE is now an optional positional parameter\n    yargs.showHelp();\n  }\n}\n\n/**\n * Given a value from \"@default\", processes macros and returns a stringified\n * (quoted) result.\n *\n * @returns a javascript primitive (could be a string, number or boolean)\n */\nfunction renderDefault(cwd: string, value: string) {\n  return tryProcessMacro(cwd, value) ?? JSON.parse(value);\n}\n\n/**\n * Converts yargs command line switches to project type props.\n * @param type Project type\n * @param argv Command line switches\n */\nfunction commandLineToProps(\n  cwd: string,\n  type: inventory.ProjectType,\n  argv: Record<string, unknown>\n): Record<string, any> {\n  const props: Record<string, any> = {};\n\n  // initialize props with default values\n  for (const prop of type.options) {\n    if (prop.default && prop.default !== \"undefined\" && !prop.optional) {\n      props[prop.name] = renderDefault(cwd, prop.default);\n    }\n  }\n\n  for (const [arg, value] of Object.entries(argv)) {\n    for (const prop of type.options) {\n      if (prop.switch === arg) {\n        let curr = props;\n        const queue = [...prop.path];\n        while (true) {\n          const p = queue.shift();\n          if (!p) {\n            break;\n          }\n          if (queue.length === 0) {\n            curr[p] = value;\n          } else {\n            curr[p] = curr[p] ?? {};\n            curr = curr[p];\n          }\n        }\n      }\n    }\n  }\n\n  return props;\n}\n\n/**\n * Generates a new project from an external module.\n *\n * @param spec The name of the external module to load\n * @param args Command line arguments (incl. project type)\n */\nasync function initProjectFromModule(baseDir: string, spec: string, args: any) {\n  const projenVersion = args.projenVersion ?? \"latest\";\n  const installCommand = renderInstallCommand(\n    baseDir,\n    `projen@${projenVersion}`\n  );\n  if (args.projenVersion) {\n    exec(installCommand, { cwd: baseDir });\n  } else {\n    // do not overwrite existing installation\n    exec(\n      `npm ls --prefix=${baseDir} --depth=0 --pattern projen || ${installCommand}`,\n      { cwd: baseDir }\n    );\n  }\n\n  const moduleName = installPackage(baseDir, spec);\n\n  // Find the just installed package and discover the rest recursively from this package folder\n  const moduleDir = path.dirname(\n    require.resolve(`${moduleName}/.jsii`, {\n      paths: [baseDir],\n    })\n  );\n\n  // Only leave projects from the main (requested) package\n  const projects = inventory\n    .discover(moduleDir)\n    .filter((x) => x.moduleName === moduleName); // Only list project types from the requested 'from' module\n\n  if (projects.length < 1) {\n    throw new Error(\n      `No projects found after installing ${spec}. The module must export at least one class which extends projen.Project`\n    );\n  }\n\n  const requested = args.projectTypeName;\n  const types = projects.map((p) => p.pjid);\n\n  // if user did not specify a project type but the module has more than one, we need them to tell us which one...\n  if (!requested && projects.length > 1) {\n    throw new Error(\n      `Multiple projects found after installing ${spec}: ${types.join(\n        \",\"\n      )}. Please specify a project name.\\nExample: npx projen new --from ${spec} ${\n        types[0]\n      }`\n    );\n  }\n\n  // if user did not specify a type (and we know we have only one), the select it. otherwise, search by pjid.\n  const type = !requested\n    ? projects[0]\n    : projects.find((p) => p.pjid === requested);\n  if (!type) {\n    throw new Error(\n      `Project type ${requested} not found. Found ${types.join(\",\")}`\n    );\n  }\n\n  for (const option of type.options ?? []) {\n    if (\n      option.simpleType !== \"string\" &&\n      option.simpleType !== \"number\" &&\n      option.simpleType !== \"boolean\"\n    ) {\n      continue; // we don't support non-primitive fields as command line options\n    }\n\n    if (args[option.name] !== undefined) {\n      if (option.simpleType === \"number\") {\n        args[option.name] = parseInt(args[option.name]);\n        args[option.switch] = args[option.name];\n      } else if (option.simpleType === \"boolean\") {\n        const raw = args[option.name];\n        const safe = typeof raw === \"string\" ? isTruthy(raw) : raw;\n        args[option.name] = safe;\n        args[option.switch] = safe;\n      }\n      continue; // do not overwrite passed arguments\n    }\n\n    if (option.default && option.default !== \"undefined\") {\n      if (!option.optional) {\n        const defaultValue = renderDefault(baseDir, option.default);\n        args[option.name] = defaultValue;\n        args[option.switch] = defaultValue;\n      }\n    }\n  }\n\n  // include a dev dependency for the external module\n  args.devDeps = [spec];\n  args[\"dev-deps\"] = [spec];\n\n  await initProject(baseDir, type, args);\n}\n\n/**\n * Generates a new project.\n * @param type Project type\n * @param args Command line arguments\n * @param additionalProps Additional parameters to include in .projenrc.js\n */\nasync function initProject(\n  baseDir: string,\n  type: inventory.ProjectType,\n  args: any\n) {\n  // convert command line arguments to project props using type information\n  const props = commandLineToProps(baseDir, type, args);\n\n  Projects.createProject({\n    dir: props.outdir ?? baseDir,\n    projectFqn: type.fqn,\n    projectOptions: props,\n    optionHints: args.comments\n      ? InitProjectOptionHints.FEATURED\n      : InitProjectOptionHints.NONE,\n    synth: args.synth,\n    post: args.post,\n  });\n\n  if (fs.existsSync(path.join(baseDir, \"package.json\")) && args.post) {\n    exec(\"npm run eslint --if-present\", { cwd: baseDir });\n  }\n\n  if (args.git) {\n    const git = (cmd: string) => exec(`git ${cmd}`, { cwd: baseDir });\n    const gitversion: string = getGitVersion(\n      execCapture(\"git --version\", { cwd: baseDir }).toString()\n    );\n    logging.debug(\"system using git version \", gitversion);\n    if (gitversion && semver.gte(gitversion, \"2.28.0\")) {\n      git(\"init -b main\");\n      git(\"add .\");\n      git('commit --allow-empty -m \"chore: project created with projen\"');\n      logging.debug(\"default branch name set to main\");\n    } else {\n      git(\"init\");\n      git(\"add .\");\n      git('commit --allow-empty -m \"chore: project created with projen\"');\n      logging.debug(\n        \"older version of git detected, changed default branch name to main\"\n      );\n      git(\"branch -M main\");\n    }\n  }\n}\n\nmodule.exports = new Command();\n"
  },
  {
    "path": "src/cli/index.ts",
    "content": "import { resolve } from \"path\";\nimport * as yargs from \"yargs\";\nimport { PROJEN_RC, PROJEN_VERSION } from \"../common\";\nimport * as logging from \"../logging\";\nimport { TaskRuntime } from \"../task-runtime\";\nimport { getNodeMajorVersion } from \"../util\";\nimport { synth } from \"./synth\";\nimport { discoverTaskCommands } from \"./tasks\";\n\nconst DEFAULT_RC = resolve(PROJEN_RC);\n\nasync function main() {\n  const ya = yargs;\n  ya.commandDir(\"cmds\");\n\n  const runtime = new TaskRuntime(\".\");\n  discoverTaskCommands(runtime, ya);\n\n  ya.recommendCommands();\n  ya.strictCommands();\n  ya.showHelpOnFail(false);\n  ya.wrap(yargs.terminalWidth());\n  ya.option(\"post\", {\n    type: \"boolean\",\n    default: true,\n    desc: \"Run post-synthesis steps such as installing dependencies. Use --no-post to skip\",\n  });\n  ya.option(\"watch\", {\n    type: \"boolean\",\n    default: false,\n    desc: \"Keep running and resynthesize when projenrc changes\",\n    alias: \"w\",\n  });\n  ya.options(\"debug\", { type: \"boolean\", default: false, desc: \"Debug logs\" });\n  ya.options(\"rc\", {\n    desc: \"path to .projenrc.js file\",\n    default: DEFAULT_RC,\n    type: \"string\",\n  });\n  ya.completion();\n  ya.help();\n\n  // do not use the default yargs '--version' implementation since it is\n  // global by default (it appears on all subcommands)\n  ya.version(false);\n  ya.option(\"version\", {\n    type: \"boolean\",\n    description: \"Show version number\",\n    global: false,\n  });\n\n  const args = ya.argv;\n\n  if (args.debug) {\n    process.env.DEBUG = \"true\";\n  }\n\n  const nodeVersion = getNodeMajorVersion();\n  if (nodeVersion && nodeVersion < 14) {\n    logging.warn(\n      `WARNING: You are using Node v${nodeVersion}, which reaches end of life on April 30, 2022. Support for EOL Node releases may be dropped by projen in the future. Please consider upgrading to Node >= 14 as soon as possible.`\n    );\n  }\n\n  // no command means synthesize\n  if (args._.length === 0) {\n    if (args.version) {\n      console.log(PROJEN_VERSION);\n      process.exit(0);\n    }\n    await synth(runtime, {\n      post: args.post as boolean,\n      watch: args.watch as boolean,\n      rcfile: args.rc as string,\n    });\n  }\n}\n\nmain().catch((e) => {\n  console.error(e.stack);\n  process.exit(1);\n});\n"
  },
  {
    "path": "src/cli/macros.ts",
    "content": "import * as path from \"path\";\nimport { execOrUndefined, formatAsPythonModule } from \"../util\";\n\nexport function tryProcessMacro(cwd: string, macro: string) {\n  if (!macro.startsWith(\"$\")) {\n    return undefined;\n  }\n\n  const basedir = path.basename(cwd);\n\n  switch (macro) {\n    case \"$BASEDIR\":\n      return basedir;\n    case \"$GIT_REMOTE\":\n      const origin = execOrUndefined(\"git remote get-url origin\", { cwd });\n      if (origin) {\n        return origin;\n      }\n      const slug =\n        getFromGitConfig(cwd, \"github.user\") ?? resolveEmail(cwd).split(\"@\")[0];\n      return `https://github.com/${slug}/${basedir}.git`;\n\n    case \"$GIT_USER_NAME\":\n      return getFromGitConfig(cwd, \"user.name\") ?? \"user\";\n    case \"$GIT_USER_EMAIL\":\n      return resolveEmail(cwd);\n    case \"$PYTHON_MODULE_NAME\":\n      return formatAsPythonModule(basedir);\n  }\n\n  return undefined;\n}\n\n/**\n * Returns a value from git config. Searches local and then global git config.\n * @param key the config key\n */\nfunction getFromGitConfig(cwd: string, key: string): string | undefined {\n  return (\n    execOrUndefined(`git config --get --includes ${key}`, { cwd }) ??\n    execOrUndefined(`git config --get --global --includes ${key}`, { cwd })\n  );\n}\n\nfunction resolveEmail(cwd: string): string {\n  return getFromGitConfig(cwd, \"user.email\") ?? \"user@domain.com\";\n}\n"
  },
  {
    "path": "src/cli/synth.ts",
    "content": "import { spawnSync } from \"child_process\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { PROJEN_RC } from \"../common\";\nimport * as logging from \"../logging\";\nimport { Project } from \"../project\";\nimport { TaskRuntime } from \"../task-runtime\";\n\nconst projenModule = path.dirname(require.resolve(\"../../package.json\"));\n\nexport interface SynthOptions {\n  /**\n   * Execute post synthesis commands.\n   * @default true\n   */\n  readonly post?: boolean;\n\n  /**\n   * Start watching .projenrc.js and re-synth when changed.\n   * @default false\n   */\n  readonly watch?: boolean;\n\n  /**\n   * The name of the .projenrc.js file  to use instead of the default.\n   * @default \".projenrc.js\"\n   */\n  readonly rcfile?: string;\n}\n\nexport async function synth(runtime: TaskRuntime, options: SynthOptions) {\n  const workdir = runtime.workdir;\n  const rcfile = path.resolve(workdir, options.rcfile ?? PROJEN_RC); // TODO: support non javascript projenrc (e.g. java projects)\n\n  // if --rc points to .projenrc.js, then behave as if it wasn't specified.\n  if (rcfile === path.resolve(workdir, PROJEN_RC)) {\n    delete (options as any).rcfile;\n  }\n\n  // if there are no tasks, we assume this is not a projen project (modern\n  // projects must at least have the \"default\" task).\n  if (runtime.tasks.length === 0 && !fs.existsSync(rcfile)) {\n    logging.error(\n      'Unable to find projen project. Use \"projen new\" to create a new project.'\n    );\n    process.exit(1);\n  }\n\n  // run synth once\n  const success = await trySynth();\n\n  if (options.watch) {\n    // if we are in watch mode, start the watch loop\n    watchLoop();\n  } else if (!success) {\n    // make sure exit code is non-zero if we are not in watch mode\n    process.exit(1);\n  }\n\n  async function trySynth() {\n    // determine if post synthesis tasks should be executed (e.g. \"yarn install\").\n    process.env.PROJEN_DISABLE_POST = (!options.post).toString();\n    try {\n      const defaultTask = runtime.tasks.find(\n        (t) => t.name === Project.DEFAULT_TASK\n      );\n\n      // if \"--rc\" is specified, ignore the default task\n      if (defaultTask) {\n        if (!options.rcfile) {\n          runtime.runTask(defaultTask.name);\n          return true;\n        } else {\n          logging.warn(\n            \"Default task skipped. Trying legacy synthesis since --rc is specified\"\n          );\n        }\n      }\n\n      // for backwards compatibility, if there is a .projenrc.js file, default to \"node .projenrc.js\"\n      if (tryLegacySynth()) {\n        return true;\n      }\n\n      throw new Error('Unable to find a task named \"default\"');\n    } catch (e) {\n      logging.error(`Synthesis failed: ${(e as any).message}`);\n      return false;\n    }\n  }\n\n  function watchLoop() {\n    logging.info(`Watching for changes in ${workdir}...`);\n    const watch = fs.watch(workdir, { recursive: true });\n    watch.on(\"change\", (event) => {\n      // we only care about \"change\" events\n      if (event !== \"change\") {\n        return;\n      }\n\n      process.stdout.write(\"\\x1Bc\"); // clear screen\n      watch.close();\n      trySynth()\n        .then(() => watchLoop())\n        .catch(() => watchLoop());\n    });\n  }\n\n  function tryLegacySynth() {\n    const rcdir = path.dirname(rcfile);\n\n    if (!fs.existsSync(rcfile)) {\n      return false;\n    }\n\n    // if node_modules/projen is not a directory or does not exist, create a\n    // temporary symlink to the projen that we are currently running in order to\n    // allow .projenrc.js to `require()` it.\n    const nodeModules = path.resolve(rcdir, \"node_modules\");\n    const projenModulePath = path.resolve(nodeModules, \"projen\");\n    if (\n      !fs.existsSync(path.join(projenModulePath, \"package.json\")) ||\n      !fs.statSync(projenModulePath).isDirectory()\n    ) {\n      fs.removeSync(projenModulePath);\n      fs.mkdirpSync(nodeModules);\n      fs.symlinkSync(\n        projenModule,\n        projenModulePath,\n        os.platform() === \"win32\" ? \"junction\" : null\n      );\n    }\n\n    const ret = spawnSync(process.execPath, [rcfile], {\n      stdio: [\"inherit\", \"inherit\", \"pipe\"],\n    });\n    if (ret.error) {\n      throw new Error(`Synthesis failed: ${ret.error}`);\n    } else if (ret.status !== 0) {\n      logging.error(ret.stderr.toString());\n      throw new Error(\n        `Synthesis failed: calling \"${process.execPath} ${rcfile}\" exited with status=${ret.status}`\n      );\n    }\n\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/cli/tasks.ts",
    "content": "import * as chalk from \"chalk\";\nimport * as yargs from \"yargs\";\nimport * as logging from \"../logging\";\nimport { TaskRuntime } from \"../task-runtime\";\n\n/**\n * Reads .projen/tasks.json and adds CLI commands for all tasks.\n * @param ya yargs\n */\nexport function discoverTaskCommands(runtime: TaskRuntime, ya: yargs.Argv) {\n  const tasks = runtime.manifest.tasks ?? {};\n  for (const task of Object.values(tasks)) {\n    ya.command(\n      task.name,\n      task.description ?? \"\",\n      taskCommandHandler(task.name)\n    );\n  }\n\n  function taskCommandHandler(taskName: string) {\n    return (args: yargs.Argv) => {\n      args.option(\"inspect\", {\n        alias: \"i\",\n        desc: \"show all steps in this task\",\n      });\n\n      const argv = args.argv;\n\n      if (argv.inspect) {\n        return inspectTask(taskName);\n      } else {\n        try {\n          runtime.runTask(taskName);\n        } catch (e) {\n          logging.error(e.message);\n          process.exit(1);\n        }\n      }\n    };\n  }\n\n  function inspectTask(name: string, indent = 0) {\n    const writeln = (s: string) => console.log(\" \".repeat(indent) + s);\n\n    const task = runtime.tryFindTask(name);\n    if (!task) {\n      throw new Error(`${name}: unable to resolve subtask with name \"${name}\"`);\n    }\n\n    if (task.description) {\n      writeln(`${chalk.underline(\"description\")}: ${task.description}`);\n    }\n\n    for (const [k, v] of Object.entries(task.env ?? {})) {\n      writeln(`${chalk.underline(\"env\")}: ${k}=${v}`);\n    }\n\n    for (const step of task.steps ?? []) {\n      if (step.spawn) {\n        writeln(`- ${chalk.bold(step.spawn)}`);\n        inspectTask(step.spawn, indent + 2);\n      } else if (step.exec) {\n        writeln(`- exec: ${step.exec}`);\n      } else if (step.builtin) {\n        writeln(`- builtin: ${step.builtin}`);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/cli/util.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport * as logging from \"../logging\";\nimport { exec } from \"../util\";\n\n/**\n * Installs the npm module (through `npm install`) to node_modules under `projectDir`.\n * @param spec The npm package spec (e.g. `foo@^1.2` or `foo@/var/folders/8k/qcw0ls5pv_ph0000gn/T/projen-RYurCw/pkg.tgz`)\n * @returns The installed package name (e.g. `@foo/bar`)\n */\nexport function installPackage(baseDir: string, spec: string): string {\n  const packageJsonPath = path.join(baseDir, \"package.json\");\n  const packageJsonExisted = fs.existsSync(packageJsonPath);\n\n  if (!packageJsonExisted) {\n    // Make sure we have a package.json to read from later\n    exec(\"npm init --yes\", { cwd: baseDir });\n  }\n\n  logging.info(`installing external module ${spec}...`);\n  exec(renderInstallCommand(baseDir, spec), { cwd: baseDir });\n\n  // Get the true installed package name\n  const packageJson = fs.readJsonSync(packageJsonPath);\n  const packageName = Object.keys(packageJson.devDependencies).find(\n    (name) => name !== \"projen\"\n  );\n\n  if (!packageName) {\n    throw new Error(`Unable to resolve package name from spec ${spec}`);\n  }\n\n  // if package.json did not exist before calling `npm install`, we should remove it\n  // so we can start off clean.\n  if (!packageJsonExisted) {\n    fs.removeSync(packageJsonPath);\n  }\n\n  return packageName;\n}\n\n/**\n * Render a command to install an npm package.\n *\n * Engine checks are ignorred at this point so that the module can be installed\n * regardless of the environment. This was needed to unblock the upgrade of the\n * minimum node version of projen, but also okay generally because engine checks\n * will be performed later and for all eternety.\n *\n * @param dir Base directory\n * @param module The module to install (e.g. foo@^1.2)\n * @returns The string that includes the install command (\"npm install ...\")\n */\nexport function renderInstallCommand(dir: string, module: string): string {\n  return `npm install --save-dev -f --no-package-lock --prefix=${dir} ${module}`;\n}\n"
  },
  {
    "path": "src/clobber.ts",
    "content": "import { Component } from \"./component\";\nimport { Project } from \"./project\";\n\nexport class Clobber extends Component {\n  constructor(project: Project) {\n    super(project);\n\n    const task = this.project.addTask(\"clobber\", {\n      description: \"hard resets to HEAD of origin and cleans the local repo\",\n      condition: \"git diff --exit-code > /dev/null\",\n      env: {\n        BRANCH: \"$(git branch --show-current)\",\n      },\n    });\n\n    task.exec(\"git checkout -b scratch\", {\n      name: 'save current HEAD in \"scratch\" branch',\n    });\n    task.exec(\"git checkout $BRANCH\");\n    task.exec(\"git fetch origin\", { name: \"fetch latest changes from origin\" });\n    task.exec(\"git reset --hard origin/$BRANCH\", {\n      name: \"hard reset to origin commit\",\n    });\n    task.exec(\"git clean -fdx\", { name: \"clean all untracked files\" });\n    task.say(\n      'ready to rock! (unpushed commits are under the \"scratch\" branch)'\n    );\n  }\n}\n"
  },
  {
    "path": "src/common.ts",
    "content": "export const PROJEN_RC = \".projenrc.js\";\nexport const PROJEN_DIR = \".projen\";\nexport const PROJEN_MARKER = \"~~ Generated by \" + \"projen\"; // we split into two so /this/ file does not match the marker\n\nexport const IS_TEST_RUN = process.env.NODE_ENV === \"test\";\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst packageVersion = require(\"../package.json\").version;\n\n// if we are running with a test, report a fake stable version\nexport const PROJEN_VERSION = IS_TEST_RUN ? \"99.99.99\" : packageVersion;\n"
  },
  {
    "path": "src/component.ts",
    "content": "import { Project } from \"./project\";\n\n/**\n * Represents a project component.\n */\nexport class Component {\n  constructor(public readonly project: Project) {\n    project._addComponent(this);\n  }\n\n  /**\n   * Called before synthesis.\n   */\n  public preSynthesize() {}\n\n  /**\n   * Synthesizes files to the project output directory.\n   */\n  public synthesize() {}\n\n  /**\n   * Called after synthesis. Order is *not* guaranteed.\n   */\n  public postSynthesize() {}\n}\n"
  },
  {
    "path": "src/dependencies.ts",
    "content": "import * as path from \"path\";\nimport { PROJEN_DIR } from \"./common\";\nimport { Component } from \"./component\";\nimport { JsonFile } from \"./json\";\nimport { Project } from \"./project\";\n\n/**\n * The `Dependencies` component is responsible to track the list of dependencies\n * a project has, and then used by project types as the model for rendering\n * project-specific dependency manifests such as the dependencies section\n * `package.json` files.\n *\n * To add a dependency you can use a project-type specific API such as\n * `nodeProject.addDeps()` or use the generic API of `project.deps`:\n */\nexport class Dependencies extends Component {\n  /**\n   * The project-relative path of the deps manifest file.\n   */\n  public static readonly MANIFEST_FILE = path.posix.join(\n    PROJEN_DIR,\n    \"deps.json\"\n  );\n\n  /**\n   * Returns the coordinates of a dependency spec.\n   *\n   * Given `foo@^3.4.0` returns `{ name: \"foo\", version: \"^3.4.0\" }`.\n   * Given `bar@npm:@bar/legacy` returns `{ name: \"bar\", version: \"npm:@bar/legacy\" }`.\n   */\n  public static parseDependency(spec: string): DependencyCoordinates {\n    const scope = spec.startsWith(\"@\");\n    if (scope) {\n      spec = spec.substr(1);\n    }\n\n    const [module, ...version] = spec.split(\"@\");\n    const name = scope ? `@${module}` : module;\n    if (version.length == 0) {\n      return { name };\n    } else {\n      return { name, version: version?.join(\"@\") };\n    }\n  }\n\n  private readonly _deps = new Array<Dependency>();\n\n  /**\n   * Adds a dependencies component to the project.\n   * @param project The parent project\n   */\n  constructor(project: Project) {\n    super(project);\n\n    // this is not really required at the moment, but actually quite useful as a\n    // checked-in source of truth for dependencies and will potentially be\n    // valuable in the future for CLI tools.\n    if (!project.ejected) {\n      new JsonFile(project, Dependencies.MANIFEST_FILE, {\n        omitEmpty: true,\n        obj: () => this.toJson(),\n      });\n    }\n  }\n\n  /**\n   * A copy of all dependencies recorded for this project.\n   *\n   * The list is sorted by type->name->version\n   */\n  public get all(): Dependency[] {\n    return [...this._deps].sort(compareDeps).map(normalizeDep);\n  }\n\n  /**\n   * Returns a dependency by name.\n   *\n   * Fails if there is no dependency defined by that name or if `type` is not\n   * provided and there is more then one dependency type for this dependency.\n   *\n   * @param name The name of the dependency\n   * @param type The dependency type. If this dependency is defined only for a\n   * single type, this argument can be omitted.\n   *\n   * @returns a copy (cannot be modified)\n   */\n  public getDependency(name: string, type?: DependencyType): Dependency {\n    const dep = this.tryGetDependency(name, type);\n    if (!dep) {\n      const msg = type\n        ? `there is no ${type} dependency defined on \"${name}\"`\n        : `there is no dependency defined on \"${name}\"`;\n\n      throw new Error(msg);\n    }\n\n    return dep;\n  }\n\n  /**\n   * Returns a dependency by name.\n   *\n   * Returns `undefined` if there is no dependency defined by that name or if\n   * `type` is not provided and there is more then one dependency type for this\n   * dependency.\n   *\n   * @param name The name of the dependency\n   * @param type The dependency type. If this dependency is defined only for a\n   * single type, this argument can be omitted.\n   *\n   * @returns a copy (cannot be modified) or undefined if there is no match\n   */\n  public tryGetDependency(\n    name: string,\n    type?: DependencyType\n  ): Dependency | undefined {\n    const idx = this.tryGetDependencyIndex(name, type);\n    if (idx === -1) {\n      return undefined;\n    }\n\n    return {\n      ...normalizeDep(this._deps[idx]),\n    };\n  }\n\n  /**\n   * Adds a dependency to this project.\n   * @param spec The dependency spec in the format `MODULE[@VERSION]` where\n   * `MODULE` is the package-manager-specific module name and `VERSION` is an\n   * optional semantic version requirement (e.g. `^3.4.0`).\n   * @param type The type of the dependency.\n   */\n  public addDependency(\n    spec: string,\n    type: DependencyType,\n    metadata: { [key: string]: any } = {}\n  ): Dependency {\n    this.project.logger.debug(`${type}-dep ${spec}`);\n\n    const dep: Dependency = {\n      ...Dependencies.parseDependency(spec),\n      type,\n      metadata,\n    };\n\n    const existingDepIndex = this.tryGetDependencyIndex(dep.name, type);\n\n    if (existingDepIndex !== -1) {\n      this.project.logger.debug(\n        `updating existing ${dep.type}-dep ${dep.name} with more specific version/metadata`\n      );\n      this._deps[existingDepIndex] = dep;\n    } else {\n      this._deps.push(dep);\n    }\n\n    return dep;\n  }\n\n  /**\n   * Removes a dependency.\n   * @param name The name of the module to remove (without the version)\n   * @param type The dependency type. This is only required if there the\n   * dependency is defined for multiple types.\n   */\n  public removeDependency(name: string, type?: DependencyType) {\n    const removeIndex = this.tryGetDependencyIndex(name, type);\n    if (removeIndex === -1) {\n      return;\n    }\n\n    this._deps.splice(removeIndex, 1);\n  }\n\n  private tryGetDependencyIndex(name: string, type?: DependencyType): number {\n    const deps = this._deps.filter((d) => d.name === name);\n    if (deps.length === 0) {\n      return -1; // not found\n    }\n\n    if (!type) {\n      if (deps.length > 1) {\n        throw new Error(\n          `\"${name}\" is defined for multiple dependency types: ${deps\n            .map((d) => d.type)\n            .join(\",\")}. Please specify dependency type`\n        );\n      }\n\n      type = deps[0].type;\n    }\n\n    return this._deps.findIndex(\n      (dep) => dep.name === name && dep.type === type\n    );\n  }\n\n  private toJson(): DepsManifest | undefined {\n    if (this._deps.length === 0) {\n      return undefined;\n    }\n    return {\n      dependencies: this._deps.sort(compareDeps).map(normalizeDep),\n    };\n  }\n}\n\nfunction normalizeDep(d: Dependency) {\n  const obj: any = {};\n  for (const [k, v] of Object.entries(d)) {\n    if (v == undefined) {\n      continue;\n    }\n    if (typeof v === \"object\" && Object.keys(v).length === 0) {\n      continue;\n    }\n    if (Array.isArray(v) && v.length === 0) {\n      continue;\n    }\n    obj[k] = v;\n  }\n\n  return obj;\n}\n\nfunction compareDeps(d1: Dependency, d2: Dependency) {\n  return specOf(d1).localeCompare(specOf(d2));\n\n  function specOf(dep: Dependency) {\n    let spec = dep.type + \":\" + dep.name;\n    if (dep.version) {\n      spec += \"@\" + dep.version;\n    }\n    return spec;\n  }\n}\n\nexport interface DepsManifest {\n  /**\n   * All dependencies of this module.\n   */\n  readonly dependencies: Dependency[];\n}\n\n/**\n * Coordinates of the dependency (name and version).\n */\nexport interface DependencyCoordinates {\n  /**\n   * The package manager name of the dependency (e.g. `leftpad` for npm).\n   *\n   * NOTE: For package managers that use complex coordinates (like Maven), we\n   * will codify it into a string somehow.\n   */\n  readonly name: string;\n\n  /**\n   * Semantic version version requirement.\n   *\n   * @default - requirement is managed by the package manager (e.g. npm/yarn).\n   */\n  readonly version?: string;\n}\n\n/**\n * Represents a project dependency.\n */\nexport interface Dependency extends DependencyCoordinates {\n  /**\n   * Which type of dependency this is (runtime, build-time, etc).\n   */\n  readonly type: DependencyType;\n\n  /**\n   * Additional JSON metadata associated with the dependency (package manager\n   * specific).\n   * @default {}\n   */\n  readonly metadata?: { [key: string]: any };\n}\n\n/**\n * Type of dependency.\n */\nexport enum DependencyType {\n  /**\n   * The dependency is required for the program/library during runtime.\n   */\n  RUNTIME = \"runtime\",\n\n  /**\n   * The dependency is required at runtime but expected to be installed by the\n   * consumer.\n   */\n  PEER = \"peer\",\n\n  /**\n   * The dependency is bundled and shipped with the module, so consumers are not\n   * required to install it.\n   */\n  BUNDLED = \"bundled\",\n\n  /**\n   * The dependency is required to run the `build` task.\n   */\n  BUILD = \"build\",\n\n  /**\n   * The dependency is required to run the `test` task.\n   */\n  TEST = \"test\",\n\n  /**\n   * The dependency is required for development (e.g. IDE plugins).\n   */\n  DEVENV = \"devenv\",\n}\n"
  },
  {
    "path": "src/dev-env.ts",
    "content": "import { Task } from \"./task\";\n\n/**\n * Base options for configuring a container-based development environment.\n */\nexport interface DevEnvironmentOptions {\n  /**\n   * A Docker image or Dockerfile for the container.\n   */\n  readonly dockerImage?: DevEnvironmentDockerImage;\n\n  /**\n   * An array of tasks that should be run when the container starts.\n   */\n  readonly tasks?: Task[];\n\n  /**\n   * An array of ports that should be exposed from the container.\n   */\n  readonly ports?: string[];\n\n  /**\n   * An array of extension IDs that specify the extensions that should be\n   * installed inside the container when it is created.\n   */\n  readonly vscodeExtensions?: string[];\n}\n\n/**\n * Options for specifying the Docker image of the container.\n */\nexport class DevEnvironmentDockerImage {\n  /**\n   * A publicly available Docker image.\n   * @example 'ubuntu:latest'\n   * @param image a Docker image\n   */\n  public static fromImage(image: string): DevEnvironmentDockerImage {\n    return { image };\n  }\n\n  /**\n   * The relative path of a Dockerfile that defines the container contents.\n   * @example '.gitpod.Docker'\n   * @param dockerFile a relative path\n   */\n  public static fromFile(dockerFile: string): DevEnvironmentDockerImage {\n    return { dockerFile };\n  }\n\n  /**\n   * A publicly available Docker image.\n   */\n  public readonly image?: string;\n\n  /**\n   * The relative path of a Dockerfile that defines the container contents.\n   */\n  public readonly dockerFile?: string;\n\n  private constructor() {}\n}\n\n/**\n * Abstract interface for container-based development environments, such as\n * Gitpod and GitHub Codespaces.\n */\nexport interface IDevEnvironment {\n  /**\n   * Add a custom Docker image or Dockerfile for the container.\n   *\n   * @param image The Docker image\n   */\n  addDockerImage(image: DevEnvironmentDockerImage): void;\n\n  /**\n   * Adds tasks to run when the container starts.\n   *\n   * @param tasks The new tasks\n   */\n  addTasks(...tasks: Task[]): void;\n\n  /**\n   * Adds ports that should be exposed (forwarded) from the container.\n   *\n   * @param ports The new ports\n   */\n  addPorts(...ports: string[]): void;\n\n  /**\n   * Adds a list of VSCode extensions that should be automatically installed\n   * in the container.\n   *\n   * @param extensions The extension IDs\n   */\n  addVscodeExtensions(...extensions: string[]): void;\n}\n"
  },
  {
    "path": "src/docker-compose.ts",
    "content": "import { Component } from \"./component\";\nimport { Project } from \"./project\";\nimport { decamelizeKeysRecursively } from \"./util\";\nimport { YamlFile } from \"./yaml\";\n\n/**\n * Props for DockerCompose.\n */\nexport interface DockerComposeProps {\n  /**\n   * A name to add to the docker-compose.yml filename.\n   * @example 'myname' yields 'docker-compose.myname.yml'\n   * @default - no name is added\n   */\n  readonly nameSuffix?: string;\n\n  /**\n   * Docker Compose schema version do be used\n   * @default 3.3\n   */\n  readonly schemaVersion?: string;\n\n  /**\n   * Service descriptions.\n   */\n  readonly services?: Record<string, DockerComposeServiceDescription>;\n}\n\n/**\n * Options for port mappings.\n */\nexport interface DockerComposePortMappingOptions {\n  /**\n   * Port mapping protocol.\n   * @default DockerComposeProtocol.TCP\n   */\n  readonly protocol?: DockerComposeProtocol;\n}\n\n/**\n * Create a docker-compose YAML file.\n */\nexport class DockerCompose extends Component {\n  /**\n   * Depends on a service name.\n   */\n  static serviceName(serviceName: string): IDockerComposeServiceName {\n    return {\n      serviceName,\n    };\n  }\n\n  /**\n   * Create a port mapping.\n   * @param publishedPort Published port number\n   * @param targetPort Container's port number\n   * @param options Port mapping options\n   */\n  static portMapping(\n    publishedPort: number,\n    targetPort: number,\n    options?: DockerComposePortMappingOptions\n  ): DockerComposeServicePort {\n    const protocol = options?.protocol ?? DockerComposeProtocol.TCP;\n\n    return {\n      target: targetPort,\n      published: publishedPort,\n      protocol: protocol,\n      mode: \"host\",\n    };\n  }\n\n  /**\n   * Create a bind volume that binds a host path to the target path in the container.\n   * @param sourcePath Host path name\n   * @param targetPath Target path name\n   */\n  static bindVolume(\n    sourcePath: string,\n    targetPath: string\n  ): IDockerComposeVolumeBinding {\n    return {\n      bind(_volumeInfo: IDockerComposeVolumeConfig): DockerComposeVolumeMount {\n        return {\n          type: \"bind\",\n          source: sourcePath,\n          target: targetPath,\n        };\n      },\n    };\n  }\n\n  /**\n   * Create a named volume and mount it to the target path. If you use this\n   * named volume in several services, the volume will be shared. In this\n   * case, the volume configuration of the first-provided options are used.\n   *\n   * @param volumeName Name of the volume\n   * @param targetPath Target path\n   * @param options volume configuration (default: docker compose defaults)\n   */\n  static namedVolume(\n    volumeName: string,\n    targetPath: string,\n    options: DockerComposeVolumeConfig = {}\n  ): IDockerComposeVolumeBinding {\n    return {\n      bind(volumeInfo: IDockerComposeVolumeConfig): DockerComposeVolumeMount {\n        volumeInfo.addVolumeConfiguration(volumeName, options);\n\n        return {\n          type: \"volume\",\n          source: volumeName,\n          target: targetPath,\n        };\n      },\n    };\n  }\n\n  private readonly services: Record<string, DockerComposeService>;\n  private readonly version: string;\n\n  constructor(project: Project, props?: DockerComposeProps) {\n    super(project);\n\n    const nameSuffix = props?.nameSuffix ? `${props!.nameSuffix}.yml` : \"yml\";\n    new YamlFile(project, `docker-compose.${nameSuffix}`, {\n      committed: true,\n      readonly: true,\n      obj: () => this._synthesizeDockerCompose(),\n    });\n\n    if (props?.schemaVersion && !parseFloat(props.schemaVersion)) {\n      throw Error(\"Version tag needs to be a number\");\n    }\n    this.version = props?.schemaVersion ? props.schemaVersion : \"3.3\";\n    this.services = {};\n\n    // Add the services provided via the constructor argument.\n    const initialServices = props?.services ?? {};\n    for (const [name, serviceDescription] of Object.entries(initialServices)) {\n      this.addService(name, serviceDescription);\n    }\n  }\n\n  /**\n   * Add a service to the docker-compose file.\n   * @param serviceName name of the service\n   * @param description a service description\n   */\n  public addService(\n    serviceName: string,\n    description: DockerComposeServiceDescription\n  ): DockerComposeService {\n    const service = new DockerComposeService(serviceName, description);\n    this.services[serviceName] = service;\n    return service;\n  }\n\n  /**\n   * @internal\n   */\n  _synthesizeDockerCompose(): object {\n    if (Object.keys(this.services).length === 0) {\n      throw new Error(\"DockerCompose requires at least one service\");\n    }\n\n    return renderDockerComposeFile(this.services, this.version);\n  }\n}\n\n/**\n * An interface providing the name of a docker compose service.\n */\nexport interface IDockerComposeServiceName {\n  /**\n   * The name of the docker compose service.\n   */\n  readonly serviceName: string;\n}\n\n/**\n * Description of a docker-compose.yml service.\n */\nexport interface DockerComposeServiceDescription {\n  /**\n   * Use a docker image.\n   * Note: You must specify either `build` or `image` key.\n   * @see imageBuild\n   */\n  readonly image?: string;\n\n  /**\n   * Build a docker image.\n   * Note: You must specify either `imageBuild` or `image` key.\n   * @see image\n   */\n  readonly imageBuild?: DockerComposeBuild;\n\n  /**\n   * Provide a command to the docker container.\n   * @default - use the container's default command\n   */\n  readonly command?: string[];\n\n  /**\n   * Names of other services this service depends on.\n   * @default - no dependencies\n   */\n  readonly dependsOn?: IDockerComposeServiceName[];\n\n  /**\n   * Mount some volumes into the service.\n   * Use one of the following to create volumes:\n   * @see DockerCompose.bindVolume() to mount a host path\n   * @see DockerCompose.namedVolume() to create & mount a named volume\n   */\n  readonly volumes?: IDockerComposeVolumeBinding[];\n\n  /**\n   * Map some ports.\n   * @default - no ports are mapped\n   */\n  readonly ports?: DockerComposeServicePort[];\n\n  /**\n   * Add environment variables.\n   * @default - no environment variables are provided\n   */\n  readonly environment?: Record<string, string>;\n}\n\n/**\n * A docker-compose service.\n */\nexport class DockerComposeService implements IDockerComposeServiceName {\n  /**\n   * Name of the service.\n   */\n  public readonly serviceName: string;\n\n  /**\n   * Docker image.\n   */\n  public readonly image?: string;\n\n  /**\n   * Docker image build instructions.\n   */\n  public readonly imageBuild?: DockerComposeBuild;\n\n  /**\n   * Command to run in the container.\n   */\n  public readonly command?: string[];\n\n  /**\n   * Other services that this service depends on.\n   */\n  public readonly dependsOn: IDockerComposeServiceName[];\n\n  /**\n   * Volumes mounted in the container.\n   */\n  public readonly volumes: IDockerComposeVolumeBinding[];\n\n  /**\n   * Published ports.\n   */\n  public readonly ports: DockerComposeServicePort[];\n\n  /**\n   * Environment variables.\n   */\n  public readonly environment: Record<string, string>;\n\n  constructor(\n    serviceName: string,\n    serviceDescription: DockerComposeServiceDescription\n  ) {\n    if (\n      (!serviceDescription.imageBuild && !serviceDescription.image) ||\n      (serviceDescription.imageBuild && serviceDescription.image)\n    ) {\n      throw new Error(\n        `A service ${serviceName} requires exactly one of a \\`imageBuild\\` or \\`image\\` key`\n      );\n    }\n\n    this.serviceName = serviceName;\n    this.command = serviceDescription.command;\n    this.image = serviceDescription.image;\n    this.imageBuild = serviceDescription.imageBuild;\n    this.dependsOn = serviceDescription.dependsOn ?? [];\n    this.volumes = serviceDescription.volumes ?? [];\n    this.ports = serviceDescription.ports ?? [];\n    this.environment = serviceDescription.environment ?? {};\n  }\n\n  /**\n   * Add a port mapping\n   * @param publishedPort Published port number\n   * @param targetPort Container's port number\n   * @param options Port mapping options\n   */\n  public addPort(\n    publishedPort: number,\n    targetPort: number,\n    options?: DockerComposePortMappingOptions\n  ) {\n    this.ports?.push(\n      DockerCompose.portMapping(publishedPort, targetPort, options)\n    );\n  }\n\n  /**\n   * Add an environment variable\n   * @param name environment variable name\n   * @param value value of the environment variable\n   */\n  public addEnvironment(name: string, value: string) {\n    this.environment[name] = value;\n  }\n\n  /**\n   * Make the service depend on another service.\n   * @param serviceName\n   */\n  public addDependsOn(serviceName: IDockerComposeServiceName) {\n    this.dependsOn.push(serviceName);\n  }\n\n  /**\n   * Add a volume to the service.\n   * @param volume\n   */\n  public addVolume(volume: IDockerComposeVolumeBinding) {\n    this.volumes.push(volume);\n  }\n}\n\n/**\n * A service port mapping\n */\nexport interface DockerComposeServicePort {\n  /**\n   * Published port number\n   */\n  readonly published: number;\n\n  /**\n   * Target port number\n   */\n  readonly target: number;\n\n  /**\n   * Network protocol\n   */\n  readonly protocol: DockerComposeProtocol;\n\n  /**\n   * Port mapping mode.\n   */\n  readonly mode: string;\n}\n\n/**\n * Network protocol for port mapping\n */\nexport enum DockerComposeProtocol {\n  /**\n   * TCP protocol\n   */\n  TCP = \"tcp\",\n\n  /**\n   * UDP protocol\n   */\n  UDP = \"udp\",\n}\n\n/**\n * Build arguments for creating a docker image.\n */\nexport interface DockerComposeBuild {\n  /**\n   * Docker build context directory.\n   */\n  readonly context: string;\n\n  /**\n   * A dockerfile to build from.\n   * @default \"Dockerfile\"\n   */\n  readonly dockerfile?: string;\n\n  /**\n   * Build args.\n   * @default - none are provided\n   */\n  readonly args?: Record<string, string>;\n}\n\n/**\n * Volume configuration\n */\nexport interface DockerComposeVolumeConfig {\n  /**\n   * Driver to use for the volume\n   * @default - value is not provided\n   */\n  readonly driver?: string;\n\n  /**\n   * Options to provide to the driver.\n   */\n  readonly driverOpts?: Record<string, string>;\n\n  /**\n   * Set to true to indicate that the volume is externally created.\n   * @default - unset, indicating that docker-compose creates the volume\n   */\n  readonly external?: boolean;\n\n  /**\n   * Name of the volume for when the volume name isn't going to work in YAML.\n   * @default - unset, indicating that docker-compose creates volumes as usual\n   */\n  readonly name?: string;\n}\n\n/**\n * Volume binding information.\n */\nexport interface IDockerComposeVolumeBinding {\n  /**\n   * Binds the requested volume to the docker-compose volume configuration and\n   * provide mounting instructions for synthesis.\n   * @param volumeConfig the volume configuration\n   * @returns mounting instructions for the service.\n   */\n  bind(volumeConfig: IDockerComposeVolumeConfig): DockerComposeVolumeMount;\n}\n\n/**\n * Storage for volume configuration.\n */\nexport interface IDockerComposeVolumeConfig {\n  /**\n   * Add volume configuration to the repository.\n   * @param volumeName\n   * @param configuration\n   */\n  addVolumeConfiguration(\n    volumeName: string,\n    configuration: DockerComposeVolumeConfig\n  ): void;\n}\n\n/**\n * Service volume mounting information.\n */\nexport interface DockerComposeVolumeMount {\n  /**\n   * Type of volume.\n   */\n  readonly type: string;\n\n  /**\n   * Volume source\n   */\n  readonly source: string;\n\n  /**\n   * Volume target\n   */\n  readonly target: string;\n}\n\n/**\n * Structure of a docker compose file before we decamelize.\n * @internal\n */\ninterface DockerComposeFileSchema {\n  version: string;\n  services: Record<string, DockerComposeFileServiceSchema>;\n  volumes?: Record<string, DockerComposeVolumeConfig>;\n}\n\n/**\n * Structure of a docker compose file's service before we decamelize.\n * @internal\n */\ninterface DockerComposeFileServiceSchema {\n  readonly dependsOn?: string[];\n  readonly build?: DockerComposeBuild;\n  readonly image?: string;\n  readonly command?: string[];\n  readonly volumes?: DockerComposeVolumeMount[];\n  readonly ports?: DockerComposeServicePort[];\n  readonly environment?: Record<string, string>;\n}\n\nfunction renderDockerComposeFile(\n  serviceDescriptions: Record<string, DockerComposeService>,\n  version: string\n): object {\n  // Record volume configuration\n  const volumeConfig: Record<string, DockerComposeVolumeConfig> = {};\n  const volumeInfo: IDockerComposeVolumeConfig = {\n    addVolumeConfiguration(\n      volumeName: string,\n      configuration: DockerComposeVolumeConfig\n    ) {\n      if (!volumeConfig[volumeName]) {\n        // First volume configuration takes precedence.\n        volumeConfig[volumeName] = configuration;\n      }\n    },\n  };\n\n  // Render service configuration\n  const services: Record<string, DockerComposeFileServiceSchema> = {};\n  for (const [serviceName, serviceDescription] of Object.entries(\n    serviceDescriptions ?? {}\n  )) {\n    // Resolve the names of each dependency and check that they exist.\n    // Note: They may not exist if the user made a mistake when referencing a\n    // service by name via `DockerCompose.serviceName()`.\n    // @see DockerCompose.serviceName\n    const dependsOn = Array<string>();\n    for (const dependsOnServiceName of serviceDescription.dependsOn ?? []) {\n      const resolvedServiceName = dependsOnServiceName.serviceName;\n      if (resolvedServiceName === serviceName) {\n        throw new Error(`Service ${serviceName} cannot depend on itself`);\n      }\n      if (!serviceDescriptions[resolvedServiceName]) {\n        throw new Error(\n          `Unable to resolve service named ${resolvedServiceName} for ${serviceName}`\n        );\n      }\n\n      dependsOn.push(resolvedServiceName);\n    }\n\n    // Give each volume binding a chance to bind any necessary volume\n    // configuration and provide volume mount information for the service.\n    const volumes: DockerComposeVolumeMount[] = [];\n    for (const volumeBinding of serviceDescription.volumes ?? []) {\n      volumes.push(volumeBinding.bind(volumeInfo));\n    }\n\n    // Create and store the service configuration, taking care not to create\n    // object members with undefined values.\n    services[serviceName] = {\n      ...getObjectWithKeyAndValueIfValueIsDefined(\n        \"image\",\n        serviceDescription.image\n      ),\n      ...getObjectWithKeyAndValueIfValueIsDefined(\n        \"build\",\n        serviceDescription.imageBuild\n      ),\n      ...getObjectWithKeyAndValueIfValueIsDefined(\n        \"command\",\n        serviceDescription.command\n      ),\n      ...(Object.keys(serviceDescription.environment).length > 0\n        ? { environment: serviceDescription.environment }\n        : {}),\n      ...(serviceDescription.ports.length > 0\n        ? { ports: serviceDescription.ports }\n        : {}),\n      ...(dependsOn.length > 0 ? { dependsOn } : {}),\n      ...(volumes.length > 0 ? { volumes } : {}),\n    };\n  }\n\n  // Explicit with the type here because the decamelize step after this wipes\n  // out types.\n  const input: DockerComposeFileSchema = {\n    version,\n    services,\n    ...(Object.keys(volumeConfig).length > 0 ? { volumes: volumeConfig } : {}),\n  };\n\n  // Change most keys to snake case.\n  return decamelizeKeysRecursively(input, {\n    shouldDecamelize: shouldDecamelizeDockerComposeKey,\n    separator: \"_\",\n  });\n}\n\n/**\n * Returns `{ [key]: value }` if `value` is defined, otherwise returns `{}` so\n * that object spreading can be used to generate a peculiar interface.\n * @param key\n * @param value\n */\nfunction getObjectWithKeyAndValueIfValueIsDefined<K extends string, T>(\n  key: K,\n  value: T\n): { K: T } | {} {\n  return value !== undefined ? { [key]: value } : {};\n}\n\n/**\n * Determines whether the key at the given path should be decamelized.\n * Largely, all keys should be snake cased. But, there are some\n * exceptions for user-provided names for services, volumes, and\n * environment variables.\n *\n * @param path\n */\nfunction shouldDecamelizeDockerComposeKey(path: string[]) {\n  const poundPath = path.join(\"#\");\n\n  // Does not decamelize user's names.\n  // services.namehere:\n  // volumes.namehere:\n  if (/^(services|volumes)#[^#]+$/.test(poundPath)) {\n    return false;\n  }\n\n  // Does not decamelize environment variables\n  // services.namehere.environment.*\n  if (/^services#[^#]+#environment#/.test(poundPath)) {\n    return false;\n  }\n\n  // Does not decamelize build arguments\n  // services.namehere.build.args.*\n  if (/^services#[^#]+#build#args#/.test(poundPath)) {\n    return false;\n  }\n\n  // Otherwise, let it all decamelize.\n  return true;\n}\n"
  },
  {
    "path": "src/file.ts",
    "content": "import * as path from \"path\";\nimport { removeSync } from \"fs-extra\";\nimport { resolve } from \"./_resolve\";\nimport { PROJEN_MARKER, PROJEN_RC } from \"./common\";\nimport { Component } from \"./component\";\nimport { Project } from \"./project\";\nimport { isExecutable, isWritable, tryReadFileSync, writeFile } from \"./util\";\n\nexport interface FileBaseOptions {\n  /**\n   * Indicates whether this file should be committed to git or ignored. By\n   * default, all generated files are committed and anti-tamper is used to\n   * protect against manual modifications.\n   *\n   * @default true\n   */\n  readonly committed?: boolean;\n\n  /**\n   * Update the project's .gitignore file\n   * @default true\n   */\n  readonly editGitignore?: boolean;\n\n  /**\n   * Whether the generated file should be readonly.\n   *\n   * @default true\n   */\n  readonly readonly?: boolean;\n\n  /**\n   * Whether the generated file should be marked as executable.\n   *\n   * @default false\n   */\n  readonly executable?: boolean;\n\n  /**\n   * Adds the projen marker to the file.\n   *\n   * @default - marker will be included as long as the project is not ejected\n   */\n  readonly marker?: boolean;\n}\n\nexport abstract class FileBase extends Component {\n  /**\n   * The file path, relative to the project root.\n   */\n  public readonly path: string;\n\n  /**\n   * Indicates if the file should be read-only or read-write.\n   */\n  public readonly: boolean;\n\n  /**\n   * Indicates if the file should be marked as executable\n   */\n  public executable: boolean;\n\n  /**\n   * The projen marker, used to identify files as projen-generated.\n   *\n   * Value is undefined if the project is being ejected.\n   */\n  public readonly marker: string | undefined;\n\n  /**\n   * The absolute path of this file.\n   */\n  public readonly absolutePath: string;\n\n  private _changed?: boolean;\n\n  constructor(\n    project: Project,\n    filePath: string,\n    options: FileBaseOptions = {}\n  ) {\n    super(project);\n\n    this.readonly = !project.ejected && (options.readonly ?? true);\n    this.executable = options.executable ?? false;\n    this.path = filePath;\n\n    // `marker` is empty if project is being ejected or if explicitly disabled\n    this.marker =\n      project.ejected || options.marker === false\n        ? undefined\n        : `${PROJEN_MARKER}. To modify, edit ${PROJEN_RC} and run \"npx projen\".`;\n\n    const globPattern = `/${this.path}`;\n    const committed = options.committed ?? project.commitGenerated ?? true;\n    if (committed && filePath !== \".gitattributes\") {\n      project.root.annotateGenerated(`/${filePath}`);\n    }\n\n    this.absolutePath = path.resolve(project.outdir, filePath);\n\n    // verify file path is unique within project tree\n    const existing = project.root.tryFindFile(this.absolutePath);\n    if (existing && existing !== this) {\n      throw new Error(\n        `there is already a file under ${path.relative(\n          project.root.outdir,\n          this.absolutePath\n        )}`\n      );\n    }\n\n    const editGitignore = options.editGitignore ?? true;\n    if (editGitignore) {\n      this.project.addGitIgnore(`${committed ? \"!\" : \"\"}${globPattern}`);\n    } else {\n      if (options.committed != null) {\n        throw new Error(\n          '\"gitignore\" is disabled, so it does not make sense to specify \"committed\"'\n        );\n      }\n    }\n  }\n\n  /**\n   * Implemented by derived classes and returns the contents of the file to\n   * emit.\n   * @param resolver Call `resolver.resolve(obj)` on any objects in order to\n   * resolve token functions.\n   * @returns the content to synthesize or undefined to skip the file\n   */\n  protected abstract synthesizeContent(resolver: IResolver): string | undefined;\n\n  /**\n   * Writes the file to the project's output directory\n   */\n  public synthesize() {\n    const outdir = this.project.outdir;\n    const filePath = path.join(outdir, this.path);\n    const resolver: IResolver = {\n      resolve: (obj, options) => resolve(obj, options),\n    };\n    const content = this.synthesizeContent(resolver);\n    if (content === undefined) {\n      // remove file (if exists) and skip rest of synthesis\n      removeSync(filePath);\n      return;\n    }\n\n    // check if the file was changed.\n    const prev = tryReadFileSync(filePath);\n    const prevReadonly = !isWritable(filePath);\n    const prevExecutable = isExecutable(filePath);\n    if (\n      prev !== undefined &&\n      content === prev &&\n      prevReadonly === this.readonly &&\n      prevExecutable === this.executable\n    ) {\n      this.project.logger.debug(`no change in ${filePath}`);\n      this._changed = false;\n      return;\n    }\n\n    writeFile(filePath, content, {\n      readonly: this.readonly,\n      executable: this.executable,\n    });\n\n    this.checkForProjenMarker();\n\n    this._changed = true;\n  }\n\n  /**\n   * For debugging, check whether a file was incorrectly generated with\n   * or without the projen marker. The projen marker does not *need* to be\n   * included on projen-generated files, but it's recommended since it signals\n   * that it probably should not be edited directly.\n   */\n  private checkForProjenMarker() {\n    const filePath = path.join(this.project.outdir, this.path);\n    const contents = tryReadFileSync(filePath);\n    const containsMarker = contents?.includes(PROJEN_MARKER);\n    if (this.marker && !containsMarker) {\n      this.project.logger.debug(\n        `note: expected ${this.path} to contain marker but found none.`\n      );\n    } else if (!this.marker && containsMarker) {\n      this.project.logger.debug(\n        `note: expected ${this.path} to not contain marker but found one anyway.`\n      );\n    }\n  }\n\n  /**\n   * Indicates if the file has been changed during synthesis. This property is\n   * only available in `postSynthesize()` hooks. If this is `undefined`, the\n   * file has not been synthesized yet.\n   */\n  public get changed(): boolean | undefined {\n    return this._changed;\n  }\n}\n\n/**\n * API for resolving tokens when synthesizing file content.\n */\nexport interface IResolver {\n  /**\n   * Given a value (object/string/array/whatever, looks up any functions inside\n   * the object and returns an object where all functions are called.\n   * @param value The value to resolve\n   * @package options Resolve options\n   */\n  resolve(value: any, options?: ResolveOptions): any;\n}\n\n/**\n * Resolve options.\n */\nexport interface ResolveOptions {\n  /**\n   * Omits empty arrays and objects.\n   * @default false\n   */\n  readonly omitEmpty?: boolean;\n\n  /**\n   * Context arguments.\n   * @default []\n   */\n  readonly args?: any[];\n}\n\nexport interface IResolvable {\n  /**\n   * Resolves and returns content.\n   */\n  toJSON(): any;\n}\n"
  },
  {
    "path": "src/gitattributes.ts",
    "content": "import { IResolver, FileBase } from \"./file\";\nimport { Project } from \"./project\";\n\n/**\n * Assign attributes to file names in a git repository.\n *\n * @see https://git-scm.com/docs/gitattributes\n */\nexport class GitAttributesFile extends FileBase {\n  private readonly attributes = new Map<string, Set<string>>();\n\n  public constructor(project: Project) {\n    super(project, \".gitattributes\", {\n      editGitignore: false,\n    });\n  }\n\n  /**\n   * Maps a set of attributes to a set of files.\n   * @param glob Glob pattern to match files in the repo\n   * @param attributes Attributes to assign to these files.\n   */\n  public addAttributes(glob: string, ...attributes: string[]) {\n    if (!this.attributes.has(glob)) {\n      this.attributes.set(glob, new Set());\n    }\n    const set = this.attributes.get(glob)!;\n    for (const attribute of attributes) {\n      set.add(attribute);\n    }\n  }\n\n  protected synthesizeContent(_: IResolver): string | undefined {\n    // We can assume the file map is never empty.\n    const entries = Array.from(this.attributes.entries()).sort(([l], [r]) =>\n      l.localeCompare(r)\n    );\n\n    if (entries.length === 0) {\n      return undefined;\n    }\n\n    return [\n      ...(this.marker ? [`# ${this.marker}`] : []),\n      \"\",\n      ...entries.map(\n        ([name, attributes]) => `${name} ${Array.from(attributes).join(\" \")}`\n      ),\n    ].join(\"\\n\");\n  }\n}\n"
  },
  {
    "path": "src/github/auto-approve.ts",
    "content": "import { Component } from \"../component\";\nimport { GitHub } from \"./github\";\nimport { Job, JobPermission } from \"./workflows-model\";\n\n/**\n * Options for 'AutoApprove'\n */\nexport interface AutoApproveOptions {\n  /**\n   * Only pull requests authored by these Github usernames will be auto-approved.\n   * @default ['github-bot']\n   */\n  readonly allowedUsernames?: string[];\n\n  /**\n   * Only pull requests with this label will be auto-approved.\n   * @default 'auto-approve'\n   */\n  readonly label?: string;\n\n  /**\n   * A GitHub secret name which contains a GitHub Access Token\n   * with write permissions for the `pull_request` scope.\n   *\n   * This token is used to approve pull requests.\n   *\n   * Github forbids an identity to approve its own pull request.\n   * If your project produces automated pull requests using the Github default token -\n   * {@link https://docs.github.com/en/actions/reference/authentication-in-a-workflow `GITHUB_TOKEN` }\n   * - that you would like auto approved, such as when using the `depsUpgrade` property in\n   * `NodeProjectOptions`, then you must use a different token here.\n   *\n   * @default \"GITHUB_TOKEN\"\n   */\n  readonly secret?: string;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n}\n\n/**\n * Auto approve pull requests that meet a criteria\n */\nexport class AutoApprove extends Component {\n  public readonly label: string;\n\n  constructor(github: GitHub, options: AutoApproveOptions = {}) {\n    super(github.project);\n\n    this.label = options.label ?? \"auto-approve\";\n    const usernames = options.allowedUsernames ?? [\"github-actions[bot]\"];\n\n    let condition = `contains(github.event.pull_request.labels.*.name, '${this.label}')`;\n    if (usernames.length > 0) {\n      condition += \" && (\";\n      condition += usernames\n        .map((u) => `github.event.pull_request.user.login == '${u}'`)\n        .join(\" || \");\n      condition += \")\";\n    }\n\n    const secret = options.secret ?? \"GITHUB_TOKEN\";\n\n    const approveJob: Job = {\n      runsOn: options.runsOn ?? [\"ubuntu-latest\"],\n      permissions: {\n        pullRequests: JobPermission.WRITE,\n      },\n      if: condition,\n      steps: [\n        {\n          uses: \"hmarr/auto-approve-action@v2.2.1\",\n          with: {\n            \"github-token\": `\\${{ secrets.${secret} }}`,\n          },\n        },\n      ],\n    };\n\n    const workflow = github.addWorkflow(\"auto-approve\");\n    workflow.on({\n      // The 'pull request' event gives the workflow 'read-only' permissions on some\n      // pull requests (such as the ones from dependabot) when using the `GITHUB_TOKEN`\n      // security token. This prevents the workflow from approving these pull requests.\n      // Github has placed this guard so as to prevent security attacks by simply opening\n      // a pull request and triggering a workflow on a commit that was not vetted to make\n      // unintended changes to the repository.\n      //\n      // Instead use the 'pull request target' event here that gives the Github workflow\n      // 'read-write' permissions. This is safe because, this event, unlike the 'pull request'\n      // event references the BASE commit of the pull request and not the HEAD commit.\n      pullRequestTarget: {\n        types: [\n          \"labeled\",\n          \"opened\",\n          \"synchronize\",\n          \"reopened\",\n          \"ready_for_review\",\n        ],\n      },\n    });\n    workflow.addJobs({ approve: approveJob });\n  }\n}\n"
  },
  {
    "path": "src/github/auto-merge.ts",
    "content": "import { Component } from \"../component\";\nimport { GitHub } from \"./github\";\n\nexport interface AutoMergeOptions {\n  /**\n   * Number of approved code reviews.\n   * @default 1\n   */\n  readonly approvedReviews?: number;\n\n  /**\n   * List of labels that will prevent auto-merging.\n   * @default ['do-not-merge']\n   */\n  readonly blockingLabels?: string[];\n}\n\n/**\n * Sets up mergify to merging approved pull requests.\n *\n * If `buildJob` is specified, the specified GitHub workflow job ID is required\n * to succeed in order for the PR to be merged.\n *\n * `approvedReviews` specified the number of code review approvals required for\n * the PR to be merged.\n */\nexport class AutoMerge extends Component {\n  private readonly lazyConditions = new Array<IAddConditionsLater>();\n\n  constructor(github: GitHub, options: AutoMergeOptions = {}) {\n    super(github.project);\n\n    const mergify = github.mergify;\n    if (!mergify) {\n      throw new Error(\"auto merging requires mergify to be enabled\");\n    }\n\n    const blockingLabels = options.blockingLabels ?? [\"do-not-merge\"];\n    const blockingCondition = blockingLabels?.length\n      ? [`-label~=(${blockingLabels.join(\"|\")})`]\n      : [];\n\n    const mergeAction = {\n      delete_head_branch: {},\n\n      queue: {\n        // squash all commits into a single commit when merging\n        // method: \"squash\",\n        method: \"squash\",\n        name: \"default\",\n        // use PR title+body as the commit message\n        commit_message_template: [\n          \"{{ title }} (#{{ number }})\",\n          \"\",\n          \"{{ body }}\",\n        ].join(\"\\n\"),\n      },\n    };\n\n    const approvedReviews = options.approvedReviews ?? 1;\n\n    // add initial conditions (additional conditions can be added later)\n    this.addConditions(`#approved-reviews-by>=${approvedReviews}`);\n    this.addConditions(...blockingCondition);\n\n    mergify.addRule({\n      name: \"Automatic merge on approval and successful build\",\n      actions: mergeAction,\n      conditions: (() => this.renderConditions()) as any,\n    });\n\n    mergify.addQueue({\n      name: \"default\",\n      conditions: (() => this.renderConditions()) as any,\n    });\n\n    this.project.addPackageIgnore(\"/.mergify.yml\");\n  }\n\n  /**\n   * Adds conditions to the auto merge rule.\n   * @param conditions The conditions to add (mergify syntax)\n   */\n  public addConditions(...conditions: string[]) {\n    this.addConditionsLater({ render: () => conditions });\n  }\n\n  /**\n   * Adds conditions that will be rendered only during synthesis.\n   * @param later The later\n   */\n  public addConditionsLater(later: IAddConditionsLater) {\n    this.lazyConditions.push(later);\n  }\n\n  private renderConditions() {\n    const output = new Array<string>();\n\n    for (const later of this.lazyConditions) {\n      output.push(...later.render());\n    }\n\n    return output;\n  }\n}\n\nexport interface IAddConditionsLater {\n  render(): string[];\n}\n"
  },
  {
    "path": "src/github/constants.ts",
    "content": "import { GitIdentity } from \".\";\n\n/**\n * Name of the artifact produced by the build job. Its contains the entire\n * working directory.\n */\nexport const BUILD_ARTIFACT_NAME = \"build-artifact\";\n\n/**\n * Represents the github-actions user.\n *\n * Use this when you need to perform a commit as part of your workflow.\n */\nexport const DEFAULT_GITHUB_ACTIONS_USER: GitIdentity = {\n  name: \"github-actions\",\n  email: \"github-actions@github.com\",\n};\n"
  },
  {
    "path": "src/github/dependabot.ts",
    "content": "import { Component } from \"../component\";\nimport { kebabCaseKeys } from \"../util\";\nimport { YamlFile } from \"../yaml\";\nimport { GitHub } from \"./github\";\n\nexport interface DependabotOptions {\n  /**\n   * How often to check for new versions and raise pull requests.\n   *\n   * @default ScheduleInterval.DAILY\n   */\n  readonly scheduleInterval?: DependabotScheduleInterval;\n\n  /**\n   * The strategy to use when edits manifest and lock files.\n   *\n   * @default VersioningStrategy.LOCKFILE_ONLY The default is to only update the\n   * lock file because package.json is controlled by projen and any outside\n   * updates will fail the build.\n   */\n  readonly versioningStrategy?: VersioningStrategy;\n\n  /**\n   * You can use the `ignore` option to customize which dependencies are updated.\n   * The ignore option supports the following options.\n   * @default []\n   */\n  readonly ignore?: DependabotIgnore[];\n\n  /**\n   * Ignores updates to `projen`.\n   *\n   * This is required since projen updates may cause changes in committed files\n   * and anti-tamper checks will fail.\n   *\n   * Projen upgrades are covered through the `ProjenUpgrade` class.\n   *\n   * @default true\n   */\n  readonly ignoreProjen?: boolean;\n\n  /**\n   * List of labels to apply to the created PR's.\n   */\n  readonly labels?: string[];\n\n  /**\n   * Map of package registries to use\n   * @default - use public registries\n   */\n  readonly registries?: { [name: string]: DependabotRegistry };\n}\n\n/**\n * Use to add private registry support for dependabot\n * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#configuration-options-for-private-registries\n */\nexport interface DependabotRegistry {\n  /**\n   * Registry type e.g. 'npm-registry' or 'docker-registry'\n   */\n  readonly type: DependabotRegistryType;\n\n  /**\n   * Url for the registry e.g. 'https://npm.pkg.github.com' or 'registry.hub.docker.com'\n   */\n  readonly url: string;\n\n  /**\n   * The username that Dependabot uses to access the registry\n   * @default - do not authenticate\n   */\n  readonly username?: string;\n\n  /**\n   * A reference to a Dependabot secret containing the password for the specified user\n   * @default undefined\n   */\n  readonly password?: string;\n\n  /**\n   * A reference to a Dependabot secret containing an access key for this registry\n   * @default undefined\n   */\n  readonly key?: string;\n\n  /**\n   * Secret token for dependabot access e.g. '${{ secrets.DEPENDABOT_PACKAGE_TOKEN }}'\n   * @default undefined\n   */\n  readonly token?: string;\n\n  /**\n   * For registries with type: python-index, if the boolean value is true, pip\n   * esolves dependencies by using the specified URL rather than the base URL of\n   * the Python Package Index (by default https://pypi.org/simple)\n   * @default undefined\n   */\n  readonly replacesBase?: boolean;\n\n  /**\n   * Used with the hex-organization registry type.\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#hex-organization\n   * @default undefined\n   */\n  readonly organization?: string;\n}\n\n/**\n * Each configuration type requires you to provide particular settings.\n * Some types allow more than one way to connect\n * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#configuration-options-for-private-registries\n */\nexport enum DependabotRegistryType {\n  /**\n   * The composer-repository type supports username and password.\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#composer-repository\n   */\n  COMPOSER_REGISTRY = \"composer-registry\",\n\n  /**\n   * The docker-registry type supports username and password.\n   * The docker-registry type can also be used to pull from Amazon ECR using static AWS credentials\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#docker-registry\n   */\n  DOCKER_REGISTRY = \"docker-registry\",\n\n  /**\n   * The git type supports username and password\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#git\n   */\n  GIT = \"git\",\n\n  /**\n   * The hex-organization type supports organization and key\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#hex-organization\n   */\n  HEX_ORGANIZATION = \"hex-organization\",\n\n  /**\n   * The maven-repository type supports username and password, or token\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#maven-repository\n   */\n  MAVEN_REPOSITORY = \"maven-repository\",\n\n  /**\n   * The npm-registry type supports username and password, or token\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#npm-registry\n   */\n  NPM_REGISTRY = \"npm-registry\",\n\n  /**\n   * The nuget-feed type supports username and password, or token\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#nuget-feed\n   */\n  NUGET_FEED = \"nuget-feed\",\n\n  /**\n   * The python-index type supports username and password, or token\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#python-index\n   */\n  PYTHON_INDEX = \"python-index\",\n\n  /**\n   * The rubygems-server type supports username and password, or token\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#rubygems-server\n   */\n  RUBYGEMS_SERVER = \"rubygems-server\",\n\n  /**\n   * The terraform-registry type supports a token\n   * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#terraform-registry\n   */\n  TERRAFORM_REGISTRY = \"terraform-registry\",\n}\n\n/**\n * You can use the `ignore` option to customize which dependencies are updated.\n * The ignore option supports the following options.\n */\nexport interface DependabotIgnore {\n  /**\n   * Use to ignore updates for dependencies with matching names, optionally\n   * using `*` to match zero or more characters.\n   *\n   * For Java dependencies, the format of the dependency-name attribute is:\n   * `groupId:artifactId`, for example: `org.kohsuke:github-api`.\n   */\n  readonly dependencyName: string;\n\n  /**\n   * Use to ignore specific versions or ranges of versions. If you want to\n   * define a range, use the standard pattern for the package manager (for\n   * example: `^1.0.0` for npm, or `~> 2.0` for Bundler).\n   */\n  readonly versions?: string[];\n}\n\n/**\n * How often to check for new versions and raise pull requests for version\n * updates.\n */\nexport enum DependabotScheduleInterval {\n  /**\n   * Runs on every weekday, Monday to Friday.\n   */\n  DAILY = \"daily\",\n\n  /**\n   * Runs once each week. By default, this is on Monday.\n   */\n  WEEKLY = \"weekly\",\n\n  /**\n   * Runs once each month. This is on the first day of the month.\n   */\n  MONTHLY = \"monthly\",\n}\n\n/**\n * The strategy to use when edits manifest and lock files.\n */\nexport enum VersioningStrategy {\n  /**\n   * Only create pull requests to update lockfiles updates. Ignore any new\n   * versions that would require package manifest changes.\n   */\n  LOCKFILE_ONLY = \"lockfile-only\",\n\n  /**\n   * - For apps, the version requirements are increased.\n   * - For libraries, the range of versions is widened.\n   */\n  AUTO = \"auto\",\n\n  /**\n   * Relax the version requirement to include both the new and old version, when\n   * possible.\n   */\n  WIDEN = \"widen\",\n\n  /**\n   * Always increase the version requirement to match the new version.\n   */\n  INCREASE = \"increase\",\n\n  /**\n   * Increase the version requirement only when required by the new version.\n   */\n  INCREASE_IF_NECESSARY = \"increase-if-necessary\",\n}\n\n/**\n * Defines dependabot configuration for node projects.\n *\n * Since module versions are managed in projen, the versioning strategy will be\n * configured to \"lockfile-only\" which means that only updates that can be done\n * on the lockfile itself will be proposed.\n */\nexport class Dependabot extends Component {\n  /**\n   * The raw dependabot configuration.\n   * @see https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates\n   */\n  public readonly config: any;\n\n  /**\n   * Whether or not projen is also upgraded in this config,\n   */\n  public readonly ignoresProjen: boolean;\n\n  private readonly ignore: any[];\n\n  constructor(github: GitHub, options: DependabotOptions = {}) {\n    super(github.project);\n\n    const project = github.project;\n\n    this.ignore = [];\n    this.ignoresProjen = options.ignoreProjen ?? true;\n\n    const registries = options.registries\n      ? kebabCaseKeys(options.registries)\n      : undefined;\n\n    this.config = {\n      version: 2,\n      registries,\n      updates: [\n        {\n          \"package-ecosystem\": \"npm\",\n          \"versioning-strategy\": \"lockfile-only\",\n          directory: \"/\",\n          schedule: {\n            interval:\n              options.scheduleInterval ?? DependabotScheduleInterval.DAILY,\n          },\n          ignore: () => (this.ignore.length > 0 ? this.ignore : undefined),\n          labels: options.labels ? options.labels : undefined,\n          registries: registries ? Object.keys(registries) : undefined,\n        },\n      ],\n    };\n\n    new YamlFile(project, \".github/dependabot.yml\", {\n      obj: this.config,\n      committed: true,\n    });\n\n    for (const i of options.ignore ?? []) {\n      this.addIgnore(i.dependencyName, ...(i.versions ?? []));\n    }\n\n    if (this.ignoresProjen) {\n      this.addIgnore(\"projen\");\n    }\n  }\n\n  /**\n   * Ignores a dependency from automatic updates.\n   *\n   * @param dependencyName Use to ignore updates for dependencies with matching\n   * names, optionally using `*` to match zero or more characters.\n   * @param versions Use to ignore specific versions or ranges of versions. If\n   * you want to define a range, use the standard pattern for the package\n   * manager (for example: `^1.0.0` for npm, or `~> 2.0` for Bundler).\n   */\n  public addIgnore(dependencyName: string, ...versions: string[]) {\n    this.ignore.push({\n      \"dependency-name\": dependencyName,\n      versions: () => (versions.length > 0 ? versions : undefined),\n    });\n  }\n}\n"
  },
  {
    "path": "src/github/github-credentials.ts",
    "content": "import { JobStep } from \"./workflows-model\";\n\n/**\n * Options for `GithubCredentials.fromPersonalAccessToken`\n */\nexport interface GithubCredentialsPersonalAccessTokenOptions {\n  readonly secret?: string;\n}\n\n/**\n * Options for `GithubCredentials.fromApp`\n */\nexport interface GithubCredentialsAppOptions {\n  readonly appIdSecret?: string;\n  readonly privateKeySecret?: string;\n}\n\n/**\n * Represents a method of providing GitHub API access for projen workflows.\n */\nexport class GithubCredentials {\n  /**\n   * Provide API access through a GitHub personal access token.\n   *\n   * The token must be added as a secret to the GitHub repo, and the name of the\n   * secret can be specified here.\n   *\n   * @see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token\n   * @default - a secret named \"PROJEN_GITHUB_TOKEN\"\n   */\n  public static fromPersonalAccessToken(\n    options: GithubCredentialsPersonalAccessTokenOptions = {}\n  ) {\n    return new GithubCredentials({\n      setupSteps: [],\n      tokenRef: `\\${{ secrets.${options.secret ?? \"PROJEN_GITHUB_TOKEN\"} }}`,\n    });\n  }\n\n  /**\n   * Provide API access through a GitHub App.\n   *\n   * The GitHub App must be installed on the GitHub repo, its App ID and a\n   * private key must be added as secrets to the repo. The name of the secrets\n   * can be specified here.\n   *\n   * @see https://docs.github.com/en/developers/apps/building-github-apps/creating-a-github-app\n   * @default - app id stored in \"PROJEN_GITHUB_TOKEN\" and private key stored in \"PROJEN_APP_PRIVATE_KEY\"\n   */\n  public static fromApp(options: GithubCredentialsAppOptions = {}) {\n    const appIdSecret = options.appIdSecret ?? \"PROJEN_APP_ID\";\n    const privateKeySecret =\n      options.privateKeySecret ?? \"PROJEN_APP_PRIVATE_KEY\";\n\n    return new GithubCredentials({\n      setupSteps: [\n        {\n          name: \"Generate token\",\n          id: \"generate_token\",\n          uses: \"tibdex/github-app-token@7ce9ffdcdeb2ba82b01b51d6584a6a85872336d4\",\n          with: {\n            app_id: `\\${{ secrets.${appIdSecret} }}`,\n            private_key: `\\${{ secrets.${privateKeySecret} }}`,\n          },\n        },\n      ],\n      tokenRef: \"${{ steps.generate_token.outputs.token }}\",\n    });\n  }\n\n  private constructor(private readonly options: GithubCredentialsOptions) {}\n\n  /**\n   * Setup steps to obtain GitHub credentials.\n   */\n  public get setupSteps(): JobStep[] {\n    return [...this.options.setupSteps];\n  }\n\n  /**\n   * The value to use in a workflow when a GitHub token is expected. This\n   * typically looks like \"${{ some.path.to.a.value }}\".\n   */\n  public get tokenRef(): string {\n    return this.options.tokenRef;\n  }\n}\n\ninterface GithubCredentialsOptions {\n  readonly setupSteps: JobStep[];\n  readonly tokenRef: string;\n}\n"
  },
  {
    "path": "src/github/github-project.ts",
    "content": "import { Clobber } from \"../clobber\";\nimport { Gitpod } from \"../gitpod\";\nimport { Project, ProjectOptions, ProjectType } from \"../project\";\nimport { SampleReadme, SampleReadmeProps } from \"../readme\";\nimport { DevContainer, VsCode } from \"../vscode\";\nimport { AutoApprove, AutoApproveOptions } from \"./auto-approve\";\nimport { AutoMergeOptions } from \"./auto-merge\";\nimport { GitHub, GitHubOptions } from \"./github\";\nimport { GithubCredentials } from \"./github-credentials\";\nimport { MergifyOptions } from \"./mergify\";\nimport { Stale, StaleOptions } from \"./stale\";\n\n/**\n * Options for `GitHubProject`.\n */\nexport interface GitHubProjectOptions extends ProjectOptions {\n  /**\n   * Add a Gitpod development environment\n   *\n   * @default false\n   */\n  readonly gitpod?: boolean;\n\n  /**\n   * Enable VSCode integration.\n   *\n   * Enabled by default for root projects. Disabled for non-root projects.\n   *\n   * @default true\n   */\n  readonly vscode?: boolean;\n\n  /**\n   * Enable GitHub integration.\n   *\n   * Enabled by default for root projects. Disabled for non-root projects.\n   *\n   * @default true\n   */\n  readonly github?: boolean;\n\n  /**\n   * Options for GitHub integration\n   *\n   * @default - see GitHubOptions\n   */\n  readonly githubOptions?: GitHubOptions;\n\n  /**\n   * Whether mergify should be enabled on this repository or not.\n   *\n   * @default true\n   * @deprecated use `githubOptions.mergify` instead\n   */\n  readonly mergify?: boolean;\n\n  /**\n   * Options for mergify\n   *\n   * @default - default options\n   * @deprecated use `githubOptions.mergifyOptions` instead\n   */\n  readonly mergifyOptions?: MergifyOptions;\n\n  /**\n   * Add a VSCode development environment (used for GitHub Codespaces)\n   *\n   * @default false\n   */\n  readonly devContainer?: boolean;\n\n  /**\n   * Add a `clobber` task which resets the repo to origin.\n   * @default true\n   */\n  readonly clobber?: boolean;\n\n  /**\n   * The README setup.\n   *\n   * @default - { filename: 'README.md', contents: '# replace this' }\n   * @example \"{ filename: 'readme.md', contents: '# title' }\"\n   */\n  readonly readme?: SampleReadmeProps;\n\n  /**\n   * Which type of project this is (library/app).\n   * @default ProjectType.UNKNOWN\n   * @deprecated no longer supported at the base project level\n   */\n  readonly projectType?: ProjectType;\n\n  /**\n   * Enable and configure the 'auto approve' workflow.\n   * @default - auto approve is disabled\n   */\n  readonly autoApproveOptions?: AutoApproveOptions;\n\n  /**\n   * Enable automatic merging on GitHub. Has no effect if `github.mergify`\n   * is set to false.\n   * @default true\n   */\n  readonly autoMerge?: boolean;\n\n  /**\n   * Configure options for automatic merging on GitHub. Has no effect if\n   * `github.mergify` or `autoMerge` is set to false.\n   *\n   * @default - see defaults in `AutoMergeOptions`\n   */\n  readonly autoMergeOptions?: AutoMergeOptions;\n\n  /**\n   * Auto-close stale issues and pull requests. To disable set `stale` to `false`.\n   *\n   * @default - see defaults in `StaleOptions`\n   */\n  readonly staleOptions?: StaleOptions;\n\n  /**\n   * Auto-close of stale issues and pull request. See `staleOptions` for options.\n   *\n   * @default false\n   */\n  readonly stale?: boolean;\n\n  /**\n   * Choose a method of providing GitHub API access for projen workflows.\n   *\n   * @default - use a personal access token named PROJEN_GITHUB_TOKEN\n   */\n  readonly projenCredentials?: GithubCredentials;\n\n  /**\n   * The name of a secret which includes a GitHub Personal Access Token to be\n   * used by projen workflows. This token needs to have the `repo`, `workflows`\n   * and `packages` scope.\n   *\n   * @default \"PROJEN_GITHUB_TOKEN\"\n   * @deprecated use `projenCredentials`\n   */\n  readonly projenTokenSecret?: string;\n}\n\n/**\n * GitHub-based project.\n *\n * @deprecated This is a *temporary* class. At the moment, our base project\n * types such as `NodeProject` and `JavaProject` are derived from this, but we\n * want to be able to use these project types outside of GitHub as well. One of\n * the next steps to address this is to abstract workflows so that different\n * \"engines\" can be used to implement our CI/CD solutions.\n */\nexport class GitHubProject extends Project {\n  /**\n   * Access all github components.\n   *\n   * This will be `undefined` for subprojects.\n   */\n  public readonly github: GitHub | undefined;\n\n  /**\n   * Access all VSCode components.\n   *\n   * This will be `undefined` for subprojects.\n   */\n  public readonly vscode: VsCode | undefined;\n\n  /**\n   * Access for Gitpod\n   *\n   * This will be `undefined` if gitpod boolean is false\n   */\n  public readonly gitpod: Gitpod | undefined;\n\n  /**\n   * Access for .devcontainer.json (used for GitHub Codespaces)\n   *\n   * This will be `undefined` if devContainer boolean is false\n   */\n  public readonly devContainer: DevContainer | undefined;\n\n  /*\n   * Which project type this is.\n   *\n   * @deprecated\n   */\n  public readonly projectType: ProjectType;\n\n  /**\n   * Auto approve set up for this project.\n   */\n  public readonly autoApprove?: AutoApprove;\n\n  constructor(options: GitHubProjectOptions) {\n    super(options);\n\n    this.projectType = options.projectType ?? ProjectType.UNKNOWN;\n    // we only allow these global services to be used in root projects\n    const github = options.github ?? (this.parent ? false : true);\n    this.github = github\n      ? new GitHub(this, {\n          projenTokenSecret: options.projenTokenSecret,\n          projenCredentials: options.projenCredentials,\n          mergify: options.mergify,\n          mergifyOptions: options.mergifyOptions,\n          ...options.githubOptions,\n        })\n      : undefined;\n\n    const vscode = options.vscode ?? (this.parent ? false : true);\n    this.vscode = vscode ? new VsCode(this) : undefined;\n\n    this.gitpod = options.gitpod ? new Gitpod(this) : undefined;\n    this.devContainer = options.devContainer\n      ? new DevContainer(this)\n      : undefined;\n\n    if (options.clobber ?? true) {\n      new Clobber(this);\n    }\n\n    new SampleReadme(this, options.readme);\n\n    if (options.autoApproveOptions && this.github) {\n      this.autoApprove = new AutoApprove(\n        this.github,\n        options.autoApproveOptions\n      );\n    }\n\n    const stale = options.stale ?? false;\n    if (stale && this.github) {\n      new Stale(this.github, options.staleOptions);\n    }\n  }\n\n  /**\n   * Marks the provided file(s) as being generated. This is achieved using the\n   * github-linguist attributes. Generated files do not count against the\n   * repository statistics and language breakdown.\n   *\n   * @param glob the glob pattern to match (could be a file path).\n   *\n   * @see https://github.com/github/linguist/blob/master/docs/overrides.md\n   */\n  public annotateGenerated(glob: string): void {\n    this.gitattributes.addAttributes(glob, \"linguist-generated\");\n  }\n}\n"
  },
  {
    "path": "src/github/github.ts",
    "content": "import { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { Dependabot, DependabotOptions } from \"./dependabot\";\nimport { GithubCredentials } from \"./github-credentials\";\nimport { Mergify, MergifyOptions } from \"./mergify\";\nimport { PullRequestTemplate } from \"./pr-template\";\nimport { PullRequestLint, PullRequestLintOptions } from \"./pull-request-lint\";\nimport { GithubWorkflow } from \"./workflows\";\n\nexport interface GitHubOptions {\n  /**\n   * Whether mergify should be enabled on this repository or not.\n   *\n   * @default true\n   */\n  readonly mergify?: boolean;\n\n  /**\n   * Options for Mergify.\n   *\n   * @default - default options\n   */\n  readonly mergifyOptions?: MergifyOptions;\n\n  /**\n   * Enables GitHub workflows. If this is set to `false`, workflows will not be created.\n   *\n   * @default true\n   */\n  readonly workflows?: boolean;\n\n  /**\n   * Add a workflow that performs basic checks for pull requests, like\n   * validating that PRs follow Conventional Commits.\n   *\n   * @default true\n   */\n  readonly pullRequestLint?: boolean;\n\n  /**\n   * Options for configuring a pull request linter.\n   *\n   * @default - see defaults in `PullRequestLintOptions`\n   */\n  readonly pullRequestLintOptions?: PullRequestLintOptions;\n\n  /**\n   * Choose a method of providing GitHub API access for projen workflows.\n   *\n   * @default - use a personal access token named PROJEN_GITHUB_TOKEN\n   */\n  readonly projenCredentials?: GithubCredentials;\n\n  /**\n   * The name of a secret which includes a GitHub Personal Access Token to be\n   * used by projen workflows. This token needs to have the `repo`, `workflows`\n   * and `packages` scope.\n   *\n   * @default \"PROJEN_GITHUB_TOKEN\"\n   * @deprecated - use `projenCredentials`\n   */\n  readonly projenTokenSecret?: string;\n}\n\nexport class GitHub extends Component {\n  /**\n   * Returns the `GitHub` component of a project or `undefined` if the project\n   * does not have a GitHub component.\n   */\n  public static of(project: Project): GitHub | undefined {\n    const isGitHub = (c: Component): c is GitHub => c instanceof GitHub;\n    return project.components.find(isGitHub);\n  }\n\n  /**\n   * The `Mergify` configured on this repository. This is `undefined` if Mergify\n   * was not enabled when creating the repository.\n   */\n  public readonly mergify?: Mergify;\n\n  /**\n   * Are workflows enabled?\n   */\n  public readonly workflowsEnabled: boolean;\n\n  /**\n   * GitHub API authentication method used by projen workflows.\n   */\n  public readonly projenCredentials: GithubCredentials;\n\n  public constructor(project: Project, options: GitHubOptions = {}) {\n    super(project);\n\n    this.workflowsEnabled = options.workflows ?? true;\n\n    if (options.projenCredentials && options.projenTokenSecret) {\n      throw new Error(\n        \"projenTokenSecret is deprecated, please use projenCredentials instead\"\n      );\n    }\n\n    if (options.projenTokenSecret) {\n      this.projenCredentials = GithubCredentials.fromPersonalAccessToken({\n        secret: options.projenTokenSecret,\n      });\n    } else if (options.projenCredentials) {\n      this.projenCredentials = options.projenCredentials;\n    } else {\n      this.projenCredentials = GithubCredentials.fromPersonalAccessToken({\n        secret: \"PROJEN_GITHUB_TOKEN\",\n      });\n    }\n\n    if (options.mergify ?? true) {\n      this.mergify = new Mergify(this, options.mergifyOptions);\n    }\n\n    if (options.pullRequestLint ?? true) {\n      new PullRequestLint(this, options.pullRequestLintOptions);\n    }\n  }\n\n  /**\n   * All workflows.\n   */\n  public get workflows(): GithubWorkflow[] {\n    const isWorkflow = (c: Component): c is GithubWorkflow =>\n      c instanceof GithubWorkflow;\n    return this.project.components\n      .filter(isWorkflow)\n      .sort((w1, w2) => w1.name.localeCompare(w2.name));\n  }\n\n  /**\n   * Adds a workflow to the project.\n   * @param name Name of the workflow\n   * @returns a GithubWorkflow instance\n   */\n  public addWorkflow(name: string) {\n    const workflow = new GithubWorkflow(this, name);\n    return workflow;\n  }\n\n  public addPullRequestTemplate(...content: string[]) {\n    return new PullRequestTemplate(this, { lines: content });\n  }\n\n  public addDependabot(options?: DependabotOptions) {\n    return new Dependabot(this, options);\n  }\n\n  /**\n   * Finds a GitHub workflow by name. Returns `undefined` if the workflow cannot be found.\n   * @param name The name of the GitHub workflow\n   */\n  public tryFindWorkflow(name: string): undefined | GithubWorkflow {\n    return this.workflows.find((w) => w.name === name);\n  }\n}\n"
  },
  {
    "path": "src/github/index.ts",
    "content": "export * from \"./github\";\n\nexport * from \"./dependabot\";\nexport * from \"./workflows\";\nexport * from \"./mergify\";\nexport * from \"./pr-template\";\nexport * from \"./mergify\";\nexport * from \"./auto-merge\";\nexport * from \"./auto-approve\";\nexport * from \"./stale\";\nexport * from \"./pull-request-lint\";\nexport * from \"./github-credentials\";\n\nexport * from \"./task-workflow\";\n\nexport * from \"./github-project\";\n\nexport * as workflows from \"./workflows-model\";\n"
  },
  {
    "path": "src/github/mergify.ts",
    "content": "import { Component } from \"../component\";\nimport { YamlFile } from \"../yaml\";\nimport { GitHub } from \"./github\";\n\n/**\n * The Mergify conditional operators that can be used are: `or` and `and`.\n * Note: The number of nested conditions is limited to 3.\n * @see https://docs.mergify.io/conditions/#combining-conditions-with-operators\n */\nexport interface MergifyConditionalOperator {\n  readonly or?: MergifyCondition[];\n  readonly and?: MergifyCondition[];\n}\n\nexport type MergifyCondition = string | MergifyConditionalOperator;\n\nexport interface MergifyRule {\n  /**\n   * The name of the rule. This is not used by the engine directly,\n   * but is used when reporting information about a rule.\n   */\n  readonly name: string;\n  /**\n   * A list of Conditions string that must match against the\n   * pull request for the rule to be applied.\n   * @see https://docs.mergify.io/conditions/#conditions\n   */\n  readonly conditions: MergifyCondition[];\n  /**\n   * A dictionary made of Actions that will be executed on the\n   * matching pull requests.\n   * @see https://docs.mergify.io/actions/#actions\n   */\n  readonly actions: { [action: string]: any };\n}\n\nexport interface MergifyQueue {\n  /**\n   * The name of the queue.\n   */\n  readonly name: string;\n  /**\n   * A list of Conditions string that must match against the\n   * pull request for the pull request to be added to the queue.\n   * @see https://docs.mergify.com/conditions/#conditions\n   */\n  readonly conditions: MergifyCondition[];\n}\n\nexport interface MergifyOptions {\n  readonly rules?: MergifyRule[];\n  readonly queues?: MergifyQueue[];\n}\n\nexport class Mergify extends Component {\n  private readonly rules = new Array<MergifyRule>();\n  private readonly queues = new Array<MergifyQueue>();\n  // The actual YAML file will only be created if at least 1 rule is added.\n  private yamlFile?: YamlFile;\n\n  constructor(github: GitHub, options: MergifyOptions = {}) {\n    super(github.project);\n\n    for (const rule of options.rules ?? []) {\n      this.addRule(rule);\n    }\n\n    for (const queue of options.queues ?? []) {\n      this.addQueue(queue);\n    }\n  }\n\n  private createYamlFile() {\n    if (this.yamlFile == null) {\n      this.yamlFile = new YamlFile(this.project, \".mergify.yml\", {\n        obj: {\n          queue_rules: this.queues,\n          pull_request_rules: this.rules,\n        },\n        // Mergify needs to read the file from the repository in order to work.\n        committed: true,\n      });\n    }\n  }\n\n  public addRule(rule: MergifyRule) {\n    this.rules.push(rule);\n    this.createYamlFile();\n  }\n\n  public addQueue(queue: MergifyQueue) {\n    this.queues.push(queue);\n    this.createYamlFile();\n  }\n}\n"
  },
  {
    "path": "src/github/pr-template.ts",
    "content": "import { TextFile } from \"../textfile\";\nimport { GitHub } from \"./github\";\n\n/**\n * Options for `PullRequestTemplate`.\n */\nexport interface PullRequestTemplateOptions {\n  /**\n   * The contents of the template. You can use `addLine()` to add additional lines.\n   *\n   * @default - a standard default template will be created.\n   */\n  readonly lines?: string[];\n}\n\n/**\n * Template for GitHub pull requests.\n */\nexport class PullRequestTemplate extends TextFile {\n  constructor(github: GitHub, options: PullRequestTemplateOptions = {}) {\n    super(github.project, \".github/pull_request_template.md\", {\n      lines:\n        options.lines && options.lines?.length > 0\n          ? options.lines\n          : [\"Fixes #\"],\n      marker: false,\n      // GitHub needs to read the file from the repository in order to work.\n      committed: true,\n    });\n  }\n}\n"
  },
  {
    "path": "src/github/pull-request-lint.ts",
    "content": "import { GitHub } from \".\";\nimport { Component } from \"../component\";\nimport { Job, JobPermission } from \"./workflows-model\";\n\n/**\n * Options for PullRequestLint\n */\nexport interface PullRequestLintOptions {\n  /**\n   * Validate that pull request titles follow Conventional Commits.\n   *\n   * @default true\n   * @see https://www.conventionalcommits.org/\n   */\n  readonly semanticTitle?: boolean;\n\n  /**\n   * Options for validating the conventional commit title linter.\n   * @default - title must start with \"feat\", \"fix\", or \"chore\"\n   */\n  readonly semanticTitleOptions?: SemanticTitleOptions;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n}\n\n/**\n * Options for linting that PR titles follow Conventional Commits.\n * @see https://www.conventionalcommits.org/\n */\nexport interface SemanticTitleOptions {\n  /**\n   * Configure a list of commit types that are allowed.\n   * @default [\"feat\", \"fix\", \"chore\"]\n   */\n  readonly types?: string[];\n\n  /**\n   * Configure that a scope must always be provided.\n   * e.g. feat(ui), fix(core)\n   * @default false\n   */\n  readonly requireScope?: boolean;\n}\n\n/**\n * Configure validations to run on GitHub pull requests.\n * Only generates a file if at least one linter is configured.\n */\nexport class PullRequestLint extends Component {\n  constructor(github: GitHub, options: PullRequestLintOptions = {}) {\n    super(github.project);\n\n    // should only create a workflow if one or more linters are enabled\n    if (options.semanticTitle ?? true) {\n      const opts = options.semanticTitleOptions ?? {};\n      const types = opts.types ?? [\"feat\", \"fix\", \"chore\"];\n\n      const validateJob: Job = {\n        name: \"Validate PR title\",\n        runsOn: options.runsOn ?? [\"ubuntu-latest\"],\n        permissions: {\n          pullRequests: JobPermission.WRITE,\n        },\n        steps: [\n          {\n            uses: \"amannn/action-semantic-pull-request@v4.5.0\",\n            env: {\n              GITHUB_TOKEN: \"${{ secrets.GITHUB_TOKEN }}\",\n            },\n            with: {\n              types: types.join(\"\\n\"),\n              requireScope: opts.requireScope ?? false,\n            },\n          },\n        ],\n      };\n\n      const workflow = github.addWorkflow(\"pull-request-lint\");\n      workflow.on({\n        pullRequestTarget: {\n          types: [\n            \"labeled\",\n            \"opened\",\n            \"synchronize\",\n            \"reopened\",\n            \"ready_for_review\",\n            \"edited\",\n          ],\n        },\n      });\n      workflow.addJobs({ validate: validateJob });\n    }\n  }\n}\n"
  },
  {
    "path": "src/github/stale-util.ts",
    "content": "import { StaleBehavior } from \"./stale\";\n\ninterface Options {\n  readonly stale: number;\n  readonly close: number;\n  readonly type: string;\n}\n\nexport function renderBehavior(\n  behavior: StaleBehavior | undefined,\n  opts: Options\n): Partial<StaleBehavior> {\n  const enabled = behavior?.enabled ?? true;\n  if (!enabled) {\n    return { daysBeforeStale: -1, daysBeforeClose: -1 };\n  }\n\n  const exemptLabels = behavior?.exemptLabels ?? [\"backlog\"];\n  const messageSuffix =\n    exemptLabels.length > 0\n      ? ` If you wish to exclude this issue from being marked as stale, add the \"${exemptLabels[0]}\" label.`\n      : \"\";\n\n  return {\n    daysBeforeStale: behavior?.daysBeforeStale ?? opts.stale,\n    daysBeforeClose: behavior?.daysBeforeClose ?? opts.close,\n    staleMessage:\n      behavior?.staleMessage ??\n      `This ${opts.type} is now marked as stale because it hasn\\'t seen activity for a while. Add a comment or it will be closed soon.${messageSuffix}`,\n    closeMessage:\n      behavior?.closeMessage ??\n      `Closing this ${opts.type} as it hasn\\'t seen activity for a while. Please add a comment @mentioning a maintainer to reopen.${messageSuffix}`,\n    staleLabel: behavior?.staleLabel ?? \"stale\",\n    exemptLabels: exemptLabels,\n  };\n}\n"
  },
  {
    "path": "src/github/stale.ts",
    "content": "import { Component } from \"../component\";\nimport { GitHub } from \"./github\";\nimport { renderBehavior } from \"./stale-util\";\nimport { JobPermission } from \"./workflows-model\";\n\n/**\n * Options for `Stale`.\n */\nexport interface StaleOptions {\n  /**\n   * How to handle stale pull requests.\n   *\n   * @default - By default, pull requests with no activity will be marked as\n   * stale after 14 days and closed within 2 days with relevant comments.\n   */\n  readonly pullRequest?: StaleBehavior;\n\n  /**\n   * How to handle stale issues.\n   *\n   * @default - By default, stale issues with no activity will be marked as\n   * stale after 60 days and closed within 7 days.\n   */\n  readonly issues?: StaleBehavior;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n}\n\n/**\n * Stale behavior.\n */\nexport interface StaleBehavior {\n  /**\n   * Determines if this behavior is enabled.\n   *\n   * Same as setting `daysBeforeStale` and `daysBeforeClose` to `-1`.\n   *\n   * @default true\n   */\n  readonly enabled?: boolean;\n\n  /**\n   * How many days until the issue or pull request is marked as \"Stale\". Set to -1 to disable.\n   * @default -\n   */\n  readonly daysBeforeStale?: number;\n\n  /**\n   * Days until the issue/PR is closed after it is marked as \"Stale\". Set to -1 to disable.\n   * @default -\n   */\n  readonly daysBeforeClose?: number;\n\n  /**\n   * The comment to add to the issue/PR when it becomes stale.\n   * @default \"This pull request is now marked as stale because hasn\\'t seen activity for a while. Add a comment or it will be closed soon.\"\n   */\n  readonly staleMessage?: string;\n\n  /**\n   * The comment to add to the issue/PR when it's closed\n   *\n   * @default \"Closing this pull request as it hasn\\'t seen activity for a while. Please add a comment @mentioning a maintainer when you are ready to continue.\"\n   */\n  readonly closeMessage?: string;\n\n  /**\n   * The label to apply to the issue/PR when it becomes stale.\n   * @default \"stale\"\n   */\n  readonly staleLabel?: string;\n\n  /**\n   * Label which exempt an issue/PR from becoming stale. Set to `[]` to disable.\n   *\n   * @default - [\"backlog\"]\n   */\n  readonly exemptLabels?: string[];\n}\n\n/**\n * Warns and then closes issues and PRs that have had no activity for a specified amount of time.\n *\n * The default configuration will:\n *\n *  * Add a \"Stale\" label to pull requests after 14 days and closed after 2 days\n *  * Add a \"Stale\" label to issues after 60 days and closed after 7 days\n *  * If a comment is added, the label will be removed and timer is restarted.\n *\n * @see https://github.com/actions/stale\n */\nexport class Stale extends Component {\n  constructor(github: GitHub, options: StaleOptions = {}) {\n    super(github.project);\n\n    const stale = github.addWorkflow(\"stale\");\n    stale.on({\n      schedule: [{ cron: \"0 1 * * *\" }], // at 1am every day\n      workflowDispatch: {},\n    });\n\n    const pullRequests = renderBehavior(options.pullRequest, {\n      stale: 14,\n      close: 2,\n      type: \"pull request\",\n    });\n    const issues = renderBehavior(options.issues, {\n      stale: 60,\n      close: 7,\n      type: \"issue\",\n    });\n\n    const renderExemptLabels = (exemptLabels?: string[]) => {\n      if (!exemptLabels || exemptLabels.length === 0) {\n        return undefined;\n      }\n      return exemptLabels.join(\",\");\n    };\n\n    stale.addJobs({\n      stale: {\n        runsOn: options.runsOn ?? [\"ubuntu-latest\"],\n        permissions: {\n          issues: JobPermission.WRITE,\n          pullRequests: JobPermission.WRITE,\n        },\n        steps: [\n          {\n            uses: \"actions/stale@v4\",\n            with: {\n              // disable global\n              \"days-before-stale\": -1,\n              \"days-before-close\": -1,\n\n              // pull requests\n              \"days-before-pr-stale\": pullRequests.daysBeforeStale,\n              \"days-before-pr-close\": pullRequests.daysBeforeClose,\n              \"stale-pr-message\": pullRequests.staleMessage,\n              \"close-pr-message\": pullRequests.closeMessage,\n              \"stale-pr-label\": pullRequests.staleLabel,\n              \"exempt-pr-labels\": renderExemptLabels(pullRequests.exemptLabels),\n\n              // issues\n              \"days-before-issue-stale\": issues.daysBeforeStale,\n              \"days-before-issue-close\": issues.daysBeforeClose,\n              \"stale-issue-message\": issues.staleMessage,\n              \"close-issue-message\": issues.closeMessage,\n              \"stale-issue-label\": issues.staleLabel,\n              \"exempt-issue-labels\": renderExemptLabels(issues.exemptLabels),\n            },\n          },\n        ],\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/github/task-workflow.ts",
    "content": "import { Task } from \"../task\";\nimport { DEFAULT_GITHUB_ACTIONS_USER } from \"./constants\";\nimport { GitHub } from \"./github\";\nimport { WorkflowActions } from \"./workflow-actions\";\nimport { GithubWorkflow } from \"./workflows\";\nimport {\n  ContainerOptions,\n  Job,\n  JobPermissions,\n  JobStep,\n  JobStepOutput,\n  Triggers,\n} from \"./workflows-model\";\n\nconst DEFAULT_JOB_ID = \"build\";\n\nexport interface TaskWorkflowOptions {\n  /**\n   * The workflow name.\n   */\n  readonly name: string;\n\n  /**\n   * The primary job id.\n   * @default \"build\"\n   */\n  readonly jobId?: string;\n\n  /**\n   * @default - default image\n   */\n  readonly container?: ContainerOptions;\n\n  /**\n   * Adds an 'if' condition to the workflow.\n   */\n  readonly condition?: string;\n\n  /**\n   * A directory name which contains artifacts to be uploaded (e.g. `dist`).\n   * If this is set, the contents of this directory will be uploaded as an\n   * artifact at the end of the workflow run, even if other steps fail.\n   *\n   * @default - not set\n   */\n  readonly artifactsDirectory?: string;\n\n  /**\n   * The triggers for the workflow.\n   *\n   * @default - by default workflows can only be triggered by manually.\n   */\n  readonly triggers?: Triggers;\n\n  /**\n   * Initial steps to run before the source code checkout.\n   *\n   * @default - not set\n   */\n  readonly preCheckoutSteps?: JobStep[];\n\n  /**\n   * Override for the `with` property of the source code checkout step.\n   *\n   * @default - not set\n   */\n  readonly checkoutWith?: Record<string, any>;\n\n  /**\n   * Steps to run before the main build step.\n   *\n   * @default - not set\n   */\n  readonly preBuildSteps?: JobStep[];\n\n  /**\n   * The main task to be executed.\n   */\n  readonly task: Task;\n\n  /**\n   * Actions to run after the main build step.\n   *\n   * @default - not set\n   */\n  readonly postBuildSteps?: JobStep[];\n\n  /**\n   * Workflow environment variables.\n   * @default {}\n   */\n  readonly env?: Record<string, string>;\n\n  /**\n   * Permissions for the build job.\n   */\n  readonly permissions: JobPermissions;\n\n  /**\n   * Mapping of job output names to values/expressions.\n   *\n   * @default {}\n   */\n  readonly outputs?: { [name: string]: JobStepOutput };\n\n  /**\n   * The git identity to use in this workflow.\n   */\n  readonly gitIdentity?: GitIdentity;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n}\n\n/**\n * A GitHub workflow for common build tasks within a project.\n */\nexport class TaskWorkflow extends GithubWorkflow {\n  private readonly github: GitHub;\n  public readonly jobId: string;\n  public readonly artifactsDirectory?: string;\n\n  constructor(github: GitHub, options: TaskWorkflowOptions) {\n    super(github, options.name);\n    this.jobId = options.jobId ?? DEFAULT_JOB_ID;\n    this.github = github;\n    this.artifactsDirectory = options.artifactsDirectory;\n\n    if (options.triggers) {\n      if (options.triggers.issueComment) {\n        // https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#potential-impact-of-a-compromised-runner\n        throw new Error(\n          'Trigger \"issueComment\" should not be used due to a security concern'\n        );\n      }\n\n      this.on(options.triggers);\n    }\n\n    this.on({\n      workflowDispatch: {}, // allow manual triggering\n    });\n\n    const preCheckoutSteps = options.preCheckoutSteps ?? [];\n    const checkoutWith = options.checkoutWith\n      ? { with: options.checkoutWith }\n      : {};\n    const preBuildSteps = options.preBuildSteps ?? [];\n    const postBuildSteps = options.postBuildSteps ?? [];\n    const gitIdentity = options.gitIdentity ?? DEFAULT_GITHUB_ACTIONS_USER;\n\n    if (this.artifactsDirectory) {\n      postBuildSteps.push({\n        name: \"Upload artifact\",\n        uses: \"actions/upload-artifact@v2.1.1\",\n        // Setting to always will ensure that this step will run even if\n        // the previous ones have failed (e.g. coverage report, internal logs, etc)\n        if: \"always()\",\n        with: {\n          name: this.artifactsDirectory,\n          path: this.artifactsDirectory,\n        },\n      });\n    }\n\n    const job: Job = {\n      runsOn: options.runsOn ?? [\"ubuntu-latest\"],\n      container: options.container,\n      env: options.env,\n      permissions: options.permissions,\n      if: options.condition,\n      outputs: options.outputs,\n      steps: [\n        ...preCheckoutSteps,\n\n        // check out sources.\n        {\n          name: \"Checkout\",\n          uses: \"actions/checkout@v3\",\n          ...checkoutWith,\n        },\n\n        // sets git identity so we can push later\n        ...WorkflowActions.setGitIdentity(gitIdentity),\n\n        ...preBuildSteps,\n\n        // run the main build task\n        {\n          name: options.task.name,\n          run: this.github.project.runTaskCommand(options.task),\n        },\n\n        ...postBuildSteps,\n      ],\n    };\n\n    this.addJobs({ [this.jobId]: job });\n  }\n}\n\n/**\n * Represents the git identity.\n */\nexport interface GitIdentity {\n  /**\n   * The name of the user.\n   */\n  readonly name: string;\n\n  /**\n   * The email address of the git user.\n   */\n  readonly email: string;\n}\n"
  },
  {
    "path": "src/github/util.ts",
    "content": "export function secretToString(secretName: string): string {\n  return `\\${{ secrets.${secretName} }}`;\n}\n"
  },
  {
    "path": "src/github/workflow-actions.ts",
    "content": "import { GitIdentity } from \".\";\nimport { JobStep } from \"./workflows-model\";\n\nconst GIT_PATCH_FILE = \".repo.patch\";\nconst RUNNER_TEMP = \"${{ runner.temp }}\";\n\n/**\n * A set of utility functions for creating GitHub actions in workflows.\n */\nexport class WorkflowActions {\n  /**\n   * Creates a .patch file from the current git diff and uploads it as an\n   * artifact. Use `checkoutWithPatch` to download and apply in another job.\n   *\n   * If a patch was uploaded,\n   *\n   * @param options Options\n   * @returns Job steps\n   */\n  public static createUploadGitPatch(\n    options: CreateUploadGitPatchOptions\n  ): JobStep[] {\n    const MUTATIONS_FOUND = `steps.${options.stepId}.outputs.${options.outputName}`;\n\n    const steps: JobStep[] = [\n      {\n        id: options.stepId,\n        name: \"Find mutations\",\n        run: [\n          \"git add .\",\n          `git diff --staged --patch --exit-code > ${GIT_PATCH_FILE} || echo \"::set-output name=${options.outputName}::true\"`,\n        ].join(\"\\n\"),\n      },\n      {\n        if: MUTATIONS_FOUND,\n        name: \"Upload patch\",\n        uses: \"actions/upload-artifact@v2\",\n        with: { name: GIT_PATCH_FILE, path: GIT_PATCH_FILE },\n      },\n    ];\n\n    if (options.mutationError) {\n      steps.push({\n        name: \"Fail build on mutation\",\n        if: MUTATIONS_FOUND,\n        run: [\n          `echo \"::error::${options.mutationError}\"`,\n          `cat ${GIT_PATCH_FILE}`,\n          \"exit 1\",\n        ].join(\"\\n\"),\n      });\n    }\n\n    return steps;\n  }\n\n  /**\n   * Checks out a repository and applies a git patch that was created using\n   * `createUploadGitPatch`.\n   *\n   * @param options Options\n   * @returns Job steps\n   */\n  public static checkoutWithPatch(\n    options: CheckoutWithPatchOptions = {}\n  ): JobStep[] {\n    return [\n      {\n        name: \"Checkout\",\n        uses: \"actions/checkout@v3\",\n        with: {\n          token: options.token,\n          ref: options.ref,\n          repository: options.repository,\n        },\n      },\n      {\n        name: \"Download patch\",\n        uses: \"actions/download-artifact@v3\",\n        with: { name: GIT_PATCH_FILE, path: RUNNER_TEMP },\n      },\n      {\n        name: \"Apply patch\",\n        run: `[ -s ${RUNNER_TEMP}/${GIT_PATCH_FILE} ] && git apply ${RUNNER_TEMP}/${GIT_PATCH_FILE} || echo \"Empty patch. Skipping.\"`,\n      },\n    ];\n  }\n\n  /**\n   * Configures the git identity (user name and email).\n   * @param id The identity to use\n   * @returns Job steps\n   */\n  public static setGitIdentity(id: GitIdentity): JobStep[] {\n    return [\n      {\n        name: \"Set git identity\",\n        run: [\n          `git config user.name \"${id.name}\"`,\n          `git config user.email \"${id.email}\"`,\n        ].join(\"\\n\"),\n      },\n    ];\n  }\n}\n\n/**\n * Options for `checkoutWithPatch`.\n */\nexport interface CheckoutWithPatchOptions {\n  /**\n   * A GitHub token to use when checking out the repository.\n   *\n   * If the intent is to push changes back to the branch, then you must use a\n   * PAT with `repo` (and possibly `workflows`) permissions.\n   * @default - the default GITHUB_TOKEN is implicitly used\n   */\n  readonly token?: string;\n\n  /**\n   * Branch or tag name.\n   * @default - the default branch is implicitly used\n   */\n  readonly ref?: string;\n\n  /**\n   * The repository (owner/repo) to use.\n   * @default - the default repository is implicitly used\n   */\n  readonly repository?: string;\n}\n\n/**\n * Options for `createUploadGitPatch`.\n */\nexport interface CreateUploadGitPatchOptions {\n  /**\n   * The step ID which produces the output which indicates if a patch was created.\n   */\n  readonly stepId: string;\n\n  /**\n   * The name of the output to emit. It will be set to `true` if there was a diff.\n   */\n  readonly outputName: string;\n\n  /**\n   * Fail if a mutation was found and print this error message.\n   * @default - do not fail upon mutation\n   */\n  readonly mutationError?: string;\n}\n"
  },
  {
    "path": "src/github/workflows-model.ts",
    "content": "// @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions\n\nexport interface CommonJobDefinition {\n  /**\n   * The name of the job displayed on GitHub.\n   */\n  readonly name?: string;\n\n  /**\n   * Identifies any jobs that must complete successfully before this job will\n   * run. It can be a string or array of strings. If a job fails, all jobs\n   * that need it are skipped unless the jobs use a conditional expression\n   * that causes the job to continue.\n   */\n  readonly needs?: string[];\n\n  /**\n   * You can modify the default permissions granted to the GITHUB_TOKEN, adding\n   * or removing access as required, so that you only allow the minimum required\n   * access.\n   *\n   * Use `{ contents: READ }` if your job only needs to clone code.\n   *\n   * This is intentionally a required field since it is required in order to\n   * allow workflows to run in GitHub repositories with restricted default\n   * access.\n   *\n   * @see https://docs.github.com/en/actions/reference/authentication-in-a-workflow#permissions-for-the-github_token\n   */\n  readonly permissions: JobPermissions;\n\n  /**\n   * Concurrency ensures that only a single job or workflow using the same\n   * concurrency group will run at a time. A concurrency group can be any\n   * string or expression. The expression can use any context except for the\n   * secrets context.\n   *\n   * @experimental\n   */\n  readonly concurrency?: unknown;\n\n  /**\n   * You can use the if conditional to prevent a job from running unless a\n   * condition is met. You can use any supported context and expression to\n   * create a conditional.\n   */\n  readonly if?: string;\n}\n\n/**\n * A GitHub Workflow Job calling a reusable workflow\n *\n */\nexport interface JobCallingReusableWorkflow extends CommonJobDefinition {\n  /**\n   * The location and version of a reusable workflow file to run as a job.\n   */\n  readonly uses: string;\n\n  /**\n   * When a job is used to call a reusable workflow, you can use with to\n   * provide a map of inputs that are passed to the called workflow.\n   *\n   * Allowed expression contexts: `github`, and `needs`.\n   */\n  readonly with?: Record<string, string | boolean>;\n\n  /**\n   * When a job is used to call a reusable workflow, you can use secrets to\n   * provide a map of secrets that are passed to the called workflow.\n   *\n   * Use the 'inherit' keyword to pass all the calling workflow's secrets to the called workflow\n   */\n  readonly secrets?: string | Record<string, string>;\n}\n\n/**\n * A GitHub Workflow job definition.\n */\nexport interface Job extends CommonJobDefinition {\n  /**\n   * The type of machine to run the job on. The machine can be either a\n   * GitHub-hosted runner or a self-hosted runner.\n   *\n   * @example [\"ubuntu-latest\"]\n   */\n  readonly runsOn: string[];\n\n  /**\n   * A job contains a sequence of tasks called steps. Steps can run commands,\n   * run setup tasks, or run an action in your repository, a public repository,\n   * or an action published in a Docker registry. Not all steps run actions,\n   * but all actions run as a step. Each step runs in its own process in the\n   * runner environment and has access to the workspace and filesystem.\n   * Because steps run in their own process, changes to environment variables\n   * are not preserved between steps. GitHub provides built-in steps to set up\n   * and complete a job.\n   */\n  readonly steps: JobStep[];\n\n  /**\n   * The environment that the job references. All environment protection rules\n   * must pass before a job referencing the environment is sent to a runner.\n   *\n   * @see https://docs.github.com/en/actions/reference/environments\n   */\n  readonly environment?: unknown;\n\n  /**\n   * A map of outputs for a job. Job outputs are available to all downstream\n   * jobs that depend on this job.\n   */\n  readonly outputs?: Record<string, JobStepOutput>;\n\n  /**\n   * A map of environment variables that are available to all steps in the\n   * job. You can also set environment variables for the entire workflow or an\n   * individual step.\n   */\n  readonly env?: Record<string, string>;\n\n  /**\n   * A map of default settings that will apply to all steps in the job. You\n   * can also set default settings for the entire workflow.\n   */\n  readonly defaults?: JobDefaults;\n\n  /**\n   * The maximum number of minutes to let a job run before GitHub\n   * automatically cancels it.\n   *\n   * @default 360\n   */\n  readonly timeoutMinutes?: number;\n\n  /**\n   * A strategy creates a build matrix for your jobs. You can define different\n   * variations to run each job in.\n   */\n  readonly strategy?: JobStrategy;\n\n  /**\n   * Prevents a workflow run from failing when a job fails. Set to true to\n   * allow a workflow run to pass when this job fails.\n   */\n  readonly continueOnError?: boolean;\n\n  /**\n   * A container to run any steps in a job that don't already specify a\n   * container. If you have steps that use both script and container actions,\n   * the container actions will run as sibling containers on the same network\n   * with the same volume mounts.\n   */\n  readonly container?: ContainerOptions;\n\n  /**\n   * Used to host service containers for a job in a workflow. Service\n   * containers are useful for creating databases or cache services like Redis.\n   * The runner automatically creates a Docker network and manages the life\n   * cycle of the service containers.\n   */\n  readonly services?: Record<string, ContainerOptions>;\n\n  /**\n   * Tools required for this job. Translates into `actions/setup-xxx` steps at\n   * the beginning of the job.\n   */\n  readonly tools?: Tools;\n}\n\n/**\n * Supported tools.\n */\nexport interface Tools {\n  /**\n   * Setup java (temurin distribution).\n   * @default - not installed\n   */\n  readonly java?: ToolRequirement;\n\n  /**\n   * Setup python.\n   * @default - not installed\n   */\n  readonly python?: ToolRequirement;\n\n  /**\n   * Setup golang.\n   * @default - not installed\n   */\n  readonly go?: ToolRequirement;\n\n  /**\n   * Setup node.js\n   * @default - not installed\n   */\n  readonly node?: ToolRequirement;\n\n  /**\n   * Setup .NET Core\n   * @default - not installed\n   */\n  readonly dotnet?: ToolRequirement;\n}\n\n/**\n * Version requirement for tools.\n */\nexport interface ToolRequirement {\n  readonly version: string;\n}\n\n/**\n * The available scopes and access values for workflow permissions. If you\n * specify the access for any of these scopes, all those that are not\n * specified are set to `JobPermission.NONE`, instead of the default behavior\n * when none is specified.\n */\nexport interface JobPermissions {\n  readonly actions?: JobPermission;\n  readonly checks?: JobPermission;\n  readonly contents?: JobPermission;\n  readonly deployments?: JobPermission;\n  readonly idToken?: JobPermission;\n  readonly issues?: JobPermission;\n  readonly discussions?: JobPermission;\n  readonly packages?: JobPermission;\n  readonly pages?: JobPermission;\n  readonly pullRequests?: JobPermission;\n  readonly repositoryProjects?: JobPermission;\n  readonly securityEvents?: JobPermission;\n  readonly statuses?: JobPermission;\n}\n\n/**\n * Access level for workflow permission scopes.\n */\nexport enum JobPermission {\n  /** Read-only access */\n  READ = \"read\",\n\n  /** Read-write access */\n  WRITE = \"write\",\n\n  /** No access at all */\n  NONE = \"none\",\n}\n\n/**\n * An output binding for a job.\n */\nexport interface JobStepOutput {\n  /**\n   * The ID of the step that exposes the output.\n   */\n  readonly stepId: string;\n\n  /**\n   * The name of the job output that is being bound.\n   */\n  readonly outputName: string;\n}\n\n/**\n * Default settings for all steps in the job.\n */\nexport interface JobDefaults {\n  /** Default run settings. */\n  readonly run?: RunSettings;\n}\n\n/**\n * Run settings for a job.\n */\nexport interface RunSettings {\n  /**\n   * Which shell to use for running the step.\n   *\n   * @example \"bash\"\n   */\n  readonly shell?: string;\n\n  /**\n   * Working directory to use when running the step.\n   */\n  readonly workingDirectory?: string;\n}\n\n/**\n * A generic step\n */\nexport interface Step {\n  /**\n   * A unique identifier for the step. You can use the id to reference the\n   * step in contexts.\n   */\n  readonly id?: string;\n\n  /**\n   * You can use the if conditional to prevent a job from running unless a\n   * condition is met. You can use any supported context and expression to\n   * create a conditional.\n   */\n  readonly if?: string;\n\n  /**\n   * A name for your step to display on GitHub.\n   */\n  readonly name?: string;\n\n  /**\n   * Selects an action to run as part of a step in your job. An action is a\n   * reusable unit of code. You can use an action defined in the same\n   * repository as the workflow, a public repository, or in a published Docker\n   * container image.\n   */\n  readonly uses?: string;\n\n  /**\n   * Runs command-line programs using the operating system's shell. If you do\n   * not provide a name, the step name will default to the text specified in\n   * the run command.\n   */\n  readonly run?: string;\n\n  /**\n   * A map of the input parameters defined by the action. Each input parameter\n   * is a key/value pair. Input parameters are set as environment variables.\n   * The variable is prefixed with INPUT_ and converted to upper case.\n   */\n  readonly with?: Record<string, any>;\n\n  /**\n   * Sets environment variables for steps to use in the runner environment.\n   * You can also set environment variables for the entire workflow or a job.\n   */\n  readonly env?: Record<string, string>;\n}\n\n/**\n * A job step\n */\nexport interface JobStep extends Step {\n  /**\n   * Prevents a job from failing when a step fails. Set to true to allow a job\n   * to pass when this step fails.\n   */\n  readonly continueOnError?: boolean;\n\n  /**\n   * The maximum number of minutes to run the step before killing the process.\n   */\n  readonly timeoutMinutes?: number;\n}\n\n/**\n * A strategy creates a build matrix for your jobs. You can define different\n * variations to run each job in.\n */\nexport interface JobStrategy {\n  /**\n   * You can define a matrix of different job configurations. A matrix allows\n   * you to create multiple jobs by performing variable substitution in a\n   * single job definition. For example, you can use a matrix to create jobs\n   * for more than one supported version of a programming language, operating\n   * system, or tool. A matrix reuses the job's configuration and creates a\n   * job for each matrix you configure.\n   *\n   * A job matrix can generate a maximum of 256 jobs per workflow run. This\n   * limit also applies to self-hosted runners.\n   */\n  readonly matrix?: JobMatrix;\n\n  /**\n   * When set to true, GitHub cancels all in-progress jobs if any matrix job\n   * fails. Default: true\n   */\n  readonly failFast?: boolean;\n\n  /**\n   * The maximum number of jobs that can run simultaneously when using a\n   * matrix job strategy. By default, GitHub will maximize the number of jobs\n   * run in parallel depending on the available runners on GitHub-hosted\n   * virtual machines.\n   */\n  readonly maxParallel?: number;\n}\n\ntype JobMatrixValue = string | boolean | number;\n\n/**\n * A job matrix.\n */\nexport interface JobMatrix {\n  /**\n   * Each option you define in the matrix has a key and value. The keys you\n   * define become properties in the matrix context and you can reference the\n   * property in other areas of your workflow file. For example, if you define\n   * the key os that contains an array of operating systems, you can use the\n   * matrix.os property as the value of the runs-on keyword to create a job\n   * for each operating system.\n   */\n  readonly domain?: Record<string, JobMatrixValue[]>;\n\n  /**\n   * You can add additional configuration options to a build matrix job that\n   * already exists. For example, if you want to use a specific version of npm\n   * when the job that uses windows-latest and version 8 of node runs, you can\n   * use include to specify that additional option.\n   */\n  readonly include?: Array<Record<string, JobMatrixValue>>;\n\n  /**\n   * You can remove a specific configurations defined in the build matrix\n   * using the exclude option. Using exclude removes a job defined by the\n   * build matrix.\n   */\n  readonly exclude?: Array<Record<string, JobMatrixValue>>;\n}\n\n/**\n * Options pertaining to container environments.\n */\nexport interface ContainerOptions {\n  /**\n   * The Docker image to use as the container to run the action. The value can\n   * be the Docker Hub image name or a registry name.\n   */\n  readonly image: string;\n\n  /**\n   * f the image's container registry requires authentication to pull the\n   * image, you can use credentials to set a map of the username and password.\n   * The credentials are the same values that you would provide to the docker\n   * login command.\n   */\n  readonly credentials?: ContainerCredentials;\n\n  /**\n   * Sets a map of environment variables in the container.\n   */\n  readonly env?: Record<string, string>;\n\n  /**\n   * Sets an array of ports to expose on the container.\n   */\n  readonly ports?: number[];\n\n  /**\n   * Sets an array of volumes for the container to use. You can use volumes to\n   * share data between services or other steps in a job. You can specify\n   * named Docker volumes, anonymous Docker volumes, or bind mounts on the\n   * host.\n   *\n   * To specify a volume, you specify the source and destination path:\n   * `<source>:<destinationPath>`.\n   */\n  readonly volumes?: string[];\n\n  /**\n   * Additional Docker container resource options.\n   *\n   * @see https://docs.docker.com/engine/reference/commandline/create/#options\n   */\n  readonly options?: string[];\n}\n\n/**\n * Credentials to use to authenticate to Docker registries.\n */\nexport interface ContainerCredentials {\n  /** The username. */\n  readonly username: string;\n\n  /** The password. */\n  readonly password: string;\n}\n\n/**\n * The set of available triggers for GitHub Workflows.\n *\n * @see https://docs.github.com/en/actions/reference/events-that-trigger-workflows\n */\nexport interface Triggers {\n  //#region Scheduled events\n  /**\n   * You can schedule a workflow to run at specific UTC times using POSIX cron\n   * syntax. Scheduled workflows run on the latest commit on the default or\n   * base branch. The shortest interval you can run scheduled workflows is\n   * once every 5 minutes.\n   *\n   * @see https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html#tag_20_25_07\n   */\n  readonly schedule?: CronScheduleOptions[];\n  //#endregion\n\n  //#region Manual events\n  /**\n   * You can configure custom-defined input properties, default input values,\n   * and required inputs for the event directly in your workflow. When the\n   * workflow runs, you can access the input values in the github.event.inputs\n   * context.\n   */\n  readonly workflowDispatch?: WorkflowDispatchOptions;\n\n  /**\n   * You can use the GitHub API to trigger a webhook event called\n   * repository_dispatch when you want to trigger a workflow for activity that\n   * happens outside of GitHub.\n   */\n  readonly repositoryDispatch?: RepositoryDispatchOptions;\n  //#endregion\n\n  //#region Workflow reuse events\n  /**\n   * Can be called from another workflow\n   * @see https://docs.github.com/en/actions/learn-github-actions/reusing-workflows\n   */\n  readonly workflowCall?: WorkflowCallOptions;\n  //#endregion\n\n  //#region Webhook events\n  /**\n   * Runs your workflow anytime the branch_protection_rule event occurs.\n   */\n  readonly branchProtectionRule?: BranchProtectionRuleOptions;\n\n  /**\n   * Runs your workflow anytime the check_run event occurs.\n   */\n  readonly checkRun?: CheckRunOptions;\n\n  /**\n   * Runs your workflow anytime the check_suite event occurs.\n   */\n  readonly checkSuite?: CheckSuiteOptions;\n\n  /**\n   * Runs your workflow anytime someone creates a branch or tag, which\n   * triggers the create event.\n   */\n  readonly create?: CreateOptions;\n\n  /**\n   * Runs your workflow anytime someone deletes a branch or tag, which\n   * triggers the delete event.\n   */\n  readonly delete?: DeleteOptions;\n\n  /**\n   * Runs your workflow anytime someone creates a deployment, which triggers\n   * the deployment event. Deployments created with a commit SHA may not have\n   * a Git ref.\n   */\n  readonly deployment?: DeploymentOptions;\n\n  /**\n   * Runs your workflow anytime a third party provides a deployment status,\n   * which triggers the deployment_status event. Deployments created with a\n   * commit SHA may not have a Git ref.\n   */\n  readonly deploymentStatus?: DeploymentStatusOptions;\n\n  /**\n   * Runs your workflow anytime the discussion event occurs. More than one activity type triggers this event.\n   * @see https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions\n   */\n  readonly discussion?: DiscussionOptions;\n\n  /**\n   * Runs your workflow anytime the discussion_comment event occurs. More than one activity type triggers this event.\n   * @see https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions\n   */\n  readonly discussionComment?: DiscussionCommentOptions;\n\n  /**\n   * Runs your workflow anytime when someone forks a repository, which\n   * triggers the fork event.\n   */\n  readonly fork?: ForkOptions;\n\n  /**\n   * Runs your workflow when someone creates or updates a Wiki page, which\n   * triggers the gollum event.\n   */\n  readonly gollum?: GollumOptions;\n\n  /**\n   * Runs your workflow anytime the issue_comment event occurs.\n   */\n  readonly issueComment?: IssueCommentOptions;\n\n  /**\n   * Runs your workflow anytime the issues event occurs.\n   */\n  readonly issues?: IssuesOptions;\n\n  /**\n   * Runs your workflow anytime the label event occurs.\n   */\n  readonly label?: LabelOptions;\n\n  /**\n   * Runs your workflow anytime the milestone event occurs.\n   */\n  readonly milestone?: MilestoneOptions;\n\n  /**\n   * Runs your workflow anytime someone pushes to a GitHub Pages-enabled\n   * branch, which triggers the page_build event.\n   */\n  readonly pageBuild?: PageBuildOptions;\n\n  /**\n   * Runs your workflow anytime the project event occurs.\n   */\n  readonly project?: ProjectOptions;\n\n  /**\n   * Runs your workflow anytime the project_card event occurs.\n   */\n  readonly projectCard?: ProjectCardOptions;\n\n  /**\n   * Runs your workflow anytime the project_column event occurs.\n   */\n  readonly projectColumn?: ProjectColumnOptions;\n\n  /**\n   * Runs your workflow anytime someone makes a private repository public,\n   * which triggers the public event.\n   */\n  readonly public?: PublicOptions;\n\n  /**\n   * Runs your workflow anytime the pull_request event occurs.\n   */\n  readonly pullRequest?: PullRequestOptions;\n\n  /**\n   * Runs your workflow anytime the pull_request_review event occurs.\n   */\n  readonly pullRequestReview?: PullRequestReviewOptions;\n\n  /**\n   * Runs your workflow anytime a comment on a pull request's unified diff is\n   * modified, which triggers the pull_request_review_comment event.\n   */\n  readonly pullRequestReviewComment?: PullRequestReviewCommentOptions;\n\n  /**\n   * This event runs in the context of the base of the pull request, rather\n   * than in the merge commit as the pull_request event does. This prevents\n   * executing unsafe workflow code from the head of the pull request that\n   * could alter your repository or steal any secrets you use in your workflow.\n   * This event allows you to do things like create workflows that label and\n   * comment on pull requests based on the contents of the event payload.\n   *\n   * WARNING: The `pull_request_target` event is granted read/write repository\n   * token and can access secrets, even when it is triggered from a fork.\n   * Although the workflow runs in the context of the base of the pull request,\n   * you should make sure that you do not check out, build, or run untrusted\n   * code from the pull request with this event. Additionally, any caches\n   * share the same scope as the base branch, and to help prevent cache\n   * poisoning, you should not save the cache if there is a possibility that\n   * the cache contents were altered.\n   *\n   * @see https://securitylab.github.com/research/github-actions-preventing-pwn-requests\n   */\n  readonly pullRequestTarget?: PullRequestTargetOptions;\n\n  /**\n   * Runs your workflow when someone pushes to a repository branch, which\n   * triggers the push event.\n   */\n  readonly push?: PushOptions;\n\n  /**\n   * Runs your workflow anytime a package is published or updated.\n   */\n  readonly registryPackage?: RegistryPackageOptions;\n\n  /**\n   * Runs your workflow anytime the release event occurs.\n   */\n  readonly release?: ReleaseOptions;\n\n  /**\n   * Runs your workflow anytime the status of a Git commit changes, which\n   * triggers the status event.\n   */\n  readonly status?: StatusOptions;\n\n  /**\n   * Runs your workflow anytime the watch event occurs.\n   */\n  readonly watch?: WatchOptions;\n\n  /**\n   * This event occurs when a workflow run is requested or completed, and\n   * allows you to execute a workflow based on the finished result of another\n   * workflow. A workflow run is triggered regardless of the result of the\n   * previous workflow.\n   */\n  readonly workflowRun?: WorkflowRunOptions;\n  //#endregion\n}\n\n/**\n * CRON schedule options.\n */\nexport interface CronScheduleOptions {\n  /**\n   * @see https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html#tag_20_25_07\n   */\n  readonly cron: string;\n}\n\n/**\n * Repository dispatch options.\n */\nexport interface RepositoryDispatchOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: string[];\n}\n\n/**\n * Branch Protection Rule options\n */\nexport interface BranchProtectionRuleOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"created\" | \"edited\" | \"deleted\">;\n}\n\n/**\n * Check run options.\n */\nexport interface CheckRunOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    \"create\" | \"rerequested\" | \"completed\" | \"requested_action\"\n  >;\n}\n\n/**\n * Check suite options\n */\nexport interface CheckSuiteOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"completed\" | \"requested\" | \"rerequested\">;\n}\n\n/**\n * Discussion options\n */\nexport interface DiscussionOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    | \"created\"\n    | \"edited\"\n    | \"transferred\"\n    | \"pinned\"\n    | \"unpinned\"\n    | \"labeled\"\n    | \"unlabeled\"\n    | \"locked\"\n    | \"unlocked\"\n    | \"category_changed\"\n    | \"answered\"\n    | \"unanswered\"\n  >;\n}\n\n/**\n * Discussion comment options\n */\nexport interface DiscussionCommentOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"created\" | \"edited\" | \"deleted\">;\n}\n\n/**\n * Issue comment options\n */\nexport interface IssueCommentOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"created\" | \"edited\" | \"deleted\">;\n}\n\n/**\n * Issues options\n */\nexport interface IssuesOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    | \"opened\"\n    | \"edited\"\n    | \"deleted\"\n    | \"transferred\"\n    | \"pinned\"\n    | \"unpinned\"\n    | \"closed\"\n    | \"reopened\"\n    | \"assigned\"\n    | \"unassigned\"\n    | \"labeled\"\n    | \"unlabeled\"\n    | \"locked\"\n    | \"unlocked\"\n    | \"milestoned\"\n    | \"demilestoned\"\n  >;\n}\n\n/**\n * label options\n */\nexport interface LabelOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"created\" | \"edited\" | \"deleted\">;\n}\n\n/**\n * Milestone options\n */\nexport interface MilestoneOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    \"created\" | \"closed\" | \"opened\" | \"edited\" | \"deleted\"\n  >;\n}\n\n/**\n * Project options\n */\nexport interface ProjectOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    \"created\" | \"updated\" | \"closed\" | \"reopened\" | \"edited\" | \"deleted\"\n  >;\n}\n\n/**\n * Project card options\n */\nexport interface ProjectCardOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    \"created\" | \"moved\" | \"converted\" | \"edited\" | \"deleted\"\n  >;\n}\n\n/**\n * Probject column options\n */\nexport interface ProjectColumnOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"created\" | \"updated\" | \"moved\" | \"deleted\">;\n}\n\n/**\n * Pull request options\n */\nexport interface PullRequestOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    | \"assigned\"\n    | \"unassigned\"\n    | \"labeled\"\n    | \"unlabeled\"\n    | \"opened\"\n    | \"edited\"\n    | \"closed\"\n    | \"reopened\"\n    | \"synchronize\"\n    | \"ready_for_review\"\n    | \"locked\"\n    | \"unlocked\"\n    | \"review_requested\"\n    | \"review_request_removed\"\n  >;\n}\n\n/**\n * Pull request review options\n */\nexport interface PullRequestReviewOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"submitted\" | \"edited\" | \"dismissed\">;\n}\n\n/**\n * Pull request review comment options\n */\nexport interface PullRequestReviewCommentOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"created\" | \"edited\" | \"deleted\">;\n}\n\n/**\n * Pull request target options.\n */\nexport interface PullRequestTargetOptions extends PushOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    | \"assigned\"\n    | \"unassigned\"\n    | \"labeled\"\n    | \"unlabeled\"\n    | \"opened\"\n    | \"edited\"\n    | \"closed\"\n    | \"reopened\"\n    | \"synchronize\"\n    | \"ready_for_review\"\n    | \"locked\"\n    | \"unlocked\"\n    | \"review_requested\"\n    | \"review_request_removed\"\n  >;\n}\n\n/**\n * Options for push-like events.\n */\nexport interface PushOptions {\n  /**\n   * When using the push and pull_request events, you can configure a workflow\n   * to run on specific branches or tags. For a pull_request event, only\n   * branches and tags on the base are evaluated. If you define only tags or\n   * only branches, the workflow won't run for events affecting the undefined\n   * Git ref.\n   *\n   * @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet\n   */\n  readonly branches?: string[];\n\n  /**\n   * When using the push and pull_request events, you can configure a workflow\n   * to run on specific branches or tags. For a pull_request event, only\n   * branches and tags on the base are evaluated. If you define only tags or\n   * only branches, the workflow won't run for events affecting the undefined\n   * Git ref.\n   *\n   * @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet\n   */\n  readonly tags?: string[];\n\n  /**\n   * When using the push and pull_request events, you can configure a workflow\n   * to run when at least one file does not match paths-ignore or at least one\n   * modified file matches the configured paths. Path filters are not\n   * evaluated for pushes to tags.\n   *\n   * @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet\n   */\n  readonly paths?: string[];\n}\n\n/**\n * Registry package options\n */\nexport interface RegistryPackageOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"published\" | \"updated\">;\n}\n\n/**\n * Release options\n */\nexport interface ReleaseOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\n    | \"published\"\n    | \"unpublished\"\n    | \"created\"\n    | \"edited\"\n    | \"deleted\"\n    | \"prereleased\"\n    | \"released\"\n  >;\n}\n\n/**\n * Watch options\n */\nexport interface WatchOptions {\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"started\">;\n}\n\n/**\n * Workflow run options\n */\nexport interface WorkflowRunOptions {\n  /**\n   * Which workflow to trigger on.\n   *\n   * @defaults - any workflows\n   */\n  readonly workflows?: Array<string>;\n  /**\n   * Which activity types to trigger on.\n   *\n   * @defaults - all activity types\n   */\n  readonly types?: Array<\"completed\" | \"requested\">;\n  /**\n   * Which branches or branch-ignore to limit the trigger to.\n   *\n   * @defaults - no branch limits\n   */\n  readonly branches?: Array<string>;\n}\n\n//#region Empty Options (future-proofing the API)\n/**\n * The Workflow dispatch event accepts no options.\n */\nexport interface WorkflowDispatchOptions {}\n\n/**\n * The Workflow Call event accepts no options.\n */\nexport interface WorkflowCallOptions {}\n\n/**\n * The Create event accepts no options.\n */\nexport interface CreateOptions {}\n\n/**\n * The Delete event accepts no options.\n */\nexport interface DeleteOptions {}\n\n/**\n * The Deployment event accepts no options.\n */\nexport interface DeploymentOptions {}\n\n/**\n * The Deployment status event accepts no options.\n */\nexport interface DeploymentStatusOptions {}\n\n/**\n * The Fork event accepts no options.\n */\nexport interface ForkOptions {}\n\n/**\n * The Gollum event accepts no options.\n */\nexport interface GollumOptions {}\n\n/**\n * The Page build event accepts no options.\n */\nexport interface PageBuildOptions {}\n\n/**\n * The Public event accepts no options.\n */\nexport interface PublicOptions {}\n\n/**\n * The Status event accepts no options.\n */\nexport interface StatusOptions {}\n//#endregion\n"
  },
  {
    "path": "src/github/workflows.ts",
    "content": "import { snake } from \"case\";\nimport { resolve } from \"../_resolve\";\nimport { Component } from \"../component\";\nimport { kebabCaseKeys } from \"../util\";\nimport { YamlFile } from \"../yaml\";\nimport { GitHub } from \"./github\";\nimport { GithubCredentials } from \"./github-credentials\";\n\nimport * as workflows from \"./workflows-model\";\n\n/**\n * Options for `GithubWorkflow`.\n */\nexport interface GithubWorkflowOptions {\n  /**\n   * Force the creation of the workflow even if `workflows` is disabled in `GitHub`.\n   *\n   * @default false\n   */\n  readonly force?: boolean;\n  /**\n   * Concurrency ensures that only a single job or workflow using the same concurrency group will run at a time. Currently in beta.\n   *\n   * @default - disabled\n   * @see https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#concurrency\n   */\n  readonly concurrency?: string;\n}\n\n/**\n * Workflow for GitHub.\n *\n * A workflow is a configurable automated process made up of one or more jobs.\n *\n * @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions\n */\nexport class GithubWorkflow extends Component {\n  /**\n   * The name of the workflow.\n   */\n  public readonly name: string;\n\n  /**\n   * Concurrency ensures that only a single job or workflow using the same concurrency group will run at a time.\n   *\n   * @default disabled\n   * @experimental\n   */\n  public readonly concurrency?: string;\n\n  /**\n   * The workflow YAML file. May not exist if `workflowsEnabled` is false on `GitHub`.\n   */\n  public readonly file: YamlFile | undefined;\n\n  /**\n   * GitHub API authentication method used by projen workflows.\n   */\n  public readonly projenCredentials: GithubCredentials;\n\n  private events: workflows.Triggers = {};\n  private jobs: Record<\n    string,\n    workflows.Job | workflows.JobCallingReusableWorkflow\n  > = {};\n\n  constructor(\n    github: GitHub,\n    name: string,\n    options: GithubWorkflowOptions = {}\n  ) {\n    super(github.project);\n\n    this.name = name;\n    this.concurrency = options.concurrency;\n    this.projenCredentials = github.projenCredentials;\n\n    const workflowsEnabled = github.workflowsEnabled || options.force;\n\n    if (workflowsEnabled) {\n      this.file = new YamlFile(\n        this.project,\n        `.github/workflows/${name.toLocaleLowerCase()}.yml`,\n        {\n          obj: () => this.renderWorkflow(),\n          // GitHub needs to read the file from the repository in order to work.\n          committed: true,\n        }\n      );\n    }\n  }\n\n  /**\n   * Add events to triggers the workflow.\n   *\n   * @param events The event(s) to trigger the workflow.\n   */\n  public on(events: workflows.Triggers) {\n    this.events = {\n      ...this.events,\n      ...events,\n    };\n  }\n\n  /**\n   * Adds a single job to the workflow.\n   * @param id The job name (unique within the workflow)\n   * @param job The job specification\n   */\n  public addJob(\n    id: string,\n    job: workflows.Job | workflows.JobCallingReusableWorkflow\n  ): void {\n    this.addJobs({ [id]: job });\n  }\n\n  /**\n   * Add jobs to the workflow.\n   *\n   * @param jobs Jobs to add.\n   */\n  public addJobs(\n    jobs: Record<string, workflows.Job | workflows.JobCallingReusableWorkflow>\n  ) {\n    // verify that job has a \"permissions\" statement to ensure workflow can\n    // operate in repos with default tokens set to readonly\n    for (const [id, job] of Object.entries(jobs)) {\n      if (!job.permissions) {\n        throw new Error(\n          `${id}: all workflow jobs must have a \"permissions\" clause to ensure workflow can operate in restricted repositories`\n        );\n      }\n    }\n\n    // verify that job has a \"runsOn\" statement to ensure a worker can be selected appropriately\n    for (const [id, job] of Object.entries(jobs)) {\n      if (!(\"uses\" in job)) {\n        if (\"runsOn\" in job && job.runsOn.length === 0) {\n          throw new Error(\n            `${id}: at least one runner selector labels must be provided in \"runsOn\" to ensure a runner instance can be selected`\n          );\n        }\n      }\n    }\n\n    this.jobs = {\n      ...this.jobs,\n      ...jobs,\n    };\n  }\n\n  private renderWorkflow() {\n    return {\n      name: this.name,\n      on: snakeCaseKeys(this.events),\n      concurrency: this.concurrency,\n      jobs: renderJobs(this.jobs),\n    };\n  }\n}\n\nfunction snakeCaseKeys<T = unknown>(obj: T): T {\n  if (typeof obj !== \"object\" || obj == null) {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map(snakeCaseKeys) as any;\n  }\n\n  const result: Record<string, unknown> = {};\n  for (let [k, v] of Object.entries(obj)) {\n    if (typeof v === \"object\" && v != null) {\n      v = snakeCaseKeys(v);\n    }\n    result[snake(k)] = v;\n  }\n  return result as any;\n}\n\nfunction renderJobs(\n  jobs: Record<string, workflows.Job | workflows.JobCallingReusableWorkflow>\n) {\n  const result: Record<string, unknown> = {};\n  for (const [name, job] of Object.entries(jobs)) {\n    result[name] = renderJob(job);\n  }\n  return result;\n\n  /** @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions */\n  function renderJob(\n    job: workflows.Job | workflows.JobCallingReusableWorkflow\n  ) {\n    const steps = new Array<workflows.JobStep>();\n\n    // https://docs.github.com/en/actions/using-workflows/reusing-workflows#supported-keywords-for-jobs-that-call-a-reusable-workflow\n    if (\"uses\" in job) {\n      return {\n        name: job.name,\n        needs: arrayOrScalar(job.needs),\n        if: job.if,\n        permissions: kebabCaseKeys(job.permissions),\n        concurrency: job.concurrency,\n        uses: job.uses,\n        with: job.with,\n        secrets: job.secrets,\n      };\n    }\n\n    if (job.tools) {\n      steps.push(...setupTools(job.tools));\n    }\n\n    const userDefinedSteps = kebabCaseKeys(resolve(job.steps), false);\n    steps.push(...userDefinedSteps);\n\n    return {\n      name: job.name,\n      needs: arrayOrScalar(job.needs),\n      \"runs-on\": arrayOrScalar(job.runsOn),\n      permissions: kebabCaseKeys(job.permissions),\n      environment: job.environment,\n      concurrency: job.concurrency,\n      outputs: renderJobOutputs(job.outputs),\n      env: job.env,\n      defaults: kebabCaseKeys(job.defaults),\n      if: job.if,\n      steps: steps,\n      \"timeout-minutes\": job.timeoutMinutes,\n      strategy: renderJobStrategy(job.strategy),\n      \"continue-on-error\": job.continueOnError,\n      container: job.container,\n      services: job.services,\n    };\n  }\n\n  function renderJobOutputs(output: workflows.Job[\"outputs\"]) {\n    if (output == null) {\n      return undefined;\n    }\n\n    const rendered: Record<string, string> = {};\n    for (const [name, { stepId, outputName }] of Object.entries(output)) {\n      rendered[name] = `\\${{ steps.${stepId}.outputs.${outputName} }}`;\n    }\n    return rendered;\n  }\n\n  function renderJobStrategy(strategy: workflows.Job[\"strategy\"]) {\n    if (strategy == null) {\n      return undefined;\n    }\n\n    const rendered: Record<string, unknown> = {\n      \"max-parallel\": strategy.maxParallel,\n      \"fail-fast\": strategy.failFast,\n    };\n\n    if (strategy.matrix) {\n      const matrix: Record<string, unknown> = {\n        include: strategy.matrix.include,\n        exclude: strategy.matrix.exclude,\n      };\n      for (const [key, values] of Object.entries(\n        strategy.matrix.domain ?? {}\n      )) {\n        if (key in matrix) {\n          // A domain key was set to `include`, or `exclude`:\n          throw new Error(`Illegal job strategy matrix key: ${key}`);\n        }\n        matrix[key] = values;\n      }\n      rendered.matrix = matrix;\n    }\n\n    return rendered;\n  }\n}\n\nfunction arrayOrScalar<T>(arr: T[] | undefined): T | T[] | undefined {\n  if (arr == null || arr.length === 0) {\n    return arr;\n  }\n  if (arr.length === 1) {\n    return arr[0];\n  }\n  return arr;\n}\n\nexport interface IJobProvider {\n  /**\n   * Generates a collection of named GitHub workflow jobs.\n   */\n  renderJobs(): Record<string, workflows.Job>;\n}\n\nfunction setupTools(tools: workflows.Tools) {\n  const steps: workflows.JobStep[] = [];\n\n  if (tools.java) {\n    steps.push({\n      uses: \"actions/setup-java@v3\",\n      with: { distribution: \"temurin\", \"java-version\": tools.java.version },\n    });\n  }\n\n  if (tools.node) {\n    steps.push({\n      uses: \"actions/setup-node@v3\",\n      with: { \"node-version\": tools.node.version },\n    });\n  }\n\n  if (tools.python) {\n    steps.push({\n      uses: \"actions/setup-python@v3\",\n      with: { \"python-version\": tools.python.version },\n    });\n  }\n\n  if (tools.go) {\n    steps.push({\n      uses: \"actions/setup-go@v3\",\n      with: { \"go-version\": tools.go.version },\n    });\n  }\n\n  if (tools.dotnet) {\n    steps.push({\n      uses: \"actions/setup-dotnet@v2\",\n      with: { \"dotnet-version\": tools.dotnet.version },\n    });\n  }\n\n  return steps;\n}\n"
  },
  {
    "path": "src/gitlab/configuration-model.ts",
    "content": "// @see https://docs.gitlab.com/ee/ci/yaml/\n// Schema from: https://gitlab.com/gitlab-org/gitlab/-/raw/master/app/assets/javascripts/editor/schema/ci.json\n// Initial TypeScript Interfaces from: https://app.quicktype.io/#\n\n/**\n * Cache Definition.\n * @see https://docs.gitlab.com/ee/ci/yaml/#cache\n */\nexport interface Cache {\n  /** Defines which files or directories to cache. */\n  readonly paths?: string[];\n\n  /** Used the to give each cache a unique identifying key. All jobs that use the same cache key use the same cache. */\n  readonly key?: string | CacheKeyFiles;\n\n  /** If set to true all files that are untracked in your Git repository will be cached. */\n  readonly untracked?: boolean;\n\n  /** Defines the upload and download behaviour of the cache. */\n  readonly policy?: CachePolicy;\n\n  /** Defines when to save the cache, based on the status of the job (Default: Job Success). */\n  readonly when?: CacheWhen;\n}\n\n/**\n * Use this construct to generate a new key when one or two specific files change.\n * @see https://docs.gitlab.com/ee/ci/yaml/#cachekeyfiles\n */\nexport interface CacheKeyFiles {\n  /** The files that are checked against. If the SHA checksum changes, the cache becomes invalid. */\n  readonly files: string[];\n  /** Adds a custom prefix to the checksums computed. */\n  readonly prefix?: string;\n}\n\n/**\n * Configure the upload and download behaviour of a cache.\n * @see https://docs.gitlab.com/ee/ci/yaml/#cachepolicy\n */\nexport enum CachePolicy {\n  /** Only download the cache when the job starts, but never upload changes when the job finishes. */\n  PULL = \"pull\",\n  /** Only upload a cache when the job finishes, but never download the cache when the job starts. */\n  PUSH = \"push\",\n  /** The job downloads the cache when the job starts, and uploads changes to the cache when the job ends. */\n  PULL_PUSH = \"pull-push\",\n}\n\n/**\n * Configure when artifacts are uploaded depended on job status.\n * @see https://docs.gitlab.com/ee/ci/yaml/#cachewhen\n */\nexport enum CacheWhen {\n  /** Upload artifacts regardless of job status. */\n  ALWAYS = \"always\",\n  /** Upload artifacts only when the job fails. */\n  ON_FAILURE = \"on_failure\",\n  /** Upload artifacts only when the job succeeds (this is the default). */\n  ON_SUCCESS = \"on_success\",\n}\n\n/**\n * Default settings for the CI Configuration. Jobs that do not define one or more of the listed keywords use the value defined in the default section.\n * @see https://docs.gitlab.com/ee/ci/yaml/#default\n */\nexport interface Default {\n  /* Defines scripts that should run *after* all jobs. Can be overriden by the job level `afterScript. */\n  readonly afterScript?: string[];\n  /* List of files and directories that should be attached to the job if it succeeds. Artifacts are sent to Gitlab where they can be downloaded. */\n  readonly artifacts?: Artifacts;\n  /* Defines scripts that should run *before* all jobs. Can be overriden by the job level `afterScript`. */\n  readonly beforeScript?: string[];\n  /* A list of files and directories to cache between jobs. You can only use paths that are in the local working copy. */\n  readonly cache?: Cache;\n  /* Specifies the default docker image to use globally for all jobs. */\n  readonly image?: Image;\n  /* If a job should be canceled when a newer pipeline starts before the job completes (Default: false).*/\n  readonly interruptible?: boolean;\n  /* How many times a job is retried if it fails. If not defined, defaults to 0 and jobs do not retry. */\n  readonly retry?: Retry;\n  /* Additional Docker images to run scripts in. The service image is linked to the image specified in the  image parameter. */\n  readonly services?: Service[];\n  /* Used to select a specific runner from the list of all runners that are available for the project. */\n  readonly tags?: string[];\n  /* A default timeout job written in natural language (Ex. one hour, 3600 seconds, 60 minutes). */\n  readonly timeout?: string;\n}\n\n/**\n * Used to specify a list of files and directories that should be attached to the job if it\n * succeeds. Artifacts are sent to Gitlab where they can be downloaded.\n * @see https://docs.gitlab.com/ee/ci/yaml/#artifacts\n */\nexport interface Artifacts {\n  /** A list of paths to files/folders that should be excluded in the artifact. */\n  readonly exclude?: string[];\n  /** How long artifacts should be kept. They are saved 30 days by default. Artifacts that have expired are removed periodically via cron job. Supports a wide variety of formats, e.g. '1 week', '3 mins 4 sec', '2 hrs 20 min', '2h20min', '6 mos 1 day', '47 yrs 6 mos and 4d', '3 weeks and 2 days'. */\n  readonly expireIn?: string;\n  /** Can be used to expose job artifacts in the merge request UI. GitLab will add a link <expose_as> to the relevant merge request that points to the artifact. */\n  readonly exposeAs?: string;\n  /** Name for the archive created on job success. Can use variables in the name, e.g. '$CI_JOB_NAME' */\n  readonly name?: string;\n  /** A list of paths to files/folders that should be included in the artifact. */\n  readonly paths?: string[];\n  /** Reports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in Merge Requests.*/\n  readonly reports?: Reports;\n  /** Whether to add all untracked files (along with 'artifacts.paths') to the artifact.*/\n  readonly untracked?: boolean;\n  /** Configure when artifacts are uploaded depended on job status.*/\n  readonly when?: CacheWhen;\n}\n\n/**\n * Reports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in\n * Merge Requests.\n * @see https://docs.gitlab.com/ee/ci/yaml/#artifactsreports\n */\nexport interface Reports {\n  /** Path for file(s) that should be parsed as Cobertura XML coverage report*/\n  readonly cobertura?: string[];\n  /** Path to file or list of files with code quality report(s) (such as Code Climate).*/\n  readonly codequality?: string[];\n  /** Path to file or list of files with Container scanning vulnerabilities report(s).*/\n  readonly containerScanning?: string[];\n  /** Path to file or list of files with DAST vulnerabilities report(s).*/\n  readonly dast?: string[];\n  /** Path to file or list of files with Dependency scanning vulnerabilities report(s).*/\n  readonly dependencyScanning?: string[];\n  /** Path to file or list of files containing runtime-created variables for this job.*/\n  readonly dotenv?: string[];\n  /** Path for file(s) that should be parsed as JUnit XML result*/\n  readonly junit?: string[];\n  /** Deprecated in 12.8: Path to file or list of files with license report(s).*/\n  readonly licenseManagement?: string[];\n  /** Path to file or list of files with license report(s).*/\n  readonly licenseScanning?: string[];\n  /** Path to file or list of files containing code intelligence (Language Server Index Format).*/\n  readonly lsif?: string[];\n  /** Path to file or list of files with custom metrics report(s).*/\n  readonly metrics?: string[];\n  /** Path to file or list of files with performance metrics report(s).*/\n  readonly performance?: string[];\n  /** Path to file or list of files with requirements report(s).*/\n  readonly requirements?: string[];\n  /** Path to file or list of files with SAST vulnerabilities report(s).*/\n  readonly sast?: string[];\n  /** Path to file or list of files with secret detection report(s).*/\n  readonly secretDetection?: string[];\n  /** Path to file or list of files with terraform plan(s).*/\n  readonly terraform?: string[];\n}\n\n/**\n * Specifies the docker image to use for the job or globally for all jobs. Job configuration\n * takes precedence over global setting. Requires a certain kind of Gitlab runner executor.\n * @see https://docs.gitlab.com/ee/ci/yaml/#image\n */\nexport interface Image {\n  /** Command or script that should be executed as the container's entrypoint. It will be translated to Docker's --entrypoint option while creating the container. The syntax is similar to Dockerfile's ENTRYPOINT directive, where each shell token is a separate string in the array.*/\n  readonly entrypoint?: any[];\n  /** Full name of the image that should be used. It should contain the Registry part if needed.*/\n  readonly name: string;\n}\n\n/**\n * How many times a job is retried if it fails. If not defined, defaults to 0 and jobs do not retry.\n * @see https://docs.gitlab.com/ee/ci/yaml/#retry\n */\nexport interface Retry {\n  /** 0 (default), 1, or 2.*/\n  readonly max?: number;\n  /** Either a single or array of error types to trigger job retry.*/\n  readonly when?: any;\n}\n\n/**\n * Used to specify an additional Docker image to run scripts in. The service image is linked to the image specified in the @Default image keyword.\n * @see https://docs.gitlab.com/ee/ci/yaml/#services\n */\nexport interface Service {\n  /** Additional alias that can be used to access the service from the job's container. Read Accessing the services for more information.*/\n  readonly alias?: string;\n  /** Command or script that should be used as the container's command. It will be translated to arguments passed to Docker after the image's name. The syntax is similar to Dockerfile's CMD directive, where each shell token is a separate string in the array.*/\n  readonly command?: string[];\n  /** Command or script that should be executed as the container's entrypoint. It will be translated to Docker's --entrypoint option while creating the container. The syntax is similar to Dockerfile's ENTRYPOINT directive, where each shell token is a separate string in the array.*/\n  readonly entrypoint?: string[];\n  /** Full name of the image that should be used. It should contain the Registry part if needed.*/\n  readonly name: string;\n}\n\n/**\n * An included YAML file.\n * @see https://docs.gitlab.com/ee/ci/yaml/#include\n */\nexport interface Include {\n  /** Relative path from local repository root (`/`) to the `yaml`/`yml` file template. The file must be on the same branch, and does not work across git submodules.*/\n  readonly local?: string;\n  /**Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job. */\n  readonly rules?: IncludeRule[];\n  /** Files from another private project on the same GitLab instance. You can use `file` in combination with `project` only. */\n  readonly file?: string[];\n  /** Path to the project, e.g. `group/project`, or `group/sub-group/project`.*/\n  readonly project?: string;\n  /** Branch/Tag/Commit-hash for the target project.*/\n  readonly ref?: string;\n  /** Use a `.gitlab-ci.yml` template as a base, e.g. `Nodejs.gitlab-ci.yml`.*/\n  readonly template?: string;\n  /** URL to a `yaml`/`yml` template file using HTTP/HTTPS.*/\n  readonly remote?: string;\n}\n\n/**\n * Rules allows for an array of individual rule objects to be evaluated in order, until one\n * matches and dynamically provides attributes to the job.\n * @see https://docs.gitlab.com/ee/ci/yaml/includes.html#use-rules-with-include\n */\nexport interface IncludeRule {\n  /* Whether a pipeline should continue running when a job fails. */\n  readonly allowFailure?: boolean | AllowFailure;\n  /* Specify when to add a job to a pipeline by checking for changes to specific files. */\n  readonly changes?: string[];\n  /* Run a job when certain files exist in the repository. */\n  readonly exists?: string[];\n  /* Clauses to specify when to add a job to a pipeline.*/\n  readonly if?: string;\n  /* Execute scripts after a waiting period written in natural language (Ex. one hour, 3600 seconds, 60 minutes). */\n  readonly startIn?: string;\n  /* Use variables in rules to define variables for specific conditions. */\n  readonly variables?: Record<string, number | string>;\n  /* Conditions for when to run the job. Defaults to 'on_success' */\n  readonly when?: JobWhen;\n}\n\n/**\n * Exit code that are not considered failure. The job fails for any other exit code.\n * You can list which exit codes are not considered failures. The job fails for any other\n * exit code.\n * @see https://docs.gitlab.com/ee/ci/yaml/#allow_failure\n */\nexport interface AllowFailure {\n  readonly exitCodes: number[] | number;\n}\n\n/**\n * Describes the conditions for when to run the job. Defaults to 'on_success'.\n * @see https://docs.gitlab.com/ee/ci/yaml/#when\n */\nexport enum JobWhen {\n  ALWAYS = \"always\",\n  DELAYED = \"delayed\",\n  MANUAL = \"manual\",\n  NEVER = \"never\",\n  ON_FAILURE = \"on_failure\",\n  ON_SUCCESS = \"on_success\",\n}\n\n/**\n * Jobs are the most fundamental element of a .gitlab-ci.yml file.\n * @see https://docs.gitlab.com/ee/ci/jobs/\n */\nexport interface Job {\n  /* Defines scripts that should run *after* the job. */\n  readonly afterScript?: string[];\n  /** Whether to allow the pipeline to continue running on job failure (Default: false). */\n  readonly allowFailure?: boolean | AllowFailure;\n  /* A list of files and directories that should be attached to the job if it succeeds. Artifacts are sent to Gitlab where they can be downloaded. */\n  readonly artifacts?: Artifacts;\n  /* Defines scripts that should run *before* the job. */\n  readonly beforeScript?: string[];\n  /* A list of files and directories to cache between jobs. You can only use paths that are in the local working copy. */\n  readonly cache?: Cache;\n  /** Must be a regular expression, optionally but recommended to be quoted, and must be surrounded with '/'. Example: '/Code coverage: \\d+\\.\\d+/'*/\n  readonly coverage?: string;\n  /** Specify a list of job names from earlier stages from which artifacts should be loaded. By default, all previous artifacts are passed. Use an empty array to skip downloading artifacts.*/\n  readonly dependencies?: string[];\n  /** Used to associate environment metadata with a deploy. Environment can have a name and URL attached to it, and will be displayed under /environments under the project.*/\n  readonly environment?: Environment | string;\n  /** Job will run *except* for when these filtering options match.*/\n  readonly except?: string[] | Filter;\n  /** The name of one or more jobs to inherit configuration from.*/\n  readonly extends?: string[];\n  /* Specifies the default docker image to used for the job. */\n  readonly image?: Image;\n  /** Controls inheritance of globally-defined defaults and variables. Boolean values control inheritance of all default: or variables: keywords. To inherit only a subset of default: or variables: keywords, specify what you wish to inherit. Anything not listed is not inherited.*/\n  readonly inherit?: Inherit;\n  /* If a job should be canceled when a newer pipeline starts before the job completes (Default: false).*/\n  readonly interruptible?: boolean;\n  /** The list of jobs in previous stages whose sole completion is needed to start the current job.*/\n  readonly needs?: Array<Need | string>;\n  /** Job will run *only* when these filtering options match.*/\n  readonly only?: string[] | Filter;\n  /** Parallel will split up a single job into several, and provide `CI_NODE_INDEX` and `CI_NODE_TOTAL` environment variables for the running jobs.*/\n  readonly parallel?: Parallel | number;\n  /** Indicates that the job creates a Release.*/\n  readonly release?: Release;\n  /** Limit job concurrency. Can be used to ensure that the Runner will not run certain jobs simultaneously.*/\n  readonly resourceGroup?: string;\n  /* How many times a job is retried if it fails. If not defined, defaults to 0 and jobs do not retry. */\n  readonly retry?: Retry;\n  /**Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job. */\n  readonly rules?: IncludeRule[];\n  /** Shell scripts executed by the Runner. The only required property of jobs. Be careful with special characters (e.g. `:`, `{`, `}`, `&`) and use single or double quotes to avoid issues.*/\n  readonly script?: string[];\n  /** CI/CD secrets */\n  readonly secrets?: Record<string, Record<string, Secret>>;\n  /* Additional Docker images to run scripts in. The service image is linked to the image specified in the  image parameter. */\n  readonly services?: Service[];\n  /** Define what stage the job will run in.*/\n  readonly stage?: string;\n  /* Execute scripts after a waiting period written in natural language (Ex. one hour, 3600 seconds, 60 minutes). */\n  readonly startIn?: string;\n  /* Used to select a specific runner from the list of all runners that are available for the project. */\n  readonly tags?: string[];\n  /* A default timeout job written in natural language (Ex. one hour, 3600 seconds, 60 minutes). */\n  readonly timeout?: string;\n  /** Trigger allows you to define downstream pipeline trigger. When a job created from trigger definition is started by GitLab, a downstream pipeline gets created. Read more: https://docs.gitlab.com/ee/ci/yaml/README.html#trigger*/\n  readonly trigger?: Trigger | string;\n  /** Configurable values that are passed to the Job. */\n  readonly variables?: Record<string, number | string>;\n  /** Describes the conditions for when to run the job. Defaults to 'on_success'. */\n  readonly when?: JobWhen;\n}\n\n/**\n * The environment that a job deploys to.\n */\nexport interface Environment {\n  /** Specifies what this job will do. 'start' (default) indicates the job will start the deployment. 'prepare' indicates this will not affect the deployment. 'stop' indicates this will stop the deployment.*/\n  readonly action?: Action;\n  /** The amount of time it should take before Gitlab will automatically stop the environment. Supports a wide variety of formats, e.g. '1 week', '3 mins 4 sec', '2 hrs 20 min', '2h20min', '6 mos 1 day', '47 yrs 6 mos and 4d', '3 weeks and 2 days'.*/\n  readonly autoStopIn?: string;\n  /** Explicitly specifies the tier of the deployment environment if non-standard environment name is used.*/\n  readonly deploymentTier?: DeploymentTier;\n  /** Used to configure the kubernetes deployment for this environment. This is currently not supported for kubernetes clusters that are managed by Gitlab.*/\n  readonly kubernetes?: KubernetesConfig;\n  /** The name of the environment, e.g. 'qa', 'staging', 'production'.*/\n  readonly name: string;\n  /** The name of a job to execute when the environment is about to be stopped.*/\n  readonly onStop?: string;\n  /** When set, this will expose buttons in various places for the current environment in Gitlab, that will take you to the defined URL.*/\n  readonly url?: string;\n}\n\n/**\n * Specifies what this job will do. 'start' (default) indicates the job will start the\n * deployment. 'prepare' indicates this will not affect the deployment. 'stop' indicates\n * this will stop the deployment.\n */\nexport enum Action {\n  PREPARE = \"prepare\",\n  START = \"start\",\n  STOP = \"stop\",\n}\n\n/**\n * Explicitly specifies the tier of the deployment environment if non-standard environment\n * name is used.\n */\nexport enum DeploymentTier {\n  DEVELOPMENT = \"development\",\n  OTHER = \"other\",\n  PRODUCTION = \"production\",\n  STAGING = \"staging\",\n  TESTING = \"testing\",\n}\n\n/**\n * Used to configure the kubernetes deployment for this environment. This is currently not\n * supported for kubernetes clusters that are managed by Gitlab.\n */\nexport interface KubernetesConfig {\n  /** The kubernetes namespace where this environment should be deployed to.*/\n  readonly namespace?: string;\n}\n\n/**\n * Filtering options for when a job will run.\n */\nexport interface Filter {\n  /** Filter job creation based on files that were modified in a git push.*/\n  readonly changes?: string[];\n  /** Filter job based on if Kubernetes integration is active.*/\n  readonly kubernetes?: KubernetesEnum;\n  /** Control when to add jobs to a pipeline based on branch names or pipeline types. */\n  readonly refs?: string[];\n  /** Filter job by checking comparing values of environment variables. Read more about variable expressions: https://docs.gitlab.com/ee/ci/variables/README.html#variables-expressions*/\n  readonly variables?: string[];\n}\n\n/**\n * Filter job based on if Kubernetes integration is active.\n */\nexport enum KubernetesEnum {\n  ACTIVE = \"active\",\n}\n\n/**\n * Controls inheritance of globally-defined defaults and variables. Boolean values control\n * inheritance of all default: or variables: keywords. To inherit only a subset of default:\n * or variables: keywords, specify what you wish to inherit. Anything not listed is not\n * inherited.\n */\nexport interface Inherit {\n  /** Whether to inherit all globally-defined defaults or not. Or subset of inherited defaults*/\n  readonly default?: DefaultElement[] | boolean;\n  /** Whether to inherit all globally-defined variables or not. Or subset of inherited variables*/\n  readonly variables?: string[] | boolean;\n}\n\nexport enum DefaultElement {\n  AFTER_SCRIPT = \"after_script\",\n  ARTIFACTS = \"artifacts\",\n  BEFORE_SCRIPT = \"before_script\",\n  CACHE = \"cache\",\n  IMAGE = \"image\",\n  INTERRUPTIBLE = \"interruptible\",\n  RETRY = \"retry\",\n  SERVICES = \"services\",\n  TAGS = \"tags\",\n  TIMEOUT = \"timeout\",\n}\n\n/**\n * A jobs in a previous stage whose sole completion is needed to start the current job.\n */\nexport interface Need {\n  readonly artifacts?: boolean;\n  readonly job: string;\n  readonly optional?: boolean;\n  readonly pipeline?: string;\n  readonly project?: string;\n  readonly ref?: string;\n}\n\n/**\n * Used to run a job multiple times in parallel in a single pipeline.\n */\nexport interface Parallel {\n  /** Defines different variables for jobs that are running in parallel.*/\n  readonly matrix: Record<string, any[]>[];\n}\n\n/**\n * Indicates that the job creates a Release.\n */\nexport interface Release {\n  readonly assets?: Assets;\n  /** Specifies the longer description of the Release.*/\n  readonly description: string;\n  /** The title of each milestone the release is associated with.*/\n  readonly milestones?: string[];\n  /** The Release name. If omitted, it is populated with the value of release: tag_name.*/\n  readonly name?: string;\n  /** If the release: tag_name doesn’t exist yet, the release is created from ref. ref can be a commit SHA, another tag name, or a branch name.*/\n  readonly ref?: string;\n  /** The date and time when the release is ready. Defaults to the current date and time if not defined. Should be enclosed in quotes and expressed in ISO 8601 format.*/\n  readonly releasedAt?: string;\n  /** The tag_name must be specified. It can refer to an existing Git tag or can be specified by the user.*/\n  readonly tagName: string;\n}\n\n/**\n * Asset configuration for a release.\n */\nexport interface Assets {\n  /** Include asset links in the release.*/\n  readonly links: Link[];\n}\n\n/**\n * Link configuration for an asset.\n */\nexport interface Link {\n  /** The redirect link to the url.*/\n  readonly filepath?: string;\n  /** The content kind of what users can download via url.*/\n  readonly linkType?: LinkType;\n  /** The name of the link.*/\n  readonly name: string;\n  /** The URL to download a file.*/\n  readonly url: string;\n}\n\n/**\n * The content kind of what users can download via url.\n */\nexport enum LinkType {\n  IMAGE = \"image\",\n  OTHER = \"other\",\n  PACKAGE = \"package\",\n  RUNBOOK = \"runbook\",\n}\n\n/**\n * A CI/CD secret\n */\nexport interface Secret {\n  /* Specification for a secret provided by a HashiCorp Vault. */\n  readonly vault: VaultConfig;\n}\n\n/**\n * Specification for a secret provided by a HashiCorp Vault.\n * @see https://www.vaultproject.io/\n */\nexport interface VaultConfig {\n  /* The engine configuration for a secret. */\n  readonly engine: Engine;\n  /* The name of the field where the password is stored. */\n  readonly field: string;\n  /** Path to the secret. */\n  readonly path: string;\n}\n\n/**\n * The engine configuration for a secret.\n */\nexport interface Engine {\n  /** Name of the secrets engine. */\n  readonly name: string;\n  /** Path to the secrets engine. */\n  readonly path: string;\n}\n\n/**\n * Trigger a multi-project or a child pipeline. Read more:\n * @see https://docs.gitlab.com/ee/ci/yaml/README.html#simple-trigger-syntax-for-multi-project-pipelines\n * @see https://docs.gitlab.com/ee/ci/yaml/README.html#trigger-syntax-for-child-pipeline\n */\nexport interface Trigger {\n  /** The branch name that a downstream pipeline will use*/\n  readonly branch?: string;\n  /** Path to the project, e.g. `group/project`, or `group/sub-group/project`.*/\n  readonly project?: string;\n  /** You can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend*/\n  readonly strategy?: Strategy;\n  /** A list of local files or artifacts from other jobs to define the pipeline */\n  readonly include?: TriggerInclude[];\n}\n\n/**\n * References a local file or an artifact from another job to define the pipeline\n * configuration.\n * @see https://docs.gitlab.com/ee/ci/yaml/#triggerinclude\n */\nexport interface TriggerInclude {\n  /** Relative path from local repository root (`/`) to the local YAML file to define the pipeline configuration.*/\n  readonly local?: string;\n  /** Name of the template YAML file to use in the pipeline configuration.*/\n  readonly template?: string;\n  /** Relative path to the generated YAML file which is extracted from the artifacts and used as the configuration for triggering the child pipeline.*/\n  readonly artifact?: string;\n  /** Job name which generates the artifact*/\n  readonly job?: string;\n  /** Relative path from repository root (`/`) to the pipeline configuration YAML file.*/\n  readonly file?: string;\n  /** Path to another private project under the same GitLab instance, like `group/project` or `group/sub-group/project`.*/\n  readonly project?: string;\n  /** Branch/Tag/Commit hash for the target project.*/\n  readonly ref?: string;\n}\n\n/**\n * You can mirror the pipeline status from the triggered pipeline to the source bridge job\n * by using strategy: depend\n * @see https://docs.gitlab.com/ee/ci/yaml/#triggerstrategy\n */\nexport enum Strategy {\n  DEPEND = \"depend\",\n}\n\n/**\n * Explains what the global variable is used for, what the acceptable values are.\n * @see https://docs.gitlab.com/ee/ci/yaml/#variables\n */\nexport interface VariableConfig {\n  /** Define a global variable that is prefilled when running a pipeline manually. Must be used with value.  */\n  readonly description?: string;\n  /** The variable value. */\n  readonly value?: string;\n}\n\n/**\n * Used to control pipeline behavior.\n * @see https://docs.gitlab.com/ee/ci/yaml/#workflow\n */\nexport interface Workflow {\n  /** Used to control whether or not a whole pipeline is created. */\n  readonly rules?: WorkflowRule[];\n}\n\n/**\n * Used to control whether or not a whole pipeline is created.\n * @see https://docs.gitlab.com/ee/ci/yaml/#workflowrules\n */\nexport interface WorkflowRule {\n  /* Specify when to add a job to a pipeline by checking for changes to specific files. */\n  readonly changes?: string[];\n  /* Run a job when certain files exist in the repository. */\n  readonly exists?: string[];\n  /* Clauses to specify when to add a job to a pipeline.*/\n  readonly if?: string;\n  /* Use variables in rules to define variables for specific conditions. */\n  readonly variables?: Record<string, number | string>;\n  /* Conditions for when to run the job. Defaults to 'on_success' */\n  readonly when?: JobWhen;\n}\n\n/**\n * Describes the conditions for when to run the job. Defaults to 'on_success'.\n * The value can only be 'always' or 'never' when used with workflow.\n * @see https://docs.gitlab.com/ee/ci/yaml/#workflowrules\n */\nexport enum WorkflowWhen {\n  ALWAYS = \"always\",\n  NEVER = \"never\",\n}\n"
  },
  {
    "path": "src/gitlab/configuration.ts",
    "content": "import * as path from \"path\";\nimport { snake } from \"case\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { YamlFile } from \"../yaml\";\nimport {\n  Artifacts,\n  Cache,\n  Default,\n  Image,\n  Include,\n  Job,\n  Retry,\n  Service,\n  VariableConfig,\n  Workflow,\n} from \"./configuration-model\";\n\n/**\n * Options for `CiConfiguration`.\n */\nexport interface CiConfigurationOptions {\n  /**\n   * Default settings for the CI Configuration. Jobs that do not define one or more of the listed keywords use the value defined in the default section.\n   */\n  readonly default?: Default;\n  /**\n   * A special job used to upload static sites to Gitlab pages. Requires a `public/` directory\n   * with `artifacts.path` pointing to it.\n   */\n  readonly pages?: Job;\n  /**\n   * Used to control pipeline behavior.\n   */\n  readonly workflow?: Workflow;\n  /**\n   * Groups jobs into stages. All jobs in one stage must complete before next stage is\n   * executed. If no stages are specified. Defaults to ['build', 'test', 'deploy'].\n   */\n  readonly stages?: string[];\n  /**\n   * Global variables that are passed to jobs.\n   * If the job already has that variable defined, the job-level variable takes precedence.\n   */\n  readonly variables?: Record<string, any>;\n  /**\n   * An initial set of jobs to add to the configuration.\n   */\n  readonly jobs?: Record<string, Job>;\n}\n\n/**\n * CI for GitLab.\n * A CI is a configurable automated process made up of one or more stages/jobs.\n * @see https://docs.gitlab.com/ee/ci/yaml/\n */\nexport class CiConfiguration extends Component {\n  /**\n   * The project the configuration belongs to.\n   */\n  public readonly project: Project;\n  /**\n   * The name of the configuration.\n   */\n  public readonly name: string;\n  /**\n   * Path to CI file generated by the configuration.\n   */\n  public readonly path: string;\n  /**\n   * The workflow YAML file.\n   */\n  public readonly file: YamlFile;\n  /**\n   * Defines default scripts that should run *after* all jobs. Can be overriden by the job level `afterScript`.\n   */\n  public readonly defaultAfterScript: string[] = [];\n  /**\n   * Default list of files and directories that should be attached to the job if it succeeds. Artifacts are sent to Gitlab where they can be downloaded.\n   */\n  public readonly defaultArtifacts?: Artifacts;\n  /**\n   * Defines default scripts that should run *before* all jobs. Can be overriden by the job level `afterScript`.\n   */\n  public readonly defaultBeforeScript: string[] = [];\n  /**\n   * A default list of files and directories to cache between jobs. You can only use paths that are in the local working copy.\n   */\n  public readonly defaultCache?: Cache;\n  /**\n   * Specifies the default docker image to use globally for all jobs.\n   */\n  public readonly defaultImage?: Image;\n  /**\n   * The default behavior for whether a job should be canceled when a newer pipeline starts before the job completes (Default: false).\n   */\n  public readonly defaultInterruptible?: boolean;\n  /**\n   * How many times a job is retried if it fails. If not defined, defaults to 0 and jobs do not retry.\n   */\n  public readonly defaultRetry?: Retry;\n  /**\n   * A default list of additional Docker images to run scripts in. The service image is linked to the image specified in the  image parameter.\n   */\n  private defaultServices: Service[] = [];\n  /**\n   * Used to select a specific runner from the list of all runners that are available for the project.\n   */\n  readonly defaultTags: string[] = [];\n  /**\n   * A default timeout job written in natural language (Ex. one hour, 3600 seconds, 60 minutes).\n   */\n  readonly defaultTimeout?: string;\n  /**\n   * Can be `Include` or `Include[]`. Each `Include` will be a string, or an\n   * object with properties for the method if including external YAML file. The external\n   * content will be fetched, included and evaluated along the `.gitlab-ci.yml`.\n   */\n  private include: Include[] = [];\n  /**\n   * A special job used to upload static sites to Gitlab pages. Requires a `public/` directory\n   * with `artifacts.path` pointing to it.\n   */\n  public readonly pages?: Job;\n  /**\n   * Groups jobs into stages. All jobs in one stage must complete before next stage is\n   * executed. Defaults to ['build', 'test', 'deploy'].\n   */\n  public readonly stages: string[] = [];\n  /**\n   * Global variables that are passed to jobs.\n   * If the job already has that variable defined, the job-level variable takes precedence.\n   */\n  public readonly variables: Record<string, number | VariableConfig | string> =\n    {};\n  /**\n   * Used to control pipeline behavior.\n   */\n  public readonly workflow?: Workflow;\n  /**\n   * The jobs in the CI configuration.\n   */\n  public readonly jobs: Record<string, Job> = {};\n\n  constructor(\n    project: Project,\n    name: string,\n    options?: CiConfigurationOptions\n  ) {\n    super(project);\n    this.project = project;\n    this.name = path.parse(name).name;\n    this.path =\n      this.name === \"gitlab-ci\"\n        ? \".gitlab-ci.yml\"\n        : `.gitlab/ci-templates/${name.toLocaleLowerCase()}.yml`;\n    this.file = new YamlFile(this.project, this.path, {\n      obj: () => this.renderCI(),\n      // GitLab needs to read the file from the repository in order to work.\n      committed: true,\n    });\n    const defaults = options?.default;\n    if (defaults) {\n      this.defaultAfterScript.push(...(defaults.afterScript ?? []));\n      this.defaultArtifacts = defaults.artifacts;\n      defaults.beforeScript &&\n        this.defaultBeforeScript.push(...defaults.beforeScript);\n      this.defaultCache = defaults.cache;\n      this.defaultImage = defaults.image;\n      this.defaultInterruptible = defaults.interruptible;\n      this.defaultRetry = defaults.retry;\n      defaults.services && this.addServices(...defaults.services);\n      defaults.tags && this.defaultTags.push(...defaults.tags);\n      this.defaultTimeout = defaults.timeout;\n    }\n    this.pages = options?.pages;\n    this.workflow = options?.workflow;\n    if (options?.stages) {\n      this.addStages(...options.stages);\n    }\n    if (options?.variables) {\n      this.addJobs(options.variables);\n    }\n    if (options?.jobs) {\n      this.addJobs(options.jobs);\n    }\n  }\n\n  /**\n   * Add additional yml/yaml files to the CI includes\n   * @param includes The includes to add.\n   */\n  public addIncludes(...includes: Include[]) {\n    for (const additional of includes) {\n      this.assertIsValidInclude(additional);\n      for (const existing of this.include) {\n        if (this.areEqualIncludes(existing, additional)) {\n          throw new Error(\n            `${this.name}: GitLab CI ${existing} already contains one or more templates specified in ${additional}.`\n          );\n        }\n      }\n      this.include.push(additional);\n    }\n  }\n\n  /**\n   * Throw an error if the provided Include is invalid.\n   * @see https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/config/external/mapper.rb\n   * @param include the Include to validate.\n   */\n  private assertIsValidInclude(include: Include) {\n    const combos = [\n      include.local,\n      include.file && include.project,\n      include.remote,\n      include.template,\n    ];\n    const len = combos.filter((x) => Boolean(x)).length;\n    if (len !== 1) {\n      throw new Error(\n        `${this.name}: GitLab CI include ${include} contains ${len} property combination(s).\n        A valid include configuration specifies *one* of the following property combinations.\n        * local\n        * file, project\n        * remote\n        * template  \n        `\n      );\n    }\n  }\n\n  /**\n   * Check if the equality of Includes.\n   * @see https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/config/external/mapper.rb\n   * @param x First include to compare.\n   * @param y Second include to compare.\n   * @returns Whether the includes are equal.\n   */\n  private areEqualIncludes(x: Include, y: Include): boolean {\n    if (x.local === y.local && x.local !== undefined) {\n      return true;\n    } else if (x.template === y.template && x.template !== undefined) {\n      return true;\n    } else if (x.remote === y.remote && x.remote !== undefined) {\n      return true;\n    } else if (x.project === y.project && x.ref === y.ref) {\n      const xFiles = x.file ? x.file : [];\n      const yFiles = y.file ? y.file : [];\n      const allFiles = xFiles.concat(yFiles);\n      return new Set(allFiles).size !== allFiles.length;\n    }\n    return false;\n  }\n\n  /**\n   * Add additional services.\n   * @param services The services to add.\n   */\n  public addServices(...services: Service[]) {\n    for (const additional of services) {\n      for (const existing of this.defaultServices) {\n        if (\n          additional.name === existing.name &&\n          additional.alias === existing.alias\n        ) {\n          throw new Error(\n            `${this.name}: GitLab CI already contains service ${additional}.`\n          );\n        }\n      }\n      this.defaultServices.push(additional);\n    }\n  }\n\n  /**\n   * Add a globally defined variable to the CI configuration.\n   * @param variables The variables to add.\n   */\n  public addGlobalVariables(variables: Record<string, any>) {\n    for (const [key, value] of Object.entries(variables)) {\n      if (this.variables[key] !== undefined) {\n        throw new Error(\n          `${this.name}: GitLab CI already contains variable ${key}.`\n        );\n      }\n      this.variables[key] = value;\n    }\n  }\n\n  /**\n   * Add stages to the CI configuration if not already present.\n   * @param stages stages to add.\n   */\n  public addStages(...stages: string[]) {\n    for (const stage of stages) {\n      if (!this.stages.includes(stage)) {\n        this.stages.push(stage);\n      }\n    }\n  }\n\n  /**\n   * Add jobs and their stages to the CI configuration.\n   * @param jobs Jobs to add.\n   */\n  public addJobs(jobs: Record<string, Job>) {\n    for (const [key, value] of Object.entries(jobs)) {\n      if (this.jobs[key] !== undefined) {\n        throw new Error(`${this.name}: GitLab CI already contains job ${key}.`);\n      }\n      this.jobs[key] = value;\n      if (value.stage) {\n        this.addStages(value.stage);\n      }\n    }\n  }\n\n  private renderCI() {\n    return {\n      default: this.renderDefault(),\n      include:\n        this.include.length > 0 ? snakeCaseKeys(this.include) : undefined,\n      pages: snakeCaseKeys(this.pages),\n      services:\n        this.defaultServices.length > 0\n          ? snakeCaseKeys(this.defaultServices)\n          : undefined,\n      variables:\n        Object.entries(this.variables).length > 0 ? this.variables : undefined,\n      workflow: snakeCaseKeys(this.workflow),\n      stages: this.stages.length > 0 ? this.stages : undefined,\n      ...snakeCaseKeys(this.jobs),\n    };\n  }\n\n  private renderDefault() {\n    const defaults: Default = {\n      afterScript:\n        this.defaultAfterScript.length > 0\n          ? this.defaultAfterScript\n          : undefined,\n      artifacts: this.defaultArtifacts,\n      beforeScript:\n        this.defaultBeforeScript.length > 0\n          ? this.defaultBeforeScript\n          : undefined,\n      cache: this.defaultCache,\n      image: this.defaultImage,\n      interruptible: this.defaultInterruptible,\n      retry: this.defaultRetry,\n      services:\n        this.defaultServices.length > 0 ? this.defaultServices : undefined,\n      tags: this.defaultTags.length > 0 ? this.defaultTags : undefined,\n      timeout: this.defaultTimeout,\n    };\n    return Object.values(defaults).filter((x) => x).length\n      ? snakeCaseKeys(defaults)\n      : undefined;\n  }\n}\n\nfunction snakeCaseKeys<T = unknown>(obj: T): T {\n  if (typeof obj !== \"object\" || obj == null) {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map(snakeCaseKeys) as any;\n  }\n\n  const result: Record<string, unknown> = {};\n  for (let [k, v] of Object.entries(obj)) {\n    if (typeof v === \"object\" && v != null && k !== \"variables\") {\n      v = snakeCaseKeys(v);\n    }\n    result[snake(k)] = v;\n  }\n  return result as any;\n}\n"
  },
  {
    "path": "src/gitlab/gitlab-configuration.ts",
    "content": "import { CiConfigurationOptions } from \".\";\nimport { Project } from \"../project\";\nimport { CiConfiguration } from \"./configuration\";\nimport { NestedConfiguration } from \"./nested-configuration\";\n\n/**\n * A GitLab CI for the main `.gitlab-ci.yml` file.\n */\nexport class GitlabConfiguration extends CiConfiguration {\n  public readonly nestedTemplates: Record<string, NestedConfiguration> = {};\n  constructor(project: Project, options?: CiConfigurationOptions) {\n    super(project, \"gitlab-ci\", options);\n  }\n\n  /**\n   * Creates and adds nested templates to the includes of the main CI.\n   * Additionally adds their stages to the main CI if they are not already present.\n   * You can futher customize nested templates through the `nestedTemplates` property.\n   * E.g. gitlabConfig.nestedTemplates['templateName']?.addStages('stageName')\n   * @param config a record the names and configuraitons of the templates.\n   */\n  public createNestedTemplates(config: Record<string, CiConfigurationOptions>) {\n    for (const [name, options] of Object.entries(config)) {\n      if (this.nestedTemplates[name] !== undefined) {\n        throw new Error(\n          `${this.name}: GitLab CI already contains template \"${name}\".`\n        );\n      }\n      const template = new NestedConfiguration(\n        this.project,\n        this,\n        name,\n        options\n      );\n      this.nestedTemplates[template.name] = template;\n      this.addIncludes({ local: template.path });\n      this.addStages(...template.stages);\n    }\n  }\n}\n"
  },
  {
    "path": "src/gitlab/index.ts",
    "content": "export * from \"./configuration\";\nexport * from \"./configuration-model\";\nexport * from \"./gitlab-configuration\";\nexport * from \"./nested-configuration\";\n"
  },
  {
    "path": "src/gitlab/nested-configuration.ts",
    "content": "import { CiConfigurationOptions } from \".\";\nimport { Project } from \"../project\";\nimport { CiConfiguration } from \"./configuration\";\nimport { GitlabConfiguration } from \"./gitlab-configuration\";\n\n/**\n * A GitLab CI for templates that are created and included in the `.gitlab-ci.yml` file.\n */\nexport class NestedConfiguration extends CiConfiguration {\n  public readonly parent: GitlabConfiguration;\n  constructor(\n    project: Project,\n    parent: GitlabConfiguration,\n    name: string,\n    options?: CiConfigurationOptions\n  ) {\n    super(project, name, options);\n    this.parent = parent;\n  }\n}\n"
  },
  {
    "path": "src/gitpod.ts",
    "content": "import { Component } from \"./component\";\nimport {\n  IDevEnvironment,\n  DevEnvironmentOptions,\n  DevEnvironmentDockerImage,\n} from \"./dev-env\";\nimport { Project } from \"./project\";\nimport { Task } from \"./task\";\nimport { YamlFile } from \"./yaml\";\n\n/**\n * Relative path of Gitpod file to generate\n */\nconst GITPOD_FILE = \".gitpod.yml\";\n\n/**\n * https://www.gitpod.io/docs/configuration/\n * https://www.gitpod.io/docs/config-start-tasks/\n * https://www.gitpod.io/docs/prebuilds/#configure-the-github-app\n * https://www.gitpod.io/docs/vscode-extensions/\n */\n\n/**\n * Configure how the terminal should be opened relative to the previous task.\n */\nexport enum GitpodOpenMode {\n  /**\n   * Opens in the same tab group right after the previous tab\n   */\n  TAB_AFTER = \"tab-after\",\n  /**\n   * Opens in the same tab group left before the previous tab\n   */\n  TAB_BEFORE = \"tab-before\",\n  /**\n   * Splits and adds the terminal to the right\n   */\n  SPLIT_RIGHT = \"split-right\",\n  /**\n   * Splits and adds the terminal to the left\n   */\n  SPLIT_LEFT = \"split-left\",\n  /**\n   * Splits and adds the terminal to the top\n   */\n  SPLIT_TOP = \"split-top\",\n  /**\n   * Splits and adds the terminal to the bottom\n   */\n  SPLIT_BOTTOM = \"split-bottom\",\n}\n\n/**\n * Configure where in the IDE the terminal should be opened.\n */\nexport enum GitpodOpenIn {\n  /**\n   * the bottom panel (default)\n   */\n  BOTTOM = \"bottom\",\n  /**\n   * the left panel\n   */\n  LEFT = \"left\",\n  /**\n   * the right panel\n   */\n  RIGHT = \"right\",\n  /**\n   * the main editor area\n   */\n  MAIN = \"main\",\n}\n\n/**\n * Configure options for a task to be run when opening a Gitpod\n * workspace (e.g. running tests, or starting a dev server).\n *\n * Start Mode         | Execution\n * Fresh Workspace    | before && init && command\n * Restart Workspace  | before && command\n * Snapshot           | before && command\n * Prebuild           | before && init && prebuild\n */\nexport interface GitpodTask {\n  /**\n   * Required. The shell command to run\n   */\n  readonly command: string;\n\n  /**\n   * A name for this task.\n   * @default - task names are omitted when blank\n   */\n  readonly name?: string;\n\n  /**\n   * You can configure how the terminal should be opened relative to the previous task.\n   * @default GitpodOpenMode.TAB_AFTER\n   */\n  readonly openMode?: GitpodOpenMode;\n\n  /**\n   * You can configure where in the IDE the terminal should be opened\n   * @default GitpodOpenIn.BOTTOM\n   */\n  readonly openIn?: GitpodOpenIn;\n\n  /**\n   * In case you need to run something even before init, that is a requirement for both init and command,\n   * you can use the before property.\n   * @default\n   */\n  readonly before?: string;\n\n  /**\n   * The init property can be used to specify shell commands that should only be executed after a workspace\n   * was freshly cloned and needs to be initialized somehow. Such tasks are usually builds or downloading\n   * dependencies. Anything you only want to do once but not when you restart a workspace or start a snapshot.\n   * @default\n   */\n  readonly init?: string;\n\n  /**\n   * The optional prebuild command will be executed during prebuilds. It is meant to run additional long running\n   * processes that could be useful, e.g. running test suites.\n   * @default\n   */\n  readonly prebuild?: string;\n}\n\n/**\n * What to do when a service on a port is detected.\n */\nexport enum GitpodOnOpen {\n  /**\n   * Open a new browser tab\n   */\n  OPEN_BROWSER = \"open-browser\",\n\n  /**\n   * Open a preview on the right side of the IDE\n   */\n  OPEN_PREVIEW = \"open-preview\",\n\n  /**\n   * Show a notification asking the user what to do (default)\n   */\n  NOTIFY = \"notify\",\n\n  /**\n   * Do nothing.\n   */\n  IGNORE = \"ignore\",\n}\n\n/**\n * Whether the port visibility should be private or public\n */\nexport enum GitpodPortVisibility {\n  /**\n   * Allows everyone with the port URL to access the port (default)\n   */\n  PUBLIC = \"public\",\n\n  /**\n   * Only allows users with workspace access to access the port\n   */\n  PRIVATE = \"private\",\n}\n\n/**\n * Options for an exposed port on Gitpod\n */\nexport interface GitpodPort {\n  /**\n   * A port that should be exposed (forwarded) from the container.\n   *\n   * @example \"8080\"\n   */\n  readonly port?: string;\n\n  /**\n   * What to do when a service on a port is detected.\n   *\n   * @default GitpodOnOpen.NOTIFY\n   */\n  readonly onOpen?: GitpodOnOpen;\n\n  /**\n   * Whether the port visibility should be private or public.\n   *\n   * @default GitpodPortVisibility.PUBLIC\n   */\n  readonly visibility?: GitpodPortVisibility;\n}\n\n/**\n * Configure the Gitpod App for prebuilds.\n * Currently only GitHub is supported.\n * @see https://www.gitpod.io/docs/prebuilds/\n */\nexport interface GitpodPrebuilds {\n  /**\n   * Enable for the master/default branch\n   * @default true\n   */\n  readonly master?: boolean;\n\n  /**\n   * Enable for all branches in this repo\n   * @default false\n   */\n  readonly branches?: boolean;\n\n  /**\n   * Enable for pull requests coming from this repo\n   * @default true\n   */\n  readonly pullRequests?: boolean;\n\n  /**\n   * Enable for pull requests coming from forks\n   * @default false\n   */\n  readonly pullRequestsFromForks?: boolean;\n\n  /**\n   * Add a check to pull requests\n   * @default true\n   */\n  readonly addCheck?: boolean;\n\n  /**\n   * Add a \"Review in Gitpod\" button as a comment to pull requests\n   * @default false\n   */\n  readonly addComment?: boolean;\n\n  /**\n   * Add a \"Review in Gitpod\" button to the pull request's description\n   * @default false\n   */\n  readonly addBadge?: boolean;\n\n  /**\n   * Add a label once the prebuild is ready to pull requests\n   * @default false\n   */\n  readonly addLabel?: boolean;\n}\n\n/**\n * Constructor options for the Gitpod component.\n *\n * By default, Gitpod uses the 'gitpod/workspace-full' docker image.\n * @see https://github.com/gitpod-io/workspace-images/blob/master/full/Dockerfile\n *\n * By default, all tasks will be run in parallel. To run the tasks in sequence,\n * create a new task and specify the other tasks as subtasks.\n */\nexport interface GitpodOptions extends DevEnvironmentOptions {\n  /**\n   * Optional Gitpod's Github App integration for prebuilds\n   * If this is not set and Gitpod's Github App is installed, then Gitpod will apply\n   * these defaults: https://www.gitpod.io/docs/prebuilds/#configure-the-github-app\n   * @default undefined\n   */\n  readonly prebuilds?: GitpodPrebuilds;\n}\n\n/**\n * The Gitpod component which emits .gitpod.yml\n */\nexport class Gitpod extends Component implements IDevEnvironment {\n  private dockerImage: DevEnvironmentDockerImage | undefined;\n  private prebuilds: GitpodPrebuilds | undefined;\n  private readonly tasks = new Array<GitpodTask>();\n  private readonly ports = new Array<GitpodPort>();\n  private readonly vscodeExtensions = new Array<string>();\n\n  /**\n   * Direct access to the gitpod configuration (escape hatch)\n   */\n  public readonly config: any;\n\n  constructor(project: Project, options: GitpodOptions = {}) {\n    super(project);\n\n    this.dockerImage = options?.dockerImage;\n\n    if (options?.tasks) {\n      for (const task of options.tasks) {\n        this.addTasks(task);\n      }\n    }\n\n    if (options?.prebuilds) {\n      this.addPrebuilds(options.prebuilds);\n    }\n\n    if (options?.ports) {\n      this.addPorts(...options.ports);\n    }\n\n    if (options?.vscodeExtensions) {\n      this.addVscodeExtensions(...options.vscodeExtensions);\n    }\n\n    this.config = {\n      image: () => this.renderDockerImage(),\n      tasks: this.tasks,\n      github: () => this.renderPrebuilds(),\n      ports: this.ports,\n      vscode: {\n        extensions: this.vscodeExtensions,\n      },\n    };\n\n    new YamlFile(this.project, GITPOD_FILE, {\n      obj: this.config,\n      omitEmpty: true,\n      // GitPod needs to read the file from the repository in order to work.\n      committed: true,\n    });\n  }\n\n  /**\n   * Add a custom Docker image or Dockerfile for the container.\n   *\n   * @param image The Docker image\n   */\n  public addDockerImage(image: DevEnvironmentDockerImage) {\n    if (this.dockerImage) {\n      throw new Error(\"dockerImage cannot be redefined.\");\n    }\n    this.dockerImage = image;\n  }\n\n  /**\n   * Add tasks to run when gitpod starts.\n   *\n   * By default, all tasks will be run in parallel. To run tasks in sequence,\n   * create a new `Task` and specify the other tasks as subtasks.\n   *\n   * @param tasks The new tasks\n   */\n  public addTasks(...tasks: Task[]) {\n    this.tasks.push(\n      ...tasks.map((task) => ({\n        name: task.name,\n        command: `npx projen ${task.name}`,\n      }))\n    );\n  }\n\n  /**\n   * Add a prebuilds configuration for the Gitpod App\n   * @param config The configuration\n   */\n  public addPrebuilds(config: GitpodPrebuilds) {\n    this.prebuilds = config;\n  }\n\n  /**\n   * Add a task with more granular options.\n   *\n   * By default, all tasks will be run in parallel. To run tasks in sequence,\n   * create a new `Task` and set the other tasks as subtasks.\n   *\n   * @param options The task parameters\n   */\n  public addCustomTask(options: GitpodTask) {\n    this.tasks.push({\n      name: options.name,\n      command: options.command,\n      openMode: options.openMode,\n      openIn: options.openIn,\n      before: options.before,\n      init: options.init,\n      prebuild: options.prebuild,\n    });\n  }\n\n  /**\n   * Add ports that should be exposed (forwarded) from the container.\n   *\n   * @param ports The new ports\n   */\n  public addPorts(...ports: string[]) {\n    this.ports.push(...ports.map((port) => ({ port: port })));\n  }\n\n  /**\n   * Add a list of VSCode extensions that should be automatically installed\n   * in the container.\n   *\n   * These must be in the format defined in the Open VSX registry.\n   * @example 'scala-lang.scala@0.3.9:O5XmjwY5Gz+0oDZAmqneJw=='\n   * @see https://www.gitpod.io/docs/vscode-extensions/\n   *\n   * @param extensions The extension IDs\n   */\n  public addVscodeExtensions(...extensions: GitpodCodeExtensionId[]) {\n    this.vscodeExtensions.push(...extensions);\n  }\n\n  private renderDockerImage() {\n    if (this.dockerImage?.image) {\n      return this.dockerImage.image;\n    } else if (this.dockerImage?.dockerFile) {\n      return {\n        file: this.dockerImage.dockerFile,\n      };\n    } else {\n      return undefined;\n    }\n  }\n\n  private renderPrebuilds() {\n    if (this.prebuilds) {\n      return {\n        prebuilds: this.prebuilds,\n      };\n    } else {\n      return undefined;\n    }\n  }\n}\n\n/**\n * VS Code extensions as defined in the Open VSX registry\n * Example: `scala-lang.scala@0.3.9:O5XmjwY5Gz+0oDZAmqneJw==`\n */\ntype GitpodCodeExtensionId = string;\n"
  },
  {
    "path": "src/ignore-file.ts",
    "content": "import { FileBase, IResolver } from \"./file\";\nimport { Project } from \"./project\";\n\nexport class IgnoreFile extends FileBase {\n  private readonly _patterns = new Array<string>();\n\n  constructor(project: Project, filePath: string) {\n    super(project, filePath, { editGitignore: filePath !== \".gitignore\" });\n  }\n\n  /**\n   * Add ignore patterns. Files that match this pattern will be ignored. If the\n   * pattern starts with a negation mark `!`, files that match will _not_ be\n   * ignored.\n   *\n   * Comment lines (start with `#`) are ignored.\n   *\n   * @param patterns Ignore patterns.\n   */\n  public addPatterns(...patterns: string[]) {\n    for (const pattern of patterns) {\n      // skip comments\n      if (pattern.startsWith(\"#\")) {\n        continue;\n      }\n\n      this.normalizePatterns(pattern);\n\n      this._patterns.push(pattern);\n    }\n  }\n\n  private normalizePatterns(pattern: string) {\n    const opposite = pattern.startsWith(\"!\") ? pattern.slice(1) : \"!\" + pattern;\n    remove(this._patterns, pattern); // prevent duplicates\n    remove(this._patterns, opposite);\n\n    if (pattern.endsWith(\"/\")) {\n      const prefix = opposite;\n      for (const p of [...this._patterns]) {\n        if (p.startsWith(prefix)) {\n          remove(this._patterns, p);\n        }\n      }\n    }\n  }\n\n  /**\n   * Removes patterns previously added from the ignore file.\n   *\n   * If `addPattern()` is called after this, the pattern will be added again.\n   *\n   * @param patterns patters to remove.\n   */\n  public removePatterns(...patterns: string[]) {\n    for (const p of patterns) {\n      remove(this._patterns, p);\n    }\n  }\n\n  /**\n   * Ignore the files that match these patterns.\n   * @param patterns The patterns to match.\n   */\n  public exclude(...patterns: string[]) {\n    return this.addPatterns(...patterns);\n  }\n\n  /**\n   * Always include the specified file patterns.\n   * @param patterns Patterns to include in git commits.\n   */\n  public include(...patterns: string[]) {\n    for (let pattern of patterns) {\n      if (!pattern.startsWith(\"!\")) {\n        pattern = \"!\" + pattern;\n      }\n\n      this.addPatterns(pattern);\n    }\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const lines = [\n      ...(this.marker ? [`# ${this.marker}`] : []),\n      ...this._patterns,\n    ];\n\n    return `${resolver.resolve(lines).join(\"\\n\")}\\n`;\n  }\n}\n\n// O(n) hooray!\nfunction remove<T>(arr: T[], value: any) {\n  const idx = arr.indexOf(value);\n  if (idx >= 0) {\n    arr.splice(idx, 1);\n  }\n}\n"
  },
  {
    "path": "src/index.ts",
    "content": "export * from \"./component\";\nexport * from \"./dev-env\";\nexport * from \"./dependencies\";\nexport * from \"./docker-compose\";\nexport * from \"./file\";\nexport * from \"./gitattributes\";\nexport * from \"./gitpod\";\nexport * from \"./ignore-file\";\nexport * from \"./ini\";\nexport * from \"./json\";\nexport * from \"./json-patch\";\nexport * from \"./logger\";\nexport * from \"./license\";\nexport * from \"./makefile\";\nexport * from \"./object-file\";\nexport * from \"./option-hints\";\nexport * from \"./project\";\nexport * from \"./project-build\";\nexport * from \"./projects\";\nexport * from \"./projenrc-json\";\nexport * from \"./readme\";\nexport * from \"./renovatebot\";\nexport * from \"./sample-file\";\nexport * from \"./semver\";\nexport * from \"./source-code\";\nexport * from \"./task\";\nexport * from \"./tasks\";\nexport * from \"./task-model\";\nexport * from \"./task-runtime\";\nexport * from \"./testing\";\nexport * from \"./textfile\";\nexport * from \"./toml\";\nexport * from \"./version\";\nexport * from \"./yaml\";\nexport * from \"./xmlfile\";\n\n// export submobules\nexport * as web from \"./web\";\nexport * as github from \"./github\";\nexport * as gitlab from \"./gitlab\";\nexport * as circleci from \"./circleci\";\nexport * as vscode from \"./vscode\";\nexport * as java from \"./java\";\nexport * as python from \"./python\";\nexport * as typescript from \"./typescript\";\nexport * as javascript from \"./javascript\";\nexport * as release from \"./release\";\nexport * as awscdk from \"./awscdk\";\nexport * as cdk8s from \"./cdk8s\";\nexport * as cdktf from \"./cdktf\";\nexport * as cdk from \"./cdk\";\nexport * as build from \"./build\";\n"
  },
  {
    "path": "src/ini.ts",
    "content": "import * as INI from \"ini\";\nimport { IResolver } from \"./file\";\nimport { ObjectFile, ObjectFileOptions } from \"./object-file\";\nimport { Project } from \"./project\";\n\n/**\n * Options for `IniFile`.\n */\nexport interface IniFileOptions extends ObjectFileOptions {}\n\n/**\n * Represents an INI file.\n */\nexport class IniFile extends ObjectFile {\n  constructor(project: Project, filePath: string, options: IniFileOptions) {\n    super(project, filePath, options);\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const json = super.synthesizeContent(resolver);\n    if (!json) {\n      return undefined;\n    }\n\n    return [\n      ...(this.marker ? [`# ${this.marker}`] : []),\n      \"\",\n      INI.stringify(JSON.parse(json)),\n    ].join(\"\\n\");\n  }\n}\n"
  },
  {
    "path": "src/inventory.ts",
    "content": "import * as path from \"path\";\nimport { unzipSync } from \"zlib\";\nimport { snake } from \"case\";\nimport * as fs from \"fs-extra\";\n\nconst PROJEN_MODULE_ROOT = path.join(__dirname, \"..\");\nconst PROJECT_BASE_FQN = \"projen.Project\";\n\ntype JsiiTypes = { [name: string]: JsiiType };\n\nexport interface ProjectOption {\n  path: string[];\n  name: string;\n  fqn?: string;\n  switch: string;\n  /** Simple type name, e.g. \"string\", \"boolean\", \"number\", \"EslintOptions\", \"MyEnum\". Collections are \"unknown\" */\n  simpleType: string;\n  /** Full JSII type, e.g. { primitive: \"string\" } or { collection: { elementtype: { primitive: 'string' }, kind: 'map' } } */\n  fullType: JsiiPropertyType;\n  kind?: \"class\" | \"enum\" | \"interface\";\n  jsonLike?: boolean;\n  parent: string;\n  docs?: string;\n  default?: string;\n  optional?: boolean;\n  deprecated?: boolean;\n  featured?: boolean;\n}\n\nexport interface ProjectType {\n  moduleName: string;\n  pjid: string;\n  fqn: string;\n  typename: string;\n  options: ProjectOption[];\n  docs?: string;\n  docsurl: string;\n}\n\ninterface JsiiType {\n  name: string;\n  assembly: string;\n  kind: string;\n  abstract?: boolean;\n  base?: string;\n  fqn: string;\n  interfaces?: string[];\n  initializer?: {\n    parameters?: Array<{\n      name: string;\n      type?: { fqn?: string };\n    }>;\n  };\n  properties?: Array<{\n    name: string;\n    docs: {\n      summary?: string;\n      default?: string;\n      deprecated?: string;\n      stability?: string;\n      custom?: { [name: string]: string };\n    };\n    optional?: boolean;\n    type?: JsiiPropertyType;\n  }>;\n  docs?: {\n    summary?: string;\n    deprecated?: string;\n    custom?: {\n      pjid?: string;\n    };\n  };\n}\n\nexport interface JsiiPropertyType {\n  primitive?: string;\n  fqn?: string;\n  collection?: {\n    elementtype: JsiiPropertyType;\n    kind: string;\n  };\n}\n\n/**\n * Returns a list of project types exported the modules defined in `moduleDirs`.\n * This list will always also include the built-in projen project types.\n * Modules without a .jsii manifest are skipped.\n *\n * @param moduleDirs A list of npm module directories\n */\nexport function discover(...moduleDirs: string[]) {\n  const jsii = discoverJsiiTypes(...moduleDirs);\n\n  const result = new Array<ProjectType>();\n\n  for (const fqn of Object.keys(jsii)) {\n    if (isProjectType(jsii, fqn)) {\n      const p = toProjectType(jsii, fqn);\n      result.push(p);\n    }\n  }\n\n  return result.sort((r1, r2) => r1.pjid.localeCompare(r2.pjid));\n}\n\nexport function readManifest(dir: string) {\n  const jsiiFile = path.join(dir, \".jsii\");\n  if (!fs.existsSync(jsiiFile)) {\n    return undefined;\n  } // no jsii manifest\n  let manifest = fs.readJsonSync(jsiiFile);\n\n  if (manifest.schema === \"jsii/file-redirect\") {\n    const compressedFile = path.join(dir, manifest.filename);\n\n    if (!fs.existsSync(compressedFile)) {\n      throw new Error(`${compressedFile} does not exist.`);\n    }\n\n    switch (manifest.compression) {\n      case \"gzip\":\n        manifest = JSON.parse(\n          unzipSync(fs.readFileSync(compressedFile)).toString()\n        );\n        break;\n      default:\n        throw new Error(\n          `Unsupported compression format: ${manifest.compression}`\n        );\n    }\n  }\n\n  return manifest;\n}\n\n/**\n * Resolve all jsii types from @modulesDirs.\n * When a jsii module is found it will recusively list the types from the dependant module as well\n *\n * @param moduleDirs\n * @returns\n */\nfunction discoverJsiiTypes(...moduleDirs: string[]) {\n  const jsii: JsiiTypes = {};\n  const discoveredManifests: Array<string> = [];\n\n  const discoverJsii = (dir: string) => {\n    const manifest = readManifest(dir);\n\n    if (!manifest) {\n      return;\n    }\n\n    if (discoveredManifests.includes(manifest.fingerprint)) {\n      return;\n    }\n    discoveredManifests.push(manifest.fingerprint);\n\n    for (const [fqn, type] of Object.entries(manifest.types as JsiiTypes)) {\n      jsii[fqn] = {\n        ...type,\n      };\n    }\n\n    // Also search recursively in nested project dependencies. If the requested module is an external module\n    // this will also end-up in the projen module and add the projen types\n    if (manifest.dependencies) {\n      for (const dependency of Object.keys(manifest.dependencies)) {\n        const nestedDependencyFolder = path.dirname(\n          require.resolve(`${dependency}/package.json`, {\n            paths: [dir],\n          })\n        );\n\n        if (fs.existsSync(nestedDependencyFolder)) {\n          discoverJsii(nestedDependencyFolder);\n        }\n      }\n    }\n  };\n\n  // read all .jsii manifests from all requested modules and merge\n  // them all into a single map of fqn->type.\n  for (const dir of [...moduleDirs, PROJEN_MODULE_ROOT]) {\n    discoverJsii(dir);\n\n    // Read from scoped packages\n    if (dir.includes(\"@\") && fs.lstatSync(dir).isDirectory()) {\n      const childDirs = fs.readdirSync(dir).map((file) => path.join(dir, file));\n      for (const child of childDirs) {\n        discoverJsii(child);\n      }\n    }\n  }\n\n  return jsii;\n}\n\nexport function resolveProjectType(projectFqn: string): ProjectType {\n  let [moduleName] = projectFqn.split(\".\");\n  if (moduleName === \"projen\") {\n    moduleName = PROJEN_MODULE_ROOT;\n  }\n\n  // try picking the manifest. We only need the base folder but this is directly a nice check if we request from a valid jsii package\n  const jsiiManifestFile = require.resolve(`${moduleName}/.jsii`, {\n    paths: [process.cwd()],\n  });\n  const moduleFolder = path.dirname(jsiiManifestFile);\n\n  // Read all jsii types that can be loaded from this project type\n  const jsii = discoverJsiiTypes(moduleFolder);\n  return toProjectType(jsii, projectFqn);\n}\n\nfunction toProjectType(jsii: JsiiTypes, fqn: string): ProjectType {\n  if (!isProjectType(jsii, fqn)) {\n    throw new Error(\n      `Fully qualified name \"${fqn}\" is not a valid project type.`\n    );\n  }\n\n  const typeinfo = jsii[fqn];\n\n  // projen.web.ReactProject -> web.ReactProject\n  const typename = fqn.substring(fqn.indexOf(\".\") + 1);\n\n  const docsurl = `https://projen.io/api/API.html#projen-${typename\n    .toLocaleLowerCase()\n    .replace(/\\./g, \"-\")}`;\n  let pjid =\n    typeinfo.docs?.custom?.pjid ?? snake(typename).replace(/_project$/, \"\");\n  return {\n    moduleName: typeinfo.assembly,\n    typename,\n    pjid,\n    fqn,\n    options: discoverOptions(jsii, fqn).sort((o1, o2) =>\n      o1.name.localeCompare(o2.name)\n    ),\n    docs: typeinfo.docs?.summary,\n    docsurl,\n  } as ProjectType;\n}\n\nexport function readJsiiManifest(jsiiFqn: string): any {\n  let [moduleName] = jsiiFqn.split(\".\");\n  if (moduleName === \"projen\") {\n    moduleName = PROJEN_MODULE_ROOT;\n  }\n\n  const jsiiManifestFile = require.resolve(`${moduleName}/.jsii`);\n  return fs.readJsonSync(jsiiManifestFile);\n}\n\nfunction discoverOptions(jsii: JsiiTypes, fqn: string): ProjectOption[] {\n  const options: { [name: string]: ProjectOption } = {};\n  const params = jsii[fqn]?.initializer?.parameters ?? [];\n  const optionsParam = params[0];\n  const optionsTypeFqn = optionsParam?.type?.fqn;\n\n  if (\n    params.length > 1 ||\n    (params.length === 1 && optionsParam?.name !== \"options\")\n  ) {\n    throw new Error(\n      `constructor for project ${fqn} must have a single \"options\" argument of a struct type. got ${JSON.stringify(\n        params\n      )}`\n    );\n  }\n\n  addOptions(optionsTypeFqn);\n\n  const opts = Object.values(options);\n\n  return opts.sort((a, b) => a.switch.localeCompare(b.switch));\n\n  function addOptions(\n    ofqn?: string,\n    basePath: string[] = [],\n    optional = false\n  ) {\n    if (!ofqn) {\n      return;\n    }\n\n    const struct = jsii[ofqn];\n    if (!struct) {\n      throw new Error(`unable to find options type ${ofqn} for project ${fqn}`);\n    }\n\n    for (const prop of struct.properties ?? []) {\n      const propPath = [...basePath, prop.name];\n\n      // protect against double-booking\n      if (prop.name in options) {\n        throw new Error(\n          `duplicate option \"${prop.name}\" in ${fqn} (already declared in ${\n            options[prop.name].parent\n          })`\n        );\n      }\n\n      let jsiiKind;\n      if (prop.type?.fqn) {\n        jsiiKind = jsii[prop.type?.fqn].kind; // e.g. 'class', 'interface', 'enum'\n      }\n\n      const isOptional = optional || prop.optional;\n      let defaultValue = prop.docs?.default;\n\n      if (defaultValue === \"undefined\") {\n        defaultValue = undefined;\n      }\n\n      // if this is a mandatory option and we have a default value, it has to be JSON-parsable to the correct type\n      if (!isOptional && defaultValue) {\n        if (!prop.type?.primitive) {\n          throw new Error(\n            `required option \"${\n              prop.name\n            }\" with a @default must use primitive types (string, number or boolean). type found is: ${JSON.stringify(\n              prop.type\n            )}`\n          );\n        }\n\n        checkDefaultIsParsable(prop.name, defaultValue, prop.type?.primitive);\n      }\n\n      options[prop.name] = filterUndefined({\n        path: propPath,\n        parent: struct.name,\n        name: prop.name,\n        fqn: prop.type?.fqn,\n        docs: prop.docs.summary,\n        simpleType: prop.type ? getSimpleTypeName(prop.type) : \"unknown\",\n        fullType: prop.type,\n        kind: jsiiKind,\n        jsonLike: prop.type ? isJsonLike(jsii, prop.type) : undefined,\n        switch: propPath.map((p) => snake(p).replace(/_/g, \"-\")).join(\"-\"),\n        default: defaultValue,\n        optional: isOptional,\n        featured: prop.docs?.custom?.featured === \"true\",\n        deprecated: prop.docs.stability === \"deprecated\" ? true : undefined,\n      });\n    }\n\n    for (const ifc of struct.interfaces ?? []) {\n      addOptions(ifc);\n    }\n  }\n}\n\nfunction getSimpleTypeName(type: JsiiPropertyType): string {\n  if (type?.primitive) {\n    return type.primitive; // e.g. 'string', 'boolean', 'number'\n  } else if (type?.fqn) {\n    return type.fqn.split(\".\").pop()!; // projen.NodeProjectOptions -> NodeProjectOptions\n  } else {\n    // any other types such as collection types\n    return \"unknown\";\n  }\n}\n\n/**\n * Whether a value of this type is serializable into JSON.\n */\nfunction isJsonLike(jsii: JsiiTypes, type: JsiiPropertyType): boolean {\n  if (type.primitive) {\n    // string, boolean, number, any\n    return true;\n  } else if (type.fqn) {\n    const kind = jsii[type.fqn].kind;\n    if ([\"interface\", \"enum\"].includes(kind)) {\n      // not 'class'\n      return true;\n    }\n  } else if (type.collection) {\n    return isJsonLike(jsii, type.collection.elementtype);\n  }\n  return false;\n}\n\nfunction filterUndefined(obj: any) {\n  const ret: any = {};\n  for (const [k, v] of Object.entries(obj)) {\n    if (v !== undefined) {\n      ret[k] = v;\n    }\n  }\n  return ret;\n}\n\nfunction isProjectType(jsii: JsiiTypes, fqn: string) {\n  const type = jsii[fqn];\n\n  if (!type) {\n    throw new Error(\n      `Could not find project type with fqn \"${fqn}\" in  .jsii file.`\n    );\n  }\n\n  if (type.kind !== \"class\") {\n    return false;\n  }\n  if (type.abstract) {\n    return false;\n  }\n\n  if (type.docs?.deprecated) {\n    return false;\n  }\n\n  let curr = type;\n  while (true) {\n    if (curr.fqn === PROJECT_BASE_FQN) {\n      return true;\n    }\n\n    if (!curr.base) {\n      return false;\n    }\n\n    curr = jsii[curr.base];\n    if (!curr) {\n      return false;\n    }\n  }\n}\n\nfunction checkDefaultIsParsable(prop: string, value: string, type: string) {\n  // macros are pass-through\n  if (value.startsWith(\"$\")) {\n    return;\n  }\n  try {\n    const parsed = JSON.parse(value);\n    if (typeof parsed !== type) {\n      throw new Error(\n        `cannot parse @default value for mandatory option ${prop} as a ${type}: ${parsed}`\n      );\n    }\n  } catch (e) {\n    throw new Error(\n      `unable to JSON.parse() value \"${value}\" specified as @default for mandatory option \"${prop}\": ${\n        (e as any).message\n      }`\n    );\n  }\n}\n"
  },
  {
    "path": "src/java/index.ts",
    "content": "export * from \"./pom\";\nexport * from \"./java-project\";\nexport * from \"./maven-sample\";\nexport * from \"./maven-compile\";\nexport * from \"./maven-packaging\";\nexport * from \"./junit\";\nexport * from \"./projenrc\";\n"
  },
  {
    "path": "src/java/java-project.ts",
    "content": "import { GitHubProject, GitHubProjectOptions } from \"../github\";\nimport { anySelected, multipleSelected } from \"../util\";\nimport { Junit, JunitOptions } from \"./junit\";\nimport { MavenCompile, MavenCompileOptions } from \"./maven-compile\";\nimport { MavenPackaging, MavenPackagingOptions } from \"./maven-packaging\";\nimport { MavenSample } from \"./maven-sample\";\nimport { PluginOptions, Pom, PomOptions } from \"./pom\";\nimport { Projenrc as ProjenrcJava, ProjenrcOptions } from \"./projenrc\";\n\n/**\n * Options for `JavaProject`.\n */\nexport interface JavaProjectCommonOptions\n  extends GitHubProjectOptions,\n    PomOptions {\n  /**\n   * Final artifact output directory.\n   *\n   * @default \"dist/java\"\n   */\n  readonly distdir?: string;\n\n  // -- dependencies --\n\n  /**\n   * List of runtime dependencies for this project.\n   *\n   * Dependencies use the format: `<groupId>/<artifactId>@<semver>`\n   *\n   * Additional dependencies can be added via `project.addDependency()`.\n   *\n   * @default []\n   * @featured\n   */\n  readonly deps?: string[];\n\n  /**\n   * List of test dependencies for this project.\n   *\n   * Dependencies use the format: `<groupId>/<artifactId>@<semver>`\n   *\n   * Additional dependencies can be added via `project.addTestDependency()`.\n   *\n   * @default []\n   * @featured\n   */\n  readonly testDeps?: string[];\n\n  // -- components --\n\n  /**\n   * Include junit tests.\n   * @default true\n   */\n  readonly junit?: boolean;\n\n  /**\n   * junit options\n   * @default - defaults\n   */\n  readonly junitOptions?: JunitOptions;\n\n  /**\n   * Packaging options.\n   * @default - defaults\n   */\n  readonly packagingOptions?: MavenPackagingOptions;\n\n  /**\n   * Compile options.\n   * @default - defaults\n   */\n  readonly compileOptions?: MavenCompileOptions;\n\n  /**\n   * Use projenrc in java.\n   *\n   * This will install `projen` as a java dependency and will add a `synth` task which\n   * will compile & execute `main()` from `src/main/java/projenrc.java`.\n   *\n   * @default true\n   */\n  readonly projenrcJava?: boolean;\n\n  /**\n   * Options related to projenrc in java.\n   * @default - default options\n   */\n  readonly projenrcJavaOptions?: ProjenrcOptions;\n}\n\n/**\n * Options for `JavaProject`.\n */\nexport interface JavaProjectOptions extends JavaProjectCommonOptions {\n  /**\n   * Include sample code and test if the relevant directories don't exist.\n   * @default true\n   */\n  readonly sample?: boolean;\n\n  /**\n   * The java package to use for the code sample.\n   * @default \"org.acme\"\n   */\n  readonly sampleJavaPackage?: string;\n}\n\n/**\n * Java project.\n *\n * @pjid java\n */\nexport class JavaProject extends GitHubProject {\n  /**\n   * API for managing `pom.xml`.\n   */\n  public readonly pom: Pom;\n\n  /**\n   * JUnit component.\n   */\n  public readonly junit?: Junit;\n\n  /**\n   * Packaging component.\n   */\n  public readonly packaging: MavenPackaging;\n\n  /**\n   * Compile component.\n   */\n  public readonly compile: MavenCompile;\n\n  /**\n   * Projenrc component.\n   */\n  public readonly projenrc?: ProjenrcJava;\n\n  /**\n   * Maven artifact output directory.\n   */\n  public readonly distdir: string;\n\n  constructor(options: JavaProjectOptions) {\n    super(options);\n\n    this.distdir = options.distdir ?? \"dist/java\";\n    this.pom = new Pom(this, options);\n\n    const rcFileTypeOptions = [options.projenrcJava, options.projenrcJson];\n\n    if (multipleSelected(rcFileTypeOptions)) {\n      throw new Error(\n        \"Only one of projenrcJava and projenrcJson can be selected.\"\n      );\n    }\n\n    // default to projenrc.java if no other projenrc type was elected\n    if (options.projenrcJava ?? !anySelected(rcFileTypeOptions)) {\n      this.projenrc = new ProjenrcJava(\n        this,\n        this.pom,\n        options.projenrcJavaOptions\n      );\n    }\n\n    const sampleJavaPackage = options.sampleJavaPackage ?? \"org.acme\";\n\n    if (options.junit ?? true) {\n      this.junit = new Junit(this, {\n        pom: this.pom,\n        sampleJavaPackage,\n        ...options.junitOptions,\n      });\n    }\n\n    if (options.sample ?? true) {\n      new MavenSample(this, { package: sampleJavaPackage });\n    }\n\n    // platform independent build\n    this.pom.addProperty(\"project.build.sourceEncoding\", \"UTF-8\");\n\n    this.gitignore.exclude(\".classpath\");\n    this.gitignore.exclude(\".project\");\n    this.gitignore.exclude(\".settings\");\n\n    this.compile = new MavenCompile(this, this.pom, options.compileOptions);\n    this.packaging = new MavenPackaging(\n      this,\n      this.pom,\n      options.packagingOptions\n    );\n\n    this.addPlugin(\"org.apache.maven.plugins/maven-enforcer-plugin@3.0.0-M3\", {\n      executions: [{ id: \"enforce-maven\", goals: [\"enforce\"] }],\n      configuration: {\n        rules: [{ requireMavenVersion: [{ version: \"3.6\" }] }],\n      },\n    });\n\n    for (const dep of options.deps ?? []) {\n      this.addDependency(dep);\n    }\n\n    for (const dep of options.testDeps ?? []) {\n      this.addTestDependency(dep);\n    }\n  }\n\n  /**\n   * Adds a runtime dependency.\n   *\n   * @param spec Format `<groupId>/<artifactId>@<semver>`\n   */\n  public addDependency(spec: string) {\n    return this.pom.addDependency(spec);\n  }\n\n  /**\n   * Adds a test dependency.\n   *\n   * @param spec Format `<groupId>/<artifactId>@<semver>`\n   */\n  public addTestDependency(spec: string) {\n    return this.pom.addTestDependency(spec);\n  }\n\n  /**\n   * Adds a build plugin to the pom.\n   *\n   * The plug in is also added as a BUILD dep to the project.\n   *\n   * @param spec dependency spec (`group/artifact@version`)\n   * @param options plugin options\n   */\n  public addPlugin(spec: string, options: PluginOptions = {}) {\n    return this.pom.addPlugin(spec, options);\n  }\n}\n"
  },
  {
    "path": "src/java/junit.ts",
    "content": "import { join } from \"path\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { SampleDir } from \"../sample-file\";\nimport { Pom } from \"./pom\";\n\nconst TESTDIR = join(\"src\", \"test\", \"java\");\n\n/**\n * Options for `Junit`.\n */\nexport interface JunitOptions {\n  /**\n   * Java pom.\n   */\n  readonly pom: Pom;\n\n  /**\n   * Junit version\n   *\n   * @default \"5.7.0\"\n   */\n  readonly version?: string;\n\n  /**\n   * Java package for test sample.\n   * @default \"org.acme\"\n   */\n  readonly sampleJavaPackage?: string;\n}\n\n/**\n * Implements JUnit-based testing.\n */\nexport class Junit extends Component {\n  constructor(project: Project, options: JunitOptions) {\n    super(project);\n\n    const pom = options.pom;\n    const version = options.version ?? \"5.7.0\";\n\n    pom.addTestDependency(`org.junit.jupiter/junit-jupiter-api@${version}`);\n    pom.addTestDependency(`org.junit.jupiter/junit-jupiter-engine@${version}`);\n\n    project.testTask.exec(\"mvn test\");\n\n    const javaPackage = options.sampleJavaPackage ?? \"org.acme\";\n    const javaPackagePath = javaPackage.split(\".\");\n    new SampleDir(project, join(TESTDIR, ...javaPackagePath), {\n      files: {\n        \"MyTest.java\": [\n          `package ${javaPackage};`,\n          \"\",\n          \"import org.junit.jupiter.api.Test;\",\n          \"\",\n          \"public class MyTest {\",\n          \"  @Test\",\n          \"  public void testHello() {\",\n          '    System.out.println(\"Hello, world!\");',\n          \"  }\",\n          \"}\",\n        ].join(\"\\n\"),\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/java/maven-compile.ts",
    "content": "import { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { Pom } from \"./pom\";\n\n/**\n * Options for `MavenCompile`.\n */\nexport interface MavenCompileOptions {\n  /**\n   * Source language version.\n   *\n   * @default \"1.8\"\n   */\n  readonly source?: string;\n\n  /**\n   * Target JVM version.\n   *\n   * @default \"1.8\"\n   */\n  readonly target?: string;\n}\n\n/**\n * Adds the maven-compiler plugin to a POM file and the `compile` task.\n */\nexport class MavenCompile extends Component {\n  constructor(project: Project, pom: Pom, options: MavenCompileOptions = {}) {\n    super(project);\n\n    project.gitignore.exclude(\"target\");\n\n    pom.addPlugin(\"org.apache.maven.plugins/maven-compiler-plugin@3.8.1\", {\n      configuration: {\n        source: options.source ?? \"1.8\",\n        target: options.target ?? \"1.8\",\n      },\n    });\n\n    project.compileTask.exec(\"mvn compiler:compile\");\n  }\n}\n"
  },
  {
    "path": "src/java/maven-packaging.ts",
    "content": "import { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { Pom } from \"./pom\";\n\n/**\n * Options for `MavenPackage`.\n */\nexport interface MavenPackagingOptions {\n  /**\n   * Include sources jar in package.\n   * @default true\n   */\n  readonly sources?: boolean;\n\n  /**\n   * Where to place the package output?\n   * @default \"dist/java\"\n   */\n  readonly distdir?: string;\n\n  /**\n   * Include javadocs jar in package.\n   * @default true\n   */\n  readonly javadocs?: boolean;\n\n  /**\n   * Exclude source files from docs.\n   * @default []\n   */\n  readonly javadocsExclude?: string[];\n}\n\n/**\n * Configures a maven project to produce a .jar archive with sources and javadocs.\n */\nexport class MavenPackaging extends Component {\n  constructor(project: Project, pom: Pom, options: MavenPackagingOptions = {}) {\n    super(project);\n\n    pom.addPlugin(\"org.apache.maven.plugins/maven-jar-plugin@3.2.0\", {\n      configuration: {\n        archive: {\n          index: true,\n          manifest: {\n            addDefaultImplementationEntries: true,\n            addDefaultSpecificationEntries: true,\n          },\n        },\n      },\n    });\n\n    if (options.sources ?? true) {\n      pom.addPlugin(\"org.apache.maven.plugins/maven-source-plugin@3.2.1\", {\n        executions: [{ id: \"attach-sources\", goals: [\"jar\"] }],\n      });\n    }\n\n    if (options.javadocs ?? true) {\n      pom.addPlugin(\"org.apache.maven.plugins/maven-javadoc-plugin@3.2.0\", {\n        executions: [{ id: \"attach-javadocs\", goals: [\"jar\"] }],\n        configuration: {\n          failOnError: false,\n          show: \"protected\",\n          sourceFileExcludes: { exclude: options.javadocsExclude },\n          detectJavaApiLink: false, // https://stackoverflow.com/a/61884267\n          additionalJOptions: {\n            additionalJOption: [\n              \"-J-XX:+TieredCompilation\",\n              \"-J-XX:TieredStopAtLevel=1\",\n            ],\n          },\n        },\n      });\n    }\n\n    const env = {\n      MAVEN_OPTS: \"-XX:+TieredCompilation -XX:TieredStopAtLevel=1\",\n    };\n\n    const distdir = options.distdir ?? \"dist/java\";\n\n    for (const [k, v] of Object.entries(env)) {\n      this.project.packageTask.env(k, v);\n    }\n    this.project.packageTask.exec(`mkdir -p ${distdir}`);\n    this.project.packageTask.exec(\n      `mvn deploy -D=altDeploymentRepository=local::default::file:///$PWD/${distdir}`\n    );\n\n    project.gitignore.exclude(distdir);\n  }\n}\n"
  },
  {
    "path": "src/java/maven-sample.ts",
    "content": "import { join } from \"path\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { SampleDir } from \"../sample-file\";\n\nexport interface MavenSampleOptions {\n  /**\n   * Project root java package.\n   */\n  readonly package: string;\n}\n\n/**\n * Java code sample.\n */\nexport class MavenSample extends Component {\n  constructor(project: Project, options: MavenSampleOptions) {\n    super(project);\n\n    const pkg = options.package.split(\".\");\n    new SampleDir(project, join(\"src\", \"main\", \"java\", ...pkg), {\n      files: {\n        \"Main.java\": [\n          ...(options.package ? [`package ${options.package};`] : []),\n          \"\",\n          \"public class Main {\",\n          \"  public static void main(final String[] args) {\",\n          '    System.out.println(\"Hello, world!\");',\n          \"  }\",\n          \"}\",\n        ].join(\"\\n\"),\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/java/pom.ts",
    "content": "import { resolve } from \"../_resolve\";\nimport { Component } from \"../component\";\nimport {\n  Dependencies,\n  DependencyCoordinates,\n  DependencyType,\n} from \"../dependencies\";\nimport { Project } from \"../project\";\nimport { toMavenVersionRange } from \"../util/semver\";\nimport { XmlFile } from \"../xmlfile\";\n\nconst POM_XML_ATTRS = {\n  \"@xsi:schemaLocation\":\n    \"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\",\n  \"@xmlns\": \"http://maven.apache.org/POM/4.0.0\",\n  \"@xmlns:xsi\": \"http://www.w3.org/2001/XMLSchema-instance\",\n};\n\n/**\n * Options for `Pom`.\n */\nexport interface PomOptions {\n  /**\n   * This is generally unique amongst an organization or a project. For example,\n   * all core Maven artifacts do (well, should) live under the groupId\n   * org.apache.maven. Group ID's do not necessarily use the dot notation, for\n   * example, the junit project. Note that the dot-notated groupId does not have\n   * to correspond to the package structure that the project contains. It is,\n   * however, a good practice to follow. When stored within a repository, the\n   * group acts much like the Java packaging structure does in an operating\n   * system. The dots are replaced by OS specific directory separators (such as\n   * '/' in Unix) which becomes a relative directory structure from the base\n   * repository. In the example given, the org.codehaus.mojo group lives within\n   * the directory $M2_REPO/org/codehaus/mojo.\n   * @default \"org.acme\"\n   * @featured\n   */\n  readonly groupId: string;\n\n  /**\n   * The artifactId is generally the name that the project is known by. Although\n   * the groupId is important, people within the group will rarely mention the\n   * groupId in discussion (they are often all be the same ID, such as the\n   * MojoHaus project groupId: org.codehaus.mojo). It, along with the groupId,\n   * creates a key that separates this project from every other project in the\n   * world (at least, it should :) ). Along with the groupId, the artifactId\n   * fully defines the artifact's living quarters within the repository. In the\n   * case of the above project, my-project lives in\n   * $M2_REPO/org/codehaus/mojo/my-project.\n   * @default \"my-app\"\n   * @featured\n   */\n  readonly artifactId: string;\n\n  /**\n   * This is the last piece of the naming puzzle. groupId:artifactId denotes a\n   * single project but they cannot delineate which incarnation of that project\n   * we are talking about. Do we want the junit:junit of 2018 (version 4.12), or\n   * of 2007 (version 3.8.2)? In short: code changes, those changes should be\n   * versioned, and this element keeps those versions in line. It is also used\n   * within an artifact's repository to separate versions from each other.\n   * my-project version 1.0 files live in the directory structure\n   * $M2_REPO/org/codehaus/mojo/my-project/1.0.\n   * @default \"0.1.0\"\n   * @featured\n   */\n  readonly version: string;\n\n  /**\n   * Project packaging format.\n   *\n   * @default \"jar\"\n   */\n  readonly packaging?: string;\n\n  /**\n   * Description of a project is always good. Although this should not replace\n   * formal documentation, a quick comment to any readers of the POM is always\n   * helpful.\n   *\n   * @default undefined\n   * @featured\n   */\n  readonly description?: string;\n\n  /**\n   * The URL, like the name, is not required. This is a nice gesture for\n   * projects users, however, so that they know where the project lives.\n   *\n   * @default undefined\n   * @featured\n   */\n  readonly url?: string;\n}\n\n/**\n * Represents a Maven repository\n * @see https://maven.apache.org/guides/introduction/introduction-to-repositories.html\n */\nexport interface MavenRepository {\n  /**\n   * The identifier for the repository\n   */\n  readonly id: string;\n  /**\n   * The url of the repository\n   */\n  readonly url: string;\n  /**\n   * The name of the repository\n   */\n  readonly name?: string;\n  /**\n   * The layout of the repository\n   */\n  readonly layout?: string;\n}\n\n/**\n * A Project Object Model or POM is the fundamental unit of work in Maven. It is\n * an XML file that contains information about the project and configuration\n * details used by Maven to build the project.\n */\nexport class Pom extends Component {\n  /**\n   * The name of the pom file.\n   */\n  public readonly fileName: string;\n\n  /**\n   * Maven group ID.\n   */\n  public readonly groupId: string;\n\n  /**\n   * Maven artifact ID.\n   */\n  public readonly artifactId: string;\n\n  /**\n   * Project version.\n   */\n  public readonly version: string;\n\n  /**\n   * Maven packaging format.\n   */\n  public readonly packaging: string;\n\n  /**\n   * Project display name.\n   */\n  public readonly name?: string;\n\n  /**\n   * Project description.\n   */\n  public readonly description?: string;\n\n  /**\n   * Project URL.\n   */\n  public readonly url?: string;\n\n  private readonly properties: Record<string, any> = {};\n\n  private readonly repositories: MavenRepository[] = [];\n\n  constructor(project: Project, options: PomOptions) {\n    super(project);\n\n    this.fileName = \"pom.xml\";\n    this.groupId = options.groupId;\n    this.artifactId = options.artifactId;\n    this.version = options.version;\n    this.packaging = options.packaging ?? \"jar\";\n    this.name = project.name;\n    this.description = options.description;\n    this.url = options.url;\n\n    new XmlFile(project, this.fileName, { obj: () => this.synthPom() });\n  }\n\n  /**\n   * Adds a key/value property to the pom.\n   * @param key the key\n   * @param value the value\n   */\n  public addProperty(key: string, value: string) {\n    this.properties[key] = value;\n  }\n\n  /**\n   * Adds a runtime dependency.\n   *\n   * @param spec Format `<groupId>/<artifactId>@<semver>`\n   */\n  public addDependency(spec: string) {\n    this.project.deps.addDependency(spec, DependencyType.RUNTIME);\n  }\n\n  /**\n   * Adds a test dependency.\n   *\n   * @param spec Format `<groupId>/<artifactId>@<semver>`\n   */\n  public addTestDependency(spec: string) {\n    this.project.deps.addDependency(spec, DependencyType.TEST);\n  }\n\n  /**\n   * Adds a build plugin to the pom.\n   *\n   * The plug in is also added as a BUILD dep to the project.\n   *\n   * @param spec dependency spec (`group/artifact@version`)\n   * @param options plugin options\n   */\n  public addPlugin(spec: string, options: PluginOptions = {}) {\n    for (const dep of options.dependencies ?? []) {\n      this.project.deps.addDependency(dep, DependencyType.BUILD);\n    }\n    return this.project.deps.addDependency(spec, DependencyType.BUILD, options);\n  }\n\n  /**\n   * Adds a repository to the pom\n   * @param repository the repository to add\n   */\n  public addRepository(repository: MavenRepository) {\n    this.repositories.push(repository);\n  }\n\n  private synthPom() {\n    return resolve(\n      {\n        project: {\n          ...POM_XML_ATTRS,\n          modelVersion: \"4.0.0\",\n          groupId: this.groupId,\n          artifactId: this.artifactId,\n          version: this.version,\n          packaging: this.packaging,\n          name: this.name,\n          description: this.description,\n          url: this.url,\n          properties: this.properties,\n          ...this.synthRepositories(),\n          ...this.synthDependencies(),\n        },\n      },\n      { omitEmpty: true }\n    );\n  }\n\n  private synthDependencies() {\n    const deps = this.project.deps.all;\n    if (deps.length === 0) {\n      return;\n    }\n\n    const dependencies: any[] = [];\n    const plugins: any[] = [];\n\n    for (const dep of deps) {\n      switch (dep.type) {\n        case DependencyType.PEER:\n        case DependencyType.RUNTIME:\n          dependencies.push(mavenCoords(dep));\n          break;\n\n        case DependencyType.TEST:\n          dependencies.push({\n            ...mavenCoords(dep),\n            scope: \"test\",\n          });\n          break;\n\n        // build maps to plugins\n        case DependencyType.BUILD:\n          plugins.push({\n            ...mavenCoords(dep),\n            ...pluginConfig(dep.metadata as PluginOptions),\n          });\n          break;\n\n        default:\n          throw new Error(`unsupported dependency type: ${dep.type}`);\n      }\n    }\n\n    return {\n      build: { plugins: { plugin: plugins } },\n      dependencies: { dependency: dependencies },\n    };\n  }\n\n  private synthRepositories() {\n    if (this.repositories.length === 0) {\n      return;\n    }\n\n    return {\n      repositories: { repository: this.repositories },\n    };\n  }\n}\n\n/**\n * Options for Maven plugins.\n */\nexport interface PluginOptions {\n  /**\n   * Plugin key/value configuration\n   * @default {}\n   */\n  readonly configuration?: { [key: string]: any };\n\n  /**\n   * Plugin executions\n   * @default []\n   */\n  readonly executions?: PluginExecution[];\n\n  /**\n   * You could configure the dependencies for the plugin.\n   *\n   * Dependencies are in `<groupId>/<artifactId>@<semver>` format.\n   *\n   * @default []\n   */\n  readonly dependencies?: string[];\n}\n\n/**\n * Plugin execution definition.\n */\nexport interface PluginExecution {\n  /**\n   * The ID.\n   */\n  readonly id: string;\n\n  /**\n   * Which Maven goals this plugin should be associated with.\n   */\n  readonly goals: string[];\n\n  /**\n   * The phase in which the plugin should execute.\n   */\n  readonly phase?: string;\n}\n\n/**\n * Parses maven groupId and artifactId from a dependency name.\n *\n *     name    <=> <groupId>/<artifactId>\n *     version <=> <version>\n */\nfunction mavenCoords(dep: DependencyCoordinates) {\n  const name = dep.name;\n  const parts = name.split(\"/\");\n  if (parts.length !== 2) {\n    throw new Error(\n      `invalid maven coordinates in dependency named \"${name}\". format is \"<groupId>/<artifactId>\". For example \"org.junit.jupiter/junit-jupiter-engine\"`\n    );\n  }\n\n  return {\n    groupId: parts[0],\n    artifactId: parts[1],\n    version: dep.version ? toMavenVersionRange(dep.version) : undefined,\n  };\n}\n\nfunction pluginConfig(options: PluginOptions = {}) {\n  return {\n    configuration: options.configuration,\n    dependencies:\n      options.dependencies && options.dependencies.length > 0\n        ? {\n            dependency: options.dependencies?.map((d) =>\n              mavenCoords(Dependencies.parseDependency(d))\n            ),\n          }\n        : undefined,\n    executions: options.executions?.map((e) => ({\n      execution: {\n        id: e.id,\n        goals: e.goals.map((goal) => ({ goal })),\n        phase: e.phase,\n      },\n    })),\n  };\n}\n"
  },
  {
    "path": "src/java/projenrc.ts",
    "content": "import { dirname, join } from \"path\";\nimport { existsSync, mkdirpSync, writeFileSync } from \"fs-extra\";\nimport { PROJEN_VERSION } from \"../common\";\nimport { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { ProjectOption, readJsiiManifest } from \"../inventory\";\nimport { Project } from \"../project\";\nimport { Pom } from \"./pom\";\n\n/**\n * Options for `Projenrc`.\n */\nexport interface ProjenrcOptions {\n  /**\n   * The name of the Java class which contains the `main()` method for projen.\n   * @default \"projenrc\"\n   */\n  readonly className?: string;\n\n  /**\n   * The projen version to use\n   * @default - current version\n   */\n  readonly projenVersion?: string;\n\n  /**\n   * Defines projenrc under the test scope instead of the main scope, which is\n   * reserved to the app. This means that projenrc will be under\n   * `src/test/java/projenrc.java` and projen will be defined as a test\n   * dependency. This enforces that application code does not take a dependency\n   * on projen code.\n   *\n   * If this is disabled, projenrc should be under\n   * `src/main/java/projenrc.java`.\n   *\n   * @default true\n   */\n  readonly testScope?: boolean;\n}\n\n/**\n * Allows writing projenrc files in java.\n *\n * This will install `org.projen/projen` as a Maven dependency and will add a\n * `synth` task which will compile & execute `main()` from\n * `src/main/java/projenrc.java`.\n */\nexport class Projenrc extends Component {\n  /**\n   * The name of the java class that includes the projen entrypoint.\n   */\n  public readonly className: string;\n\n  /**\n   * Whether the class is in the \"test\" or \"main\" scope?\n   */\n  private readonly testScope: boolean;\n\n  constructor(project: Project, pom: Pom, options: ProjenrcOptions = {}) {\n    super(project);\n\n    const projenVersion = options.projenVersion ?? PROJEN_VERSION;\n    this.className = options.className ?? \"projenrc\";\n    this.testScope = options.testScope ?? true;\n\n    const depType = this.testScope\n      ? DependencyType.TEST\n      : DependencyType.RUNTIME;\n    const execOpts = this.testScope ? ' -Dexec.classpathScope=\"test\"' : \"\";\n    const compileGoal = this.testScope\n      ? \"compiler:testCompile\"\n      : \"compiler:compile\";\n\n    project.deps.addDependency(\n      `io.github.cdklabs/projen@${projenVersion}`,\n      depType\n    );\n    pom.addPlugin(\"org.codehaus.mojo/exec-maven-plugin@3.0.0\");\n\n    // set up the \"default\" task which is the task executed when `projen` is executed for this project.\n    project.defaultTask?.exec(`mvn ${compileGoal} --quiet`);\n    project.defaultTask?.exec(\n      `mvn exec:java --quiet -Dexec.mainClass=${this.className}${execOpts}`\n    );\n\n    // if this is a new project, generate a skeleton for projenrc.java\n    this.generateProjenrc();\n  }\n\n  private generateProjenrc() {\n    const bootstrap = this.project.initProject;\n    if (!bootstrap) {\n      return;\n    }\n    const jsiiFqn = bootstrap.fqn;\n    const jsiiManifest = readJsiiManifest(jsiiFqn);\n    const jsiiType = jsiiManifest.types[jsiiFqn];\n    const javaTarget = jsiiManifest.targets.java;\n    const optionsTypeFqn = jsiiType.initializer?.parameters?.[0].type?.fqn;\n    if (!optionsTypeFqn) {\n      this.project.logger.warn(\n        \"cannot determine jsii type for project options\"\n      );\n      return;\n    }\n    const jsiiOptionsType = jsiiManifest.types[optionsTypeFqn];\n    if (!jsiiOptionsType) {\n      this.project.logger.warn(\n        `cannot find jsii type for project options: ${optionsTypeFqn}`\n      );\n      return;\n    }\n\n    const dir = this.testScope ? \"src/test/java\" : \"src/main/java\";\n    const split = this.className.split(\".\");\n    let javaClass: string, javaPackage: string[];\n    if (split.length === 1) {\n      javaClass = split[0];\n      javaPackage = [];\n    } else {\n      javaPackage = split.slice(0, split.length - 2);\n      javaClass = split[split.length - 1];\n    }\n\n    const javaFile = join(\n      this.project.outdir,\n      dir,\n      ...javaPackage,\n      javaClass + \".java\"\n    );\n\n    // skip if file exists\n    if (existsSync(javaFile)) {\n      return;\n    }\n\n    const lines = new Array<string>();\n\n    let indent = 0;\n    const emit = (line: string = \"\") =>\n      lines.push(\" \".repeat(indent * 4) + line);\n    const openBlock = (line: string = \"\") => {\n      emit(line + \" {\");\n      indent++;\n    };\n    const closeBlock = () => {\n      indent--;\n      emit(\"}\");\n    };\n\n    const optionFqns: Record<string, string> = generateJavaOptionNames(\n      bootstrap.type.options,\n      jsiiManifest\n    );\n\n    if (javaPackage.length > 0) {\n      emit(`package ${javaPackage.join(\".\")};`);\n      emit();\n    }\n\n    const { renderedOptions, imports } = renderJavaOptions(\n      2,\n      jsiiOptionsType.name,\n      optionFqns,\n      bootstrap.args\n    );\n\n    emit(`import ${getJavaImport(jsiiType, jsiiManifest)};`);\n    emit(`import ${getJavaImport(jsiiOptionsType, jsiiManifest)};`);\n    for (const optionTypeName of imports) {\n      emit(`import ${javaTarget.package}.${optionTypeName};`);\n    }\n    emit();\n    openBlock(`public class ${javaClass}`);\n    openBlock(\"public static void main(String[] args)\");\n    emit(\n      `${jsiiType.name} project = new ${jsiiType.name}(${renderedOptions});`\n    );\n    emit(\"project.synth();\");\n    closeBlock();\n    closeBlock();\n\n    mkdirpSync(dirname(javaFile));\n    writeFileSync(javaFile, lines.join(\"\\n\"));\n\n    this.project.logger.info(\n      `Project definition file was created at ${javaFile}`\n    );\n  }\n}\n\nexport function generateJavaOptionNames(\n  options: ProjectOption[],\n  jsiiManifest: any\n) {\n  const optionFqns: Record<string, string> = {};\n  for (const option of options) {\n    if (option.fqn && jsiiManifest.types[option.fqn]) {\n      optionFqns[option.name] = toJavaFullTypeName(\n        jsiiManifest.types[option.fqn]\n      );\n    }\n  }\n\n  return optionFqns;\n}\n\nfunction renderJavaOptions(\n  indent: number,\n  optionsTypeName: string,\n  optionFqns: Record<string, string>,\n  initOptions?: Record<string, any>\n) {\n  const imports = new Set<string>();\n  if (!initOptions || Object.keys(initOptions).length === 0) {\n    return { renderedOptions: \"\", imports }; // no options\n  }\n\n  const lines = [`${optionsTypeName}.builder()`];\n\n  for (const [name, value] of Object.entries(initOptions)) {\n    const { javaValue, importName } = toJavaValue(value, name, optionFqns);\n    if (importName) imports.add(importName);\n    lines.push(`.${toJavaProperty(name)}(${javaValue})`);\n  }\n\n  lines.push(\".build()\");\n\n  const renderedOptions = lines.join(`\\n${\" \".repeat((indent + 1) * 4)}`);\n  return { renderedOptions, imports };\n}\n\nfunction toJavaProperty(prop: string) {\n  return prop;\n}\n\nfunction toJavaValue(\n  value: any,\n  name: string,\n  optionFqns: Record<string, string>\n) {\n  if (typeof value === \"string\" && optionFqns[name] !== undefined) {\n    const parts = optionFqns[name].split(\".\");\n    const base = parts[parts.length - 1];\n    const choice = String(value).toUpperCase().replace(/-/g, \"_\");\n    return { javaValue: `${base}.${choice}`, importName: optionFqns[name] };\n  } else {\n    return { javaValue: JSON.stringify(value) };\n  }\n}\n\nfunction toJavaFullTypeName(jsiiType: any) {\n  return [jsiiType.namespace, jsiiType.name].filter((x) => x).join(\".\");\n}\n\nexport function getJavaImport(jsiiType: any, jsiiManifest: any) {\n  const packageName =\n    jsiiManifest?.submodules?.[`${jsiiType.assembly}.${jsiiType?.namespace}`]\n      ?.targets?.java?.package ||\n    [jsiiManifest.targets.java.package, jsiiType.namespace]\n      .filter((x) => x)\n      .join(\".\");\n\n  return `${packageName}.${jsiiType.name}`;\n}\n"
  },
  {
    "path": "src/javascript/bundler.ts",
    "content": "import { join } from \"path\";\nimport { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\nimport { renderBundleName } from \"./util\";\n\n/**\n * Options for `Bundler`.\n */\nexport interface BundlerOptions {\n  /**\n   * The semantic version requirement for `esbuild`.\n   *\n   * @default - no specific version (implies latest)\n   */\n  readonly esbuildVersion?: string;\n\n  /**\n   * Output directory for all bundles.\n   * @default \"assets\"\n   */\n  readonly assetsDir?: string;\n\n  /**\n   * Install the `bundle` command as a pre-compile phase.\n   *\n   * @default true\n   */\n  readonly addToPreCompile?: boolean;\n}\n\n/**\n * Adds support for bundling JavaScript applications and dependencies into a\n * single file. In the future, this will also supports bundling websites.\n */\nexport class Bundler extends Component {\n  /**\n   * Returns the `Bundler` instance associated with a project or `undefined` if\n   * there is no Bundler.\n   * @param project The project\n   * @returns A bundler\n   */\n  public static of(project: Project): Bundler | undefined {\n    const isBundler = (o: Component): o is Bundler => o instanceof Bundler;\n    return project.components.find(isBundler);\n  }\n\n  /**\n   * The semantic version requirement for `esbuild` (if defined).\n   */\n  public readonly esbuildVersion: string | undefined;\n\n  /**\n   * Root bundle directory.\n   */\n  public readonly bundledir: string;\n\n  private _task: Task | undefined;\n  private readonly addToPreCompile: boolean;\n\n  /**\n   * Creates a `Bundler`.\n   */\n  constructor(project: Project, options: BundlerOptions = {}) {\n    super(project);\n\n    this.esbuildVersion = options.esbuildVersion;\n    this.bundledir = options.assetsDir ?? \"assets\";\n    this.addToPreCompile = options.addToPreCompile ?? true;\n  }\n\n  /**\n   * Gets or creates the singleton \"bundle\" task of the project.\n   *\n   * If the project doesn't have a \"bundle\" task, it will be created and spawned\n   * during the pre-compile phase.\n   */\n  public get bundleTask(): Task {\n    if (!this._task) {\n      this.addBundlingSupport();\n      this._task = this.project.tasks.addTask(\"bundle\", {\n        description: \"Prepare assets\",\n      });\n\n      // install the bundle task into the pre-compile phase.\n      if (this.addToPreCompile) {\n        this.project.preCompileTask.spawn(this._task);\n      }\n    }\n\n    return this._task;\n  }\n\n  /**\n   * Adds a task to the project which bundles a specific entrypoint and all of\n   * its dependencies into a single javascript output file.\n   *\n   * @param entrypoint The relative path of the artifact within the project\n   * @param options Bundling options\n   */\n  public addBundle(entrypoint: string, options: AddBundleOptions): Bundle {\n    const name = renderBundleName(entrypoint);\n\n    const outdir = join(this.bundledir, name);\n    const outfile = join(outdir, options.outfile ?? \"index.js\");\n    const args = [\n      \"esbuild\",\n      \"--bundle\",\n      entrypoint,\n      `--target=\"${options.target}\"`,\n      `--platform=\"${options.platform}\"`,\n      `--outfile=\"${outfile}\"`,\n    ];\n\n    for (const x of options.externals ?? []) {\n      args.push(`--external:${x}`);\n    }\n\n    const sourcemap = options.sourcemap ?? false;\n    if (sourcemap) {\n      args.push(\"--sourcemap\");\n    }\n\n    const bundleTask = this.project.addTask(`bundle:${name}`, {\n      description: `Create a JavaScript bundle from ${entrypoint}`,\n      exec: args.join(\" \"),\n    });\n\n    this.bundleTask.spawn(bundleTask);\n\n    if (options.executable ?? false) {\n      bundleTask.exec(`chmod +x ${outfile}`);\n    }\n\n    let watchTask;\n    const watch = options.watchTask ?? true;\n    if (watch) {\n      watchTask = this.project.addTask(`bundle:${name}:watch`, {\n        description: `Continuously update the JavaScript bundle from ${entrypoint}`,\n        exec: `${args.join(\" \")} --watch`,\n      });\n    }\n\n    return {\n      bundleTask: bundleTask,\n      watchTask: watchTask,\n      outdir: outdir,\n      outfile: outfile,\n    };\n  }\n\n  /**\n   * Add bundling support to a project. This is called implicitly when\n   * `bundleTask` is referenced first. It adds the dependency on `esbuild`,\n   * gitignore/npmignore, etc.\n   */\n  private addBundlingSupport() {\n    const ignoreEntry = `/${this.bundledir}/`;\n    this.project.addGitIgnore(ignoreEntry);\n    this.project.addPackageIgnore(`!${ignoreEntry}`); // include in tarball\n    const dep = this.esbuildVersion\n      ? `esbuild@${this.esbuildVersion}`\n      : \"esbuild\";\n    this.project.deps.addDependency(dep, DependencyType.BUILD);\n  }\n}\n\nexport interface Bundle {\n  /**\n   * The task that produces this bundle.\n   */\n  readonly bundleTask: Task;\n\n  /**\n   * The \"watch\" task for this bundle.\n   */\n  readonly watchTask?: Task;\n\n  /**\n   * Location of the output file (relative to project root).\n   */\n  readonly outfile: string;\n\n  /**\n   * Base directory containing the output file (relative to project root).\n   */\n  readonly outdir: string;\n}\n\n/**\n * Options for bundling.\n */\nexport interface BundlingOptions {\n  /**\n   * You can mark a file or a package as external to exclude it from your build.\n   * Instead of being bundled, the import will be preserved (using require for\n   * the iife and cjs formats and using import for the esm format) and will be\n   * evaluated at run time instead.\n   *\n   * This has several uses. First of all, it can be used to trim unnecessary\n   * code from your bundle for a code path that you know will never be executed.\n   * For example, a package may contain code that only runs in node but you will\n   * only be using that package in the browser. It can also be used to import\n   * code in node at run time from a package that cannot be bundled. For\n   * example, the fsevents package contains a native extension, which esbuild\n   * doesn't support.\n   *\n   * @default []\n   */\n  readonly externals?: string[];\n\n  /**\n   * Include a source map in the bundle.\n   *\n   * @default false\n   */\n  readonly sourcemap?: boolean;\n\n  /**\n   * In addition to the `bundle:xyz` task, creates `bundle:xyz:watch` task which will\n   * invoke the same esbuild command with the `--watch` flag. This can be used\n   * to continusouly watch for changes.\n   *\n   * @default true\n   */\n  readonly watchTask?: boolean;\n}\n\n/**\n * Options for `addBundle()`.\n */\nexport interface AddBundleOptions extends BundlingOptions {\n  /**\n   * esbuild target.\n   *\n   * @example \"node12\"\n   */\n  readonly target: string;\n\n  /**\n   * esbuild platform.\n   *\n   * @example \"node\"\n   */\n  readonly platform: string;\n\n  /**\n   * Bundler output path relative to the asset's output directory.\n   * @default \"index.js\"\n   */\n  readonly outfile?: string;\n\n  /**\n   * Mark the output file as executable.\n   * @default false\n   */\n  readonly executable?: boolean;\n}\n"
  },
  {
    "path": "src/javascript/eslint.ts",
    "content": "import { Project } from \"..\";\nimport { PROJEN_RC } from \"../common\";\nimport { Component } from \"../component\";\nimport { NodeProject } from \"../javascript\";\nimport { JsonFile } from \"../json\";\nimport { YamlFile } from \"../yaml\";\nimport { Prettier } from \"./prettier\";\n\nexport interface EslintOptions {\n  /**\n   * Path to `tsconfig.json` which should be used by eslint.\n   * @default \"./tsconfig.json\"\n   */\n  readonly tsconfigPath?: string;\n\n  /**\n   * Directories with source files to lint (e.g. [ \"src\" ])\n   */\n  readonly dirs: string[];\n\n  /**\n   * Directories with source files that include tests and build tools. These\n   * sources are linted but may also import packages from `devDependencies`.\n   * @default []\n   */\n  readonly devdirs?: string[];\n\n  /**\n   * File types that should be linted (e.g. [ \".js\", \".ts\" ])\n   * @default [\".ts\"]\n   */\n  readonly fileExtensions?: string[];\n\n  /**\n   * List of file patterns that should not be linted, using the same syntax\n   * as .gitignore patterns.\n   *\n   * @default [ '*.js', '*.d.ts', 'node_modules/', '*.generated.ts', 'coverage' ]\n   */\n  readonly ignorePatterns?: string[];\n\n  /**\n   * Projenrc file to lint. Use empty string to disable.\n   * @default PROJEN_RC\n   */\n  readonly lintProjenRcFile?: string;\n\n  /**\n   * Should we lint .projenrc.js\n   * @default true\n   * @deprecated use lintProjenRcFile instead\n   */\n  readonly lintProjenRc?: boolean;\n\n  /**\n   * Enable prettier for code formatting\n   * @default false\n   */\n  readonly prettier?: boolean;\n\n  /**\n   * Enable import alias for module paths\n   * @default undefined\n   */\n  readonly aliasMap?: { [key: string]: string };\n\n  /**\n   * Enable import alias for module paths\n   * @default undefined\n   */\n  readonly aliasExtensions?: string[];\n\n  /**\n   * Always try to resolve types under `<root>@types` directory even it doesn't contain any source code.\n   * This prevents `import/no-unresolved` eslint errors when importing a `@types/*` module that would otherwise remain unresolved.\n   * @default true\n   */\n  readonly tsAlwaysTryTypes?: boolean;\n\n  /**\n   * Write eslint configuration as YAML instead of JSON\n   * @default false\n   */\n  readonly yaml?: boolean;\n}\n\n/**\n * eslint rules override\n */\nexport interface EslintOverride {\n  /**\n   * Files or file patterns on which to apply the override\n   */\n  readonly files: string[];\n\n  /**\n   * The overriden rules\n   */\n  readonly rules?: { [rule: string]: any };\n\n  /**\n   * The overridden parser\n   */\n  readonly parser?: string;\n}\n\n/**\n * Represents eslint configuration.\n */\nexport class Eslint extends Component {\n  /**\n   * Returns the singletone Eslint component of a project or undefined if there is none.\n   */\n  public static of(project: Project): Eslint | undefined {\n    const isEslint = (c: Component): c is Eslint => c instanceof Eslint;\n    return project.components.find(isEslint);\n  }\n\n  /**\n   * eslint rules.\n   */\n  public readonly rules: { [rule: string]: any[] };\n\n  /**\n   * eslint overrides.\n   */\n  public readonly overrides: EslintOverride[];\n\n  /**\n   * Direct access to the eslint configuration (escape hatch)\n   */\n  public readonly config: any;\n\n  /**\n   * File patterns that should not be linted\n   */\n  public readonly ignorePatterns: string[];\n\n  private _formattingRules: Record<string, any>;\n  private readonly _allowDevDeps: Set<string>;\n  private readonly _plugins = new Array<string>();\n  private readonly _extends = new Array<string>();\n  private readonly nodeProject: NodeProject;\n\n  constructor(project: NodeProject, options: EslintOptions) {\n    super(project);\n\n    this.nodeProject = project;\n\n    project.addDevDeps(\n      \"eslint@^8\",\n      \"@typescript-eslint/eslint-plugin@^5\",\n      \"@typescript-eslint/parser@^5\",\n      \"eslint-import-resolver-node\",\n      \"eslint-import-resolver-typescript\",\n      \"eslint-plugin-import\",\n      \"json-schema\"\n    );\n\n    if (options.aliasMap) {\n      project.addDevDeps(\"eslint-import-resolver-alias\");\n    }\n\n    const devdirs = options.devdirs ?? [];\n\n    const dirs = [...options.dirs, ...devdirs];\n    const fileExtensions = options.fileExtensions ?? [\".ts\"];\n\n    this._allowDevDeps = new Set((devdirs ?? []).map((dir) => `**/${dir}/**`));\n\n    const lintProjenRc = options.lintProjenRc ?? true;\n    const lintProjenRcFile = options.lintProjenRcFile ?? PROJEN_RC;\n\n    const eslint = project.addTask(\"eslint\", {\n      description: \"Runs eslint against the codebase\",\n      exec: [\n        \"eslint\",\n        `--ext ${fileExtensions.join(\",\")}`,\n        \"--fix\",\n        \"--no-error-on-unmatched-pattern\",\n        ...dirs,\n        ...(lintProjenRc && lintProjenRcFile ? [lintProjenRcFile] : []),\n      ].join(\" \"),\n    });\n\n    project.testTask.spawn(eslint);\n\n    // exclude some files\n    project.npmignore?.exclude(\"/.eslintrc.json\");\n\n    this._formattingRules = {\n      // see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/indent.md\n      indent: [\"off\"],\n      \"@typescript-eslint/indent\": [\"error\", 2],\n\n      // Style\n      quotes: [\"error\", \"single\", { avoidEscape: true }],\n      \"comma-dangle\": [\"error\", \"always-multiline\"], // ensures clean diffs, see https://medium.com/@nikgraf/why-you-should-enforce-dangling-commas-for-multiline-statements-d034c98e36f8\n      \"comma-spacing\": [\"error\", { before: false, after: true }], // space after, no space before\n      \"no-multi-spaces\": [\"error\", { ignoreEOLComments: false }], // no multi spaces\n      \"array-bracket-spacing\": [\"error\", \"never\"], // [1, 2, 3]\n      \"array-bracket-newline\": [\"error\", \"consistent\"], // enforce consistent line breaks between brackets\n      \"object-curly-spacing\": [\"error\", \"always\"], // { key: 'value' }\n      \"object-curly-newline\": [\"error\", { multiline: true, consistent: true }], // enforce consistent line breaks between braces\n      \"object-property-newline\": [\n        \"error\",\n        { allowAllPropertiesOnSameLine: true },\n      ], // enforce \"same line\" or \"multiple line\" on object properties\n      \"keyword-spacing\": [\"error\"], // require a space before & after keywords\n      \"brace-style\": [\"error\", \"1tbs\", { allowSingleLine: true }], // enforce one true brace style\n      \"space-before-blocks\": [\"error\"], // require space before blocks\n      curly: [\"error\", \"multi-line\", \"consistent\"], // require curly braces for multiline control statements\n      \"@typescript-eslint/member-delimiter-style\": [\"error\"],\n\n      // Require semicolons\n      semi: [\"error\", \"always\"],\n\n      // Max line lengths\n      \"max-len\": [\n        \"error\",\n        {\n          code: 150,\n          ignoreUrls: true, // Most common reason to disable it\n          ignoreStrings: true, // These are not fantastic but necessary for error messages\n          ignoreTemplateLiterals: true,\n          ignoreComments: true,\n          ignoreRegExpLiterals: true,\n        },\n      ],\n\n      // Don't unnecessarily quote properties\n      \"quote-props\": [\"error\", \"consistent-as-needed\"],\n    };\n\n    this.rules = {\n      // Require use of the `import { foo } from 'bar';` form instead of `import foo = require('bar');`\n      \"@typescript-eslint/no-require-imports\": [\"error\"],\n\n      // Require all imported dependencies are actually declared in package.json\n      \"import/no-extraneous-dependencies\": [\n        \"error\",\n        {\n          // Only allow importing devDependencies from \"devdirs\".\n          devDependencies: () => this.renderDevDepsAllowList(),\n          optionalDependencies: false, // Disallow importing optional dependencies (those shouldn't be in use in the project)\n          peerDependencies: true, // Allow importing peer dependencies (that aren't also direct dependencies)\n        },\n      ],\n\n      // Require all imported libraries actually resolve (!!required for import/no-extraneous-dependencies to work!!)\n      \"import/no-unresolved\": [\"error\"],\n\n      // Require an ordering on all imports\n      \"import/order\": [\n        \"warn\",\n        {\n          groups: [\"builtin\", \"external\"],\n          alphabetize: { order: \"asc\", caseInsensitive: true },\n        },\n      ],\n\n      // Cannot import from the same module twice\n      \"no-duplicate-imports\": [\"error\"],\n\n      // Cannot shadow names\n      \"no-shadow\": [\"off\"],\n      \"@typescript-eslint/no-shadow\": [\"error\"],\n\n      // Required spacing in property declarations (copied from TSLint, defaults are good)\n      \"key-spacing\": [\"error\"],\n\n      // No multiple empty lines\n      \"no-multiple-empty-lines\": [\"error\"],\n\n      // One of the easiest mistakes to make\n      \"@typescript-eslint/no-floating-promises\": [\"error\"],\n\n      // Make sure that inside try/catch blocks, promises are 'return await'ed\n      // (must disable the base rule as it can report incorrect errors)\n      \"no-return-await\": [\"off\"],\n      \"@typescript-eslint/return-await\": [\"error\"],\n\n      // Useless diff results\n      \"no-trailing-spaces\": [\"error\"],\n\n      // Must use foo.bar instead of foo['bar'] if possible\n      \"dot-notation\": [\"error\"],\n\n      // Are you sure | is not a typo for || ?\n      \"no-bitwise\": [\"error\"],\n\n      // Member ordering\n      \"@typescript-eslint/member-ordering\": [\n        \"error\",\n        {\n          default: [\n            \"public-static-field\",\n            \"public-static-method\",\n            \"protected-static-field\",\n            \"protected-static-method\",\n            \"private-static-field\",\n            \"private-static-method\",\n\n            \"field\",\n\n            // Constructors\n            \"constructor\", // = [\"public-constructor\", \"protected-constructor\", \"private-constructor\"]\n\n            // Methods\n            \"method\",\n          ],\n        },\n      ],\n    };\n\n    // Overrides for .projenrc.js\n    this.overrides = [\n      {\n        files: [lintProjenRcFile || PROJEN_RC],\n        rules: {\n          \"@typescript-eslint/no-require-imports\": \"off\",\n          \"import/no-extraneous-dependencies\": \"off\",\n        },\n      },\n    ];\n\n    this.ignorePatterns = options.ignorePatterns ?? [\n      \"*.js\",\n      `!${lintProjenRcFile || PROJEN_RC}`,\n      \"*.d.ts\",\n      \"node_modules/\",\n      \"*.generated.ts\",\n      \"coverage\",\n    ];\n\n    const tsconfig = options.tsconfigPath ?? \"./tsconfig.json\";\n\n    this.addPlugins(\"@typescript-eslint\");\n    this.addPlugins(\"import\");\n    this.addExtends(\"plugin:import/typescript\");\n\n    this.config = {\n      env: {\n        jest: true,\n        node: true,\n      },\n      root: true,\n      plugins: () => this._plugins,\n      parser: \"@typescript-eslint/parser\",\n      parserOptions: {\n        ecmaVersion: 2018,\n        sourceType: \"module\",\n        project: tsconfig,\n      },\n      extends: () => this._extends,\n      settings: {\n        \"import/parsers\": {\n          \"@typescript-eslint/parser\": [\".ts\", \".tsx\"],\n        },\n        \"import/resolver\": {\n          ...(options.aliasMap && {\n            alias: {\n              map: Object.entries(options.aliasMap).map(([k, v]) => [k, v]),\n              extensions: options.aliasExtensions,\n            },\n          }),\n          node: {},\n          typescript: {\n            project: tsconfig,\n            ...(options.tsAlwaysTryTypes !== false && { alwaysTryTypes: true }),\n          },\n        },\n      },\n      ignorePatterns: this.ignorePatterns,\n      rules: () => ({ ...this._formattingRules, ...this.rules }),\n      overrides: this.overrides,\n    };\n\n    if (options.yaml) {\n      new YamlFile(project, \".eslintrc.yml\", {\n        obj: this.config,\n        marker: false,\n      });\n    } else {\n      new JsonFile(project, \".eslintrc.json\", {\n        obj: this.config,\n        marker: false,\n      });\n    }\n\n    // if the user enabled prettier explicitly _or_ if the project has a\n    // `Prettier` component, we shall tweak our configuration accordingly.\n    if (options.prettier || Prettier.of(project)) {\n      this.enablePrettier();\n    }\n  }\n\n  /**\n   * Add an eslint rule.\n   */\n  public addRules(rules: { [rule: string]: any }) {\n    for (const [k, v] of Object.entries(rules)) {\n      this.rules[k] = v;\n    }\n  }\n\n  /**\n   * Adds an eslint plugin\n   * @param plugins The names of plugins to add\n   */\n  public addPlugins(...plugins: string[]) {\n    this._plugins.push(...plugins);\n  }\n\n  /**\n   * Add an eslint override.\n   */\n  public addOverride(override: EslintOverride) {\n    this.overrides.push(override);\n  }\n\n  /**\n   * Do not lint these files.\n   */\n  public addIgnorePattern(pattern: string) {\n    this.ignorePatterns.push(pattern);\n  }\n\n  /**\n   * Adds an `extends` item to the eslint configuration.\n   * @param extendList The list of \"extends\" to add.\n   */\n  public addExtends(...extendList: string[]) {\n    this._extends.push(...extendList);\n  }\n\n  /**\n   * Add a glob file pattern which allows importing dev dependencies.\n   * @param pattern glob pattern.\n   */\n  public allowDevDeps(pattern: string) {\n    this._allowDevDeps.add(pattern);\n  }\n\n  /**\n   * Enables prettier for code formatting.\n   */\n  private enablePrettier() {\n    this.nodeProject.addDevDeps(\n      \"prettier\",\n      \"eslint-plugin-prettier\",\n      \"eslint-config-prettier\"\n    );\n\n    this.addPlugins(\"prettier\");\n\n    this._formattingRules = {\n      \"prettier/prettier\": [\"error\"],\n    };\n\n    this.addExtends(\"prettier\", \"plugin:prettier/recommended\");\n  }\n\n  private renderDevDepsAllowList() {\n    return Array.from(this._allowDevDeps);\n  }\n}\n"
  },
  {
    "path": "src/javascript/index.ts",
    "content": "export * from \"./bundler\";\nexport * from \"./eslint\";\nexport * from \"./jest\";\nexport * from \"./node-package\";\nexport * from \"./node-project\";\nexport * from \"./npm-config\";\nexport * from \"./prettier\";\nexport * from \"./projenrc\";\nexport * from \"./typescript-config\";\nexport * from \"./upgrade-dependencies\";\n"
  },
  {
    "path": "src/javascript/jest.ts",
    "content": "import * as path from \"path\";\nimport * as semver from \"semver\";\nimport { NodeProject } from \"../javascript\";\nimport { JsonFile } from \"../json\";\n\nconst DEFAULT_TEST_REPORTS_DIR = \"test-reports\";\n\n// Pulled from https://jestjs.io/docs/en/configuration\nexport interface JestConfigOptions {\n  /**\n   * This option tells Jest that all imported modules in your tests should be mocked automatically.\n   * All modules used in your tests will have a replacement implementation, keeping the API surface\n   * @default - false\n   */\n  readonly automock?: boolean;\n\n  /**\n   * By default, Jest runs all tests and produces all errors into the console upon completion.\n   * The bail config option can be used here to have Jest stop running tests after n failures.\n   * Setting bail to true is the same as setting bail to 1.\n   * @default - 0\n   */\n  readonly bail?: boolean | number;\n\n  /**\n   * The directory where Jest should store its cached dependency information\n   * @default - \"/tmp/<path>\"\n   */\n  readonly cacheDirectory?: string;\n\n  /**\n   * Automatically clear mock calls and instances before every test.\n   * Equivalent to calling jest.clearAllMocks() before each test.\n   * This does not remove any mock implementation that may have been provided\n   * @default true\n   */\n  readonly clearMocks?: boolean;\n\n  /**\n   * Indicates whether the coverage information should be collected while executing the test.\n   * Because this retrofits all executed files with coverage collection statements,\n   * it may significantly slow down your tests\n   * @default true\n   */\n  readonly collectCoverage?: boolean;\n\n  /**\n   * An array of glob patterns indicating a set of files for which coverage information should be collected.\n   * @default - undefined\n   */\n  readonly collectCoverageFrom?: string[];\n\n  /**\n   * The directory where Jest should output its coverage files.\n   * @default \"coverage\"\n   */\n  readonly coverageDirectory?: string;\n\n  /**\n   * An array of regexp pattern strings that are matched against all file paths before executing the test.\n   * If the file path matches any of the patterns, coverage information will be skipped\n   * @default \"/node_modules/\"\n   */\n  readonly coveragePathIgnorePatterns?: string[];\n\n  /**\n   * Indicates which provider should be used to instrument code for coverage.\n   * Allowed values are babel (default) or v8\n   * @default - \"babel\"\n   */\n  readonly coverageProvider?: \"babel\" | \"v8\";\n\n  /**\n   * A list of reporter names that Jest uses when writing coverage reports. Any istanbul reporter can be used\n   * @default - [\"json\", \"lcov\", \"text\", \"clover\", \"cobertura\"]\n   */\n  readonly coverageReporters?: string[];\n\n  /**\n   * Specify the global coverage thresholds. This will be used to configure minimum threshold enforcement\n   * for coverage results. Thresholds can be specified as global, as a glob, and as a directory or file path.\n   * If thresholds aren't met, jest will fail.\n   * @default - undefined\n   */\n  readonly coverageThreshold?: CoverageThreshold;\n\n  /**\n   * This option allows the use of a custom dependency extractor.\n   * It must be a node module that exports an object with an extract function\n   * @default - undefined\n   */\n  readonly dependencyExtractor?: string;\n\n  /**\n   * Allows for a label to be printed alongside a test while it is running.\n   * @default - undefined\n   */\n  readonly displayName?: string | any;\n\n  /**\n   * Make calling deprecated APIs throw helpful error messages. Useful for easing the upgrade process.\n   * @default - false\n   */\n  readonly errorOnDeprecated?: boolean;\n\n  /**\n   * Test files run inside a vm, which slows calls to global context properties (e.g. Math).\n   * With this option you can specify extra properties to be defined inside the vm for faster lookups.\n   * @default - undefined\n   */\n  readonly extraGlobals?: string[];\n\n  /**\n   * Test files are normally ignored from collecting code coverage.\n   * With this option, you can overwrite this behavior and include otherwise ignored files in code coverage.\n   * @default - ['']\n   */\n  readonly forceCoverageMatch?: string[];\n\n  /**\n   * A set of global variables that need to be available in all test environments.\n   * @default - {}\n   */\n  readonly globals?: any;\n\n  /**\n   * This option allows the use of a custom global setup module which exports an async function that is\n   * triggered once before all test suites. This function gets Jest's globalConfig object as a parameter.\n   * @default - undefined\n   */\n  readonly globalSetup?: string;\n\n  /**\n   * This option allows the use of a custom global teardown module which exports an async function that is\n   * triggered once after all test suites. This function gets Jest's globalConfig object as a parameter.\n   * @default - undefined\n   */\n  readonly globalTeardown?: string;\n\n  /**\n   * This will be used to configure the behavior of jest-haste-map, Jest's internal file crawler/cache system.\n   * @default - {}\n   */\n  readonly haste?: HasteConfig;\n\n  /**\n   * Insert Jest's globals (expect, test, describe, beforeEach etc.) into the global environment.\n   * If you set this to false, you should import from @jest/globals\n   * @default - true\n   */\n  readonly injectGlobals?: boolean;\n\n  /**\n   * A number limiting the number of tests that are allowed to run at the same time when using test.concurrent.\n   * Any test above this limit will be queued and executed once a slot is released.\n   * @default - 5\n   */\n  readonly maxConcurrency?: number;\n\n  /**\n   * Specifies the maximum number of workers the worker-pool will spawn for running tests. In single run mode,\n   * this defaults to the number of the cores available on your machine minus one for the main thread\n   * In watch mode, this defaults to half of the available cores on your machine.\n   * For environments with variable CPUs available, you can use percentage based configuration: \"maxWorkers\": \"50%\"\n   * @default - the number of the cores available on your machine minus one for the main thread\n   */\n  readonly maxWorkers?: number | string;\n\n  /**\n   * An array of directory names to be searched recursively up from the requiring module's location.\n   * Setting this option will override the default, if you wish to still search node_modules for packages\n   * include it along with any other options: [\"node_modules\", \"bower_components\"]\n   * @default - [\"node_modules\"]\n   */\n  readonly moduleDirectories?: string[];\n\n  /**\n   * An array of file extensions your modules use. If you require modules without specifying a file extension,\n   * these are the extensions Jest will look for, in left-to-right order.\n   * @default - [\"js\", \"json\", \"jsx\", \"ts\", \"tsx\", \"node\"]\n   */\n  readonly moduleFileExtensions?: string[];\n\n  /**\n   * A map from regular expressions to module names or to arrays of module names that allow to stub out\n   * resources, like images or styles with a single module.\n   * @default - null\n   */\n  readonly moduleNameMapper?: { [key: string]: string | string[] };\n\n  /**\n   * An array of regexp pattern strings that are matched against all module paths before those paths are\n   * to be considered 'visible' to the module loader. If a given module's path matches any of the patterns,\n   * it will not be require()-able in the test environment.\n   * @default - []\n   */\n  readonly modulePathIgnorePatterns?: string[];\n\n  /**\n   * An alternative API to setting the NODE_PATH env variable, modulePaths is an array of absolute paths\n   * to additional locations to search when resolving modules. Use the <rootDir> string token to include\n   * the path to your project's root directory. Example: [\"<rootDir>/app/\"].\n   * @default - []\n   */\n  readonly modulePaths?: string[];\n\n  /**\n   * Activates notifications for test results.\n   * @default - false\n   */\n  readonly notify?: boolean;\n\n  /**\n   * Specifies notification mode. Requires notify: true\n   * @default - failure-change\n   */\n  readonly notifyMode?:\n    | \"always\"\n    | \"failure\"\n    | \"success\"\n    | \"change\"\n    | \"success-change\"\n    | \"failure-change\";\n\n  /**\n   * A preset that is used as a base for Jest's configuration. A preset should point to an npm module\n   * that has a jest-preset.json or jest-preset.js file at the root.\n   * @default - undefined\n   */\n  readonly preset?: string;\n\n  /**\n   * Sets the path to the prettier node module used to update inline snapshots.\n   * @default - \"prettier\"\n   */\n  readonly prettierPath?: string;\n\n  /**\n   * When the projects configuration is provided with an array of paths or glob patterns, Jest will\n   * run tests in all of the specified projects at the same time. This is great for monorepos or\n   * when working on multiple projects at the same time.\n   * @default - undefined\n   */\n  readonly projects?: Array<string | { [key: string]: any }>;\n\n  /**\n   * Use this configuration option to add custom reporters to Jest. A custom reporter is a class\n   * that implements onRunStart, onTestStart, onTestResult, onRunComplete methods that will be\n   * called when any of those events occurs.\n   * @default - undefined\n   */\n  readonly reporters?: JestReporter[];\n\n  /**\n   * Automatically reset mock state before every test. Equivalent to calling jest.resetAllMocks()\n   * before each test. This will lead to any mocks having their fake implementations removed but\n   * does not restore their initial implementation.\n   * @default - false\n   */\n  readonly resetMocks?: boolean;\n\n  /**\n   * By default, each test file gets its own independent module registry. Enabling resetModules\n   * goes a step further and resets the module registry before running each individual test.\n   * @default - false\n   */\n  readonly resetModules?: boolean;\n\n  /**\n   * This option allows the use of a custom resolver.\n   * https://jestjs.io/docs/en/configuration#resolver-string\n   * @default - undefined\n   */\n  readonly resolver?: string;\n\n  /**\n   * Automatically restore mock state before every test. Equivalent to calling jest.restoreAllMocks()\n   * before each test. This will lead to any mocks having their fake implementations removed and\n   * restores their initial implementation.\n   * @default - false\n   */\n  readonly restoreMocks?: boolean;\n\n  /**\n   * The root directory that Jest should scan for tests and modules within. If you put your Jest\n   * config inside your package.json and want the root directory to be the root of your repo, the\n   * value for this config param will default to the directory of the package.json.\n   * @default - directory of the package.json\n   */\n  readonly rootDir?: string;\n\n  /**\n   * A list of paths to directories that Jest should use to search for files in.\n   * @default - [\"<rootDir>\"]\n   */\n  readonly roots?: string[];\n\n  /**\n   * This option allows you to use a custom runner instead of Jest's default test runner.\n   * @default - \"jest-runner\"\n   */\n  readonly runner?: string;\n\n  /**\n   * A list of paths to modules that run some code to configure or set up the testing environment.\n   * Each setupFile will be run once per test file. Since every test runs in its own environment,\n   * these scripts will be executed in the testing environment immediately before executing the\n   * test code itself.\n   * @default - []\n   */\n  readonly setupFiles?: string[];\n\n  /**\n   * A list of paths to modules that run some code to configure or set up the testing framework\n   * before each test file in the suite is executed. Since setupFiles executes before the test\n   * framework is installed in the environment, this script file presents you the opportunity of\n   * running some code immediately after the test framework has been installed in the environment.\n   * @default - []\n   */\n  readonly setupFilesAfterEnv?: string[];\n\n  /**\n   * The number of seconds after which a test is considered as slow and reported as such in the results.\n   * @default - 5\n   */\n  readonly slowTestThreshold?: number;\n\n  /**\n   * The path to a module that can resolve test<->snapshot path. This config option lets you customize\n   * where Jest stores snapshot files on disk.\n   * @default - undefined\n   */\n  readonly snapshotResolver?: string;\n\n  /**\n   * A list of paths to snapshot serializer modules Jest should use for snapshot testing.\n   * @default = []\n   */\n  readonly snapshotSerializers?: string[];\n\n  /**\n   * The test environment that will be used for testing. The default environment in Jest is a\n   * browser-like environment through jsdom. If you are building a node service, you can use the node\n   * option to use a node-like environment instead.\n   * @default - \"jsdom\"\n   */\n  readonly testEnvironment?: string;\n\n  /**\n   * Test environment options that will be passed to the testEnvironment.\n   * The relevant options depend on the environment.\n   * @default - {}\n   */\n  readonly testEnvironmentOptions?: any;\n\n  /**\n   * The exit code Jest returns on test failure.\n   * @default - 1\n   */\n  readonly testFailureExitCode?: number;\n\n  /**\n   * The glob patterns Jest uses to detect test files. By default it looks for .js, .jsx, .ts and .tsx\n   * files inside of __tests__ folders, as well as any files with a suffix of .test or .spec\n   * (e.g. Component.test.js or Component.spec.js). It will also find files called test.js or spec.js.\n   * @default ['**\\/__tests__/**\\/*.[jt]s?(x)', '**\\/?(*.)+(spec|test).[tj]s?(x)']\n   */\n  readonly testMatch?: string[];\n\n  /**\n   * An array of regexp pattern strings that are matched against all test paths before executing the test.\n   * If the test path matches any of the patterns, it will be skipped.\n   * @default - [\"/node_modules/\"]\n   */\n  readonly testPathIgnorePatterns?: string[];\n\n  /**\n   * The pattern or patterns Jest uses to detect test files. By default it looks for .js, .jsx, .ts and .tsx\n   * files inside of __tests__ folders, as well as any files with a suffix of .test or .spec\n   * (e.g. Component.test.js or Component.spec.js). It will also find files called test.js or spec.js.\n   * @default - (/__tests__/.*|(\\\\.|/)(test|spec))\\\\.[jt]sx?$\n   */\n  readonly testRegex?: string | string[];\n\n  /**\n   * This option allows the use of a custom results processor.\n   * @default - undefined\n   */\n  readonly testResultsProcessor?: string;\n\n  /**\n   * This option allows the use of a custom test runner. The default is jasmine2. A custom test runner\n   * can be provided by specifying a path to a test runner implementation.\n   * @default - \"jasmine2\"\n   */\n  readonly testRunner?: string;\n\n  /**\n   * This option allows you to use a custom sequencer instead of Jest's default.\n   * Sort may optionally return a Promise.\n   * @default - \"@jest/test-sequencer\"\n   */\n  readonly testSequencer?: string;\n\n  /**\n   * Default timeout of a test in milliseconds.\n   * @default - 5000\n   */\n  readonly testTimeout?: number;\n\n  /**\n   * This option sets the URL for the jsdom environment. It is reflected in properties such as location.href.\n   * @default - \"http://localhost\"\n   */\n  readonly testURL?: string;\n\n  /**\n   * Setting this value to legacy or fake allows the use of fake timers for functions such as setTimeout.\n   * Fake timers are useful when a piece of code sets a long timeout that we don't want to wait for in a test.\n   * @default - \"real\"\n   */\n  readonly timers?: string;\n\n  /**\n   * A map from regular expressions to paths to transformers. A transformer is a module that provides a\n   * synchronous function for transforming source files.\n   * @default - {\"\\\\.[jt]sx?$\": \"babel-jest\"}\n   */\n  readonly transform?: { [key: string]: string | [string, any] };\n\n  /**\n   * An array of regexp pattern strings that are matched against all source file paths before transformation.\n   * If the test path matches any of the patterns, it will not be transformed.\n   * @default - [\"/node_modules/\", \"\\\\.pnp\\\\.[^\\\\\\/]+$\"]\n   */\n  readonly transformIgnorePatterns?: string[];\n\n  /**\n   * An array of regexp pattern strings that are matched against all modules before the module loader will\n   * automatically return a mock for them. If a module's path matches any of the patterns in this list, it\n   * will not be automatically mocked by the module loader.\n   * @default - []\n   */\n  readonly unmockedModulePathPatterns?: string[];\n\n  /**\n   * Indicates whether each individual test should be reported during the run. All errors will also\n   * still be shown on the bottom after execution. Note that if there is only one test file being run\n   * it will default to true.\n   * @default - false\n   */\n  readonly verbose?: boolean;\n\n  /**\n   * An array of RegExp patterns that are matched against all source file paths before re-running tests\n   * in watch mode. If the file path matches any of the patterns, when it is updated, it will not trigger\n   * a re-run of tests.\n   * @default - []\n   */\n  readonly watchPathIgnorePatterns?: string[];\n\n  /**\n   *\n   * @default -\n   */\n  readonly watchPlugins?: [string | [string, any]];\n\n  /**\n   * Whether to use watchman for file crawling.\n   * @default - true\n   */\n  readonly watchman?: boolean;\n\n  /**\n   * Escape hatch to allow any value\n   */\n  readonly [name: string]: any;\n}\n\nexport interface JestOptions {\n  /**\n   * Collect coverage. Deprecated\n   * @default true\n   * @deprecated use jestConfig.collectCoverage\n   */\n  readonly coverage?: boolean;\n\n  /**\n   * Include the `text` coverage reporter, which means that coverage summary is printed\n   * at the end of the jest execution.\n   *\n   * @default true\n   */\n  readonly coverageText?: boolean;\n\n  /**\n   * Defines `testPathIgnorePatterns` and `coveragePathIgnorePatterns`\n   * @default [\"/node_modules/\"]\n   * @deprecated use jestConfig.coveragePathIgnorePatterns or jestConfig.testPathIgnorePatterns respectively\n   */\n  readonly ignorePatterns?: string[];\n\n  /**\n   * Result processing with jest-junit.\n   *\n   * Output directory is `test-reports/`.\n   *\n   * @default true\n   */\n  readonly junitReporting?: boolean;\n\n  /**\n   * Preserve the default Jest reporter when additional reporters are added.\n   *\n   * @default true\n   */\n  readonly preserveDefaultReporters?: boolean;\n\n  /**\n   * The version of jest to use.\n   *\n   * Note that same version is used as version of `@types/jest` and `ts-jest` (if Typescript in use), so given version should work also for those.\n   *\n   * @default - installs the latest jest version\n   */\n  readonly jestVersion?: string;\n\n  /**\n   * Path to JSON config file for Jest\n   *\n   * @default - No separate config file, jest settings are stored in package.json\n   */\n  readonly configFilePath?: string;\n\n  /**\n   * Jest configuration.\n   * @default - default jest configuration\n   */\n  readonly jestConfig?: JestConfigOptions;\n\n  /**\n   * Additional options to pass to the Jest CLI invocation\n   * @default - no extra options\n   */\n  readonly extraCliOptions?: string[];\n}\n\nexport interface CoverageThreshold {\n  readonly branches?: number;\n  readonly functions?: number;\n  readonly lines?: number;\n  readonly statements?: number;\n}\n\nexport interface HasteConfig {\n  readonly computeSha1?: boolean;\n  readonly defaultPlatform?: string | undefined;\n  readonly hasteImplModulePath?: string;\n  readonly platforms?: Array<string>;\n  readonly throwOnModuleCollision?: boolean;\n}\n\ntype JestReporter = [string, { [key: string]: any }] | string;\n\n/**\n * Installs the following npm scripts:\n *\n * - `test` will run `jest --passWithNoTests`\n * - `test:watch` will run `jest --watch`\n * - `test:update` will run `jest -u`\n *\n */\nexport class Jest {\n  /**\n   * Escape hatch.\n   */\n  public readonly config: any;\n  public readonly jestVersion: string;\n\n  private readonly testMatch: string[];\n  private readonly ignorePatterns: string[];\n  private readonly watchIgnorePatterns: string[];\n  private readonly coverageReporters: string[];\n  private readonly project: NodeProject;\n  private readonly file?: JsonFile;\n  private readonly reporters: JestReporter[];\n  private readonly jestConfig?: JestConfigOptions;\n  private readonly extraCliOptions: string[];\n  private _snapshotResolver: string | undefined;\n\n  constructor(project: NodeProject, options: JestOptions = {}) {\n    this.project = project;\n\n    // hard deprecation\n    if ((options as any).typescriptConfig) {\n      throw new Error(\n        '\"jestOptions.typescriptConfig\" is deprecated. Use \"typescriptProject.tsconfigDev\" instead'\n      );\n    }\n\n    // Jest snapshot files are generated files!\n    project.root.annotateGenerated(\"*.snap\");\n    this.jestVersion = options.jestVersion ? `@${options.jestVersion}` : \"\";\n    project.addDevDeps(`jest${this.jestVersion}`);\n\n    this.jestConfig = options.jestConfig;\n    this.extraCliOptions = options.extraCliOptions ?? [];\n\n    this.ignorePatterns = this.jestConfig?.testPathIgnorePatterns ??\n      options.ignorePatterns ?? [\"/node_modules/\"];\n    this.watchIgnorePatterns = this.jestConfig?.watchPathIgnorePatterns ?? [\n      \"/node_modules/\",\n    ];\n    this.coverageReporters = this.jestConfig?.coverageReporters ?? [\n      \"json\",\n      \"lcov\",\n      \"clover\",\n      \"cobertura\",\n    ];\n    this.testMatch = this.jestConfig?.testMatch ?? [\n      \"**/__tests__/**/*.[jt]s?(x)\",\n      \"**/?(*.)+(spec|test).[tj]s?(x)\",\n    ];\n\n    const coverageDirectory = this.jestConfig?.coverageDirectory ?? \"coverage\";\n\n    this.reporters = [];\n\n    if (options.preserveDefaultReporters ?? true) {\n      this.reporters.unshift(\"default\");\n    }\n\n    this.config = {\n      ...this.jestConfig,\n      clearMocks: this.jestConfig?.clearMocks ?? true,\n      collectCoverage:\n        options.coverage ?? this.jestConfig?.collectCoverage ?? true,\n      coverageReporters: this.coverageReporters,\n      coverageDirectory: coverageDirectory,\n      coveragePathIgnorePatterns:\n        this.jestConfig?.coveragePathIgnorePatterns ?? this.ignorePatterns,\n      testPathIgnorePatterns: this.ignorePatterns,\n      watchPathIgnorePatterns: this.watchIgnorePatterns,\n      testMatch: this.testMatch,\n      reporters: this.reporters,\n      snapshotResolver: (() => this._snapshotResolver) as any,\n    } as JestConfigOptions;\n\n    if (options.junitReporting ?? true) {\n      const reportsDir = DEFAULT_TEST_REPORTS_DIR;\n\n      this.addReporter([\"jest-junit\", { outputDirectory: reportsDir }]);\n\n      project.addDevDeps(\"jest-junit@^13\");\n\n      project.gitignore.exclude(\n        \"# jest-junit artifacts\",\n        `/${reportsDir}/`,\n        \"junit.xml\"\n      );\n      project.npmignore?.exclude(\n        \"# jest-junit artifacts\",\n        `/${reportsDir}/`,\n        \"junit.xml\"\n      );\n    }\n\n    if (this.jestConfig?.reporters) {\n      for (const reporter of this.jestConfig.reporters) {\n        this.addReporter(reporter);\n      }\n    }\n\n    if (this.jestConfig?.coverageThreshold) {\n      this.config.coverageThreshold = {\n        global: this.jestConfig?.coverageThreshold,\n      };\n    }\n\n    this.configureTestCommand();\n\n    if (options.configFilePath) {\n      this.file = new JsonFile(project, options.configFilePath, {\n        obj: this.config,\n      });\n    } else {\n      project.addFields({ jest: this.config });\n    }\n\n    const coverageDirectoryPath = path.posix.join(\"/\", coverageDirectory, \"/\");\n    project.npmignore?.exclude(coverageDirectoryPath);\n    project.gitignore.exclude(coverageDirectoryPath);\n\n    if (options.coverageText ?? true) {\n      this.coverageReporters.push(\"text\");\n    }\n  }\n\n  /**\n   * Adds a test match pattern.\n   * @param pattern glob pattern to match for tests\n   */\n  public addTestMatch(pattern: string) {\n    this.testMatch.push(pattern);\n  }\n\n  /**\n   * Adds a watch ignore pattern.\n   * @param pattern The pattern (regular expression).\n   */\n  public addWatchIgnorePattern(pattern: string) {\n    this.watchIgnorePatterns.push(pattern);\n  }\n\n  public addIgnorePattern(pattern: string) {\n    this.ignorePatterns.push(pattern);\n  }\n\n  public addReporter(reporter: JestReporter) {\n    this.reporters.push(reporter);\n  }\n\n  public addSnapshotResolver(file: string) {\n    this._snapshotResolver = file;\n  }\n\n  private configureTestCommand() {\n    const jestOpts = [\"--passWithNoTests\", \"--all\", ...this.extraCliOptions];\n    const jestConfigOpts =\n      this.file && this.file.path != \"jest.config.json\"\n        ? ` -c ${this.file.path}`\n        : \"\";\n\n    // since our build & release workflows have anti-tamper protection, it is\n    // safe to always run tests with --updateSnapshot. if a snapshot changes,\n    // the `build` workflow will either fail (on forks) or push the update and\n    // `release` workflows will fail.\n    jestOpts.push(\"--updateSnapshot\");\n\n    // as recommended in the jest docs, node > 14 may use native v8 coverage collection\n    // https://jestjs.io/docs/en/cli#--coverageproviderprovider\n    if (\n      this.project.package.minNodeVersion &&\n      semver.gte(this.project.package.minNodeVersion, \"14.0.0\")\n    ) {\n      jestOpts.push(\"--coverageProvider=v8\");\n    }\n\n    this.project.testTask.exec(`jest ${jestOpts.join(\" \")}${jestConfigOpts}`);\n\n    const testWatch = this.project.tasks.tryFind(\"test:watch\");\n    if (!testWatch) {\n      this.project.addTask(\"test:watch\", {\n        description: \"Run jest in watch mode\",\n        exec: `jest --watch${jestConfigOpts}`,\n      });\n    }\n\n    const testUpdate = this.project.tasks.tryFind(\"test:update\");\n    if (!testUpdate) {\n      this.project.addTask(\"test:update\", {\n        description: \"Update jest snapshots\",\n        exec: `jest --updateSnapshot${jestConfigOpts}`,\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "src/javascript/node-package.ts",
    "content": "import { readFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { parse as urlparse } from \"url\";\nimport {\n  accessSync,\n  constants,\n  existsSync,\n  readdirSync,\n  readJsonSync,\n} from \"fs-extra\";\nimport { resolve as resolveJson } from \"../_resolve\";\nimport { Component } from \"../component\";\nimport { Dependencies, DependencyType } from \"../dependencies\";\nimport { JsonFile } from \"../json\";\nimport { Project } from \"../project\";\nimport { isAwsCodeArtifactRegistry } from \"../release\";\nimport { Task } from \"../task\";\nimport { exec, isTruthy, sorted, writeFile } from \"../util\";\nimport {\n  extractCodeArtifactDetails,\n  minVersion,\n  packageResolutionsFieldName,\n} from \"./util\";\n\nconst UNLICENSED = \"UNLICENSED\";\nconst DEFAULT_NPM_REGISTRY_URL = \"https://registry.npmjs.org/\";\nconst GITHUB_PACKAGES_REGISTRY = \"npm.pkg.github.com\";\nconst DEFAULT_NPM_TOKEN_SECRET = \"NPM_TOKEN\";\nconst DEFAULT_GITHUB_TOKEN_SECRET = \"GITHUB_TOKEN\";\n\nexport interface NodePackageOptions {\n  /**\n   * The \"name\" in package.json\n   * @default - defaults to project name\n   * @featured\n   */\n  readonly packageName?: string;\n  /**\n   * The description is just a string that helps people understand the purpose of the package.\n   * It can be used when searching for packages in a package manager as well.\n   * See https://classic.yarnpkg.com/en/docs/package-json/#toc-description\n   * @featured\n   */\n  readonly description?: string;\n\n  /**\n   * Runtime dependencies of this module.\n   *\n   * The recommendation is to only specify the module name here (e.g.\n   * `express`). This will behave similar to `yarn add` or `npm install` in the\n   * sense that it will add the module as a dependency to your `package.json`\n   * file with the latest version (`^`). You can specify semver requirements in\n   * the same syntax passed to `npm i` or `yarn add` (e.g. `express@^2`) and\n   * this will be what you `package.json` will eventually include.\n   *\n   * @example [ 'express', 'lodash', 'foo@^2' ]\n   * @default []\n   * @featured\n   */\n  readonly deps?: string[];\n\n  /**\n   * Build dependencies for this module. These dependencies will only be\n   * available in your build environment but will not be fetched when this\n   * module is consumed.\n   *\n   * The recommendation is to only specify the module name here (e.g.\n   * `express`). This will behave similar to `yarn add` or `npm install` in the\n   * sense that it will add the module as a dependency to your `package.json`\n   * file with the latest version (`^`). You can specify semver requirements in\n   * the same syntax passed to `npm i` or `yarn add` (e.g. `express@^2`) and\n   * this will be what you `package.json` will eventually include.\n   *\n   * @example [ 'typescript', '@types/express' ]\n   * @default []\n   * @featured\n   */\n  readonly devDeps?: string[];\n\n  /**\n   * Peer dependencies for this module. Dependencies listed here are required to\n   * be installed (and satisfied) by the _consumer_ of this library. Using peer\n   * dependencies allows you to ensure that only a single module of a certain\n   * library exists in the `node_modules` tree of your consumers.\n   *\n   * Note that prior to npm@7, peer dependencies are _not_ automatically\n   * installed, which means that adding peer dependencies to a library will be a\n   * breaking change for your customers.\n   *\n   * Unless `peerDependencyOptions.pinnedDevDependency` is disabled (it is\n   * enabled by default), projen will automatically add a dev dependency with a\n   * pinned version for each peer dependency. This will ensure that you build &\n   * test your module against the lowest peer version required.\n   *\n   * @default []\n   */\n  readonly peerDeps?: string[];\n\n  /**\n   * List of dependencies to bundle into this module. These modules will be\n   * added both to the `dependencies` section and `bundledDependencies` section of\n   * your `package.json`.\n   *\n   * The recommendation is to only specify the module name here (e.g.\n   * `express`). This will behave similar to `yarn add` or `npm install` in the\n   * sense that it will add the module as a dependency to your `package.json`\n   * file with the latest version (`^`). You can specify semver requirements in\n   * the same syntax passed to `npm i` or `yarn add` (e.g. `express@^2`) and\n   * this will be what you `package.json` will eventually include.\n   */\n  readonly bundledDeps?: string[];\n\n  /**\n   * Options for `peerDeps`.\n   */\n  readonly peerDependencyOptions?: PeerDependencyOptions;\n\n  /**\n   * Allow the project to include `peerDependencies` and `bundledDependencies`.\n   * This is normally only allowed for libraries. For apps, there's no meaning\n   * for specifying these.\n   *\n   * @default true\n   */\n  readonly allowLibraryDependencies?: boolean;\n\n  /**\n   * Keywords to include in `package.json`.\n   */\n  readonly keywords?: string[];\n\n  /**\n   * Module entrypoint (`main` in `package.json`)\n   *\n   * Set to an empty string to not include `main` in your package.json\n   *\n   * @default \"lib/index.js\"\n   */\n  readonly entrypoint?: string;\n\n  /**\n   * Binary programs vended with your module.\n   *\n   * You can use this option to add/customize how binaries are represented in\n   * your `package.json`, but unless `autoDetectBin` is `false`, every\n   * executable file under `bin` will automatically be added to this section.\n   */\n  readonly bin?: Record<string, string>;\n\n  /**\n   * Automatically add all executables under the `bin` directory to your\n   * `package.json` file under the `bin` section.\n   *\n   * @default true\n   */\n  readonly autoDetectBin?: boolean;\n\n  /**\n   * npm scripts to include. If a script has the same name as a standard script,\n   * the standard script will be overwritten.\n   *\n   * @default {}\n   */\n  readonly scripts?: { [name: string]: string };\n\n  /**\n   * The Node Package Manager used to execute scripts\n   *\n   * @default NodePackageManager.YARN\n   */\n  readonly packageManager?: NodePackageManager;\n\n  /**\n   * The repository is the location where the actual code for your package lives.\n   * See https://classic.yarnpkg.com/en/docs/package-json/#toc-repository\n   */\n  readonly repository?: string;\n\n  /**\n   * If the package.json for your package is not in the root directory (for example if it is part of a monorepo),\n   * you can specify the directory in which it lives.\n   */\n  readonly repositoryDirectory?: string;\n\n  /**\n   * Author's name\n   */\n  readonly authorName?: string;\n\n  /**\n   * Author's e-mail\n   */\n  readonly authorEmail?: string;\n\n  /**\n   * Author's URL / Website\n   */\n  readonly authorUrl?: string;\n\n  /**\n   * Author's Organization\n   */\n  readonly authorOrganization?: boolean;\n\n  /**\n   * Package's Homepage / Website\n   */\n  readonly homepage?: string;\n\n  /**\n   * Package's Stability\n   */\n  readonly stability?: string;\n\n  /**\n   * Minimum Node.js version to require via package.json `engines` (inclusive).\n   *\n   * @default - no \"engines\" specified\n   */\n  readonly minNodeVersion?: string;\n\n  /**\n   * Minimum node.js version to require via `engines` (inclusive).\n   *\n   * @default - no max\n   */\n  readonly maxNodeVersion?: string;\n\n  /**\n   * License's SPDX identifier.\n   * See https://github.com/projen/projen/tree/main/license-text for a list of supported licenses.\n   * Use the `licensed` option if you want to no license to be specified.\n   *\n   * @default \"Apache-2.0\"\n   */\n  readonly license?: string;\n\n  /**\n   * Indicates if a license should be added.\n   *\n   * @default true\n   */\n  readonly licensed?: boolean;\n\n  /**\n   * The base URL of the npm package registry.\n   *\n   * Must be a URL (e.g. start with \"https://\" or \"http://\")\n   *\n   * @default \"https://registry.npmjs.org\"\n   */\n  readonly npmRegistryUrl?: string;\n\n  /**\n   * The host name of the npm registry to publish to. Cannot be set together with `npmRegistryUrl`.\n   *\n   * @deprecated use `npmRegistryUrl` instead\n   */\n  readonly npmRegistry?: string;\n\n  /**\n   * The url to your project's issue tracker.\n   */\n  readonly bugsUrl?: string;\n\n  /**\n   * The email address to which issues should be reported.\n   */\n  readonly bugsEmail?: string;\n\n  /**\n   * Access level of the npm package.\n   *\n   * @default - for scoped packages (e.g. `foo@bar`), the default is\n   * `NpmAccess.RESTRICTED`, for non-scoped packages, the default is\n   * `NpmAccess.PUBLIC`.\n   */\n  readonly npmAccess?: NpmAccess;\n\n  /**\n   * GitHub secret which contains the NPM token to use when publishing packages.\n   *\n   * @default \"NPM_TOKEN\"\n   */\n  readonly npmTokenSecret?: string;\n\n  /**\n   * Options for npm packages using AWS CodeArtifact.\n   * This is required if publishing packages to, or installing scoped packages from AWS CodeArtifact\n   *\n   * @default - undefined\n   */\n  readonly codeArtifactOptions?: CodeArtifactOptions;\n\n  /**\n   * Options for privately hosted scoped packages\n   *\n   * @default - fetch all scoped packages from the public npm registry\n   */\n  readonly scopedPackagesOptions?: ScopedPackagesOptions[];\n}\n\nexport interface CodeArtifactOptions {\n  /**\n   * GitHub secret which contains the AWS access key ID to use when publishing packages to AWS CodeArtifact.\n   * This property must be specified only when publishing to AWS CodeArtifact (`npmRegistryUrl` contains AWS CodeArtifact URL).\n   *\n   * @default \"AWS_ACCESS_KEY_ID\"\n   */\n  readonly accessKeyIdSecret?: string;\n\n  /**\n   * GitHub secret which contains the AWS secret access key to use when publishing packages to AWS CodeArtifact.\n   * This property must be specified only when publishing to AWS CodeArtifact (`npmRegistryUrl` contains AWS CodeArtifact URL).\n   *\n   * @default \"AWS_SECRET_ACCESS_KEY\"\n   */\n  readonly secretAccessKeySecret?: string;\n\n  /**\n   * ARN of AWS role to be assumed prior to get authorization token from AWS CodeArtifact\n   * This property must be specified only when publishing to AWS CodeArtifact (`registry` contains AWS CodeArtifact URL).\n   *\n   * @default undefined\n   */\n  readonly roleToAssume?: string;\n}\n\n/**\n * Options for scoped packages\n */\nexport interface ScopedPackagesOptions {\n  /**\n   * Scope of the packages\n   *\n   * @example \"@angular\"\n   */\n  readonly scope: string;\n\n  /**\n   * URL of the registry for scoped packages\n   */\n  readonly registryUrl: string;\n}\n\n/**\n * Represents the npm `package.json` file.\n */\nexport class NodePackage extends Component {\n  /**\n   * The name of the npm package.\n   */\n  public readonly packageName: string;\n\n  /**\n   * The module's entrypoint (e.g. `lib/index.js`).\n   */\n  public readonly entrypoint: string;\n\n  /**\n   * Allow project to take library dependencies.\n   */\n  public readonly allowLibraryDependencies: boolean;\n\n  /**\n   * The package manager to use.\n   */\n  public readonly packageManager: NodePackageManager;\n\n  /**\n   * @deprecated use `addField(x, y)`\n   */\n  public readonly manifest: any;\n\n  /**\n   * Minimum node.js version required by this package.\n   * @default - no minimum\n   */\n  public readonly minNodeVersion?: string;\n\n  /**\n   * Maximum node version required by this pacakge.\n   * @default - no maximum.\n   */\n  public readonly maxNodeVersion?: string;\n\n  /**\n   * The SPDX license of this module. `undefined` if this package is not licensed.\n   */\n  public readonly license?: string;\n\n  /**\n   * npm registry (e.g. `https://registry.npmjs.org`). Use `npmRegistryHost` to get just the host name.\n   */\n  public readonly npmRegistryUrl: string;\n\n  /**\n   * The npm registry host (e.g. `registry.npmjs.org`).\n   */\n  public readonly npmRegistry: string;\n\n  /**\n   * GitHub secret which contains the NPM token to use when publishing packages.\n   */\n  public readonly npmTokenSecret?: string;\n\n  /**\n   * Options for npm packages using AWS CodeArtifact.\n   * This is required if publishing packages to, or installing scoped packages from AWS CodeArtifact\n   *\n   * @default - undefined\n   */\n  readonly codeArtifactOptions?: CodeArtifactOptions;\n\n  /**\n   * Options for privately hosted scoped packages\n   *\n   * @default undefined\n   */\n  readonly scopedPackagesOptions?: ScopedPackagesOptions[];\n\n  /**\n   * npm package access level.\n   */\n  public readonly npmAccess: NpmAccess;\n\n  /**\n   * The name of the lock file.\n   */\n  public readonly lockFile: string;\n\n  private readonly keywords: Set<string> = new Set();\n  private readonly bin: Record<string, string> = {};\n  private readonly engines: Record<string, string> = {};\n  private readonly peerDependencyOptions: PeerDependencyOptions;\n  private readonly file: JsonFile;\n  private _renderedDeps?: NpmDependencies;\n\n  constructor(project: Project, options: NodePackageOptions = {}) {\n    super(project);\n\n    this.packageName = options.packageName ?? project.name;\n    this.peerDependencyOptions = {\n      pinnedDevDependency: true,\n      ...options.peerDependencyOptions,\n    };\n    this.allowLibraryDependencies = options.allowLibraryDependencies ?? true;\n    this.packageManager = options.packageManager ?? NodePackageManager.YARN;\n    this.entrypoint = options.entrypoint ?? \"lib/index.js\";\n    this.lockFile = determineLockfile(this.packageManager);\n\n    this.project.annotateGenerated(`/${this.lockFile}`);\n\n    const {\n      npmAccess,\n      npmRegistry,\n      npmRegistryUrl,\n      npmTokenSecret,\n      codeArtifactOptions,\n      scopedPackagesOptions,\n    } = this.parseNpmOptions(options);\n    this.npmAccess = npmAccess;\n    this.npmRegistry = npmRegistry;\n    this.npmRegistryUrl = npmRegistryUrl;\n    this.npmTokenSecret = npmTokenSecret;\n    this.codeArtifactOptions = codeArtifactOptions;\n    this.scopedPackagesOptions = scopedPackagesOptions;\n\n    this.processDeps(options);\n\n    this.addCodeArtifactLoginScript();\n\n    const prev = this.readPackageJson() ?? {};\n\n    // empty objects are here to preserve order for backwards compatibility\n    this.manifest = {\n      name: this.packageName,\n      description: options.description,\n      repository: !options.repository\n        ? undefined\n        : {\n            type: \"git\",\n            url: options.repository,\n            directory: options.repositoryDirectory,\n          },\n      bin: () => this.renderBin(),\n      scripts: () => this.renderScripts(),\n      author: this.renderAuthor(options),\n      devDependencies: {},\n      peerDependencies: {},\n      dependencies: {},\n      bundledDependencies: [],\n      keywords: () => this.renderKeywords(),\n      engines: () => this.renderEngines(),\n      main: this.entrypoint !== \"\" ? this.entrypoint : undefined,\n      license: () => this.license ?? UNLICENSED,\n      homepage: options.homepage,\n      publishConfig: () => this.renderPublishConfig(),\n\n      // in release CI builds we bump the version before we run \"build\" so we want\n      // to preserve the version number. otherwise, we always set it to 0.0.0\n      version: this.determineVersion(prev?.version),\n      bugs:\n        options.bugsEmail || options.bugsUrl\n          ? {\n              email: options.bugsEmail,\n              url: options.bugsUrl,\n            }\n          : undefined,\n    };\n\n    // override any scripts from options (if specified)\n    for (const [cmdname, shell] of Object.entries(options.scripts ?? {})) {\n      project.addTask(cmdname, { exec: shell });\n    }\n\n    this.file = new JsonFile(this.project, \"package.json\", {\n      obj: this.manifest,\n      readonly: false, // we want \"yarn add\" to work and we have anti-tamper\n      newline: false, // when file is edited by npm/yarn it doesn't include a newline\n      committed: true, // needs to be committed so users can install the dependencies\n    });\n\n    this.addKeywords(...(options.keywords ?? []));\n    this.addBin(options.bin ?? {});\n\n    // automatically add all executable files under \"bin\"\n    if (options.autoDetectBin ?? true) {\n      this.autoDiscoverBinaries();\n    }\n\n    // node version\n    this.minNodeVersion = options.minNodeVersion;\n    this.maxNodeVersion = options.maxNodeVersion;\n    this.addNodeEngine();\n\n    // license\n    if (options.licensed ?? true) {\n      this.license = options.license ?? \"Apache-2.0\";\n    }\n  }\n\n  /**\n   * Defines normal dependencies.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addDeps(...deps: string[]) {\n    for (const dep of deps) {\n      this.project.deps.addDependency(dep, DependencyType.RUNTIME);\n    }\n  }\n\n  /**\n   * Defines development/test dependencies.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addDevDeps(...deps: string[]) {\n    for (const dep of deps) {\n      this.project.deps.addDependency(dep, DependencyType.BUILD);\n    }\n  }\n\n  /**\n   * Defines peer dependencies.\n   *\n   * When adding peer dependencies, a devDependency will also be added on the\n   * pinned version of the declared peer. This will ensure that you are testing\n   * your code against the minimum version required from your consumers.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addPeerDeps(...deps: string[]) {\n    if (Object.keys(deps).length && !this.allowLibraryDependencies) {\n      throw new Error(\n        `cannot add peer dependencies to an APP project: ${Object.keys(\n          deps\n        ).join(\",\")}`\n      );\n    }\n\n    for (const dep of deps) {\n      this.project.deps.addDependency(dep, DependencyType.PEER);\n    }\n  }\n\n  /**\n   * Defines bundled dependencies.\n   *\n   * Bundled dependencies will be added as normal dependencies as well as to the\n   * `bundledDependencies` section of your `package.json`.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addBundledDeps(...deps: string[]) {\n    if (deps.length && !this.allowLibraryDependencies) {\n      throw new Error(\n        `cannot add bundled dependencies to an APP project: ${deps.join(\",\")}`\n      );\n    }\n\n    for (const dep of deps) {\n      this.project.deps.addDependency(dep, DependencyType.BUNDLED);\n    }\n  }\n\n  /**\n   * Adds an `engines` requirement to your package.\n   * @param engine The engine (e.g. `node`)\n   * @param version The semantic version requirement (e.g. `^10`)\n   */\n  public addEngine(engine: string, version: string) {\n    this.engines[engine] = version;\n  }\n\n  /**\n   * Adds keywords to package.json (deduplicated)\n   * @param keywords The keywords to add\n   */\n  public addKeywords(...keywords: string[]) {\n    for (const k of keywords) {\n      this.keywords.add(k);\n    }\n  }\n\n  public addBin(bins: Record<string, string>) {\n    for (const [k, v] of Object.entries(bins)) {\n      this.bin[k] = v;\n    }\n  }\n\n  /**\n   * Override the contents of an npm package.json script.\n   *\n   * @param name The script name\n   * @param command The command to execute\n   */\n  public setScript(name: string, command: string) {\n    this.file.addOverride(`scripts.${name}`, command);\n  }\n\n  /**\n   * Removes the npm script (always successful).\n   * @param name The name of the script.\n   */\n  public removeScript(name: string) {\n    this.file.addDeletionOverride(`scripts.${name}`);\n  }\n\n  /**\n   * Indicates if a script by the given name is defined.\n   * @param name The name of the script\n   * @deprecated Use `project.tasks.tryFind(name)`\n   */\n  public hasScript(name: string) {\n    return this.project.tasks.tryFind(name) !== undefined;\n  }\n\n  /**\n   * Directly set fields in `package.json`.\n   * @escape\n   * @param name field name\n   * @param value field value\n   */\n  public addField(name: string, value: any) {\n    this.manifest[name] = value;\n  }\n\n  /**\n   * Sets the package version.\n   * @param version Package version.\n   */\n  public addVersion(version: string) {\n    this.manifest.version = version;\n  }\n\n  /**\n   * Defines resolutions for dependencies to change the normally resolved\n   * version of a dependency to something else.\n   *\n   * @param resolutions Names resolutions to be added. Specify a version or\n   * range with this syntax:\n   * `module@^7`.\n   */\n  public addPackageResolutions(...resolutions: string[]) {\n    const fieldName = packageResolutionsFieldName(this.packageManager);\n\n    for (const resolution of resolutions) {\n      const { name, version = \"*\" } = Dependencies.parseDependency(resolution);\n      this.file.addOverride(`${fieldName}.${name}`, version);\n    }\n  }\n\n  /**\n   * Returns the command to execute in order to install all dependencies (always frozen).\n   */\n  public get installCommand() {\n    return this.renderInstallCommand(true);\n  }\n\n  /**\n   * Renders `yarn install` or `npm install` with lockfile update (not frozen)\n   */\n  public get installAndUpdateLockfileCommand() {\n    return this.renderInstallCommand(false);\n  }\n\n  /**\n   * Render a package manager specific command to upgrade all requested dependencies.\n   */\n  public renderUpgradePackagesCommand(\n    exclude: string[],\n    include?: string[]\n  ): string {\n    const project = this.project;\n    function upgradePackages(command: string) {\n      return () => {\n        if (exclude.length === 0 && !include) {\n          // request to upgrade all packages\n          // separated for asthetic reasons.\n          return command;\n        }\n\n        // filter by exclude and include.\n        return `${command} ${project.deps.all\n          .map((d) => d.name)\n          .filter((d) => (include ? include.includes(d) : true))\n          .filter((d) => !exclude.includes(d))\n          .join(\" \")}`;\n      };\n    }\n\n    let lazy = undefined;\n    switch (this.packageManager) {\n      case NodePackageManager.YARN:\n        lazy = upgradePackages(\"yarn upgrade\");\n        break;\n      case NodePackageManager.NPM:\n        lazy = upgradePackages(\"npm update\");\n        break;\n      case NodePackageManager.PNPM:\n        lazy = upgradePackages(\"pnpm update\");\n        break;\n      default:\n        throw new Error(`unexpected package manager ${this.packageManager}`);\n    }\n\n    // return a lazy function so that dependencies include ones that were\n    // added post project instantiation (i.e using project.addDeps)\n    return lazy as unknown as string;\n  }\n\n  // ---------------------------------------------------------------------------------------\n\n  public preSynthesize() {\n    super.preSynthesize();\n    this._renderedDeps = this.renderDependencies();\n  }\n\n  public postSynthesize() {\n    super.postSynthesize();\n\n    // only run \"install\" if package.json has changed or if we don't have a\n    // `node_modules` directory.\n    if (\n      this.file.changed ||\n      !existsSync(join(this.project.outdir, \"node_modules\"))\n    ) {\n      this.installDependencies();\n    }\n\n    // resolve \"*\" deps in package.json and update it. if it was changed,\n    // install deps again so that lockfile is updated.\n    if (this.resolveDepsAndWritePackageJson()) {\n      this.installDependencies();\n    }\n  }\n\n  /**\n   * The command which executes \"projen\".\n   */\n  public get projenCommand() {\n    return this.project.projenCommand;\n  }\n\n  /**\n   * Returns `true` if we are running within a CI build.\n   */\n  private get isAutomatedBuild(): boolean {\n    return isTruthy(process.env.CI);\n  }\n\n  private determineVersion(currVersion?: string) {\n    if (!this.isReleaseBuild) {\n      return \"0.0.0\";\n    }\n\n    return currVersion ?? \"0.0.0\";\n  }\n\n  /**\n   * Returns `true` if this is a CI release build.\n   */\n  private get isReleaseBuild(): boolean {\n    return isTruthy(process.env.RELEASE);\n  }\n\n  // -------------------------------------------------------------------------------------------\n\n  private parseNpmOptions(options: NodePackageOptions) {\n    let npmRegistryUrl = options.npmRegistryUrl;\n    if (options.npmRegistry) {\n      if (npmRegistryUrl) {\n        throw new Error(\n          'cannot use the deprecated \"npmRegistry\" together with \"npmRegistryUrl\". please use \"npmRegistryUrl\" instead.'\n        );\n      }\n\n      npmRegistryUrl = `https://${options.npmRegistry}`;\n    }\n\n    const npmr = urlparse(npmRegistryUrl ?? DEFAULT_NPM_REGISTRY_URL);\n    if (!npmr || !npmr.hostname || !npmr.href) {\n      throw new Error(\n        `unable to determine npm registry host from url ${npmRegistryUrl}. Is this really a URL?`\n      );\n    }\n\n    const npmAccess = options.npmAccess ?? defaultNpmAccess(this.packageName);\n    if (!isScoped(this.packageName) && npmAccess === NpmAccess.RESTRICTED) {\n      throw new Error(\n        `\"npmAccess\" cannot be RESTRICTED for non-scoped npm package \"${this.packageName}\"`\n      );\n    }\n\n    const isAwsCodeArtifact = isAwsCodeArtifactRegistry(npmRegistryUrl);\n    const hasScopedPackage =\n      options.scopedPackagesOptions &&\n      options.scopedPackagesOptions.length !== 0;\n\n    if (isAwsCodeArtifact) {\n      if (options.npmTokenSecret) {\n        throw new Error(\n          '\"npmTokenSecret\" must not be specified when publishing AWS CodeArtifact.'\n        );\n      }\n    } else {\n      if (\n        (options.codeArtifactOptions?.accessKeyIdSecret ||\n          options.codeArtifactOptions?.secretAccessKeySecret ||\n          options.codeArtifactOptions?.roleToAssume) &&\n        !hasScopedPackage\n      ) {\n        throw new Error(\n          \"codeArtifactOptions must only be specified when publishing AWS CodeArtifact or used in scoped packages.\"\n        );\n      }\n    }\n\n    // apply defaults for AWS CodeArtifact\n    let codeArtifactOptions: CodeArtifactOptions | undefined;\n    if (isAwsCodeArtifact || hasScopedPackage) {\n      codeArtifactOptions = {\n        accessKeyIdSecret:\n          options.codeArtifactOptions?.accessKeyIdSecret ?? \"AWS_ACCESS_KEY_ID\",\n        secretAccessKeySecret:\n          options.codeArtifactOptions?.secretAccessKeySecret ??\n          \"AWS_SECRET_ACCESS_KEY\",\n        roleToAssume: options.codeArtifactOptions?.roleToAssume,\n      };\n    }\n\n    return {\n      npmAccess,\n      npmRegistry: npmr.hostname + this.renderNpmRegistryPath(npmr.pathname!),\n      npmRegistryUrl: npmr.href,\n      npmTokenSecret: defaultNpmToken(options.npmTokenSecret, npmr.hostname),\n      codeArtifactOptions,\n      scopedPackagesOptions: this.parseScopedPackagesOptions(\n        options.scopedPackagesOptions\n      ),\n    };\n  }\n\n  private parseScopedPackagesOptions(\n    scopedPackagesOptions?: ScopedPackagesOptions[]\n  ): ScopedPackagesOptions[] | undefined {\n    if (!scopedPackagesOptions) {\n      return undefined;\n    }\n\n    return scopedPackagesOptions.map((option): ScopedPackagesOptions => {\n      if (!isScoped(option.scope)) {\n        throw new Error(\n          `Scope must start with \"@\" in options, found ${option.scope}`\n        );\n      }\n\n      if (!isAwsCodeArtifactRegistry(option.registryUrl)) {\n        throw new Error(\n          `Only AWS Code artifact scoped registry is supported for now, found ${option.registryUrl}`\n        );\n      }\n\n      const result: ScopedPackagesOptions = {\n        registryUrl: option.registryUrl,\n        scope: option.scope,\n      };\n\n      return result;\n    });\n  }\n\n  private addCodeArtifactLoginScript() {\n    if (\n      !this.scopedPackagesOptions ||\n      this.scopedPackagesOptions.length === 0\n    ) {\n      return;\n    }\n\n    this.project.addTask(\"ca:login\", {\n      requiredEnv: [\"AWS_ACCESS_KEY_ID\", \"AWS_SECRET_ACCESS_KEY\"],\n      steps: [\n        { exec: \"which aws\" }, // check that AWS CLI is installed\n        ...this.scopedPackagesOptions.map((scopedPackagesOption) => {\n          const { registryUrl, scope } = scopedPackagesOption;\n          const { domain, region, accountId, registry } =\n            extractCodeArtifactDetails(registryUrl);\n          // reference: https://docs.aws.amazon.com/codeartifact/latest/ug/npm-auth.html\n          const commands = [\n            `npm config set ${scope}:registry ${registryUrl}`,\n            `CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token --domain ${domain} --region ${region} --domain-owner ${accountId} --query authorizationToken --output text)`,\n            `npm config set //${registry}:_authToken=$CODEARTIFACT_AUTH_TOKEN`,\n            `npm config set //${registry}:always-auth=true`,\n          ];\n          return {\n            exec: commands.join(\"; \"),\n          };\n        }),\n      ],\n    });\n  }\n\n  private addNodeEngine() {\n    if (!this.minNodeVersion && !this.maxNodeVersion) {\n      return;\n    }\n\n    let nodeVersion = \"\";\n    if (this.minNodeVersion) {\n      nodeVersion += `>= ${this.minNodeVersion}`;\n    }\n    if (this.maxNodeVersion) {\n      nodeVersion += ` <= ${this.maxNodeVersion}`;\n    }\n    this.addEngine(\"node\", nodeVersion);\n  }\n\n  private renderNpmRegistryPath(path: string | undefined): string {\n    if (!path || path == \"/\") {\n      return \"\";\n    } else {\n      return path;\n    }\n  }\n\n  private renderInstallCommand(frozen: boolean) {\n    switch (this.packageManager) {\n      case NodePackageManager.YARN:\n        return [\n          \"yarn install\",\n          \"--check-files\", // ensure all modules exist (especially projen which was just removed).\n          ...(frozen ? [\"--frozen-lockfile\"] : []),\n        ].join(\" \");\n\n      case NodePackageManager.NPM:\n        return frozen ? \"npm ci\" : \"npm install\";\n\n      case NodePackageManager.PNPM:\n        return frozen\n          ? \"pnpm i --frozen-lockfile\"\n          : \"pnpm i --no-frozen-lockfile\";\n\n      default:\n        throw new Error(`unexpected package manager ${this.packageManager}`);\n    }\n  }\n\n  private processDeps(options: NodePackageOptions) {\n    this.addDeps(...(options.deps ?? []));\n    this.addDevDeps(...(options.devDeps ?? []));\n    this.addPeerDeps(...(options.peerDeps ?? []));\n    this.addBundledDeps(...(options.bundledDeps ?? []));\n  }\n\n  private renderDependencies(): NpmDependencies {\n    const devDependencies: Record<string, string> = {};\n    const peerDependencies: Record<string, string> = {};\n    const dependencies: Record<string, string> = {};\n    const bundledDependencies = new Array<string>();\n\n    // synthetic dependencies: add a pinned build dependency to ensure we are\n    // testing against the minimum requirement of the peer.\n    if (this.peerDependencyOptions.pinnedDevDependency) {\n      for (const dep of this.project.deps.all.filter(\n        (d) => d.type === DependencyType.PEER\n      )) {\n        let req = dep.name;\n\n        // skip if we already have a runtime dependency on this peer\n        if (\n          this.project.deps.tryGetDependency(dep.name, DependencyType.RUNTIME)\n        ) {\n          continue;\n        }\n\n        if (dep.version) {\n          const ver = minVersion(dep.version);\n          if (!ver) {\n            throw new Error(\n              `unable to determine minimum semver for peer dependency ${dep.name}@${dep.version}`\n            );\n          }\n\n          req += \"@\" + ver;\n        }\n        this.addDevDeps(req);\n      }\n    }\n\n    for (const dep of this.project.deps.all) {\n      let version = dep.version ?? \"*\";\n      let name = dep.name;\n\n      if (name.startsWith(\"file:\")) {\n        const localDependencyPath = name.substring(5);\n        const depPackageJson = resolve(\n          this.project.outdir,\n          localDependencyPath,\n          \"package.json\"\n        );\n        const pkgFile = readFileSync(depPackageJson, \"utf8\");\n        const pkg = JSON.parse(pkgFile);\n        version = localDependencyPath;\n        name = pkg.name;\n      }\n\n      switch (dep.type) {\n        case DependencyType.BUNDLED:\n          bundledDependencies.push(name);\n\n          if (\n            this.project.deps.all.find(\n              (d) => d.name === name && d.type === DependencyType.PEER\n            )\n          ) {\n            throw new Error(\n              `unable to bundle \"${name}\". it cannot appear as a peer dependency`\n            );\n          }\n\n          // also add as a runtime dependency\n          dependencies[name] = version;\n          break;\n\n        case DependencyType.PEER:\n          peerDependencies[name] = version;\n          break;\n\n        case DependencyType.RUNTIME:\n          dependencies[name] = version;\n          break;\n\n        case DependencyType.TEST:\n        case DependencyType.DEVENV:\n        case DependencyType.BUILD:\n          devDependencies[name] = version;\n          break;\n      }\n    }\n\n    // returns a lazy value to normalize during synthesis\n    const normalize = (obj: any) => () => sorted(obj);\n\n    // update the manifest we are about to save into `package.json`\n    this.manifest.devDependencies = normalize(devDependencies);\n    this.manifest.peerDependencies = normalize(peerDependencies);\n    this.manifest.dependencies = normalize(dependencies);\n    this.manifest.bundledDependencies = sorted(bundledDependencies);\n\n    // nothing further to do if package.json file does not exist\n    const pkg = this.readPackageJson();\n    if (!pkg) {\n      return { devDependencies, peerDependencies, dependencies };\n    }\n\n    const readDeps = (\n      user: Record<string, string>,\n      current: Record<string, string> = {}\n    ) => {\n      for (const [name, userVersion] of Object.entries(user)) {\n        const currentVersion = current[name];\n\n        // respect user version if it's not '*' or if current version is undefined\n        if (userVersion !== \"*\" || !currentVersion || currentVersion === \"*\") {\n          continue;\n        }\n\n        // memoize current version in memory so it is preserved when saving\n        user[name] = currentVersion;\n      }\n\n      // report removals\n      for (const name of Object.keys(current ?? {})) {\n        if (!user[name]) {\n          this.project.logger.verbose(`${name}: removed`);\n        }\n      }\n    };\n\n    readDeps(devDependencies, pkg.devDependencies);\n    readDeps(dependencies, pkg.dependencies);\n    readDeps(peerDependencies, pkg.peerDependencies);\n\n    return { devDependencies, dependencies, peerDependencies };\n  }\n\n  /**\n   * Resolves any deps that do not have a specified version (e.g. `*`) and\n   * update `package.json` if needed.\n   *\n   * @returns `true` if package.json was updated or `false` if not.\n   */\n  private resolveDepsAndWritePackageJson(): boolean {\n    const outdir = this.project.outdir;\n    const rootPackageJson = join(outdir, \"package.json\");\n\n    const original = readFileSync(rootPackageJson, \"utf8\");\n    const pkg = JSON.parse(original);\n\n    const resolveDeps = (\n      current: { [name: string]: string },\n      user: Record<string, string>\n    ) => {\n      const result: Record<string, string> = {};\n      current = current ?? {};\n      user = user ?? {};\n\n      for (const [name, currentDefinition] of Object.entries(user)) {\n        // find actual version from node_modules\n        let desiredVersion = currentDefinition;\n\n        if (currentDefinition === \"*\") {\n          try {\n            const modulePath = require.resolve(`${name}/package.json`, {\n              paths: [outdir],\n            });\n            const module = readJsonSync(modulePath);\n            desiredVersion = `^${module.version}`;\n          } catch (e) {}\n\n          if (!desiredVersion) {\n            this.project.logger.warn(\n              `unable to resolve version for ${name} from installed modules`\n            );\n            continue;\n          }\n        }\n\n        if (currentDefinition !== desiredVersion) {\n          this.project.logger.verbose(\n            `${name}: ${currentDefinition} => ${desiredVersion}`\n          );\n        }\n\n        result[name] = desiredVersion;\n      }\n\n      // print removed packages\n      for (const name of Object.keys(current)) {\n        if (!result[name]) {\n          this.project.logger.verbose(`${name} removed`);\n        }\n      }\n\n      return result;\n    };\n\n    const rendered = this._renderedDeps;\n    if (!rendered) {\n      throw new Error(\"assertion failed\");\n    }\n\n    const deps = resolveDeps(pkg.dependencies, rendered.dependencies);\n    const devDeps = resolveDeps(pkg.devDependencies, rendered.devDependencies);\n    const peerDeps = resolveDeps(\n      pkg.peerDependencies,\n      rendered.peerDependencies\n    );\n\n    if (this.peerDependencyOptions.pinnedDevDependency) {\n      for (const [name, version] of Object.entries(peerDeps)) {\n        // Skip if we already have a runtime dependency on this peer\n        // or if devDependency version is already set.\n        // Relies on the \"*\" devDependency added in the presynth step\n        if (deps[name] || rendered.devDependencies[name] !== \"*\") {\n          continue;\n        }\n\n        // Take version and pin as dev dependency\n        const ver = minVersion(version);\n        if (!ver) {\n          throw new Error(\n            `unable to determine minimum semver for peer dependency ${name}@${version}`\n          );\n        }\n\n        devDeps[name] = ver;\n      }\n    }\n\n    pkg.dependencies = sorted(deps);\n    pkg.devDependencies = sorted(devDeps);\n    pkg.peerDependencies = sorted(peerDeps);\n\n    const jsonContent = JSON.stringify(pkg, undefined, 2);\n\n    const updated =\n      this.packageManager === NodePackageManager.NPM\n        ? `${jsonContent}\\n`\n        : jsonContent;\n\n    if (original === updated) {\n      return false;\n    }\n\n    writeFile(rootPackageJson, updated);\n    return true;\n  }\n\n  private renderPublishConfig() {\n    // omit values if they are the same as the npm defaults\n    return resolveJson(\n      {\n        registry:\n          this.npmRegistryUrl !== DEFAULT_NPM_REGISTRY_URL\n            ? this.npmRegistryUrl\n            : undefined,\n        access:\n          this.npmAccess !== defaultNpmAccess(this.packageName)\n            ? this.npmAccess\n            : undefined,\n      },\n      { omitEmpty: true }\n    );\n  }\n\n  private renderKeywords() {\n    const kwds = Array.from(this.keywords);\n    return sorted(kwds.sort());\n  }\n\n  private renderEngines() {\n    return sorted(this.engines);\n  }\n\n  private autoDiscoverBinaries() {\n    const binrel = \"bin\";\n    const bindir = join(this.project.outdir, binrel);\n    if (existsSync(bindir)) {\n      for (const file of readdirSync(bindir)) {\n        try {\n          accessSync(join(bindir, file), constants.X_OK);\n          this.bin[file] = join(binrel, file).replace(/\\\\/g, \"/\");\n        } catch (e) {\n          // not executable, skip\n        }\n      }\n    }\n  }\n\n  private renderAuthor(options: NodePackageOptions) {\n    let author;\n    if (options.authorName) {\n      author = {\n        name: options.authorName,\n        email: options.authorEmail,\n        url: options.authorUrl,\n        organization: options.authorOrganization ?? false,\n      };\n    } else {\n      if (\n        options.authorEmail ||\n        options.authorUrl ||\n        options.authorOrganization !== undefined\n      ) {\n        throw new Error(\n          '\"authorName\" is required if specifying \"authorEmail\" or \"authorUrl\"'\n        );\n      }\n    }\n    return author;\n  }\n\n  private renderBin() {\n    return sorted(this.bin);\n  }\n\n  private renderScripts() {\n    const result: any = {};\n    for (const task of this.project.tasks.all.sort((x, y) =>\n      x.name.localeCompare(y.name)\n    )) {\n      result[task.name] = this.npmScriptForTask(task);\n    }\n\n    return result;\n  }\n\n  private npmScriptForTask(task: Task) {\n    return `${this.projenCommand} ${task.name}`;\n  }\n\n  private readPackageJson() {\n    const file = join(this.project.outdir, \"package.json\");\n    if (!existsSync(file)) {\n      return undefined;\n    }\n\n    return readJsonSync(file);\n  }\n\n  private installDependencies() {\n    exec(this.renderInstallCommand(this.isAutomatedBuild), {\n      cwd: this.project.outdir,\n    });\n  }\n}\n\nexport interface PeerDependencyOptions {\n  /**\n   * Automatically add a pinned dev dependency.\n   * @default true\n   */\n  readonly pinnedDevDependency?: boolean;\n}\n\n/**\n * The node package manager to use.\n */\nexport enum NodePackageManager {\n  /**\n   * Use `yarn` as the package manager.\n   */\n  YARN = \"yarn\",\n\n  /**\n   * Use `npm` as the package manager.\n   */\n  NPM = \"npm\",\n\n  /**\n   * Use `pnpm` as the package manager.\n   */\n  PNPM = \"pnpm\",\n}\n\n/**\n * Npm package access level\n */\nexport enum NpmAccess {\n  /**\n   * Package is public.\n   */\n  PUBLIC = \"public\",\n\n  /**\n   * Package can only be accessed with credentials.\n   */\n  RESTRICTED = \"restricted\",\n}\n\ninterface NpmDependencies {\n  readonly dependencies: Record<string, string>;\n  readonly devDependencies: Record<string, string>;\n  readonly peerDependencies: Record<string, string>;\n}\n\n/**\n * Determines if an npm package is \"scoped\" (i.e. it starts with \"xxx@\").\n */\nfunction isScoped(packageName: string) {\n  return packageName.includes(\"@\");\n}\n\nfunction defaultNpmAccess(packageName: string) {\n  return isScoped(packageName) ? NpmAccess.RESTRICTED : NpmAccess.PUBLIC;\n}\n\nexport function defaultNpmToken(\n  npmToken: string | undefined,\n  registry: string | undefined\n) {\n  // if we are publishing to AWS CdodeArtifact, no NPM_TOKEN used (will be requested using AWS CLI later).\n  if (isAwsCodeArtifactRegistry(registry)) {\n    return undefined;\n  }\n\n  // if we are publishing to GitHub Packages, default to GITHUB_TOKEN.\n  const isGitHubPackages = registry === GITHUB_PACKAGES_REGISTRY;\n  return (\n    npmToken ??\n    (isGitHubPackages ? DEFAULT_GITHUB_TOKEN_SECRET : DEFAULT_NPM_TOKEN_SECRET)\n  );\n}\n\nfunction determineLockfile(packageManager: NodePackageManager) {\n  if (packageManager === NodePackageManager.YARN) {\n    return \"yarn.lock\";\n  } else if (packageManager === NodePackageManager.NPM) {\n    return \"package-lock.json\";\n  } else if (packageManager === NodePackageManager.PNPM) {\n    return \"pnpm-lock.yaml\";\n  }\n\n  throw new Error(`unsupported package manager ${packageManager}`);\n}\n"
  },
  {
    "path": "src/javascript/node-project.ts",
    "content": "import { join } from \"path\";\nimport { BuildWorkflow } from \"../build\";\nimport { PROJEN_DIR, PROJEN_RC } from \"../common\";\nimport {\n  AutoMerge,\n  DependabotOptions,\n  GitHubProject,\n  GitHubProjectOptions,\n  GitIdentity,\n} from \"../github\";\nimport { DEFAULT_GITHUB_ACTIONS_USER } from \"../github/constants\";\nimport { secretToString } from \"../github/util\";\nimport { JobStep, Triggers } from \"../github/workflows-model\";\nimport { IgnoreFile } from \"../ignore-file\";\nimport {\n  Prettier,\n  PrettierOptions,\n  UpgradeDependencies,\n  UpgradeDependenciesOptions,\n} from \"../javascript\";\nimport { License } from \"../license\";\nimport {\n  isAwsCodeArtifactRegistry,\n  Publisher,\n  Release,\n  ReleaseProjectOptions,\n} from \"../release\";\nimport { Task } from \"../task\";\nimport { deepMerge } from \"../util\";\nimport { Version } from \"../version\";\nimport { Bundler, BundlerOptions } from \"./bundler\";\nimport { Jest, JestOptions } from \"./jest\";\nimport {\n  CodeArtifactOptions,\n  NodePackage,\n  NodePackageManager,\n  NodePackageOptions,\n} from \"./node-package\";\nimport { Projenrc, ProjenrcOptions } from \"./projenrc\";\n\nconst PROJEN_SCRIPT = \"projen\";\n\nexport interface NodeProjectOptions\n  extends GitHubProjectOptions,\n    NodePackageOptions,\n    ReleaseProjectOptions {\n  /**\n   * License copyright owner.\n   *\n   * @default - defaults to the value of authorName or \"\" if `authorName` is undefined.\n   */\n  readonly copyrightOwner?: string;\n\n  /**\n   * The copyright years to put in the LICENSE file.\n   *\n   * @default - current year\n   */\n  readonly copyrightPeriod?: string;\n\n  /**\n   * Version of projen to install.\n   *\n   * @default - Defaults to the latest version.\n   */\n  readonly projenVersion?: string;\n\n  /**\n   * Indicates of \"projen\" should be installed as a devDependency.\n   *\n   * @default true\n   */\n  readonly projenDevDependency?: boolean;\n\n  /**\n   * Define a GitHub workflow for building PRs.\n   * @default - true if not a subproject\n   */\n  readonly buildWorkflow?: boolean;\n\n  /**\n   * Automatically update files modified during builds to pull-request branches. This means\n   * that any files synthesized by projen or e.g. test snapshots will always be up-to-date\n   * before a PR is merged.\n   *\n   * Implies that PR builds do not have anti-tamper checks.\n   *\n   * @default true\n   */\n  readonly mutableBuild?: boolean;\n\n  /**\n   * Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/\n   * Uses codecov/codecov-action@v1\n   * A secret is required for private repos. Configured with @codeCovTokenSecret\n   * @default false\n   */\n  readonly codeCov?: boolean;\n\n  /**\n   * Define the secret name for a specified https://codecov.io/ token\n   * A secret is required to send coverage for private repositories\n   * @default - if this option is not specified, only public repositories are supported\n   */\n  readonly codeCovTokenSecret?: string;\n\n  /**\n   * DEPRECATED: renamed to `release`.\n   *\n   * @default - true if not a subproject\n   * @deprecated see `release`.\n   */\n  readonly releaseWorkflow?: boolean;\n\n  /**\n   * Add release management to this project.\n   *\n   * @default - true (false for subprojects)\n   */\n  readonly release?: boolean;\n\n  /**\n   * The name of the main release branch.\n   *\n   * @default \"main\"\n   */\n  readonly defaultReleaseBranch: string;\n\n  /**\n   * Workflow steps to use in order to bootstrap this repo.\n   *\n   * @default \"yarn install --frozen-lockfile && yarn projen\"\n   */\n  readonly workflowBootstrapSteps?: JobStep[];\n\n  /**\n   * The git identity to use in workflows.\n   *\n   * @default - GitHub Actions\n   */\n  readonly workflowGitIdentity?: GitIdentity;\n\n  /**\n   * Automatically release to npm when new versions are introduced.\n   * @default false\n   */\n  readonly releaseToNpm?: boolean;\n\n  /**\n   * The node version to use in GitHub workflows.\n   *\n   * @default - same as `minNodeVersion`\n   */\n  readonly workflowNodeVersion?: string;\n\n  /**\n   * Use dependabot to handle dependency upgrades.\n   * Cannot be used in conjunction with `depsUpgrade`.\n   *\n   * @default false\n   */\n  readonly dependabot?: boolean;\n\n  /**\n   * Options for dependabot.\n   *\n   * @default - default options\n   */\n  readonly dependabotOptions?: DependabotOptions;\n\n  /**\n   * Use github workflows to handle dependency upgrades.\n   * Cannot be used in conjunction with `dependabot`.\n   *\n   * @default true\n   */\n  readonly depsUpgrade?: boolean;\n\n  /**\n   * Options for `UpgradeDependencies`.\n   *\n   * @default - default options\n   */\n  readonly depsUpgradeOptions?: UpgradeDependenciesOptions;\n\n  /**\n   * Automatically approve deps upgrade PRs, allowing them to be\n   * merged by mergify (if configued).\n   *\n   * Throw if set to true but `autoApproveOptions` are not defined.\n   *\n   * @default - true\n   */\n  readonly autoApproveUpgrades?: boolean;\n\n  /**\n   * Defines an .npmignore file. Normally this is only needed for libraries that\n   * are packaged as tarballs.\n   *\n   * @default true\n   */\n  readonly npmignoreEnabled?: boolean;\n\n  /**\n   * Additional entries to .npmignore.\n   * @deprecated - use `project.addPackageIgnore`\n   */\n  readonly npmignore?: string[];\n\n  /**\n   * Include a GitHub pull request template.\n   *\n   * @default true\n   */\n  readonly pullRequestTemplate?: boolean;\n\n  /**\n   * The contents of the pull request template.\n   *\n   * @default - default content\n   */\n  readonly pullRequestTemplateContents?: string[];\n\n  /**\n   * Setup prettier.\n   *\n   * @default false\n   */\n  readonly prettier?: boolean;\n\n  /**\n   * Prettier options\n   * @default - default options\n   */\n  readonly prettierOptions?: PrettierOptions;\n\n  /**\n   * Additional entries to .gitignore\n   */\n  readonly gitignore?: string[];\n\n  /**\n   * Setup jest unit tests\n   * @default true\n   */\n  readonly jest?: boolean;\n\n  /**\n   * Jest options\n   * @default - default options\n   */\n  readonly jestOptions?: JestOptions;\n\n  /**\n   * Generate (once) .projenrc.js (in JavaScript). Set to `false` in order to disable\n   * .projenrc.js generation.\n   *\n   * @default - true if projenrcJson is false\n   */\n  readonly projenrcJs?: boolean;\n\n  /**\n   * Options for .projenrc.js\n   * @default - default options\n   */\n  readonly projenrcJsOptions?: ProjenrcOptions;\n\n  /**\n   * Options for `Bundler`.\n   */\n  readonly bundlerOptions?: BundlerOptions;\n\n  /**\n   * A directory which will contain build artifacts.\n   *\n   * @default \"dist\"\n   */\n  readonly artifactsDirectory?: string;\n\n  /**\n   * Defines a `package` task that will produce an npm tarball under the\n   * artifacts directory (e.g. `dist`).\n   *\n   * @default true\n   */\n  readonly package?: boolean;\n\n  /**\n   * Build workflow triggers\n   * @default \"{ pullRequest: {}, workflowDispatch: {} }\"\n   */\n  readonly buildWorkflowTriggers?: Triggers;\n}\n\n/**\n * Automatic bump modes\n */\nexport enum AutoRelease {\n  /**\n   * Automatically bump & release a new version for every commit to \"main\"\n   */\n  EVERY_COMMIT,\n\n  /**\n   * Automatically bump & release a new version on a daily basis.\n   */\n  DAILY,\n}\n\n/**\n * Node.js project\n *\n * @pjid node\n */\nexport class NodeProject extends GitHubProject {\n  /**\n   * API for managing the node package.\n   */\n  public readonly package: NodePackage;\n\n  /**\n   * The .npmignore file.\n   */\n  public readonly npmignore?: IgnoreFile;\n\n  /**\n   * @deprecated use `package.allowLibraryDependencies`\n   */\n  public get allowLibraryDependencies(): boolean {\n    return this.package.allowLibraryDependencies;\n  }\n\n  /**\n   * @deprecated use `package.entrypoint`\n   */\n  public get entrypoint(): string {\n    return this.package.entrypoint;\n  }\n\n  /**\n   * Component that sets up mergify for merging approved pull requests.\n   */\n  public readonly autoMerge?: AutoMerge;\n\n  /**\n   * The PR build GitHub workflow. `undefined` if `buildWorkflow` is disabled.\n   */\n  public readonly buildWorkflow?: BuildWorkflow;\n\n  /**\n   * Package publisher. This will be `undefined` if the project does not have a\n   * release workflow.\n   *\n   * @deprecated use `release.publisher`.\n   */\n  public readonly publisher?: Publisher;\n\n  /**\n   * Release management.\n   */\n  public readonly release?: Release;\n\n  /**\n   * Minimum node.js version required by this package.\n   */\n  public get minNodeVersion(): string | undefined {\n    return this.package.minNodeVersion;\n  }\n\n  /**\n   * Maximum node version required by this pacakge.\n   */\n  public get maxNodeVersion(): string | undefined {\n    return this.package.maxNodeVersion;\n  }\n\n  protected readonly nodeVersion?: string;\n\n  /**\n   * The package manager to use.\n   *\n   * @deprecated use `package.packageManager`\n   */\n  public get packageManager(): NodePackageManager {\n    return this.package.packageManager;\n  }\n\n  /**\n   * The command to use to run scripts (e.g. `yarn run` or `npm run` depends on the package manager).\n   */\n  public readonly runScriptCommand: string;\n\n  /**\n   * The Jest configuration (if enabled)\n   */\n  public readonly jest?: Jest;\n\n  /**\n   * @deprecated use `package.addField(x, y)`\n   */\n  public get manifest() {\n    return this.package.manifest;\n  }\n\n  public readonly bundler: Bundler;\n\n  /**\n   * The build output directory. An npm tarball will be created under the `js`\n   * subdirectory. For example, if this is set to `dist` (the default), the npm\n   * tarball will be placed under `dist/js/boom-boom-1.2.3.tg`.\n   */\n  public readonly artifactsDirectory: string;\n\n  /**\n   * The location of the npm tarball after build (`${artifactsDirectory}/js`).\n   */\n  public readonly artifactsJavascriptDirectory: string;\n\n  /**\n   * The upgrade workflow.\n   */\n  public readonly upgradeWorkflow?: UpgradeDependencies;\n\n  private readonly workflowBootstrapSteps: JobStep[];\n  private readonly workflowGitIdentity: GitIdentity;\n  public readonly prettier?: Prettier;\n\n  constructor(options: NodeProjectOptions) {\n    super(options);\n\n    this.package = new NodePackage(this, options);\n    this.workflowBootstrapSteps = options.workflowBootstrapSteps ?? [];\n    this.workflowGitIdentity =\n      options.workflowGitIdentity ?? DEFAULT_GITHUB_ACTIONS_USER;\n    this.artifactsDirectory = options.artifactsDirectory ?? \"dist\";\n    this.artifactsJavascriptDirectory = join(this.artifactsDirectory, \"js\");\n\n    this.runScriptCommand = (() => {\n      switch (this.packageManager) {\n        case NodePackageManager.NPM:\n          return \"npm run\";\n        case NodePackageManager.YARN:\n          return \"yarn run\";\n        case NodePackageManager.PNPM:\n          return \"pnpm run\";\n        default:\n          throw new Error(`unexpected package manager ${this.packageManager}`);\n      }\n    })();\n\n    this.nodeVersion =\n      options.workflowNodeVersion ?? this.package.minNodeVersion;\n\n    // add PATH for all tasks which includes the project's npm .bin list\n    this.tasks.addEnvironment(\n      \"PATH\",\n      '$(npx -c \"node -e \\\\\"console.log(process.env.PATH)\\\\\"\")'\n    );\n\n    this.addLicense(options);\n\n    if (options.npmignoreEnabled ?? true) {\n      this.npmignore = new IgnoreFile(this, \".npmignore\");\n    }\n\n    this.addDefaultGitIgnore();\n\n    if (options.gitignore?.length) {\n      for (const i of options.gitignore) {\n        this.gitignore.exclude(i);\n      }\n    }\n\n    if (options.npmignore?.length) {\n      if (!this.npmignore) {\n        throw new Error(\n          '.npmignore is not defined for an APP project type. Add \"npmIgnore: true\" to override this'\n        );\n      }\n\n      for (const i of options.npmignore) {\n        this.npmignore.exclude(i);\n      }\n    }\n\n    if (!this.ejected) {\n      this.setScript(PROJEN_SCRIPT, this.package.projenCommand);\n    }\n\n    this.npmignore?.exclude(`/${PROJEN_RC}`);\n    this.npmignore?.exclude(`/${PROJEN_DIR}/`);\n    this.gitignore.include(`/${PROJEN_RC}`);\n\n    const projen = options.projenDevDependency ?? true;\n    if (projen && !this.ejected) {\n      const postfix = options.projenVersion ? `@${options.projenVersion}` : \"\";\n      this.addDevDeps(`projen${postfix}`);\n    }\n\n    if (!options.defaultReleaseBranch) {\n      throw new Error(\n        '\"defaultReleaseBranch\" is temporarily a required option while we migrate its default value from \"master\" to \"main\"'\n      );\n    }\n\n    const buildEnabled = options.buildWorkflow ?? (this.parent ? false : true);\n\n    // configure jest if enabled\n    // must be before the build/release workflows\n    if (options.jest ?? true) {\n      this.jest = new Jest(this, options.jestOptions);\n    }\n\n    if (buildEnabled && this.github) {\n      this.buildWorkflow = new BuildWorkflow(this, {\n        buildTask: this.buildTask,\n        artifactsDirectory: this.artifactsDirectory,\n        containerImage: options.workflowContainerImage,\n        gitIdentity: this.workflowGitIdentity,\n        mutableBuild: options.mutableBuild,\n        preBuildSteps: this.renderWorkflowSetup({\n          mutable: options.mutableBuild ?? true,\n        }),\n        postBuildSteps: options.postBuildSteps,\n        runsOn: options.workflowRunsOn,\n        workflowTriggers: options.buildWorkflowTriggers,\n      });\n\n      this.buildWorkflow.addPostBuildSteps(\n        ...this.renderUploadCoverageJobStep(options)\n      );\n    }\n\n    const release =\n      options.release ??\n      options.releaseWorkflow ??\n      (this.parent ? false : true);\n    if (release) {\n      this.addDevDeps(Version.STANDARD_VERSION);\n\n      this.release = new Release(this, {\n        versionFile: \"package.json\", // this is where \"version\" is set after bump\n        task: this.buildTask,\n        branch: options.defaultReleaseBranch ?? \"main\",\n        artifactsDirectory: this.artifactsDirectory,\n        ...options,\n\n        releaseWorkflowSetupSteps: [\n          ...this.renderWorkflowSetup({ mutable: false }),\n          ...(options.releaseWorkflowSetupSteps ?? []),\n        ],\n        postBuildSteps: [\n          ...(options.postBuildSteps ?? []),\n          ...this.renderUploadCoverageJobStep(options),\n        ],\n\n        workflowNodeVersion: this.nodeVersion,\n      });\n\n      this.publisher = this.release.publisher;\n\n      if (options.releaseToNpm ?? false) {\n        const codeArtifactOptions = isAwsCodeArtifactRegistry(\n          this.package.npmRegistry\n        )\n          ? {\n              accessKeyIdSecret: options.codeArtifactOptions?.accessKeyIdSecret,\n              secretAccessKeySecret:\n                options.codeArtifactOptions?.secretAccessKeySecret,\n              roleToAssume: options.codeArtifactOptions?.roleToAssume,\n            }\n          : {};\n        this.release.publisher.publishToNpm({\n          registry: this.package.npmRegistry,\n          npmTokenSecret: this.package.npmTokenSecret,\n          codeArtifactOptions,\n        });\n      }\n    } else {\n      // validate that no release options are selected if the release workflow is disabled.\n      if (options.releaseToNpm) {\n        throw new Error(\n          '\"releaseToNpm\" is not supported if \"release\" is not set'\n        );\n      }\n\n      if (options.releaseEveryCommit) {\n        throw new Error(\n          '\"releaseEveryCommit\" is not supported if \"release\" is not set'\n        );\n      }\n\n      if (options.releaseSchedule) {\n        throw new Error(\n          '\"releaseSchedule\" is not supported if \"release\" is not set'\n        );\n      }\n    }\n\n    if (\n      (options.autoMerge ?? true) &&\n      this.github?.mergify &&\n      this.buildWorkflow?.buildJobIds\n    ) {\n      this.autoMerge = new AutoMerge(this.github, options.autoMergeOptions);\n      this.autoMerge.addConditionsLater({\n        render: () =>\n          this.buildWorkflow?.buildJobIds.map((id) => `status-success=${id}`) ??\n          [],\n      });\n    }\n\n    const dependabot = options.dependabot ?? false;\n    const depsUpgrade = options.depsUpgrade ?? !dependabot;\n\n    if (dependabot && depsUpgrade) {\n      throw new Error(\n        \"'dependabot' cannot be configured together with 'depsUpgrade'\"\n      );\n    }\n\n    const depsAutoApprove = options.autoApproveUpgrades ?? false;\n\n    if (depsAutoApprove && !this.autoApprove && this.github) {\n      throw new Error(\n        \"Automatic approval of dependencies upgrades requires configuring `autoApproveOptions`\"\n      );\n    }\n\n    const autoApproveLabel = (condition: boolean) =>\n      condition && this.autoApprove?.label\n        ? [this.autoApprove.label]\n        : undefined;\n\n    if (dependabot) {\n      const defaultOptions = {\n        labels: autoApproveLabel(depsAutoApprove),\n      };\n      this.github?.addDependabot(\n        deepMerge([defaultOptions, options.dependabotOptions ?? {}])\n      );\n    }\n\n    if (depsUpgrade) {\n      const defaultOptions: UpgradeDependenciesOptions = {\n        workflowOptions: {\n          container: options.workflowContainerImage\n            ? {\n                image: options.workflowContainerImage,\n              }\n            : undefined,\n          labels: autoApproveLabel(depsAutoApprove),\n          gitIdentity: this.workflowGitIdentity,\n        },\n      };\n      this.upgradeWorkflow = new UpgradeDependencies(\n        this,\n        deepMerge([defaultOptions, options.depsUpgradeOptions ?? {}])\n      );\n    }\n\n    if (options.pullRequestTemplate ?? true) {\n      this.github?.addPullRequestTemplate(\n        ...(options.pullRequestTemplateContents ?? [])\n      );\n    }\n\n    const projenrcJs = options.projenrcJs ?? !options.projenrcJson;\n    if (projenrcJs) {\n      new Projenrc(this, options.projenrcJsOptions);\n    }\n\n    // add a bundler component - this enables things like Lambda bundling and in the future web bundling.\n    this.bundler = new Bundler(this, options.bundlerOptions);\n\n    if (options.package ?? true) {\n      this.packageTask.exec(`mkdir -p ${this.artifactsJavascriptDirectory}`);\n\n      // always use npm here - yarn doesn't add much value\n      // sadly we cannot use --pack-destination because it is not supported by older npm\n      this.packageTask.exec(\n        `mv $(npm pack) ${this.artifactsJavascriptDirectory}/`\n      );\n    }\n\n    if (options.prettier ?? false) {\n      this.prettier = new Prettier(this, { ...options.prettierOptions });\n    }\n  }\n\n  private renderUploadCoverageJobStep(options: NodeProjectOptions): JobStep[] {\n    // run codecov if enabled or a secret token name is passed in\n    // AND jest must be configured\n    if ((options.codeCov || options.codeCovTokenSecret) && this.jest?.config) {\n      return [\n        {\n          name: \"Upload coverage to Codecov\",\n          uses: \"codecov/codecov-action@v1\",\n          with: options.codeCovTokenSecret\n            ? {\n                token: `\\${{ secrets.${options.codeCovTokenSecret} }}`,\n                directory: this.jest.config.coverageDirectory,\n              }\n            : {\n                directory: this.jest.config.coverageDirectory,\n              },\n        },\n      ];\n    } else {\n      return [];\n    }\n  }\n\n  public addBins(bins: Record<string, string>) {\n    this.package.addBin(bins);\n  }\n\n  /**\n   * Replaces the contents of an npm package.json script.\n   *\n   * @param name The script name\n   * @param command The command to execute\n   */\n  public setScript(name: string, command: string) {\n    this.package.setScript(name, command);\n  }\n\n  /**\n   * Removes the npm script (always successful).\n   * @param name The name of the script.\n   */\n  public removeScript(name: string) {\n    this.package.removeScript(name);\n  }\n\n  /**\n   * Indicates if a script by the name name is defined.\n   * @param name The name of the script\n   */\n  public hasScript(name: string) {\n    return this.package.hasScript(name);\n  }\n\n  /**\n   * DEPRECATED\n   * @deprecated use `project.compileTask.exec()`\n   */\n  public addCompileCommand(...commands: string[]) {\n    for (const c of commands) {\n      this.compileTask.exec(c);\n    }\n  }\n\n  /**\n   * DEPRECATED\n   * @deprecated use `project.testTask.exec()`\n   */\n  public addTestCommand(...commands: string[]) {\n    for (const c of commands) {\n      this.testTask.exec(c);\n    }\n  }\n\n  /**\n   * Directly set fields in `package.json`.\n   * @param fields The fields to set\n   */\n  public addFields(fields: { [name: string]: any }) {\n    for (const [name, value] of Object.entries(fields)) {\n      this.package.addField(name, value);\n    }\n  }\n\n  /**\n   * Adds keywords to package.json (deduplicated)\n   * @param keywords The keywords to add\n   */\n  public addKeywords(...keywords: string[]) {\n    this.package.addKeywords(...keywords);\n  }\n\n  /**\n   * Get steps for scoped package access\n   *\n   * @param codeArtifactOptions Details of logging in to AWS\n   * @returns array of job steps required for each private scoped packages\n   */\n  private getScopedPackageSteps(\n    codeArtifactOptions: CodeArtifactOptions | undefined\n  ): JobStep[] {\n    const parsedCodeArtifactOptions = {\n      accessKeyIdSecret:\n        codeArtifactOptions?.accessKeyIdSecret ?? \"AWS_ACCESS_KEY_ID\",\n      secretAccessKeySecret:\n        codeArtifactOptions?.secretAccessKeySecret ?? \"AWS_SECRET_ACCESS_KEY\",\n      roleToAssume: codeArtifactOptions?.roleToAssume,\n    };\n\n    if (parsedCodeArtifactOptions.roleToAssume) {\n      return [\n        {\n          name: \"Configure AWS Credentials\",\n          uses: \"aws-actions/configure-aws-credentials@v1\",\n          with: {\n            \"aws-access-key-id\": secretToString(\n              parsedCodeArtifactOptions.accessKeyIdSecret\n            ),\n            \"aws-secret-access-key\": secretToString(\n              parsedCodeArtifactOptions.secretAccessKeySecret\n            ),\n            \"aws-region\": \"us-east-2\",\n            \"role-to-assume\": parsedCodeArtifactOptions.roleToAssume,\n            \"role-duration-seconds\": 900,\n          },\n        },\n        {\n          name: \"AWS CodeArtifact Login\",\n          run: `${this.runScriptCommand} ca:login`,\n        },\n      ];\n    }\n\n    return [\n      {\n        name: \"AWS CodeArtifact Login\",\n        run: `${this.runScriptCommand} ca:login`,\n        env: {\n          AWS_ACCESS_KEY_ID: secretToString(\n            parsedCodeArtifactOptions.accessKeyIdSecret\n          ),\n          AWS_SECRET_ACCESS_KEY: secretToString(\n            parsedCodeArtifactOptions.secretAccessKeySecret\n          ),\n        },\n      },\n    ];\n  }\n\n  /**\n   * Returns the set of workflow steps which should be executed to bootstrap a\n   * workflow.\n   *\n   * @param options Options.\n   * @returns Job steps\n   */\n  public renderWorkflowSetup(\n    options: RenderWorkflowSetupOptions = {}\n  ): JobStep[] {\n    const install = new Array<JobStep>();\n\n    // first run the workflow bootstrap steps\n    install.push(...this.workflowBootstrapSteps);\n\n    if (this.nodeVersion) {\n      install.push({\n        name: \"Setup Node.js\",\n        uses: \"actions/setup-node@v3\",\n        with: { \"node-version\": this.nodeVersion },\n      });\n    }\n\n    if (this.package.packageManager === NodePackageManager.PNPM) {\n      install.push({\n        name: \"Setup pnpm\",\n        uses: \"pnpm/action-setup@v2.2.2\",\n        with: { version: \"7\" }, // current latest. Should probably become tunable.\n      });\n    }\n\n    const mutable = options.mutable ?? false;\n\n    if (this.package.scopedPackagesOptions) {\n      install.push(\n        ...this.getScopedPackageSteps(this.package.codeArtifactOptions)\n      );\n    }\n\n    install.push({\n      name: \"Install dependencies\",\n      run: mutable\n        ? this.package.installAndUpdateLockfileCommand\n        : this.package.installCommand,\n    });\n\n    return install;\n  }\n\n  /**\n   * Defines normal dependencies.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addDeps(...deps: string[]) {\n    return this.package.addDeps(...deps);\n  }\n\n  /**\n   * Defines development/test dependencies.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addDevDeps(...deps: string[]) {\n    return this.package.addDevDeps(...deps);\n  }\n\n  /**\n   * Defines peer dependencies.\n   *\n   * When adding peer dependencies, a devDependency will also be added on the\n   * pinned version of the declared peer. This will ensure that you are testing\n   * your code against the minimum version required from your consumers.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addPeerDeps(...deps: string[]) {\n    return this.package.addPeerDeps(...deps);\n  }\n\n  /**\n   * Defines bundled dependencies.\n   *\n   * Bundled dependencies will be added as normal dependencies as well as to the\n   * `bundledDependencies` section of your `package.json`.\n   *\n   * @param deps Names modules to install. By default, the the dependency will\n   * be installed in the next `npx projen` run and the version will be recorded\n   * in your `package.json` file. You can upgrade manually or using `yarn\n   * add/upgrade`. If you wish to specify a version range use this syntax:\n   * `module@^7`.\n   */\n  public addBundledDeps(...deps: string[]) {\n    return this.package.addBundledDeps(...deps);\n  }\n\n  public addPackageIgnore(pattern: string) {\n    this.npmignore?.addPatterns(pattern);\n  }\n\n  private addLicense(options: NodeProjectOptions) {\n    if (this.package.license) {\n      new License(this, {\n        spdx: this.package.license,\n        copyrightOwner: options.copyrightOwner ?? options.authorName,\n        copyrightPeriod: options.copyrightPeriod,\n      });\n    }\n  }\n\n  private addDefaultGitIgnore() {\n    this.gitignore.exclude(\n      \"# Logs\",\n      \"logs\",\n      \"*.log\",\n      \"npm-debug.log*\",\n      \"yarn-debug.log*\",\n      \"yarn-error.log*\",\n      \"lerna-debug.log*\",\n\n      \"# Diagnostic reports (https://nodejs.org/api/report.html)\",\n      \"report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\",\n\n      \"# Runtime data\",\n      \"pids\",\n      \"*.pid\",\n      \"*.seed\",\n      \"*.pid.lock\",\n\n      \"# Directory for instrumented libs generated by jscoverage/JSCover\",\n      \"lib-cov\",\n\n      \"# Coverage directory used by tools like istanbul\",\n      \"coverage\",\n      \"*.lcov\",\n\n      \"# nyc test coverage\",\n      \".nyc_output\",\n\n      \"# Compiled binary addons (https://nodejs.org/api/addons.html)\",\n      \"build/Release\",\n\n      \"# Dependency directories\",\n      \"node_modules/\",\n      \"jspm_packages/\",\n\n      \"# TypeScript cache\",\n      \"*.tsbuildinfo\",\n\n      \"# Optional eslint cache\",\n      \".eslintcache\",\n\n      \"# Output of 'npm pack'\",\n      \"*.tgz\",\n\n      \"# Yarn Integrity file\",\n      \".yarn-integrity\",\n\n      \"# parcel-bundler cache (https://parceljs.org/)\",\n      \".cache\"\n    );\n  }\n\n  /**\n   * Returns the shell command to execute in order to run a task. This will\n   * typically be `npx projen TASK`.\n   *\n   * @param task The task for which the command is required\n   */\n  public runTaskCommand(task: Task) {\n    return `${this.package.projenCommand} ${task.name}`;\n  }\n\n  /**\n   * The job ID of the build workflow.\n   */\n  public get buildWorkflowJobId() {\n    return this.buildWorkflow?.buildJobIds[0];\n  }\n}\n\n/**\n * Options for `renderInstallSteps()`.\n */\nexport interface RenderWorkflowSetupOptions {\n  /**\n   * Should the pacakge lockfile be updated?\n   * @default false\n   */\n  readonly mutable?: boolean;\n}\n"
  },
  {
    "path": "src/javascript/npm-config.ts",
    "content": "import { Component } from \"../component\";\nimport { IniFile } from \"../ini\";\nimport { NodeProject } from \"../javascript\";\n\n/**\n * Options to configure the local NPM config\n */\nexport interface NpmConfigOptions {\n  /**\n   * URL of the registry mirror to use\n   *\n   * You can change this or add scoped registries using the addRegistry method\n   *\n   * @default - use npmjs default registry\n   */\n  readonly registry?: string;\n}\n\n/**\n * File representing the local NPM config in .npmrc\n */\nexport class NpmConfig extends Component {\n  /**\n   * The config object. This object can be mutated until the project is\n   * synthesized.\n   */\n  private readonly config: any = {};\n\n  constructor(project: NodeProject, options: NpmConfigOptions = {}) {\n    super(project);\n\n    new IniFile(project, \".npmrc\", { obj: this.config });\n\n    if (options.registry) {\n      this.addRegistry(options.registry);\n    }\n  }\n\n  /**\n   * configure a scoped registry\n   *\n   * @param url the URL of the registry to use\n   * @param scope the scope the registry is used for; leave empty for the default registry\n   */\n  public addRegistry(url: string, scope?: string) {\n    this.addConfig(scope ? `${scope}:registry` : \"registry\", url);\n  }\n\n  /**\n   * configure a generic property\n   *\n   * @param name the name of the property\n   * @param value the value of the property\n   */\n  public addConfig(name: string, value: string) {\n    this.config[name] = value;\n  }\n}\n"
  },
  {
    "path": "src/javascript/prettier.ts",
    "content": "import { Component } from \"../component\";\nimport { IgnoreFile } from \"../ignore-file\";\nimport { NodeProject } from \"../javascript\";\nimport { JsonFile } from \"../json\";\nimport { Project } from \"../project\";\nimport { SourceCode } from \"../source-code\";\n/**\n * Options for Prettier\n *\n */\nexport interface PrettierOptions {\n  /**\n   * Defines an .prettierIgnore file\n   *\n   * @default true\n   */\n  readonly ignoreFile?: boolean;\n\n  /**\n   * Prettier settings.\n   * @default - default settings\n   */\n  readonly settings?: PrettierSettings;\n\n  /**\n   * Provide a list of patterns to override prettier configuration.\n   *\n   * @default []\n   * @see https://prettier.io/docs/en/configuration.html#configuration-overrides\n   */\n  readonly overrides?: PrettierOverride[];\n}\n/**\n * Options to set in Prettier directly or through overrides\n *\n * @see https://prettier.io/docs/en/options.html\n */\nexport interface PrettierSettings {\n  /**\n   * Include parentheses around a sole arrow function parameter.\n   *\n   * @default ArrowParens.ALWAYS\n   */\n  readonly arrowParens?: ArrowParens;\n  /**\n   * Put > of opening tags on the last line instead of on a new line.\n   *\n   * @default false\n   */\n  readonly bracketSameLine?: boolean;\n  /**\n   * Print spaces between brackets.\n   *\n   * @default true\n   */\n  readonly bracketSpacing?: boolean;\n  /**\n   * Print (to stderr) where a cursor at the given position would move to after formatting.\n   * This option cannot be used with --range-start and --range-end.\n   *\n   * @default -1\n   */\n  readonly cursorOffset?: number;\n  /**\n   * Control how Prettier formats quoted code embedded in the file.\n   *\n   * @default EmbeddedLanguageFormatting.AUTO\n   */\n  readonly embeddedLanguageFormatting?: EmbeddedLanguageFormatting;\n  /**\n   * Which end of line characters to apply.\n   *\n   * @default EndOfLine.LF\n   */\n  readonly endOfLine?: EndOfLine;\n  /**\n   * Specify the input filepath. This will be used to do parser inference.\n   * @default none\n   */\n  readonly filepath?: string;\n  /**\n   * How to handle whitespaces in HTML.\n   *\n   * @default HTMLWhitespaceSensitivity.CSS\n   */\n  readonly htmlWhitespaceSensitivity?: HTMLWhitespaceSensitivity;\n  /**\n   * Insert @format pragma into file's first docblock comment.\n   *\n   * @default false\n   */\n  readonly insertPragma?: boolean;\n  /**\n   * Use single quotes in JSX.\n   *\n   * @default false\n   */\n  readonly jsxSingleQuote?: boolean;\n  /**\n   * Which parser to use.\n   *\n   * @default - Prettier automatically infers the parser from the input file path, so you shouldn’t have to change this setting.\n   */\n  readonly parser?: string;\n  /**\n   * Add a plugin. Multiple plugins can be passed as separate `--plugin`s.\n   *\n   * @default []\n   */\n  readonly plugins?: string[];\n  /**\n   * Custom directory that contains prettier plugins in node_modules subdirectory.\n   * Overrides default behavior when plugins are searched relatively to the location of\n   * Prettier.\n   * Multiple values are accepted.\n   *\n   * @default []\n   */\n  readonly pluginSearchDirs?: string[];\n  /**\n   * The line length where Prettier will try wrap.\n   *\n   * @default 80\n   */\n  readonly printWidth?: number;\n  /**\n   * How to wrap prose.\n   *\n   * @default ProseWrap.PRESERVE\n   */\n  readonly proseWrap?: ProseWrap;\n  /**\n   * Change when properties in objects are quoted.\n   *\n   * @default QuoteProps.ASNEEDED\n   */\n  readonly quoteProps?: QuoteProps;\n  /**\n   * Format code ending at a given character offset (exclusive).\n   * The range will extend forwards to the end of the selected statement.\n   * This option cannot be used with --cursor-offset.\n   *\n   * @default null\n   */\n  readonly rangeEnd?: number;\n  /**\n   * Format code starting at a given character offset.\n   * The range will extend backwards to the start of the first line containing the selected\n   * statement.\n   * This option cannot be used with --cursor-offset.\n   *\n   * @default 0\n   */\n  readonly rangeStart?: number;\n  /**\n   * Require either '@prettier' or '@format' to be present in the file's first docblock\n   * comment\n   * in order for it to be formatted.\n   *\n   * @default false\n   */\n  readonly requirePragma?: boolean;\n  /**\n   * Print semicolons.\n   *\n   * @default true\n   */\n  readonly semi?: boolean;\n  /**\n   * Use single quotes instead of double quotes.\n   *\n   * @default false\n   */\n  readonly singleQuote?: boolean;\n  /**\n   * Number of spaces per indentation level.\n   *\n   * @default 2\n   */\n  readonly tabWidth?: number;\n  /**\n   * Print trailing commas wherever possible when multi-line.\n   *\n   * @default TrailingComma.ES5\n   */\n  readonly trailingComma?: TrailingComma;\n  /**\n   * Indent with tabs instead of spaces.\n   *\n   * @default false\n   */\n  readonly useTabs?: boolean;\n  /**\n   * Indent script and style tags in Vue files.\n   *\n   * @default false\n   */\n  readonly vueIndentScriptAndStyle?: boolean;\n}\n\nexport enum ArrowParens {\n  /**\n   * Always include parens. Example: `(x) => x`\n   */\n  ALWAYS = \"always\",\n\n  /**\n   * Omit parens when possible. Example: `x => x`\n   */\n  AVOID = \"avoid\",\n}\n\nexport enum EmbeddedLanguageFormatting {\n  /**\n   * Format embedded code if Prettier can automatically identify it.\n   */\n  AUTO = \"auto\",\n\n  /**\n   * Never automatically format embedded code.\n   */\n  OFF = \"off\",\n}\n\nexport enum EndOfLine {\n  /**\n   * Maintain existing (mixed values within one file are normalised by looking\n   * at what's used after the first line)\n   */\n  AUTO = \"auto\",\n\n  /**\n   * Carriage Return character only (\\r), used very rarely\n   */\n  CR = \"cr\",\n\n  /**\n   * Carriage Return + Line Feed characters (\\r\\n), common on Windows\n   */\n  CRLF = \"crlf\",\n\n  /**\n   * Line Feed only (\\n), common on Linux and macOS as well as inside git repos\n   */\n  LF = \"lf\",\n}\n\nexport enum HTMLWhitespaceSensitivity {\n  /**\n   * Respect the default value of CSS display property.\n   */\n  CSS = \"css\",\n\n  /**\n   * Whitespaces are considered insignificant.\n   */\n  IGNORE = \"ignore\",\n\n  /**\n   * Whitespaces are considered significant.\n   */\n  STRICT = \"strict\",\n}\n\nexport interface PrettierOverride {\n  /**\n   * Exclude these files from this override.\n   */\n  readonly excludeFiles?: Files;\n  /**\n   * Include these files in this override.\n   */\n  readonly files: Files;\n  /**\n   * The options to apply for this override.\n   */\n  readonly settings: PrettierSettings;\n}\n\n/**\n * Exclude these files from this override.\n *\n * Include these files in this override.\n */\nexport type Files = string[] | string;\n\nexport enum ProseWrap {\n  /**\n   * Wrap prose if it exceeds the print width.\n   */\n  ALWAYS = \"always\",\n\n  /**\n   * Do not wrap prose.\n   */\n  NEVER = \"never\",\n\n  /**\n   * Wrap prose as-is.\n   */\n  PRESERVE = \"preserve\",\n}\n\nexport enum QuoteProps {\n  /**\n   * Only add quotes around object properties where required.\n   */\n  ASNEEDED = \"as-needed\",\n\n  /**\n   * If at least one property in an object requires quotes, quote all properties.\n   */\n  CONSISTENT = \"consistent\",\n\n  /**\n   * Respect the input use of quotes in object properties.\n   */\n  PRESERVE = \"preserve\",\n}\n\nexport enum TrailingComma {\n  /**\n   * Trailing commas wherever possible (including function arguments).\n   */\n  ALL = \"all\",\n\n  /**\n   * Trailing commas where valid in ES5 (objects, arrays, etc.)\n   */\n  ES5 = \"es5\",\n\n  /**\n   * No trailing commas.\n   */\n  NONE = \"none\",\n}\n\n/**\n * Represents prettier configuration.\n */\nexport class Prettier extends Component {\n  public static of(project: Project): Prettier | undefined {\n    const isPrettier = (c: Component): c is Prettier => c instanceof Prettier;\n    return project.components.find(isPrettier);\n  }\n  /**\n   * Direct access to the prettier settings\n   */\n  public readonly settings: PrettierSettings;\n\n  /**\n   * The .prettierIgnore file.\n   */\n  public readonly ignoreFile?: IgnoreFile;\n\n  /**\n   * Direct access to the prettier overrides\n   *\n   * @internal\n   */\n  private readonly _overrides: PrettierOverride[];\n\n  constructor(project: NodeProject, options: PrettierOptions) {\n    super(project);\n\n    this._overrides = options.overrides ?? [];\n\n    if (options.ignoreFile ?? true) {\n      this.ignoreFile = new IgnoreFile(project, \".prettierignore\");\n    }\n\n    project.addDevDeps(\"prettier\");\n\n    this.settings = {\n      ...options.settings,\n    };\n\n    new JsonFile(project, \".prettierrc.json\", {\n      obj: () => ({ ...this.settings, overrides: [...this._overrides] }),\n      marker: false,\n    });\n  }\n\n  /**\n   * Add a prettier override\n   * @see https://prettier.io/docs/en/configuration.html#configuration-overrides\n   * @param {PrettierOverride} override\n   */\n  public addOverride(override: PrettierOverride) {\n    this.overrides.push(override);\n  }\n\n  /**\n   * Defines Prettier ignore Patterns\n   * these patterns will be added to the file .prettierignore\n   *\n   * @param pattern filepatterns so exclude from prettier formatting\n   */\n  public addIgnorePattern(pattern: string) {\n    this.ignoreFile?.addPatterns(pattern);\n  }\n\n  /**\n   *  Access to the Prettieroverrides to extend those\n   */\n  public get overrides() {\n    return [...this._overrides];\n  }\n\n  public preSynthesize() {\n    // Add automatically generated SourceCode files to .prettierignore as they may not be formatted correctly.\n    const isSourceCode = (c: Component): c is SourceCode =>\n      c instanceof SourceCode;\n    this.project.components.filter(isSourceCode).forEach((c) => {\n      this.addIgnorePattern(c.filePath);\n    });\n  }\n}\n"
  },
  {
    "path": "src/javascript/projenrc.ts",
    "content": "import { existsSync, writeFileSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { renderJavaScriptOptions } from \"./render-options\";\nexport interface ProjenrcOptions {\n  /**\n   * The name of the projenrc file.\n   * @default \".projenrc.js\"\n   */\n  readonly filename?: string;\n}\n\n/**\n * Sets up a javascript project to use TypeScript for projenrc.\n */\nexport class Projenrc extends Component {\n  private readonly rcfile: string;\n\n  constructor(project: Project, options: ProjenrcOptions = {}) {\n    super(project);\n\n    this.rcfile = options.filename ?? \".projenrc.js\";\n\n    // this is the task projen executes when running `projen`\n    project.defaultTask?.exec(`node ${this.rcfile}`);\n\n    this.generateProjenrc();\n  }\n\n  private generateProjenrc() {\n    const rcfile = resolve(this.project.outdir, this.rcfile);\n    if (existsSync(rcfile)) {\n      return; // already exists\n    }\n\n    const bootstrap = this.project.initProject;\n    if (!bootstrap) {\n      return;\n    }\n\n    const parts = bootstrap.fqn.split(\".\");\n    const moduleName = parts[0];\n    const importName = parts[1];\n    const className = parts.slice(1).join(\".\");\n\n    const { renderedOptions, imports } = renderJavaScriptOptions({\n      comments: bootstrap.comments,\n      args: bootstrap.args,\n      type: bootstrap.type,\n    });\n\n    imports.add(importName);\n\n    const lines = new Array<string>();\n    lines.push(\n      `const { ${[...imports].sort().join(\", \")} } = require(\"${moduleName}\");`\n    );\n    lines.push();\n    lines.push(`const project = new ${className}(${renderedOptions});`);\n    lines.push();\n    lines.push(\"project.synth();\");\n\n    writeFileSync(rcfile, lines.join(\"\\n\"));\n    this.project.logger.info(\n      `Project definition file was created at ${rcfile}`\n    );\n  }\n}\n"
  },
  {
    "path": "src/javascript/render-options.ts",
    "content": "import * as inventory from \"../inventory\";\nimport { InitProjectOptionHints } from \"../option-hints\";\n\nconst PROJEN_NEW = \"__new__\";\nconst TAB = makePadding(2);\n\n/**\n * Options for `renderProjectOptions`.\n */\nexport interface RenderProjectOptions {\n  /**\n   * The project type to render.\n   */\n  readonly type: inventory.ProjectType;\n\n  /**\n   * Project arguments as passed to `projen new`.\n   */\n  readonly args: Record<string, any>;\n\n  /**\n   * Include commented out options.\n   * @default InitProjectOptionHints.FEATURED\n   */\n  readonly comments?: InitProjectOptionHints;\n\n  /**\n   * Inject a `__new__` attribute to the project constructor with a stringified\n   * version of the project parameters and a `jsiiFqn` attribute that includes\n   * the FQN of the project type. This is needed in order to generate initial\n   * projenrc files.\n   *\n   * @default false\n   */\n  readonly bootstrap?: boolean;\n\n  /**\n   * A list of fields to omit from the initial projenrc file.\n   * @default - none\n   */\n  readonly omitFromBootstrap?: string[];\n}\n\n/**\n * Information passed from `projen new` to the project object when the project\n * is first created. It is used to generate projenrc files in various languages.\n */\ninterface ProjenInit {\n  /**\n   * The JSII FQN of the project type.\n   */\n  readonly fqn: string;\n\n  /**\n   * Initial arguments passed to `projen new`.\n   */\n  readonly args: Record<string, any>;\n\n  /**\n   * Include commented out options. Does not apply to projenrc.json files.\n   */\n  readonly comments: InitProjectOptionHints;\n}\n\n/**\n * Renders options as if the project was created via `projen new` (embeds the __new__ field).\n */\nexport function renderProjenInitOptions(\n  fqn: string,\n  args: Record<string, any>,\n  comments: InitProjectOptionHints = InitProjectOptionHints.NONE\n): any {\n  return {\n    ...args,\n    [PROJEN_NEW]: { fqn, args, comments } as ProjenInit,\n  };\n}\n\nexport function resolveInitProject(opts: any) {\n  const f = opts[PROJEN_NEW] as ProjenInit;\n  if (!f) {\n    return undefined;\n  }\n\n  const type = inventory.resolveProjectType(f.fqn);\n  if (!type) {\n    throw new Error(`unable to resolve project type for ${f.fqn}`);\n  }\n  return {\n    args: f.args,\n    fqn: f.fqn,\n    type: type,\n    comments: f.comments,\n  };\n}\n\n/**\n * Prints all parameters that can be used in a project type, alongside their descriptions.\n *\n * Parameters in `params` that aren't undefined are rendered as defaults,\n * while all other parameters are rendered as commented out.\n *\n * Returns the printed output and a set of required imports as an object\n * in the form { options, imports }.\n */\nexport function renderJavaScriptOptions(opts: RenderProjectOptions) {\n  const renders: Record<string, string> = {};\n  const optionsWithDefaults: string[] = [];\n  const allImports = new Set();\n\n  for (const option of opts.type.options) {\n    if (option.deprecated) {\n      continue;\n    }\n\n    const optionName = option.name;\n\n    if (opts.args[optionName] !== undefined) {\n      const arg = opts.args[optionName];\n      const { js, imports } = renderArgAsJavaScript(arg, option);\n      for (const importStr of imports) {\n        allImports.add(importStr);\n      }\n      renders[optionName] = `${optionName}: ${js},`;\n      optionsWithDefaults.push(optionName);\n    } else {\n      const defaultValue = option.default?.startsWith(\"-\")\n        ? undefined\n        : option.default ?? undefined;\n      renders[optionName] = `// ${optionName}: ${defaultValue},`;\n    }\n  }\n\n  const bootstrap = opts.bootstrap ?? false;\n  if (bootstrap) {\n    for (const arg of opts.omitFromBootstrap ?? []) {\n      delete opts.args[arg];\n    }\n    renders[PROJEN_NEW] = `${PROJEN_NEW}: ${JSON.stringify({\n      args: opts.args,\n      fqn: opts.type.fqn,\n      comments: opts.comments,\n    } as ProjenInit)},`;\n    optionsWithDefaults.push(PROJEN_NEW);\n  }\n\n  // generate rendering\n  const result: string[] = [];\n  result.push(\"{\");\n\n  // render options with defaults\n  optionsWithDefaults.sort();\n  for (const optionName of optionsWithDefaults) {\n    result.push(`${TAB}${renders[optionName]}`);\n  }\n  if (result.length > 1) {\n    result.push(\"\");\n  }\n\n  // render options without defaults as comments\n  if (opts.comments === InitProjectOptionHints.ALL) {\n    const options = opts.type.options.filter(\n      (opt) => !opt.deprecated && opts.args[opt.name] === undefined\n    );\n    result.push(...renderCommentedOptionsByModule(renders, options));\n  } else if (opts.comments === InitProjectOptionHints.FEATURED) {\n    const options = opts.type.options.filter(\n      (opt) =>\n        !opt.deprecated && opts.args[opt.name] === undefined && opt.featured\n    );\n    result.push(...renderCommentedOptionsInOrder(renders, options));\n  } else if (opts.comments === InitProjectOptionHints.NONE) {\n    // don't render any extra options\n  }\n\n  if (result[result.length - 1] === \"\") {\n    result.pop();\n  }\n  result.push(\"}\");\n  return { renderedOptions: result.join(\"\\n\"), imports: allImports };\n}\n\nfunction renderCommentedOptionsByModule(\n  renders: Record<string, string>,\n  options: inventory.ProjectOption[]\n) {\n  const optionsByModule: Record<string, inventory.ProjectOption[]> = {};\n\n  for (const option of options) {\n    const parentModule = option.parent;\n    optionsByModule[parentModule] = optionsByModule[parentModule] ?? [];\n    optionsByModule[parentModule].push(option);\n  }\n\n  for (const parentModule in optionsByModule) {\n    optionsByModule[parentModule].sort((o1, o2) =>\n      o1.name.localeCompare(o2.name)\n    );\n  }\n\n  const result = [];\n  const marginSize = Math.max(\n    ...options.map((opt) => renders[opt.name].length)\n  );\n  for (const [moduleName, optionGroup] of Object.entries(\n    optionsByModule\n  ).sort()) {\n    result.push(`${TAB}/* ${moduleName} */`);\n    for (const option of optionGroup) {\n      const paramRender = renders[option.name];\n      const docstring = option.docs || \"No documentation found.\";\n      result.push(\n        `${TAB}${paramRender}${makePadding(\n          marginSize - paramRender.length + 2\n        )}/* ${docstring} */`\n      );\n    }\n    result.push(\"\");\n  }\n  return result;\n}\n\nfunction renderCommentedOptionsInOrder(\n  renders: Record<string, string>,\n  options: inventory.ProjectOption[]\n) {\n  const result = [];\n  const marginSize = Math.max(\n    ...options.map((opt) => renders[opt.name].length)\n  );\n  for (const option of options) {\n    const paramRender = renders[option.name];\n    const docstring = option.docs || \"No documentation found.\";\n    result.push(\n      `${TAB}${paramRender}${makePadding(\n        marginSize - paramRender.length + 2\n      )}/* ${docstring} */`\n    );\n  }\n  return result;\n}\n\n/**\n * Renders a value as a JavaScript value, converting strings to enums where\n * appropriate. The type must be JSON-like (string, number, boolean, array,\n * enum, or JSON object).\n *\n * Returns a JavaScript expression as a string, and the names of any\n * necessary imports.\n */\nfunction renderArgAsJavaScript(arg: any, option: inventory.ProjectOption) {\n  if (option.kind === \"enum\") {\n    if (!option.fqn) {\n      throw new Error(`fqn field is missing from enum option ${option.name}`);\n    }\n    const parts = option.fqn.split(\".\"); // -> ['projen', 'web', 'MyEnum']\n    const enumChoice = String(arg).toUpperCase().replace(/-/g, \"_\"); // custom-value -> CUSTOM_VALUE\n    const js = `${parts.slice(1).join(\".\")}.${enumChoice}`; // -> web.MyEnum.CUSTOM_VALUE\n    const importName = parts[1]; // -> web\n    return { js, imports: [importName] };\n  } else if (option.jsonLike) {\n    return { js: JSON.stringify(arg), imports: [] };\n  } else {\n    throw new Error(\n      `Unexpected option ${option.name} - cannot render a value for this option because it does not have a JSON-like type.`\n    );\n  }\n}\n\nfunction makePadding(paddingLength: number): string {\n  return \" \".repeat(paddingLength);\n}\n"
  },
  {
    "path": "src/javascript/typescript-config.ts",
    "content": "import { NodeProject } from \".\";\nimport { JsonFile } from \"../json\";\n\nexport interface TypescriptConfigOptions {\n  /**\n   * @default \"tsconfig.json\"\n   */\n  readonly fileName?: string;\n  /**\n   * Specifies a list of glob patterns that match TypeScript files to be included in compilation.\n   *\n   * @default - all .ts files recursively\n   */\n  readonly include?: string[];\n\n  /**\n   * Filters results from the \"include\" option.\n   *\n   * @default - node_modules is excluded by default\n   */\n  readonly exclude?: string[];\n\n  /**\n   * Compiler options to use.\n   */\n  readonly compilerOptions: TypeScriptCompilerOptions;\n}\n\n/**\n * Determines how modules get resolved.\n *\n * @see https://www.typescriptlang.org/docs/handbook/module-resolution.html\n */\nexport enum TypeScriptModuleResolution {\n  /**\n   * TypeScript's former default resolution strategy.\n   *\n   * @see https://www.typescriptlang.org/docs/handbook/module-resolution.html#classic\n   */\n  CLASSIC = \"classic\",\n\n  /**\n   * Resolution strategy which attempts to mimic the Node.js module resolution strategy at runtime.\n   *\n   * @see https://www.typescriptlang.org/docs/handbook/module-resolution.html#node\n   */\n  NODE = \"node\",\n}\n\n/**\n * Determines how JSX should get transformed into valid JavaScript.\n *\n * @see https://www.typescriptlang.org/docs/handbook/jsx.html\n */\nexport enum TypeScriptJsxMode {\n  /**\n   * Keeps the JSX as part of the output to be further consumed by another transform step (e.g. Babel).\n   */\n  PRESERVE = \"preserve\",\n\n  /**\n   * Converts JSX syntax into React.createElement, does not need to go through a JSX transformation before use, and the output will have a .js file extension.\n   */\n  REACT = \"react\",\n\n  /**\n   * Keeps all JSX like 'preserve' mode, but output will have a .js extension.\n   */\n  REACT_NATIVE = \"react-native\",\n\n  /**\n   * Passes `key` separately from props and always passes `children` as props (since React 17).\n   *\n   * @see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-1.html#react-17-jsx-factories\n   */\n  REACT_JSX = \"react-jsx\",\n\n  /**\n   * Same as `REACT_JSX` with additional debug data.\n   */\n  REACT_JSXDEV = \"react-jsxdev\",\n}\n\nexport interface TypeScriptCompilerOptions {\n  /**\n   * Allow JavaScript files to be compiled.\n   *\n   * @default false\n   */\n  readonly allowJs?: boolean;\n\n  /**\n   * Ensures that your files are parsed in the ECMAScript strict mode, and emit “use strict”\n   * for each source file.\n   *\n   * @default true\n   */\n  readonly alwaysStrict?: boolean;\n\n  /**\n   * Offers a way to configure the root directory for where declaration files are emitted.\n   *\n   */\n  readonly declarationDir?: string;\n\n  /**\n   * To be specified along with the above\n   *\n   */\n  readonly declaration?: boolean;\n\n  /**\n   * Emit __importStar and __importDefault helpers for runtime babel\n   * ecosystem compatibility and enable --allowSyntheticDefaultImports for\n   * typesystem compatibility.\n   *\n   * @default false\n   */\n  readonly esModuleInterop?: boolean;\n\n  /**\n   * Enables experimental support for decorators, which is in stage 2 of the TC39 standardization process.\n   *\n   * @default true\n   */\n  readonly experimentalDecorators?: boolean;\n\n  /**\n   * Enables experimental support for decorators, which is in stage 2 of the TC39 standardization process.\n   * Decorators are a language feature which hasn’t yet been fully ratified into the JavaScript specification.\n   * This means that the implementation version in TypeScript may differ from the implementation in JavaScript when it it decided by TC39.\n   * You can find out more about decorator support in TypeScript in the handbook.\n   *\n   * @see https://www.typescriptlang.org/docs/handbook/decorators.html\n   * @default undefined\n   */\n  readonly emitDecoratorMetadata?: boolean;\n\n  /**\n   * Disallow inconsistently-cased references to the same file.\n   *\n   * @default false\n   */\n  readonly forceConsistentCasingInFileNames?: boolean;\n\n  /**\n   * When set, instead of writing out a .js.map file to provide source maps,\n   * TypeScript will embed the source map content in the .js files.\n   *\n   * @default true\n   */\n  readonly inlineSourceMap?: boolean;\n\n  /**\n   * When set, TypeScript will include the original content of the .ts file as an embedded\n   * string in the source map. This is often useful in the same cases as inlineSourceMap.\n   *\n   * @default true\n   */\n  readonly inlineSources?: boolean;\n\n  /**\n   * Perform additional checks to ensure that separate compilation (such as\n   * with transpileModule or @babel/plugin-transform-typescript) would be safe.\n   *\n   * @default false\n   */\n  readonly isolatedModules?: boolean;\n\n  /**\n   * Support JSX in .tsx files: \"react\", \"preserve\", \"react-native\" etc.\n   *\n   * @default undefined\n   */\n  readonly jsx?: TypeScriptJsxMode;\n\n  /**\n   * Reference for type definitions / libraries to use (eg. ES2016, ES5, ES2018).\n   *\n   * @default [ \"es2018\" ]\n   */\n  readonly lib?: string[];\n\n  /**\n   * Sets the module system for the program.\n   * See https://www.typescriptlang.org/docs/handbook/modules.html#ambient-modules.\n   *\n   * @default \"CommonJS\"\n   */\n  readonly module?: string;\n\n  /**\n   * Determine how modules get resolved. Either \"Node\" for Node.js/io.js style resolution, or \"Classic\".\n   *\n   * @default \"node\"\n   */\n  readonly moduleResolution?: TypeScriptModuleResolution;\n\n  /**\n   * Do not emit outputs.\n   *\n   * @default false\n   */\n  readonly noEmit?: boolean;\n\n  /**\n   * Do not emit compiler output files like JavaScript source code, source-maps or\n   * declarations if any errors were reported.\n   *\n   * @default true\n   */\n  readonly noEmitOnError?: boolean;\n\n  /**\n   * Report errors for fallthrough cases in switch statements. Ensures that any non-empty\n   * case inside a switch statement includes either break or return. This means you won’t\n   * accidentally ship a case fallthrough bug.\n   *\n   * @default true\n   */\n  readonly noFallthroughCasesInSwitch?: boolean;\n\n  /**\n   * In some cases where no type annotations are present, TypeScript will fall back to a\n   * type of any for a variable when it cannot infer the type.\n   *\n   * @default true\n   */\n  readonly noImplicitAny?: boolean;\n\n  /**\n   * When enabled, TypeScript will check all code paths in a function to ensure they\n   * return a value.\n   *\n   * @default true\n   */\n  readonly noImplicitReturns?: boolean;\n  /**\n   * Raise error on ‘this’ expressions with an implied ‘any’ type.\n   *\n   * @default true\n   */\n  readonly noImplicitThis?: boolean;\n\n  /**\n   * Raise error on use of the dot syntax to access fields which are not defined.\n   *\n   * @default true\n   */\n  readonly noPropertyAccessFromIndexSignature?: boolean;\n\n  /**\n   * Raise error when accessing indexes on objects with unknown keys defined in index signatures.\n   *\n   * @default true\n   */\n  readonly noUncheckedIndexedAccess?: boolean;\n\n  /**\n   * Report errors on unused local variables.\n   *\n   * @default true\n   */\n  readonly noUnusedLocals?: boolean;\n\n  /**\n   * Report errors on unused parameters in functions.\n   *\n   * @default true\n   */\n  readonly noUnusedParameters?: boolean;\n\n  /**\n   * Allows importing modules with a ‘.json’ extension, which is a common practice\n   * in node projects. This includes generating a type for the import based on the static JSON shape.\n   *\n   * @default true\n   */\n  readonly resolveJsonModule?: boolean;\n\n  /**\n   * Skip type checking of all declaration files (*.d.ts).\n   *\n   * @default false\n   */\n  readonly skipLibCheck?: boolean;\n\n  /**\n   * The strict flag enables a wide range of type checking behavior that results in stronger guarantees\n   * of program correctness. Turning this on is equivalent to enabling all of the strict mode family\n   * options, which are outlined below. You can then turn off individual strict mode family checks as\n   * needed.\n   *\n   * @default true\n   */\n  readonly strict?: boolean;\n\n  /**\n   * When strictNullChecks is false, null and undefined are effectively ignored by the language.\n   * This can lead to unexpected errors at runtime.\n   * When strictNullChecks is true, null and undefined have their own distinct types and you’ll\n   * get a type error if you try to use them where a concrete value is expected.\n   *\n   * @default true\n   */\n  readonly strictNullChecks?: boolean;\n\n  /**\n   * When set to true, TypeScript will raise an error when a class property was declared but\n   * not set in the constructor.\n   *\n   * @default true\n   */\n  readonly strictPropertyInitialization?: boolean;\n\n  /**\n   * Do not emit declarations for code that has an @internal annotation in it’s JSDoc comment.\n   *\n   * @default true\n   */\n  readonly stripInternal?: boolean;\n\n  /**\n   * Modern browsers support all ES6 features, so ES6 is a good choice. You might choose to set\n   * a lower target if your code is deployed to older environments, or a higher target if your\n   * code is guaranteed to run in newer environments.\n   *\n   * @default \"ES2018\"\n   */\n  readonly target?: string;\n\n  /**\n   * Output directory for the compiled files.\n   */\n  readonly outDir?: string;\n\n  /**\n   * Specifies the root directory of input files.\n   *\n   * Only use to control the output directory structure with `outDir`.\n   */\n  readonly rootDir?: string;\n\n  /**\n   * Allow default imports from modules with no default export. This does not affect code emit, just typechecking.\n   */\n  readonly allowSyntheticDefaultImports?: boolean;\n\n  /**\n   * Lets you set a base directory to resolve non-absolute module names.\n   *\n   * You can define a root folder where you can do absolute file resolution.\n   */\n  readonly baseUrl?: string;\n\n  /**\n   * A series of entries which re-map imports to lookup locations relative to the baseUrl, there is a larger coverage of paths in the handbook.\n   *\n   * paths lets you declare how TypeScript should resolve an import in your require/imports.\n   */\n  readonly paths?: { [key: string]: string[] };\n}\n\nexport class TypescriptConfig {\n  public readonly compilerOptions: TypeScriptCompilerOptions;\n  public readonly include: string[];\n  public readonly exclude: string[];\n  public readonly fileName: string;\n  public readonly file: JsonFile;\n\n  constructor(project: NodeProject, options: TypescriptConfigOptions) {\n    const fileName = options.fileName ?? \"tsconfig.json\";\n\n    this.include = options.include ?? [\"**/*.ts\"];\n    this.exclude = options.exclude ?? [\"node_modules\"];\n    this.fileName = fileName;\n\n    this.compilerOptions = options.compilerOptions;\n\n    this.file = new JsonFile(project, fileName, {\n      obj: {\n        compilerOptions: this.compilerOptions,\n        include: () => this.include,\n        exclude: () => this.exclude,\n      },\n    });\n\n    project.npmignore?.exclude(`/${fileName}`);\n  }\n\n  public addInclude(pattern: string) {\n    this.include.push(pattern);\n  }\n\n  public addExclude(pattern: string) {\n    this.exclude.push(pattern);\n  }\n}\n"
  },
  {
    "path": "src/javascript/upgrade-dependencies.ts",
    "content": "import { Component } from \"../component\";\nimport {\n  GithubCredentials,\n  GitHub,\n  GithubWorkflow,\n  GitIdentity,\n  workflows,\n} from \"../github\";\nimport { DEFAULT_GITHUB_ACTIONS_USER } from \"../github/constants\";\nimport { WorkflowActions } from \"../github/workflow-actions\";\nimport { ContainerOptions, JobStep } from \"../github/workflows-model\";\nimport { NodeProject } from \"../javascript\";\nimport { Release } from \"../release\";\nimport { Task } from \"../task\";\nimport { TaskStep } from \"../task-model\";\n\nfunction context(value: string) {\n  return `\\${{ ${value} }}`;\n}\n\nconst REPO = context(\"github.repository\");\nconst RUN_ID = context(\"github.run_id\");\nconst RUN_URL = `https://github.com/${REPO}/actions/runs/${RUN_ID}`;\nconst CREATE_PATCH_STEP_ID = \"create_patch\";\nconst PATCH_CREATED_OUTPUT = \"patch_created\";\n\n/**\n * Options for `UpgradeDependencies`.\n */\nexport interface UpgradeDependenciesOptions {\n  /**\n   * List of package names to exclude during the upgrade.\n   *\n   * @default - Nothing is excluded.\n   */\n  readonly exclude?: string[];\n\n  /**\n   * List of package names to include during the upgrade.\n   *\n   * @default - Everything is included.\n   */\n  readonly include?: string[];\n\n  /**\n   * Include a github workflow for creating PR's that upgrades the\n   * required dependencies, either by manual dispatch, or by a schedule.\n   *\n   * If this is `false`, only a local projen task is created, which can be executed manually to\n   * upgrade the dependencies.\n   *\n   * @default - true for root projects, false for sub-projects.\n   */\n  readonly workflow?: boolean;\n\n  /**\n   * Options for the github workflow. Only applies if `workflow` is true.\n   *\n   * @default - default options.\n   */\n  readonly workflowOptions?: UpgradeDependenciesWorkflowOptions;\n\n  /**\n   * The name of the task that will be created.\n   * This will also be the workflow name.\n   *\n   * @default \"upgrade\".\n   */\n  readonly taskName?: string;\n\n  /**\n   * Title of the pull request to use (should be all lower-case).\n   *\n   * @default \"upgrade dependencies\"\n   */\n  readonly pullRequestTitle?: string;\n\n  /**\n   * Add Signed-off-by line by the committer at the end of the commit log message.\n   *\n   * @default true\n   */\n  readonly signoff?: boolean;\n}\n\n/**\n * Upgrade node project dependencies.\n */\nexport class UpgradeDependencies extends Component {\n  /**\n   * The workflows that execute the upgrades. One workflow per branch.\n   */\n  public readonly workflows: GithubWorkflow[] = [];\n\n  private readonly options: UpgradeDependenciesOptions;\n  private readonly _project: NodeProject;\n  private readonly pullRequestTitle: string;\n\n  /**\n   * Container definitions for the upgrade workflow.\n   */\n  public containerOptions?: ContainerOptions;\n\n  /**\n   * The upgrade task.\n   */\n  public readonly upgradeTask: Task;\n\n  /**\n   * A task run after the upgrade task.\n   */\n  public readonly postUpgradeTask: Task;\n\n  private readonly gitIdentity: GitIdentity;\n  private readonly postBuildSteps: JobStep[];\n\n  constructor(project: NodeProject, options: UpgradeDependenciesOptions = {}) {\n    super(project);\n\n    this._project = project;\n    this.options = options;\n    this.pullRequestTitle = options.pullRequestTitle ?? \"upgrade dependencies\";\n    this.gitIdentity =\n      options.workflowOptions?.gitIdentity ?? DEFAULT_GITHUB_ACTIONS_USER;\n    this.postBuildSteps = [];\n    this.containerOptions = options.workflowOptions?.container;\n    project.addDevDeps(\"npm-check-updates@^15\");\n\n    this.postUpgradeTask =\n      project.tasks.tryFind(\"post-upgrade\") ??\n      project.tasks.addTask(\"post-upgrade\", {\n        description: \"Runs after upgrading dependencies\",\n      });\n\n    this.upgradeTask = project.addTask(options.taskName ?? \"upgrade\", {\n      // this task should not run in CI mode because its designed to\n      // update package.json and lock files.\n      env: { CI: \"0\" },\n      description: this.pullRequestTitle,\n      steps: { toJSON: () => this.renderTaskSteps() } as any,\n    });\n    this.upgradeTask.lock(); // this task is a lazy value, so make it readonly\n\n    if (this.upgradeTask && project.github && (options.workflow ?? true)) {\n      if (options.workflowOptions?.branches) {\n        for (const branch of options.workflowOptions.branches) {\n          this.workflows.push(\n            this.createWorkflow(this.upgradeTask, project.github, branch)\n          );\n        }\n      } else if (Release.of(project)) {\n        const release = Release.of(project)!;\n        release._forEachBranch((branch: string) => {\n          this.workflows.push(\n            this.createWorkflow(this.upgradeTask, project.github!, branch)\n          );\n        });\n      } else {\n        // represents the default repository branch.\n        // just like not specifying anything.\n        const defaultBranch = undefined;\n        this.workflows.push(\n          this.createWorkflow(this.upgradeTask, project.github, defaultBranch)\n        );\n      }\n    }\n  }\n\n  /**\n   * Add steps to execute a successful build.\n   * @param steps workflow steps\n   */\n  public addPostBuildSteps(...steps: JobStep[]) {\n    this.postBuildSteps.push(...steps);\n  }\n\n  private renderTaskSteps(): TaskStep[] {\n    const exclude = this.options.exclude ?? [];\n\n    // exclude depedencies that has already version pinned (fully or with patch version) by Projen with ncu (but not package manager upgrade)\n    // Getting only unique values through set\n    const ncuExcludes = [\n      ...new Set(\n        this.project.deps.all\n          .filter((dep) => dep.version && dep.version[0] !== \"^\")\n          .map((dep) => dep.name)\n          .concat(exclude)\n      ),\n    ];\n\n    const ncuIncludes = this.options.include?.filter(\n      (item) => !ncuExcludes.includes(item)\n    );\n\n    const includeLength = this.options.include?.length ?? 0;\n    const ncuIncludesLength = ncuIncludes?.length ?? 0;\n\n    // If all explicit includes already have version pinned, don't add task.\n    // Note that without explicit includes task gets added\n    if (includeLength > 0 && ncuIncludesLength === 0) {\n      return [{ exec: \"echo No dependencies to upgrade.\" }];\n    }\n\n    const steps = new Array<TaskStep>();\n\n    // update npm-check-updates before everything else, in case there is a bug\n    // in it or one of its dependencies. This will make upgrade workflows\n    // slightly more stable and resilient to upstream changes.\n    steps.push({\n      exec: this._project.package.renderUpgradePackagesCommand(\n        [],\n        [\"npm-check-updates\"]\n      ),\n    });\n\n    for (const dep of [\"dev\", \"optional\", \"peer\", \"prod\", \"bundle\"]) {\n      const ncuCommand = [\n        \"npm-check-updates\",\n        \"--dep\",\n        dep,\n        \"--upgrade\",\n        \"--target=minor\",\n      ];\n      // Don't add includes and excludes same time\n      if (ncuIncludes) {\n        ncuCommand.push(`--filter='${ncuIncludes.join(\",\")}'`);\n      } else if (ncuExcludes.length > 0) {\n        ncuCommand.push(`--reject='${ncuExcludes.join(\",\")}'`);\n      }\n\n      steps.push({ exec: ncuCommand.join(\" \") });\n    }\n\n    // run \"yarn/npm install\" to update the lockfile and install any deps (such as projen)\n    steps.push({ exec: this._project.package.installAndUpdateLockfileCommand });\n\n    // run upgrade command to upgrade transitive deps as well\n    steps.push({\n      exec: this._project.package.renderUpgradePackagesCommand(\n        exclude,\n        this.options.include\n      ),\n    });\n\n    // run \"projen\" to give projen a chance to update dependencies (it will also run \"yarn install\")\n    steps.push({ exec: this._project.projenCommand });\n\n    steps.push({ spawn: this.postUpgradeTask.name });\n\n    return steps;\n  }\n\n  private createWorkflow(\n    task: Task,\n    github: GitHub,\n    branch?: string\n  ): GithubWorkflow {\n    const schedule =\n      this.options.workflowOptions?.schedule ??\n      UpgradeDependenciesSchedule.DAILY;\n\n    const workflowName = `${task.name}${\n      branch ? `-${branch.replace(/\\//g, \"-\")}` : \"\"\n    }`;\n    const workflow = github.addWorkflow(workflowName);\n    const triggers: workflows.Triggers = {\n      workflowDispatch: {},\n      schedule:\n        schedule.cron.length > 0\n          ? schedule.cron.map((e) => ({ cron: e }))\n          : undefined,\n    };\n    workflow.on(triggers);\n\n    const upgrade = this.createUpgrade(task, branch);\n    const pr = this.createPr(workflow, upgrade);\n\n    const jobs: Record<string, workflows.Job> = {};\n    jobs[upgrade.jobId] = upgrade.job;\n    jobs[pr.jobId] = pr.job;\n\n    workflow.addJobs(jobs);\n    return workflow;\n  }\n\n  private createUpgrade(task: Task, branch?: string): Upgrade {\n    const runsOn = this.options.workflowOptions?.runsOn ?? [\"ubuntu-latest\"];\n\n    // thats all we should need at this stage since all we do is clone.\n    // note that this also prevents new code that is introduced in the upgrade\n    // to have write access to anything, in case its somehow executed. (for example during build)\n    const permissions: workflows.JobPermissions = {\n      contents: workflows.JobPermission.READ,\n    };\n\n    const steps: workflows.JobStep[] = [\n      {\n        name: \"Checkout\",\n        uses: \"actions/checkout@v3\",\n        with: branch ? { ref: branch } : undefined,\n      },\n      ...this._project.renderWorkflowSetup({ mutable: false }),\n      {\n        name: \"Upgrade dependencies\",\n        run: this._project.runTaskCommand(task),\n      },\n    ];\n\n    steps.push(...this.postBuildSteps);\n    steps.push(\n      ...WorkflowActions.createUploadGitPatch({\n        stepId: CREATE_PATCH_STEP_ID,\n        outputName: PATCH_CREATED_OUTPUT,\n      })\n    );\n\n    return {\n      job: {\n        name: \"Upgrade\",\n        container: this.containerOptions,\n        permissions: permissions,\n        runsOn: runsOn ?? [\"ubuntu-latest\"],\n        steps: steps,\n        outputs: {\n          [PATCH_CREATED_OUTPUT]: {\n            stepId: CREATE_PATCH_STEP_ID,\n            outputName: PATCH_CREATED_OUTPUT,\n          },\n        },\n      },\n      jobId: \"upgrade\",\n      ref: branch,\n    };\n  }\n\n  private createPr(workflow: GithubWorkflow, upgrade: Upgrade): PR {\n    // default to API access method used by all GitHub workflows, unless a\n    // custom one is specified\n    const apiAccess =\n      this.options.workflowOptions?.projenCredentials ??\n      workflow.projenCredentials;\n    const token = apiAccess.tokenRef;\n    const runsOn = this.options.workflowOptions?.runsOn ?? [\"ubuntu-latest\"];\n    const workflowName = workflow.name;\n    const branchName = `github-actions/${workflowName}`;\n    const prStepId = \"create-pr\";\n\n    const title = `chore(deps): ${this.pullRequestTitle}`;\n    const description = [\n      \"Upgrades project dependencies. See details in [workflow run].\",\n      \"\",\n      `[Workflow Run]: ${RUN_URL}`,\n      \"\",\n      \"------\",\n      \"\",\n      `*Automatically created by projen via the \"${workflow.name}\" workflow*`,\n    ].join(\"\\n\");\n\n    const committer = `${this.gitIdentity.name} <${this.gitIdentity.email}>`;\n\n    const steps: workflows.JobStep[] = [\n      ...apiAccess.setupSteps,\n      ...WorkflowActions.checkoutWithPatch({\n        token: apiAccess.tokenRef,\n        ref: upgrade.ref,\n      }),\n      ...WorkflowActions.setGitIdentity(this.gitIdentity),\n      {\n        name: \"Create Pull Request\",\n        id: prStepId,\n        uses: \"peter-evans/create-pull-request@v3\",\n        with: {\n          // the pr can modify workflow files, so we need to use the custom\n          // secret if one is configured.\n          token: token,\n          \"commit-message\": `${title}\\n\\n${description}`,\n          branch: branchName,\n          title: title,\n          labels: this.options.workflowOptions?.labels?.join(\",\") || undefined,\n          assignees:\n            this.options.workflowOptions?.assignees?.join(\",\") || undefined,\n          body: description,\n          author: committer,\n          committer: committer,\n          signoff: this.options.signoff ?? true,\n        },\n      },\n    ];\n\n    return {\n      job: {\n        name: \"Create Pull Request\",\n        if: `\\${{ needs.${upgrade.jobId}.outputs.${PATCH_CREATED_OUTPUT} }}`,\n        needs: [upgrade.jobId],\n        permissions: {\n          contents: workflows.JobPermission.WRITE,\n          pullRequests: workflows.JobPermission.WRITE,\n        },\n        runsOn: runsOn ?? [\"ubuntu-latest\"],\n        steps: steps,\n      },\n      jobId: \"pr\",\n    };\n  }\n}\n\ninterface Upgrade {\n  readonly ref?: string;\n  readonly job: workflows.Job;\n  readonly jobId: string;\n}\n\ninterface PR {\n  readonly job: workflows.Job;\n  readonly jobId: string;\n}\n\n/**\n * Options for `UpgradeDependencies.workflowOptions`.\n */\nexport interface UpgradeDependenciesWorkflowOptions {\n  /**\n   * Schedule to run on.\n   *\n   * @default UpgradeDependenciesSchedule.DAILY\n   */\n  readonly schedule?: UpgradeDependenciesSchedule;\n\n  /**\n   * Choose a method for authenticating with GitHub for creating the PR.\n   *\n   * When using the default github token, PR's created by this workflow\n   * will not trigger any subsequent workflows (i.e the build workflow), so\n   * projen requires API access to be provided through e.g. a personal\n   * access token or other method.\n   *\n   * @see https://github.com/peter-evans/create-pull-request/issues/48\n   * @default - personal access token named PROJEN_GITHUB_TOKEN\n   */\n  readonly projenCredentials?: GithubCredentials;\n\n  /**\n   * Labels to apply on the PR.\n   *\n   * @default - no labels.\n   */\n  readonly labels?: string[];\n\n  /**\n   * Assignees to add on the PR.\n   *\n   * @default - no assignees\n   */\n  readonly assignees?: string[];\n\n  /**\n   * Job container options.\n   *\n   * @default - defaults\n   */\n  readonly container?: workflows.ContainerOptions;\n\n  /**\n   * List of branches to create PR's for.\n   *\n   * @default - All release branches configured for the project.\n   */\n  readonly branches?: string[];\n\n  /**\n   * The git identity to use for commits.\n   * @default \"github-actions@github.com\"\n   */\n  readonly gitIdentity?: GitIdentity;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly runsOn?: string[];\n}\n\n/**\n * How often to check for new versions and raise pull requests for version upgrades.\n */\nexport class UpgradeDependenciesSchedule {\n  /**\n   * Disables automatic upgrades.\n   */\n  public static readonly NEVER = new UpgradeDependenciesSchedule([]);\n\n  /**\n   * At 00:00.\n   */\n  public static readonly DAILY = new UpgradeDependenciesSchedule([\"0 0 * * *\"]);\n\n  /**\n   * At 00:00 on every day-of-week from Monday through Friday.\n   */\n  public static readonly WEEKDAY = new UpgradeDependenciesSchedule([\n    \"0 0 * * 1-5\",\n  ]);\n\n  /**\n   * At 00:00 on Monday.\n   */\n  public static readonly WEEKLY = new UpgradeDependenciesSchedule([\n    \"0 0 * * 1\",\n  ]);\n\n  /**\n   * At 00:00 on day-of-month 1.\n   */\n  public static readonly MONTHLY = new UpgradeDependenciesSchedule([\n    \"0 0 1 * *\",\n  ]);\n\n  /**\n   * Create a schedule from a raw cron expression.\n   */\n  public static expressions(cron: string[]) {\n    return new UpgradeDependenciesSchedule(cron);\n  }\n\n  private constructor(public readonly cron: string[]) {}\n}\n"
  },
  {
    "path": "src/javascript/util.ts",
    "content": "import { basename, dirname, extname, join, sep } from \"path\";\nimport * as semver from \"semver\";\nimport { NodePackageManager } from \"./node-package\";\n\nexport function renderBundleName(entrypoint: string) {\n  const parts = join(entrypoint).split(sep);\n  if (parts[0] === \"src\") {\n    parts.shift(); // just remove 'src' if its the first element for ergonomics\n  }\n\n  const p = parts.join(sep);\n  const dir = dirname(p);\n  const base = basename(p, extname(p));\n  return join(dir, base);\n}\n\n/**\n * Regex for AWS CodeArtifact registry\n */\nexport const codeArtifactRegex =\n  /^https:\\/\\/(?<registry>(?<domain>[^\\.]+)-(?<accountId>\\d{12})\\.d\\.codeartifact\\.(?<region>[^\\.]+).*\\.amazonaws\\.com\\/.*\\/(?<repository>\\w+)\\/)/;\n\n/**\n * gets AWS details from the Code Artifact registry URL\n * throws exception if not matching expected pattern\n * @param registryUrl Code Artifact registry URL\n * @returns object containing the (domain, accountId, region, repository)\n */\nexport function extractCodeArtifactDetails(registryUrl: string) {\n  const match = registryUrl.match(codeArtifactRegex);\n  if (match?.groups) {\n    const { domain, accountId, region, repository, registry } = match.groups;\n    return { domain, accountId, region, repository, registry };\n  }\n  throw new Error(\"Could not get CodeArtifact details from npm Registry\");\n}\n\nexport function minVersion(version: string): string | undefined {\n  if (semver.validRange(version)) {\n    return semver.minVersion(version)?.version;\n  } else {\n    return version;\n  }\n}\n\nexport function packageResolutionsFieldName(\n  packageManager: NodePackageManager = NodePackageManager.YARN\n) {\n  if (packageManager == NodePackageManager.NPM) {\n    return \"overrides\";\n  }\n\n  if (packageManager == NodePackageManager.PNPM) {\n    return \"pnpm.overrides\";\n  }\n\n  return \"resolutions\";\n}\n"
  },
  {
    "path": "src/json-patch.ts",
    "content": "// copied fro https://github.com/cdk8s-team/cdk8s-core/blob/6b317a7a6a2504e228bc56bf96fc98829f88c2be/src/json-patch.ts\n// under Apache 2.0 license\nimport { applyPatch, Operation } from \"fast-json-patch\";\n\n/**\n * Utility for applying RFC-6902 JSON-Patch to a document.\n *\n * Use the the `JsonPatch.apply(doc, ...ops)` function to apply a set of\n * operations to a JSON document and return the result.\n *\n * Operations can be created using the factory methods `JsonPatch.add()`,\n * `JsonPatch.remove()`, etc.\n *\n * @example\n *\n *const output = JsonPatch.apply(input,\n *  JsonPatch.replace('/world/hi/there', 'goodbye'),\n *  JsonPatch.add('/world/foo/', 'boom'),\n *  JsonPatch.remove('/hello'));\n *\n */\nexport class JsonPatch {\n  /**\n   * Applies a set of JSON-Patch (RFC-6902) operations to `document` and returns the result.\n   * @param document The document to patch\n   * @param ops The operations to apply\n   * @returns The result document\n   */\n  public static apply(document: any, ...ops: JsonPatch[]): any {\n    const result = applyPatch(\n      document,\n      ops.map((o) => o._toJson())\n    );\n    return result.newDocument;\n  }\n\n  /**\n   * Adds a value to an object or inserts it into an array. In the case of an\n   * array, the value is inserted before the given index. The - character can be\n   * used instead of an index to insert at the end of an array.\n   *\n   * @example JsonPatch.add('/biscuits/1', { \"name\": \"Ginger Nut\" })\n   */\n  public static add(path: string, value: any) {\n    return new JsonPatch({ op: \"add\", path, value });\n  }\n\n  /**\n   * Removes a value from an object or array.\n   *\n   * @example JsonPatch.remove('/biscuits')\n   * @example JsonPatch.remove('/biscuits/0')\n   */\n  public static remove(path: string) {\n    return new JsonPatch({ op: \"remove\", path });\n  }\n\n  /**\n   * Replaces a value. Equivalent to a “remove” followed by an “add”.\n   *\n   * @example JsonPatch.replace('/biscuits/0/name', 'Chocolate Digestive')\n   */\n  public static replace(path: string, value: any) {\n    return new JsonPatch({ op: \"replace\", path, value });\n  }\n\n  /**\n   * Copies a value from one location to another within the JSON document. Both\n   * from and path are JSON Pointers.\n   *\n   * @example JsonPatch.copy('/biscuits/0', '/best_biscuit')\n   */\n  public static copy(from: string, path: string) {\n    return new JsonPatch({ op: \"copy\", from, path });\n  }\n\n  /**\n   * Moves a value from one location to the other. Both from and path are JSON Pointers.\n   *\n   * @example JsonPatch.move('/biscuits', '/cookies')\n   */\n  public static move(from: string, path: string) {\n    return new JsonPatch({ op: \"move\", from, path });\n  }\n\n  /**\n   * Tests that the specified value is set in the document. If the test fails,\n   * then the patch as a whole should not apply.\n   *\n   * @example JsonPatch.test('/best_biscuit/name', 'Choco Leibniz')\n   */\n  public static test(path: string, value: any) {\n    return new JsonPatch({ op: \"test\", path, value });\n  }\n\n  private constructor(private readonly operation: Operation) {}\n\n  /**\n   * Returns the JSON representation of this JSON patch operation.\n   *\n   * @internal\n   */\n  public _toJson(): any {\n    return this.operation;\n  }\n}\n"
  },
  {
    "path": "src/json.ts",
    "content": "import { IResolver } from \"./file\";\nimport { ObjectFile, ObjectFileOptions } from \"./object-file\";\nimport { Project } from \"./project\";\n\n/**\n * Options for `JsonFile`.\n */\nexport interface JsonFileOptions extends ObjectFileOptions {\n  /**\n   * Adds a newline at the end of the file.\n   * @default true\n   */\n  readonly newline?: boolean;\n\n  /**\n   * Allow the use of comments in this file.\n   * @default - false for .json files, true for .json5 and .jsonc files\n   */\n  readonly allowComments?: boolean;\n}\n\n/**\n * Represents a JSON file.\n */\nexport class JsonFile extends ObjectFile {\n  private readonly newline: boolean;\n  private readonly supportsComments: boolean;\n\n  constructor(project: Project, filePath: string, options: JsonFileOptions) {\n    super(project, filePath, options);\n\n    this.newline = options.newline ?? true;\n    this.supportsComments =\n      options.allowComments ??\n      (filePath.toLowerCase().endsWith(\"json5\") ||\n        filePath.toLowerCase().endsWith(\"jsonc\"));\n\n    if (!options.obj) {\n      throw new Error('\"obj\" cannot be undefined');\n    }\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const json = super.synthesizeContent(resolver);\n    if (!json) {\n      return undefined;\n    }\n\n    const sanitized = JSON.parse(json);\n\n    if (this.marker && !this.supportsComments) {\n      sanitized[\"//\"] = this.marker;\n    }\n\n    let content = JSON.stringify(sanitized, undefined, 2);\n    if (this.marker && this.supportsComments) {\n      content = content.slice(0, -1) + `// ${this.marker}\\n}`;\n    }\n\n    if (this.newline) {\n      content += \"\\n\";\n    }\n\n    return content;\n  }\n}\n"
  },
  {
    "path": "src/license.ts",
    "content": "import * as fs from \"fs-extra\";\nimport { FileBase, IResolver } from \"./file\";\nimport { Project } from \"./project\";\n\nexport interface LicenseOptions {\n  /**\n   * License type (SPDX).\n   *\n   * @see https://github.com/projen/projen/tree/main/license-text for list of supported licenses\n   */\n  readonly spdx: string;\n\n  /**\n   * Copyright owner.\n   *\n   * If the license text has $copyright_owner, this option must be specified.\n   *\n   * @default -\n   */\n  readonly copyrightOwner?: string;\n\n  /**\n   * Period of license (e.g. \"1998-2023\")\n   *\n   * The string `$copyright_period` will be substituted with this string.\n   *\n   * @default - current year (e.g. \"2020\")\n   */\n  readonly copyrightPeriod?: string;\n}\n\nexport class License extends FileBase {\n  private readonly text: string;\n\n  constructor(project: Project, options: LicenseOptions) {\n    super(project, \"LICENSE\", {\n      marker: false,\n      // Allow the license to be displayed in the repositories.\n      committed: true,\n    });\n\n    const spdx = options.spdx;\n\n    const textFile = `${__dirname}/../license-text/${spdx}.txt`;\n    if (!fs.existsSync(textFile)) {\n      throw new Error(`unsupported license ${spdx}`);\n    }\n\n    const years =\n      options.copyrightPeriod ?? new Date().getFullYear().toString();\n    const owner = options.copyrightOwner;\n\n    let text = fs.readFileSync(textFile, \"utf-8\");\n\n    text = text.replace(\"$copyright_period\", years);\n\n    // if the license text includes $copyright_owner, then `copyrightOwner` is required.\n    if (text.indexOf(\"$copyright_owner\") !== -1) {\n      if (!owner) {\n        throw new Error(\n          `The ${spdx} license requires \"copyrightOwner\" to be specified`\n        );\n      }\n\n      text = text.replace(\"$copyright_owner\", owner);\n    }\n\n    this.text = text;\n  }\n\n  protected synthesizeContent(_: IResolver): string | undefined {\n    return this.text;\n  }\n}\n"
  },
  {
    "path": "src/logger.ts",
    "content": "import * as chalk from \"chalk\";\nimport { IS_TEST_RUN } from \"./common\";\nimport { Component } from \"./component\";\nimport { ICON } from \"./logging\";\nimport { Project } from \"./project\";\nimport { isTruthy } from \"./util\";\n\n/**\n * Options for logging utilities.\n */\nexport interface LoggerOptions {\n  /**\n   * The logging verbosity. The levels available (in increasing verbosity) are\n   * OFF, ERROR, WARN, INFO, DEBUG, and VERBOSE.\n   *\n   * @default LogLevel.INFO\n   */\n  readonly level?: LogLevel;\n\n  /**\n   * Include a prefix for all logging messages with the project name.\n   *\n   * @default false\n   */\n  readonly usePrefix?: boolean;\n}\n\n/**\n * Project-level logging utilities.\n */\nexport class Logger extends Component {\n  private readonly level: LogLevel;\n  private readonly usePrefix: boolean;\n\n  constructor(project: Project, options: LoggerOptions = {}) {\n    super(project);\n\n    // if we are running inside a test, default to no logs\n    const defaultLevel = IS_TEST_RUN ? LogLevel.OFF : LogLevel.INFO;\n\n    this.level = options.level ?? defaultLevel;\n    this.usePrefix = options.usePrefix ?? false;\n  }\n\n  /**\n   * Log a message to stderr with a given logging level. The message will be\n   * printed as long as `logger.level` is set to the message's severity or higher.\n   *\n   * @param level Logging verbosity\n   * @param text strings or objects to print\n   */\n  public log(level: LogLevel, ...text: any[]) {\n    if (level === LogLevel.OFF) {\n      throw new Error(\"Cannot log a message with level LogLevel.OFF\");\n    }\n\n    let maxLevel = this.level;\n\n    // logging level can be overridden through the --debug CLI option\n    if (isTruthy(process.env.DEBUG) && maxLevel < LogLevel.DEBUG) {\n      maxLevel = LogLevel.DEBUG;\n    }\n\n    if (level <= maxLevel) {\n      const color =\n        this.colorForLogLevel(level) ??\n        ((...values: string[]): string => values.join(\" \"));\n      const prefix = this.usePrefix ? `[${this.project.name}] ` : \"\";\n      console.error(`${ICON} ${prefix}${color(...text)}`);\n    }\n  }\n\n  /**\n   * Log a message to stderr with VERBOSE severity\n   * @param text strings or objects to print\n   */\n  public verbose(...text: any[]) {\n    this.log(LogLevel.VERBOSE, ...text);\n  }\n\n  /**\n   * Log a message to stderr with DEBUG severity\n   * @param text strings or objects to print\n   */\n  public debug(...text: any[]) {\n    this.log(LogLevel.DEBUG, ...text);\n  }\n\n  /**\n   * Log a message to stderr with INFO severity\n   * @param text strings or objects to print\n   */\n  public info(...text: any[]) {\n    this.log(LogLevel.INFO, ...text);\n  }\n\n  /**\n   * Log a message to stderr with WARN severity\n   * @param text strings or objects to print\n   */\n  public warn(...text: any[]) {\n    this.log(LogLevel.WARN, ...text);\n  }\n\n  /**\n   * Log a message to stderr with ERROR severity\n   * @param text strings or objects to print\n   */\n  public error(...text: any[]) {\n    this.log(LogLevel.ERROR, ...text);\n  }\n\n  private colorForLogLevel(level: LogLevel): chalk.ChalkFunction {\n    switch (level) {\n      case LogLevel.ERROR:\n        return chalk.red;\n      case LogLevel.WARN:\n        return chalk.yellow;\n      case LogLevel.INFO:\n        return chalk.cyan;\n      case LogLevel.DEBUG:\n        return chalk.gray;\n      case LogLevel.VERBOSE:\n        return chalk.white;\n      default:\n        return chalk.white;\n    }\n  }\n}\n\n/**\n * Logging verbosity.\n */\nexport enum LogLevel {\n  OFF = \"00.off\",\n  ERROR = \"10.error\",\n  WARN = \"20.warn\",\n  INFO = \"30.info\",\n  DEBUG = \"40.debug\",\n  VERBOSE = \"50.verbose\",\n}\n"
  },
  {
    "path": "src/logging.ts",
    "content": "import * as chalk from \"chalk\";\nimport { IS_TEST_RUN } from \"./common\";\n\nexport const ICON = \"👾\"; //'✨';\n\n// disable logs if running inside a test\nlet enabled = IS_TEST_RUN ? false : true;\n\nfunction log(isError: boolean, color: chalk.ChalkFunction, ...text: any[]) {\n  // errors are always emitted, even if logs are disabled\n  if (!enabled && !isError) {\n    return;\n  }\n  console.error(`${ICON} ${color(...text)}`);\n}\n\nexport function debug(...text: any[]) {\n  if (process.env.DEBUG) {\n    log(false, chalk.gray, ...text);\n  }\n}\n\nexport function verbose(...text: any[]) {\n  log(false, chalk.white, ...text);\n}\n\nexport function info(...text: any[]) {\n  log(false, chalk.cyan, ...text);\n}\n\nexport function error(...text: any[]) {\n  log(true, chalk.red, ...text);\n}\n\nexport function warn(...text: any[]) {\n  log(false, chalk.yellow, ...text);\n}\n\nexport function disable() {\n  enabled = false;\n}\n\nexport function isEnabled() {\n  return enabled;\n}\n"
  },
  {
    "path": "src/makefile.ts",
    "content": "import { FileBase, FileBaseOptions, IResolver } from \"./file\";\nimport { Project } from \"./project\";\n\n/**\n * A Make rule.\n */\nexport interface Rule {\n  /**\n   * Files to be created or updated by this rule.\n   *\n   * If the rule is phony then instead this represents the command's name(s).\n   */\n  readonly targets: string[];\n\n  /**\n   * Files that are used as inputs to create a target.\n   *\n   * @default []\n   */\n  readonly prerequisites?: string[];\n\n  /**\n   * Commands that are run (using prerequisites as inputs) to create a target.\n   *\n   * @default []\n   */\n  readonly recipe?: string[];\n\n  /**\n   * Marks whether the target is phony.\n   *\n   * @default false\n   */\n  readonly phony?: boolean;\n}\n\ninterface AllRule extends Rule {\n  readonly prerequisites: string[];\n}\n\n/**\n * Options for Makefiles.\n */\nexport interface MakefileOptions extends FileBaseOptions {\n  /**\n   * List of targets to build when Make is invoked without specifying any targets.\n   *\n   * @default []\n   */\n  readonly all?: string[];\n\n  /**\n   * Rules to include in the Makefile.\n   *\n   * @default []\n   */\n  readonly rules?: Rule[];\n}\n\n/**\n * Minimal Makefile.\n */\nexport class Makefile extends FileBase {\n  /**\n   * List of rule definitions.\n   */\n  public readonly rules: Rule[];\n\n  private readonly all: AllRule;\n\n  constructor(\n    project: Project,\n    filePath: string,\n    options: MakefileOptions = {}\n  ) {\n    super(project, filePath, options);\n\n    const all = options.all ? options.all : [];\n    const rules = options.rules ? options.rules : [];\n\n    rules.forEach((e) => this.validateRule(e));\n\n    this.all = {\n      targets: [\"all\"],\n      prerequisites: all,\n      phony: true,\n    };\n    this.rules = [this.all, ...rules];\n  }\n\n  /**\n   * Add a target to all\n   */\n  public addAll(target: string): Makefile {\n    this.all.prerequisites.push(target);\n    return this;\n  }\n\n  /**\n   * Add multiple targets to all\n   */\n  public addAlls(...targets: string[]): Makefile {\n    targets.forEach((e) => this.addAll(e));\n    return this;\n  }\n\n  /**\n   * Add a rule to the Makefile.\n   */\n  public addRule(rule: Rule): Makefile {\n    this.validateRule(rule);\n    this.rules.push(rule);\n    return this;\n  }\n\n  /**\n   * Add multiple rules to the Makefile.\n   */\n  public addRules(...rules: Rule[]): Makefile {\n    rules.forEach((e) => this.addRule(e));\n    return this;\n  }\n\n  private validateRule(rule: Rule) {\n    if (!rule.targets || !rule.targets.length) {\n      throw new Error(\n        '\"targets\" cannot be undefined or empty for items in \"rules\"'\n      );\n    }\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const rules = resolver.resolve(this.rules);\n\n    const lines = [\n      ...rules.map((rule: Rule) => {\n        const targets = rule.targets.join(\" \");\n        const prerequisites = (\n          rule.prerequisites ? rule.prerequisites : []\n        ).join(\" \");\n        const recipe = rule.recipe ? rule.recipe : [];\n\n        const phony = rule.phony ? [`.PHONY: ${targets}`] : [];\n\n        return [\n          ...phony,\n          `${targets}: ${prerequisites}`.trim(),\n          ...recipe.map((step) => `\\t${step}`),\n        ].join(\"\\n\");\n      }),\n    ];\n\n    return `${lines.join(\"\\n\\n\")}\\n`;\n  }\n}\n"
  },
  {
    "path": "src/object-file.ts",
    "content": "import { FileBase, FileBaseOptions, IResolver } from \"./file\";\nimport { JsonPatch } from \"./json-patch\";\nimport { Project } from \"./project\";\nimport { deepMerge } from \"./util\";\n\n/**\n * Options for `ObjectFile`.\n */\nexport interface ObjectFileOptions extends FileBaseOptions {\n  /**\n   * The object that will be serialized. You can modify the object's contents\n   * before synthesis.\n   *\n   * @default {} an empty object (use `file.obj` to mutate).\n   */\n  readonly obj?: any;\n\n  /**\n   * Omits empty objects and arrays.\n   * @default false\n   */\n  readonly omitEmpty?: boolean;\n}\n\n/**\n * Represents an Object file.\n */\nexport abstract class ObjectFile extends FileBase {\n  /**\n   * The output object. This object can be mutated until the project is\n   * synthesized.\n   */\n  private readonly obj: object;\n\n  /**\n   * An object to be merged on top of `obj` after the resolver is called\n   */\n  private readonly rawOverrides: object;\n\n  /**\n   * Indicates if empty objects and arrays are omitted from the output object.\n   */\n  public readonly omitEmpty: boolean;\n\n  /**\n   * patches to be applied to `obj` after the resolver is called\n   */\n  private readonly patchOperations: JsonPatch[];\n\n  constructor(project: Project, filePath: string, options: ObjectFileOptions) {\n    super(project, filePath, options);\n\n    this.obj = options.obj ?? {};\n    this.omitEmpty = options.omitEmpty ?? false;\n    this.rawOverrides = {};\n    this.patchOperations = [];\n  }\n\n  /**\n   * Adds an override to the synthesized object file.\n   *\n   * If the override is nested, separate each nested level using a dot (.) in the path parameter.\n   * If there is an array as part of the nesting, specify the index in the path.\n   *\n   * To include a literal `.` in the property name, prefix with a `\\`. In most\n   * programming languages you will need to write this as `\"\\\\.\"` because the\n   * `\\` itself will need to be escaped.\n   *\n   * For example,\n   * ```typescript\n   * project.tsconfig.file.addOverride('compilerOptions.alwaysStrict', true);\n   * project.tsconfig.file.addOverride('compilerOptions.lib', ['dom', 'dom.iterable', 'esnext']);\n   * ```\n   * would add the overrides\n   * ```json\n   * \"compilerOptions\": {\n   *   \"alwaysStrict\": true,\n   *   \"lib\": [\n   *     \"dom\",\n   *     \"dom.iterable\",\n   *     \"esnext\"\n   *   ]\n   *   ...\n   * }\n   * ...\n   * ```\n   *\n   * @param path - The path of the property, you can use dot notation to\n   *        override values in complex types. Any intermediate keys\n   *        will be created as needed.\n   * @param value - The value. Could be primitive or complex.\n   */\n  public addOverride(path: string, value: any) {\n    const parts = splitOnPeriods(path);\n    let curr: any = this.rawOverrides;\n\n    while (parts.length > 1) {\n      const key = parts.shift()!;\n\n      // if we can't recurse further or the previous value is not an\n      // object overwrite it with an object.\n      const isObject =\n        curr[key] != null &&\n        typeof curr[key] === \"object\" &&\n        !Array.isArray(curr[key]);\n      if (!isObject) {\n        curr[key] = {};\n      }\n\n      curr = curr[key];\n    }\n\n    const lastKey = parts.shift()!;\n    curr[lastKey] = value;\n  }\n\n  /**\n   * Adds to an array in the synthesized object file.\n   *\n   * If the array is nested, separate each nested level using a dot (.) in the path parameter.\n   * If there is an array as part of the nesting, specify the index in the path.\n   *\n   * To include a literal `.` in the property name, prefix with a `\\`. In most\n   * programming languages you will need to write this as `\"\\\\.\"` because the\n   * `\\` itself will need to be escaped.\n   *\n   * For example, with the following object file\n   * ```json\n   * \"compilerOptions\": {\n   *   \"exclude\": [\"node_modules\"],\n   *   \"lib\": [\"es2019\"]\n   *   ...\n   * }\n   * ...\n   * ```\n   *\n   * ```typescript\n   * project.tsconfig.file.addToArray('compilerOptions.exclude', 'coverage');\n   * project.tsconfig.file.addToArray('compilerOptions.lib', 'dom', 'dom.iterable', 'esnext');\n   * ```\n   * would result in the following object file\n   * ```json\n   * \"compilerOptions\": {\n   *   \"exclude\": [\"node_modules\", \"coverage\"],\n   *   \"lib\": [\"es2019\", \"dom\", \"dom.iterable\", \"esnext\"]\n   *   ...\n   * }\n   * ...\n   * ```\n   *\n   * @param path - The path of the property, you can use dot notation to\n   *        att to arrays in complex types. Any intermediate keys\n   *        will be created as needed.\n   * @param values - The values to add. Could be primitive or complex.\n   */\n  public addToArray(path: string, ...values: any) {\n    const parts = splitOnPeriods(path);\n    let curr: any = this.rawOverrides;\n\n    while (parts.length > 1) {\n      const key = parts.shift()!;\n\n      // if we can't recurse further or the previous value is not an\n      // object overwrite it with an object.\n      const isObject =\n        curr[key] != null &&\n        typeof curr[key] === \"object\" &&\n        !Array.isArray(curr[key]);\n      if (!isObject) {\n        curr[key] = {};\n      }\n\n      curr = curr[key];\n    }\n\n    const lastKey = parts.shift()!;\n    if (Array.isArray(curr[lastKey])) {\n      curr[lastKey].push(...values);\n    } else {\n      curr[lastKey] = { __$APPEND: values };\n    }\n  }\n\n  /**\n   * Applies an RFC 6902 JSON-patch to the synthesized object file.\n   * See https://datatracker.ietf.org/doc/html/rfc6902 for more information.\n   *\n   * For example, with the following object file\n   * ```json\n   * \"compilerOptions\": {\n   *   \"exclude\": [\"node_modules\"],\n   *   \"lib\": [\"es2019\"]\n   *   ...\n   * }\n   * ...\n   * ```\n   *\n   * ```typescript\n   * project.tsconfig.file.patch(JsonPatch.add(\"/compilerOptions/exclude/-\", \"coverage\"));\n   * project.tsconfig.file.patch(JsonPatch.replace(\"/compilerOptions/lib\", [\"dom\", \"dom.iterable\", \"esnext\"]));\n   * ```\n   * would result in the following object file\n   * ```json\n   * \"compilerOptions\": {\n   *   \"exclude\": [\"node_modules\", \"coverage\"],\n   *   \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"]\n   *   ...\n   * }\n   * ...\n   * ```\n   *\n   * @param patches - The patch operations to apply\n   */\n  public patch(...patches: JsonPatch[]) {\n    this.patchOperations.push(...patches);\n  }\n\n  /**\n   * Syntactic sugar for `addOverride(path, undefined)`.\n   * @param path The path of the value to delete\n   */\n  public addDeletionOverride(path: string) {\n    this.addOverride(path, undefined);\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const obj = this.obj;\n\n    const resolved =\n      resolver.resolve(obj, {\n        omitEmpty: this.omitEmpty,\n      }) ?? undefined;\n\n    if (resolved) {\n      deepMerge([resolved, this.rawOverrides], true);\n    }\n    const patched = JsonPatch.apply(resolved, ...this.patchOperations);\n    return patched ? JSON.stringify(patched, undefined, 2) : undefined;\n  }\n}\n\n/**\n * Split on periods while processing escape characters \\\n */\nfunction splitOnPeriods(x: string): string[] {\n  // Build this list in reverse because it's more convenient to get the \"current\"\n  // item by doing ret[0] than by ret[ret.length - 1].\n  const ret = [\"\"];\n  for (let i = 0; i < x.length; i++) {\n    if (x[i] === \"\\\\\" && i + 1 < x.length) {\n      ret[0] += x[i + 1];\n      i++;\n    } else if (x[i] === \".\") {\n      ret.unshift(\"\");\n    } else {\n      ret[0] += x[i];\n    }\n  }\n\n  ret.reverse();\n  return ret;\n}\n"
  },
  {
    "path": "src/option-hints.ts",
    "content": "/**\n * Choices for how to display commented out options in projenrc files.\n * Does not apply to projenrc.json files.\n */\nexport enum InitProjectOptionHints {\n  /**\n   * Display all possible options (grouped by which interface they belong to).\n   */\n  ALL = \"all\",\n\n  /**\n   * Display only featured options, in alphabetical order.\n   */\n  FEATURED = \"featured\",\n\n  /**\n   * Display no extra options.\n   */\n  NONE = \"none\",\n}\n"
  },
  {
    "path": "src/project-build.ts",
    "content": "import { Component } from \"./component\";\nimport { Project } from \"./project\";\nimport { Task } from \"./task\";\n\n/**\n * Manages a standard build process for all projects.\n *\n * Build spawns these tasks in order:\n * 1. default\n * 2. pre-compile\n * 3. compile\n * 4. post-compile\n * 5. test\n * 6. package\n */\nexport class ProjectBuild extends Component {\n  /**\n   * The task responsible for a full release build.\n   */\n  public readonly buildTask: Task;\n\n  /**\n   * Pre-compile task.\n   */\n  public readonly preCompileTask: Task;\n\n  /**\n   * Compiles the code. By default for node.js projects this task is empty.\n   */\n  public readonly compileTask: Task;\n\n  /**\n   * Post-compile task.\n   */\n  public readonly postCompileTask: Task;\n\n  /**\n   * Tests the code.\n   */\n  public readonly testTask: Task;\n\n  /**\n   * The \"package\" task.\n   */\n  public readonly packageTask: Task;\n\n  constructor(project: Project) {\n    super(project);\n\n    this.preCompileTask = project.tasks.addTask(\"pre-compile\", {\n      description: \"Prepare the project for compilation\",\n    });\n\n    this.compileTask = project.tasks.addTask(\"compile\", {\n      description: \"Only compile\",\n    });\n\n    this.postCompileTask = project.tasks.addTask(\"post-compile\", {\n      description: \"Runs after successful compilation\",\n    });\n\n    this.testTask = project.tasks.addTask(\"test\", {\n      description: \"Run tests\",\n    });\n\n    this.packageTask = project.tasks.addTask(\"package\", {\n      description: \"Creates the distribution package\",\n    });\n\n    this.buildTask = project.tasks.addTask(\"build\", {\n      description: \"Full release build\",\n    });\n\n    // if this is not subproject, execute the \"default\" task which will\n    // synthesize project files.\n    if (!this.project.parent && this.project.defaultTask) {\n      this.buildTask.spawn(this.project.defaultTask);\n    }\n\n    this.buildTask.spawn(this.preCompileTask);\n    this.buildTask.spawn(this.compileTask);\n    this.buildTask.spawn(this.postCompileTask);\n    this.buildTask.spawn(this.testTask);\n    this.buildTask.spawn(this.packageTask);\n\n    // do not allow additional build phases\n    this.buildTask.lock();\n  }\n}\n"
  },
  {
    "path": "src/project.ts",
    "content": "import { mkdtempSync, realpathSync, renameSync } from \"fs\";\nimport { tmpdir } from \"os\";\nimport * as path from \"path\";\nimport * as glob from \"glob\";\nimport { cleanup, FILE_MANIFEST } from \"./cleanup\";\nimport { IS_TEST_RUN, PROJEN_VERSION } from \"./common\";\nimport { Component } from \"./component\";\nimport { Dependencies } from \"./dependencies\";\nimport { FileBase } from \"./file\";\nimport { GitAttributesFile } from \"./gitattributes\";\nimport { IgnoreFile } from \"./ignore-file\";\nimport * as inventory from \"./inventory\";\nimport { resolveInitProject } from \"./javascript/render-options\";\nimport { JsonFile } from \"./json\";\nimport { Logger, LoggerOptions } from \"./logger\";\nimport { ObjectFile } from \"./object-file\";\nimport { InitProjectOptionHints } from \"./option-hints\";\nimport { ProjectBuild as ProjectBuild } from \"./project-build\";\nimport { Projenrc, ProjenrcOptions } from \"./projenrc-json\";\nimport { Renovatebot, RenovatebotOptions } from \"./renovatebot\";\nimport { Task, TaskOptions } from \"./task\";\nimport { Tasks } from \"./tasks\";\nimport { isTruthy } from \"./util\";\n\n/**\n * Options for `Project`.\n */\nexport interface ProjectOptions {\n  /**\n   * This is the name of your project.\n   *\n   * @default $BASEDIR\n   * @featured\n   */\n  readonly name: string;\n\n  /**\n   * The parent project, if this project is part of a bigger project.\n   */\n  readonly parent?: Project;\n\n  /**\n   * The root directory of the project.\n   *\n   * Relative to this directory, all files are synthesized.\n   *\n   * If this project has a parent, this directory is relative to the parent\n   * directory and it cannot be the same as the parent or any of it's other\n   * sub-projects.\n   *\n   * @default \".\"\n   */\n  readonly outdir?: string;\n\n  /**\n   * Configure logging options such as verbosity.\n   * @default {}\n   */\n  readonly logging?: LoggerOptions;\n\n  /**\n   * Generate (once) .projenrc.json (in JSON). Set to `false` in order to disable\n   * .projenrc.json generation.\n   *\n   * @default false\n   */\n  readonly projenrcJson?: boolean;\n\n  /**\n   * Options for .projenrc.json\n   * @default - default options\n   */\n  readonly projenrcJsonOptions?: ProjenrcOptions;\n\n  /**\n   * The shell command to use in order to run the projen CLI.\n   *\n   * Can be used to customize in special environments.\n   *\n   * @default \"npx projen\"\n   */\n  readonly projenCommand?: string;\n\n  /**\n   * Use renovatebot to handle dependency upgrades.\n   *\n   * @default false\n   */\n  readonly renovatebot?: boolean;\n\n  /**\n   * Options for renovatebot.\n   *\n   * @default - default options\n   */\n  readonly renovatebotOptions?: RenovatebotOptions;\n\n  /**\n   * Whether to commit the managed files by default.\n   *\n   * @default true\n   */\n  readonly commitGenerated?: boolean;\n}\n\n/**\n * Base project\n */\nexport class Project {\n  /**\n   * The name of the default task (the task executed when `projen` is run without arguments). Normally\n   * this task should synthesize the project files.\n   */\n  public static readonly DEFAULT_TASK = \"default\";\n\n  /**\n   * Project name.\n   */\n  public readonly name: string;\n\n  /**\n   * .gitignore\n   */\n  public readonly gitignore: IgnoreFile;\n\n  /**\n   * The .gitattributes file for this repository.\n   */\n  public readonly gitattributes: GitAttributesFile;\n\n  /**\n   * A parent project. If undefined, this is the root project.\n   */\n  public readonly parent?: Project;\n\n  /**\n   * Absolute output directory of this project.\n   */\n  public readonly outdir: string;\n\n  /**\n   * The root project.\n   **/\n  public readonly root: Project;\n\n  /**\n   * Project tasks.\n   */\n  public readonly tasks: Tasks;\n\n  /**\n   * Project dependencies.\n   */\n  public readonly deps: Dependencies;\n\n  /**\n   * Logging utilities.\n   */\n  public readonly logger: Logger;\n\n  /**\n   * The options used when this project is bootstrapped via `projen new`. It\n   * includes the original set of options passed to the CLI and also the JSII\n   * FQN of the project type.\n   */\n  public readonly initProject?: InitProject;\n\n  /**\n   * The command to use in order to run the projen CLI.\n   */\n  public readonly projenCommand: string;\n\n  /**\n   * This is the \"default\" task, the one that executes \"projen\". Undefined if\n   * the project is being ejected.\n   */\n  public readonly defaultTask?: Task;\n\n  /**\n   * This task ejects the project from projen. This is undefined if the project\n   * it self is being ejected.\n   *\n   * See docs for more information.\n   */\n  private readonly ejectTask?: Task;\n\n  /**\n   * Manages the build process of the project.\n   */\n  public readonly projectBuild: ProjectBuild;\n\n  /**\n   * Whether to commit the managed files by default.\n   */\n  public readonly commitGenerated: boolean;\n\n  private readonly _components = new Array<Component>();\n  private readonly subprojects = new Array<Project>();\n  private readonly tips = new Array<string>();\n  private readonly excludeFromCleanup: string[];\n  private readonly _ejected: boolean;\n\n  constructor(options: ProjectOptions) {\n    this.initProject = resolveInitProject(options);\n\n    this.name = options.name;\n    this.parent = options.parent;\n    this.excludeFromCleanup = [];\n\n    this._ejected = isTruthy(process.env.PROJEN_EJECTING);\n\n    if (this.ejected) {\n      this.projenCommand = \"scripts/run-task\";\n    } else {\n      this.projenCommand = options.projenCommand ?? \"npx projen\";\n    }\n\n    this.outdir = this.determineOutdir(options.outdir);\n    this.root = this.parent ? this.parent.root : this;\n\n    // must happen after this.outdir, this.parent and this.root are initialized\n    this.parent?._addSubProject(this);\n\n    // ------------------------------------------------------------------------\n\n    this.gitattributes = new GitAttributesFile(this);\n    this.annotateGenerated(\"/.projen/**\"); // contents  of the .projen/ directory are generated by projen\n    this.annotateGenerated(`/${this.gitattributes.path}`); // the .gitattributes file itself is generated\n\n    this.gitignore = new IgnoreFile(this, \".gitignore\");\n    this.gitignore.exclude(\"node_modules/\"); // created by running `npx projen`\n    this.gitignore.include(`/${this.gitattributes.path}`);\n\n    // oh no: tasks depends on gitignore so it has to be initialized after\n    // smells like dep injectionn but god forbid.\n    this.tasks = new Tasks(this);\n\n    if (!this.ejected) {\n      this.defaultTask = this.tasks.addTask(Project.DEFAULT_TASK, {\n        description: \"Synthesize project files\",\n      });\n\n      this.ejectTask = this.tasks.addTask(\"eject\", {\n        description: \"Remove projen from the project\",\n        env: {\n          PROJEN_EJECTING: \"true\",\n        },\n      });\n      this.ejectTask.spawn(this.defaultTask);\n    }\n\n    this.projectBuild = new ProjectBuild(this);\n\n    this.deps = new Dependencies(this);\n\n    this.logger = new Logger(this, options.logging);\n\n    const projenrcJson = options.projenrcJson ?? false;\n    if (projenrcJson) {\n      new Projenrc(this, options.projenrcJsonOptions);\n    }\n\n    if (options.renovatebot) {\n      new Renovatebot(this, options.renovatebotOptions);\n    }\n\n    this.commitGenerated = options.commitGenerated ?? true;\n\n    if (!this.ejected) {\n      new JsonFile(this, FILE_MANIFEST, {\n        omitEmpty: true,\n        obj: () => ({\n          // replace `\\` with `/` to ensure paths match across platforms\n          files: this.files\n            .filter((f) => f.readonly)\n            .map((f) => f.path.replace(/\\\\/g, \"/\")),\n        }),\n        // This file is used by projen to track the generated files, so must be committed.\n        committed: true,\n      });\n    }\n  }\n\n  /**\n   * Returns all the components within this project.\n   */\n  public get components() {\n    return [...this._components];\n  }\n\n  /**\n   * All files in this project.\n   */\n  public get files(): FileBase[] {\n    const isFile = (c: Component): c is FileBase => c instanceof FileBase;\n    return this._components\n      .filter(isFile)\n      .sort((f1, f2) => f1.path.localeCompare(f2.path));\n  }\n\n  /**\n   * Adds a new task to this project. This will fail if the project already has\n   * a task with this name.\n   *\n   * @param name The task name to add\n   * @param props Task properties\n   */\n  public addTask(name: string, props: TaskOptions = {}) {\n    return this.tasks.addTask(name, props);\n  }\n\n  /**\n   * Removes a task from a project.\n   *\n   * @param name The name of the task to remove.\n   *\n   * @returns The `Task` that was removed, otherwise `undefined`.\n   */\n  public removeTask(name: string) {\n    return this.tasks.removeTask(name);\n  }\n\n  public get buildTask() {\n    return this.projectBuild.buildTask;\n  }\n  public get compileTask() {\n    return this.projectBuild.compileTask;\n  }\n  public get testTask() {\n    return this.projectBuild.testTask;\n  }\n  public get preCompileTask() {\n    return this.projectBuild.preCompileTask;\n  }\n  public get postCompileTask() {\n    return this.projectBuild.postCompileTask;\n  }\n  public get packageTask() {\n    return this.projectBuild.packageTask;\n  }\n\n  /**\n   * Finds a file at the specified relative path within this project and all\n   * its subprojects.\n   *\n   * @param filePath The file path. If this path is relative, it will be resolved\n   * from the root of _this_ project.\n   * @returns a `FileBase` or undefined if there is no file in that path\n   */\n  public tryFindFile(filePath: string): FileBase | undefined {\n    const absolute = path.isAbsolute(filePath)\n      ? filePath\n      : path.resolve(this.outdir, filePath);\n    for (const file of this.files) {\n      if (absolute === file.absolutePath) {\n        return file;\n      }\n    }\n\n    for (const child of this.subprojects) {\n      const file = child.tryFindFile(absolute);\n      if (file) {\n        return file;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Finds a json file by name.\n   * @param filePath The file path.\n   * @deprecated use `tryFindObjectFile`\n   */\n  public tryFindJsonFile(filePath: string): JsonFile | undefined {\n    const file = this.tryFindObjectFile(filePath);\n    if (!file) {\n      return undefined;\n    }\n\n    if (!(file instanceof JsonFile)) {\n      throw new Error(\n        `found file ${filePath} but it is not a JsonFile. got: ${file.constructor.name}`\n      );\n    }\n\n    return file;\n  }\n\n  /**\n   * Finds an object file (like JsonFile, YamlFile, etc.) by name.\n   * @param filePath The file path.\n   */\n  public tryFindObjectFile(filePath: string): ObjectFile | undefined {\n    const file = this.tryFindFile(filePath);\n    if (!file) {\n      return undefined;\n    }\n\n    if (!(file instanceof ObjectFile)) {\n      throw new Error(\n        `found file ${filePath} but it is not a ObjectFile. got: ${file.constructor.name}`\n      );\n    }\n\n    return file;\n  }\n\n  /**\n   * Finds a file at the specified relative path within this project and removes\n   * it.\n   *\n   * @param filePath The file path. If this path is relative, it will be\n   * resolved from the root of _this_ project.\n   * @returns a `FileBase` if the file was found and removed, or undefined if\n   * the file was not found.\n   */\n  public tryRemoveFile(filePath: string): FileBase | undefined {\n    const absolute = path.isAbsolute(filePath)\n      ? filePath\n      : path.resolve(this.outdir, filePath);\n    const isFile = (c: Component): c is FileBase => c instanceof FileBase;\n    const index = this._components.findIndex(\n      (c) => isFile(c) && c.absolutePath === absolute\n    );\n\n    if (index !== -1) {\n      return this._components.splice(index, 1)[0] as FileBase;\n    }\n\n    for (const child of this.subprojects) {\n      const file = child.tryRemoveFile(absolute);\n      if (file) {\n        return file;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Prints a \"tip\" message during synthesis.\n   * @param message The message\n   * @deprecated - use `project.logger.info(message)` to show messages during synthesis\n   */\n  public addTip(message: string) {\n    this.tips.push(message);\n  }\n\n  /**\n   * Exclude the matching files from pre-synth cleanup. Can be used when, for example, some\n   * source files include the projen marker and we don't want them to be erased during synth.\n   *\n   * @param globs The glob patterns to match\n   */\n  public addExcludeFromCleanup(...globs: string[]) {\n    this.excludeFromCleanup.push(...globs);\n  }\n\n  /**\n   * Returns the shell command to execute in order to run a task.\n   *\n   * By default, this is `npx projen@<version> <task>`\n   *\n   * @param task The task for which the command is required\n   */\n  public runTaskCommand(task: Task) {\n    return `npx projen@${PROJEN_VERSION} ${task.name}`;\n  }\n\n  /**\n   * Exclude these files from the bundled package. Implemented by project types based on the\n   * packaging mechanism. For example, `NodeProject` delegates this to `.npmignore`.\n   *\n   * @param _pattern The glob pattern to exclude\n   */\n  public addPackageIgnore(_pattern: string) {\n    // nothing to do at the abstract level\n  }\n\n  /**\n   * Adds a .gitignore pattern.\n   * @param pattern The glob pattern to ignore.\n   */\n  public addGitIgnore(pattern: string) {\n    this.gitignore.addPatterns(pattern);\n  }\n\n  /**\n   * Consider a set of files as \"generated\". This method is implemented by\n   * derived classes and used for example, to add git attributes to tell GitHub\n   * that certain files are generated.\n   *\n   * @param _glob the glob pattern to match (could be a file path).\n   */\n  public annotateGenerated(_glob: string): void {\n    // nothing to do at the abstract level\n  }\n\n  /**\n   * Synthesize all project files into `outdir`.\n   *\n   * 1. Call \"this.preSynthesize()\"\n   * 2. Delete all generated files\n   * 3. Synthesize all sub-projects\n   * 4. Synthesize all components of this project\n   * 5. Call \"postSynthesize()\" for all components of this project\n   * 6. Call \"this.postSynthesize()\"\n   */\n  public synth(): void {\n    const outdir = this.outdir;\n    this.logger.debug(\"Synthesizing project...\");\n\n    this.preSynthesize();\n\n    for (const comp of this._components) {\n      comp.preSynthesize();\n    }\n\n    // we exclude all subproject directories to ensure that when subproject.synth()\n    // gets called below after cleanup(), subproject generated files are left intact\n    for (const subproject of this.subprojects) {\n      this.addExcludeFromCleanup(subproject.outdir + \"/**\");\n    }\n\n    // delete orphaned files before we start synthesizing new ones\n    cleanup(\n      outdir,\n      this.files.map((f) => f.path.replace(/\\\\/g, \"/\")),\n      this.excludeFromCleanup\n    );\n\n    for (const subproject of this.subprojects) {\n      subproject.synth();\n    }\n\n    for (const comp of this._components) {\n      comp.synthesize();\n    }\n\n    if (!isTruthy(process.env.PROJEN_DISABLE_POST)) {\n      for (const comp of this._components) {\n        comp.postSynthesize();\n      }\n\n      // project-level hook\n      this.postSynthesize();\n    }\n\n    if (this.ejected) {\n      this.logger.debug(\"Ejecting project...\");\n\n      // Backup projenrc files\n      const files = glob.sync(\".projenrc.*\", {\n        cwd: this.outdir,\n        dot: true,\n        nodir: true,\n        absolute: true,\n      });\n\n      for (const file of files) {\n        renameSync(file, `${file}.bak`);\n      }\n    }\n\n    this.logger.debug(\"Synthesis complete\");\n  }\n\n  /**\n   * Whether or not the project is being ejected.\n   */\n  public get ejected(): boolean {\n    return this._ejected;\n  }\n\n  /**\n   * Called before all components are synthesized.\n   */\n  public preSynthesize() {}\n\n  /**\n   * Called after all components are synthesized. Order is *not* guaranteed.\n   */\n  public postSynthesize() {}\n\n  /**\n   * Adds a component to the project.\n   * @internal\n   */\n  public _addComponent(component: Component) {\n    this._components.push(component);\n  }\n\n  /**\n   * Adds a sub-project to this project.\n   *\n   * This is automatically called when a new project is created with `parent`\n   * pointing to this project, so there is no real need to call this manually.\n   *\n   * @param sub-project The child project to add.\n   * @internal\n   */\n  _addSubProject(subproject: Project) {\n    if (subproject.parent !== this) {\n      throw new Error('\"parent\" of child project must be this project');\n    }\n\n    // check that `outdir` is exclusive\n    for (const p of this.subprojects) {\n      if (path.resolve(p.outdir) === path.resolve(subproject.outdir)) {\n        throw new Error(\n          `there is already a sub-project with \"outdir\": ${subproject.outdir}`\n        );\n      }\n    }\n\n    this.subprojects.push(subproject);\n  }\n\n  /**\n   * Resolves the project's output directory.\n   */\n  private determineOutdir(outdirOption?: string) {\n    if (this.parent && outdirOption && path.isAbsolute(outdirOption)) {\n      throw new Error('\"outdir\" must be a relative path');\n    }\n\n    // if this is a subproject, it is relative to the parent\n    if (this.parent) {\n      if (!outdirOption) {\n        throw new Error('\"outdir\" must be specified for subprojects');\n      }\n\n      return path.resolve(this.parent.outdir, outdirOption);\n    }\n\n    // if this is running inside a test and outdir is not explicitly set\n    // use a temp directory (unless cwd is aleady under tmp)\n    if (IS_TEST_RUN && !outdirOption) {\n      const realCwd = realpathSync(process.cwd());\n      const realTmp = realpathSync(tmpdir());\n\n      if (realCwd.startsWith(realTmp)) {\n        return path.resolve(realCwd, outdirOption ?? \".\");\n      }\n\n      return mkdtempSync(path.join(tmpdir(), \"projen.\"));\n    }\n\n    return path.resolve(outdirOption ?? \".\");\n  }\n}\n\n/**\n * Which type of project this is.\n *\n * @deprecated no longer supported at the base project level\n */\nexport enum ProjectType {\n  /**\n   * This module may be a either a library or an app.\n   */\n  UNKNOWN = \"unknown\",\n\n  /**\n   * This is a library, intended to be published to a package manager and\n   * consumed by other projects.\n   */\n  LIB = \"lib\",\n\n  /**\n   * This is an app (service, tool, website, etc). Its artifacts are intended to\n   * be deployed or published for end-user consumption.\n   */\n  APP = \"app\",\n}\n\n/**\n * Information passed from `projen new` to the project object when the project\n * is first created. It is used to generate projenrc files in various languages.\n */\nexport interface InitProject {\n  /**\n   * The JSII FQN of the project type.\n   */\n  readonly fqn: string;\n\n  /**\n   * Initial arguments passed to `projen new`.\n   */\n  readonly args: Record<string, any>;\n\n  /**\n   * Project metadata.\n   */\n  readonly type: inventory.ProjectType;\n\n  /**\n   * Include commented out options. Does not apply to projenrc.json files.\n   * @default InitProjectOptionHints.FEATURED\n   */\n  readonly comments: InitProjectOptionHints;\n}\n"
  },
  {
    "path": "src/projects.ts",
    "content": "import * as path from \"path\";\nimport * as vm from \"vm\";\nimport { resolveProjectType } from \"./inventory\";\nimport { renderJavaScriptOptions } from \"./javascript/render-options\";\nimport { InitProjectOptionHints } from \"./option-hints\";\n\nexport interface CreateProjectOptions {\n  /**\n   * Directory that the project will be generated in.\n   */\n  readonly dir: string;\n\n  /**\n   * Fully-qualified name of the project type (usually formatted\n   * as `module.ProjectType`).\n   * @example `projen.TypescriptProject`\n   */\n  readonly projectFqn: string;\n\n  /**\n   * Project options. Only JSON-like values can be passed in (strings,\n   * booleans, numbers, enums, arrays, and objects that are not\n   * derived from classes).\n   *\n   * Consult the API reference of the project type you are generating for\n   * information about what fields and types are available.\n   */\n  readonly projectOptions: Record<string, any>;\n\n  /**\n   * Should we render commented-out default options in the projenrc file?\n   * Does not apply to projenrc.json files.\n   *\n   * @default InitProjectOptionHints.FEATURED\n   */\n  readonly optionHints?: InitProjectOptionHints;\n\n  /**\n   * Should we call `project.synth()` or instantiate the project (could still\n   * have side-effects) and render the .projenrc file.\n   *\n   * @default true\n   */\n  readonly synth?: boolean;\n\n  /**\n   * Should we execute post synthesis hooks? (usually package manager install).\n   *\n   * @default true\n   */\n  readonly post?: boolean;\n}\n\n/**\n * Programmatic API for projen.\n */\nexport class Projects {\n  /**\n   * Creates a new project with defaults.\n   *\n   * This function creates the project type in-process (with in VM) and calls\n   * `.synth()` on it (if `options.synth` is not `false`).\n   *\n   * At the moment, it also generates a `.projenrc.js` file with the same code\n   * that was just executed. In the future, this will also be done by the project\n   * type, so we can easily support multiple languages of projenrc.\n   */\n  public static createProject(options: CreateProjectOptions) {\n    createProject(options);\n  }\n\n  private constructor() {}\n}\n\nfunction createProject(opts: CreateProjectOptions) {\n  const projectType = resolveProjectType(opts.projectFqn);\n\n  // Default project resolution location\n  let mod = \"./index\";\n\n  // External projects need to load the module from the modules directory\n  if (projectType.moduleName !== \"projen\") {\n    try {\n      mod = path.dirname(\n        require.resolve(path.join(projectType.moduleName, \"package.json\"), {\n          paths: [process.cwd()],\n        })\n      );\n    } catch (err) {\n      throw new Error(\n        `External project module '${projectType.moduleName}' could not be resolved.`\n      );\n    }\n  }\n\n  // \"dir\" is exposed as a top-level option to require users to specify a value for it\n  opts.projectOptions.outdir = opts.dir;\n\n  // pass the FQN of the project type to the project initializer so it can\n  // generate the projenrc file.\n  const { renderedOptions } = renderJavaScriptOptions({\n    bootstrap: true,\n    comments: opts.optionHints ?? InitProjectOptionHints.FEATURED,\n    type: projectType,\n    args: opts.projectOptions,\n    omitFromBootstrap: [\"outdir\"],\n  });\n\n  // generate a random variable name because jest tests appear to share\n  // VM contexts, causing\n  //\n  // > SyntaxError: Identifier 'project' has already been declared\n  //\n  // errors if this isn't unique\n  const varName = \"project\" + Math.random().toString(36).slice(2);\n  const initProjectCode = `const ${varName} = new ${projectType.typename}(${renderedOptions});`;\n\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const module = require(mod);\n  const ctx = vm.createContext(module);\n\n  const synth = opts.synth ?? true;\n  const postSynth = opts.post ?? true;\n  process.env.PROJEN_DISABLE_POST = (!postSynth).toString();\n  vm.runInContext(\n    [initProjectCode, synth ? `${varName}.synth();` : \"\"].join(\"\\n\"),\n    ctx\n  );\n}\n"
  },
  {
    "path": "src/projenrc-json.ts",
    "content": "import { existsSync, writeFileSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { Component } from \"./component\";\nimport { Project } from \"./project\";\n\nexport interface ProjenrcOptions {\n  /**\n   * The name of the projenrc file.\n   * @default \".projenrc.json\"\n   */\n  readonly filename?: string;\n}\n\n/**\n * Sets up a project to use JSON for projenrc.\n */\nexport class Projenrc extends Component {\n  private readonly rcfile: string;\n\n  constructor(project: Project, options: ProjenrcOptions = {}) {\n    super(project);\n\n    this.rcfile = options.filename ?? \".projenrc.json\";\n\n    // this is the task projen executes when running `projen`\n    project.defaultTask?.env(\"FILENAME\", this.rcfile);\n    project.defaultTask?.builtin(\"run-projenrc-json\");\n\n    this.generateProjenrc();\n  }\n\n  private generateProjenrc() {\n    const rcfile = resolve(this.project.outdir, this.rcfile);\n    if (existsSync(rcfile)) {\n      return; // already exists\n    }\n\n    const bootstrap = this.project.initProject;\n    if (!bootstrap) {\n      return;\n    }\n\n    const json = {\n      type: bootstrap.fqn,\n      ...bootstrap.args,\n    };\n\n    writeFileSync(rcfile, JSON.stringify(json, null, 2));\n    this.project.logger.info(\n      `Project definition file was created at ${rcfile}`\n    );\n  }\n}\n"
  },
  {
    "path": "src/python/index.ts",
    "content": "export * from \"./pip\";\nexport * from \"./poetry\";\nexport * from \"./projenrc\";\nexport * from \"./pytest\";\nexport * from \"./pytest-sample\";\nexport * from \"./python-env\";\nexport * from \"./python-deps\";\nexport * from \"./python-packaging\";\nexport * from \"./python-project\";\nexport * from \"./python-sample\";\nexport * from \"./requirements-file\";\nexport * from \"./setuppy\";\nexport * from \"./setuptools\";\nexport * from \"./venv\";\n"
  },
  {
    "path": "src/python/pip.ts",
    "content": "import { Component } from \"../component\";\nimport { Dependency, DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\nimport { TaskRuntime } from \"../task-runtime\";\nimport { IPackageProvider, IPythonDeps } from \"./python-deps\";\nimport { RequirementsFile } from \"./requirements-file\";\n\n/**\n * Options for pip\n */\nexport interface PipOptions {}\n\n/**\n * Manages dependencies using a requirements.txt file and the pip CLI tool.\n */\nexport class Pip extends Component implements IPythonDeps {\n  public readonly installTask: Task;\n\n  constructor(project: Project, _options: PipOptions = {}) {\n    super(project);\n\n    new RequirementsFile(project, \"requirements.txt\", {\n      packageProvider: new RuntimeDependencyProvider(project),\n    });\n    new RequirementsFile(project, \"requirements-dev.txt\", {\n      packageProvider: new DevDependencyProvider(project),\n    });\n\n    this.installTask = project.addTask(\"install\", {\n      description: \"Install and upgrade dependencies\",\n    });\n    this.installTask.exec(\"pip install --upgrade pip\");\n    this.installTask.exec(\"pip install -r requirements.txt\");\n    this.installTask.exec(\"pip install -r requirements-dev.txt\");\n  }\n\n  /**\n   * Adds a runtime dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  public addDependency(spec: string) {\n    this.project.deps.addDependency(spec, DependencyType.RUNTIME);\n  }\n\n  /**\n   * Adds a dev dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  public addDevDependency(spec: string) {\n    this.project.deps.addDependency(spec, DependencyType.DEVENV);\n  }\n\n  /**\n   * Installs dependencies (called during post-synthesis).\n   */\n  public installDependencies() {\n    this.project.logger.info(\"Installing dependencies...\");\n\n    const runtime = new TaskRuntime(this.project.outdir);\n    runtime.runTask(this.installTask.name);\n  }\n}\n\nclass RuntimeDependencyProvider implements IPackageProvider {\n  constructor(private readonly project: Project) {}\n  public get packages(): Dependency[] {\n    return this.project.deps.all.filter(\n      (dep) => dep.type === DependencyType.RUNTIME\n    );\n  }\n}\n\nclass DevDependencyProvider implements IPackageProvider {\n  constructor(private readonly project: Project) {}\n  public get packages(): Dependency[] {\n    return this.project.deps.all.filter(\n      (dep) => dep.type === DependencyType.DEVENV\n    );\n  }\n}\n"
  },
  {
    "path": "src/python/poetry.ts",
    "content": "import { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\nimport { TaskRuntime } from \"../task-runtime\";\nimport { TomlFile } from \"../toml\";\nimport { decamelizeKeysRecursively, exec, execOrUndefined } from \"../util\";\nimport { IPythonDeps } from \"./python-deps\";\nimport { IPythonEnv } from \"./python-env\";\nimport { IPythonPackaging, PythonPackagingOptions } from \"./python-packaging\";\n\n/**\n * Manage project dependencies, virtual environments, and packaging through the\n * poetry CLI tool.\n */\nexport class Poetry\n  extends Component\n  implements IPythonDeps, IPythonEnv, IPythonPackaging\n{\n  public readonly installTask: Task;\n  public readonly publishTask: Task;\n\n  /**\n   * A task that uploads the package to the Test PyPI repository.\n   */\n  public readonly publishTestTask: Task;\n\n  constructor(project: Project, options: PythonPackagingOptions) {\n    super(project);\n\n    this.installTask = project.addTask(\"install\", {\n      description: \"Install and upgrade dependencies\",\n      exec: \"poetry update\",\n    });\n\n    this.project.tasks.addEnvironment(\"VIRTUAL_ENV\", \"$(poetry env info -p)\");\n    this.project.tasks.addEnvironment(\n      \"PATH\",\n      \"$(echo $(poetry env info -p)/bin:$PATH)\"\n    );\n\n    project.packageTask.exec(\"poetry build\");\n\n    this.publishTestTask = project.addTask(\"publish:test\", {\n      description: \"Uploads the package against a test PyPI endpoint.\",\n      exec: \"poetry publish -r testpypi\",\n    });\n\n    this.publishTask = project.addTask(\"publish\", {\n      description: \"Uploads the package to PyPI.\",\n      exec: \"poetry publish\",\n    });\n\n    new PoetryPyproject(project, {\n      name: project.name,\n      version: options.version,\n      description: options.description ?? \"\",\n      license: options.license,\n      authors: [`${options.authorName} <${options.authorEmail}>`],\n      homepage: options.homepage,\n      classifiers: options.classifiers,\n      ...options.poetryOptions,\n      dependencies: () => this.synthDependencies(),\n      devDependencies: () => this.synthDevDependencies(),\n    });\n\n    new TomlFile(project, \"poetry.toml\", {\n      committed: false,\n      obj: {\n        repositories: {\n          testpypi: {\n            url: \"https://test.pypi.org/legacy/\",\n          },\n        },\n      },\n    });\n  }\n\n  private synthDependencies() {\n    const dependencies: { [key: string]: any } = {};\n    let pythonDefined: boolean = false;\n    for (const pkg of this.project.deps.all) {\n      if (pkg.name === \"python\") {\n        pythonDefined = true;\n      }\n      if (pkg.type === DependencyType.RUNTIME) {\n        dependencies[pkg.name] = pkg.version;\n      }\n    }\n    if (!pythonDefined) {\n      // Python version must be defined for poetry projects. Default to ^3.6.\n      dependencies.python = \"^3.6\";\n    }\n    return dependencies;\n  }\n\n  private synthDevDependencies() {\n    const dependencies: { [key: string]: any } = {};\n    for (const pkg of this.project.deps.all) {\n      if ([DependencyType.DEVENV].includes(pkg.type)) {\n        dependencies[pkg.name] = pkg.version;\n      }\n    }\n    return dependencies;\n  }\n\n  /**\n   * Adds a runtime dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  public addDependency(spec: string) {\n    this.project.deps.addDependency(spec, DependencyType.RUNTIME);\n  }\n\n  /**\n   * Adds a dev dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  public addDevDependency(spec: string) {\n    this.project.deps.addDependency(spec, DependencyType.DEVENV);\n  }\n\n  /**\n   * Initializes the virtual environment if it doesn't exist (called during post-synthesis).\n   */\n  public setupEnvironment() {\n    const result = execOrUndefined(\"which poetry\", {\n      cwd: this.project.outdir,\n    });\n    if (!result) {\n      this.project.logger.info(\n        \"Unable to setup an environment since poetry is not installed. Please install poetry (https://python-poetry.org/docs/) or use a different component for managing environments such as 'venv'.\"\n      );\n    }\n\n    let envPath = execOrUndefined(\"poetry env info -p\", {\n      cwd: this.project.outdir,\n    });\n    if (!envPath) {\n      this.project.logger.info(\"Setting up a virtual environment...\");\n      exec(\"poetry env use python\", { cwd: this.project.outdir });\n      envPath = execOrUndefined(\"poetry env info -p\", {\n        cwd: this.project.outdir,\n      });\n      this.project.logger.info(\n        `Environment successfully created (located in ${envPath}}).`\n      );\n    }\n  }\n\n  /**\n   * Installs dependencies (called during post-synthesis).\n   */\n  public installDependencies() {\n    this.project.logger.info(\"Installing dependencies...\");\n    const runtime = new TaskRuntime(this.project.outdir);\n    runtime.runTask(this.installTask.name);\n  }\n}\n\n/**\n * Poetry-specific options.\n * @see https://python-poetry.org/docs/pyproject/\n */\nexport interface PoetryPyprojectOptionsWithoutDeps {\n  /**\n   * Name of the package (required).\n   */\n  readonly name?: string;\n\n  /**\n   * Version of the package (required).\n   */\n  readonly version?: string;\n\n  /**\n   * A short description of the package (required).\n   */\n  readonly description?: string;\n\n  /**\n   * License of this package as an SPDX identifier.\n   *\n   * If the project is proprietary and does not use a specific license, you\n   * can set this value as \"Proprietary\".\n   */\n  readonly license?: string;\n\n  /**\n   * The authors of the package. Must be in the form \"name <email>\"\n   */\n  readonly authors?: string[];\n\n  /**\n   * the maintainers of the package. Must be in the form \"name <email>\"\n   */\n  readonly maintainers?: string[];\n\n  /**\n   * The name of the readme file of the package.\n   */\n  readonly readme?: string;\n\n  /**\n   * A URL to the website of the project.\n   */\n  readonly homepage?: string;\n\n  /**\n   * A URL to the repository of the project.\n   */\n  readonly repository?: string;\n\n  /**\n   * A URL to the documentation of the project.\n   */\n  readonly documentation?: string;\n\n  /**\n   * A list of keywords (max: 5) that the package is related to.\n   */\n  readonly keywords?: string[];\n\n  /**\n   * A list of PyPI trove classifiers that describe the project.\n   *\n   * @see https://pypi.org/classifiers/\n   */\n  readonly classifiers?: string[];\n\n  /**\n   * A list of packages and modules to include in the final distribution.\n   */\n  readonly packages?: any[];\n\n  /**\n   * A list of patterns that will be included in the final package.\n   */\n  readonly include?: string[];\n\n  /**\n   * A list of patterns that will be excluded in the final package.\n   *\n   * If a VCS is being used for a package, the exclude field will be seeded with\n   * the VCS’ ignore settings (.gitignore for git for example).\n   */\n  readonly exclude?: string[];\n\n  /**\n   * The scripts or executables that will be installed when installing the package.\n   */\n  readonly scripts?: { [key: string]: any };\n\n  /**\n   * Source registries from which packages are retrieved.\n   */\n  readonly source?: any[];\n\n  /**\n   * Package extras\n   */\n  readonly extras?: { [key: string]: string[] };\n\n  /**\n   * Plugins. Must be specified as a table.\n   * @see https://toml.io/en/v1.0.0#table\n   */\n  readonly plugins?: any;\n\n  /**\n   * Project custom URLs, in addition to homepage, repository and documentation.\n   * E.g. \"Bug Tracker\"\n   */\n  readonly urls?: { [key: string]: string };\n}\n\n/**\n * Poetry-specific options.\n * @see https://python-poetry.org/docs/pyproject/\n */\nexport interface PoetryPyprojectOptions\n  extends PoetryPyprojectOptionsWithoutDeps {\n  /**\n   * A list of dependencies for the project.\n   *\n   * The python version for which your package is compatible is also required.\n   *\n   * @example { requests: \"^2.13.0\" }\n   */\n  readonly dependencies?: { [key: string]: any };\n\n  /**\n   * A list of development dependencies for the project.\n   *\n   * @example { requests: \"^2.13.0\" }\n   */\n  readonly devDependencies?: { [key: string]: any };\n}\n\n/**\n * Represents configuration of a pyproject.toml file for a Poetry project.\n *\n * @see https://python-poetry.org/docs/pyproject/\n */\nexport class PoetryPyproject extends Component {\n  public readonly file: TomlFile;\n\n  constructor(project: Project, options: PoetryPyprojectOptions) {\n    super(project);\n\n    const decamelisedOptions = decamelizeKeysRecursively(options, {\n      separator: \"-\",\n    });\n\n    this.file = new TomlFile(project, \"pyproject.toml\", {\n      omitEmpty: false,\n      obj: {\n        \"build-system\": {\n          requires: [\"poetry_core>=1.0.0\"],\n          \"build-backend\": \"poetry.core.masonry.api\",\n        },\n        tool: {\n          poetry: {\n            ...decamelisedOptions,\n          },\n        },\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/python/projenrc.ts",
    "content": "import { dirname, join } from \"path\";\nimport { snake } from \"case\";\nimport { existsSync, mkdirpSync, writeFileSync } from \"fs-extra\";\nimport { PROJEN_VERSION } from \"../common\";\nimport { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { readJsiiManifest } from \"../inventory\";\nimport { Project } from \"../project\";\n\n/**\n * Options for `Projenrc`.\n */\nexport interface ProjenrcOptions {\n  /**\n   * The name of the projenrc file.\n   * @default \".projenrc.py\"\n   */\n  readonly filename?: string;\n\n  /**\n   * The projen version to use\n   * @default - current version\n   */\n  readonly projenVersion?: string;\n}\n\n/**\n * Allows writing projenrc files in python.\n *\n * This will install `projen` as a Python dependency and will add a\n * `synth` task which will run `.projenrc.py`.\n */\nexport class Projenrc extends Component {\n  /**\n   * The name of the projenrc file.\n   */\n  private readonly rcfile: string;\n\n  constructor(project: Project, options: ProjenrcOptions = {}) {\n    super(project);\n\n    const projenVersion = options.projenVersion ?? PROJEN_VERSION;\n    this.rcfile = options.filename ?? \".projenrc.py\";\n\n    project.deps.addDependency(\n      `projen@${projenVersion}`,\n      DependencyType.DEVENV\n    );\n\n    // set up the \"default\" task which is the task executed when `projen` is executed for this project.\n    project.defaultTask?.exec(\"python .projenrc.py\");\n\n    // if this is a new project, generate a skeleton for projenrc.py\n    this.generateProjenrc();\n  }\n\n  private generateProjenrc() {\n    const bootstrap = this.project.initProject;\n    if (!bootstrap) {\n      return;\n    }\n    const jsiiFqn = bootstrap.fqn;\n    const jsiiManifest = readJsiiManifest(jsiiFqn);\n    const jsiiType = jsiiManifest.types[jsiiFqn];\n    const optionsTypeFqn = jsiiType.initializer?.parameters?.[0].type?.fqn;\n    if (!optionsTypeFqn) {\n      this.project.logger.warn(\n        \"cannot determine jsii type for project options\"\n      );\n      return;\n    }\n\n    const pythonFile = join(this.project.outdir, this.rcfile);\n\n    // skip if file exists\n    if (existsSync(pythonFile)) {\n      return;\n    }\n\n    const lines = new Array<string>();\n\n    let indent = 0;\n    const emit = (line: string = \"\") =>\n      lines.push(\" \".repeat(indent * 4) + line);\n    // const openBlock = (line: string = '') => { emit(line + ' {'); indent++; };\n    // const closeBlock = () => { indent--; emit('}'); };\n\n    const optionFqns: Record<string, string> = {};\n    for (const option of bootstrap.type.options) {\n      if (option.fqn) {\n        optionFqns[option.name] = option.fqn;\n      }\n    }\n\n    const { renderedOptions, imports } = renderPythonOptions(\n      indent,\n      optionFqns,\n      bootstrap.args\n    );\n\n    const importName = resolvePythonImportName(jsiiFqn, jsiiManifest);\n    emit(toPythonImport(importName));\n\n    for (const fqn of imports) {\n      emit(toPythonImport(fqn));\n    }\n    emit();\n    emit(`project = ${jsiiType.name}(${renderedOptions})`);\n    emit();\n    emit(\"project.synth()\");\n\n    mkdirpSync(dirname(pythonFile));\n    writeFileSync(pythonFile, lines.join(\"\\n\"));\n\n    this.project.logger.info(\n      `Project definition file was created at ${pythonFile}`\n    );\n  }\n}\n\nexport function resolvePythonImportName(jsiiFqn: string, jsiiManifest: any) {\n  const moduleName = jsiiManifest?.targets?.python?.module;\n\n  // Module name prefix should take precedence in the event moduleName !== fqn prefix\n  return moduleName\n    ? [moduleName, ...jsiiFqn.split(\".\").slice(1)].join(\".\")\n    : jsiiFqn;\n}\n\nfunction renderPythonOptions(\n  indent: number,\n  optionFqns: Record<string, string>,\n  initOptions?: Record<string, any>\n) {\n  const imports = new Set<string>();\n  if (!initOptions || Object.keys(initOptions).length === 0) {\n    // no options\n    return { renderedOptions: \"\", imports };\n  }\n\n  const lines = [\"\"];\n\n  for (const [name, value] of Object.entries(initOptions)) {\n    const { pythonValue, importName } = toPythonValue(value, name, optionFqns);\n    if (importName) imports.add(importName);\n    lines.push(`${toPythonProperty(name)}=${pythonValue},`);\n  }\n\n  const renderedOptions = lines\n    .join(`\\n${\" \".repeat((indent + 1) * 4)}`)\n    .concat(\"\\n\");\n  return { renderedOptions, imports };\n}\n\nfunction toPythonProperty(prop: string) {\n  return snake(prop);\n}\n\nfunction toPythonValue(\n  value: any,\n  name: string,\n  optionFqns: Record<string, string>\n) {\n  if (typeof value === \"boolean\") {\n    return { pythonValue: value ? \"True\" : \"False\" };\n  } else if (typeof value === \"number\") {\n    return { pythonValue: JSON.stringify(value) };\n  } else if (typeof value === \"string\") {\n    if (optionFqns[name] !== undefined) {\n      const parts = optionFqns[name].split(\".\");\n      const base = parts[parts.length - 1];\n      const choice = String(value).toUpperCase().replace(/-/g, \"_\");\n      return { pythonValue: `${base}.${choice}`, importName: optionFqns[name] };\n    } else {\n      return { pythonValue: JSON.stringify(value) };\n    }\n  } else if (value === undefined || value === null) {\n    return { pythonValue: \"None\" };\n  } else {\n    return { pythonValue: JSON.stringify(value) };\n  }\n}\n\nfunction toPythonImport(fqn: string) {\n  const parts = fqn.split(\".\");\n  if (parts.length === 1) {\n    return `import ${parts[0]}`;\n  } else {\n    return `from ${parts.slice(0, -1).join(\".\")} import ${\n      parts[parts.length - 1]\n    }`;\n  }\n}\n"
  },
  {
    "path": "src/python/pytest-sample.ts",
    "content": "import { Component, SampleDir } from \"..\";\nimport { Project } from \"../project\";\n\n/**\n * Options for python test code sample.\n */\nexport interface PytestSampleOptions {\n  /**\n   * Name of the python package as used in imports and filenames.\n   */\n  readonly moduleName: string;\n\n  /**\n   * Test directory\n   */\n  readonly testdir: string;\n}\n\n/**\n * Python test code sample.\n */\nexport class PytestSample extends Component {\n  constructor(project: Project, options: PytestSampleOptions) {\n    super(project);\n\n    new SampleDir(project, options.testdir, {\n      files: {\n        \"__init__.py\": \"\",\n        \"test_example.py\": [\n          \"import pytest\",\n          \"\",\n          `from ${options.moduleName}.example import hello`,\n          \"\",\n          \"@pytest.mark.parametrize(\",\n          '    (\"name\", \"expected\"),',\n          \"    [\",\n          '        (\"A. Musing\", \"Hello A. Musing!\"),',\n          '        (\"traveler\", \"Hello traveler!\"),',\n          '        (\"projen developer\", \"Hello projen developer!\"),',\n          \"    ],\",\n          \")\",\n          \"def test_hello(name, expected):\",\n          '    \"\"\"Example test with parametrization.\"\"\"',\n          \"    assert hello(name) == expected\",\n          \"\",\n        ].join(\"\\n\"),\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/python/pytest.ts",
    "content": "import { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\n\nexport interface PytestOptions {\n  /**\n   * Pytest version\n   *\n   * @default \"6.2.1\"\n   */\n  readonly version?: string;\n\n  /**\n   * Directory with tests\n   *\n   * @default 'tests'\n   */\n  readonly testdir?: string;\n\n  /**\n   * Stop the testing process after the first N failures\n   */\n  readonly maxFailures?: number;\n}\n\nexport class Pytest extends Component {\n  readonly testdir: string;\n\n  constructor(project: Project, options: PytestOptions = {}) {\n    super(project);\n\n    const version = options.version ?? \"6.2.1\";\n\n    this.testdir = options.testdir ?? \"tests\";\n\n    project.deps.addDependency(`pytest@${version}`, DependencyType.TEST);\n\n    project.testTask.exec(\n      [\n        \"pytest\",\n        ...(options.maxFailures ? [`--maxfail=${options.maxFailures}`] : []),\n      ].join(\" \")\n    );\n  }\n}\n"
  },
  {
    "path": "src/python/python-deps.ts",
    "content": "import { Dependency } from \"../dependencies\";\nimport { Task } from \"../task\";\n\nexport interface IPythonDeps {\n  /**\n   * A task that installs and updates dependencies.\n   */\n  readonly installTask: Task;\n\n  /**\n   * Adds a runtime dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  addDependency(spec: string): void;\n\n  /**\n   * Adds a dev dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  addDevDependency(spec: string): void;\n\n  /**\n   * Installs dependencies (called during post-synthesis).\n   */\n  installDependencies(): void;\n}\n\nexport interface IPackageProvider {\n  /**\n   * An array of packages (may be dynamically generated).\n   */\n  readonly packages: Dependency[];\n}\n"
  },
  {
    "path": "src/python/python-env.ts",
    "content": "export interface IPythonEnv {\n  /**\n   * Initializes the virtual environment if it doesn't exist (called during post-synthesis).\n   */\n  setupEnvironment(): void;\n}\n"
  },
  {
    "path": "src/python/python-packaging.ts",
    "content": "import { Task } from \"../task\";\nimport { PoetryPyprojectOptionsWithoutDeps } from \"./poetry\";\n\nexport interface IPythonPackaging {\n  /**\n   * A task that uploads the package to a package repository.\n   */\n  readonly publishTask: Task;\n}\n\nexport interface PythonPackagingOptions {\n  /**\n   * Author's name\n   *\n   * @default $GIT_USER_NAME\n   */\n  readonly authorName: string;\n\n  /**\n   * Package name.\n   */\n  readonly packageName?: string;\n\n  /**\n   * Author's e-mail\n   *\n   * @default $GIT_USER_EMAIL\n   */\n  readonly authorEmail: string;\n\n  /**\n   * Version of the package.\n   *\n   * @default \"0.1.0\"\n   * @featured\n   */\n  readonly version: string;\n\n  /**\n   * A short description of the package.\n   * @featured\n   */\n  readonly description?: string;\n\n  /**\n   * License of this package as an SPDX identifier.\n   */\n  readonly license?: string;\n\n  /**\n   * A URL to the website of the project.\n   */\n  readonly homepage?: string;\n\n  /**\n   * A list of PyPI trove classifiers that describe the project.\n   *\n   * @see https://pypi.org/classifiers/\n   */\n  readonly classifiers?: string[];\n\n  /**\n   * Additional fields to pass in the setup() function if using setuptools\n   */\n  readonly setupConfig?: { [key: string]: any };\n\n  /**\n   * Additional options to set for poetry if using poetry\n   */\n  readonly poetryOptions?: PoetryPyprojectOptionsWithoutDeps;\n}\n"
  },
  {
    "path": "src/python/python-project.ts",
    "content": "import { GitHubProject, GitHubProjectOptions } from \"../github\";\nimport {\n  Projenrc as ProjenrcJs,\n  ProjenrcOptions as ProjenrcJsOptions,\n} from \"../javascript/projenrc\";\nimport { ProjectType } from \"../project\";\nimport { anySelected, multipleSelected } from \"../util\";\nimport { Pip } from \"./pip\";\nimport { Poetry } from \"./poetry\";\nimport {\n  Projenrc as ProjenrcPython,\n  ProjenrcOptions as ProjenrcPythonOptions,\n} from \"./projenrc\";\nimport { Pytest, PytestOptions } from \"./pytest\";\nimport { PytestSample } from \"./pytest-sample\";\nimport { IPythonDeps } from \"./python-deps\";\nimport { IPythonEnv } from \"./python-env\";\nimport { IPythonPackaging, PythonPackagingOptions } from \"./python-packaging\";\nimport { PythonSample } from \"./python-sample\";\nimport { Setuptools } from \"./setuptools\";\nimport { Venv, VenvOptions } from \"./venv\";\n\n/** Allowed characters in python project names */\nconst PYTHON_PROJECT_NAME_REGEX = /^[A-Za-z0-9-_\\.]+$/;\n\n/**\n * Options for `PythonProject`.\n */\nexport interface PythonProjectOptions\n  extends GitHubProjectOptions,\n    PythonPackagingOptions {\n  // -- required options --\n\n  /**\n   * Name of the python package as used in imports and filenames.\n   *\n   * Must only consist of alphanumeric characters and underscores.\n   *\n   * @default $PYTHON_MODULE_NAME\n   */\n  readonly moduleName: string;\n\n  // -- dependencies --\n\n  /**\n   * List of runtime dependencies for this project.\n   *\n   * Dependencies use the format: `<module>@<semver>`\n   *\n   * Additional dependencies can be added via `project.addDependency()`.\n   *\n   * @default []\n   * @featured\n   */\n  readonly deps?: string[];\n\n  /**\n   * List of dev dependencies for this project.\n   *\n   * Dependencies use the format: `<module>@<semver>`\n   *\n   * Additional dependencies can be added via `project.addDevDependency()`.\n   *\n   * @default []\n   * @featured\n   */\n  readonly devDeps?: string[];\n\n  // -- core components --\n\n  /**\n   * Use pip with a requirements.txt file to track project dependencies.\n   *\n   * @default true\n   * @featured\n   */\n  readonly pip?: boolean;\n\n  /**\n   * Use venv to manage a virtual environment for installing dependencies inside.\n   *\n   * @default true\n   * @featured\n   */\n  readonly venv?: boolean;\n\n  /**\n   * Venv options\n   * @default - defaults\n   */\n  readonly venvOptions?: VenvOptions;\n\n  /**\n   * Use setuptools with a setup.py script for packaging and publishing.\n   *\n   * @default - true if the project type is library\n   * @featured\n   */\n  readonly setuptools?: boolean;\n\n  /**\n   * Use poetry to manage your project dependencies, virtual environment, and\n   * (optional) packaging/publishing.\n   *\n   * @default false\n   * @featured\n   */\n  readonly poetry?: boolean;\n\n  // -- optional components --\n\n  /**\n   * Include pytest tests.\n   * @default true\n   * @featured\n   */\n  readonly pytest?: boolean;\n\n  /**\n   * pytest options\n   * @default - defaults\n   */\n  readonly pytestOptions?: PytestOptions;\n\n  /**\n   * Include sample code and test if the relevant directories don't exist.\n   * @default true\n   */\n  readonly sample?: boolean;\n\n  /**\n   * Use projenrc in Python.\n   *\n   * This will install `projen` as a Python dependency and add a `synth`\n   * task which will run `.projenrc.py`.\n   *\n   * @default true\n   */\n  readonly projenrcPython?: boolean;\n\n  /**\n   * Options related to projenrc in python.\n   * @default - default options\n   */\n  readonly projenrcPythonOptions?: ProjenrcPythonOptions;\n\n  /**\n   * Use projenrc in javascript.\n   *\n   * This will install `projen` as a JavaScript dependency and add a `synth`\n   * task which will run `.projenrc.js`.\n   *\n   * @default false\n   */\n  readonly projenrcJs?: boolean;\n\n  /**\n   * Options related to projenrc in JavaScript.\n   * @default - default options\n   */\n  readonly projenrcJsOptions?: ProjenrcJsOptions;\n}\n\n/**\n * Python project.\n *\n * @pjid python\n */\nexport class PythonProject extends GitHubProject {\n  /**\n   * Python module name (the project name, with any hyphens or periods replaced\n   * with underscores).\n   */\n  public readonly moduleName: string;\n\n  /**\n   * Version of the package for distribution (should follow semver).\n   */\n  public readonly version: string;\n\n  /**\n   * API for managing dependencies.\n   */\n  public readonly depsManager!: IPythonDeps;\n\n  /**\n   * API for mangaging the Python runtime environment.\n   */\n  public readonly envManager!: IPythonEnv;\n\n  /**\n   * API for managing packaging the project as a library. Only applies when the `projectType` is LIB.\n   */\n  public readonly packagingManager?: IPythonPackaging;\n\n  /**\n   * Pytest component.\n   */\n  public pytest?: Pytest;\n\n  constructor(options: PythonProjectOptions) {\n    super(options);\n\n    if (!PYTHON_PROJECT_NAME_REGEX.test(options.name)) {\n      throw new Error(\n        \"Python projects must only consist of alphanumeric characters, hyphens, and underscores.\"\n      );\n    }\n\n    this.moduleName = options.moduleName;\n    this.version = options.version;\n\n    const rcFileTypeOptions = [\n      options.projenrcPython,\n      options.projenrcJs,\n      options.projenrcJson,\n    ];\n\n    if (multipleSelected(rcFileTypeOptions)) {\n      throw new Error(\n        \"Only one of projenrcPython, projenrcJs, and projenrcJson can be selected.\"\n      );\n    }\n\n    // default to projenrc.py if no other projenrc type was elected\n    if (options.projenrcPython ?? !anySelected(rcFileTypeOptions)) {\n      new ProjenrcPython(this, options.projenrcPythonOptions);\n    }\n\n    if (options.projenrcJs ?? false) {\n      new ProjenrcJs(this, options.projenrcJsOptions);\n    }\n\n    if (options.venv ?? true) {\n      this.envManager = new Venv(this, options.venvOptions);\n    }\n\n    if (options.pip ?? true) {\n      this.depsManager = new Pip(this);\n    }\n\n    if (options.setuptools ?? this.projectType === ProjectType.LIB) {\n      this.packagingManager = new Setuptools(this, {\n        version: options.version,\n        description: options.description,\n        authorName: options.authorName,\n        authorEmail: options.authorEmail,\n        license: options.license,\n        homepage: options.homepage,\n        classifiers: options.classifiers,\n        setupConfig: options.setupConfig,\n      });\n    }\n\n    // if (options.conda ?? false) {\n    //   this.depsManager = new Conda(this, options);\n    //   this.envManager = this.depsManager;\n    // }\n\n    // if (options.pipenv ?? false) {\n    //   this.depsManager = new Pipenv(this, options);\n    //   this.envManager = this.depsManager;\n    // }\n\n    if (options.poetry ?? false) {\n      const poetry = new Poetry(this, {\n        version: options.version,\n        description: options.description,\n        authorName: options.authorName,\n        authorEmail: options.authorEmail,\n        license: options.license,\n        homepage: options.homepage,\n        classifiers: options.classifiers,\n        poetryOptions: {\n          readme: options.readme?.filename ?? \"README.md\",\n          ...options.poetryOptions,\n        },\n      });\n      this.depsManager = poetry;\n      this.envManager = poetry;\n      this.packagingManager = poetry;\n    }\n\n    if (!this.envManager) {\n      throw new Error(\n        \"At least one tool must be chosen for managing the environment (venv, conda, pipenv, or poetry).\"\n      );\n    }\n\n    if (!this.depsManager) {\n      throw new Error(\n        \"At least one tool must be chosen for managing dependencies (pip, conda, pipenv, or poetry).\"\n      );\n    }\n\n    if (!this.packagingManager && this.projectType === ProjectType.LIB) {\n      throw new Error(\n        \"At least one tool must be chosen for managing packaging (setuptools or poetry).\"\n      );\n    }\n\n    if (Number(options.venv ?? true) + Number(options.poetry ?? false) > 1) {\n      throw new Error(\n        \"More than one component has been chosen for managing the environment (venv, conda, pipenv, or poetry)\"\n      );\n    }\n\n    if (Number(options.pip ?? true) + Number(options.poetry ?? false) > 1) {\n      throw new Error(\n        \"More than one component has been chosen for managing dependencies (pip, conda, pipenv, or poetry)\"\n      );\n    }\n\n    if (\n      Number(options.setuptools ?? true) + Number(options.poetry ?? false) >\n      1\n    ) {\n      throw new Error(\n        \"More than one component has been chosen for managing packaging (setuptools or poetry)\"\n      );\n    }\n\n    if (options.pytest ?? true) {\n      this.pytest = new Pytest(this, options.pytestOptions);\n      new PytestSample(this, {\n        moduleName: this.moduleName,\n        testdir: this.pytest.testdir,\n      });\n    }\n\n    if (options.sample ?? true) {\n      new PythonSample(this, {\n        dir: this.moduleName,\n      });\n    }\n\n    for (const dep of options.deps ?? []) {\n      this.addDependency(dep);\n    }\n\n    for (const dep of options.devDeps ?? []) {\n      this.addDevDependency(dep);\n    }\n\n    this.addDefaultGitIgnore();\n  }\n\n  /**\n   * Adds default gitignore options for a Python project based on\n   * https://github.com/github/gitignore/blob/master/Python.gitignore\n   */\n  private addDefaultGitIgnore() {\n    this.gitignore.exclude(\n      \"# Byte-compiled / optimized / DLL files\",\n      \"__pycache__/\",\n      \"*.py[cod]\",\n      \"*$py.class\",\n      \"\",\n      \"# C extensions\",\n      \"*.so\",\n      \"\",\n      \"# Distribution / packaging\",\n      \".Python\",\n      \"build/\",\n      \"develop-eggs/\",\n      \"dist/\",\n      \"downloads/\",\n      \"eggs/\",\n      \".eggs/\",\n      \"lib/\",\n      \"lib64/\",\n      \"parts/\",\n      \"sdist/\",\n      \"var/\",\n      \"wheels/\",\n      \"share/python-wheels/\",\n      \"*.egg-info/\",\n      \".installed.cfg\",\n      \"*.egg\",\n      \"MANIFEST\",\n      \"\",\n      \"# PyInstaller\",\n      \"#  Usually these files are written by a python script from a template\",\n      \"#  before PyInstaller builds the exe, so as to inject date/other infos into it.\",\n      \"*.manifest\",\n      \"*.spec\",\n      \"\",\n      \"# Installer logs\",\n      \"pip-log.txt\",\n      \"pip-delete-this-directory.txt\",\n      \"\",\n      \"# Unit test / coverage reports\",\n      \"htmlcov/\",\n      \".tox/\",\n      \".nox/\",\n      \".coverage\",\n      \".coverage.*\",\n      \".cache\",\n      \"nosetests.xml\",\n      \"coverage.xml\",\n      \"*.cover\",\n      \"*.py,cover\",\n      \".hypothesis/\",\n      \".pytest_cache/\",\n      \"cover/\",\n      \"\",\n      \"# Translations\",\n      \"*.mo\",\n      \"*.pot\",\n      \"\",\n      \"# Django stuff:\",\n      \"*.log\",\n      \"local_settings.py\",\n      \"db.sqlite3\",\n      \"db.sqlite3-journal\",\n      \"\",\n      \"# Flask stuff:\",\n      \"instance/\",\n      \".webassets-cache\",\n      \"\",\n      \"# Scrapy stuff:\",\n      \".scrapy\",\n      \"\",\n      \"# Sphinx documentation\",\n      \"docs/_build/\",\n      \"\",\n      \"# PyBuilder\",\n      \".pybuilder/\",\n      \"target/\",\n      \"\",\n      \"# Jupyter Notebook\",\n      \".ipynb_checkpoints\",\n      \"\",\n      \"# IPython\",\n      \"profile_default/\",\n      \"ipython_config.py\",\n      \"\",\n      \"# PEP 582; used by e.g. github.com/David-OConnor/pyflow\",\n      \"__pypackages__/\",\n      \"\",\n      \"# Celery stuff\",\n      \"celerybeat-schedule\",\n      \"celerybeat.pid\",\n      \"\",\n      \"# SageMath parsed files\",\n      \"*.sage.py\",\n      \"\",\n      \"# Environments\",\n      \".env\",\n      \".venv\",\n      \"env/\",\n      \"venv/\",\n      \"ENV/\",\n      \"env.bak/\",\n      \"venv.bak/\",\n      \"\",\n      \"# Spyder project settings\",\n      \".spyderproject\",\n      \".spyproject\",\n      \"\",\n      \"# Rope project settings\",\n      \".ropeproject\",\n      \"\",\n      \"# mkdocs documentation\",\n      \"/site\",\n      \"\",\n      \"# mypy\",\n      \".mypy_cache/\",\n      \".dmypy.json\",\n      \"dmypy.json\",\n      \"\",\n      \"# Pyre type checker\",\n      \".pyre/\",\n      \"\",\n      \"# pytype static type analyzer\",\n      \".pytype/\",\n      \"\",\n      \"# Cython debug symbols\",\n      \"cython_debug/\"\n    );\n  }\n\n  /**\n   * Adds a runtime dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  public addDependency(spec: string) {\n    return this.depsManager.addDependency(spec);\n  }\n\n  /**\n   * Adds a dev dependency.\n   *\n   * @param spec Format `<module>@<semver>`\n   */\n  public addDevDependency(spec: string) {\n    return this.depsManager.addDevDependency(spec);\n  }\n\n  public postSynthesize() {\n    super.postSynthesize();\n\n    this.envManager.setupEnvironment();\n    this.depsManager.installDependencies();\n  }\n}\n"
  },
  {
    "path": "src/python/python-sample.ts",
    "content": "import { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { SampleDir } from \"../sample-file\";\n\n/**\n * Options for python sample code.\n */\nexport interface PythonSampleOptions {\n  /**\n   * Sample code directory\n   */\n  readonly dir: string;\n}\n\n/**\n * Python code sample.\n */\nexport class PythonSample extends Component {\n  constructor(project: Project, options: PythonSampleOptions) {\n    super(project);\n\n    new SampleDir(project, options.dir, {\n      files: {\n        \"__init__.py\": '__version__ = \"0.1.0\"\\n',\n        \"__main__.py\": [\n          \"from .example import hello\",\n          \"\",\n          'if __name__ == \"__main__\":',\n          '    name = input(\"What is your name? \")',\n          \"    print(hello(name))\",\n          \"\",\n        ].join(\"\\n\"),\n        \"example.py\": [\n          \"def hello(name: str) -> str:\",\n          '    \"\"\"A simple greeting.',\n          \"    Args:\",\n          \"        name (str): Name to greet.\",\n          \"    Returns:\",\n          \"        str: greeting message\",\n          '    \"\"\"',\n          '    return f\"Hello {name}!\"',\n          \"\",\n        ].join(\"\\n\"),\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/python/requirements-file.ts",
    "content": "import { Dependencies, DependencyCoordinates } from \"../dependencies\";\nimport { FileBase, IResolver } from \"../file\";\nimport { Project } from \"../project\";\nimport { toPythonVersionRange } from \"../util/semver\";\nimport { IPackageProvider } from \"./python-deps\";\n\nexport interface RequirementsFileOptions {\n  /**\n   * Provide a list of packages that can be dynamically updated.\n   */\n  readonly packageProvider?: IPackageProvider;\n}\n\n/**\n * Specifies a list of packages to be installed using pip.\n *\n * @see https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format\n */\nexport class RequirementsFile extends FileBase {\n  private readonly packages = new Array<string>();\n  private readonly packageProvider?: IPackageProvider;\n\n  constructor(\n    project: Project,\n    filePath: string,\n    options: RequirementsFileOptions\n  ) {\n    super(project, filePath);\n\n    this.packageProvider = options.packageProvider;\n  }\n\n  /**\n   * Adds the specified packages provided in semver format.\n   *\n   * Comment lines (start with `#`) are ignored.\n   *\n   * @param packages Package version in format `<module>@<semver>`\n   */\n  public addPackages(...packages: string[]) {\n    for (let pkg of packages) {\n      if (pkg.startsWith(\"#\")) {\n        this.packages.push(pkg);\n      } else {\n        const { name, version } = Dependencies.parseDependency(pkg);\n        if (version) {\n          this.packages.push(`${name}${toPythonVersionRange(version)}`);\n        } else {\n          this.packages.push(name);\n        }\n      }\n    }\n  }\n\n  private formatDependency(dep: DependencyCoordinates) {\n    if (dep.version) {\n      return `${dep.name}${toPythonVersionRange(dep.version)}`;\n    } else {\n      return dep.name;\n    }\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const allPackages = [...this.packages];\n    if (this.packageProvider) {\n      allPackages.push(\n        ...this.packageProvider.packages.map((dep) =>\n          this.formatDependency(dep)\n        )\n      );\n    }\n\n    return `${resolver\n      .resolve([...(this.marker ? [`# ${this.marker}`] : []), ...allPackages])\n      .join(\"\\n\")}\\n`;\n  }\n}\n"
  },
  {
    "path": "src/python/setuppy.ts",
    "content": "import { FileBase, IResolver } from \"../file\";\nimport { Project } from \"../project\";\n\n/**\n * Fields to pass in the setup() function of setup.py\n *\n * @see https://docs.python.org/3/distutils/setupscript.html\n */\nexport interface SetupPyOptions {\n  /**\n   * Name of the package\n   */\n  readonly name?: string;\n\n  /**\n   * List of submodules to be packaged\n   */\n  readonly packages?: string[];\n\n  /**\n   * Author's name\n   */\n  readonly authorName?: string;\n\n  /**\n   * Author's e-mail\n   */\n  readonly authorEmail?: string;\n\n  /**\n   * Manually specify package version\n   */\n  readonly version?: string;\n\n  /**\n   * A short project description\n   */\n  readonly description?: string;\n\n  /**\n   * The project license\n   */\n  readonly license?: string;\n\n  /**\n   * Package's Homepage / Website\n   */\n  readonly homepage?: string;\n\n  /**\n   * A list of PyPI trove classifiers that describe the project.\n   *\n   * @see https://pypi.org/classifiers/\n   */\n  readonly classifiers?: string[];\n\n  /**\n   * Escape hatch to allow any value\n   */\n  readonly [name: string]: any;\n}\n\n/**\n * Python packaging script where package metadata can be placed.\n */\nexport class SetupPy extends FileBase {\n  private readonly setupConfig: any;\n\n  constructor(project: Project, options: SetupPyOptions) {\n    super(project, \"setup.py\");\n\n    this.setupConfig = {\n      name: project.name,\n      packages: options.packages,\n      python_requires: \">=3.6\",\n      classifiers: [\n        \"Intended Audience :: Developers\",\n        \"Programming Language :: Python :: 3 :: Only\",\n        \"Programming Language :: Python :: 3.6\",\n        \"Programming Language :: Python :: 3.7\",\n        \"Programming Language :: Python :: 3.8\",\n        \"Programming Language :: Python :: 3.9\",\n      ],\n      ...(options ? this.renameFields(options) : []),\n    };\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const lines = [\n      ...(this.marker ? [`# ${this.marker}`] : []),\n      \"\",\n      \"import json\",\n      \"from setuptools import setup\",\n      \"\",\n      \"kwargs = json.loads(\",\n      '    \"\"\"',\n      JSON.stringify(this.setupConfig, null, 4),\n      '\"\"\"',\n      \")\",\n      \"\",\n      \"setup(**kwargs)\",\n    ];\n\n    return `${resolver.resolve(lines).join(\"\\n\")}\\n`;\n  }\n\n  // modify some key names since JSII interfaces require fields to be camelCase\n  private renameFields(options: SetupPyOptions): any {\n    const obj: { [key: string]: any } = {};\n    for (const [key, value] of Object.entries(options)) {\n      if (key === \"authorName\") {\n        obj.author = value;\n      } else if (key === \"authorEmail\") {\n        obj.author_email = value;\n      } else if (key === \"homepage\") {\n        obj.url = value;\n      } else {\n        obj[key] = value;\n      }\n    }\n    return obj;\n  }\n}\n"
  },
  {
    "path": "src/python/setuptools.ts",
    "content": "import { Component } from \"../component\";\nimport { DependencyType } from \"../dependencies\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\nimport { IPythonPackaging, PythonPackagingOptions } from \"./python-packaging\";\nimport { SetupPy } from \"./setuppy\";\n\n/**\n * Manages packaging through setuptools with a setup.py script.\n */\nexport class Setuptools extends Component implements IPythonPackaging {\n  public readonly publishTask: Task;\n\n  /**\n   * A task that uploads the package to the Test PyPI repository.\n   */\n  public readonly publishTestTask: Task;\n\n  constructor(\n    project: Project,\n    //moduleName: string,\n    options: PythonPackagingOptions\n  ) {\n    super(project);\n\n    project.deps.addDependency(\"wheel@0.36.2\", DependencyType.DEVENV);\n    project.deps.addDependency(\"twine@3.3.0\", DependencyType.DEVENV);\n\n    project.packageTask.exec(\"python setup.py sdist bdist_wheel\");\n\n    this.publishTestTask = project.addTask(\"publish:test\", {\n      description: \"Uploads the package against a test PyPI endpoint.\",\n      exec: \"twine upload --repository-url https://test.pypi.org/legacy/ dist/*\",\n    });\n\n    this.publishTask = project.addTask(\"publish\", {\n      description: \"Uploads the package against a test PyPI endpoint.\",\n      exec: \"twine upload dist/*\",\n    });\n\n    const packages = options.packageName ? [options.packageName] : undefined;\n\n    new SetupPy(project, {\n      name: project.name,\n      packages: packages,\n      authorName: options.authorName,\n      authorEmail: options.authorEmail,\n      version: options.version,\n      description: options.description,\n      license: options.license,\n      homepage: options.homepage,\n      classifiers: options.classifiers,\n      ...options.setupConfig,\n    });\n  }\n}\n"
  },
  {
    "path": "src/python/venv.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { exec } from \"../util\";\nimport { IPythonEnv } from \"./python-env\";\n\n/**\n * Options for venv.\n */\nexport interface VenvOptions {\n  /**\n   * Name of directory to store the environment in\n   *\n   * @default \".env\"\n   */\n  readonly envdir?: string;\n}\n\n/**\n * Manages a virtual environment through the Python venv module.\n */\nexport class Venv extends Component implements IPythonEnv {\n  /**\n   * Name of directory to store the environment in\n   */\n  private readonly envdir: string;\n\n  constructor(project: Project, options: VenvOptions = {}) {\n    super(project);\n\n    this.envdir = options.envdir ?? \".env\";\n\n    this.project.addGitIgnore(`/${this.envdir}`);\n    this.project.tasks.addEnvironment(\n      \"VIRTUAL_ENV\",\n      `$(echo $PWD/${this.envdir})`\n    );\n    this.project.tasks.addEnvironment(\n      \"PATH\",\n      `$(echo $PWD/${this.envdir}/bin:$PATH)`\n    );\n  }\n\n  /**\n   * Initializes the virtual environment if it doesn't exist (called during post-synthesis).\n   */\n  public setupEnvironment() {\n    const absoluteEnvdir = path.join(this.project.outdir, this.envdir);\n    if (!fs.pathExistsSync(absoluteEnvdir)) {\n      this.project.logger.info(\"Setting up a virtual environment...\");\n      exec(`python -m venv ${this.envdir}`, { cwd: this.project.outdir });\n      this.project.logger.info(\n        `Environment successfully created (located in ./${this.envdir}).`\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "src/readme.ts",
    "content": "import { Project } from \"./project\";\nimport { SampleFile } from \"./sample-file\";\n\n/**\n * SampleReadme Properties\n */\nexport interface SampleReadmeProps {\n  /**\n   * The name of the README.md file\n   *\n   * @default \"README.md\"\n   * @example \"readme.md\"\n   */\n  readonly filename?: string;\n\n  /**\n   * The contents\n   * @default \"# replace this\"\n   */\n  readonly contents?: string;\n}\n\n/**\n * Represents a README.md sample file.\n * You are expected to manage this file after creation.\n *\n * @param text - The initial contents of the README.md file. Defaults to '# replace this'\n */\nexport class SampleReadme extends SampleFile {\n  constructor(project: Project, props?: SampleReadmeProps) {\n    super(project, props?.filename ?? \"README.md\", {\n      contents: props?.contents ?? \"# replace this\",\n    });\n  }\n}\n"
  },
  {
    "path": "src/release/bump-version.task.ts",
    "content": "/**\n * Resolves the latest version from git tags and uses `standard-version` to bump\n * to the next version based on commits.\n *\n * This expects `standard-version` to be installed in the path.\n *\n * Environment variables:\n *\n * - OUTFILE: (required) the name of the JSON output file (the \"version\" field\n *   will be updated with the latest version)\n * - PRERELEASE: (optional) a prerelease tag to use (e.g. \"beta\")\n * - MAJOR: major version number NN to filter (tags are filtered by \"vNN.\"\n *   prefix). if not specified, the last major version is selected\n * - MIN_MAJOR: minimum major version number to use\n * - CHANGELOG: name of changelog file to create\n * - RELEASE_TAG_PREFIX: (optional) a prefix to apply to the release tag\n *\n */\nimport * as logging from \"../logging\";\nimport { bump, BumpOptions } from \"./bump-version\";\n\nconst versionFile = process.env.OUTFILE;\nconst prerelease = process.env.PRERELEASE;\nconst major = process.env.MAJOR;\nconst minMajor = process.env.MIN_MAJOR;\nconst changelog = process.env.CHANGELOG;\nconst bumpFile = process.env.BUMPFILE;\nconst releaseTagFile = process.env.RELEASETAG;\nconst prefix = process.env.RELEASE_TAG_PREFIX;\nconst versionrcOptions = process.env.VERSIONRCOPTIONS;\n\nif (!versionFile) {\n  throw new Error(\"OUTFILE is required\");\n}\n\nif (!changelog) {\n  throw new Error(\"CHANGELOG is required\");\n}\n\nif (!bumpFile) {\n  throw new Error(\"BUMPFILE is required\");\n}\n\nif (!releaseTagFile) {\n  throw new Error(\"RELEASETAG is required\");\n}\n\nconst majorVersion =\n  major == null || major === \"\" ? undefined : parseInt(major);\nif (Number.isNaN(majorVersion)) {\n  throw new Error(`MAJOR must be a number: ${majorVersion}`);\n}\n\nconst minMajorVersion =\n  minMajor == null || minMajor === \"\" ? undefined : parseInt(minMajor);\nif (Number.isNaN(minMajorVersion)) {\n  throw new Error(`minMajor must be a number: ${minMajorVersion}`);\n}\n\nconst opts: BumpOptions = {\n  versionFile: versionFile,\n  changelog: changelog,\n  majorVersion: majorVersion,\n  minMajorVersion: minMajorVersion,\n  prerelease: prerelease,\n  bumpFile: bumpFile,\n  releaseTagFile: releaseTagFile,\n  tagPrefix: prefix,\n  // doesn't work with long customization\n  versionrcOptions: JSON.parse(versionrcOptions ?? \"{}\"),\n};\nlogging.debug(opts);\n\nbump(process.cwd(), opts).catch((e: Error) => {\n  console.log(e.stack);\n  process.exit(1);\n});\n"
  },
  {
    "path": "src/release/bump-version.ts",
    "content": "import { dirname, join } from \"path\";\nimport { Config } from \"conventional-changelog-config-spec\";\nimport { mkdirp, pathExists, readFile, remove, writeFile } from \"fs-extra\";\nimport * as logging from \"../logging\";\nimport { exec, execCapture } from \"../util\";\n\nexport interface BumpOptions {\n  /**\n   * The name of a .json file to set `version`.\n   */\n  readonly versionFile: string;\n\n  /**\n   * The name of the changelog file to generate.\n   */\n  readonly changelog: string;\n\n  /**\n   * Use a pre-release suffix.\n   * @default - normal versioning\n   */\n  readonly prerelease?: string;\n\n  /**\n   * Defines the major version line. This is used to select the latest version\n   * and also enforce that new major versions are not released accidentally.\n   *\n   * Can not be set together with `minMajorVersion`.\n   *\n   * @default - any version is supported\n   */\n  readonly majorVersion?: number;\n\n  /**\n   * Defines the minimal major version. This is used if you want to start with\n   * a specific major version, and increment from there on.\n   * This can be useful to set to 1, as breaking changes before the 1.x major\n   * release are not incrementing the major version number.\n   *\n   * Can not be set together with `majorVersion`.\n   *\n   * @default - No minimum version is being enforced\n   */\n  readonly minMajorVersion?: number;\n\n  /**\n   * The name of a file which will include the output version number (a text file).\n   *\n   * Relative to cwd.\n   *\n   * @example \".version.txt\"\n   */\n  readonly bumpFile: string;\n\n  /**\n   * The name of the file which will include the release tag (a text file).\n   *\n   * Relative to cwd.\n   *\n   * @example \".releasetag.txt\"\n   */\n  readonly releaseTagFile: string;\n\n  /**\n   * The prefix applied to release tags. Bumps will be made based on the latest\n   * version found with this prefix.\n   */\n  readonly tagPrefix?: string;\n\n  /**\n   * Conguration values that would append to versionrc file or overwrite values\n   * coming to that from default one.\n   */\n  readonly versionrcOptions?: Config;\n}\n\n/**\n * Resolves the latest version from git tags and uses `standard-version` to bump\n * to the next version based on commits.\n *\n * This expects `standard-version` to be installed in the path.\n *\n * @param cwd working directory (git repository)\n * @param options options\n */\nexport async function bump(cwd: string, options: BumpOptions) {\n  const versionFile = join(cwd, options.versionFile);\n  const prerelease = options.prerelease;\n  const major = options.majorVersion;\n  const minMajorVersion = options.minMajorVersion;\n  const prefix = options.tagPrefix ?? \"\";\n  const bumpFile = join(cwd, options.bumpFile);\n  const changelogFile = join(cwd, options.changelog);\n  const releaseTagFile = join(cwd, options.releaseTagFile);\n  if (major && minMajorVersion) {\n    throw new Error(\n      `minMajorVersion and majorVersion cannot be used together.`\n    );\n  }\n\n  await mkdirp(dirname(bumpFile));\n  await mkdirp(dirname(changelogFile));\n  await mkdirp(dirname(releaseTagFile));\n\n  const { latestVersion, latestTag, isFirstRelease } = determineLatestTag({\n    cwd,\n    major,\n    prerelease,\n    prefix,\n  });\n\n  const content = await tryReadVersionFile(versionFile);\n\n  // update version\n  content.version = latestVersion;\n\n  logging.info(\n    `Update ${versionFile} to latest resolved version: ${latestVersion}`\n  );\n  await writeFile(versionFile, JSON.stringify(content, undefined, 2));\n\n  // check if the latest commit already has a version tag\n  const currentTags = execCapture(\"git tag --points-at HEAD\", { cwd })\n    .toString(\"utf8\")\n    .split(\"\\n\");\n  logging.info(`Tags listed on current commit: ${currentTags}`);\n\n  let skipBump = false;\n\n  if (currentTags.includes(latestTag)) {\n    logging.info(\"Skipping bump...\");\n    skipBump = true;\n\n    // delete the existing tag (locally)\n    // if we don't do this, standard-version generates an empty changelog\n    exec(`git tag --delete ${latestTag}`, { cwd });\n  }\n\n  // create a standard-version configuration file\n  const rcfile = join(cwd, \".versionrc.json\");\n  await generateVersionrcFile(\n    rcfile,\n    versionFile,\n    changelogFile,\n    skipBump,\n    prerelease,\n    options.versionrcOptions\n  );\n\n  const cmd = [\"npx\", \"standard-version@^9\"];\n  if (isFirstRelease) {\n    cmd.push(\"--first-release\");\n  }\n  if (prefix) {\n    cmd.push(`--tag-prefix ${prefix}v`);\n  }\n  if (minMajorVersion) {\n    const [majorVersion] = latestVersion.split(\".\");\n    const majorVersionNumber = parseInt(majorVersion, 10);\n    if (majorVersionNumber < minMajorVersion) {\n      cmd.push(`--release-as ${minMajorVersion}.0.0`);\n    }\n  }\n\n  exec(cmd.join(\" \"), { cwd });\n\n  // add the tag back if it was previously removed\n  if (currentTags.includes(latestTag)) {\n    exec(`git tag ${latestTag}`, { cwd });\n  }\n\n  await remove(rcfile);\n\n  const newVersion = (await tryReadVersionFile(versionFile)).version;\n  if (!newVersion) {\n    throw new Error(`bump failed: ${versionFile} does not have a version set`);\n  }\n\n  // if MAJOR is defined, ensure that the new version is within the same major version\n  if (major) {\n    if (!newVersion.startsWith(`${major}.`)) {\n      throw new Error(\n        `bump failed: this branch is configured to only publish v${major} releases - bump resulted in ${newVersion}`\n      );\n    }\n  }\n\n  await writeFile(bumpFile, newVersion);\n\n  const newTag = `${prefix}v${newVersion}`;\n  await writeFile(releaseTagFile, newTag);\n}\n\nasync function tryReadVersionFile(versionFile: string) {\n  if (!(await pathExists(versionFile))) {\n    return {};\n  }\n\n  return JSON.parse(await readFile(versionFile, \"utf8\"));\n}\n\ninterface LatestTagOptions {\n  /**\n   * Working directory of the git repository.\n   */\n  readonly cwd: string;\n  /**\n   * Major version to select from.\n   */\n  readonly major?: number;\n  /**\n   * A pre-release suffix.\n   */\n  readonly prerelease?: string;\n  /**\n   * A prefix applied to all tags.\n   */\n  readonly prefix: string;\n}\n\nfunction generateVersionrcFile(\n  rcfile: string,\n  versionFile: string,\n  changelogFile: string,\n  skipBump: boolean,\n  prerelease?: string,\n  configOptions?: Config\n) {\n  return writeFile(\n    rcfile,\n    JSON.stringify(\n      {\n        ...{\n          packageFiles: [\n            {\n              filename: versionFile,\n              type: \"json\",\n            },\n          ],\n          bumpFiles: [\n            {\n              filename: versionFile,\n              type: \"json\",\n            },\n          ],\n          commitAll: false,\n          infile: changelogFile,\n          prerelease: prerelease,\n          header: \"\",\n          skip: {\n            commit: true,\n            tag: true,\n            bump: skipBump,\n          },\n          ...configOptions,\n        },\n      },\n      undefined,\n      2\n    )\n  );\n}\n\n/**\n * Determines the latest release tag.\n * @param major (optional) A major version line to select from\n * @param prerelease (optional) A pre-release suffix.\n * @returns the latest tag, and whether it is the first release or not\n */\nfunction determineLatestTag(options: LatestTagOptions): {\n  latestVersion: string;\n  latestTag: string;\n  isFirstRelease: boolean;\n} {\n  const { cwd, major, prerelease, prefix } = options;\n\n  // filter only tags for this prefix and major version if specified (start with \"vNN.\").\n  const prefixFilter =\n    major !== undefined ? `${prefix}v${major}.*` : `${prefix}v*`;\n\n  const listGitTags = [\n    \"git\",\n    '-c \"versionsort.suffix=-\"', // makes sure pre-release versions are listed after the primary version\n    \"tag\",\n    '--sort=\"-version:refname\"', // sort as versions and not lexicographically\n    \"--list\",\n    `\"${prefixFilter}\"`,\n  ].join(\" \");\n\n  const stdout = execCapture(listGitTags, { cwd }).toString(\"utf8\");\n\n  let tags = stdout?.split(\"\\n\");\n\n  // if \"pre\" is set, filter versions that end with \"-PRE.ddd\".\n  if (prerelease) {\n    tags = tags.filter((x) => new RegExp(`-${prerelease}\\.[0-9]+$`).test(x));\n  }\n\n  tags = tags.filter((x) => x);\n\n  // if a pre-release tag is used, then add it to the initial version\n  let isFirstRelease = false;\n  let latestTag;\n\n  if (tags.length > 0) {\n    latestTag = tags[0];\n  } else {\n    const initial = `${prefix}v${major ?? 0}.0.0`;\n    latestTag = prerelease ? `${initial}-${prerelease}.0` : initial;\n    isFirstRelease = true;\n  }\n\n  // remove tag prefix (if exists)\n  let latestVersion = latestTag;\n  if (prefix && latestVersion.startsWith(prefix)) {\n    latestVersion = latestVersion.substr(prefix.length);\n  }\n\n  // remove \"v\" prefix (if exists)\n  if (latestVersion.startsWith(\"v\")) {\n    latestVersion = latestVersion.substr(1);\n  }\n\n  return { latestVersion, latestTag, isFirstRelease };\n}\n"
  },
  {
    "path": "src/release/index.ts",
    "content": "export * from \"./release\";\nexport * from \"./publisher\";\nexport * from \"./release-trigger\";\n"
  },
  {
    "path": "src/release/publisher.ts",
    "content": "import { Component } from \"../component\";\nimport {\n  BUILD_ARTIFACT_NAME,\n  DEFAULT_GITHUB_ACTIONS_USER,\n} from \"../github/constants\";\nimport {\n  Job,\n  JobPermission,\n  JobPermissions,\n  JobStep,\n  Tools,\n} from \"../github/workflows-model\";\nimport { defaultNpmToken } from \"../javascript/node-package\";\nimport { Project } from \"../project\";\nimport { BranchOptions } from \"./release\";\n\nconst PUBLIB_VERSION = \"latest\";\nconst GITHUB_PACKAGES_REGISTRY = \"npm.pkg.github.com\";\nconst ARTIFACTS_DOWNLOAD_DIR = \"dist\";\nconst GITHUB_PACKAGES_MAVEN_REPOSITORY = \"https://maven.pkg.github.com\";\nconst GITHUB_PACKAGES_NUGET_REPOSITORY = \"https://nuget.pkg.github.com\";\nconst AWS_CODEARTIFACT_REGISTRY_REGEX = /.codeartifact.*.amazonaws.com/;\nconst PUBLIB_TOOLCHAIN = {\n  js: {},\n  java: { java: { version: \"11.x\" } },\n  python: { python: { version: \"3.x\" } },\n  go: { go: { version: \"^1.16.0\" } },\n  dotnet: { dotnet: { version: \"3.x\" } },\n};\n\n/**\n * Options for `Publisher`.\n */\nexport interface PublisherOptions {\n  /**\n   * The job ID that produces the build artifacts. All publish jobs will take a dependency on this job.\n   */\n  readonly buildJobId: string;\n\n  /**\n   * A GitHub workflow expression used as a condition for publishers.\n   *\n   * @default - no condition\n   */\n  readonly condition?: string;\n\n  /**\n   * The name of the artifact to download (e.g. `dist`).\n   *\n   * The artifact is expected to include a subdirectory for each release target:\n   * `go` (GitHub), `dotnet` (NuGet), `java` (Maven), `js` (npm), `python`\n   * (PyPI).\n   *\n   * @see https://github.com/aws/publib\n   */\n  readonly artifactName: string;\n\n  /**\n   * @deprecated use `publibVersion` instead\n   */\n  readonly jsiiReleaseVersion?: string;\n\n  /**\n   * Node version to setup in GitHub workflows if any node-based CLI utilities\n   * are needed. For example `publib`, the CLI projen uses to publish releases,\n   * is an npm library.\n   *\n   * @default 14.x\n   */\n  readonly workflowNodeVersion?: string;\n\n  /**\n   * Version requirement for `publib`.\n   *\n   * @default \"latest\"\n   */\n  readonly publibVersion?: string;\n\n  /**\n   * Create an issue when a publish task fails.\n   *\n   * @default false\n   */\n  readonly failureIssue?: boolean;\n\n  /**\n   * The label to apply to the issue marking failed publish tasks.\n   * Only applies if `failureIssue` is true.\n   *\n   * @default \"failed-release\"\n   */\n  readonly failureIssueLabel?: string;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly workflowRunsOn?: string[];\n\n  /**\n   * Define publishing tasks that can be executed manually as well as workflows.\n   *\n   * Normally, publishing only happens within automated workflows. Enable this\n   * in order to create a publishing task for each publishing activity.\n   *\n   * @default false\n   */\n  readonly publishTasks?: boolean;\n\n  /**\n   * Do not actually publish, only print the commands that would be executed instead.\n   *\n   * Useful if you wish to block all publishing from a single option.\n   */\n  readonly dryRun?: boolean;\n}\n\n/**\n * Implements GitHub jobs for publishing modules to package managers.\n *\n * Under the hood, it uses https://github.com/aws/publib\n */\nexport class Publisher extends Component {\n  public static readonly PUBLISH_GIT_TASK_NAME = \"publish:git\";\n\n  public readonly buildJobId: string;\n  public readonly artifactName: string;\n  public readonly publibVersion: string;\n  public readonly condition?: string;\n\n  /** @deprecated use `publibVersion` */\n  public readonly jsiiReleaseVersion: string;\n\n  private readonly failureIssue: boolean;\n  private readonly failureIssueLabel: string;\n  private readonly runsOn: string[];\n  private readonly publishTasks: boolean;\n\n  // functions that create jobs associated with a specific branch\n  private readonly _jobFactories: PublishJobFactory[] = [];\n\n  private readonly _gitHubPrePublishing: JobStep[] = [];\n\n  private readonly dryRun: boolean;\n\n  private readonly workflowNodeVersion: string;\n\n  constructor(project: Project, options: PublisherOptions) {\n    super(project);\n\n    this.buildJobId = options.buildJobId;\n    this.artifactName = options.artifactName;\n    this.publibVersion =\n      options.publibVersion ?? options.jsiiReleaseVersion ?? PUBLIB_VERSION;\n    this.jsiiReleaseVersion = this.publibVersion;\n    this.condition = options.condition;\n    this.dryRun = options.dryRun ?? false;\n    this.workflowNodeVersion = options.workflowNodeVersion ?? \"14.x\";\n\n    this.failureIssue = options.failureIssue ?? false;\n    this.failureIssueLabel = options.failureIssueLabel ?? \"failed-release\";\n    this.runsOn = options.workflowRunsOn ?? [\"ubuntu-latest\"];\n    this.publishTasks = options.publishTasks ?? false;\n  }\n\n  /**\n   * Called by `Release` to add the publishing jobs to a release workflow\n   * associated with a specific branch.\n   * @param branch The branch name\n   * @param options Branch options\n   *\n   * @internal\n   */\n  public _renderJobsForBranch(\n    branch: string,\n    options: Partial<BranchOptions>\n  ): Record<string, Job> {\n    let jobs: Record<string, Job> = {};\n\n    for (const factory of this._jobFactories) {\n      jobs = {\n        ...jobs,\n        ...factory(branch, options),\n      };\n    }\n\n    return jobs;\n  }\n\n  /**\n   * Adds pre publishing steps for the GitHub release job.\n   *\n   * @param steps The steps.\n   */\n  public addGitHubPrePublishingSteps(...steps: JobStep[]) {\n    this._gitHubPrePublishing.push(...steps);\n  }\n\n  /**\n   * Publish to git.\n   *\n   * This includes generating a project-level changelog and release tags.\n   *\n   * @param options Options\n   */\n  public publishToGit(options: GitPublishOptions) {\n    const releaseTagFile = options.releaseTagFile;\n    const versionFile = options.versionFile;\n    const changelog = options.changelogFile;\n    const projectChangelogFile = options.projectChangelogFile;\n    const gitBranch = options.gitBranch ?? \"main\";\n\n    const taskName =\n      gitBranch === \"main\" || gitBranch === \"master\"\n        ? Publisher.PUBLISH_GIT_TASK_NAME\n        : `${Publisher.PUBLISH_GIT_TASK_NAME}:${gitBranch}`;\n\n    const publishTask = this.project.addTask(taskName, {\n      description:\n        \"Prepends the release changelog onto the project changelog, creates a release commit, and tags the release\",\n      env: {\n        CHANGELOG: changelog,\n        RELEASE_TAG_FILE: releaseTagFile,\n        PROJECT_CHANGELOG_FILE: projectChangelogFile ?? \"\",\n        VERSION_FILE: versionFile,\n      },\n      condition: '! git log --oneline -1 | grep -q \"chore(release):\"',\n    });\n    if (projectChangelogFile) {\n      publishTask.builtin(\"release/update-changelog\");\n    }\n    publishTask.builtin(\"release/tag-version\");\n\n    if (options.gitPushCommand !== \"\") {\n      const gitPushCommand =\n        options.gitPushCommand || `git push --follow-tags origin ${gitBranch}`;\n      publishTask.exec(gitPushCommand);\n    }\n\n    return publishTask;\n  }\n\n  /**\n   * Creates a GitHub Release.\n   * @param options Options\n   */\n  public publishToGitHubReleases(options: GitHubReleasesPublishOptions) {\n    const changelogFile = options.changelogFile;\n    const releaseTagFile = options.releaseTagFile;\n\n    // create a github release\n    const releaseTag = `$(cat ${releaseTagFile})`;\n\n    const ghRelease = [\n      `gh release create ${releaseTag}`,\n      \"-R $GITHUB_REPOSITORY\",\n      `-F ${changelogFile}`,\n      `-t ${releaseTag}`,\n      \"--target $GITHUB_REF\",\n    ].join(\" \");\n\n    // release script that does not error when re-releasing a given version\n    const idempotentRelease = [\n      \"errout=$(mktemp);\",\n      `${ghRelease} 2> $errout && true;`,\n      \"exitcode=$?;\",\n      'if [ $exitcode -ne 0 ] && ! grep -q \"Release.tag_name already exists\" $errout; then',\n      \"cat $errout;\",\n      \"exit $exitcode;\",\n      \"fi\",\n    ].join(\" \");\n\n    this.addPublishJob((): PublishJobOptions => {\n      return {\n        name: \"github\",\n        registryName: \"GitHub Releases\",\n        prePublishSteps: options.prePublishSteps ?? this._gitHubPrePublishing,\n        publishTools: options.publishTools,\n        permissions: {\n          contents: JobPermission.WRITE,\n        },\n        workflowEnv: {\n          GITHUB_TOKEN: \"${{ secrets.GITHUB_TOKEN }}\",\n          GITHUB_REPOSITORY: \"${{ github.repository }}\",\n          GITHUB_REF: \"${{ github.ref }}\",\n        },\n        run: idempotentRelease,\n      };\n    });\n  }\n\n  /**\n   * Publishes artifacts from `js/**` to npm.\n   * @param options Options\n   */\n  public publishToNpm(options: NpmPublishOptions = {}) {\n    const isGitHubPackages = options.registry?.startsWith(\n      GITHUB_PACKAGES_REGISTRY\n    );\n    const isAwsCodeArtifact = isAwsCodeArtifactRegistry(options.registry);\n    const npmToken = defaultNpmToken(options.npmTokenSecret, options.registry);\n\n    if (options.distTag) {\n      this.project.logger.warn(\n        \"The `distTag` option is deprecated. Use the npmDistTag option instead.\"\n      );\n    }\n\n    this.addPublishJob((_branch, branchOptions): PublishJobOptions => {\n      if (branchOptions.npmDistTag && options.distTag) {\n        throw new Error(\n          \"cannot set branch-level npmDistTag and npmDistTag in publishToNpm()\"\n        );\n      }\n\n      return {\n        name: \"npm\",\n        publishTools: PUBLIB_TOOLCHAIN.js,\n        prePublishSteps: options.prePublishSteps ?? [],\n        run: this.publibCommand(\"publib-npm\"),\n        registryName: \"npm\",\n        env: {\n          NPM_DIST_TAG: branchOptions.npmDistTag ?? options.distTag ?? \"latest\",\n          NPM_REGISTRY: options.registry,\n        },\n        permissions: {\n          contents: JobPermission.READ,\n          packages: isGitHubPackages ? JobPermission.WRITE : undefined,\n        },\n        workflowEnv: {\n          NPM_TOKEN: npmToken ? secret(npmToken) : undefined,\n          // if we are publishing to AWS CodeArtifact, pass AWS access keys that will be used to generate NPM_TOKEN using AWS CLI.\n          AWS_ACCESS_KEY_ID: isAwsCodeArtifact\n            ? secret(\n                options.codeArtifactOptions?.accessKeyIdSecret ??\n                  \"AWS_ACCESS_KEY_ID\"\n              )\n            : undefined,\n          AWS_SECRET_ACCESS_KEY: isAwsCodeArtifact\n            ? secret(\n                options.codeArtifactOptions?.secretAccessKeySecret ??\n                  \"AWS_SECRET_ACCESS_KEY\"\n              )\n            : undefined,\n          AWS_ROLE_TO_ASSUME: isAwsCodeArtifact\n            ? options.codeArtifactOptions?.roleToAssume\n            : undefined,\n        },\n      };\n    });\n  }\n\n  /**\n   * Publishes artifacts from `dotnet/**` to NuGet Gallery.\n   * @param options Options\n   */\n  public publishToNuget(options: NugetPublishOptions = {}) {\n    const isGitHubPackages = options.nugetServer?.startsWith(\n      GITHUB_PACKAGES_NUGET_REPOSITORY\n    );\n    this.addPublishJob(\n      (_branch, _branchOptions): PublishJobOptions => ({\n        name: \"nuget\",\n        publishTools: PUBLIB_TOOLCHAIN.dotnet,\n        prePublishSteps: options.prePublishSteps ?? [],\n        run: this.publibCommand(\"publib-nuget\"),\n        registryName: \"NuGet Gallery\",\n        permissions: {\n          contents: JobPermission.READ,\n          packages: isGitHubPackages ? JobPermission.WRITE : undefined,\n        },\n        workflowEnv: {\n          NUGET_API_KEY: secret(\n            isGitHubPackages\n              ? \"GITHUB_TOKEN\"\n              : options.nugetApiKeySecret ?? \"NUGET_API_KEY\"\n          ),\n          NUGET_SERVER: options.nugetServer ?? undefined,\n        },\n      })\n    );\n  }\n\n  /**\n   * Publishes artifacts from `java/**` to Maven.\n   * @param options Options\n   */\n  public publishToMaven(options: MavenPublishOptions = {}) {\n    const isGitHubPackages = options.mavenRepositoryUrl?.startsWith(\n      GITHUB_PACKAGES_MAVEN_REPOSITORY\n    );\n    const isGitHubActor =\n      isGitHubPackages && options.mavenUsername == undefined;\n    const mavenServerId =\n      options.mavenServerId ?? (isGitHubPackages ? \"github\" : undefined);\n\n    if (isGitHubPackages && mavenServerId != \"github\") {\n      throw new Error(\n        'publishing to GitHub Packages requires the \"mavenServerId\" to be \"github\"'\n      );\n    }\n\n    this.addPublishJob(\n      (_branch, _branchOptions): PublishJobOptions => ({\n        name: \"maven\",\n        registryName: \"Maven Central\",\n        publishTools: PUBLIB_TOOLCHAIN.java,\n        prePublishSteps: options.prePublishSteps ?? [],\n        run: this.publibCommand(\"publib-maven\"),\n        env: {\n          MAVEN_ENDPOINT: options.mavenEndpoint,\n          MAVEN_SERVER_ID: mavenServerId,\n          MAVEN_REPOSITORY_URL: options.mavenRepositoryUrl,\n        },\n        workflowEnv: {\n          MAVEN_GPG_PRIVATE_KEY: isGitHubPackages\n            ? undefined\n            : secret(\n                options.mavenGpgPrivateKeySecret ?? \"MAVEN_GPG_PRIVATE_KEY\"\n              ),\n          MAVEN_GPG_PRIVATE_KEY_PASSPHRASE: isGitHubPackages\n            ? undefined\n            : secret(\n                options.mavenGpgPrivateKeyPassphrase ??\n                  \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\"\n              ),\n          MAVEN_PASSWORD: secret(\n            options.mavenPassword ??\n              (isGitHubPackages ? \"GITHUB_TOKEN\" : \"MAVEN_PASSWORD\")\n          ),\n          MAVEN_USERNAME: isGitHubActor\n            ? \"${{ github.actor }}\"\n            : secret(options.mavenUsername ?? \"MAVEN_USERNAME\"),\n          MAVEN_STAGING_PROFILE_ID: isGitHubPackages\n            ? undefined\n            : secret(\n                options.mavenStagingProfileId ?? \"MAVEN_STAGING_PROFILE_ID\"\n              ),\n        },\n        permissions: {\n          contents: JobPermission.READ,\n          packages: isGitHubPackages ? JobPermission.WRITE : undefined,\n        },\n      })\n    );\n  }\n\n  /**\n   * Publishes wheel artifacts from `python` to PyPI.\n   * @param options Options\n   */\n  public publishToPyPi(options: PyPiPublishOptions = {}) {\n    this.addPublishJob(\n      (_branch, _branchOptions): PublishJobOptions => ({\n        name: \"pypi\",\n        registryName: \"PyPI\",\n        publishTools: PUBLIB_TOOLCHAIN.python,\n        prePublishSteps: options.prePublishSteps ?? [],\n        run: this.publibCommand(\"publib-pypi\"),\n        env: {\n          TWINE_REPOSITORY_URL: options.twineRegistryUrl,\n        },\n        workflowEnv: {\n          TWINE_USERNAME: secret(\n            options.twineUsernameSecret ?? \"TWINE_USERNAME\"\n          ),\n          TWINE_PASSWORD: secret(\n            options.twinePasswordSecret ?? \"TWINE_PASSWORD\"\n          ),\n        },\n      })\n    );\n  }\n\n  /**\n   * Adds a go publishing job.\n   * @param options Options\n   */\n  public publishToGo(options: GoPublishOptions = {}) {\n    const prePublishSteps = options.prePublishSteps ?? [];\n    const workflowEnv: { [name: string]: string | undefined } = {};\n    if (options.githubUseSsh) {\n      workflowEnv.GITHUB_USE_SSH = \"true\";\n      workflowEnv.SSH_AUTH_SOCK = \"/tmp/ssh_agent.sock\";\n      prePublishSteps.push({\n        name: \"Setup GitHub deploy key\",\n        run: 'ssh-agent -a ${SSH_AUTH_SOCK} && ssh-add - <<< \"${GITHUB_DEPLOY_KEY}\"',\n        env: {\n          GITHUB_DEPLOY_KEY: secret(\n            options.githubDeployKeySecret ?? \"GO_GITHUB_DEPLOY_KEY\"\n          ),\n          SSH_AUTH_SOCK: workflowEnv.SSH_AUTH_SOCK,\n        },\n      });\n    } else {\n      workflowEnv.GITHUB_TOKEN = secret(\n        options.githubTokenSecret ?? \"GO_GITHUB_TOKEN\"\n      );\n    }\n\n    this.addPublishJob(\n      (_branch, _branchOptions): PublishJobOptions => ({\n        name: \"golang\",\n        publishTools: PUBLIB_TOOLCHAIN.go,\n        prePublishSteps: prePublishSteps,\n        run: this.publibCommand(\"publib-golang\"),\n        registryName: \"GitHub Go Module Repository\",\n        env: {\n          GITHUB_REPO: options.githubRepo,\n          GIT_BRANCH: options.gitBranch,\n          GIT_USER_NAME:\n            options.gitUserName ?? DEFAULT_GITHUB_ACTIONS_USER.name,\n          GIT_USER_EMAIL:\n            options.gitUserEmail ?? DEFAULT_GITHUB_ACTIONS_USER.email,\n          GIT_COMMIT_MESSAGE: options.gitCommitMessage,\n        },\n        workflowEnv: workflowEnv,\n      })\n    );\n  }\n\n  private addPublishJob(\n    factory: (\n      branch: string,\n      branchOptions: Partial<BranchOptions>\n    ) => PublishJobOptions\n  ) {\n    this._jobFactories.push((branch, branchOptions) => {\n      const opts = factory(branch, branchOptions);\n      const jobname = `release_${opts.name}`;\n      if (jobname in this._jobFactories) {\n        throw new Error(`Duplicate job with name \"${jobname}\"`);\n      }\n\n      const commandToRun = this.dryRun\n        ? `echo \"DRY RUN: ${opts.run}\"`\n        : opts.run;\n      const requiredEnv = new Array<string>();\n\n      // jobEnv is the env we pass to the github job (task environment + secrets/expressions).\n      const jobEnv: Record<string, string> = { ...opts.env };\n      const workflowEnvEntries = Object.entries(opts.workflowEnv ?? {}).filter(\n        ([_, value]) => value != undefined\n      ) as string[][];\n      for (const [name, expression] of workflowEnvEntries) {\n        requiredEnv.push(name);\n        jobEnv[name] = expression;\n      }\n\n      if (this.publishTasks) {\n        const branchSuffix =\n          branch === \"main\" || branch === \"master\" ? \"\" : `:${branch}`;\n\n        // define a task which can be used through `projen publish:xxx`.\n        const task = this.project.addTask(\n          `publish:${opts.name.toLocaleLowerCase()}${branchSuffix}`,\n          {\n            description: `Publish this package to ${opts.registryName}`,\n            env: opts.env,\n            requiredEnv: requiredEnv,\n          }\n        );\n\n        // first verify that we are on the correct branch\n        task.exec(`test \"$(git branch --show-current)\" = \"${branch}\"`);\n\n        // run commands\n        task.exec(commandToRun);\n      }\n\n      const steps: JobStep[] = [\n        {\n          name: \"Download build artifacts\",\n          uses: \"actions/download-artifact@v3\",\n          with: {\n            name: BUILD_ARTIFACT_NAME,\n            path: ARTIFACTS_DOWNLOAD_DIR, // this must be \"dist\" for publib\n          },\n        },\n        ...opts.prePublishSteps,\n        {\n          name: \"Release\",\n          // it would have been nice if we could just run \"projen publish:xxx\" here but that is not possible because this job does not checkout sources\n          run: commandToRun,\n          env: jobEnv,\n        },\n      ];\n\n      const perms = opts.permissions ?? { contents: JobPermission.READ };\n\n      if (this.failureIssue) {\n        steps.push(\n          ...[\n            {\n              name: \"Extract Version\",\n              if: \"${{ failure() }}\",\n              id: \"extract-version\",\n              run: 'echo \"::set-output name=VERSION::$(cat dist/version.txt)\"',\n            },\n            {\n              name: \"Create Issue\",\n              if: \"${{ failure() }}\",\n              uses: \"imjohnbo/issue-bot@v3\",\n              with: {\n                labels: this.failureIssueLabel,\n                title: `Publishing v\\${{ steps.extract-version.outputs.VERSION }} to ${opts.registryName} failed`,\n                body: \"See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\",\n              },\n              env: {\n                GITHUB_TOKEN: \"${{ secrets.GITHUB_TOKEN }}\",\n              },\n            },\n          ]\n        );\n        Object.assign(perms, { issues: JobPermission.WRITE });\n      }\n\n      return {\n        [jobname]: {\n          tools: {\n            node: { version: this.workflowNodeVersion },\n            ...opts.publishTools,\n          },\n          name: `Publish to ${opts.registryName}`,\n          permissions: perms,\n          if: this.condition,\n          needs: [this.buildJobId],\n          runsOn: this.runsOn,\n          steps,\n        },\n      };\n    });\n  }\n\n  private publibCommand(command: string) {\n    return `npx -p publib@${this.publibVersion} ${command}`;\n  }\n}\n\nfunction secret(secretName: string) {\n  return `\\${{ secrets.${secretName} }}`;\n}\n\ninterface PublishJobOptions {\n  /**\n   * The command to execute.\n   */\n  readonly run: string;\n\n  /**\n   * Environment variables to set\n   */\n  readonly env?: Record<string, any>;\n\n  /**\n   * The display name of the registry (for description)\n   */\n  readonly registryName: string;\n\n  /**\n   * Job permissions\n   */\n  readonly permissions?: JobPermissions;\n\n  /**\n   * The name of the publish job (should be lowercase).\n   */\n  readonly name: string;\n\n  /**\n   * Environment to include only in the workflow (and not tasks).\n   */\n  readonly workflowEnv?: { [name: string]: string | undefined };\n\n  /**\n   * Steps to execute before the release command for preparing the dist/ output.\n   */\n  readonly prePublishSteps: JobStep[];\n\n  /**\n   * Tools setup for the workflow.\n   * @default - no tools are installed\n   */\n  readonly publishTools?: Tools;\n}\n\n/**\n * Common publishing options\n */\nexport interface CommonPublishOptions {\n  /**\n   * Steps to execute before executing the publishing command. These can be used\n   * to prepare the artifact for publishing if neede.\n   *\n   * These steps are executed after `dist/` has been populated with the build\n   * output.\n   *\n   * Note that when using this in `publishToGitHubReleases` this will override steps added via `addGitHubPrePublishingSteps`.\n   */\n  readonly prePublishSteps?: JobStep[];\n\n  /**\n   * Additional tools to install in the publishing job.\n   * @default - no additional tools are installed\n   */\n  readonly publishTools?: Tools;\n}\n\n/**\n * @deprecated Use `NpmPublishOptions` instead.\n */\nexport interface JsiiReleaseNpm extends NpmPublishOptions {}\n\n/**\n * Options for npm release\n */\nexport interface NpmPublishOptions extends CommonPublishOptions {\n  /**\n   * Tags can be used to provide an alias instead of version numbers.\n   *\n   * For example, a project might choose to have multiple streams of development\n   * and use a different tag for each stream, e.g., stable, beta, dev, canary.\n   *\n   * By default, the `latest` tag is used by npm to identify the current version\n   * of a package, and `npm install <pkg>` (without any `@<version>` or `@<tag>`\n   * specifier) installs the latest tag. Typically, projects only use the\n   * `latest` tag for stable release versions, and use other tags for unstable\n   * versions such as prereleases.\n   *\n   * The `next` tag is used by some projects to identify the upcoming version.\n   *\n   * @default \"latest\"\n   * @deprecated Use `npmDistTag` for each release branch instead.\n   */\n  readonly distTag?: string;\n\n  /**\n   * The domain name of the npm package registry.\n   *\n   * To publish to GitHub Packages, set this value to `\"npm.pkg.github.com\"`. In\n   * this if `npmTokenSecret` is not specified, it will default to\n   * `GITHUB_TOKEN` which means that you will be able to publish to the\n   * repository's package store. In this case, make sure `repositoryUrl` is\n   * correctly defined.\n   *\n   * @default \"registry.npmjs.org\"\n   * @example \"npm.pkg.github.com\"\n   */\n  readonly registry?: string;\n\n  /**\n   * GitHub secret which contains the NPM token to use when publishing packages.\n   * @default - \"NPM_TOKEN\" or \"GITHUB_TOKEN\" if `registry` is set to `npm.pkg.github.com`.\n   */\n  readonly npmTokenSecret?: string;\n\n  /**\n   * Options for publishing npm package to AWS CodeArtifact.\n   *\n   * @default - undefined\n   */\n  readonly codeArtifactOptions?: CodeArtifactOptions;\n}\n\nexport interface CodeArtifactOptions {\n  /**\n   * GitHub secret which contains the AWS access key ID to use when publishing packages to AWS CodeArtifact.\n   * This property must be specified only when publishing to AWS CodeArtifact (`registry` contains AWS CodeArtifact URL).\n   *\n   * @default \"AWS_ACCESS_KEY_ID\"\n   */\n  readonly accessKeyIdSecret?: string;\n\n  /**\n   * GitHub secret which contains the AWS secret access key to use when publishing packages to AWS CodeArtifact.\n   * This property must be specified only when publishing to AWS CodeArtifact (`registry` contains AWS CodeArtifact URL).\n   *\n   * @default \"AWS_SECRET_ACCESS_KEY\"\n   */\n  readonly secretAccessKeySecret?: string;\n\n  /**\n   * ARN of AWS role to be assumed prior to get authorization token from AWS CodeArtifact\n   * This property must be specified only when publishing to AWS CodeArtifact (`registry` contains AWS CodeArtifact URL).\n   *\n   * @default undefined\n   */\n  readonly roleToAssume?: string;\n}\n\n/**\n * @deprecated Use `PyPiPublishOptions` instead.\n */\nexport interface JsiiReleasePyPi extends PyPiPublishOptions {}\n\n/**\n * Options for PyPI release\n */\nexport interface PyPiPublishOptions extends CommonPublishOptions {\n  /**\n   * The registry url to use when releasing packages.\n   *\n   * @default - twine default\n   */\n  readonly twineRegistryUrl?: string;\n\n  /**\n   * The GitHub secret which contains PyPI user name.\n   * @default \"TWINE_USERNAME\"\n   */\n  readonly twineUsernameSecret?: string;\n\n  /**\n   * The GitHub secret which contains PyPI password.\n   * @default \"TWINE_PASSWORD\"\n   */\n  readonly twinePasswordSecret?: string;\n}\n\n/**\n * @deprecated Use `NugetPublishOptions` instead.\n */\nexport interface JsiiReleaseNuget extends NugetPublishOptions {}\n\n/**\n * Options for NuGet releases\n */\nexport interface NugetPublishOptions extends CommonPublishOptions {\n  /**\n   * GitHub secret which contains the API key for NuGet.\n   *\n   * @default \"NUGET_API_KEY\"\n   */\n  readonly nugetApiKeySecret?: string;\n\n  /**\n   *  NuGet Server URL (defaults to nuget.org)\n   */\n  readonly nugetServer?: string;\n}\n\n/**\n * @deprecated Use `MavenPublishOptions` instead.\n */\nexport interface JsiiReleaseMaven extends MavenPublishOptions {}\n\n/**\n * Options for Maven releases\n */\nexport interface MavenPublishOptions extends CommonPublishOptions {\n  /**\n   * URL of Nexus repository. if not set, defaults to https://oss.sonatype.org\n   *\n   * @default \"https://oss.sonatype.org\"\n   */\n  readonly mavenEndpoint?: string;\n\n  /**\n   * Used in maven settings for credential lookup (e.g. use github when publishing to GitHub).\n   *\n   * @default \"ossrh\" (Maven Central) or \"github\" when using GitHub Packages\n   */\n  readonly mavenServerId?: string;\n\n  /**\n   * Deployment repository when not deploying to Maven Central\n   *\n   * @default - not set\n   */\n  readonly mavenRepositoryUrl?: string;\n\n  /**\n   * GitHub secret name which contains the GPG private key or file that includes\n   * it. This is used to sign your Maven\n   * packages. See instructions.\n   *\n   * @see https://github.com/aws/publib#maven\n   * @default \"MAVEN_GPG_PRIVATE_KEY\" or not set when using GitHub Packages\n   */\n  readonly mavenGpgPrivateKeySecret?: string;\n\n  /**\n   * GitHub secret name which contains the GPG private key or file that includes\n   * it. This is used to sign your Maven packages. See instructions.\n   *\n   * @see https://github.com/aws/publib#maven\n   * @default \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\" or not set when using GitHub Packages\n   */\n  readonly mavenGpgPrivateKeyPassphrase?: string;\n\n  /**\n   * GitHub secret name which contains the Username for maven repository.\n   *\n   * For Maven Central, you will need to Create JIRA account and then request a\n   * new project (see links).\n   *\n   * @see https://issues.sonatype.org/secure/Signup\n   * @see https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134\n   *\n   * @default \"MAVEN_USERNAME\" or the GitHub Actor when using GitHub Packages\n   */\n  readonly mavenUsername?: string;\n\n  /**\n   * GitHub secret name which contains the Password for maven repository.\n   *\n   * For Maven Central, you will need to Create JIRA account and then request a\n   * new project (see links).\n   *\n   * @see https://issues.sonatype.org/secure/Signup\n   * @see https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134\n   *\n   * @default \"MAVEN_PASSWORD\" or \"GITHUB_TOKEN\" when using GitHub Packages\n   */\n  readonly mavenPassword?: string;\n\n  /**\n   * GitHub secret name which contains the Maven Central (sonatype) staging\n   * profile ID (e.g. 68a05363083174). Staging profile ID can be found in the\n   * URL of the \"Releases\" staging profile under \"Staging Profiles\" in\n   * https://oss.sonatype.org (e.g.\n   * https://oss.sonatype.org/#stagingProfiles;11a33451234521)\n\n   * @default \"MAVEN_STAGING_PROFILE_ID\" or not set when using GitHub Packages\n   */\n  readonly mavenStagingProfileId?: string;\n}\n\n/**\n * @deprecated Use `GoPublishOptions` instead.\n */\nexport interface JsiiReleaseGo extends GoPublishOptions {}\n\n/**\n * Options for Go releases.\n */\nexport interface GoPublishOptions extends CommonPublishOptions {\n  /**\n   * The name of the secret that includes a personal GitHub access token used to\n   * push to the GitHub repository.\n   *\n   * Ignored if `githubUseSsh` is `true`.\n   *\n   * @default \"GO_GITHUB_TOKEN\"\n   */\n  readonly githubTokenSecret?: string;\n\n  /**\n   * The name of the secret that includes a GitHub deploy key used to push to the\n   * GitHub repository.\n   *\n   * Ignored if `githubUseSsh` is `false`.\n   *\n   * @default \"GO_GITHUB_DEPLOY_KEY\"\n   */\n  readonly githubDeployKeySecret?: string;\n\n  /**\n   * Use SSH to push to GitHub instead of a personal accses token.\n   *\n   * @default false\n   */\n  readonly githubUseSsh?: boolean;\n\n  /**\n   * GitHub repository to push to.\n   *\n   * @default - derived from `moduleName`\n   */\n  readonly githubRepo?: string;\n\n  /**\n   * Branch to push to.\n   *\n   * @default \"main\"\n   */\n  readonly gitBranch?: string;\n\n  /**\n   * The user name to use for the release git commit.\n   * @default \"github-actions\"\n   */\n  readonly gitUserName?: string;\n\n  /**\n   * The email to use in the release git commit.\n   * @default \"github-actions@github.com\"\n   */\n  readonly gitUserEmail?: string;\n\n  /**\n   * The commit message.\n   *\n   * @default \"chore(release): $VERSION\"\n   */\n  readonly gitCommitMessage?: string;\n}\n\ninterface VersionArtifactOptions {\n  /**\n   * The location of a text file (relative to `dist/`) that contains the version number.\n   *\n   * @example version.txt\n   */\n  readonly versionFile: string;\n\n  /**\n   * The location of a text file (relative to `dist/`) that contains the release tag.\n   *\n   * @example releasetag.txt\n   */\n  readonly releaseTagFile: string;\n\n  /**\n   * The location of an .md file (relative to `dist/`) that includes the changelog for the release.\n   *\n   * @example changelog.md\n   */\n  readonly changelogFile: string;\n}\n\n/**\n * Evaluates if the `registryUrl` is a AWS CodeArtifact registry.\n * @param registryUrl url of registry\n * @returns true for AWS CodeArtifact\n */\nexport function isAwsCodeArtifactRegistry(registryUrl: string | undefined) {\n  return registryUrl && AWS_CODEARTIFACT_REGISTRY_REGEX.test(registryUrl);\n}\n\n/**\n * Publishing options for GitHub releases.\n */\nexport interface GitHubReleasesPublishOptions\n  extends VersionArtifactOptions,\n    CommonPublishOptions {}\n\n/**\n * Publishing options for Git releases\n */\nexport interface GitPublishOptions extends VersionArtifactOptions {\n  /**\n   * The location of an .md file that includes the project-level changelog.\n   */\n  readonly projectChangelogFile?: string;\n\n  /**\n   * Branch to push to.\n   *\n   * @default \"main\"\n   */\n  readonly gitBranch?: string;\n\n  /**\n   * Override git-push command.\n   *\n   * Set to an empty string to disable pushing.\n   */\n  readonly gitPushCommand?: string;\n}\n\ntype PublishJobFactory = (\n  branch: string,\n  branchOptions: Partial<BranchOptions>\n) => Record<string, Job>;\n"
  },
  {
    "path": "src/release/release-trigger.ts",
    "content": "export interface ScheduledReleaseOptions {\n  /**\n   * Cron schedule for releases.\n   *\n   * Only defined if this is a scheduled release.\n   *\n   * @example '0 17 * * *' - every day at 5 pm\n   */\n  readonly schedule: string;\n}\n\nexport interface ManualReleaseOptions {\n  /**\n   * Maintain a project-level changelog.\n   *\n   * @default true\n   */\n  readonly changelog?: boolean;\n\n  /**\n   * Project-level changelog file path.\n   *\n   * Ignored if `changelog` is false.\n   *\n   * @default 'CHANGELOG.md'\n   */\n  readonly changelogPath?: string;\n\n  /**\n   * Override git-push command.\n   *\n   * Set to an empty string to disable pushing.\n   */\n  readonly gitPushCommand?: string;\n}\n\ninterface ReleaseTriggerOptions {\n  /**\n   * Project-level changelog file path.\n   *\n   * Ignored if `changelog` is false\n   */\n  readonly changelogPath?: string;\n\n  /**\n   * Continuous releases, which will release every commit.\n   *\n   * @default false\n   */\n  readonly continuous?: boolean;\n\n  /**\n   * Cron schedule for release.\n   *\n   * Only defined if this is a scheduled release.\n   *\n   * @example '0 17 * * *' - every day at 5 pm\n   */\n  readonly schedule?: string;\n\n  /**\n   * Override git-push command.\n   *\n   * Set to an empty string to disable pushing.\n   */\n  readonly gitPushCommand?: string;\n}\n\n/**\n * Used to manage release strategies. This includes release\n * and release artifact automation\n */\nexport class ReleaseTrigger {\n  /**\n   * Creates a manual release trigger.\n   *\n   * Use this option if you want totally manual releases.\n   *\n   * This will give you a release task that, in addition to the normal\n   * release activities will trigger a `publish:git` task. This task will\n   * handle project-level changelog management, release tagging, and pushing\n   * these artifacts to origin.\n   *\n   * The command used for pushing can be customised by specifying\n   * `gitPushCommand`. Set to an empty string to disable pushing entirely.\n   *\n   * Simply run `yarn release` to trigger a manual release.\n   *\n   * @param options release options\n   */\n  public static manual(options: ManualReleaseOptions = {}) {\n    let changelogPath;\n\n    if (options.changelog ?? true) {\n      changelogPath = options.changelogPath ?? \"CHANGELOG.md\";\n    }\n\n    return new ReleaseTrigger({\n      changelogPath: changelogPath,\n      gitPushCommand: options.gitPushCommand,\n    });\n  }\n\n  /**\n   * Creates a scheduled release trigger.\n   *\n   * Automated releases will occur based on the provided cron schedule.\n   *\n   * @param options release options.\n   */\n  public static scheduled(options: ScheduledReleaseOptions) {\n    return new ReleaseTrigger({\n      schedule: options.schedule,\n    });\n  }\n\n  /**\n   * Creates a continuous release trigger.\n   *\n   * Automated releases will occur on every commit.\n   */\n  public static continuous() {\n    return new ReleaseTrigger({\n      continuous: true,\n    });\n  }\n\n  /**\n   * Project-level changelog file path.\n   */\n  public readonly changelogPath?: string;\n\n  /**\n   * Cron schedule for releases.\n   *\n   * Only defined if this is a scheduled release.\n   *\n   * @example '0 17 * * *' - every day at 5 pm\n   */\n  public readonly schedule?: string;\n\n  /**\n   * Whether or not this is a continuous release.\n   */\n  public readonly isContinuous: boolean;\n\n  /**\n   * Override git-push command used when releasing manually.\n   *\n   * Set to an empty string to disable pushing.\n   */\n  public readonly gitPushCommand?: string;\n\n  private constructor(options: ReleaseTriggerOptions = {}) {\n    this.isContinuous = options.continuous ?? false;\n    this.schedule = options.schedule;\n    this.changelogPath = options.changelogPath;\n    this.gitPushCommand = options.gitPushCommand;\n  }\n\n  /**\n   * Whether or not this is a manual release trigger.\n   */\n  public get isManual() {\n    return !(this.isContinuous || this.schedule);\n  }\n}\n"
  },
  {
    "path": "src/release/release.ts",
    "content": "import * as path from \"path\";\nimport { Component } from \"../component\";\nimport { GitHub, GitHubProject, GithubWorkflow, TaskWorkflow } from \"../github\";\nimport { BUILD_ARTIFACT_NAME } from \"../github/constants\";\nimport { Job, JobPermission, JobStep } from \"../github/workflows-model\";\nimport { Task } from \"../task\";\nimport { Version } from \"../version\";\nimport { Publisher } from \"./publisher\";\nimport { ReleaseTrigger } from \"./release-trigger\";\n\nconst BUILD_JOBID = \"release\";\nconst GIT_REMOTE_STEPID = \"git_remote\";\nconst LATEST_COMMIT_OUTPUT = \"latest_commit\";\n\ntype BranchHook = (branch: string) => void;\n\n/**\n * Project options for release.\n */\nexport interface ReleaseProjectOptions {\n  /**\n   * Automatically release new versions every commit to one of branches in `releaseBranches`.\n   *\n   * @default true\n   *\n   * @deprecated Use `releaseTrigger: ReleaseTrigger.continuous()` instead\n   */\n  readonly releaseEveryCommit?: boolean;\n\n  /**\n   * CRON schedule to trigger new releases.\n   *\n   * @default - no scheduled releases\n   *\n   * @deprecated Use `releaseTrigger: ReleaseTrigger.scheduled()` instead\n   */\n  readonly releaseSchedule?: string;\n\n  /**\n   * The release trigger to use.\n   *\n   * @default - Continuous releases (`ReleaseTrigger.continuous()`)\n   */\n  readonly releaseTrigger?: ReleaseTrigger;\n\n  /**\n   * A set of workflow steps to execute in order to setup the workflow\n   * container.\n   */\n  readonly releaseWorkflowSetupSteps?: JobStep[];\n\n  /**\n   * Container image to use for GitHub workflows.\n   *\n   * @default - default image\n   */\n  readonly workflowContainerImage?: string;\n\n  /**\n   * Version requirement of `publib` which is used to publish modules to npm.\n   * @default \"latest\"\n   */\n  readonly jsiiReleaseVersion?: string;\n\n  /**\n   * Steps to execute after build as part of the release workflow.\n   * @default []\n   */\n  readonly postBuildSteps?: JobStep[];\n\n  /**\n   * Major version to release from the default branch.\n   *\n   * If this is specified, we bump the latest version of this major version line.\n   * If not specified, we bump the global latest version.\n   *\n   * @default - Major version is not enforced.\n   */\n  readonly majorVersion?: number;\n\n  /**\n   * Minimal Major version to release\n   *\n   *\n   * This can be useful to set to 1, as breaking changes before the 1.x major\n   * release are not incrementing the major version number.\n   *\n   * Can not be set together with `majorVersion`.\n   *\n   * @default - No minimum version is being enforced\n   */\n  readonly minMajorVersion?: number;\n\n  /**\n   * Bump versions from the default branch as pre-releases (e.g. \"beta\",\n   * \"alpha\", \"pre\").\n   *\n   * @default - normal semantic versions\n   */\n  readonly prerelease?: string;\n\n  /**\n   * The npmDistTag to use when publishing from the default branch.\n   *\n   * To set the npm dist-tag for release branches, set the `npmDistTag` property\n   * for each branch.\n   *\n   * @default \"latest\"\n   */\n  readonly npmDistTag?: string;\n\n  /**\n   * The name of the default release workflow.\n   *\n   * @default \"Release\"\n   */\n  readonly releaseWorkflowName?: string;\n\n  /**\n   * Defines additional release branches. A workflow will be created for each\n   * release branch which will publish releases from commits in this branch.\n   * Each release branch _must_ be assigned a major version number which is used\n   * to enforce that versions published from that branch always use that major\n   * version. If multiple branches are used, the `majorVersion` field must also\n   * be provided for the default branch.\n   *\n   * @default - no additional branches are used for release. you can use\n   * `addBranch()` to add additional branches.\n   */\n  readonly releaseBranches?: { [name: string]: BranchOptions };\n\n  /**\n   * Create a github issue on every failed publishing task.\n   *\n   * @default false\n   */\n  readonly releaseFailureIssue?: boolean;\n\n  /**\n   * The label to apply to issues indicating publish failures.\n   * Only applies if `releaseFailureIssue` is true.\n   *\n   * @default \"failed-release\"\n   */\n  readonly releaseFailureIssueLabel?: string;\n\n  /**\n   * Automatically add the given prefix to release tags.\n   * Useful if you are releasing on multiple branches with overlapping\n   * version numbers.\n   *\n   * Note: this prefix is used to detect the latest tagged version\n   * when bumping, so if you change this on a project with an existing version\n   * history, you may need to manually tag your latest release\n   * with the new prefix.\n   *\n   * @default - no prefix\n   */\n  readonly releaseTagPrefix?: string;\n\n  /**\n   * Custom configuration used when creating changelog with standard-version package.\n   * Given values either append to default configuration or overwrite values in it.\n   *\n   * @default - standard configuration applicable for GitHub repositories\n   */\n  readonly versionrcOptions?: Record<string, any>;\n\n  /**\n   * Github Runner selection labels\n   * @default [\"ubuntu-latest\"]\n   */\n  readonly workflowRunsOn?: string[];\n\n  /**\n   * Define publishing tasks that can be executed manually as well as workflows.\n   *\n   * Normally, publishing only happens within automated workflows. Enable this\n   * in order to create a publishing task for each publishing activity.\n   *\n   * @default false\n   */\n  readonly publishTasks?: boolean;\n\n  /**\n   * Instead of actually publishing to package managers, just print the publishing command.\n   *\n   * @default false\n   */\n  readonly publishDryRun?: boolean;\n}\n\n/**\n * Options for `Release`.\n */\nexport interface ReleaseOptions extends ReleaseProjectOptions {\n  /**\n   * The task to execute in order to create the release artifacts. Artifacts are\n   * expected to reside under `artifactsDirectory` (defaults to `dist/`) once\n   * build is complete.\n   */\n  readonly task: Task;\n\n  /**\n   * A name of a .json file to set the `version` field in after a bump.\n   *\n   * @example \"package.json\"\n   */\n  readonly versionFile: string;\n\n  /**\n   * The default branch name to release from.\n   *\n   * Use `majorVersion` to restrict this branch to only publish releases with a\n   * specific major version.\n   *\n   * You can add additional branches using `addBranch()`.\n   */\n  readonly branch: string;\n\n  /**\n   * Create a GitHub release for each release.\n   *\n   * @default true\n   */\n  readonly githubRelease?: boolean;\n\n  /**\n   * A directory which will contain build artifacts.\n   *\n   * @default \"dist\"\n   */\n  readonly artifactsDirectory: string;\n\n  /**\n   * Node version to setup in GitHub workflows if any node-based CLI utilities\n   * are needed. For example `publib`, the CLI projen uses to publish releases,\n   * is an npm library.\n   *\n   * @default 14.x\n   */\n  readonly workflowNodeVersion?: string;\n}\n\n/**\n * Manages releases (currently through GitHub workflows).\n *\n * By default, no branches are released. To add branches, call `addBranch()`.\n */\nexport class Release extends Component {\n  public static readonly ANTI_TAMPER_CMD =\n    \"git diff --ignore-space-at-eol --exit-code\";\n  /**\n   * Returns the `Release` component of a project or `undefined` if the project\n   * does not have a Release component.\n   */\n  public static of(project: GitHubProject): Release | undefined {\n    const isRelease = (c: Component): c is Release => c instanceof Release;\n    return project.components.find(isRelease);\n  }\n\n  /**\n   * Package publisher.\n   */\n  public readonly publisher: Publisher;\n\n  private readonly buildTask: Task;\n  private readonly version: Version;\n  private readonly postBuildSteps: JobStep[];\n  private readonly versionFile: string;\n  private readonly releaseTrigger: ReleaseTrigger;\n  private readonly preBuildSteps: JobStep[];\n  private readonly containerImage?: string;\n  private readonly _branches = new Array<ReleaseBranch>();\n  private readonly jobs: Record<string, Job> = {};\n  private readonly defaultBranch: ReleaseBranch;\n  private readonly github?: GitHub;\n  private readonly workflowRunsOn?: string[];\n\n  private readonly _branchHooks: BranchHook[];\n\n  /**\n   * Location of build artifacts.\n   */\n  public readonly artifactsDirectory: string;\n\n  constructor(project: GitHubProject, options: ReleaseOptions) {\n    super(project);\n\n    if (Array.isArray(options.releaseBranches)) {\n      throw new Error(\n        '\"releaseBranches\" is no longer an array. See type annotations'\n      );\n    }\n\n    this.github = project.github;\n    this.buildTask = options.task;\n    this.preBuildSteps = options.releaseWorkflowSetupSteps ?? [];\n    this.postBuildSteps = options.postBuildSteps ?? [];\n    this.artifactsDirectory = options.artifactsDirectory ?? \"dist\";\n    this.versionFile = options.versionFile;\n    this.releaseTrigger = options.releaseTrigger ?? ReleaseTrigger.continuous();\n    this.containerImage = options.workflowContainerImage;\n    this.workflowRunsOn = options.workflowRunsOn;\n    this._branchHooks = [];\n\n    /**\n     * Use manual releases with no changelog if releaseEveryCommit is explicitly\n     * disabled and no other trigger is set.\n     *\n     * TODO: Remove this when releaseEveryCommit and releaseSchedule are removed\n     */\n    if (\n      !(\n        (options.releaseEveryCommit ?? true) ||\n        options.releaseSchedule ||\n        options.releaseTrigger\n      )\n    ) {\n      this.releaseTrigger = ReleaseTrigger.manual({ changelog: false });\n    }\n\n    if (options.releaseSchedule) {\n      this.releaseTrigger = ReleaseTrigger.scheduled({\n        schedule: options.releaseSchedule,\n      });\n    }\n\n    this.version = new Version(project, {\n      versionInputFile: this.versionFile,\n      artifactsDirectory: this.artifactsDirectory,\n      versionrcOptions: options.versionrcOptions,\n      tagPrefix: options.releaseTagPrefix,\n    });\n\n    this.publisher = new Publisher(project, {\n      artifactName: this.artifactsDirectory,\n      condition: `needs.${BUILD_JOBID}.outputs.${LATEST_COMMIT_OUTPUT} == github.sha`,\n      buildJobId: BUILD_JOBID,\n      jsiiReleaseVersion: options.jsiiReleaseVersion,\n      failureIssue: options.releaseFailureIssue,\n      failureIssueLabel: options.releaseFailureIssueLabel,\n      workflowRunsOn: options.workflowRunsOn,\n      publishTasks: options.publishTasks,\n      dryRun: options.publishDryRun,\n      workflowNodeVersion: options.workflowNodeVersion,\n    });\n\n    const githubRelease = options.githubRelease ?? true;\n    if (githubRelease) {\n      this.publisher.publishToGitHubReleases({\n        changelogFile: path.posix.join(\n          this.artifactsDirectory,\n          this.version.changelogFileName\n        ),\n        versionFile: path.posix.join(\n          this.artifactsDirectory,\n          this.version.versionFileName\n        ),\n        releaseTagFile: path.posix.join(\n          this.artifactsDirectory,\n          this.version.releaseTagFileName\n        ),\n      });\n    }\n\n    // add the default branch (we need the internal method which does not require majorVersion)\n    this.defaultBranch = this._addBranch(options.branch, {\n      prerelease: options.prerelease,\n      majorVersion: options.majorVersion,\n      minMajorVersion: options.minMajorVersion,\n      workflowName: options.releaseWorkflowName ?? \"release\",\n      tagPrefix: options.releaseTagPrefix,\n      npmDistTag: options.npmDistTag,\n    });\n\n    for (const [name, opts] of Object.entries(options.releaseBranches ?? {})) {\n      this.addBranch(name, opts);\n    }\n  }\n\n  /**\n   * Add a hook that should be run for every branch (including those that will\n   * be added by future `addBranch` calls).\n   * @internal\n   */\n  public _forEachBranch(hook: BranchHook) {\n    for (const branch of this._branches) {\n      hook(branch.name);\n    }\n    this._branchHooks.push(hook);\n  }\n\n  /**\n   * Adds a release branch.\n   *\n   * It is a git branch from which releases are published. If a project has more than one release\n   * branch, we require that `majorVersion` is also specified for the primary branch in order to\n   * ensure branches always release the correct version.\n   *\n   * @param branch The branch to monitor (e.g. `main`, `v2.x`)\n   * @param options Branch definition\n   */\n  public addBranch(branch: string, options: BranchOptions) {\n    this._addBranch(branch, options);\n\n    // run all branch hooks\n    for (const hook of this._branchHooks) {\n      hook(branch);\n    }\n  }\n\n  /**\n   * Adds a release branch.\n   *\n   * It is a git branch from which releases are published. If a project has more than one release\n   * branch, we require that `majorVersion` is also specified for the primary branch in order to\n   * ensure branches always release the correct version.\n   *\n   * @param branch The branch to monitor (e.g. `main`, `v2.x`)\n   * @param options Branch definition\n   */\n  private _addBranch(\n    branch: string,\n    options: Partial<BranchOptions>\n  ): ReleaseBranch {\n    if (this._branches.find((b) => b.name === branch)) {\n      throw new Error(`The release branch ${branch} is already defined`);\n    }\n\n    // if we add a branch, we require that the default branch will also define a\n    // major version.\n    if (\n      this.defaultBranch &&\n      options.majorVersion &&\n      this.defaultBranch.majorVersion === undefined\n    ) {\n      throw new Error(\n        'you must specify \"majorVersion\" for the default branch when adding multiple release branches'\n      );\n    }\n\n    const releaseBranch: ReleaseBranch = {\n      name: branch,\n      ...options,\n      workflow: this.createWorkflow(branch, options),\n    };\n\n    this._branches.push(releaseBranch);\n\n    return releaseBranch;\n  }\n\n  public preSynthesize() {\n    for (const branch of this._branches) {\n      if (!branch.workflow) {\n        continue;\n      }\n\n      branch.workflow.addJobs(\n        this.publisher._renderJobsForBranch(branch.name, branch)\n      );\n      branch.workflow.addJobs(this.jobs);\n    }\n  }\n\n  /**\n   * Adds jobs to all release workflows.\n   * @param jobs The jobs to add (name => job)\n   */\n  public addJobs(jobs: Record<string, Job>) {\n    for (const [name, job] of Object.entries(jobs)) {\n      this.jobs[name] = job;\n    }\n  }\n\n  /**\n   * Retrieve all release branch names\n   */\n  public get branches(): string[] {\n    return this._branches.map((b) => b.name);\n  }\n\n  /**\n   * @returns a workflow or `undefined` if github integration is disabled.\n   */\n  private createWorkflow(\n    branchName: string,\n    branch: Partial<BranchOptions>\n  ): TaskWorkflow | undefined {\n    const workflowName = branch.workflowName ?? `release-${branchName}`;\n\n    // to avoid race conditions between two commits trying to release the same\n    // version, we check if the head sha is identical to the remote sha. if\n    // not, we will skip the release and just finish the build.\n    const noNewCommits = `\\${{ steps.${GIT_REMOTE_STEPID}.outputs.${LATEST_COMMIT_OUTPUT} == github.sha }}`;\n\n    // The arrays are being cloned to avoid accumulating values from previous branches\n    const preBuildSteps = [...this.preBuildSteps];\n\n    const env: Record<string, string> = {\n      RELEASE: \"true\",\n    };\n\n    if (branch.majorVersion !== undefined) {\n      env.MAJOR = branch.majorVersion.toString();\n    }\n\n    if (branch.prerelease) {\n      env.PRERELEASE = branch.prerelease;\n    }\n\n    if (branch.tagPrefix) {\n      env.RELEASE_TAG_PREFIX = branch.tagPrefix;\n    }\n\n    // the \"release\" task prepares a release but does not publish anything. the\n    // output of the release task is: `dist`, `.version.txt`, and\n    // `.changelog.md`. this is what publish tasks expect.\n\n    // if this is the release for \"main\" or \"master\", just call it \"release\".\n    // otherwise, \"release:BRANCH\"\n    const releaseTaskName =\n      branchName === \"main\" || branchName === \"master\"\n        ? \"release\"\n        : `release:${branchName}`;\n    const releaseTask = this.project.addTask(releaseTaskName, {\n      description: `Prepare a release from \"${branchName}\" branch`,\n      env,\n    });\n\n    releaseTask.exec(`rm -fr ${this.artifactsDirectory}`);\n    releaseTask.spawn(this.version.bumpTask);\n    releaseTask.spawn(this.buildTask);\n    releaseTask.spawn(this.version.unbumpTask);\n\n    // anti-tamper check (fails if there were changes to committed files)\n    // this will identify any non-committed files generated during build (e.g. test snapshots)\n    releaseTask.exec(Release.ANTI_TAMPER_CMD);\n\n    if (this.releaseTrigger.isManual) {\n      const publishTask = this.publisher.publishToGit({\n        changelogFile: path.posix.join(\n          this.artifactsDirectory,\n          this.version.changelogFileName\n        ),\n        versionFile: path.posix.join(\n          this.artifactsDirectory,\n          this.version.versionFileName\n        ),\n        releaseTagFile: path.posix.join(\n          this.artifactsDirectory,\n          this.version.releaseTagFileName\n        ),\n        projectChangelogFile: this.releaseTrigger.changelogPath,\n        gitBranch: branchName,\n        gitPushCommand: this.releaseTrigger.gitPushCommand,\n      });\n\n      releaseTask.spawn(publishTask);\n    }\n\n    const postBuildSteps = [...this.postBuildSteps];\n\n    // check if new commits were pushed to the repo while we were building.\n    // if new commits have been pushed, we will cancel this release\n    postBuildSteps.push({\n      name: \"Check for new commits\",\n      id: GIT_REMOTE_STEPID,\n      run: `echo ::set-output name=${LATEST_COMMIT_OUTPUT}::\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\"`,\n    });\n\n    postBuildSteps.push({\n      name: \"Upload artifact\",\n      if: noNewCommits,\n      uses: \"actions/upload-artifact@v2.1.1\",\n      with: {\n        name: BUILD_ARTIFACT_NAME,\n        path: this.artifactsDirectory,\n      },\n    });\n\n    if (this.github && !this.releaseTrigger.isManual) {\n      return new TaskWorkflow(this.github, {\n        name: workflowName,\n        jobId: BUILD_JOBID,\n        outputs: {\n          latest_commit: {\n            stepId: GIT_REMOTE_STEPID,\n            outputName: LATEST_COMMIT_OUTPUT,\n          },\n        },\n        triggers: {\n          schedule: this.releaseTrigger.schedule\n            ? [{ cron: this.releaseTrigger.schedule }]\n            : undefined,\n          push: this.releaseTrigger.isContinuous\n            ? { branches: [branchName] }\n            : undefined,\n        },\n        container: this.containerImage\n          ? { image: this.containerImage }\n          : undefined,\n        env: {\n          CI: \"true\",\n        },\n        permissions: {\n          contents: JobPermission.WRITE,\n        },\n        checkoutWith: {\n          // we must use 'fetch-depth=0' in order to fetch all tags\n          // otherwise tags are not checked out\n          \"fetch-depth\": 0,\n        },\n        preBuildSteps,\n        task: releaseTask,\n        postBuildSteps,\n        runsOn: this.workflowRunsOn,\n      });\n    } else {\n      return undefined;\n    }\n  }\n}\n\n/**\n * Options for a release branch.\n */\nexport interface BranchOptions {\n  /**\n   * The name of the release workflow.\n   * @default \"release-BRANCH\"\n   */\n  readonly workflowName?: string;\n\n  /**\n   * The major versions released from this branch.\n   */\n  readonly majorVersion: number;\n\n  /**\n   * The minimum major version to release.\n   */\n  readonly minMajorVersion?: number;\n\n  /**\n   * Bump the version as a pre-release tag.\n   *\n   * @default - normal releases\n   */\n  readonly prerelease?: string;\n\n  /**\n   * Automatically add the given prefix to release tags.\n   * Useful if you are releasing on multiple branches with overlapping\n   * version numbers.\n   *\n   * Note: this prefix is used to detect the latest tagged version\n   * when bumping, so if you change this on a project with an existing version\n   * history, you may need to manually tag your latest release\n   * with the new prefix.\n   *\n   * @default - no prefix\n   */\n  readonly tagPrefix?: string;\n\n  /**\n   * The npm distribution tag to use for this branch.\n   *\n   * @default \"latest\"\n   */\n  readonly npmDistTag?: string;\n}\n\ninterface ReleaseBranch extends Partial<BranchOptions> {\n  readonly workflow?: GithubWorkflow;\n  readonly name: string;\n}\n"
  },
  {
    "path": "src/release/reset-version.task.ts",
    "content": "// a builtin task that sets the \"version\" field of the file\n// specified in OUTFILE to \"0.0.0\"\n\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { pathExistsSync } from \"fs-extra\";\n\nconst outfile = process.env.OUTFILE;\nif (!outfile) {\n  throw new Error(\"OUTFILE is required\");\n}\n\nif (!pathExistsSync(outfile)) {\n  process.exit(0); // nothing to do\n}\n\nconst content = JSON.parse(readFileSync(outfile, \"utf8\"));\ncontent.version = \"0.0.0\";\nwriteFileSync(outfile, JSON.stringify(content, undefined, 2));\n"
  },
  {
    "path": "src/release/tag-version.task.ts",
    "content": "/**\n * Generate an annotated release tag using version and changelog files.\n *\n * The tag from the release tag from the release tag file will be used as is.\n *\n * The tag annotation message will be set to the content of the provided changelog\n * file.\n *\n * Environment variables:\n *\n * - RELEASE_TAG_FILE: Release Tag file containing the bumped release tag\n * - CHANGELOG_FILE: Changelog to be used for tag annotation\n *\n */\nimport { tag, TagOptions } from \"./tag-version\";\n\nconst changelog = process.env.CHANGELOG;\nconst releaseTagFile = process.env.RELEASE_TAG_FILE;\n\nif (!releaseTagFile) {\n  throw new Error(\"RELEASE_TAG_FILE is required\");\n}\n\nif (!changelog) {\n  throw new Error(\"CHANGELOG is required\");\n}\n\nconst opts: TagOptions = {\n  changelog,\n  releaseTagFile: releaseTagFile,\n};\n\ntag(process.cwd(), opts).catch((e: Error) => {\n  console.log(e.stack);\n  process.exit(1);\n});\n"
  },
  {
    "path": "src/release/tag-version.ts",
    "content": "import { join } from \"path\";\nimport { pathExists } from \"fs-extra\";\nimport * as utils from \"../util\";\n\nexport interface TagOptions {\n  /**\n   * Path to release tag file housing the release version.\n   *\n   * Relative to cwd.\n   *\n   * @example `dist/releaseTag.txt`\n   */\n  readonly releaseTagFile: string;\n\n  /**\n   * Path to release-specific changelog file.\n   *\n   * Relative to cwd.\n   *\n   * @example `dist/changelog.md`\n   */\n  readonly changelog: string;\n}\n\n/**\n * Generate an annotated release tag using version and changelog files.\n *\n * The tag will be normalized to the format \"v<version>\" where version comes\n * from the provided version file.\n *\n * The tag annotation message will be set to the content of the provided release\n * changelog file.\n *\n * @param cwd working directory (git repository)\n * @param options options\n */\nexport async function tag(cwd: string, options: TagOptions) {\n  const git = (cmd: string) => utils.exec(`git ${cmd}`, { cwd: cwd });\n\n  const releaseTagFilePath = join(cwd, options.releaseTagFile);\n  const changelogFilePath = join(cwd, options.changelog);\n\n  if (!pathExists(releaseTagFilePath)) {\n    throw new Error(`No release tag file present at ${releaseTagFilePath}`);\n  }\n\n  if (!pathExists(changelogFilePath)) {\n    throw new Error(`No changelog file present at ${changelogFilePath}`);\n  }\n\n  let releaseTag = (await utils.tryReadFile(releaseTagFilePath)).trim();\n\n  if (!releaseTag) {\n    throw new Error(`No version present in file at ${releaseTagFilePath}`);\n  }\n\n  git(`tag ${releaseTag} -a -F ${changelogFilePath}`);\n}\n"
  },
  {
    "path": "src/release/update-changelog.task.ts",
    "content": "/**\n * Prepends the release changelog entry onto the provided project-level changelog\n *\n * Currently assumes a headerless changelog formatted according to\n * [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog)\n * rules.\n *\n * Environment variables:\n *\n * - VERSION_FILE: Current semantic version file\n * - CHANGELOG_FILE: Release changelog\n * - PROJECT_CHANGELOG_FILE: Project-level changelog\n *\n */\nimport { updateChangelog, UpdateChangelogOptions } from \"./update-changelog\";\n\nconst inputChangelog = process.env.CHANGELOG;\nconst outputChangelog = process.env.PROJECT_CHANGELOG_FILE;\nconst versionFile = process.env.VERSION_FILE;\n\nif (!versionFile) {\n  throw new Error(\"VERSION_FILE is required\");\n}\n\nif (!inputChangelog) {\n  throw new Error(\"CHANGELOG is required\");\n}\n\nif (!outputChangelog) {\n  throw new Error(\"PROJECT_CHANGELOG_FILE is required\");\n}\n\nconst opts: UpdateChangelogOptions = {\n  inputChangelog,\n  outputChangelog,\n  versionFile: versionFile,\n};\n\nupdateChangelog(process.cwd(), opts).catch((e: Error) => {\n  console.log(e.stack);\n  process.exit(1);\n});\n"
  },
  {
    "path": "src/release/update-changelog.ts",
    "content": "import { join } from \"path\";\nimport { readFile, writeFile } from \"fs-extra\";\nimport * as logging from \"../logging\";\nimport * as utils from \"../util\";\n\nexport interface UpdateChangelogOptions {\n  /**\n   * Path to input changelog entry file.\n   *\n   * Relative to cwd.\n   *\n   * @example dist/changelog.md\n   */\n  inputChangelog: string;\n\n  /**\n   * Path to project-level changelog.\n   *\n   * The contents of inputChangelog will be prepended onto\n   * this changelog.\n   *\n   * Relative to cwd\n   *\n   * @example changelog.md\n   */\n  outputChangelog: string;\n\n  /**\n   * Release version.\n   */\n  versionFile: string;\n}\n\n/**\n * Prepends input changelog entry onto project-level changelog.\n *\n * Currently assumes a headerless changelog formatted according to\n * [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog)\n * rules.\n *\n * @param cwd working directory (git repository)\n * @param options options\n */\nexport async function updateChangelog(\n  cwd: string,\n  options: UpdateChangelogOptions\n) {\n  const inputChangelog = join(cwd, options.inputChangelog);\n  const outputChangelog = join(cwd, options.outputChangelog);\n  const versionFile = join(cwd, options.versionFile);\n\n  let version = (await utils.tryReadFile(versionFile)).trim();\n\n  if (!version) {\n    throw new Error(\n      `Unable to determine version from ${versionFile}. Cannot proceed with changelog update. Did you run 'bump'?`\n    );\n  }\n\n  const inputChangelogContent = await readFile(inputChangelog, \"utf-8\");\n  const changelogVersionSearchPattern = `${version}`;\n\n  if (!inputChangelogContent.includes(changelogVersionSearchPattern)) {\n    throw new Error(\n      `Supplied version ${version} was not found in input changelog. You may want to check it's content.`\n    );\n  }\n\n  const outputChangelogContent = await readFile(outputChangelog, {\n    encoding: \"utf-8\",\n    flag: \"a+\",\n  });\n\n  if (outputChangelogContent.indexOf(changelogVersionSearchPattern) > -1) {\n    logging.info(\n      `Changelog already contains an entry for ${version}. Skipping changelog update.`\n    );\n    return;\n  }\n\n  const newChangelog =\n    inputChangelogContent.trimEnd() +\n    \"\\n\\n\" +\n    outputChangelogContent.trimStart();\n\n  await writeFile(outputChangelog, newChangelog);\n\n  utils.exec(\n    `git add ${outputChangelog} && git commit -m \"chore(release): ${version}\"`,\n    { cwd }\n  );\n}\n"
  },
  {
    "path": "src/renovatebot.ts",
    "content": "import { Component } from \"./component\";\nimport { JsonFile } from \"./json\";\nimport { Project } from \"./project\";\n\n/**\n * Options for Renovatebot\n */\nexport interface RenovatebotOptions {\n  /**\n   * How often to check for new versions and raise pull requests.\n   *\n   * Can be given in CRON or LATER format, and use multiple schedules\n   * (e.g. different for weekdays and weekends). Multiple rules are\n   * handles as OR.\n   *\n   * Some normal scheduling values defined in enum `RenovatebotScheduleInterval`.\n   *\n   * @see https://docs.renovatebot.com/configuration-options/#schedule\n   * @default [\"at any time\"]\n   */\n  readonly scheduleInterval?: string[];\n\n  /**\n   * You can use the `ignore` option to customize which dependencies are updated.\n   * The ignore option supports just package name.\n   * @default []\n   */\n  readonly ignore?: string[];\n\n  /**\n   * Ignores updates to `projen`.\n   *\n   * This is required since projen updates may cause changes in committed files\n   * and anti-tamper checks will fail.\n   *\n   * Projen upgrades are covered through the `ProjenUpgrade` class.\n   *\n   * @default true\n   */\n  readonly ignoreProjen?: boolean;\n\n  /**\n   * List of labels to apply to the created PR's.\n   */\n  readonly labels?: string[];\n}\n\n/**\n * How often to check for new versions and raise pull requests for version\n * updates.\n *\n * @see https://docs.renovatebot.com/presets-schedule/\n */\nexport enum RenovatebotScheduleInterval {\n  /**\n   * Run at any time\n   */\n  ANY_TIME = \"at any time\",\n\n  /**\n   * Weekly schedule on early monday mornings\n   */\n  EARLY_MONDAYS = \"before 3am on Monday\",\n\n  /**\n   * Schedule daily\n   */\n  DAILY = \"before 2am\",\n\n  /**\n   * Schedule weekly\n   */\n  WEEKLY = EARLY_MONDAYS,\n\n  /**\n   * Schedule monthly\n   */\n  MONTHLY = \"before 3am on the first day of the month\",\n\n  /**\n   * Schedule quarterly\n   */\n  QUARTERLY = \"every 3 months on the first day of the month\",\n\n  /**\n   * Schedule for weekends\n   */\n  WEEKENDS = \"every weekend\",\n\n  /**\n   * Schedule for weekdays\n   */\n  WEEKDAYS = \"every weekday\",\n}\n\n/**\n * Defines renovatebot configuration for projen project.\n *\n * Ignores the versions controlled by Projen.\n */\nexport class Renovatebot extends Component {\n  private readonly _project: Project;\n\n  private readonly explicitIgnores: string[];\n\n  private readonly scheduleInterval: string[];\n\n  private readonly labels?: string[];\n\n  constructor(project: Project, options: RenovatebotOptions = {}) {\n    super(project);\n\n    this._project = project;\n    this.explicitIgnores = options.ignore ?? [];\n    this.labels = options.labels;\n    this.scheduleInterval = options.scheduleInterval ?? [\n      RenovatebotScheduleInterval.ANY_TIME,\n    ];\n    (options.ignoreProjen ?? true) && this.explicitIgnores.push(\"projen\");\n  }\n\n  // create actual file only here, so we know that all dependencies are added to the project\n  public preSynthesize() {\n    this.createRenovateConfiguration();\n  }\n\n  private createRenovateConfiguration() {\n    const renovateIgnore = [\n      ...new Set(\n        this._project.deps.all\n          .filter((dep) => dep.version)\n          .map((dep) => dep.name)\n          .concat(this.explicitIgnores)\n      ),\n    ];\n\n    const config = {\n      labels: this.labels,\n      schedule: this.scheduleInterval,\n      extends: [\n        \":preserveSemverRanges\",\n        \"config:base\",\n        \"group:allNonMajor\",\n        \"group:recommended\",\n        \"group:monorepos\",\n      ],\n      packageRules: [\n        {\n          matchDepTypes: [\"devDependencies\"],\n          matchUpdateTypes: [\"patch\", \"minor\"],\n          groupName: \"devDependencies (non-major)\",\n        },\n      ],\n      ignoreDeps: renovateIgnore,\n    };\n\n    new JsonFile(this._project, \"renovate.json5\", {\n      obj: config,\n      committed: true,\n    });\n  }\n}\n"
  },
  {
    "path": "src/run-projenrc-json.task.ts",
    "content": "/**\n * Parses a projenrc.json file, uses it to generate a corresponding\n * projenrc.js file, and then run it to synthesize its contents.\n *\n * Environment variables:\n *\n * - PROJENRC_FILE: (optional) the name of the JSON file to parse from.\n *   Defaults to `.projenrc.json`.\n */\nimport * as fs from \"fs-extra\";\nimport { InitProjectOptionHints } from \"./option-hints\";\nimport { Projects } from \"./projects\";\n\nlet filename = process.env.PROJENRC_FILE;\n\nif (!filename || filename == \"\") {\n  filename = \".projenrc.json\";\n}\n\nconst { type, ...json } = fs.readJsonSync(filename, { encoding: \"utf8\" });\nif (!type) {\n  throw new Error(\n    'projenrc.json requires a \"type\" field with the fully qualified type name. e.g. projen.web.ReactProject'\n  );\n}\n\nProjects.createProject({\n  dir: \".\",\n  projectFqn: type,\n  projectOptions: json,\n  optionHints: InitProjectOptionHints.NONE,\n  synth: true,\n  post: false,\n});\n"
  },
  {
    "path": "src/sample-file.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport * as glob from \"glob\";\nimport { Component } from \"./component\";\nimport { Project } from \"./project\";\nimport { getFilePermissions, writeFile } from \"./util\";\n\n/**\n * Options for the SampleFile object.\n */\nexport interface SampleFileOptions {\n  /**\n   * The contents of the file to write.\n   */\n  readonly contents?: string;\n\n  /**\n   * Absolute path to a file to copy the contents from (does not need to be\n   * a text file).\n   *\n   * If your project is Typescript-based and has configured `testdir` to be a\n   * subdirectory of `src`, sample files should outside of the `src` directory,\n   * otherwise they may not be copied. For example:\n   * ```\n   * new SampleFile(this, 'assets/icon.png', { source: path.join(__dirname, '..', 'sample-assets', 'icon.png') });\n   * ```\n   */\n  readonly sourcePath?: string;\n}\n\n/**\n * Produces a file with the given contents but only once, if the file doesn't already exist.\n * Use this for creating example code files or other resources.\n */\nexport class SampleFile extends Component {\n  private readonly filePath: string;\n  private readonly options: SampleFileOptions;\n\n  /**\n   * Creates a new SampleFile object\n   * @param project - the project to tie this file to.\n   * @param filePath - the relative path in the project to put the file\n   * @param options - the options for the file.\n   */\n  constructor(project: Project, filePath: string, options: SampleFileOptions) {\n    super(project);\n\n    if (options.contents && options.sourcePath) {\n      throw new Error(\"Cannot specify both 'contents' and 'source' fields.\");\n    }\n    if (!options.contents && !options.sourcePath) {\n      throw new Error(\"Must specify at least one of 'contents' or 'source'.\");\n    }\n    this.filePath = filePath;\n    this.options = options;\n  }\n\n  public synthesize() {\n    let contents;\n    if (this.options.contents) {\n      contents = this.options.contents;\n    } else if (this.options.sourcePath) {\n      contents = fs.readFileSync(this.options.sourcePath);\n    }\n    this.writeOnceFileContents(\n      this.project.outdir,\n      this.filePath,\n      contents ?? \"\"\n    );\n  }\n\n  /**\n   * A helper function that will write the file once and return if it was written or not.\n   * @param dir - the directory for the new file\n   * @param filename - the filename for the new file\n   * @param contents - the contents of the file to write\n   * @return boolean - whether a new file was written or not.\n   * @private\n   */\n  private writeOnceFileContents(dir: string, filename: string, contents: any) {\n    const fullFilename = path.join(dir, filename);\n    if (fs.existsSync(fullFilename)) {\n      return;\n    }\n    writeFile(fullFilename, contents, { readonly: false });\n  }\n}\n\n/**\n * SampleDir options\n */\nexport interface SampleDirOptions {\n  /**\n   * The files to render into the directory. These files get added after\n   * any files from `source` if that option is specified (replacing if names\n   * overlap).\n   */\n  readonly files?: { [fileName: string]: string };\n\n  /**\n   * Absolute path to a directory to copy files from (does not need to be text\n   * files).\n   *\n   * If your project is typescript-based and has configured `testdir` to be a\n   * subdirectory of `src`, sample files should outside of the `src` directory\n   * otherwise they may not be copied. For example:\n   * ```\n   * new SampleDir(this, 'public', { source: path.join(__dirname, '..', 'sample-assets') });\n   * ```\n   */\n  readonly sourceDir?: string;\n}\n\n/**\n * Renders the given files into the directory if the directory does not exist. Use this to create sample code files\n */\nexport class SampleDir extends Component {\n  private readonly dir: string;\n  private readonly options: SampleDirOptions;\n\n  /**\n   * Create sample files in the given directory if the given directory does not exist\n   * @param project Parent project to add files to.\n   * @param dir directory to add files to. If directory already exists, nothing is added.\n   * @param options options for which files to create.\n   */\n  constructor(project: Project, dir: string, options: SampleDirOptions) {\n    super(project);\n    if (!options.files && !options.sourceDir) {\n      throw new Error(\"Must specify at least one of 'files' or 'source'.\");\n    }\n\n    this.dir = dir;\n    this.options = options;\n  }\n\n  public synthesize() {\n    const fullOutdir = path.join(this.project.outdir, this.dir);\n    if (fs.pathExistsSync(fullOutdir)) {\n      return;\n    }\n\n    if (this.options.sourceDir) {\n      const basedir = this.options.sourceDir;\n      const files = glob.sync(\"**\", {\n        cwd: basedir,\n        nodir: true,\n        dot: true,\n      }); // returns relative file paths with POSIX separators\n\n      for (const file of files) {\n        const sourcePath = path.join(basedir, file);\n        const targetPath = path.join(fullOutdir, file);\n\n        fs.mkdirpSync(path.dirname(targetPath));\n        fs.copyFileSync(sourcePath, targetPath);\n        fs.chmodSync(\n          targetPath,\n          getFilePermissions({ readonly: false, executable: false })\n        );\n      }\n    }\n\n    for (const filename in this.options.files) {\n      writeFile(path.join(fullOutdir, filename), this.options.files[filename]);\n    }\n  }\n}\n"
  },
  {
    "path": "src/semver.ts",
    "content": "import * as semver from \"semver\";\n\n/**\n * @deprecated This class will be removed in upcoming releases. if you wish to\n * specify semver requirements in `deps`, `devDeps`, etc, specify them like so\n * `express@^2.1`.\n */\nexport class Semver {\n  public static of(spec: string) {\n    return new Semver(spec);\n  }\n\n  /**\n   * Latest version.\n   */\n  public static latest() {\n    return new Semver(\"*\");\n  }\n\n  /**\n   * Accept only an exact version\n   */\n  public static pinned(version: string) {\n    return new Semver(version);\n  }\n\n  /**\n   * Accept any minor version.\n   *\n   * >= version\n   * < next major version\n   */\n  public static caret(version: string) {\n    return new Semver(`^${version}`);\n  }\n\n  /**\n   * Accept patches.\n   *\n   * >= version\n   * < next minor version\n   */\n  public static tilde(version: string) {\n    return new Semver(`~${version}`);\n  }\n\n  public readonly mode?: string;\n\n  private constructor(public readonly spec: string) {}\n\n  public get version() {\n    return semver.minVersion(this.spec)?.version;\n  }\n}\n"
  },
  {
    "path": "src/smithy/smithy-build.ts",
    "content": "import { Component } from \"../component\";\nimport { JsonFile } from \"../json\";\nimport { Project } from \"../project\";\n\ntype Transform = {\n  name: string;\n  args: Record<string, any>;\n};\ntype SmithyCommon = {\n  imports?: string[];\n  plugins?: PluginsType;\n};\ntype PluginValue = {\n  service?: string;\n  [key: string]: any;\n};\nexport type ProjectionValue = SmithyCommon & {\n  abstract?: boolean;\n  transforms?: Transform[];\n};\nexport type ProjectionKey = string;\nexport type ProjectionsType = Record<ProjectionKey, ProjectionValue>;\nexport type PluginKey = string;\nexport type PluginsType = Record<PluginKey, PluginValue>;\n\n/**\n * Options for `SmithyBuild`\n */\nexport interface SmithyBuildOptions extends SmithyCommon {\n  /**\n   * Defines the version of smithy-build.\n   * @default \"1.0\"\n   */\n  readonly version?: string;\n  /**\n   * Specifies a location where smithy projections are written.\n   * @default - no output directory\n   */\n  readonly outputDirectory?: string;\n  /**\n   * Map of projections name to projection configurations\n   * https://awslabs.github.io/smithy/1.0/guides/building-models/build-config.html#projections\n   * @default - no projections\n   */\n  readonly projections?: ProjectionsType;\n  /**\n   * If a plugin can't be found, Smithy will by default fail the build.\n   * This setting can be set to true to allow the build to progress\n   * even if a plugin can't be found on the classpath.\n   *\n   * @default - no ignoreMissingPlugins set in the smithy-build.json file\n   */\n  readonly ignoreMissingPlugins?: boolean;\n}\n\n/**\n * Smithy build configuration options\n */\nexport class SmithyBuild extends Component {\n  /**\n   * Defines the version of smithy-build.\n   * @default \"1.0\"\n   */\n  public readonly version: string;\n\n  /**\n   * Specifies a location where smithy projections are written.\n   * @default - no output directory\n   */\n  public readonly outputDirectory?: string;\n\n  /**\n   * List of imports relative to the location of smithy-build.json file.\n   * @default no imports\n   */\n  private _imports?: string[];\n\n  /**\n   * If a plugin can't be found, Smithy will by default fail the build.\n   * This setting can be set to true to allow the build to progress\n   * even if a plugin can't be found on the classpath.\n   *\n   * @default - no ignoreMissingPlugins set in the smithy-build.json file\n   */\n  public readonly ignoreMissingPlugins?: boolean;\n\n  /**\n   * Map of projections name to projection configurations\n   * https://awslabs.github.io/smithy/1.0/guides/building-models/build-config.html#projections\n   * @default - no projections\n   */\n  private _projections?: ProjectionsType;\n  /**\n   * Map of plugin name to plugin configurations\n   * https://awslabs.github.io/smithy/1.0/guides/building-models/build-config.html#plugins\n   * @default - no plugins\n   */\n  private _plugins?: PluginsType;\n\n  private readonly manifest: any;\n\n  constructor(project: Project, options: SmithyBuildOptions = {}) {\n    super(project);\n\n    this.version = options.version ?? \"1.0\";\n    this.outputDirectory = options.outputDirectory;\n    this._imports = options.imports;\n    this._projections = options.projections;\n    this._plugins = options.plugins;\n    this.ignoreMissingPlugins = options.ignoreMissingPlugins;\n\n    this.manifest = {\n      version: this.version,\n      outputDirectory: this.outputDirectory,\n      imports: () => this._imports,\n      projections: () => this._projections,\n      plugins: () => this._plugins,\n      ignoreMissingPlugins: this.ignoreMissingPlugins,\n    };\n\n    new JsonFile(this.project, \"smithy-build.json\", {\n      obj: this.manifest,\n      readonly: true, // we want \"yarn add\" to work and we have anti-tamper\n      newline: false, // when file is edited by npm/yarn it doesn't include a newline\n    });\n  }\n\n  /**\n   * Get configured projections\n   */\n  public get projections() {\n    return this._projections ? { ...this._projections } : undefined;\n  }\n\n  /**\n   * Get configured imports\n   */\n  public get imports() {\n    return this._imports ? [...this._imports] : undefined;\n  }\n\n  /**\n   * Get configured plugins\n   */\n  public get plugins() {\n    return this._plugins ? { ...this._plugins } : undefined;\n  }\n\n  /**\n   * Add a smithy build import\n   */\n  public addImport(imp: string) {\n    this._imports ? this._imports.push(imp) : (this._imports = [`${imp}`]);\n  }\n\n  /**\n   * Add smithy build projections\n   */\n  public addProjections(projections: ProjectionsType) {\n    for (const [k, v] of Object.entries(projections)) {\n      this._projections\n        ? (this._projections[k] = v)\n        : (this._projections = { [k]: v });\n    }\n  }\n\n  /**\n   * Add smithy build plugins\n   */\n  public addPlugins(plugins: PluginsType) {\n    for (const [k, v] of Object.entries(plugins)) {\n      this._plugins ? (this._plugins[k] = v) : (this._plugins = { [k]: v });\n    }\n  }\n}\n"
  },
  {
    "path": "src/source-code.ts",
    "content": "import { Component } from \"./component\";\nimport { Project } from \"./project\";\nimport { TextFile } from \"./textfile\";\n\n/**\n * Options for `SourceCodeFile`.\n */\nexport interface SourceCodeOptions {\n  /**\n   * Indentation size.\n   * @default 2\n   */\n  readonly indent?: number;\n\n  /**\n   * Whether the generated file should be readonly.\n   *\n   * @default true\n   */\n  readonly readonly?: boolean;\n}\n\n/**\n * Represents a source file.\n */\nexport class SourceCode extends Component {\n  private readonly file: TextFile;\n  private indentLevel = 0;\n  private readonly indent: number;\n\n  constructor(\n    project: Project,\n    public readonly filePath: string,\n    options: SourceCodeOptions = {}\n  ) {\n    super(project);\n    this.indent = options.indent ?? 2;\n    this.file = new TextFile(project, filePath, {\n      readonly: options.readonly ?? true,\n    });\n  }\n\n  public get marker(): string | undefined {\n    return this.file.marker;\n  }\n\n  /**\n   * Emit a line of code.\n   * @param code The contents, if not specified, just adds a newline\n   */\n  public line(code?: string) {\n    const spaces: number = this.indent * this.indentLevel;\n    const prefix = \" \".repeat(spaces);\n    this.file.addLine((prefix + (code ?? \"\")).trimEnd());\n  }\n\n  /**\n   * Opens a code block and increases the indentation level.\n   *\n   * @param code The code before the block starts (e.g. `export class {`).\n   */\n  public open(code?: string) {\n    if (code) {\n      this.line(code);\n    }\n\n    this.indentLevel++;\n  }\n\n  /**\n   * Decreases the indentation level and closes a code block.\n   *\n   * @param code The code after the block is closed (e.g. `}`).\n   */\n  public close(code?: string) {\n    if (this.indentLevel === 0) {\n      throw new Error(\"Cannot decrease indent level below zero\");\n    }\n    this.indentLevel--;\n\n    if (code) {\n      this.line(code);\n    }\n  }\n}\n"
  },
  {
    "path": "src/task-model.ts",
    "content": "/**\n * Schema for `tasks.json`.\n */\nexport interface TasksManifest {\n  /**\n   * All tasks available for this project.\n   */\n  readonly tasks?: { [name: string]: TaskSpec };\n\n  /**\n   * Environment for all tasks.\n   */\n  readonly env?: { [name: string]: string };\n}\n\nexport interface TaskCommonOptions {\n  /**\n   * The description of this build command.\n   * @default - the task name\n   */\n  readonly description?: string;\n\n  /**\n   * Defines environment variables for the execution of this task.\n   * Values in this map will be evaluated in a shell, so you can do stuff like `$(echo \"foo\")`.\n   * @default {}\n   */\n  readonly env?: { [name: string]: string };\n\n  /**\n   * A set of environment variables that must be defined in order to execute\n   * this task. Task execution will fail if one of these is not defined.\n   */\n  readonly requiredEnv?: string[];\n\n  /**\n   * A shell command which determines if the this task should be executed. If\n   * the program exits with a zero exit code, steps will be executed. A non-zero\n   * code means that task will be skipped.\n   */\n  readonly condition?: string;\n\n  /**\n   * The working directory for all steps in this task (unless overridden by the\n   * step).\n   *\n   * @default - process.cwd()\n   */\n  readonly cwd?: string;\n}\n\n/**\n * Specification of a single task.\n */\nexport interface TaskSpec extends TaskCommonOptions {\n  /**\n   * Task name.\n   */\n  readonly name: string;\n\n  /**\n   * Task steps.\n   */\n  readonly steps?: TaskStep[];\n}\n\n/**\n * Options for task steps.\n */\nexport interface TaskStepOptions {\n  /**\n   * Step name\n   *\n   * @default - no name\n   */\n  readonly name?: string;\n\n  /**\n   * The working directory for this step.\n   *\n   * @default - determined by the task\n   */\n  readonly cwd?: string;\n}\n\n/**\n * A single step within a task. The step could either be  the execution of a\n * shell command or execution of a sub-task, by name.\n */\nexport interface TaskStep extends TaskStepOptions {\n  /**\n   * Shell command to execute\n   *\n   * @default - don't execute a shell command\n   */\n  readonly exec?: string;\n\n  /**\n   * Subtask to execute\n   *\n   * @default - don't spawn a subtask\n   */\n  readonly spawn?: string;\n\n  /**\n   * Print a message.\n   * @default - don't say anything\n   */\n  readonly say?: string;\n\n  /**\n   * The name of a built-in task to execute.\n   *\n   * Built-in tasks are node.js programs baked into the projen module and as\n   * component runtime helpers.\n   *\n   * The name is a path relative to the projen lib/ directory (without the .task.js extension).\n   * For example, if your built in builtin task is under `src/release/resolve-version.task.ts`,\n   * then this would be `release/resolve-version`.\n   *\n   * @default - do not execute a builtin task\n   */\n  readonly builtin?: string;\n}\n"
  },
  {
    "path": "src/task-runtime.ts",
    "content": "import { SpawnOptions, spawnSync } from \"child_process\";\nimport { existsSync, readFileSync, statSync } from \"fs\";\nimport { platform } from \"os\";\nimport { dirname, join, resolve } from \"path\";\nimport * as path from \"path\";\nimport { format } from \"util\";\nimport * as chalk from \"chalk\";\nimport { PROJEN_DIR } from \"./common\";\nimport * as logging from \"./logging\";\nimport { TasksManifest, TaskSpec } from \"./task-model\";\n\nconst ENV_TRIM_LEN = 20;\n\n/**\n * The runtime component of the tasks engine.\n */\nexport class TaskRuntime {\n  /**\n   * The project-relative path of the tasks manifest file.\n   */\n  public static readonly MANIFEST_FILE = path.posix.join(\n    PROJEN_DIR,\n    \"tasks.json\"\n  );\n\n  /**\n   * The contents of tasks.json\n   */\n  public readonly manifest: TasksManifest;\n\n  /**\n   * The root directory of the project and the cwd for executing tasks.\n   */\n  public readonly workdir: string;\n\n  constructor(workdir: string) {\n    this.workdir = resolve(workdir);\n    const manifestPath = join(this.workdir, TaskRuntime.MANIFEST_FILE);\n    this.manifest = existsSync(manifestPath)\n      ? JSON.parse(readFileSync(manifestPath, \"utf-8\"))\n      : { tasks: {} };\n  }\n\n  /**\n   * The tasks in this project.\n   */\n  public get tasks(): TaskSpec[] {\n    return Object.values(this.manifest.tasks ?? {});\n  }\n\n  /**\n   * Find a task by name, or `undefined` if not found.\n   */\n  public tryFindTask(name: string): TaskSpec | undefined {\n    if (!this.manifest.tasks) {\n      return undefined;\n    }\n    return this.manifest.tasks[name];\n  }\n\n  /**\n   * Runs the task.\n   * @param name The task name.\n   */\n  public runTask(name: string, parents: string[] = []) {\n    const task = this.tryFindTask(name);\n    if (!task) {\n      throw new Error(`cannot find command ${task}`);\n    }\n\n    new RunTask(this, task, parents);\n  }\n}\n\nclass RunTask {\n  private readonly env: { [name: string]: string | undefined } = {};\n  private readonly parents: string[];\n\n  private readonly workdir: string;\n\n  constructor(\n    private readonly runtime: TaskRuntime,\n    private readonly task: TaskSpec,\n    parents: string[] = []\n  ) {\n    this.workdir = task.cwd ?? this.runtime.workdir;\n\n    this.parents = parents;\n\n    if (!task.steps || task.steps.length === 0) {\n      this.logDebug(\n        chalk.gray(\"No actions have been specified for this task.\")\n      );\n      return;\n    }\n\n    this.env = this.resolveEnvironment(parents);\n\n    const envlogs = [];\n    for (const [k, v] of Object.entries(this.env)) {\n      const vv = v ?? \"\";\n      const trimmed =\n        vv.length > ENV_TRIM_LEN ? vv.substr(0, ENV_TRIM_LEN) + \"...\" : vv;\n      envlogs.push(`${k}=${trimmed}`);\n    }\n\n    if (envlogs.length) {\n      this.logDebug(\n        chalk.gray(`${chalk.underline(\"env\")}: ${envlogs.join(\" \")}`)\n      );\n    }\n\n    // evaluate condition\n    if (!this.evalCondition(task)) {\n      this.log(\"condition exited with non-zero - skipping\");\n      return;\n    }\n\n    // verify we required environment variables are defined\n    const merged = { ...process.env, ...this.env };\n    const missing = new Array<string>();\n    for (const name of task.requiredEnv ?? []) {\n      if (!(name in merged)) {\n        missing.push(name);\n      }\n    }\n\n    if (missing.length > 0) {\n      throw new Error(\n        `missing required environment variables: ${missing.join(\",\")}`\n      );\n    }\n\n    for (const step of task.steps) {\n      if (step.say) {\n        logging.info(this.fmtLog(step.say));\n      }\n\n      if (step.spawn) {\n        this.runtime.runTask(step.spawn, [...this.parents, this.task.name]);\n      }\n\n      const execs = step.exec ? [step.exec] : [];\n\n      if (step.builtin) {\n        execs.push(this.renderBuiltin(step.builtin));\n      }\n\n      for (const exec of execs) {\n        let command = \"\";\n        let hasError = false;\n        const cmd = exec.split(\" \")[0];\n        if (\n          platform() == \"win32\" &&\n          [\"mkdir\", \"mv\", \"rm\", \"cp\"].includes(cmd)\n        ) {\n          command = `shx ${exec}`;\n        } else {\n          command = exec;\n        }\n        const cwd = step.cwd;\n        try {\n          const result = this.shell({\n            command,\n            cwd,\n          });\n          hasError = result.status !== 0;\n        } catch (e) {\n          // This is the error 'shx' will throw\n          if ((e as any)?.message?.startsWith(\"non-zero exit code:\")) {\n            hasError = true;\n          }\n          throw e;\n        }\n        if (hasError) {\n          throw new Error(\n            `Task \"${\n              this.fullname\n            }\" failed when executing \"${command}\" (cwd: ${resolve(\n              cwd ?? this.workdir\n            )})`\n          );\n        }\n      }\n    }\n  }\n\n  /**\n   * Determines if a task should be executed based on \"condition\".\n   *\n   * @returns true if the task should be executed or false if the condition\n   * evaluates to false (exits with non-zero), indicating that the task should\n   * be skipped.\n   */\n  private evalCondition(task: TaskSpec) {\n    // no condition, carry on\n    if (!task.condition) {\n      return true;\n    }\n\n    this.log(chalk.gray(`${chalk.underline(\"condition\")}: ${task.condition}`));\n    const result = this.shell({\n      command: task.condition,\n      logprefix: \"condition: \",\n      quiet: true,\n    });\n    if (result.status === 0) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  /**\n   * Renders the runtime environment for a task. Namely, it supports this syntax\n   * `$(xx)` for allowing environment to be evaluated by executing a shell\n   * command and obtaining its result.\n   */\n  private resolveEnvironment(parents: string[]) {\n    let env = this.runtime.manifest.env ?? {};\n\n    // add env from all parent tasks one by one\n    for (const parent of parents) {\n      env = {\n        ...env,\n        ...(this.runtime.tryFindTask(parent)?.env ?? {}),\n      };\n    }\n\n    // apply the task's environment last\n    env = {\n      ...env,\n      ...(this.task.env ?? {}),\n    };\n\n    const output: { [name: string]: string | undefined } = {};\n\n    for (const [key, value] of Object.entries(env ?? {})) {\n      if (value.startsWith(\"$(\") && value.endsWith(\")\")) {\n        const query = value.substring(2, value.length - 1);\n        const result = this.shellEval({ command: query });\n        if (result.status !== 0) {\n          const error = result.error\n            ? result.error.stack\n            : result.stderr?.toString() ?? \"unknown error\";\n          throw new Error(\n            `unable to evaluate environment variable ${key}=${value}: ${error}`\n          );\n        }\n        output[key] = result.stdout.toString(\"utf-8\").trim();\n      } else {\n        output[key] = value;\n      }\n    }\n\n    return output;\n  }\n\n  /**\n   * Returns the \"full name\" of the task which includes all it's parent task names concatenated by chevrons.\n   */\n  private get fullname() {\n    return [...this.parents, this.task.name].join(\" » \");\n  }\n\n  private log(...args: any[]) {\n    logging.verbose(this.fmtLog(...args));\n  }\n\n  private logDebug(...args: any[]) {\n    logging.debug(this.fmtLog(...args));\n  }\n\n  private fmtLog(...args: any[]) {\n    return format(`${chalk.underline(this.fullname)} |`, ...args);\n  }\n\n  private shell(options: ShellOptions) {\n    const quiet = options.quiet ?? false;\n    if (!quiet) {\n      const log = new Array<string>();\n\n      if (options.logprefix) {\n        log.push(options.logprefix);\n      }\n\n      log.push(options.command);\n\n      if (options.cwd) {\n        log.push(`(cwd: ${options.cwd})`);\n      }\n\n      this.log(log.join(\" \"));\n    }\n\n    const cwd = options.cwd ?? this.workdir;\n    if (!existsSync(cwd) || !statSync(cwd).isDirectory()) {\n      throw new Error(\n        `invalid workdir (cwd): ${cwd} must be an existing directory`\n      );\n    }\n\n    return spawnSync(options.command, {\n      ...options,\n      cwd,\n      shell: true,\n      stdio: \"inherit\",\n      env: {\n        ...process.env,\n        ...this.env,\n      },\n      ...options.spawnOptions,\n    });\n  }\n\n  private shellEval(options: ShellOptions) {\n    return this.shell({\n      quiet: true,\n      ...options,\n      spawnOptions: {\n        stdio: [\"inherit\", \"pipe\", \"inherit\"],\n      },\n    });\n  }\n\n  private renderBuiltin(builtin: string) {\n    const moduleRoot = dirname(require.resolve(\"../package.json\"));\n    const program = require.resolve(\n      join(moduleRoot, \"lib\", `${builtin}.task.js`)\n    );\n    return `${process.execPath} ${program}`;\n  }\n}\n\ninterface ShellOptions {\n  readonly command: string;\n  /**\n   * @default - project dir\n   */\n  readonly cwd?: string;\n  readonly logprefix?: string;\n  readonly spawnOptions?: SpawnOptions;\n  /** @default false */\n  readonly quiet?: boolean;\n}\n"
  },
  {
    "path": "src/task.ts",
    "content": "import {\n  TaskCommonOptions,\n  TaskSpec,\n  TaskStep,\n  TaskStepOptions,\n} from \"./task-model\";\n\nexport interface TaskOptions extends TaskCommonOptions {\n  /**\n   * Shell command to execute as the first command of the task.\n   * @default - add steps using `task.exec(command)` or `task.spawn(subtask)`\n   */\n  readonly exec?: string;\n\n  /**\n   * List of task steps to run.\n   */\n  readonly steps?: TaskStep[];\n}\n\n/**\n * A task that can be performed on the project. Modeled as a series of shell\n * commands and subtasks.\n */\nexport class Task {\n  /**\n   * Task name.\n   */\n  public readonly name: string;\n\n  /**\n   * A command to execute which determines if the task should be skipped. If it\n   * returns a zero exit code, the task will not be executed.\n   */\n  public readonly condition?: string;\n\n  private readonly _steps: TaskStep[];\n  private readonly _env: { [name: string]: string };\n  private readonly cwd?: string;\n  private readonly requiredEnv?: string[];\n  private _locked: boolean;\n  private _description?: string;\n\n  constructor(name: string, props: TaskOptions = {}) {\n    this.name = name;\n    this._description = props.description;\n    this.condition = props.condition;\n    this.cwd = props.cwd;\n    this._locked = false;\n\n    this._env = props.env ?? {};\n    this._steps = props.steps ?? [];\n    this.requiredEnv = props.requiredEnv;\n\n    if (props.exec && props.steps) {\n      throw new Error(\"cannot specify both exec and steps\");\n    }\n\n    if (props.exec) {\n      this.exec(props.exec);\n    }\n  }\n\n  /**\n   * Forbid additional changes to this task.\n   */\n  public lock() {\n    this._locked = true;\n  }\n\n  /**\n   * Returns the description of this task.\n   */\n  public get description(): string | undefined {\n    return this._description;\n  }\n\n  /**\n   * Sets the description of this task.\n   */\n  public set description(desc: string | undefined) {\n    this._description = desc;\n  }\n\n  /**\n   * Reset the task so it no longer has any commands.\n   * @param command the first command to add to the task after it was cleared.\n   */\n  public reset(command?: string, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n\n    while (this._steps.length) {\n      this._steps.shift();\n    }\n\n    if (command) {\n      this.exec(command, options);\n    }\n  }\n\n  /**\n   * Executes a shell command\n   * @param command Shell command\n   * @param options Options\n   */\n  public exec(command: string, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n    this._steps.push({ exec: command, ...options });\n  }\n\n  /**\n   * Execute a builtin task.\n   *\n   * Builtin tasks are programs bundled as part of projen itself and used as\n   * helpers for various components.\n   *\n   * In the future we should support built-in tasks from external modules.\n   *\n   * @param name The name of the builtin task to execute (e.g.\n   * `release/resolve-version`).\n   */\n  public builtin(name: string) {\n    this.assertUnlocked();\n    this._steps.push({ builtin: name });\n  }\n\n  /**\n   * Say something.\n   * @param message Your message\n   * @param options Options\n   */\n  public say(message: string, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n    this._steps.push({ say: message, ...options });\n  }\n\n  /**\n   * Adds a command at the beginning of the task.\n   * @param shell The command to add.\n   *\n   * @deprecated use `prependExec()`\n   */\n  public prepend(shell: string, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n    this.prependExec(shell, options);\n  }\n\n  /**\n   * Spawns a sub-task.\n   * @param subtask The subtask to execute.\n   */\n  public spawn(subtask: Task, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n    this._steps.push({ spawn: subtask.name, ...options });\n  }\n\n  /**\n   * Adds a command at the beginning of the task.\n   * @param shell The command to add.\n   */\n  public prependExec(shell: string, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n    this._steps.unshift({\n      exec: shell,\n      ...options,\n    });\n  }\n\n  /**\n   * Adds a spawn instruction at the beginning of the task.\n   * @param subtask The subtask to execute.\n   */\n  public prependSpawn(subtask: Task, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n    this._steps.unshift({\n      spawn: subtask.name,\n      ...options,\n    });\n  }\n\n  /**\n   * Says something at the beginning of the task.\n   * @param message Your message\n   */\n  public prependSay(message: string, options: TaskStepOptions = {}) {\n    this.assertUnlocked();\n    this._steps.unshift({\n      say: message,\n      ...options,\n    });\n  }\n\n  /**\n   * Adds an environment variable to this task.\n   * @param name The name of the variable\n   * @param value The value. If the value is surrounded by `$()`, we will\n   * evaluate it within a subshell and use the result as the value of the\n   * environment variable.\n   */\n  public env(name: string, value: string) {\n    this.assertUnlocked();\n    this._env[name] = value;\n  }\n\n  /**\n   * Returns an immutable copy of all the step specifications of the task.\n   */\n  public get steps() {\n    // If the list of steps is a Lazy value, we can't know what the steps\n    // are until synthesis occurs, so just return an empty array.\n    if (!Array.isArray(this._steps)) {\n      return [];\n    }\n    return [...this._steps];\n  }\n\n  /**\n   * Renders a task spec into the manifest.\n   *\n   * @internal\n   */\n  public _renderSpec(): TaskSpec {\n    return {\n      name: this.name,\n      description: this.description,\n      env: this._env,\n      requiredEnv: this.requiredEnv,\n      steps: this._steps,\n      condition: this.condition,\n      cwd: this.cwd,\n    };\n  }\n\n  private assertUnlocked() {\n    if (this._locked) {\n      throw new Error(`Task \"${this.name}\" is locked for changes`);\n    }\n  }\n}\n"
  },
  {
    "path": "src/tasks.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { Component } from \"./component\";\nimport { JsonFile } from \"./json\";\nimport { Project } from \"./project\";\nimport { Task, TaskOptions } from \"./task\";\nimport { TasksManifest, TaskSpec } from \"./task-model\";\nimport { TaskRuntime } from \"./task-runtime\";\n\n/**\n * Defines project tasks.\n *\n * Tasks extend the projen CLI by adding subcommands to it. Task definitions are\n * synthesized into `.projen/tasks.json`.\n */\nexport class Tasks extends Component {\n  private readonly _tasks: { [name: string]: Task };\n  private readonly _env: { [name: string]: string };\n\n  constructor(project: Project) {\n    super(project);\n\n    this._tasks = {};\n    this._env = {};\n\n    new JsonFile(project, TaskRuntime.MANIFEST_FILE, {\n      omitEmpty: true,\n      obj: {\n        tasks: (() => this.renderTasks()) as any,\n        env: (() => this._env) as any,\n      } as TasksManifest,\n    });\n  }\n\n  /**\n   * All tasks.\n   */\n  public get all() {\n    return Object.values(this._tasks);\n  }\n\n  /**\n   * Adds a task to a project.\n   * @param name The name of the task\n   * @param options Task options.\n   */\n  public addTask(name: string, options: TaskOptions = {}) {\n    const task = new Task(name, options);\n    if (this._tasks[name]) {\n      throw new Error(\n        `A task with the name ${name} already exists. To override it, call removeTask first and then create the new task.`\n      );\n    }\n    this._tasks[name] = task;\n    return task;\n  }\n\n  /**\n   * Removes a task from a project.\n   *\n   * @param name The name of the task to remove.\n   *\n   * @returns The `Task` that was removed, otherwise `undefined`.\n   */\n  public removeTask(name: string): undefined | Task {\n    const dependentTasks = this.all.filter((task) =>\n      task.steps.find((step) => step.spawn == name)\n    );\n    if (dependentTasks.length > 0) {\n      const errList = dependentTasks.map((depTask) => depTask.name).join(\", \");\n      throw new Error(\n        `Unable to remove task \"${name}\" because the following tasks depend on it: ${errList}`\n      );\n    }\n\n    const task = this._tasks[name];\n    if (task) {\n      delete this._tasks[name];\n      return task;\n    } else {\n      return undefined;\n    }\n  }\n\n  /**\n   * Adds global environment.\n   * @param name Environment variable name\n   * @param value Value\n   */\n  public addEnvironment(name: string, value: string) {\n    this._env[name] = value;\n  }\n\n  /**\n   * Returns a copy of the currently global environment for this project.\n   */\n  public get env(): { [key: string]: string } {\n    return {\n      ...this._env,\n    };\n  }\n\n  /**\n   * Finds a task by name. Returns `undefined` if the task cannot be found.\n   * @param name The name of the task\n   */\n  public tryFind(name: string): undefined | Task {\n    return this._tasks[name];\n  }\n\n  public synthesize(): void {\n    if (this.project.ejected) {\n      // Insert a task-runner script so that tasks can be run after ejecting\n      fs.mkdirpSync(path.join(this.project.outdir, \"scripts\"));\n      fs.copyFileSync(\n        path.join(__dirname, \"..\", \"lib\", \"run-task.js\"),\n        path.join(this.project.outdir, \"scripts\", \"run-task\")\n      );\n      fs.chmodSync(\n        path.join(this.project.outdir, \"scripts\", \"run-task\"),\n        \"755\"\n      );\n    }\n  }\n\n  private renderTasks() {\n    const tasks: { [name: string]: TaskSpec } = {};\n    for (const task of Object.values(this._tasks).sort((x, y) =>\n      x.name.localeCompare(y.name)\n    )) {\n      tasks[task.name] = task._renderSpec();\n    }\n\n    return tasks;\n  }\n}\n"
  },
  {
    "path": "src/testing.ts",
    "content": "import { Project } from \"./project\";\nimport { SnapshotOptions, synthSnapshot } from \"./util/synth\";\n\n/**\n * A Testing static class with a .synth helper for getting a snapshots of construct outputs.\n * Useful for snapshot testing with Jest.\n *\n * @example `expect(Testing.synth(someProject)).toMatchSnapshot()`\n */\nexport class Testing {\n  /**\n   * Produces a simple JS object that represents the contents of the projects with field names being file paths.\n   * @param project the project to produce a snapshot for\n   * @return { [filename:string]: any }\n   */\n  public static synth(\n    project: Project,\n    options: SnapshotOptions = {}\n  ): Record<string, any> {\n    return synthSnapshot(project, options);\n  }\n\n  private constructor() {} // utility\n}\n\nexport { SnapshotOptions } from \"./util/synth\";\n"
  },
  {
    "path": "src/textfile.ts",
    "content": "import { FileBase, FileBaseOptions, IResolver } from \"./file\";\nimport { Project } from \"./project\";\n\n/**\n * Options for `TextFile`.\n */\nexport interface TextFileOptions extends FileBaseOptions {\n  /**\n   * The contents of the text file. You can use `addLine()` to append lines.\n   *\n   * @default [] empty file\n   */\n  readonly lines?: string[];\n}\n\n/**\n * A text file.\n */\nexport class TextFile extends FileBase {\n  private readonly lines: string[];\n\n  /**\n   * Defines a text file.\n   *\n   * @param project The project\n   * @param filePath File path\n   * @param options Options\n   */\n  constructor(\n    project: Project,\n    filePath: string,\n    options: TextFileOptions = {}\n  ) {\n    super(project, filePath, options);\n\n    this.lines = options.lines ?? [];\n  }\n\n  /**\n   * Adds a line to the text file.\n   * @param line the line to add (can use tokens)\n   */\n  public addLine(line: string) {\n    this.lines.push(line);\n  }\n\n  protected synthesizeContent(_: IResolver): string | undefined {\n    return this.lines.join(\"\\n\");\n  }\n}\n"
  },
  {
    "path": "src/toml.ts",
    "content": "import * as TOML from \"@iarna/toml\";\nimport { IResolver } from \"./file\";\nimport { ObjectFile, ObjectFileOptions } from \"./object-file\";\nimport { Project } from \"./project\";\n\n/**\n * Options for `TomlFile`.\n */\nexport interface TomlFileOptions extends ObjectFileOptions {}\n\n/**\n * Represents a TOML file.\n */\nexport class TomlFile extends ObjectFile {\n  constructor(project: Project, filePath: string, options: TomlFileOptions) {\n    super(project, filePath, options);\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const json = super.synthesizeContent(resolver);\n    if (!json) {\n      return undefined;\n    }\n\n    return [\n      ...(this.marker ? [`# ${this.marker}`] : []),\n      \"\",\n      TOML.stringify(JSON.parse(json)),\n    ].join(\"\\n\");\n  }\n}\n"
  },
  {
    "path": "src/typescript/index.ts",
    "content": "export * from \"./projenrc\";\nexport * from \"./typescript\";\nexport * from \"./typescript-typedoc\";\n"
  },
  {
    "path": "src/typescript/projenrc.ts",
    "content": "import { existsSync, writeFileSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { Component } from \"../component\";\nimport { renderJavaScriptOptions } from \"../javascript/render-options\";\nimport { TypeScriptProject } from \"../typescript\";\n\nexport interface ProjenrcOptions {\n  /**\n   * The name of the projenrc file.\n   * @default \".projenrc.ts\"\n   */\n  readonly filename?: string;\n\n  /**\n   * A directory tree that may contain *.ts files that can be referenced from\n   * your projenrc typescript file.\n   *\n   * @default \"projenrc\"\n   */\n  readonly projenCodeDir?: string;\n}\n\n/**\n * Sets up a typescript project to use TypeScript for projenrc.\n */\nexport class Projenrc extends Component {\n  private readonly rcfile: string;\n\n  constructor(project: TypeScriptProject, options: ProjenrcOptions = {}) {\n    super(project);\n\n    this.rcfile = options.filename ?? \".projenrc.ts\";\n\n    const projensrc = options.projenCodeDir ?? \"projenrc\";\n\n    // tell eslint to take .projenrc.ts and *.ts files under `projen` into account as a dev-dependency\n    project.tsconfigDev.addInclude(this.rcfile);\n    project.eslint?.allowDevDeps(this.rcfile);\n    project.eslint?.addIgnorePattern(`!${this.rcfile}`);\n\n    project.tsconfigDev.addInclude(`${projensrc}/**/*.ts`);\n    project.eslint?.allowDevDeps(`${projensrc}/**/*.ts`);\n    project.eslint?.addIgnorePattern(`!${projensrc}/**/*.ts`);\n\n    // this is the task projen executes when running `projen` without a\n    // specific task (if this task is not defined, projen falls back to\n    // running \"node .projenrc.js\").\n    project.addDevDeps(\"ts-node\");\n\n    // we use \"tsconfig.dev.json\" here to allow projen source files to reside\n    // anywhere in the project tree.\n    project.defaultTask?.exec(\n      `ts-node --project ${project.tsconfigDev.fileName} ${this.rcfile}`\n    );\n\n    this.generateProjenrc();\n  }\n\n  private generateProjenrc() {\n    const rcfile = resolve(this.project.outdir, this.rcfile);\n    if (existsSync(rcfile)) {\n      return; // already exists\n    }\n\n    const bootstrap = this.project.initProject;\n    if (!bootstrap) {\n      return;\n    }\n\n    const parts = bootstrap.fqn.split(\".\");\n    const moduleName = parts[0];\n    const importName = parts[1];\n    const className = parts.slice(1).join(\".\");\n\n    const { renderedOptions, imports } = renderJavaScriptOptions({\n      args: bootstrap.args,\n      type: bootstrap.type,\n      comments: bootstrap.comments,\n    });\n\n    imports.add(importName);\n\n    const lines = new Array<string>();\n    lines.push(\n      `import { ${[...imports].sort().join(\", \")} } from \"${moduleName}\";`\n    );\n    lines.push();\n    lines.push(`const project = new ${className}(${renderedOptions});`);\n    lines.push();\n    lines.push(\"project.synth();\");\n\n    writeFileSync(rcfile, lines.join(\"\\n\"));\n    this.project.logger.info(\n      `Project definition file was created at ${rcfile}`\n    );\n  }\n}\n"
  },
  {
    "path": "src/typescript/typescript-typedoc.ts",
    "content": "import { TypeScriptProject } from \"../typescript\";\n\n/**\n  Adds a simple Typescript documentation generator\n */\nexport class TypedocDocgen {\n  constructor(project: TypeScriptProject) {\n    project.addDevDeps(\"typedoc\");\n\n    const docgen = project.addTask(\"docgen\", {\n      description: `Generate TypeScript API reference ${project.docsDirectory}`,\n      exec: `typedoc ${project.srcdir} --disableSources --out ${project.docsDirectory}`,\n    });\n\n    // spawn after a successful compile\n    project.postCompileTask.spawn(docgen);\n  }\n}\n"
  },
  {
    "path": "src/typescript/typescript.ts",
    "content": "import * as path from \"path\";\nimport * as semver from \"semver\";\nimport { PROJEN_DIR, PROJEN_RC } from \"../common\";\nimport { Component } from \"../component\";\nimport {\n  Eslint,\n  EslintOptions,\n  Jest,\n  NodeProject,\n  NodeProjectOptions,\n  TypeScriptCompilerOptions,\n  TypescriptConfig,\n  TypescriptConfigOptions,\n} from \"../javascript\";\nimport { SampleDir } from \"../sample-file\";\nimport { Task } from \"../task\";\nimport { TextFile } from \"../textfile\";\nimport {\n  Projenrc as ProjenrcTs,\n  ProjenrcOptions as ProjenrcTsOptions,\n  TypedocDocgen,\n} from \"../typescript\";\n\nexport interface TypeScriptProjectOptions extends NodeProjectOptions {\n  /**\n   * Typescript  artifacts output directory\n   *\n   * @default \"lib\"\n   */\n  readonly libdir?: string;\n\n  /**\n   * Typescript sources directory.\n   *\n   * @default \"src\"\n   */\n  readonly srcdir?: string;\n\n  /**\n   * Jest tests directory. Tests files should be named `xxx.test.ts`.\n   *\n   * If this directory is under `srcdir` (e.g. `src/test`, `src/__tests__`),\n   * then tests are going to be compiled into `lib/` and executed as javascript.\n   * If the test directory is outside of `src`, then we configure jest to\n   * compile the code in-memory.\n   *\n   * @default \"test\"\n   */\n  readonly testdir?: string;\n\n  /**\n   * Setup eslint.\n   *\n   * @default true\n   */\n  readonly eslint?: boolean;\n\n  /**\n   * Eslint options\n   * @default - opinionated default options\n   */\n  readonly eslintOptions?: EslintOptions;\n\n  /**\n   * TypeScript version to use.\n   *\n   * NOTE: Typescript is not semantically versioned and should remain on the\n   * same minor, so we recommend using a `~` dependency (e.g. `~1.2.3`).\n   *\n   * @default \"latest\"\n   */\n  readonly typescriptVersion?: string;\n\n  /**\n   * Docgen by Typedoc\n   *\n   * @default false\n   */\n  readonly docgen?: boolean;\n\n  /**\n   * Docs directory\n   *\n   * @default \"docs\"\n   */\n  readonly docsDirectory?: string;\n\n  /**\n   * Custom TSConfig\n   * @default - default options\n   */\n  readonly tsconfig?: TypescriptConfigOptions;\n\n  /**\n   * Custom tsconfig options for the development tsconfig.json file (used for testing).\n   * @default - use the production tsconfig options\n   */\n  readonly tsconfigDev?: TypescriptConfigOptions;\n\n  /**\n   * The name of the development tsconfig.json file.\n   *\n   * @default \"tsconfig.dev.json\"\n   */\n  readonly tsconfigDevFile?: string;\n\n  /**\n   * Do not generate a `tsconfig.json` file (used by jsii projects since\n   * tsconfig.json is generated by the jsii compiler).\n   *\n   * @default false\n   */\n  readonly disableTsconfig?: boolean;\n\n  /**\n   * Generate one-time sample in `src/` and `test/` if there are no files there.\n   * @default true\n   */\n  readonly sampleCode?: boolean;\n\n  /**\n   * The .d.ts file that includes the type declarations for this module.\n   * @default - .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\n   */\n  readonly entrypointTypes?: string;\n\n  /**\n   * Use TypeScript for your projenrc file (`.projenrc.ts`).\n   *\n   * @default false\n   */\n  readonly projenrcTs?: boolean;\n\n  /**\n   * Options for .projenrc.ts\n   */\n  readonly projenrcTsOptions?: ProjenrcTsOptions;\n}\n\n/**\n * TypeScript project\n * @pjid typescript\n */\nexport class TypeScriptProject extends NodeProject {\n  public readonly docgen?: boolean;\n  public readonly docsDirectory: string;\n  public readonly eslint?: Eslint;\n  public readonly tsconfigEslint?: TypescriptConfig;\n  public readonly tsconfig?: TypescriptConfig;\n\n  /**\n   * A typescript configuration file which covers all files (sources, tests, projen).\n   */\n  public readonly tsconfigDev: TypescriptConfig;\n\n  /**\n   * The directory in which the .ts sources reside.\n   */\n  public readonly srcdir: string;\n\n  /**\n   * The directory in which compiled .js files reside.\n   */\n  public readonly libdir: string;\n\n  /**\n   * The directory in which tests reside.\n   */\n  public readonly testdir: string;\n\n  /**\n   * The \"watch\" task.\n   */\n  public readonly watchTask: Task;\n\n  constructor(options: TypeScriptProjectOptions) {\n    super({\n      ...options,\n\n      // disable .projenrc.js if typescript is enabled\n      projenrcJs: options.projenrcTs ? false : options.projenrcJs,\n\n      jestOptions: {\n        ...options.jestOptions,\n        jestConfig: {\n          ...options.jestOptions?.jestConfig,\n          testMatch: [],\n        },\n      },\n    });\n\n    this.srcdir = options.srcdir ?? \"src\";\n    this.libdir = options.libdir ?? \"lib\";\n\n    this.docgen = options.docgen;\n    this.docsDirectory = options.docsDirectory ?? \"docs/\";\n\n    this.compileTask.exec(\"tsc --build\");\n\n    this.watchTask = this.addTask(\"watch\", {\n      description: \"Watch & compile in the background\",\n      exec: \"tsc --build -w\",\n    });\n\n    this.testdir = options.testdir ?? \"test\";\n    this.gitignore.include(`/${this.testdir}/`);\n    this.npmignore?.exclude(`/${this.testdir}/`);\n\n    // if the test directory is under `src/`, then we will run our tests against\n    // the javascript files and not let jest compile it for us.\n    const compiledTests = this.testdir.startsWith(this.srcdir + path.posix.sep);\n\n    if (options.entrypointTypes || this.entrypoint !== \"\") {\n      const entrypointTypes =\n        options.entrypointTypes ??\n        `${path\n          .join(\n            path.dirname(this.entrypoint),\n            path.basename(this.entrypoint, \".js\")\n          )\n          .replace(/\\\\/g, \"/\")}.d.ts`;\n      this.package.addField(\"types\", entrypointTypes);\n    }\n\n    const compilerOptionDefaults: TypeScriptCompilerOptions = {\n      alwaysStrict: true,\n      declaration: true,\n      esModuleInterop: true,\n      experimentalDecorators: true,\n      inlineSourceMap: true,\n      inlineSources: true,\n      lib: [\"es2019\"],\n      module: \"CommonJS\",\n      noEmitOnError: false,\n      noFallthroughCasesInSwitch: true,\n      noImplicitAny: true,\n      noImplicitReturns: true,\n      noImplicitThis: true,\n      noUnusedLocals: true,\n      noUnusedParameters: true,\n      resolveJsonModule: true,\n      strict: true,\n      strictNullChecks: true,\n      strictPropertyInitialization: true,\n      stripInternal: true,\n      target: \"ES2019\",\n    };\n\n    if (!options.disableTsconfig) {\n      this.tsconfig = new TypescriptConfig(\n        this,\n        mergeTsconfigOptions(\n          {\n            include: [`${this.srcdir}/**/*.ts`],\n            // exclude: ['node_modules'], // TODO: shouldn't we exclude node_modules?\n            compilerOptions: {\n              rootDir: this.srcdir,\n              outDir: this.libdir,\n              ...compilerOptionDefaults,\n            },\n          },\n          options.tsconfig\n        )\n      );\n    }\n\n    const tsconfigDevFile = options.tsconfigDevFile ?? \"tsconfig.dev.json\";\n    this.tsconfigDev = new TypescriptConfig(\n      this,\n      mergeTsconfigOptions(\n        {\n          fileName: tsconfigDevFile,\n          include: [\n            PROJEN_RC,\n            `${this.srcdir}/**/*.ts`,\n            `${this.testdir}/**/*.ts`,\n          ],\n          exclude: [\"node_modules\"],\n          compilerOptions: compilerOptionDefaults,\n        },\n        options.tsconfig,\n        options.tsconfigDev\n      )\n    );\n\n    this.gitignore.include(`/${this.srcdir}/`);\n    this.npmignore?.exclude(`/${this.srcdir}/`);\n\n    if (this.srcdir !== this.libdir) {\n      // separated, can ignore the entire libdir\n      this.gitignore.exclude(`/${this.libdir}`);\n    } else {\n      // collocated, can only ignore the compiled output\n      this.gitignore.exclude(`/${this.libdir}/**/*.js`);\n      this.gitignore.exclude(`/${this.libdir}/**/*.d.ts`);\n      this.gitignore.exclude(`/${this.libdir}/**/*.d.ts.map`);\n    }\n\n    this.npmignore?.include(`/${this.libdir}/`);\n\n    this.npmignore?.include(`/${this.libdir}/**/*.js`);\n    this.npmignore?.include(`/${this.libdir}/**/*.d.ts`);\n\n    this.gitignore.exclude(\"/dist/\");\n    this.npmignore?.exclude(\"dist\"); // jsii-pacmak expects this to be \"dist\" and not \"/dist\". otherwise it will tamper with it\n\n    this.npmignore?.exclude(\"/tsconfig.json\");\n    this.npmignore?.exclude(\"/.github/\");\n    this.npmignore?.exclude(\"/.vscode/\");\n    this.npmignore?.exclude(\"/.idea/\");\n    this.npmignore?.exclude(\"/.projenrc.js\");\n    this.npmignore?.exclude(\"tsconfig.tsbuildinfo\");\n\n    if (this.jest) {\n      if (compiledTests) {\n        this.addJestCompiled(this.jest);\n      } else {\n        this.addJestNoCompile(this.jest);\n      }\n    }\n\n    const projenrcTypeScript = options.projenrcTs ?? false;\n\n    const projenRcFilename = projenrcTypeScript\n      ? options.projenrcTsOptions?.filename ?? \".projenrc.ts\"\n      : undefined;\n\n    if (options.eslint ?? true) {\n      const devdirs = [this.testdir, \"build-tools\"];\n      if (projenrcTypeScript) {\n        devdirs.push(options.projenrcTsOptions?.projenCodeDir ?? \"projenrc\");\n      }\n\n      this.eslint = new Eslint(this, {\n        tsconfigPath: `./${this.tsconfigDev.fileName}`,\n        dirs: [this.srcdir],\n        devdirs,\n        fileExtensions: [\".ts\", \".tsx\"],\n        lintProjenRcFile: projenRcFilename,\n        ...options.eslintOptions,\n      });\n\n      this.tsconfigEslint = this.tsconfigDev;\n    }\n\n    if (projenrcTypeScript) {\n      new ProjenrcTs(this, options.projenrcTsOptions);\n    }\n\n    const tsver = options.typescriptVersion\n      ? `@${options.typescriptVersion}`\n      : \"\";\n\n    this.addDevDeps(\n      `typescript${tsver}`,\n      // @types/node versions numbers match the node runtime versions' major.minor, however, new\n      // releases are only created when API changes are included in a node release... We might for\n      // example have dependencies that require `node >= 12.22`, but as 12.21 and 12.22 did not\n      // include API changes, `@types/node@12.20.x` is the \"correct\" version to use. As it is not\n      // possible to easily determine the correct version to use, we pick up the latest version.\n      //\n      // Additionally, we default to tracking the 12.x line, as the current earliest LTS release of\n      // node is 12.x, so this is what corresponds to the broadest compatibility with supported node\n      // runtimes.\n      `@types/node@^${semver.major(this.package.minNodeVersion ?? \"14.0.0\")}`\n    );\n\n    // generate sample code in `src` and `lib` if these directories are empty or non-existent.\n    if (options.sampleCode ?? true) {\n      new SampleCode(this);\n    }\n\n    if (this.docgen) {\n      new TypedocDocgen(this);\n    }\n  }\n\n  /**\n   * Tests are compiled to `lib/TESTDIR`, so we don't need jest to compile them\n   * for us. just run them directly from javascript.\n   */\n  private addJestCompiled(jest: Jest) {\n    this.addDevDeps(`@types/jest${jest.jestVersion}`);\n\n    const testout = path.posix.relative(this.srcdir, this.testdir);\n    const libtest = path.posix.join(this.libdir, testout);\n    const srctest = this.testdir;\n\n    this.npmignore?.exclude(`/${libtest}/`);\n    jest.addTestMatch(`**/${libtest}/**/?(*.)+(spec|test).js?(x)`);\n    jest.addWatchIgnorePattern(`/${this.srcdir}/`);\n\n    const resolveSnapshotPath = (test: string, ext: string) => {\n      const fullpath = test.replace(libtest, srctest);\n      return path.join(\n        path.dirname(fullpath),\n        \"__snapshots__\",\n        path.basename(fullpath, \".js\") + \".ts\" + ext\n      );\n    };\n\n    const resolveTestPath = (snap: string, ext: string) => {\n      const filename = path.basename(snap, \".ts\" + ext) + \".js\";\n      const dir = path.dirname(path.dirname(snap)).replace(srctest, libtest);\n      return path.join(dir, filename);\n    };\n\n    const resolver = new TextFile(\n      this,\n      path.posix.join(PROJEN_DIR, \"jest-snapshot-resolver.js\")\n    );\n    if (!resolver.marker) {\n      resolver.addLine(`// ${resolver.marker}`);\n    }\n    resolver.addLine('const path = require(\"path\");');\n    resolver.addLine(`const libtest = \"${libtest}\";`);\n    resolver.addLine(`const srctest= \"${srctest}\";`);\n    resolver.addLine(\"module.exports = {\");\n    resolver.addLine(\n      `  resolveSnapshotPath: ${resolveSnapshotPath.toString()},`\n    );\n    resolver.addLine(`  resolveTestPath: ${resolveTestPath.toString()},`);\n    resolver.addLine(\n      \"  testPathForConsistencyCheck: path.join('some', '__tests__', 'example.test.js')\"\n    );\n    resolver.addLine(\"};\");\n\n    jest.addSnapshotResolver(`./${resolver.path}`);\n  }\n\n  private addJestNoCompile(jest: Jest) {\n    this.addDevDeps(\n      `@types/jest${jest.jestVersion}`,\n      `ts-jest${jest.jestVersion}`\n    );\n\n    jest.addTestMatch(`<rootDir>/${this.srcdir}/**/__tests__/**/*.ts?(x)`);\n    jest.addTestMatch(\n      `<rootDir>/(${this.testdir}|${this.srcdir})/**/*(*.)@(spec|test).ts?(x)`\n    );\n\n    // add relevant deps\n    jest.config.preset = \"ts-jest\";\n    jest.config.globals = {\n      \"ts-jest\": {\n        tsconfig: this.tsconfigDev.fileName,\n      },\n    };\n  }\n}\n\nclass SampleCode extends Component {\n  constructor(project: TypeScriptProject) {\n    super(project);\n    const srcCode = [\n      \"export class Hello {\",\n      \"  public sayHello() {\",\n      \"    return 'hello, world!';\",\n      \"  }\",\n      \"}\",\n    ].join(\"\\n\");\n\n    const testCode = [\n      \"import { Hello } from '../src';\",\n      \"\",\n      \"test('hello', () => {\",\n      \"  expect(new Hello().sayHello()).toBe('hello, world!');\",\n      \"});\",\n    ].join(\"\\n\");\n\n    new SampleDir(project, project.srcdir, {\n      files: {\n        \"index.ts\": srcCode,\n      },\n    });\n\n    if (project.jest) {\n      new SampleDir(project, project.testdir, {\n        files: {\n          \"hello.test.ts\": testCode,\n        },\n      });\n    }\n  }\n}\n\n/**\n * TypeScript app.\n *\n * @pjid typescript-app\n */\nexport class TypeScriptAppProject extends TypeScriptProject {\n  constructor(options: TypeScriptProjectOptions) {\n    super({\n      allowLibraryDependencies: false,\n      releaseWorkflow: false,\n      entrypoint: \"\", // \"main\" is not needed in typescript apps\n      package: false,\n      ...options,\n    });\n  }\n}\n\n/**\n * @deprecated use `TypeScriptProject`\n */\nexport class TypeScriptLibraryProject extends TypeScriptProject {}\n\n/**\n * @deprecated use TypeScriptProjectOptions\n */\nexport interface TypeScriptLibraryProjectOptions\n  extends TypeScriptProjectOptions {}\n\n/**\n * @internal\n */\nexport function mergeTsconfigOptions(\n  ...options: (TypescriptConfigOptions | undefined)[]\n): TypescriptConfigOptions {\n  const definedOptions = options.filter(Boolean) as TypescriptConfigOptions[];\n  return definedOptions.reduce<TypescriptConfigOptions>(\n    (previous, current) => ({\n      ...previous,\n      ...current,\n      include: [...(previous.include ?? []), ...(current.include ?? [])],\n      exclude: [...(previous.exclude ?? []), ...(current.exclude ?? [])],\n      compilerOptions: {\n        ...previous.compilerOptions,\n        ...current.compilerOptions,\n      },\n    }),\n    { compilerOptions: {} }\n  );\n}\n"
  },
  {
    "path": "src/util/semver.ts",
    "content": "// stolen from: https://github.com/aws/jsii/blob/main/packages/jsii-pacmak/lib/targets/version-utils.ts\n\nimport { inspect } from \"util\";\nimport { Comparator, Range, parse } from \"semver\";\n\nexport enum TargetName {\n  JAVA,\n  DOTNET,\n  PYTHON,\n  GO,\n  JAVASCRIPT,\n}\n\n/**\n * Converts a SemVer range expression to a Maven version range expression.\n *\n * @param semverRange the SemVer range expression to convert.\n * @param suffix      the suffix to add to versions in the range.\n *\n * @see https://cwiki.apache.org/confluence/display/MAVENOLD/Dependency+Mediation+and+Conflict+Resolution\n */\nexport function toMavenVersionRange(\n  semverRange: string,\n  suffix?: string\n): string {\n  return toBracketNotation(semverRange, suffix, {\n    semver: false,\n    target: TargetName.JAVA,\n  });\n}\n\n/**\n * Converts a SemVer range expression to a NuGet version range expression.\n *\n * @param semverRange the SemVer range expression to convert.\n *\n * @see https://docs.microsoft.com/en-us/nuget/concepts/package-versioning#version-ranges-and-wildcards\n */\nexport function toNuGetVersionRange(semverRange: string): string {\n  return toBracketNotation(semverRange, undefined, {\n    semver: false,\n    target: TargetName.DOTNET,\n  });\n}\n\n/**\n * Converts a SemVer range expression to a Python setuptools compatible version\n * constraint expression.\n *\n * @param semverRange the SemVer range expression to convert.\n */\nexport function toPythonVersionRange(semverRange: string): string {\n  const range = new Range(semverRange);\n  return range.set\n    .map((set) =>\n      set\n        .map((comp) => {\n          const versionId = toReleaseVersion(\n            comp.semver.raw?.replace(/-0$/, \"\") ?? \"0.0.0\",\n            TargetName.PYTHON\n          );\n          switch (comp.operator) {\n            case \"\":\n              // With ^0.0.0, somehow we get a left entry with an empty operator and value, we'll fix this up\n              return comp.value === \"\" ? \">=0.0.0\" : `==${versionId}`;\n            case \"=\":\n              return `==${versionId}`;\n            default:\n              // >, >=, <, <= are all valid expressions\n              return `${comp.operator}${versionId}`;\n          }\n        })\n        .join(\", \")\n    )\n    .join(\", \");\n}\n\n/**\n * Converts an original version number from the NPM convention to the target\n * language's convention for expressing the same. For versions that do not\n * include a prerelease identifier, this always returns the assembly version\n * unmodified.\n *\n * @param assemblyVersion the assembly version being released\n * @param target          the target language for which the version is destined\n *\n * @returns the version that should be serialized\n */\nexport function toReleaseVersion(\n  assemblyVersion: string,\n  target: TargetName\n): string {\n  const version = parse(assemblyVersion);\n  if (version == null) {\n    throw new Error(\n      `Unable to parse the provided assembly version: \"${assemblyVersion}\"`\n    );\n  }\n  if (version.prerelease.length === 0) {\n    return assemblyVersion;\n  }\n  switch (target) {\n    case TargetName.PYTHON:\n      // Python supports a limited set of identifiers... And we have a mapping table...\n      // https://packaging.python.org/guides/distributing-packages-using-setuptools/#pre-release-versioning\n      const [label, sequence, ...rest] = version.prerelease;\n      if (rest.filter((elt) => elt !== 0).length > 0 || sequence == null) {\n        throw new Error(\n          `Unable to map prerelease identifier (in: ${assemblyVersion}) components to python: ${inspect(\n            version.prerelease\n          )}. The format should be 'X.Y.Z-label.sequence', where sequence is a positive integer, and label is \"dev\", \"pre\", \"alpha\", beta\", or \"rc\"`\n        );\n      }\n      if (!Number.isInteger(sequence)) {\n        throw new Error(\n          `Unable to map prerelease identifier (in: ${assemblyVersion}) to python, as sequence ${inspect(\n            sequence\n          )} is not an integer`\n        );\n      }\n      const baseVersion = `${version.major}.${version.minor}.${version.patch}`;\n      // See PEP 440: https://www.python.org/dev/peps/pep-0440/#pre-releases\n      switch (label) {\n        case \"dev\":\n        case \"pre\":\n          return `${baseVersion}.dev${sequence}`; // PEP 404 see developmental release as X.Y.devN\n        case \"alpha\":\n          return `${baseVersion}a${sequence}`; // PEP 404 see alpha release as X.YaN\n        case \"beta\":\n          return `${baseVersion}b${sequence}`; // PEP 404 see beta release as X.YbN\n        case \"rc\":\n          return `${baseVersion}rc${sequence}`; // PEP 404 see release candidate as X.YrcN\n        default:\n          throw new Error(\n            `Unable to map prerelease identifier (in: ${assemblyVersion}) to python, as label ${inspect(\n              label\n            )} is not mapped (only \"dev\", \"pre\", \"alpha\", \"beta\" and \"rc\" are)`\n          );\n      }\n    case TargetName.DOTNET:\n    case TargetName.GO:\n    case TargetName.JAVA:\n    case TargetName.JAVASCRIPT:\n      // Not touching - the NPM version number should be usable as-is\n      break;\n  }\n  return assemblyVersion;\n}\n\n/**\n * Converts a semantic version range to the kind of bracket notation used by\n * Maven and NuGet. For example, this turns `^1.2.3` into `[1.2.3,2.0.0)`.\n *\n * @param semverRange The semantic version range to be converted.\n * @param suffix A version suffix to apply to versions in the resulting expression.\n * @param semver Whether the target supports full semantic versioning (including\n *               `-0` as the lowest possible prerelease identifier)\n *\n * @returns a bracket-notation version range.\n */\nfunction toBracketNotation(\n  semverRange: string,\n  suffix?: string,\n  {\n    semver = true,\n    target = TargetName.JAVASCRIPT,\n  }: { semver?: boolean; target?: TargetName } = {}\n): string {\n  if (semverRange === \"*\") {\n    semverRange = \">=0.0.0\";\n  }\n\n  const range = new Range(semverRange);\n  if (semverRange === range.range) {\n    return semverRange;\n  }\n\n  return range.set\n    .map((set) => {\n      if (set.length === 1) {\n        const version = set[0].semver.raw;\n        if (!version && range.raw === \">=0.0.0\") {\n          // Case where version is '*'\n          return \"[0.0.0,)\";\n        }\n        switch (set[0].operator || \"=\") {\n          // \"[version]\" => means exactly version\n          case \"=\":\n            return `[${addSuffix(version)}]`;\n          // \"(version,]\" => means greater than version\n          case \">\":\n            return `(${addSuffix(version)},)`;\n          // \"[version,]\" => means greater than or equal to that version\n          case \">=\":\n            return `[${addSuffix(version)},)`;\n          // \"[,version)\" => means less than version\n          case \"<\":\n            return `(,${addSuffix(version, !semver)})`;\n          // \"[,version]\" => means less than or equal to version\n          case \"<=\":\n            return `(,${addSuffix(version)}]`;\n        }\n      } else if (set.length === 2) {\n        const nugetRange = toBracketRange(set[0], set[1]);\n        if (nugetRange) {\n          return nugetRange;\n        }\n      }\n      throw new Error(\n        `Unsupported SemVer range set in ${semverRange}: ${set\n          .map((comp) => comp.value)\n          .join(\", \")}`\n      );\n    })\n    .join(\", \");\n\n  function toBracketRange(\n    left: Comparator,\n    right: Comparator\n  ): string | undefined {\n    if (left.operator.startsWith(\"<\") && right.operator.startsWith(\">\")) {\n      // Order isn't ideal, swap around..\n      [left, right] = [right, left];\n    }\n\n    // With ^0.0.0, somehow we get a left entry with an empty operator and value, we'll fix this up\n    if (left.operator === \"\" && left.value === \"\") {\n      left = new Comparator(\">=0.0.0\", left.options);\n    }\n\n    if (!left.operator.startsWith(\">\") || !right.operator.startsWith(\"<\")) {\n      // We only support ranges defined like \"> (or >=) left, < (or <=) right\"\n      return undefined;\n    }\n\n    const leftBrace = left.operator.endsWith(\"=\") ? \"[\" : \"(\";\n    const rightBrace = right.operator.endsWith(\"=\") ? \"]\" : \")\";\n    return `${leftBrace}${addSuffix(left.semver.raw)},${addSuffix(\n      right.semver.raw,\n      right.operator === \"<\" && !semver\n    )}${rightBrace}`;\n  }\n\n  function addSuffix(str: string | undefined, trimDashZero = false) {\n    if (!str) {\n      return \"\";\n    }\n    if (trimDashZero) {\n      str = str.replace(/-0$/, \"\");\n    }\n    return suffix ? `${str}${suffix}` : toReleaseVersion(str, target);\n  }\n}\n"
  },
  {
    "path": "src/util/synth.ts",
    "content": "import * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { glob } from \"glob\";\nimport { Project } from \"../project\";\n\n/**\n * Options for the Snapshot synthesis\n */\nexport interface SnapshotOptions {\n  /**\n   * Parse .json files as a JS object for improved inspection.\n   * This will fail if the contents are invalid JSON.\n   *\n   * @default true parse .json files into an object\n   */\n  readonly parseJson?: boolean;\n}\n\nexport interface SynthOutput {\n  [filePath: string]: any;\n}\n\n/**\n * Creates a snapshot of the files generated by a project. Ignores any non-text\n * files so that the snapshots are human readable.\n */\nexport function synthSnapshot(\n  project: Project,\n  options: SnapshotOptions = {}\n): SynthOutput {\n  // defensive: verify that \"outdir\" is actually in a temporary directory\n  if (\n    !path.resolve(project.outdir).startsWith(os.tmpdir()) &&\n    !project.outdir.includes(\"project-temp-dir\")\n  ) {\n    throw new Error(\n      \"Trying to capture a snapshot of a project outside of tmpdir, which implies this test might corrupt an existing project\"\n    );\n  }\n\n  const synthed = Symbol.for(\"synthed\");\n  if (synthed in project) {\n    throw new Error(\"duplicate synth()\");\n  }\n\n  (project as any)[synthed] = true;\n\n  const ENV_PROJEN_DISABLE_POST = process.env.PROJEN_DISABLE_POST;\n  try {\n    process.env.PROJEN_DISABLE_POST = \"true\";\n    project.synth();\n    const ignoreExts = [\"png\", \"ico\"];\n    return directorySnapshot(project.outdir, {\n      ...options,\n      excludeGlobs: ignoreExts.map((ext) => `**/*.${ext}`),\n    });\n  } finally {\n    fs.removeSync(project.outdir);\n\n    // values assigned to process.env.XYZ are automatically converted to strings\n    if (ENV_PROJEN_DISABLE_POST === undefined) {\n      delete process.env.PROJEN_DISABLE_POST;\n    } else {\n      process.env.PROJEN_DISABLE_POST = ENV_PROJEN_DISABLE_POST;\n    }\n  }\n}\n\nexport interface DirectorySnapshotOptions extends SnapshotOptions {\n  /**\n   * Globs of files to exclude.\n   * @default [] include all files\n   */\n  readonly excludeGlobs?: string[];\n\n  /**\n   * Only snapshot the names of files and not their contents.\n   * The value for a path will be `true` if it exists.\n   *\n   * @default false include file content\n   */\n  readonly onlyFileNames?: boolean;\n}\n\nexport function directorySnapshot(\n  root: string,\n  options: DirectorySnapshotOptions = {}\n) {\n  const output: SynthOutput = {};\n\n  const files = glob.sync(\"**\", {\n    ignore: [\".git/**\", ...(options.excludeGlobs ?? [])],\n    cwd: root,\n    nodir: true,\n    dot: true,\n  }); // returns relative file paths with POSIX separators\n\n  const parseJson = options.parseJson ?? true;\n\n  for (const file of files) {\n    const filePath = path.join(root, file);\n\n    let content;\n    if (!options.onlyFileNames) {\n      if (parseJson && path.extname(filePath) === \".json\") {\n        content = fs.readJsonSync(filePath);\n      } else {\n        content = fs.readFileSync(filePath, \"utf-8\");\n      }\n    } else {\n      content = true;\n    }\n\n    output[file] = content;\n  }\n\n  return output;\n}\n"
  },
  {
    "path": "src/util.ts",
    "content": "import * as child_process from \"child_process\";\nimport * as path from \"path\";\nimport * as Case from \"case\";\nimport * as fs from \"fs-extra\";\nimport * as logging from \"./logging\";\n\nconst MAX_BUFFER = 10 * 1024 * 1024;\n\n/**\n * Executes a command with STDOUT > STDERR.\n */\nexport function exec(command: string, options: { cwd: string }): void {\n  logging.debug(command);\n  child_process.execSync(command, {\n    stdio: [\"inherit\", 2, \"pipe\"], // \"pipe\" for STDERR means it appears in exceptions\n    maxBuffer: MAX_BUFFER,\n    cwd: options.cwd,\n  });\n}\n\n/**\n * Executes command and returns STDOUT. If the command fails (non-zero), throws an error.\n */\nexport function execCapture(command: string, options: { cwd: string }) {\n  logging.debug(command);\n  return child_process.execSync(command, {\n    stdio: [\"inherit\", \"pipe\", \"pipe\"], // \"pipe\" for STDERR means it appears in exceptions\n    maxBuffer: MAX_BUFFER,\n    cwd: options.cwd,\n  });\n}\n\n/**\n * Executes `command` and returns its value or undefined if the command failed.\n */\nexport function execOrUndefined(\n  command: string,\n  options: { cwd: string }\n): string | undefined {\n  try {\n    const value = child_process\n      .execSync(command, {\n        stdio: [\"inherit\", \"pipe\", \"pipe\"], // \"pipe\" for STDERR means it appears in exceptions\n        maxBuffer: MAX_BUFFER,\n        cwd: options.cwd,\n      })\n      .toString(\"utf-8\")\n      .trim();\n\n    if (!value) {\n      return undefined;\n    } // an empty string is the same as undefined\n    return value;\n  } catch {\n    return undefined;\n  }\n}\n\nexport interface WriteFileOptions {\n  /**\n   * Whether the generated file should be marked as executable.\n   *\n   * @default false\n   */\n  executable?: boolean;\n\n  /**\n   * Whether the generated file should be readonly.\n   *\n   * @default false\n   */\n  readonly?: boolean;\n}\n\nexport function getFilePermissions(options: WriteFileOptions): string {\n  const readonly = options.readonly ?? false;\n  const executable = options.executable ?? false;\n  if (readonly && executable) {\n    return \"544\";\n  } else if (readonly) {\n    return \"444\";\n  } else if (executable) {\n    return \"755\";\n  } else {\n    return \"644\";\n  }\n}\n\nexport function writeFile(\n  filePath: string,\n  data: any,\n  options: WriteFileOptions = {}\n) {\n  if (fs.existsSync(filePath)) {\n    fs.chmodSync(filePath, \"600\");\n  }\n\n  fs.mkdirpSync(path.dirname(filePath));\n  fs.writeFileSync(filePath, data);\n\n  fs.chmodSync(filePath, getFilePermissions(options));\n}\n\n/**\n * Decamelizes the keys of an object structure, recursing through child objects and arrays.\n * @experimental\n */\nexport interface DecamelizeRecursivelyOptions {\n  /**\n   * Max depth to recurse before erroring.\n   * @default 10\n   */\n  maxDepth?: number;\n\n  /**\n   * Returns true when a key should be decamelized\n   * @default - all keys are decamelized\n   */\n  shouldDecamelize?: (path: string[], value: any) => boolean;\n\n  /**\n   * Separator for decamelizing.\n   * @default \"_\"\n   */\n  separator?: string;\n\n  /**\n   * Current path.\n   * @internal\n   */\n  path?: string[];\n}\n\nexport function decamelizeKeysRecursively(\n  input: any,\n  opt?: DecamelizeRecursivelyOptions\n): any {\n  const shouldAlwaysDecamelize = () => true;\n  const shouldDecamelize = opt?.shouldDecamelize ?? shouldAlwaysDecamelize;\n  const separator = opt?.separator ?? \"_\";\n  const path_ = opt?.path ?? [];\n  const maxDepth = opt?.maxDepth ?? 10;\n\n  if (path_.length > maxDepth) {\n    throw new Error(\n      \"Decamelled too deeply - check that the input has no circular references\"\n    );\n  }\n\n  if (Array.isArray(input)) {\n    return input.map((k, i) =>\n      decamelizeKeysRecursively(k, {\n        ...opt,\n        path: [...path_, i.toString()],\n      })\n    );\n  }\n\n  if (typeof input === \"object\" && input !== null) {\n    const mappedObject: Record<string, any> = {};\n    for (const [key, value] of Object.entries(input)) {\n      const transformedKey = shouldDecamelize([...path_, key], value)\n        ? decamelize(key, separator)\n        : key;\n\n      mappedObject[transformedKey] = decamelizeKeysRecursively(value, {\n        ...opt,\n        path: [...path_, key],\n      });\n    }\n\n    return mappedObject;\n  }\n\n  return input;\n}\n\n/**\n * Returns false if value is unset or a falsey value, and true otherwise.\n * @param value an environment variable\n */\nexport function isTruthy(value: string | undefined): boolean {\n  return !(\n    value === undefined ||\n    [\"null\", \"undefined\", \"0\", \"false\", \"\"].includes(value.toLocaleLowerCase())\n  );\n}\n\n/**\n * Type of a map mapping strings to some arbitrary type\n */\nexport type Obj<T> = { [key: string]: T };\n\n/**\n * Return whether the given value is an object\n *\n * Even though arrays and instances of classes technically are objects, we\n * usually want to treat them differently, so we return false in those cases.\n */\nexport function isObject(x: any): x is Obj<any> {\n  return (\n    x !== null &&\n    typeof x === \"object\" &&\n    !Array.isArray(x) &&\n    x.constructor.name === \"Object\"\n  );\n}\n\n/**\n * Recursively merge objects together\n *\n * The leftmost object is mutated and returned. Arrays are not merged\n * but overwritten just like scalars.\n *\n * If an object is merged into a non-object, the non-object is lost.\n *\n * `undefined`s will cause a value to be deleted if destructive is enabled.\n */\nexport function deepMerge(\n  objects: Array<Obj<any> | undefined>,\n  destructive: boolean = false\n) {\n  function mergeOne(target: Obj<any>, source: Obj<any>) {\n    for (const key of Object.keys(source)) {\n      const value = source[key];\n\n      if (isObject(value)) {\n        // if the value at the target is not an object, override it with an\n        // object so we can continue the recursion\n        if (typeof target[key] !== \"object\") {\n          target[key] = value;\n        }\n\n        if (\"__$APPEND\" in value && Array.isArray(value.__$APPEND)) {\n          if (Array.isArray(target[key])) {\n            target[key].push(...value.__$APPEND);\n          } else {\n            target[key] = value.__$APPEND;\n          }\n        }\n\n        mergeOne(target[key], value);\n\n        // if the result of the merge is an empty object, it's because the\n        // eventual value we assigned is `undefined`, and there are no\n        // sibling concrete values alongside, so we can delete this tree.\n        const output = target[key];\n        if (\n          typeof output === \"object\" &&\n          Object.keys(output).length === 0 &&\n          destructive\n        ) {\n          delete target[key];\n        }\n      } else if (value === undefined && destructive) {\n        delete target[key];\n      } else if (typeof value !== \"undefined\") {\n        target[key] = value;\n      }\n    }\n  }\n\n  const others = objects.filter((x) => x != null) as Array<Obj<any>>;\n\n  if (others.length === 0) {\n    return {};\n  }\n  const into = others.splice(0, 1)[0];\n\n  others.forEach((other) => mergeOne(into, other));\n  return into;\n}\n\n/*\n * Deduplicate values in a list, returning a new array.\n * @param array list of values\n */\nexport function dedupArray<T>(array: T[]): T[] {\n  return array.filter((val, idx) => array.indexOf(val) === idx);\n}\n\n/**\n * Returns a sorted version of `x` or `undefined` if it is an empty array or object.\n */\nexport function sorted<T>(x: T) {\n  if (x == null) {\n    return undefined;\n  }\n  if (Array.isArray(x)) {\n    if (x.length === 0) {\n      return undefined;\n    }\n    return (x as unknown[]).sort();\n  } else if (typeof x === \"object\") {\n    if (Object.keys(x).length === 0) {\n      return undefined;\n    }\n    const result: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(x).sort(([l], [r]) =>\n      l.localeCompare(r)\n    )) {\n      result[key] = value;\n    }\n    return result as T;\n  } else {\n    return x;\n  }\n}\n\nexport function formatAsPythonModule(name: string) {\n  return name.replace(/-/g, \"_\").replace(/\\./g, \"_\");\n}\n\n/**\n * Extract git version number from command line\n *\n * @param gitVersionOutput the output from `git version` CLI\n * @returns the version of git\n */\nexport function getGitVersion(gitVersionOutput: string) {\n  const match = gitVersionOutput.match(/\\d+.\\d+.\\d+/);\n  if (!match) {\n    throw new Error(\"Unable to retrieve git version\");\n  }\n\n  return match[0];\n}\n\nexport function kebabCaseKeys<T = unknown>(obj: T, recursive = true): T {\n  if (typeof obj !== \"object\" || obj == null) {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    if (recursive) {\n      obj = obj.map((v) => kebabCaseKeys(v, recursive)) as any;\n    }\n    return obj;\n  }\n\n  const result: Record<string, unknown> = {};\n  for (let [k, v] of Object.entries(obj)) {\n    if (recursive) {\n      v = kebabCaseKeys(v, recursive);\n    }\n    result[decamelize(k).replace(/_/gm, \"-\")] = v;\n  }\n  return result as any;\n}\n\nexport function snakeCaseKeys<T = unknown>(\n  obj: T,\n  recursive = true,\n  exclusiveForRecordKeys: string[] = []\n): T {\n  if (typeof obj !== \"object\" || obj == null) {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    if (recursive) {\n      obj = obj.map((v) =>\n        snakeCaseKeys(v, recursive, exclusiveForRecordKeys)\n      ) as any;\n    }\n    return obj;\n  }\n\n  const result: Record<string, unknown> = {};\n  for (let [k, v] of Object.entries(obj)) {\n    if (recursive) {\n      v = snakeCaseKeys(v, recursive, exclusiveForRecordKeys);\n    }\n    const modifiedKey =\n      exclusiveForRecordKeys.length == 0 || exclusiveForRecordKeys.includes(k)\n        ? Case.snake(k)\n        : k;\n    result[modifiedKey] = v;\n  }\n  return result as any;\n}\n\nexport async function tryReadFile(file: string) {\n  if (!(await fs.pathExists(file))) {\n    return \"\";\n  }\n\n  return fs.readFile(file, \"utf8\");\n}\n\nexport function tryReadFileSync(file: string) {\n  if (!fs.pathExistsSync(file)) {\n    return undefined;\n  }\n\n  return fs.readFileSync(file, \"utf8\");\n}\n\nexport function isWritable(file: string) {\n  try {\n    fs.accessSync(file, fs.constants.W_OK);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport function isExecutable(file: string) {\n  try {\n    fs.accessSync(file, fs.constants.X_OK);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction decamelize(s: string, sep: string = \"_\") {\n  if (Case.of(s) === \"camel\") {\n    return Case.lower(s, sep);\n  } else {\n    return s;\n  }\n}\n\nexport function getNodeMajorVersion(): number | undefined {\n  const match = process.version.match(/(\\d+)\\.(\\d+)\\.(\\d+)/);\n  if (match) {\n    const [major] = match.slice(1).map((x) => parseInt(x));\n    return major;\n  }\n  return undefined;\n}\n\nexport function anySelected(options: (boolean | undefined)[]): boolean {\n  return options.some((opt) => opt);\n}\n\nexport function multipleSelected(options: (boolean | undefined)[]): boolean {\n  return options.filter((opt) => opt).length > 1;\n}\n"
  },
  {
    "path": "src/version.ts",
    "content": "import { posix } from \"path\";\nimport { Component } from \"./component\";\nimport { Project } from \"./project\";\nimport { Task } from \"./task\";\n\n/**\n * Options for `Version`.\n */\nexport interface VersionOptions {\n  /**\n   * A name of a .json file to set the `version` field in after a bump.\n   *\n   * @example \"package.json\"\n   */\n  readonly versionInputFile: string;\n\n  /**\n   * The name of the directory into which `changelog.md` and `version.txt` files\n   * are emitted.\n   */\n  readonly artifactsDirectory: string;\n\n  /**\n   * Custom configuration for versionrc file used by standard-release\n   */\n  readonly versionrcOptions?: Record<string, any>;\n\n  /**\n   * The tag prefix corresponding to this version.\n   */\n  readonly tagPrefix?: string;\n}\n\nexport class Version extends Component {\n  public static readonly STANDARD_VERSION = \"standard-version@^9\";\n\n  public readonly bumpTask: Task;\n  public readonly unbumpTask: Task;\n\n  /**\n   * The name of the changelog file (under `artifactsDirectory`).\n   */\n  public readonly changelogFileName: string;\n\n  /**\n   * The name of the file that contains the version (under `artifactsDirectory`).\n   */\n  public readonly versionFileName: string;\n\n  /**\n   * The name of the file that contains the release tag (under `artifactsDirectory`).\n   */\n  public readonly releaseTagFileName: string;\n\n  constructor(project: Project, options: VersionOptions) {\n    super(project);\n\n    this.changelogFileName = \"changelog.md\";\n    this.versionFileName = \"version.txt\";\n    this.releaseTagFileName = \"releasetag.txt\";\n\n    const versionInputFile = options.versionInputFile;\n\n    // this command determines if there were any changes since the last release\n    // (the top-most commit is not a bump). it is used as a condition for both\n    // the `bump` and the `release` tasks.\n    const changesSinceLastRelease =\n      '! git log --oneline -1 | grep -q \"chore(release):\"';\n\n    const changelogFile = posix.join(\n      options.artifactsDirectory,\n      this.changelogFileName\n    );\n    const bumpFile = posix.join(\n      options.artifactsDirectory,\n      this.versionFileName\n    );\n    const releaseTagFile = posix.join(\n      options.artifactsDirectory,\n      this.releaseTagFileName\n    );\n\n    const env = {\n      OUTFILE: versionInputFile,\n      CHANGELOG: changelogFile,\n      BUMPFILE: bumpFile,\n      RELEASETAG: releaseTagFile,\n      RELEASE_TAG_PREFIX: options.tagPrefix ?? \"\",\n      // doesn't work if custom configuration is long\n      VERSIONRCOPTIONS: JSON.stringify(options.versionrcOptions),\n    };\n\n    this.bumpTask = project.addTask(\"bump\", {\n      description:\n        \"Bumps version based on latest git tag and generates a changelog entry\",\n      condition: changesSinceLastRelease,\n      env: env,\n    });\n\n    this.bumpTask.builtin(\"release/bump-version\");\n\n    this.unbumpTask = project.addTask(\"unbump\", {\n      description: \"Restores version to 0.0.0\",\n      env: env,\n    });\n\n    this.unbumpTask.builtin(\"release/reset-version\");\n\n    project.addGitIgnore(`/${changelogFile}`);\n    project.addGitIgnore(`/${bumpFile}`);\n    project.addPackageIgnore(`/${changelogFile}`);\n    project.addPackageIgnore(`/${bumpFile}`);\n  }\n}\n"
  },
  {
    "path": "src/vscode/devcontainer.ts",
    "content": "import { Component } from \"../component\";\nimport {\n  DevEnvironmentDockerImage,\n  DevEnvironmentOptions,\n  IDevEnvironment,\n} from \"../dev-env\";\nimport { JsonFile } from \"../json\";\nimport { Project } from \"../project\";\nimport { Task } from \"../task\";\n\n/**\n * Relative path of devcontainer file to generate\n */\nconst DEVCONTAINER_FILE = \".devcontainer.json\";\n\n/**\n * Constructor options for the DevContainer component.\n *\n * The default docker image used for GitHub Codespaces is defined here:\n * @see https://github.com/microsoft/vscode-dev-containers/tree/master/containers/codespaces-linux\n */\nexport interface DevContainerOptions extends DevEnvironmentOptions {}\n\n/**\n * A development environment running VSCode in a container; used by GitHub\n * codespaces.\n */\nexport class DevContainer extends Component implements IDevEnvironment {\n  private dockerImage: DevEnvironmentDockerImage | undefined;\n  private readonly postCreateTasks: Task[];\n  private readonly ports: string[];\n  private readonly vscodeExtensions: string[];\n\n  /**\n   * Direct access to the devcontainer configuration (escape hatch)\n   */\n  public readonly config: any;\n\n  constructor(project: Project, options: DevContainerOptions = {}) {\n    super(project);\n\n    this.postCreateTasks = new Array<Task>();\n    this.ports = new Array<string>();\n    this.vscodeExtensions = new Array<string>();\n\n    this.dockerImage = options?.dockerImage;\n\n    if (options?.tasks) {\n      for (const task of options.tasks) {\n        this.addTasks(task);\n      }\n    }\n    if (options?.ports) {\n      this.addPorts(...options.ports);\n    }\n    if (options?.vscodeExtensions) {\n      this.addVscodeExtensions(...options.vscodeExtensions);\n    }\n\n    this.config = {\n      image: () => this.dockerImage?.image,\n      build: {\n        dockerfile: () => this.dockerImage?.dockerFile,\n      },\n      postCreateCommand: () => this.renderTasks(),\n      forwardPorts: this.ports,\n      extensions: this.vscodeExtensions,\n    };\n\n    new JsonFile(this.project, DEVCONTAINER_FILE, {\n      obj: this.config,\n      omitEmpty: true,\n    });\n  }\n\n  public addDockerImage(image: DevEnvironmentDockerImage) {\n    if (this.dockerImage) {\n      throw new Error(\"dockerImage cannot be redefined.\");\n    }\n    this.dockerImage = image;\n  }\n\n  /**\n   * Adds tasks to run when the container starts. Tasks will be run in sequence.\n   *\n   * @param tasks The new tasks\n   */\n  public addTasks(...tasks: Task[]) {\n    this.postCreateTasks.push(...tasks);\n  }\n\n  /**\n   * Adds ports that should be exposed (forwarded) from the container.\n   *\n   * @param ports The new ports\n   */\n  public addPorts(...ports: string[]) {\n    this.ports.push(...ports);\n  }\n\n  /**\n   * Adds a list of VSCode extensions that should be automatically installed\n   * in the container.\n   *\n   * @param extensions The extension IDs\n   */\n  public addVscodeExtensions(...extensions: string[]) {\n    this.vscodeExtensions.push(...extensions);\n  }\n\n  private renderTasks() {\n    if (this.postCreateTasks.length !== 0) {\n      return this.postCreateTasks\n        .map((task) => `( npx projen ${task.name} )`)\n        .join(\" && \");\n    } else {\n      return undefined;\n    }\n  }\n}\n"
  },
  {
    "path": "src/vscode/extensions.ts",
    "content": "import { Component } from \"../component\";\nimport { JsonFile } from \"../json\";\nimport { VsCode } from \"./vscode\";\n\n/**\n * VS Code Workspace recommended extensions\n * Source: https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions\n */\nexport class VsCodeRecommendedExtensions extends Component {\n  /**\n   * List of extensions which should be recommended for users of this workspace.\n   * The identifier of an extension is always '${publisher}.${name}'. For example: 'ms-python.python'.\n   *\n   * @default - no recommendations are made\n   */\n  private readonly recommendations: string[] = [];\n\n  /**\n   * List of extensions recommended by VS Code that should not be recommended for users of this workspace.\n   * The identifier of an extension is always '${publisher}.${name}'. For example: 'ms-python.python'.\n   *\n   * @default - no recommendations are marked unwanted\n   */\n  private readonly unwantedRecommendations: string[] = [];\n\n  constructor(vscode: VsCode) {\n    super(vscode.project);\n\n    new JsonFile(vscode.project, \".vscode/extensions.json\", {\n      omitEmpty: true,\n      allowComments: true,\n      obj: {\n        recommendations: this.recommendations,\n        unwantedRecommendations: this.unwantedRecommendations,\n      },\n    });\n  }\n\n  /**\n   * Adds a list of VS Code extensions as recommendations for this workspace.\n   *\n   * @param extensions The extension IDs\n   */\n  public addRecommendations(...extensions: string[]) {\n    this.recommendations.push(...extensions);\n  }\n\n  /**\n   * Marks a list of VS Code extensions as unwanted recommendations for this workspace.\n   * VS Code should not be recommend these extensions for users of this workspace.\n   *\n   * @param extensions The extension IDs\n   */\n  public addUnwantedRecommendations(...extensions: string[]) {\n    this.unwantedRecommendations.push(...extensions);\n  }\n}\n"
  },
  {
    "path": "src/vscode/index.ts",
    "content": "export * from \"./devcontainer\";\nexport * from \"./extensions\";\nexport * from \"./launch-config\";\nexport * from \"./settings\";\nexport * from \"./vscode\";\n"
  },
  {
    "path": "src/vscode/launch-config.ts",
    "content": "import { Component } from \"../component\";\nimport { JsonFile } from \"../json\";\nimport { VsCode } from \"./vscode\";\n\n/**\n * Controls where to launch the debug target\n * Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes\n */\nexport enum Console {\n  INTERNAL_CONSOLE = \"internalConsole\",\n  INTEGRATED_TERMINAL = \"integratedTerminal\",\n  EXTERNAL_TERMINAL = \"externalTerminal\",\n}\n\n/**\n * Controls the visibility of the VSCode Debug Console panel during a debugging session\n * Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes\n */\nexport enum InternalConsoleOptions {\n  NEVER_OPEN = \"neverOpen\",\n  OPEN_ON_FIRST_SESSION_START = \"openOnFirstSessionStart\",\n  OPEN_ON_SESSION_START = \"openOnSessionStart\",\n}\n\n/**\n * VSCode launch configuration Presentation interface\n * \"using the order, group, and hidden attributes in the presentation object you can sort,\n * group, and hide configurations and compounds in the Debug configuration dropdown\n * and in the Debug quick pick.\"\n * Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes\n */\nexport interface Presentation {\n  readonly hidden: boolean;\n  readonly group: string;\n  readonly order: number;\n}\n/**\n * VSCode launch configuration ServerReadyAction interface\n * \"if you want to open a URL in a web browser whenever the program under debugging\n * outputs a specific message to the debug console or integrated terminal.\"\n * Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes\n */\nexport interface ServerReadyAction {\n  readonly action: string;\n  readonly pattern?: string;\n  readonly uriFormat?: string;\n}\n\n/**\n * Options for a 'VsCodeLaunchConfigurationEntry'\n * Source: https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes\n */\nexport interface VsCodeLaunchConfigurationEntry {\n  readonly type: string;\n  readonly request: string;\n  readonly name: string;\n  readonly args?: string[];\n  readonly debugServer?: number;\n  readonly internalConsoleOptions?: InternalConsoleOptions;\n  readonly runtimeArgs?: string[];\n  readonly postDebugTask?: string;\n  readonly preLaunchTask?: string;\n  readonly presentation?: Presentation;\n  readonly program?: string;\n  readonly serverReadyAction?: ServerReadyAction;\n  readonly skipFiles?: string[];\n  readonly outFiles?: string[];\n  readonly url?: string;\n  readonly webRoot?: string;\n  /**\n   * Set value to `false` to unset an existing environment variable\n   */\n  readonly env?: Record<string, string | false>;\n  readonly envFile?: string;\n  readonly cwd?: string;\n  readonly port?: number;\n  readonly stopOnEntry?: boolean; // Schema says `boolean | string`, but I cannot find a documented use case for string\n  readonly console?: Console;\n  readonly disableOptimisticBPs?: boolean; // undocumented option used by the jest extension, see https://github.com/microsoft/vscode/issues/64079#issuecomment-443304548\n}\n\n/**\n * VSCode launch configuration file (launch.json), useful for enabling in-editor debugger\n */\nexport class VsCodeLaunchConfig extends Component {\n  private static renderLaunchConfig(cfg: VsCodeLaunchConfigurationEntry) {\n    if (!cfg.env) {\n      return cfg;\n    }\n\n    return {\n      ...cfg,\n      env: Object.fromEntries(\n        Object.entries(cfg.env).map(([key, value]) => [\n          key,\n          value === false ? null : value,\n        ])\n      ),\n    };\n  }\n\n  private readonly content: VsCodeLaunchConfiguration;\n\n  constructor(vscode: VsCode) {\n    super(vscode.project);\n\n    this.content = {\n      version: \"0.2.0\",\n      configurations: [],\n    };\n\n    new JsonFile(vscode.project, \".vscode/launch.json\", {\n      obj: () => ({\n        ...this.content,\n        configurations: this.content.configurations.map(\n          VsCodeLaunchConfig.renderLaunchConfig\n        ),\n      }),\n    });\n  }\n\n  /**\n   * Adds a VsCodeLaunchConfigurationEntry (e.g. a node.js debugger) to `.vscode/launch.json.\n   * Each configuration entry has following mandatory fields: type, request and name.\n   * See https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes for details.\n   * @param cfg VsCodeLaunchConfigurationEntry\n   */\n  public addConfiguration(cfg: VsCodeLaunchConfigurationEntry) {\n    this.content.configurations.push(cfg);\n  }\n}\n\ninterface VsCodeLaunchConfiguration {\n  version: string;\n  configurations: VsCodeLaunchConfigurationEntry[];\n}\n"
  },
  {
    "path": "src/vscode/settings.ts",
    "content": "import { Component } from \"../component\";\nimport { JsonFile } from \"../json\";\nimport { VsCode } from \"./vscode\";\n\n/**\n * VS Code Workspace settings\n * Source: https://code.visualstudio.com/docs/getstarted/settings#_workspace-settings\n */\nexport class VsCodeSettings extends Component {\n  private readonly content: any;\n\n  constructor(vscode: VsCode) {\n    super(vscode.project);\n\n    this.content = {};\n\n    new JsonFile(vscode.project, \".vscode/settings.json\", {\n      omitEmpty: false,\n      obj: this.content,\n    });\n  }\n\n  /**\n   * Adds a workspace setting\n   *\n   * @param setting The setting ID\n   * @param value The value of the setting\n   * @param language Scope the setting to a specific language\n   */\n  public addSetting(setting: string, value: unknown, language?: string) {\n    if (language) {\n      this.content[`[${language}]`] = this.content[`[${language}]`] ?? {};\n      this.content[`[${language}]`][setting] = value;\n    } else {\n      this.content[setting] = value;\n    }\n  }\n\n  /**\n   * Adds a workspace setting\n   *\n   * @param settings Array structure: [setting: string, value: any, languages?: string[]]\n   */\n  public addSettings(\n    settings: Record<string, unknown>,\n    languages?: string | string[]\n  ) {\n    if (Array.isArray(languages)) {\n      languages.forEach((language) => {\n        Object.entries(settings).forEach(([setting, value]) =>\n          this.addSetting(setting, value, language)\n        );\n      });\n    } else {\n      Object.entries(settings).forEach(([setting, value]) =>\n        this.addSetting(setting, value, languages)\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "src/vscode/vscode.ts",
    "content": "import { Component } from \"../component\";\nimport { Project } from \"../project\";\nimport { VsCodeRecommendedExtensions } from \"./extensions\";\nimport { VsCodeLaunchConfig } from \"./launch-config\";\nimport { VsCodeSettings } from \"./settings\";\n\nexport class VsCode extends Component {\n  private _launchConfig?: VsCodeLaunchConfig;\n  private _settings?: VsCodeSettings;\n  private _extensions?: VsCodeRecommendedExtensions;\n\n  constructor(project: Project) {\n    super(project);\n  }\n\n  public get launchConfiguration() {\n    if (!this._launchConfig) {\n      this._launchConfig = new VsCodeLaunchConfig(this);\n    }\n\n    return this._launchConfig;\n  }\n\n  public get settings() {\n    if (!this._settings) {\n      this._settings = new VsCodeSettings(this);\n    }\n\n    return this._settings;\n  }\n\n  public get extensions() {\n    if (!this._extensions) {\n      this._extensions = new VsCodeRecommendedExtensions(this);\n    }\n\n    return this._extensions;\n  }\n}\n"
  },
  {
    "path": "src/web/index.ts",
    "content": "export * from \"./next\";\nexport * from \"./postcss\";\nexport * from \"./react\";\nexport * from \"./tailwind\";\n"
  },
  {
    "path": "src/web/next.ts",
    "content": "import { Component } from \"../component\";\nimport {\n  NodeProject,\n  NodeProjectOptions,\n  TypeScriptJsxMode,\n  TypeScriptModuleResolution,\n} from \"../javascript\";\nimport { SampleDir, SampleFile } from \"../sample-file\";\nimport { TypeScriptAppProject, TypeScriptProjectOptions } from \"../typescript\";\nimport { deepMerge } from \"../util\";\nimport { PostCss } from \"./postcss\";\n\nexport interface NextJsCommonProjectOptions {\n  /**\n   * Assets directory\n   *\n   * @default \"public\"\n   */\n  readonly assetsdir?: string;\n\n  /**\n   * Setup Tailwind CSS as a PostCSS plugin.\n   *\n   * @see https://tailwindcss.com/docs/installation\n   *\n   * @default true\n   * @featured\n   */\n  readonly tailwind?: boolean;\n}\n\nexport interface NextJsTypeScriptProjectOptions\n  extends NextJsCommonProjectOptions,\n    TypeScriptProjectOptions {}\n\nexport interface NextJsProjectOptions\n  extends NextJsCommonProjectOptions,\n    NodeProjectOptions {\n  /**\n   * Typescript sources directory.\n   *\n   * @default \"src\"\n   */\n  readonly srcdir?: string;\n\n  /**\n   * Generate one-time sample in `pages/` and `public/` if there are no files there.\n   * @default true\n   */\n  readonly sampleCode?: boolean;\n}\n\n/**\n * Next.js project without TypeScript.\n *\n * @pjid nextjs\n */\nexport class NextJsProject extends NodeProject {\n  /**\n   * The directory in which source files reside.\n   */\n  public readonly srcdir: string;\n\n  /**\n   * The directory in which app assets reside.\n   */\n  public readonly assetsdir: string;\n\n  /**\n   * Setup Tailwind as a PostCSS plugin.\n   *\n   * @see https://tailwindcss.com/docs/installation\n   */\n  public readonly tailwind: boolean;\n\n  constructor(options: NextJsProjectOptions) {\n    super({\n      jest: false,\n      minNodeVersion: \"12.22.0\", // https://nextjs.org/docs#system-requirements\n      workflowNodeVersion: \"14.x\",\n      ...options,\n    });\n\n    this.srcdir = options.srcdir ?? \"pages\";\n    this.assetsdir = options.assetsdir ?? \"public\";\n    this.tailwind = options.tailwind ?? true;\n\n    new NextComponent(this, { typescript: false, tailwind: this.tailwind });\n\n    // generate sample code in `pages` and `public` if these directories are empty or non-existent.\n    if (options.sampleCode ?? true) {\n      new NextSampleCode(this, {\n        fileExt: \"js\",\n        srcdir: this.srcdir,\n        assetsdir: this.assetsdir,\n        tailwind: this.tailwind,\n      });\n    }\n  }\n}\n\n/**\n * Next.js project with TypeScript.\n *\n * @pjid nextjs-ts\n */\nexport class NextJsTypeScriptProject extends TypeScriptAppProject {\n  /**\n   * The directory in which source files reside.\n   */\n  public readonly srcdir: string;\n\n  /**\n   * The directory in which app assets reside.\n   */\n  public readonly assetsdir: string;\n\n  /**\n   * Setup Tailwind as a PostCSS plugin.\n   *\n   * @see https://tailwindcss.com/docs/installation\n   */\n  public readonly tailwind: boolean;\n\n  constructor(options: NextJsTypeScriptProjectOptions) {\n    const defaultOptions = {\n      srcdir: \"pages\",\n      eslint: false,\n      minNodeVersion: \"12.22.0\", // https://nextjs.org/docs#system-requirements\n      jest: false,\n      workflowNodeVersion: \"14.x\",\n      tsconfig: {\n        include: [\"**/*.ts\", \"**/*.tsx\"],\n        compilerOptions: {\n          // required by Next.js\n          esModuleInterop: true,\n          module: \"CommonJS\",\n          moduleResolution: TypeScriptModuleResolution.NODE,\n          isolatedModules: true,\n          resolveJsonModule: true,\n          jsx: TypeScriptJsxMode.PRESERVE,\n\n          // recommended by Next.js\n          allowJs: true,\n          skipLibCheck: true,\n          forceConsistentCasingInFileNames: true,\n          noEmit: true,\n          lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n          strict: false,\n          target: \"es5\",\n          incremental: true,\n        },\n      },\n    };\n\n    // never generate default TypeScript sample code, since this class provides its own\n    super(\n      deepMerge([\n        defaultOptions,\n        options,\n        { sampleCode: false },\n      ]) as TypeScriptProjectOptions\n    );\n\n    this.srcdir = options.srcdir ?? \"pages\";\n    this.assetsdir = options.assetsdir ?? \"public\";\n    this.tailwind = options.tailwind ?? true;\n\n    new NextComponent(this, { typescript: true, tailwind: this.tailwind });\n\n    // 'next build' command fails if tsconfig.json is immutable\n    if (this.tsconfig) {\n      this.tsconfig.file.readonly = false;\n    }\n\n    // generate sample code in `pages` and `public` if these directories are empty or non-existent.\n    if (options.sampleCode ?? true) {\n      new NextSampleCode(this, {\n        fileExt: \"tsx\",\n        srcdir: this.srcdir,\n        assetsdir: this.assetsdir,\n        tailwind: this.tailwind,\n      });\n    }\n  }\n}\n\nexport interface NextComponentOptions {\n  /**\n   * Whether to apply options specific for TypeScript Next.js projects.\n   *\n   * @default false\n   */\n  readonly typescript?: boolean;\n\n  /**\n   * Setup Tailwind as a PostCSS plugin.\n   *\n   * @see https://tailwindcss.com/docs/installation\n   *\n   * @default true\n   */\n  readonly tailwind?: boolean;\n}\n\nexport class NextComponent extends Component {\n  private readonly typescript: boolean;\n  private readonly tailwind: boolean;\n\n  constructor(project: NodeProject, options: NextComponentOptions) {\n    super(project);\n\n    this.typescript = options.typescript ?? false;\n    this.tailwind = options.tailwind ?? true;\n\n    project.addDeps(\"next\", \"react\", \"react-dom\");\n    if (this.typescript) {\n      project.addDevDeps(\"@types/react\", \"@types/react-dom\");\n    }\n    if (this.tailwind) {\n      new PostCss(project, { tailwind: true });\n    }\n\n    // NextJS CLI commands, see: https://nextjs.org/docs/api-reference/cli\n    project.addTask(\"dev\", {\n      description: \"Starts the Next.js application in development mode\",\n      exec: \"next dev\",\n    });\n\n    project.compileTask.exec(\"next build\");\n\n    project.addTask(\"export\", {\n      description: \"Exports the application for production deployment\",\n      exec: \"next export\",\n    });\n\n    project.addTask(\"server\", {\n      description: \"Starts the Next.js application in production mode\",\n      exec: \"next start\",\n    });\n\n    project.addTask(\"telemetry\", {\n      description: \"Checks the status of Next.js telemetry collection\",\n      exec: \"next telemetry\",\n    });\n\n    project.npmignore?.exclude(\"# Next.js\", \"/.next/\");\n    project.gitignore.exclude(\"# Next.js\", \"/.next/\");\n  }\n}\n\ninterface NextSampleCodeOptions {\n  /**\n   * File extension for sample javascript code to be saved as.\n   *\n   * @default \"js\"\n   */\n  readonly fileExt?: string;\n\n  /**\n   * The directory in which Next.js pages are declared.\n   */\n  readonly srcdir: string;\n\n  /**\n   * The directory in which app assets reside.\n   */\n  readonly assetsdir: string;\n\n  /**\n   * Setup Tailwind as a PostCSS plugin.\n   */\n  readonly tailwind: boolean;\n}\n\nclass NextSampleCode extends Component {\n  private readonly fileExt: string;\n  private readonly srcdir: string;\n  private readonly assetsdir: string;\n  private readonly tailwind: boolean;\n\n  constructor(project: NodeProject, options: NextSampleCodeOptions) {\n    super(project);\n\n    this.fileExt = options.fileExt ?? \"js\";\n    this.srcdir = options.srcdir;\n    this.assetsdir = options.assetsdir;\n    this.tailwind = options.tailwind;\n\n    const indexJs = [\n      'import Head from \"next/head\"',\n      \"\",\n      \"export default function Home() {\",\n      \"  return (\",\n      '    <div className=\"container\">',\n      \"      <Head>\",\n      \"        <title>Create Next App</title>\",\n      \"      </Head>\",\n      \"\",\n      \"      <main>\",\n      '        <h1 className=\"title\">',\n      '          Welcome to <a href=\"https://nextjs.org\">Next.js!</a>',\n      \"        </h1>\",\n      \"\",\n      '        <p className=\"description\">',\n      \"          Get started by editing <code>pages/index.js</code>\",\n      \"        </p>\",\n      \"\",\n      '        <div className=\"grid\">',\n      '          <a href=\"https://nextjs.org/docs\" className=\"card\">',\n      \"            <h3>Documentation &rarr;</h3>\",\n      \"            <p>Find in-depth information about Next.js features and API.</p>\",\n      \"          </a>\",\n      \"\",\n      '          <a href=\"https://nextjs.org/learn\" className=\"card\">',\n      \"            <h3>Learn &rarr;</h3>\",\n      \"            <p>Learn about Next.js in an interactive course with quizzes!</p>\",\n      \"          </a>\",\n      \"\",\n      \"          <a\",\n      '            href=\"https://github.com/vercel/next.js/tree/master/examples\"',\n      '            className=\"card\"',\n      \"          >\",\n      \"            <h3>Examples &rarr;</h3>\",\n      \"            <p>Discover and deploy boilerplate example Next.js projects.</p>\",\n      \"          </a>\",\n      \"\",\n      \"          <a\",\n      '            href=\"https://vercel.com/import?filter=next.js&utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app\"',\n      '            className=\"card\"',\n      \"          >\",\n      \"            <h3>Deploy &rarr;</h3>\",\n      \"            <p>\",\n      \"              Instantly deploy your Next.js site to a public URL with Vercel.\",\n      \"            </p>\",\n      \"          </a>\",\n      \"        </div>\",\n      \"      </main>\",\n      \"\",\n      \"      <footer>\",\n      \"        <a\",\n      '          href=\"https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app\"',\n      '          target=\"_blank\"',\n      '          rel=\"noopener noreferrer\"',\n      \"        >\",\n      \"          Powered by Vercel\",\n      '          <img src=\"/vercel.svg\" alt=\"Vercel Logo\" className=\"logo\" />',\n      \"        </a>\",\n      \"      </footer>\",\n      \"\",\n      \"      <style jsx>{`\",\n      \"        .container {\",\n      \"          min-height: 100vh;\",\n      \"          padding: 0 0.5rem;\",\n      \"          display: flex;\",\n      \"          flex-direction: column;\",\n      \"          justify-content: center;\",\n      \"          align-items: center;\",\n      \"        }\",\n      \"\",\n      \"        main {\",\n      \"          padding: 5rem 0;\",\n      \"          flex: 1;\",\n      \"          display: flex;\",\n      \"          flex-direction: column;\",\n      \"          justify-content: center;\",\n      \"          align-items: center;\",\n      \"        }\",\n      \"\",\n      \"        footer {\",\n      \"          width: 100%;\",\n      \"          height: 100px;\",\n      \"          border-top: 1px solid #eaeaea;\",\n      \"          display: flex;\",\n      \"          justify-content: center;\",\n      \"          align-items: center;\",\n      \"        }\",\n      \"\",\n      \"        footer img {\",\n      \"          margin-left: 0.5rem;\",\n      \"        }\",\n      \"\",\n      \"        footer a {\",\n      \"          display: flex;\",\n      \"          justify-content: center;\",\n      \"          align-items: center;\",\n      \"        }\",\n      \"\",\n      \"        a {\",\n      \"          color: inherit;\",\n      \"          text-decoration: none;\",\n      \"        }\",\n      \"\",\n      \"        .title a {\",\n      \"          color: #0070f3;\",\n      \"          text-decoration: none;\",\n      \"        }\",\n      \"\",\n      \"        .title a:hover,\",\n      \"        .title a:focus,\",\n      \"        .title a:active {\",\n      \"          text-decoration: underline;\",\n      \"        }\",\n      \"\",\n      \"        .title {\",\n      \"          margin: 0;\",\n      \"          line-height: 1.15;\",\n      \"          font-size: 4rem;\",\n      \"        }\",\n      \"\",\n      \"        .title,\",\n      \"        .description {\",\n      \"          text-align: center;\",\n      \"        }\",\n      \"\",\n      \"        .description {\",\n      \"          line-height: 1.5;\",\n      \"          font-size: 1.5rem;\",\n      \"        }\",\n      \"\",\n      \"        code {\",\n      \"          background: #fafafa;\",\n      \"          border-radius: 5px;\",\n      \"          padding: 0.75rem;\",\n      \"          font-size: 1.1rem;\",\n      \"          font-family: Menlo, Monaco, Lucida Console, Liberation Mono,\",\n      \"            DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;\",\n      \"        }\",\n      \"\",\n      \"        .grid {\",\n      \"          display: flex;\",\n      \"          align-items: center;\",\n      \"          justify-content: center;\",\n      \"          flex-wrap: wrap;\",\n      \"\",\n      \"          max-width: 800px;\",\n      \"          margin-top: 3rem;\",\n      \"        }\",\n      \"\",\n      \"        .card {\",\n      \"          margin: 1rem;\",\n      \"          flex-basis: 45%;\",\n      \"          padding: 1.5rem;\",\n      \"          text-align: left;\",\n      \"          color: inherit;\",\n      \"          text-decoration: none;\",\n      \"          border: 1px solid #eaeaea;\",\n      \"          border-radius: 10px;\",\n      \"          transition: color 0.15s ease, border-color 0.15s ease;\",\n      \"        }\",\n      \"\",\n      \"        .card:hover,\",\n      \"        .card:focus,\",\n      \"        .card:active {\",\n      \"          color: #0070f3;\",\n      \"          border-color: #0070f3;\",\n      \"        }\",\n      \"\",\n      \"        .card h3 {\",\n      \"          margin: 0 0 1rem 0;\",\n      \"          font-size: 1.5rem;\",\n      \"        }\",\n      \"\",\n      \"        .card p {\",\n      \"          margin: 0;\",\n      \"          font-size: 1.25rem;\",\n      \"          line-height: 1.5;\",\n      \"        }\",\n      \"\",\n      \"        .logo {\",\n      \"          height: 1em;\",\n      \"        }\",\n      \"\",\n      \"        @media (max-width: 600px) {\",\n      \"          .grid {\",\n      \"            width: 100%;\",\n      \"            flex-direction: column;\",\n      \"          }\",\n      \"        }\",\n      \"      `}</style>\",\n      \"\",\n      \"      <style jsx global>{`\",\n      \"        html,\",\n      \"        body {\",\n      \"          padding: 0;\",\n      \"          margin: 0;\",\n      \"          font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,\",\n      \"            Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue,\",\n      \"            sans-serif;\",\n      \"        }\",\n      \"\",\n      \"        * {\",\n      \"          box-sizing: border-box;\",\n      \"        }\",\n      \"      `}</style>\",\n      \"    </div>\",\n      \"  )\",\n      \"}\",\n      \"\",\n    ];\n\n    if (this.tailwind) {\n      indexJs.unshift('import \"tailwindcss/tailwind.css\"');\n    }\n\n    const vercelSvg = [\n      '<svg width=\"283\" height=\"64\" viewBox=\"0 0 283 64\" fill=\"none\" ',\n      '    xmlns=\"http://www.w3.org/2000/svg\">',\n      '    <path d=\"M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z\" fill=\"#000\"/>',\n      \"</svg>\",\n    ];\n\n    new SampleDir(project, this.srcdir, {\n      files: {\n        [\"index.\" + this.fileExt]: indexJs.join(\"\\n\"),\n      },\n    });\n\n    new SampleDir(project, this.assetsdir, {\n      files: {\n        \"vercel.svg\": vercelSvg.join(\"\\n\"),\n      },\n    });\n\n    new SampleFile(project, \"next-env.d.ts\", {\n      contents: [\n        '/// <reference types=\"next\" />',\n        '/// <reference types=\"next/types/global\" />',\n        '/// <reference types=\"next/image-types/global\" />',\n        \"// NOTE: This file should not be edited\",\n        \"// see https://nextjs.org/docs/basic-features/typescript for more information.\",\n        \"\",\n      ].join(\"\\n\"),\n    });\n  }\n}\n"
  },
  {
    "path": "src/web/postcss.ts",
    "content": "import { NodeProject } from \"../javascript\";\nimport { JsonFile } from \"../json\";\nimport { TailwindConfig, TailwindConfigOptions } from \"./tailwind\";\n\nexport interface PostCssOptions {\n  /**\n   * @default \"postcss.config.json\"\n   */\n  readonly fileName?: string;\n\n  /**\n   * Install Tailwind CSS as a PostCSS plugin.\n   *\n   * @default true\n   */\n  readonly tailwind?: boolean;\n\n  /**\n   * Tailwind CSS options.\n   */\n  readonly tailwindOptions?: TailwindConfigOptions;\n}\n\n/**\n * Declares a PostCSS dependency with a default config file.\n */\nexport class PostCss {\n  public readonly fileName: string;\n  public readonly file: JsonFile;\n  public readonly tailwind?: TailwindConfig;\n\n  constructor(project: NodeProject, options?: PostCssOptions) {\n    this.fileName = options?.fileName ?? \"postcss.config.json\";\n\n    project.addDeps(\"postcss\");\n\n    const config: { [key: string]: any } = { plugins: {} };\n\n    if (options?.tailwind ?? true) {\n      config.plugins.tailwindcss = {};\n      config.plugins.autoprefixer = {};\n      this.tailwind = new TailwindConfig(project, options?.tailwindOptions);\n      config.plugins.tailwindcss.config = this.tailwind.fileName;\n      project.addDeps(\"tailwindcss\", \"autoprefixer\");\n    }\n\n    this.file = new JsonFile(project, this.fileName, {\n      obj: config,\n      marker: false,\n    });\n\n    project.npmignore?.exclude(`/${this.fileName}`);\n  }\n}\n"
  },
  {
    "path": "src/web/react.ts",
    "content": "import * as path from \"path\";\nimport { Component } from \"../component\";\nimport { FileBase, FileBaseOptions, IResolver } from \"../file\";\nimport {\n  NodeProject,\n  NodeProjectOptions,\n  TypeScriptJsxMode,\n  TypeScriptModuleResolution,\n} from \"../javascript\";\nimport { SampleDir } from \"../sample-file\";\nimport { SourceCode } from \"../source-code\";\nimport { TypeScriptAppProject, TypeScriptProjectOptions } from \"../typescript\";\nimport { deepMerge } from \"../util\";\n\nexport interface ReactRewireOptions {\n  /**\n   * Rewire webpack configuration.\n   *\n   * Use this property to override webpack configuration properties provided\n   * by create-react-app, without needing to eject.\n   *\n   * This property will create a `config-overrides.js` file in your root directory,\n   * which will contain the desired rewiring code.\n   *\n   * To **override** the configuration, you can provide simple key value pairs.\n   * Keys take the form of js code directives that traverse to the desired property.\n   * Values should be JSON serializable objects.\n   *\n   * For example, the following config:\n   *\n   * ```json\n   * rewire: { \"module.unknownContextCritical\": false }\n   * ```\n   *\n   * Will translate to the following `config-overrides.js` file:\n   *\n   * ```js\n   * module.exports = function override(config, env) {\n   *   config.module.unknownContextCritical = false;\n   * }\n   * ```\n   *\n   * @default - No rewired config.\n   *\n   * @see https://webpack.js.org/configuration/\n   * @see https://github.com/timarney/react-app-rewired\n   */\n  readonly rewire?: { [key: string]: any };\n}\n\nexport interface ReactTypeScriptProjectOptions\n  extends TypeScriptProjectOptions,\n    ReactRewireOptions {}\n\nexport interface ReactProjectOptions\n  extends NodeProjectOptions,\n    ReactRewireOptions {\n  /**\n   * Source directory.\n   *\n   * @default \"src\"\n   */\n  readonly srcdir?: string;\n  /**\n   * Generate one-time sample in `src/` and `public/` if there are no files there.\n   * @default true\n   */\n  readonly sampleCode?: boolean;\n}\n\n/**\n * React project without TypeScript.\n *\n * @pjid react\n */\nexport class ReactProject extends NodeProject {\n  /**\n   * The directory in which source files reside.\n   * @default \"src\"\n   */\n  public readonly srcdir: string;\n\n  constructor(options: ReactProjectOptions) {\n    super({\n      jest: false,\n      ...options,\n    });\n\n    this.srcdir = options.srcdir ?? \"src\";\n\n    new ReactComponent(this, { typescript: false, rewire: options.rewire });\n\n    // generate sample code in `src` and `public` if these directories are empty or non-existent.\n    if (options.sampleCode ?? true) {\n      new ReactSampleCode(this, {\n        fileExt: \"jsx\",\n        srcdir: this.srcdir,\n      });\n      new SampleDir(this, \"public\", {\n        sourceDir: path.join(__dirname, \"..\", \"..\", \"assets\", \"web\", \"react\"),\n      });\n    }\n  }\n}\n\n/**\n * React project with TypeScript.\n *\n * @pjid react-ts\n */\nexport class ReactTypeScriptProject extends TypeScriptAppProject {\n  /**\n   * The directory in which source files reside.\n   */\n  public readonly srcdir: string;\n\n  constructor(options: ReactTypeScriptProjectOptions) {\n    const defaultOptions = {\n      srcdir: \"src\",\n      eslint: true,\n      jest: false,\n      tsconfig: {\n        include: [\"src\"],\n        compilerOptions: {\n          target: \"es5\",\n          lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n          allowJs: true,\n          skipLibCheck: true,\n          esModuleInterop: true,\n          allowSyntheticDefaultImports: true,\n          strict: true,\n          forceConsistentCasingInFileNames: true,\n          noFallthroughCasesInSwitch: true,\n          module: \"commonjs\",\n          moduleResolution: TypeScriptModuleResolution.NODE,\n          resolveJsonModule: true,\n          isolatedModules: true,\n          noEmit: true,\n          jsx: TypeScriptJsxMode.REACT_JSX,\n        },\n      },\n      typescriptVersion: options.typescriptVersion ?? \"^4.0.3\",\n    };\n\n    // never generate default TypeScript sample code, since this class provides its own\n    super(\n      deepMerge([\n        defaultOptions,\n        options,\n        { sampleCode: false },\n      ]) as TypeScriptProjectOptions\n    );\n\n    this.srcdir = options.srcdir ?? \"src\";\n\n    this.eslint?.addRules({\n      \"import/no-extraneous-dependencies\": [\n        \"error\",\n        {\n          devDependencies: [\"**/src/**/*.test.tsx\", \"**/src/setupTests.ts\"],\n          optionalDependencies: false,\n          peerDependencies: true,\n        },\n      ],\n    });\n\n    new ReactComponent(this, { typescript: true, rewire: options.rewire });\n\n    // generate sample code in `src` and `public` if these directories are empty or non-existent.\n    if (options.sampleCode ?? true) {\n      new ReactSampleCode(this, {\n        fileExt: \"tsx\",\n        srcdir: this.srcdir,\n      });\n      new SampleDir(this, \"public\", {\n        sourceDir: path.join(__dirname, \"..\", \"..\", \"assets\", \"web\", \"react\"),\n      });\n    }\n  }\n}\n\nexport interface ReactComponentOptions extends ReactRewireOptions {\n  /**\n   * Whether to apply options specific for TypeScript React projects.\n   *\n   * @default false\n   */\n  readonly typescript?: boolean;\n}\n\nexport class ReactComponent extends Component {\n  private readonly typescript: boolean;\n\n  constructor(project: NodeProject, options: ReactComponentOptions) {\n    super(project);\n\n    this.typescript = options.typescript ?? false;\n\n    // No compile for react app\n    project.compileTask.reset();\n\n    project.addDeps(\"react\", \"react-dom\", \"react-scripts@^5\", \"web-vitals\");\n    project.addDevDeps(\n      \"@testing-library/jest-dom\",\n      \"@testing-library/react\",\n      \"@testing-library/user-event\"\n    );\n    if (this.typescript) {\n      project.addDevDeps(\"@types/jest\", \"@types/react\", \"@types/react-dom\");\n    }\n\n    const rewire = options.rewire ?? false;\n\n    if (rewire) {\n      const overridesPath = \".projen/react-config-overrides.js\";\n      project.addDevDeps(\"react-app-rewired\");\n      project.addFields({ \"config-overrides-path\": overridesPath });\n\n      const configOverrides = new SourceCode(this.project, overridesPath);\n      if (!configOverrides.marker) {\n        configOverrides.line(`// ${configOverrides.marker}`);\n      }\n      configOverrides.line(\"/**\");\n      configOverrides.line(\n        \" * Override CRA configuration without needing to eject.\"\n      );\n      configOverrides.line(\" *\");\n      configOverrides.line(\n        \" * @see https://www.npmjs.com/package/react-app-rewired\"\n      );\n      configOverrides.line(\" */\");\n      configOverrides.open(\"module.exports = function override(config, env) {\");\n      for (const [key, value] of Object.entries(rewire)) {\n        configOverrides.line(`config.${key} = ${JSON.stringify(value)};`);\n      }\n      configOverrides.line(\"return config;\");\n      configOverrides.close(\"};\");\n    }\n\n    const reactScripts = rewire ? \"react-app-rewired\" : \"react-scripts\";\n\n    // Create React App CLI commands, see: https://create-react-app.dev/docs/available-scripts/\n    project.addTask(\"dev\", {\n      description: \"Starts the react application\",\n      exec: `${reactScripts} start`,\n    });\n\n    project.compileTask.exec(`${reactScripts} build`);\n\n    project.testTask.exec(`${reactScripts} test --watchAll=false`);\n\n    const testWatch = project.tasks.tryFind(\"test:watch\");\n    testWatch?.reset(`${reactScripts} test`);\n\n    project.npmignore?.exclude(\"# Build\", \"/build/\");\n    project.gitignore.exclude(\"# Build\", \"/build/\");\n\n    project.package.addField(\"eslintConfig\", {\n      extends: [\"react-app\", \"react-app/jest\"],\n    });\n\n    project.package.addField(\"browserslist\", {\n      production: [\">0.2%\", \"not dead\", \"not op_mini all\"],\n      development: [\n        \"last 1 chrome version\",\n        \"last 1 firefox version\",\n        \"last 1 safari version\",\n      ],\n    });\n  }\n}\n\ninterface ReactSampleCodeOptions {\n  /**\n   * File extension for sample javascript code to be saved as.\n   *\n   * @default \"jsx\"\n   */\n  readonly fileExt?: string;\n\n  /**\n   * The directory in which React jsx files are declared.\n   */\n  readonly srcdir: string;\n}\n\nclass ReactSampleCode extends Component {\n  private readonly fileExt: string;\n  private readonly srcdir: string;\n\n  constructor(project: NodeProject, options: ReactSampleCodeOptions) {\n    super(project);\n\n    this.fileExt = options.fileExt ?? \"jsx\";\n    this.srcdir = options.srcdir;\n\n    const logoSvg = [\n      '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 841.9 595.3\">',\n      '    <g fill=\"#61DAFB\">',\n      '        <path d=\"M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z\"/>',\n      '        <circle cx=\"420.9\" cy=\"296.5\" r=\"45.7\"/>',\n      '        <path d=\"M520.5 78.1z\"/>',\n      \"    </g>\",\n      \"</svg>\",\n      \"\",\n    ];\n\n    const appJsx = [\n      \"import logo from './logo.svg';\",\n      \"import './App.css'\",\n      \"\",\n      \"function App() {\",\n      \"  return (\",\n      '   <div className=\"App\">',\n      '      <header className=\"App-header\">',\n      '        <img src={logo} className=\"App-logo\" alt=\"logo\" />',\n      \"        <p>\",\n      `          Edit <code>src/App.${this.fileExt}</code> and save to reload.`,\n      \"        </p>\",\n      '        <a className=\"App-link\"',\n      '          href=\"https://reactjs.org\"',\n      '          target=\"_blank\"',\n      '          rel=\"noopener noreferrer\"',\n      \"        >\",\n      \"          Learn React\",\n      \"        </a>\",\n      \"      </header>\",\n      \"    </div>\",\n      \"  );\",\n      \"}\",\n      \"\",\n      \"export default App;\",\n      \"\",\n    ];\n\n    const appCss = [\n      \".App {\",\n      \"  text-align: center;\",\n      \"}\",\n      \"\",\n      \".App-logo {\",\n      \"  height: 40vmin;\",\n      \"  pointer-events: none;\",\n      \"}\",\n      \"\",\n      \"@media (prefers-reduced-motion: no-preference) {\",\n      \"  .App-logo {\",\n      \"    animation: App-logo-spin infinite 20s linear;\",\n      \"  }\",\n      \"}\",\n      \"\",\n      \".App-header {\",\n      \"  background-color: #282c34;\",\n      \"  min-height: 100vh;\",\n      \"  display: flex;\",\n      \"  flex-direction: column;\",\n      \"  align-items: center;\",\n      \"  justify-content: center;\",\n      \"  font-size: calc(10px + 2vmin);\",\n      \"  color: white;\",\n      \"}\",\n      \"\",\n      \".App-link {\",\n      \"  color: #61dafb;\",\n      \"}\",\n      \"\",\n      \"@keyframes App-logo-spin {\",\n      \"  from {\",\n      \"    transform: rotate(0deg);\",\n      \"  }\",\n      \"  to {\",\n      \"    transform: rotate(360deg);\",\n      \"  }\",\n      \"}\",\n      \"\",\n    ];\n\n    const appTestJsx = [\n      \"import { render, screen } from '@testing-library/react';\",\n      \"import App from './App';\",\n      \"\",\n      \"test('renders learn react link', () => {\",\n      \"  render(<App />);\",\n      \"  const linkElement = screen.getByText(/learn react/i);\",\n      \"  expect(linkElement).toBeInTheDocument();\",\n      \"});\",\n      \"\",\n    ];\n\n    const indexJsx = [\n      \"import React from 'react';\",\n      \"import ReactDOM from 'react-dom';\",\n      \"import './index.css';\",\n      \"import App from './App';\",\n      \"import reportWebVitals from './reportWebVitals';\",\n      \"\",\n      \"ReactDOM.render(\",\n      \"  <React.StrictMode>\",\n      \"    <App />\",\n      \"  </React.StrictMode>,\",\n      \"  document.getElementById('root')\",\n      \");\",\n      \"\",\n      \"// If you want to start measuring performance in your app, pass a function\",\n      \"// to log results (for example: reportWebVitals(console.log))\",\n      \"// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\",\n      \"reportWebVitals();\",\n      \"\",\n    ];\n\n    const indexCss = [\n      \"body {\",\n      \"  margin: 0;\",\n      \"  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\",\n      \"    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\",\n      \"    sans-serif;\",\n      \"  -webkit-font-smoothing: antialiased;\",\n      \"  -moz-osx-font-smoothing: grayscale;\",\n      \"}\",\n      \"\",\n      \"code {\",\n      \"  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\",\n      \"    monospace;\",\n      \"}\",\n      \"\",\n    ];\n\n    const reportWebVitalsJs = [\n      \"import { ReportHandler } from 'web-vitals';\",\n      \"\",\n      \"const reportWebVitals = (onPerfEntry?: ReportHandler) => {\",\n      \"  if (onPerfEntry && onPerfEntry instanceof Function) {\",\n      \"    import('web-vitals').then(\",\n      \"      ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\",\n      \"        getCLS(onPerfEntry);\",\n      \"        getFID(onPerfEntry);\",\n      \"        getFCP(onPerfEntry);\",\n      \"        getLCP(onPerfEntry);\",\n      \"        getTTFB(onPerfEntry);\",\n      \"      },\",\n      \"      () => {}\",\n      \"    );\",\n      \"  }\",\n      \"};\",\n      \"\",\n      \"export default reportWebVitals;\",\n    ];\n\n    const setupTestsJs = [\n      \"// jest-dom adds custom jest matchers for asserting on DOM nodes.\",\n      \"// allows you to do things like:\",\n      \"// expect(element).toHaveTextContent(/react/i)\",\n      \"// learn more: https://github.com/testing-library/jest-dom\",\n      \"import '@testing-library/jest-dom';\",\n      \"\",\n    ];\n\n    const reactTypeDef = ['/// <reference types=\"react-scripts\" />'];\n\n    // js/ts not jsx/tsx\n    const fileExtWithoutX = this.fileExt.replace(\"x\", \"\");\n\n    new SampleDir(project, this.srcdir, {\n      files: {\n        \"react-app-env.d.ts\": reactTypeDef.join(\"\\n\"),\n        \"logo.svg\": logoSvg.join(\"\\n\"),\n        [\"App.\" + this.fileExt]: appJsx.join(\"\\n\"),\n        [\"App.test.\" + this.fileExt]: appTestJsx.join(\"\\n\"),\n        \"App.css\": appCss.join(\"\\n\"),\n        [\"index.\" + this.fileExt]: indexJsx.join(\"\\n\"),\n        \"index.css\": indexCss.join(\"\\n\"),\n        [\"reportWebVitals.\" + fileExtWithoutX]: reportWebVitalsJs.join(\"\\n\"),\n        [\"setupTests.\" + fileExtWithoutX]: setupTestsJs.join(\"\\n\"),\n      },\n    });\n  }\n}\n\n/**\n * @deprecated No longer used.\n */\nexport interface ReactTypeDefOptions extends FileBaseOptions {}\n\n/**\n * @deprecated No longer used.\n */\nexport class ReactTypeDef extends FileBase {\n  constructor(\n    project: ReactTypeScriptProject,\n    filePath: string,\n    options: ReactTypeDefOptions = {}\n  ) {\n    super(project, filePath, options);\n  }\n\n  protected synthesizeContent(_: IResolver): string | undefined {\n    return ['/// <reference types=\"react-scripts\" />'].join(\"\\n\");\n  }\n}\n"
  },
  {
    "path": "src/web/tailwind.ts",
    "content": "import { NodeProject } from \"../javascript\";\nimport { JsonFile } from \"../json\";\n\nexport interface TailwindConfigOptions {\n  /**\n   * @default \"tailwind.config.json\"\n   */\n  readonly fileName?: string;\n}\n\n/**\n * Declares a Tailwind CSS configuration file.\n *\n * There are multiple ways to add Tailwind CSS in your node project - see:\n * https://tailwindcss.com/docs/installation\n *\n * @see PostCss\n */\nexport class TailwindConfig {\n  public readonly fileName: string;\n  public readonly file: JsonFile;\n\n  constructor(project: NodeProject, options?: TailwindConfigOptions) {\n    this.fileName = options?.fileName ?? \"tailwind.config.json\";\n\n    this.file = new JsonFile(project, this.fileName, {\n      obj: {\n        purge: [],\n        darkMode: false,\n        theme: {\n          extend: {},\n        },\n        variants: {\n          extend: {},\n        },\n        plugins: [],\n      },\n    });\n\n    project.npmignore?.exclude(`/${this.fileName}`);\n  }\n}\n"
  },
  {
    "path": "src/xmlfile.ts",
    "content": "import { create as createxml } from \"xmlbuilder2\";\nimport { IResolver } from \"./file\";\nimport { ObjectFile, ObjectFileOptions } from \"./object-file\";\nimport { Project } from \"./project\";\n\n/**\n * Options for `XmlFile`.\n */\nexport interface XmlFileOptions extends ObjectFileOptions {}\n\n/**\n * Represents an XML file.\n *\n * Objects passed in will be synthesized using the npm \"xml\" library.\n * @see https://www.npmjs.com/package/xml\n */\nexport class XmlFile extends ObjectFile {\n  constructor(\n    project: Project,\n    filePath: string,\n    options: XmlFileOptions = {}\n  ) {\n    super(project, filePath, options);\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const obj = super.synthesizeContent(resolver);\n    if (!obj) {\n      return undefined;\n    }\n\n    const xmlString = createxml({ encoding: \"UTF-8\" }, obj).end({\n      prettyPrint: true,\n      indent: \" \".repeat(4),\n    });\n\n    return [\n      xmlString,\n      ...(this.marker ? [`<!-- ${this.marker} -->`] : []),\n    ].join(\"\\n\");\n  }\n}\n"
  },
  {
    "path": "src/yaml.ts",
    "content": "import * as YAML from \"yaml\";\nimport { IResolver } from \"./file\";\nimport { ObjectFile, ObjectFileOptions } from \"./object-file\";\nimport { Project } from \"./project\";\n\n/**\n * Options for `JsonFile`.\n */\nexport interface YamlFileOptions extends ObjectFileOptions {\n  /**\n   * Maximum line width (set to 0 to disable folding).\n   *\n   * @default - 0\n   */\n  readonly lineWidth?: number;\n}\n\n/**\n * Represents a YAML file.\n */\nexport class YamlFile extends ObjectFile {\n  /**\n   * Maximum line width (set to 0 to disable folding).\n   */\n  public lineWidth: number;\n\n  constructor(project: Project, filePath: string, options: YamlFileOptions) {\n    super(project, filePath, options);\n    this.lineWidth = options.lineWidth ?? 0;\n  }\n\n  protected synthesizeContent(resolver: IResolver): string | undefined {\n    const json = super.synthesizeContent(resolver);\n    if (!json) {\n      return undefined;\n    }\n\n    return [\n      ...(this.marker ? [`# ${this.marker}`] : []),\n      \"\",\n      YAML.stringify(JSON.parse(json), {\n        indent: 2,\n        lineWidth: this.lineWidth,\n      }),\n    ].join(\"\\n\");\n  }\n}\n"
  },
  {
    "path": "test/__snapshots__/cleanup.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`cleanup empty files 1`] = `\nArray [\n  \"will-be-empty\",\n]\n`;\n\nexports[`cleanup falls back to greedy method 1`] = `\nArray [\n  \".gitattributes\",\n  \".github/workflows/pull-request-lint.yml\",\n  \".gitignore\",\n  \".projen/deps.json\",\n  \".projen/files.json\",\n  \".projen/tasks.json\",\n  \"delete.txt\",\n]\n`;\n\nexports[`cleanup only orphaned files 1`] = `\nArray [\n  \".gitattributes\",\n  \".github/workflows/pull-request-lint.yml\",\n  \".gitignore\",\n  \".projen/files.json\",\n  \".projen/tasks.json\",\n  \"not-this\",\n]\n`;\n\nexports[`cleanup uses cache file 1`] = `\nArray [\n  \".gitattributes\",\n  \".github/workflows/pull-request-lint.yml\",\n  \".gitignore\",\n  \".projen/deps.json\",\n  \".projen/files.json\",\n  \".projen/tasks.json\",\n  \"foo/bar.txt\",\n]\n`;\n"
  },
  {
    "path": "test/__snapshots__/cli.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`running \"projen\" with no arguments will execute .projenrc.js 1`] = `\nObject {\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \".projenrc.js\": \"new (require('projen').Project)({ name: 'foo' }).synth()\",\n}\n`;\n\nexports[`the \"--rc\" option can be used to specify projenrc location 1`] = `\nObject {\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "test/__snapshots__/deps.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`can be overridden with more specific version 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"dependencies\": Array [\n    Object {\n      \"name\": \"depy\",\n      \"type\": \"peer\",\n      \"version\": \"^9\",\n    },\n  ],\n}\n`;\n\nexports[`deps.all returns all the dependencies 1`] = `\nArray [\n  Object {\n    \"name\": \"dep1\",\n    \"type\": \"devenv\",\n  },\n  Object {\n    \"name\": \"dep3\",\n    \"type\": \"peer\",\n  },\n  Object {\n    \"name\": \"dep2\",\n    \"type\": \"runtime\",\n  },\n]\n`;\n\nexports[`duplicates are ignored 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"dependencies\": Array [\n    Object {\n      \"name\": \"depy\",\n      \"type\": \"peer\",\n    },\n  ],\n}\n`;\n\nexports[`minimal case 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"dependencies\": Array [\n    Object {\n      \"name\": \"my-first-dep\",\n      \"type\": \"runtime\",\n    },\n  ],\n}\n`;\n\nexports[`with package alias 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"dependencies\": Array [\n    Object {\n      \"name\": \"bar\",\n      \"type\": \"peer\",\n      \"version\": \"npm:@bar/legacy\",\n    },\n  ],\n}\n`;\n\nexports[`with version requirement 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"dependencies\": Array [\n    Object {\n      \"name\": \"depy\",\n      \"type\": \"peer\",\n      \"version\": \"^7\",\n    },\n  ],\n}\n`;\n"
  },
  {
    "path": "test/__snapshots__/integ.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`cdk-watchful 1`] = `\nObject {\n  \".eslintrc.json\": Object {\n    \"env\": Object {\n      \"jest\": true,\n      \"node\": true,\n    },\n    \"extends\": Array [\n      \"plugin:import/typescript\",\n    ],\n    \"ignorePatterns\": Array [\n      \"*.js\",\n      \"!.projenrc.js\",\n      \"*.d.ts\",\n      \"node_modules/\",\n      \"*.generated.ts\",\n      \"coverage\",\n    ],\n    \"overrides\": Array [\n      Object {\n        \"files\": Array [\n          \".projenrc.js\",\n        ],\n        \"rules\": Object {\n          \"@typescript-eslint/no-require-imports\": \"off\",\n          \"import/no-extraneous-dependencies\": \"off\",\n        },\n      },\n    ],\n    \"parser\": \"@typescript-eslint/parser\",\n    \"parserOptions\": Object {\n      \"ecmaVersion\": 2018,\n      \"project\": \"./tsconfig.dev.json\",\n      \"sourceType\": \"module\",\n    },\n    \"plugins\": Array [\n      \"@typescript-eslint\",\n      \"import\",\n    ],\n    \"root\": true,\n    \"rules\": Object {\n      \"@typescript-eslint/indent\": Array [\n        \"error\",\n        2,\n      ],\n      \"@typescript-eslint/member-delimiter-style\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/member-ordering\": Array [\n        \"error\",\n        Object {\n          \"default\": Array [\n            \"public-static-field\",\n            \"public-static-method\",\n            \"protected-static-field\",\n            \"protected-static-method\",\n            \"private-static-field\",\n            \"private-static-method\",\n            \"field\",\n            \"constructor\",\n            \"method\",\n          ],\n        },\n      ],\n      \"@typescript-eslint/no-floating-promises\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-require-imports\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-shadow\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/return-await\": Array [\n        \"error\",\n      ],\n      \"array-bracket-newline\": Array [\n        \"error\",\n        \"consistent\",\n      ],\n      \"array-bracket-spacing\": Array [\n        \"error\",\n        \"never\",\n      ],\n      \"brace-style\": Array [\n        \"error\",\n        \"1tbs\",\n        Object {\n          \"allowSingleLine\": true,\n        },\n      ],\n      \"comma-dangle\": Array [\n        \"error\",\n        \"always-multiline\",\n      ],\n      \"comma-spacing\": Array [\n        \"error\",\n        Object {\n          \"after\": true,\n          \"before\": false,\n        },\n      ],\n      \"curly\": Array [\n        \"error\",\n        \"multi-line\",\n        \"consistent\",\n      ],\n      \"dot-notation\": Array [\n        \"error\",\n      ],\n      \"import/no-extraneous-dependencies\": Array [\n        \"error\",\n        Object {\n          \"devDependencies\": Array [\n            \"**/test/**\",\n            \"**/build-tools/**\",\n          ],\n          \"optionalDependencies\": false,\n          \"peerDependencies\": true,\n        },\n      ],\n      \"import/no-unresolved\": Array [\n        \"error\",\n      ],\n      \"import/order\": Array [\n        \"warn\",\n        Object {\n          \"alphabetize\": Object {\n            \"caseInsensitive\": true,\n            \"order\": \"asc\",\n          },\n          \"groups\": Array [\n            \"builtin\",\n            \"external\",\n          ],\n        },\n      ],\n      \"indent\": Array [\n        \"off\",\n      ],\n      \"key-spacing\": Array [\n        \"error\",\n      ],\n      \"keyword-spacing\": Array [\n        \"error\",\n      ],\n      \"max-len\": Array [\n        \"error\",\n        Object {\n          \"code\": 150,\n          \"ignoreComments\": true,\n          \"ignoreRegExpLiterals\": true,\n          \"ignoreStrings\": true,\n          \"ignoreTemplateLiterals\": true,\n          \"ignoreUrls\": true,\n        },\n      ],\n      \"no-bitwise\": Array [\n        \"error\",\n      ],\n      \"no-duplicate-imports\": Array [\n        \"error\",\n      ],\n      \"no-multi-spaces\": Array [\n        \"error\",\n        Object {\n          \"ignoreEOLComments\": false,\n        },\n      ],\n      \"no-multiple-empty-lines\": Array [\n        \"error\",\n      ],\n      \"no-return-await\": Array [\n        \"off\",\n      ],\n      \"no-shadow\": Array [\n        \"off\",\n      ],\n      \"no-trailing-spaces\": Array [\n        \"error\",\n      ],\n      \"object-curly-newline\": Array [\n        \"error\",\n        Object {\n          \"consistent\": true,\n          \"multiline\": true,\n        },\n      ],\n      \"object-curly-spacing\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"object-property-newline\": Array [\n        \"error\",\n        Object {\n          \"allowAllPropertiesOnSameLine\": true,\n        },\n      ],\n      \"quote-props\": Array [\n        \"error\",\n        \"consistent-as-needed\",\n      ],\n      \"quotes\": Array [\n        \"error\",\n        \"single\",\n        Object {\n          \"avoidEscape\": true,\n        },\n      ],\n      \"semi\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"space-before-blocks\": Array [\n        \"error\",\n      ],\n    },\n    \"settings\": Object {\n      \"import/parsers\": Object {\n        \"@typescript-eslint/parser\": Array [\n          \".ts\",\n          \".tsx\",\n        ],\n      },\n      \"import/resolver\": Object {\n        \"node\": Object {},\n        \"typescript\": Object {\n          \"alwaysTryTypes\": true,\n          \"project\": \"./tsconfig.dev.json\",\n        },\n      },\n    },\n  },\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n*.snap linguist-generated\n/.eslintrc.json linguist-generated\n/.gitattributes linguist-generated\n/.github/pull_request_template.md linguist-generated\n/.github/workflows/build.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.github/workflows/upgrade-master.yml linguist-generated\n/.gitignore linguist-generated\n/.mergify.yml linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/API.md linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/tsconfig.dev.json linguist-generated\n/yarn.lock linguist-generated\",\n  \".github/pull_request_template.md\": \"Fixes #\",\n  \".github/workflows/build.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: build\non:\n  pull_request: {}\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      self_mutation_happened: \\${{ steps.self_mutation.outputs.self_mutation_happened }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Install dependencies\n        run: yarn install --check-files\n      - name: build\n        run: npx projen build\n      - id: self_mutation\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\n      - if: steps.self_mutation.outputs.self_mutation_happened\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n      - name: Fail build on mutation\n        if: steps.self_mutation.outputs.self_mutation_happened\n        run: |-\n          echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\n          cat .repo.patch\n          exit 1\n      - name: Upload artifact\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  self-mutation:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: always() && needs.build.outputs.self_mutation_happened && !(github.event.pull_request.head.repo.full_name != github.repository)\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Push changes\n        run: |2-\n            git add .\n            git commit -s -m \\\\\"chore: self mutation\\\\\"\n            git push origin HEAD:\\${{ github.event.pull_request.head.ref }}\n  package-js:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions: {}\n    if: \\\\\"! needs.build.outputs.self_mutation_happened\\\\\"\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n  package-java:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions: {}\n    if: \\\\\"! needs.build.outputs.self_mutation_happened\\\\\"\n    steps:\n      - uses: actions/setup-java@v3\n        with:\n          distribution: temurin\n          java-version: 11.x\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create java artifact\n        run: cd .repo && npx projen package:java\n      - name: Collect java Artifact\n        run: mv .repo/dist dist\n  package-python:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions: {}\n    if: \\\\\"! needs.build.outputs.self_mutation_happened\\\\\"\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create python artifact\n        run: cd .repo && npx projen package:python\n      - name: Collect python Artifact\n        run: mv .repo/dist dist\n\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Collect GitHub Metadata\n        run: mv .repo/dist dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: registry.npmjs.org\n          NPM_TOKEN: \\${{ secrets.NPM_TOKEN }}\n  release_maven:\n    name: Publish to Maven Central\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-java@v3\n        with:\n          distribution: temurin\n          java-version: 11.x\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create java artifact\n        run: cd .repo && npx projen package:java\n      - name: Collect java Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-maven\n        env:\n          MAVEN_GPG_PRIVATE_KEY: \\${{ secrets.MAVEN_GPG_PRIVATE_KEY }}\n          MAVEN_GPG_PRIVATE_KEY_PASSPHRASE: \\${{ secrets.MAVEN_GPG_PRIVATE_KEY_PASSPHRASE }}\n          MAVEN_PASSWORD: \\${{ secrets.MAVEN_PASSWORD }}\n          MAVEN_USERNAME: \\${{ secrets.MAVEN_USERNAME }}\n          MAVEN_STAGING_PROFILE_ID: \\${{ secrets.MAVEN_STAGING_PROFILE_ID }}\n  release_pypi:\n    name: Publish to PyPI\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create python artifact\n        run: cd .repo && npx projen package:python\n      - name: Collect python Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-pypi\n        env:\n          TWINE_USERNAME: \\${{ secrets.TWINE_USERNAME }}\n          TWINE_PASSWORD: \\${{ secrets.TWINE_PASSWORD }}\n\",\n  \".github/workflows/upgrade-master.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-master\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: master\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.0.0\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: master\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-master\\\\\" workflow*\n          branch: github-actions/upgrade-master\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-master\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n/test-reports/\njunit.xml\n/coverage/\n!/.github/workflows/build.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.mergify.yml\n!/.github/workflows/upgrade-master.yml\n!/.github/pull_request_template.md\n!/test/\n!/tsconfig.dev.json\n!/src/\n/lib\n/dist/\n!/.eslintrc.json\n.jsii\ntsconfig.json\n!/API.md\n.env\n.idea\nexample/*.js\nexample/*.d.ts\n\",\n  \".mergify.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n      - status-success=package-js\n      - status-success=package-java\n      - status-success=package-python\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n      - status-success=package-js\n      - status-success=package-java\n      - status-success=package-python\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projen/\n/test-reports/\njunit.xml\n/coverage/\n/dist/changelog.md\n/dist/version.txt\n/.mergify.yml\n/test/\n/tsconfig.dev.json\n/src/\n!/lib/\n!/lib/**/*.js\n!/lib/**/*.d.ts\ndist\n/tsconfig.json\n/.github/\n/.vscode/\n/.idea/\n/.projenrc.js\ntsconfig.tsbuildinfo\n/.eslintrc.json\n!.jsii\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"@types/jest\",\n        \"type\": \"build\",\n        \"version\": \"^27\",\n      },\n      Object {\n        \"name\": \"@types/node\",\n        \"type\": \"build\",\n        \"version\": \"^14\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/eslint-plugin\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/parser\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"aws-sdk\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-node\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-plugin-import\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint\",\n        \"type\": \"build\",\n        \"version\": \"^8\",\n      },\n      Object {\n        \"name\": \"jest-junit\",\n        \"type\": \"build\",\n        \"version\": \"^13\",\n      },\n      Object {\n        \"name\": \"jest\",\n        \"type\": \"build\",\n        \"version\": \"^27\",\n      },\n      Object {\n        \"name\": \"jsii\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jsii-diff\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jsii-docgen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jsii-pacmak\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"json-schema\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"standard-version\",\n        \"type\": \"build\",\n        \"version\": \"^9\",\n      },\n      Object {\n        \"name\": \"ts-jest\",\n        \"type\": \"build\",\n        \"version\": \"^27\",\n      },\n      Object {\n        \"name\": \"typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-apigateway\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-cloudwatch-actions\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-cloudwatch\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-dynamodb\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-ecs-patterns\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-ecs\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-elasticloadbalancingv2\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-events-targets\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-events\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-lambda\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-rds\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-sns-subscriptions\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-sns\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-sqs\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/core\",\n        \"type\": \"peer\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"constructs\",\n        \"type\": \"peer\",\n        \"version\": \"^3.2.27\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-apigateway\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-cloudwatch-actions\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-cloudwatch\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-dynamodb\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-ecs-patterns\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-ecs\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-elasticloadbalancingv2\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-events-targets\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-events\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-lambda\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-rds\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-sns-subscriptions\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-sns\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/aws-sqs\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/core\",\n        \"type\": \"runtime\",\n        \"version\": \"^1.75.0\",\n      },\n      Object {\n        \"name\": \"@aws-cdk/assert\",\n        \"type\": \"test\",\n        \"version\": \"^1.75.0\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".eslintrc.json\",\n      \".gitattributes\",\n      \".github/pull_request_template.md\",\n      \".github/workflows/build.yml\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".github/workflows/upgrade-master.yml\",\n      \".gitignore\",\n      \".mergify.yml\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n      \"tsconfig.dev.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"clobber\": Object {\n        \"condition\": \"git diff --exit-code > /dev/null\",\n        \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n        \"env\": Object {\n          \"BRANCH\": \"$(git branch --show-current)\",\n        },\n        \"name\": \"clobber\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"git checkout -b scratch\",\n            \"name\": \"save current HEAD in \\\\\"scratch\\\\\" branch\",\n          },\n          Object {\n            \"exec\": \"git checkout $BRANCH\",\n          },\n          Object {\n            \"exec\": \"git fetch origin\",\n            \"name\": \"fetch latest changes from origin\",\n          },\n          Object {\n            \"exec\": \"git reset --hard origin/$BRANCH\",\n            \"name\": \"hard reset to origin commit\",\n          },\n          Object {\n            \"exec\": \"git clean -fdx\",\n            \"name\": \"clean all untracked files\",\n          },\n          Object {\n            \"say\": \"ready to rock! (unpushed commits are under the \\\\\"scratch\\\\\" branch)\",\n          },\n        ],\n      },\n      \"compat\": Object {\n        \"description\": \"Perform API compatibility check against latest version\",\n        \"name\": \"compat\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-diff npm:$(node -p \\\\\"require('./package.json').name\\\\\") -k --ignore-file .compatignore || (echo \\\\\"\nUNEXPECTED BREAKING CHANGES: add keys such as 'removed:constructs.Node.of' to .compatignore to skip.\n\\\\\" && exit 1)\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii --silence-warnings=reserved-word\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"docgen\": Object {\n        \"description\": \"Generate API.md from .jsii manifest\",\n        \"name\": \"docgen\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-docgen -o API.md\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"eslint\": Object {\n        \"description\": \"Runs eslint against the codebase\",\n        \"name\": \"eslint\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test build-tools .projenrc.js\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"if [ ! -z \\${CI} ]; then rsync -a . .repo --exclude .git --exclude node_modules && rm -rf dist && mv .repo dist; else npx projen package-all; fi\",\n          },\n        ],\n      },\n      \"package-all\": Object {\n        \"description\": \"Packages artifacts for all target languages\",\n        \"name\": \"package-all\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"package:js\",\n          },\n          Object {\n            \"spawn\": \"package:java\",\n          },\n          Object {\n            \"spawn\": \"package:python\",\n          },\n        ],\n      },\n      \"package:java\": Object {\n        \"description\": \"Create java language bindings\",\n        \"name\": \"package:java\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-pacmak -v --target java\",\n          },\n        ],\n      },\n      \"package:js\": Object {\n        \"description\": \"Create js language bindings\",\n        \"name\": \"package:js\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-pacmak -v --target js\",\n          },\n        ],\n      },\n      \"package:python\": Object {\n        \"description\": \"Create python language bindings\",\n        \"name\": \"package:python\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-pacmak -v --target python\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"docgen\",\n          },\n        ],\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"master\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --passWithNoTests --all --updateSnapshot --coverageProvider=v8\",\n          },\n          Object {\n            \"spawn\": \"eslint\",\n          },\n        ],\n      },\n      \"test:update\": Object {\n        \"description\": \"Update jest snapshots\",\n        \"name\": \"test:update\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --updateSnapshot\",\n          },\n        ],\n      },\n      \"test:watch\": Object {\n        \"description\": \"Run jest in watch mode\",\n        \"name\": \"test:watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --watch\",\n          },\n        ],\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"yarn upgrade npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"yarn install --check-files\",\n          },\n          Object {\n            \"exec\": \"yarn upgrade\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n      \"watch\": Object {\n        \"description\": \"Watch & compile in the background\",\n        \"name\": \"watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii -w --silence-warnings=reserved-word\",\n          },\n        ],\n      },\n    },\n  },\n  \".projenrc.js\": \"const { awscdk, Semver } = require('projen');\n\nconst project = new awscdk.ConstructLibraryAws({\n  name: 'cdk-watchful',\n  description: 'Watching your CDK apps since 2019',\n  defaultReleaseBranch: 'master',\n  authorName: 'Elad Ben-Israel',\n  authorEmail: 'elad.benisrael@gmail.com',\n  repository: 'https://github.com/eladb/cdk-watchful.git',\n  keywords: [\n    'cloudwatch',\n    'monitoring',\n  ],\n\n  catalog: {\n    twitter: 'emeshbi',\n  },\n\n  // creates PRs for projen upgrades\n  projenUpgradeSecret: 'PROJEN_GITHUB_TOKEN',\n\n  cdkVersion: '1.75.0',\n  cdkDependencies: [\n    '@aws-cdk/aws-apigateway',\n    '@aws-cdk/aws-cloudwatch',\n    '@aws-cdk/aws-cloudwatch-actions',\n    '@aws-cdk/aws-dynamodb',\n    '@aws-cdk/aws-ecs',\n    '@aws-cdk/aws-ecs-patterns',\n    '@aws-cdk/aws-elasticloadbalancingv2',\n    '@aws-cdk/aws-events',\n    '@aws-cdk/aws-events-targets',\n    '@aws-cdk/aws-lambda',\n    '@aws-cdk/aws-rds',\n    '@aws-cdk/aws-sns',\n    '@aws-cdk/aws-sns-subscriptions',\n    '@aws-cdk/aws-sqs',\n    '@aws-cdk/core',\n  ],\n\n  devDeps: [\n    'aws-sdk',\n  ],\n\n  // jsii publishing\n\n  publishToMaven: {\n    javaPackage: 'com.github.eladb.watchful',\n    mavenGroupId: 'com.github.eladb',\n    mavenArtifactId: 'cdk-watchful',\n  },\n\n  publishToPypi: {\n    distName: 'cdk-watchful',\n    module: 'cdk_watchful',\n  },\n\n  minNodeVersion: '14.0.0',\n});\n\nproject.gitignore.exclude('.env', '.idea');\nproject.gitignore.exclude('example/*.js', 'example/*.d.ts');\n\nproject.synth();\n\",\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"author\": Object {\n      \"email\": \"elad.benisrael@gmail.com\",\n      \"name\": \"Elad Ben-Israel\",\n      \"organization\": false,\n    },\n    \"awscdkio\": Object {\n      \"twitter\": \"emeshbi\",\n    },\n    \"dependencies\": Object {\n      \"@aws-cdk/aws-apigateway\": \"^1.75.0\",\n      \"@aws-cdk/aws-cloudwatch\": \"^1.75.0\",\n      \"@aws-cdk/aws-cloudwatch-actions\": \"^1.75.0\",\n      \"@aws-cdk/aws-dynamodb\": \"^1.75.0\",\n      \"@aws-cdk/aws-ecs\": \"^1.75.0\",\n      \"@aws-cdk/aws-ecs-patterns\": \"^1.75.0\",\n      \"@aws-cdk/aws-elasticloadbalancingv2\": \"^1.75.0\",\n      \"@aws-cdk/aws-events\": \"^1.75.0\",\n      \"@aws-cdk/aws-events-targets\": \"^1.75.0\",\n      \"@aws-cdk/aws-lambda\": \"^1.75.0\",\n      \"@aws-cdk/aws-rds\": \"^1.75.0\",\n      \"@aws-cdk/aws-sns\": \"^1.75.0\",\n      \"@aws-cdk/aws-sns-subscriptions\": \"^1.75.0\",\n      \"@aws-cdk/aws-sqs\": \"^1.75.0\",\n      \"@aws-cdk/core\": \"^1.75.0\",\n    },\n    \"description\": \"Watching your CDK apps since 2019\",\n    \"devDependencies\": Object {\n      \"@aws-cdk/assert\": \"^1.75.0\",\n      \"@types/jest\": \"^27\",\n      \"@types/node\": \"^14\",\n      \"@typescript-eslint/eslint-plugin\": \"^5\",\n      \"@typescript-eslint/parser\": \"^5\",\n      \"aws-sdk\": \"*\",\n      \"eslint\": \"^8\",\n      \"eslint-import-resolver-node\": \"*\",\n      \"eslint-import-resolver-typescript\": \"*\",\n      \"eslint-plugin-import\": \"*\",\n      \"jest\": \"^27\",\n      \"jest-junit\": \"^13\",\n      \"jsii\": \"*\",\n      \"jsii-diff\": \"*\",\n      \"jsii-docgen\": \"*\",\n      \"jsii-pacmak\": \"*\",\n      \"json-schema\": \"*\",\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"standard-version\": \"^9\",\n      \"ts-jest\": \"^27\",\n      \"typescript\": \"*\",\n    },\n    \"engines\": Object {\n      \"node\": \">= 14.0.0\",\n    },\n    \"jest\": Object {\n      \"clearMocks\": true,\n      \"collectCoverage\": true,\n      \"coverageDirectory\": \"coverage\",\n      \"coveragePathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n      \"coverageReporters\": Array [\n        \"json\",\n        \"lcov\",\n        \"clover\",\n        \"cobertura\",\n        \"text\",\n      ],\n      \"globals\": Object {\n        \"ts-jest\": Object {\n          \"tsconfig\": \"tsconfig.dev.json\",\n        },\n      },\n      \"preset\": \"ts-jest\",\n      \"reporters\": Array [\n        \"default\",\n        Array [\n          \"jest-junit\",\n          Object {\n            \"outputDirectory\": \"test-reports\",\n          },\n        ],\n      ],\n      \"testMatch\": Array [\n        \"<rootDir>/src/**/__tests__/**/*.ts?(x)\",\n        \"<rootDir>/(test|src)/**/*(*.)@(spec|test).ts?(x)\",\n      ],\n      \"testPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n      \"watchPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n    },\n    \"jsii\": Object {\n      \"outdir\": \"dist\",\n      \"targets\": Object {\n        \"java\": Object {\n          \"maven\": Object {\n            \"artifactId\": \"cdk-watchful\",\n            \"groupId\": \"com.github.eladb\",\n          },\n          \"package\": \"com.github.eladb.watchful\",\n        },\n        \"python\": Object {\n          \"distName\": \"cdk-watchful\",\n          \"module\": \"cdk_watchful\",\n        },\n      },\n      \"tsc\": Object {\n        \"outDir\": \"lib\",\n        \"rootDir\": \"src\",\n      },\n    },\n    \"keywords\": Array [\n      \"cdk\",\n      \"cloudwatch\",\n      \"monitoring\",\n    ],\n    \"license\": \"Apache-2.0\",\n    \"main\": \"lib/index.js\",\n    \"name\": \"cdk-watchful\",\n    \"peerDependencies\": Object {\n      \"@aws-cdk/aws-apigateway\": \"^1.75.0\",\n      \"@aws-cdk/aws-cloudwatch\": \"^1.75.0\",\n      \"@aws-cdk/aws-cloudwatch-actions\": \"^1.75.0\",\n      \"@aws-cdk/aws-dynamodb\": \"^1.75.0\",\n      \"@aws-cdk/aws-ecs\": \"^1.75.0\",\n      \"@aws-cdk/aws-ecs-patterns\": \"^1.75.0\",\n      \"@aws-cdk/aws-elasticloadbalancingv2\": \"^1.75.0\",\n      \"@aws-cdk/aws-events\": \"^1.75.0\",\n      \"@aws-cdk/aws-events-targets\": \"^1.75.0\",\n      \"@aws-cdk/aws-lambda\": \"^1.75.0\",\n      \"@aws-cdk/aws-rds\": \"^1.75.0\",\n      \"@aws-cdk/aws-sns\": \"^1.75.0\",\n      \"@aws-cdk/aws-sns-subscriptions\": \"^1.75.0\",\n      \"@aws-cdk/aws-sqs\": \"^1.75.0\",\n      \"@aws-cdk/core\": \"^1.75.0\",\n      \"constructs\": \"^3.2.27\",\n    },\n    \"repository\": Object {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/eladb/cdk-watchful.git\",\n    },\n    \"resolutions\": Object {\n      \"@types/prettier\": \"2.6.0\",\n    },\n    \"scripts\": Object {\n      \"build\": \"npx projen build\",\n      \"bump\": \"npx projen bump\",\n      \"clobber\": \"npx projen clobber\",\n      \"compat\": \"npx projen compat\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"docgen\": \"npx projen docgen\",\n      \"eject\": \"npx projen eject\",\n      \"eslint\": \"npx projen eslint\",\n      \"package\": \"npx projen package\",\n      \"package-all\": \"npx projen package-all\",\n      \"package:java\": \"npx projen package:java\",\n      \"package:js\": \"npx projen package:js\",\n      \"package:python\": \"npx projen package:python\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"release\": \"npx projen release\",\n      \"test\": \"npx projen test\",\n      \"test:update\": \"npx projen test:update\",\n      \"test:watch\": \"npx projen test:watch\",\n      \"unbump\": \"npx projen unbump\",\n      \"upgrade\": \"npx projen upgrade\",\n      \"watch\": \"npx projen watch\",\n    },\n    \"stability\": \"stable\",\n    \"types\": \"lib/index.d.ts\",\n    \"version\": \"0.0.0\",\n  },\n  \"src/index.ts\": \"export class Hello {\n  public sayHello() {\n    return 'hello, world!';\n  }\n}\",\n  \"test/hello.test.ts\": \"import { Hello } from '../src';\n\ntest('hello', () => {\n  expect(new Hello().sayHello()).toBe('hello, world!');\n});\",\n  \"tsconfig.dev.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"lib\": Array [\n        \"es2019\",\n      ],\n      \"module\": \"CommonJS\",\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"resolveJsonModule\": true,\n      \"strict\": true,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"ES2019\",\n    },\n    \"exclude\": Array [\n      \"node_modules\",\n    ],\n    \"include\": Array [\n      \".projenrc.js\",\n      \"src/**/*.ts\",\n      \"test/**/*.ts\",\n    ],\n  },\n}\n`;\n\nexports[`cdk8s 1`] = `\nObject {\n  \".eslintrc.json\": Object {\n    \"env\": Object {\n      \"jest\": true,\n      \"node\": true,\n    },\n    \"extends\": Array [\n      \"plugin:import/typescript\",\n    ],\n    \"ignorePatterns\": Array [\n      \"*.js\",\n      \"!.projenrc.js\",\n      \"*.d.ts\",\n      \"node_modules/\",\n      \"*.generated.ts\",\n      \"coverage\",\n    ],\n    \"overrides\": Array [\n      Object {\n        \"files\": Array [\n          \".projenrc.js\",\n        ],\n        \"rules\": Object {\n          \"@typescript-eslint/no-require-imports\": \"off\",\n          \"import/no-extraneous-dependencies\": \"off\",\n        },\n      },\n    ],\n    \"parser\": \"@typescript-eslint/parser\",\n    \"parserOptions\": Object {\n      \"ecmaVersion\": 2018,\n      \"project\": \"./tsconfig.dev.json\",\n      \"sourceType\": \"module\",\n    },\n    \"plugins\": Array [\n      \"@typescript-eslint\",\n      \"import\",\n    ],\n    \"root\": true,\n    \"rules\": Object {\n      \"@typescript-eslint/indent\": Array [\n        \"error\",\n        2,\n      ],\n      \"@typescript-eslint/member-delimiter-style\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/member-ordering\": Array [\n        \"error\",\n        Object {\n          \"default\": Array [\n            \"public-static-field\",\n            \"public-static-method\",\n            \"protected-static-field\",\n            \"protected-static-method\",\n            \"private-static-field\",\n            \"private-static-method\",\n            \"field\",\n            \"constructor\",\n            \"method\",\n          ],\n        },\n      ],\n      \"@typescript-eslint/no-floating-promises\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-require-imports\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-shadow\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/return-await\": Array [\n        \"error\",\n      ],\n      \"array-bracket-newline\": Array [\n        \"error\",\n        \"consistent\",\n      ],\n      \"array-bracket-spacing\": Array [\n        \"error\",\n        \"never\",\n      ],\n      \"brace-style\": Array [\n        \"error\",\n        \"1tbs\",\n        Object {\n          \"allowSingleLine\": true,\n        },\n      ],\n      \"comma-dangle\": Array [\n        \"error\",\n        \"always-multiline\",\n      ],\n      \"comma-spacing\": Array [\n        \"error\",\n        Object {\n          \"after\": true,\n          \"before\": false,\n        },\n      ],\n      \"curly\": Array [\n        \"error\",\n        \"multi-line\",\n        \"consistent\",\n      ],\n      \"dot-notation\": Array [\n        \"error\",\n      ],\n      \"import/no-extraneous-dependencies\": Array [\n        \"error\",\n        Object {\n          \"devDependencies\": Array [\n            \"**/test/**\",\n            \"**/build-tools/**\",\n          ],\n          \"optionalDependencies\": false,\n          \"peerDependencies\": true,\n        },\n      ],\n      \"import/no-unresolved\": Array [\n        \"error\",\n      ],\n      \"import/order\": Array [\n        \"warn\",\n        Object {\n          \"alphabetize\": Object {\n            \"caseInsensitive\": true,\n            \"order\": \"asc\",\n          },\n          \"groups\": Array [\n            \"builtin\",\n            \"external\",\n          ],\n        },\n      ],\n      \"indent\": Array [\n        \"off\",\n      ],\n      \"key-spacing\": Array [\n        \"error\",\n      ],\n      \"keyword-spacing\": Array [\n        \"error\",\n      ],\n      \"max-len\": Array [\n        \"error\",\n        Object {\n          \"code\": 150,\n          \"ignoreComments\": true,\n          \"ignoreRegExpLiterals\": true,\n          \"ignoreStrings\": true,\n          \"ignoreTemplateLiterals\": true,\n          \"ignoreUrls\": true,\n        },\n      ],\n      \"no-bitwise\": Array [\n        \"error\",\n      ],\n      \"no-duplicate-imports\": Array [\n        \"error\",\n      ],\n      \"no-multi-spaces\": Array [\n        \"error\",\n        Object {\n          \"ignoreEOLComments\": false,\n        },\n      ],\n      \"no-multiple-empty-lines\": Array [\n        \"error\",\n      ],\n      \"no-return-await\": Array [\n        \"off\",\n      ],\n      \"no-shadow\": Array [\n        \"off\",\n      ],\n      \"no-trailing-spaces\": Array [\n        \"error\",\n      ],\n      \"object-curly-newline\": Array [\n        \"error\",\n        Object {\n          \"consistent\": true,\n          \"multiline\": true,\n        },\n      ],\n      \"object-curly-spacing\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"object-property-newline\": Array [\n        \"error\",\n        Object {\n          \"allowAllPropertiesOnSameLine\": true,\n        },\n      ],\n      \"quote-props\": Array [\n        \"error\",\n        \"consistent-as-needed\",\n      ],\n      \"quotes\": Array [\n        \"error\",\n        \"single\",\n        Object {\n          \"avoidEscape\": true,\n        },\n      ],\n      \"semi\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"space-before-blocks\": Array [\n        \"error\",\n      ],\n    },\n    \"settings\": Object {\n      \"import/parsers\": Object {\n        \"@typescript-eslint/parser\": Array [\n          \".ts\",\n          \".tsx\",\n        ],\n      },\n      \"import/resolver\": Object {\n        \"node\": Object {},\n        \"typescript\": Object {\n          \"alwaysTryTypes\": true,\n          \"project\": \"./tsconfig.dev.json\",\n        },\n      },\n    },\n  },\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n*.snap linguist-generated\n/.eslintrc.json linguist-generated\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/upgrade.yml linguist-generated\n/.gitignore linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/API.md linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/tsconfig.dev.json linguist-generated\n/yarn.lock linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/upgrade.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 12.7.0\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          branch: github-actions/upgrade\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n/test-reports/\njunit.xml\n/coverage/\n!/.github/workflows/upgrade.yml\n!/test/\n!/tsconfig.dev.json\n!/src/\n/lib\n/dist/\n!/.eslintrc.json\n.jsii\ntsconfig.json\n!/API.md\n!/src/_loadurl.js\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projen/\n/test-reports/\njunit.xml\n/coverage/\n/test/\n/tsconfig.dev.json\n/src/\n!/lib/\n!/lib/**/*.js\n!/lib/**/*.d.ts\ndist\n/tsconfig.json\n/.github/\n/.vscode/\n/.idea/\n/.projenrc.js\ntsconfig.tsbuildinfo\n/.eslintrc.json\n!.jsii\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"@types/follow-redirects\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/jest\",\n        \"type\": \"build\",\n        \"version\": \"^27\",\n      },\n      Object {\n        \"name\": \"@types/json-stable-stringify\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/node\",\n        \"type\": \"build\",\n        \"version\": \"^12\",\n      },\n      Object {\n        \"name\": \"@types/yaml\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/eslint-plugin\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/parser\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"constructs\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-node\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-plugin-import\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint\",\n        \"type\": \"build\",\n        \"version\": \"^8\",\n      },\n      Object {\n        \"name\": \"jest-junit\",\n        \"type\": \"build\",\n        \"version\": \"^13\",\n      },\n      Object {\n        \"name\": \"jest\",\n        \"type\": \"build\",\n        \"version\": \"^27\",\n      },\n      Object {\n        \"name\": \"jsii\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jsii-diff\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jsii-docgen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jsii-pacmak\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"json-schema\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"json-schema-to-typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"ts-jest\",\n        \"type\": \"build\",\n        \"version\": \"^27\",\n      },\n      Object {\n        \"name\": \"typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"fast-json-patch\",\n        \"type\": \"bundled\",\n      },\n      Object {\n        \"name\": \"follow-redirects\",\n        \"type\": \"bundled\",\n      },\n      Object {\n        \"name\": \"json-stable-stringify\",\n        \"type\": \"bundled\",\n      },\n      Object {\n        \"name\": \"yaml\",\n        \"type\": \"bundled\",\n      },\n      Object {\n        \"name\": \"constructs\",\n        \"type\": \"peer\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".eslintrc.json\",\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/upgrade.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n      \"tsconfig.dev.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"clobber\": Object {\n        \"condition\": \"git diff --exit-code > /dev/null\",\n        \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n        \"env\": Object {\n          \"BRANCH\": \"$(git branch --show-current)\",\n        },\n        \"name\": \"clobber\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"git checkout -b scratch\",\n            \"name\": \"save current HEAD in \\\\\"scratch\\\\\" branch\",\n          },\n          Object {\n            \"exec\": \"git checkout $BRANCH\",\n          },\n          Object {\n            \"exec\": \"git fetch origin\",\n            \"name\": \"fetch latest changes from origin\",\n          },\n          Object {\n            \"exec\": \"git reset --hard origin/$BRANCH\",\n            \"name\": \"hard reset to origin commit\",\n          },\n          Object {\n            \"exec\": \"git clean -fdx\",\n            \"name\": \"clean all untracked files\",\n          },\n          Object {\n            \"say\": \"ready to rock! (unpushed commits are under the \\\\\"scratch\\\\\" branch)\",\n          },\n        ],\n      },\n      \"compat\": Object {\n        \"description\": \"Perform API compatibility check against latest version\",\n        \"name\": \"compat\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-diff npm:$(node -p \\\\\"require('./package.json').name\\\\\") -k --ignore-file .compatignore || (echo \\\\\"\nUNEXPECTED BREAKING CHANGES: add keys such as 'removed:constructs.Node.of' to .compatignore to skip.\n\\\\\" && exit 1)\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii --silence-warnings=reserved-word\",\n          },\n          Object {\n            \"exec\": \"cp src/_loadurl.js lib/\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"docgen\": Object {\n        \"description\": \"Generate API.md from .jsii manifest\",\n        \"name\": \"docgen\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-docgen -o API.md\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"eslint\": Object {\n        \"description\": \"Runs eslint against the codebase\",\n        \"name\": \"eslint\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test build-tools .projenrc.js\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"if [ ! -z \\${CI} ]; then rsync -a . .repo --exclude .git --exclude node_modules && rm -rf dist && mv .repo dist; else npx projen package-all; fi\",\n          },\n        ],\n      },\n      \"package-all\": Object {\n        \"description\": \"Packages artifacts for all target languages\",\n        \"name\": \"package-all\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"package:js\",\n          },\n          Object {\n            \"spawn\": \"package:java\",\n          },\n          Object {\n            \"spawn\": \"package:python\",\n          },\n          Object {\n            \"spawn\": \"package:dotnet\",\n          },\n        ],\n      },\n      \"package:dotnet\": Object {\n        \"description\": \"Create dotnet language bindings\",\n        \"name\": \"package:dotnet\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-pacmak -v --target dotnet\",\n          },\n        ],\n      },\n      \"package:java\": Object {\n        \"description\": \"Create java language bindings\",\n        \"name\": \"package:java\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-pacmak -v --target java\",\n          },\n        ],\n      },\n      \"package:js\": Object {\n        \"description\": \"Create js language bindings\",\n        \"name\": \"package:js\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-pacmak -v --target js\",\n          },\n        ],\n      },\n      \"package:python\": Object {\n        \"description\": \"Create python language bindings\",\n        \"name\": \"package:python\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii-pacmak -v --target python\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"docgen\",\n          },\n        ],\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --passWithNoTests --all --updateSnapshot\",\n          },\n          Object {\n            \"spawn\": \"eslint\",\n          },\n          Object {\n            \"exec\": \"yarn compile\",\n          },\n        ],\n      },\n      \"test:update\": Object {\n        \"description\": \"Update jest snapshots\",\n        \"name\": \"test:update\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --updateSnapshot\",\n          },\n        ],\n      },\n      \"test:watch\": Object {\n        \"description\": \"Run jest in watch mode\",\n        \"name\": \"test:watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --watch\",\n          },\n        ],\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"yarn upgrade npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"yarn install --check-files\",\n          },\n          Object {\n            \"exec\": \"yarn upgrade\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n      \"watch\": Object {\n        \"description\": \"Watch & compile in the background\",\n        \"name\": \"watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jsii -w --silence-warnings=reserved-word\",\n          },\n        ],\n      },\n    },\n  },\n  \".projenrc.js\": \"const { cdk } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new cdk.JsiiProject({\n  name: 'cdk8s',\n  description: 'Cloud Development Kit for Kubernetes',\n  defaultReleaseBranch: 'master',\n  stability: common.options.stability,\n\n  // without this, the version of 'constructs' would need to be controlled\n  // from this file, since otherwise it would create a 0.0.0 dev dependency.\n  peerDependencyOptions: {\n    pinnedDevDependency: false,\n  },\n\n  ...common.options,\n\n  peerDeps: [\n    'constructs',\n  ],\n  bundledDeps: [\n    'yaml',\n    'json-stable-stringify',\n    'follow-redirects',\n    'fast-json-patch',\n  ],\n  devDeps: [\n    'constructs',\n    '@types/follow-redirects',\n    '@types/json-stable-stringify',\n    '@types/yaml',\n    'json-schema-to-typescript',\n  ],\n\n  // jsii configuration\n  publishToMaven: {\n    javaPackage: 'org.cdk8s',\n    mavenGroupId: 'org.cdk8s',\n    mavenArtifactId: 'cdk8s',\n  },\n  publishToPypi: {\n    distName: 'cdk8s',\n    module: 'cdk8s',\n  },\n  publishToNuget: {\n    dotNetNamespace: 'Org.Cdk8s',\n    packageId: 'Org.Cdk8s',\n  },\n});\n\ncommon.fixup(project);\n\n// _loadurl.js is written in javascript so we need to commit it and also copy it\n// after compilation to the \\`lib/\\` directory.\nproject.gitignore.include('/src/_loadurl.js');\nproject.addCompileCommand('cp src/_loadurl.js lib/');\n\nproject.synth();\n\",\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"cdk8s-cli.projenrc.js\": \"const { typescript } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new typescript.TypeScriptLibraryProject({\n  name: 'cdk8s-cli',\n  description: 'CDK for Kubernetes CLI',\n  defaultReleaseBranch: 'master',\n  bin: {\n    cdk8s: 'bin/cdk8s',\n  },\n  deps: [\n    'cdk8s@^0.0.0',\n    'codemaker',\n    \\`constructs\\`,\n    'fs-extra',\n    'jsii-srcmak',\n    'jsii-pacmak',\n    'sscaff',\n    'yaml',\n    'yargs',\n    'json2jsii',\n    'colors',\n\n    // add @types/node as a regular dependency since it's needed to during \\\\\"import\\\\\"\n    // to compile the generated jsii code.\n    '@types/node',\n  ],\n  devDeps: [\n    '@types/fs-extra',\n    '@types/json-schema',\n  ],\n  ...common.options,\n});\n\nproject.eslint.addIgnorePattern('/templates/');\nproject.jest.addIgnorePattern('/templates/');\n\ncommon.fixup(project);\n\nproject.synth();\n\",\n  \"cdk8s.common.js\": \"exports.options = {\n  minNodeVersion: '12.7.0',\n  repository: 'https://github.com/awslabs/cdk8s.git',\n  authorName: 'Amazon Web Services',\n  authorUrl: 'https://aws.amazon.com',\n  authorOrganization: true,\n  buildWorkflow: false,\n  rebuildBot: false,\n  stability: 'experimental',\n  releaseWorkflow: false,\n  dependabot: false,\n  mergify: false,\n  compat: false,\n  dependabot: false,\n  pullRequestTemplate: false,\n  keywords: [\n    \\\\\"cdk\\\\\",\n    \\\\\"kubernetes\\\\\",\n    \\\\\"k8s\\\\\",\n    \\\\\"constructs\\\\\"\n  ]\n};\n\n// some common fixups for projects\nexports.fixup = project => {\n  // override the default \\\\\"build\\\\\" from projen because currently in this\n  // repo it means \\\\\"compile\\\\\"\n  project.setScript('build', 'yarn compile');\n\n  // // add \\\\\"compile\\\\\" after test because the test command deletes lib/ and we run tests *after* build in this repo.\n  project.addTestCommand('yarn compile');\n\n  // jsii-release is declared at the root level, we don't need it here.\n  project.deps.removeDependency('jsii-release');\n\n  delete project.manifest.scripts.bump;\n  delete project.manifest.scripts.release;\n};\n\",\n  \"cdk8s.projenrc.js\": \"const { cdk } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new cdk.JsiiProject({\n  name: 'cdk8s',\n  description: 'Cloud Development Kit for Kubernetes',\n  defaultReleaseBranch: 'master',\n  stability: common.options.stability,\n\n  // without this, the version of 'constructs' would need to be controlled\n  // from this file, since otherwise it would create a 0.0.0 dev dependency.\n  peerDependencyOptions: {\n    pinnedDevDependency: false,\n  },\n\n  ...common.options,\n\n  peerDeps: [\n    'constructs',\n  ],\n  bundledDeps: [\n    'yaml',\n    'json-stable-stringify',\n    'follow-redirects',\n    'fast-json-patch',\n  ],\n  devDeps: [\n    'constructs',\n    '@types/follow-redirects',\n    '@types/json-stable-stringify',\n    '@types/yaml',\n    'json-schema-to-typescript',\n  ],\n\n  // jsii configuration\n  publishToMaven: {\n    javaPackage: 'org.cdk8s',\n    mavenGroupId: 'org.cdk8s',\n    mavenArtifactId: 'cdk8s',\n  },\n  publishToPypi: {\n    distName: 'cdk8s',\n    module: 'cdk8s',\n  },\n  publishToNuget: {\n    dotNetNamespace: 'Org.Cdk8s',\n    packageId: 'Org.Cdk8s',\n  },\n});\n\ncommon.fixup(project);\n\n// _loadurl.js is written in javascript so we need to commit it and also copy it\n// after compilation to the \\`lib/\\` directory.\nproject.gitignore.include('/src/_loadurl.js');\nproject.addCompileCommand('cp src/_loadurl.js lib/');\n\nproject.synth();\n\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"author\": Object {\n      \"name\": \"Amazon Web Services\",\n      \"organization\": true,\n      \"url\": \"https://aws.amazon.com\",\n    },\n    \"bundledDependencies\": Array [\n      \"fast-json-patch\",\n      \"follow-redirects\",\n      \"json-stable-stringify\",\n      \"yaml\",\n    ],\n    \"dependencies\": Object {\n      \"fast-json-patch\": \"*\",\n      \"follow-redirects\": \"*\",\n      \"json-stable-stringify\": \"*\",\n      \"yaml\": \"*\",\n    },\n    \"description\": \"Cloud Development Kit for Kubernetes\",\n    \"devDependencies\": Object {\n      \"@types/follow-redirects\": \"*\",\n      \"@types/jest\": \"^27\",\n      \"@types/json-stable-stringify\": \"*\",\n      \"@types/node\": \"^12\",\n      \"@types/yaml\": \"*\",\n      \"@typescript-eslint/eslint-plugin\": \"^5\",\n      \"@typescript-eslint/parser\": \"^5\",\n      \"constructs\": \"*\",\n      \"eslint\": \"^8\",\n      \"eslint-import-resolver-node\": \"*\",\n      \"eslint-import-resolver-typescript\": \"*\",\n      \"eslint-plugin-import\": \"*\",\n      \"jest\": \"^27\",\n      \"jest-junit\": \"^13\",\n      \"jsii\": \"*\",\n      \"jsii-diff\": \"*\",\n      \"jsii-docgen\": \"*\",\n      \"jsii-pacmak\": \"*\",\n      \"json-schema\": \"*\",\n      \"json-schema-to-typescript\": \"*\",\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"ts-jest\": \"^27\",\n      \"typescript\": \"*\",\n    },\n    \"engines\": Object {\n      \"node\": \">= 12.7.0\",\n    },\n    \"jest\": Object {\n      \"clearMocks\": true,\n      \"collectCoverage\": true,\n      \"coverageDirectory\": \"coverage\",\n      \"coveragePathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n      \"coverageReporters\": Array [\n        \"json\",\n        \"lcov\",\n        \"clover\",\n        \"cobertura\",\n        \"text\",\n      ],\n      \"globals\": Object {\n        \"ts-jest\": Object {\n          \"tsconfig\": \"tsconfig.dev.json\",\n        },\n      },\n      \"preset\": \"ts-jest\",\n      \"reporters\": Array [\n        \"default\",\n        Array [\n          \"jest-junit\",\n          Object {\n            \"outputDirectory\": \"test-reports\",\n          },\n        ],\n      ],\n      \"testMatch\": Array [\n        \"<rootDir>/src/**/__tests__/**/*.ts?(x)\",\n        \"<rootDir>/(test|src)/**/*(*.)@(spec|test).ts?(x)\",\n      ],\n      \"testPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n      \"watchPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n    },\n    \"jsii\": Object {\n      \"outdir\": \"dist\",\n      \"targets\": Object {\n        \"dotnet\": Object {\n          \"namespace\": \"Org.Cdk8s\",\n          \"packageId\": \"Org.Cdk8s\",\n        },\n        \"java\": Object {\n          \"maven\": Object {\n            \"artifactId\": \"cdk8s\",\n            \"groupId\": \"org.cdk8s\",\n          },\n          \"package\": \"org.cdk8s\",\n        },\n        \"python\": Object {\n          \"distName\": \"cdk8s\",\n          \"module\": \"cdk8s\",\n        },\n      },\n      \"tsc\": Object {\n        \"outDir\": \"lib\",\n        \"rootDir\": \"src\",\n      },\n    },\n    \"keywords\": Array [\n      \"cdk\",\n      \"constructs\",\n      \"k8s\",\n      \"kubernetes\",\n    ],\n    \"license\": \"Apache-2.0\",\n    \"main\": \"lib/index.js\",\n    \"name\": \"cdk8s\",\n    \"peerDependencies\": Object {\n      \"constructs\": \"*\",\n    },\n    \"repository\": Object {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/awslabs/cdk8s.git\",\n    },\n    \"resolutions\": Object {\n      \"@types/prettier\": \"2.6.0\",\n    },\n    \"scripts\": Object {\n      \"build\": \"yarn compile\",\n      \"clobber\": \"npx projen clobber\",\n      \"compat\": \"npx projen compat\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"docgen\": \"npx projen docgen\",\n      \"eject\": \"npx projen eject\",\n      \"eslint\": \"npx projen eslint\",\n      \"package\": \"npx projen package\",\n      \"package-all\": \"npx projen package-all\",\n      \"package:dotnet\": \"npx projen package:dotnet\",\n      \"package:java\": \"npx projen package:java\",\n      \"package:js\": \"npx projen package:js\",\n      \"package:python\": \"npx projen package:python\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"test\": \"npx projen test\",\n      \"test:update\": \"npx projen test:update\",\n      \"test:watch\": \"npx projen test:watch\",\n      \"upgrade\": \"npx projen upgrade\",\n      \"watch\": \"npx projen watch\",\n    },\n    \"stability\": \"experimental\",\n    \"types\": \"lib/index.d.ts\",\n    \"version\": \"0.0.0\",\n  },\n  \"src/index.ts\": \"export class Hello {\n  public sayHello() {\n    return 'hello, world!';\n  }\n}\",\n  \"test/hello.test.ts\": \"import { Hello } from '../src';\n\ntest('hello', () => {\n  expect(new Hello().sayHello()).toBe('hello, world!');\n});\",\n  \"tsconfig.dev.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"lib\": Array [\n        \"es2019\",\n      ],\n      \"module\": \"CommonJS\",\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"resolveJsonModule\": true,\n      \"strict\": true,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"ES2019\",\n    },\n    \"exclude\": Array [\n      \"node_modules\",\n    ],\n    \"include\": Array [\n      \".projenrc.js\",\n      \"src/**/*.ts\",\n      \"test/**/*.ts\",\n    ],\n  },\n}\n`;\n\nexports[`cdk8s-cli 1`] = `\nObject {\n  \".eslintrc.json\": Object {\n    \"env\": Object {\n      \"jest\": true,\n      \"node\": true,\n    },\n    \"extends\": Array [\n      \"plugin:import/typescript\",\n    ],\n    \"ignorePatterns\": Array [\n      \"*.js\",\n      \"!.projenrc.js\",\n      \"*.d.ts\",\n      \"node_modules/\",\n      \"*.generated.ts\",\n      \"coverage\",\n      \"/templates/\",\n    ],\n    \"overrides\": Array [\n      Object {\n        \"files\": Array [\n          \".projenrc.js\",\n        ],\n        \"rules\": Object {\n          \"@typescript-eslint/no-require-imports\": \"off\",\n          \"import/no-extraneous-dependencies\": \"off\",\n        },\n      },\n    ],\n    \"parser\": \"@typescript-eslint/parser\",\n    \"parserOptions\": Object {\n      \"ecmaVersion\": 2018,\n      \"project\": \"./tsconfig.dev.json\",\n      \"sourceType\": \"module\",\n    },\n    \"plugins\": Array [\n      \"@typescript-eslint\",\n      \"import\",\n    ],\n    \"root\": true,\n    \"rules\": Object {\n      \"@typescript-eslint/indent\": Array [\n        \"error\",\n        2,\n      ],\n      \"@typescript-eslint/member-delimiter-style\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/member-ordering\": Array [\n        \"error\",\n        Object {\n          \"default\": Array [\n            \"public-static-field\",\n            \"public-static-method\",\n            \"protected-static-field\",\n            \"protected-static-method\",\n            \"private-static-field\",\n            \"private-static-method\",\n            \"field\",\n            \"constructor\",\n            \"method\",\n          ],\n        },\n      ],\n      \"@typescript-eslint/no-floating-promises\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-require-imports\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-shadow\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/return-await\": Array [\n        \"error\",\n      ],\n      \"array-bracket-newline\": Array [\n        \"error\",\n        \"consistent\",\n      ],\n      \"array-bracket-spacing\": Array [\n        \"error\",\n        \"never\",\n      ],\n      \"brace-style\": Array [\n        \"error\",\n        \"1tbs\",\n        Object {\n          \"allowSingleLine\": true,\n        },\n      ],\n      \"comma-dangle\": Array [\n        \"error\",\n        \"always-multiline\",\n      ],\n      \"comma-spacing\": Array [\n        \"error\",\n        Object {\n          \"after\": true,\n          \"before\": false,\n        },\n      ],\n      \"curly\": Array [\n        \"error\",\n        \"multi-line\",\n        \"consistent\",\n      ],\n      \"dot-notation\": Array [\n        \"error\",\n      ],\n      \"import/no-extraneous-dependencies\": Array [\n        \"error\",\n        Object {\n          \"devDependencies\": Array [\n            \"**/test/**\",\n            \"**/build-tools/**\",\n          ],\n          \"optionalDependencies\": false,\n          \"peerDependencies\": true,\n        },\n      ],\n      \"import/no-unresolved\": Array [\n        \"error\",\n      ],\n      \"import/order\": Array [\n        \"warn\",\n        Object {\n          \"alphabetize\": Object {\n            \"caseInsensitive\": true,\n            \"order\": \"asc\",\n          },\n          \"groups\": Array [\n            \"builtin\",\n            \"external\",\n          ],\n        },\n      ],\n      \"indent\": Array [\n        \"off\",\n      ],\n      \"key-spacing\": Array [\n        \"error\",\n      ],\n      \"keyword-spacing\": Array [\n        \"error\",\n      ],\n      \"max-len\": Array [\n        \"error\",\n        Object {\n          \"code\": 150,\n          \"ignoreComments\": true,\n          \"ignoreRegExpLiterals\": true,\n          \"ignoreStrings\": true,\n          \"ignoreTemplateLiterals\": true,\n          \"ignoreUrls\": true,\n        },\n      ],\n      \"no-bitwise\": Array [\n        \"error\",\n      ],\n      \"no-duplicate-imports\": Array [\n        \"error\",\n      ],\n      \"no-multi-spaces\": Array [\n        \"error\",\n        Object {\n          \"ignoreEOLComments\": false,\n        },\n      ],\n      \"no-multiple-empty-lines\": Array [\n        \"error\",\n      ],\n      \"no-return-await\": Array [\n        \"off\",\n      ],\n      \"no-shadow\": Array [\n        \"off\",\n      ],\n      \"no-trailing-spaces\": Array [\n        \"error\",\n      ],\n      \"object-curly-newline\": Array [\n        \"error\",\n        Object {\n          \"consistent\": true,\n          \"multiline\": true,\n        },\n      ],\n      \"object-curly-spacing\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"object-property-newline\": Array [\n        \"error\",\n        Object {\n          \"allowAllPropertiesOnSameLine\": true,\n        },\n      ],\n      \"quote-props\": Array [\n        \"error\",\n        \"consistent-as-needed\",\n      ],\n      \"quotes\": Array [\n        \"error\",\n        \"single\",\n        Object {\n          \"avoidEscape\": true,\n        },\n      ],\n      \"semi\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"space-before-blocks\": Array [\n        \"error\",\n      ],\n    },\n    \"settings\": Object {\n      \"import/parsers\": Object {\n        \"@typescript-eslint/parser\": Array [\n          \".ts\",\n          \".tsx\",\n        ],\n      },\n      \"import/resolver\": Object {\n        \"node\": Object {},\n        \"typescript\": Object {\n          \"alwaysTryTypes\": true,\n          \"project\": \"./tsconfig.dev.json\",\n        },\n      },\n    },\n  },\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n*.snap linguist-generated\n/.eslintrc.json linguist-generated\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/upgrade.yml linguist-generated\n/.gitignore linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/tsconfig.dev.json linguist-generated\n/tsconfig.json linguist-generated\n/yarn.lock linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/upgrade.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 12.7.0\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          branch: github-actions/upgrade\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n/test-reports/\njunit.xml\n/coverage/\n!/.github/workflows/upgrade.yml\n!/test/\n!/tsconfig.json\n!/tsconfig.dev.json\n!/src/\n/lib\n/dist/\n!/.eslintrc.json\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projen/\n/test-reports/\njunit.xml\n/coverage/\n/test/\n/tsconfig.dev.json\n/src/\n!/lib/\n!/lib/**/*.js\n!/lib/**/*.d.ts\ndist\n/tsconfig.json\n/.github/\n/.vscode/\n/.idea/\n/.projenrc.js\ntsconfig.tsbuildinfo\n/.eslintrc.json\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"@types/fs-extra\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/jest\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/json-schema\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/node\",\n        \"type\": \"build\",\n        \"version\": \"^12\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/eslint-plugin\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/parser\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-node\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-plugin-import\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint\",\n        \"type\": \"build\",\n        \"version\": \"^8\",\n      },\n      Object {\n        \"name\": \"jest\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jest-junit\",\n        \"type\": \"build\",\n        \"version\": \"^13\",\n      },\n      Object {\n        \"name\": \"json-schema\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"ts-jest\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/node\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"cdk8s\",\n        \"type\": \"runtime\",\n        \"version\": \"^0.0.0\",\n      },\n      Object {\n        \"name\": \"codemaker\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"colors\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"constructs\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"fs-extra\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"jsii-pacmak\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"jsii-srcmak\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"json2jsii\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"sscaff\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"yaml\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"yargs\",\n        \"type\": \"runtime\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".eslintrc.json\",\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/upgrade.yml\",\n      \".gitignore\",\n      \".npmignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n      \"tsconfig.dev.json\",\n      \"tsconfig.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"clobber\": Object {\n        \"condition\": \"git diff --exit-code > /dev/null\",\n        \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n        \"env\": Object {\n          \"BRANCH\": \"$(git branch --show-current)\",\n        },\n        \"name\": \"clobber\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"git checkout -b scratch\",\n            \"name\": \"save current HEAD in \\\\\"scratch\\\\\" branch\",\n          },\n          Object {\n            \"exec\": \"git checkout $BRANCH\",\n          },\n          Object {\n            \"exec\": \"git fetch origin\",\n            \"name\": \"fetch latest changes from origin\",\n          },\n          Object {\n            \"exec\": \"git reset --hard origin/$BRANCH\",\n            \"name\": \"hard reset to origin commit\",\n          },\n          Object {\n            \"exec\": \"git clean -fdx\",\n            \"name\": \"clean all untracked files\",\n          },\n          Object {\n            \"say\": \"ready to rock! (unpushed commits are under the \\\\\"scratch\\\\\" branch)\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"tsc --build\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"eslint\": Object {\n        \"description\": \"Runs eslint against the codebase\",\n        \"name\": \"eslint\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test build-tools .projenrc.js\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mkdir -p dist/js\",\n          },\n          Object {\n            \"exec\": \"mv $(npm pack) dist/js/\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --passWithNoTests --all --updateSnapshot\",\n          },\n          Object {\n            \"spawn\": \"eslint\",\n          },\n          Object {\n            \"exec\": \"yarn compile\",\n          },\n        ],\n      },\n      \"test:update\": Object {\n        \"description\": \"Update jest snapshots\",\n        \"name\": \"test:update\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --updateSnapshot\",\n          },\n        ],\n      },\n      \"test:watch\": Object {\n        \"description\": \"Run jest in watch mode\",\n        \"name\": \"test:watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --watch\",\n          },\n        ],\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"yarn upgrade npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"yarn install --check-files\",\n          },\n          Object {\n            \"exec\": \"yarn upgrade\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n      \"watch\": Object {\n        \"description\": \"Watch & compile in the background\",\n        \"name\": \"watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"tsc --build -w\",\n          },\n        ],\n      },\n    },\n  },\n  \".projenrc.js\": \"const { typescript } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new typescript.TypeScriptLibraryProject({\n  name: 'cdk8s-cli',\n  description: 'CDK for Kubernetes CLI',\n  defaultReleaseBranch: 'master',\n  bin: {\n    cdk8s: 'bin/cdk8s',\n  },\n  deps: [\n    'cdk8s@^0.0.0',\n    'codemaker',\n    \\`constructs\\`,\n    'fs-extra',\n    'jsii-srcmak',\n    'jsii-pacmak',\n    'sscaff',\n    'yaml',\n    'yargs',\n    'json2jsii',\n    'colors',\n\n    // add @types/node as a regular dependency since it's needed to during \\\\\"import\\\\\"\n    // to compile the generated jsii code.\n    '@types/node',\n  ],\n  devDeps: [\n    '@types/fs-extra',\n    '@types/json-schema',\n  ],\n  ...common.options,\n});\n\nproject.eslint.addIgnorePattern('/templates/');\nproject.jest.addIgnorePattern('/templates/');\n\ncommon.fixup(project);\n\nproject.synth();\n\",\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"cdk8s-cli.projenrc.js\": \"const { typescript } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new typescript.TypeScriptLibraryProject({\n  name: 'cdk8s-cli',\n  description: 'CDK for Kubernetes CLI',\n  defaultReleaseBranch: 'master',\n  bin: {\n    cdk8s: 'bin/cdk8s',\n  },\n  deps: [\n    'cdk8s@^0.0.0',\n    'codemaker',\n    \\`constructs\\`,\n    'fs-extra',\n    'jsii-srcmak',\n    'jsii-pacmak',\n    'sscaff',\n    'yaml',\n    'yargs',\n    'json2jsii',\n    'colors',\n\n    // add @types/node as a regular dependency since it's needed to during \\\\\"import\\\\\"\n    // to compile the generated jsii code.\n    '@types/node',\n  ],\n  devDeps: [\n    '@types/fs-extra',\n    '@types/json-schema',\n  ],\n  ...common.options,\n});\n\nproject.eslint.addIgnorePattern('/templates/');\nproject.jest.addIgnorePattern('/templates/');\n\ncommon.fixup(project);\n\nproject.synth();\n\",\n  \"cdk8s.common.js\": \"exports.options = {\n  minNodeVersion: '12.7.0',\n  repository: 'https://github.com/awslabs/cdk8s.git',\n  authorName: 'Amazon Web Services',\n  authorUrl: 'https://aws.amazon.com',\n  authorOrganization: true,\n  buildWorkflow: false,\n  rebuildBot: false,\n  stability: 'experimental',\n  releaseWorkflow: false,\n  dependabot: false,\n  mergify: false,\n  compat: false,\n  dependabot: false,\n  pullRequestTemplate: false,\n  keywords: [\n    \\\\\"cdk\\\\\",\n    \\\\\"kubernetes\\\\\",\n    \\\\\"k8s\\\\\",\n    \\\\\"constructs\\\\\"\n  ]\n};\n\n// some common fixups for projects\nexports.fixup = project => {\n  // override the default \\\\\"build\\\\\" from projen because currently in this\n  // repo it means \\\\\"compile\\\\\"\n  project.setScript('build', 'yarn compile');\n\n  // // add \\\\\"compile\\\\\" after test because the test command deletes lib/ and we run tests *after* build in this repo.\n  project.addTestCommand('yarn compile');\n\n  // jsii-release is declared at the root level, we don't need it here.\n  project.deps.removeDependency('jsii-release');\n\n  delete project.manifest.scripts.bump;\n  delete project.manifest.scripts.release;\n};\n\",\n  \"cdk8s.projenrc.js\": \"const { cdk } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new cdk.JsiiProject({\n  name: 'cdk8s',\n  description: 'Cloud Development Kit for Kubernetes',\n  defaultReleaseBranch: 'master',\n  stability: common.options.stability,\n\n  // without this, the version of 'constructs' would need to be controlled\n  // from this file, since otherwise it would create a 0.0.0 dev dependency.\n  peerDependencyOptions: {\n    pinnedDevDependency: false,\n  },\n\n  ...common.options,\n\n  peerDeps: [\n    'constructs',\n  ],\n  bundledDeps: [\n    'yaml',\n    'json-stable-stringify',\n    'follow-redirects',\n    'fast-json-patch',\n  ],\n  devDeps: [\n    'constructs',\n    '@types/follow-redirects',\n    '@types/json-stable-stringify',\n    '@types/yaml',\n    'json-schema-to-typescript',\n  ],\n\n  // jsii configuration\n  publishToMaven: {\n    javaPackage: 'org.cdk8s',\n    mavenGroupId: 'org.cdk8s',\n    mavenArtifactId: 'cdk8s',\n  },\n  publishToPypi: {\n    distName: 'cdk8s',\n    module: 'cdk8s',\n  },\n  publishToNuget: {\n    dotNetNamespace: 'Org.Cdk8s',\n    packageId: 'Org.Cdk8s',\n  },\n});\n\ncommon.fixup(project);\n\n// _loadurl.js is written in javascript so we need to commit it and also copy it\n// after compilation to the \\`lib/\\` directory.\nproject.gitignore.include('/src/_loadurl.js');\nproject.addCompileCommand('cp src/_loadurl.js lib/');\n\nproject.synth();\n\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"author\": Object {\n      \"name\": \"Amazon Web Services\",\n      \"organization\": true,\n      \"url\": \"https://aws.amazon.com\",\n    },\n    \"bin\": Object {\n      \"cdk8s\": \"bin/cdk8s\",\n    },\n    \"dependencies\": Object {\n      \"@types/node\": \"*\",\n      \"cdk8s\": \"^0.0.0\",\n      \"codemaker\": \"*\",\n      \"colors\": \"*\",\n      \"constructs\": \"*\",\n      \"fs-extra\": \"*\",\n      \"jsii-pacmak\": \"*\",\n      \"jsii-srcmak\": \"*\",\n      \"json2jsii\": \"*\",\n      \"sscaff\": \"*\",\n      \"yaml\": \"*\",\n      \"yargs\": \"*\",\n    },\n    \"description\": \"CDK for Kubernetes CLI\",\n    \"devDependencies\": Object {\n      \"@types/fs-extra\": \"*\",\n      \"@types/jest\": \"*\",\n      \"@types/json-schema\": \"*\",\n      \"@types/node\": \"^12\",\n      \"@typescript-eslint/eslint-plugin\": \"^5\",\n      \"@typescript-eslint/parser\": \"^5\",\n      \"eslint\": \"^8\",\n      \"eslint-import-resolver-node\": \"*\",\n      \"eslint-import-resolver-typescript\": \"*\",\n      \"eslint-plugin-import\": \"*\",\n      \"jest\": \"*\",\n      \"jest-junit\": \"^13\",\n      \"json-schema\": \"*\",\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"ts-jest\": \"*\",\n      \"typescript\": \"*\",\n    },\n    \"engines\": Object {\n      \"node\": \">= 12.7.0\",\n    },\n    \"jest\": Object {\n      \"clearMocks\": true,\n      \"collectCoverage\": true,\n      \"coverageDirectory\": \"coverage\",\n      \"coveragePathIgnorePatterns\": Array [\n        \"/node_modules/\",\n        \"/templates/\",\n      ],\n      \"coverageReporters\": Array [\n        \"json\",\n        \"lcov\",\n        \"clover\",\n        \"cobertura\",\n        \"text\",\n      ],\n      \"globals\": Object {\n        \"ts-jest\": Object {\n          \"tsconfig\": \"tsconfig.dev.json\",\n        },\n      },\n      \"preset\": \"ts-jest\",\n      \"reporters\": Array [\n        \"default\",\n        Array [\n          \"jest-junit\",\n          Object {\n            \"outputDirectory\": \"test-reports\",\n          },\n        ],\n      ],\n      \"testMatch\": Array [\n        \"<rootDir>/src/**/__tests__/**/*.ts?(x)\",\n        \"<rootDir>/(test|src)/**/*(*.)@(spec|test).ts?(x)\",\n      ],\n      \"testPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n        \"/templates/\",\n      ],\n      \"watchPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n    },\n    \"keywords\": Array [\n      \"cdk\",\n      \"constructs\",\n      \"k8s\",\n      \"kubernetes\",\n    ],\n    \"license\": \"Apache-2.0\",\n    \"main\": \"lib/index.js\",\n    \"name\": \"cdk8s-cli\",\n    \"repository\": Object {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/awslabs/cdk8s.git\",\n    },\n    \"scripts\": Object {\n      \"build\": \"yarn compile\",\n      \"clobber\": \"npx projen clobber\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"eject\": \"npx projen eject\",\n      \"eslint\": \"npx projen eslint\",\n      \"package\": \"npx projen package\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"test\": \"npx projen test\",\n      \"test:update\": \"npx projen test:update\",\n      \"test:watch\": \"npx projen test:watch\",\n      \"upgrade\": \"npx projen upgrade\",\n      \"watch\": \"npx projen watch\",\n    },\n    \"types\": \"lib/index.d.ts\",\n    \"version\": \"0.0.0\",\n  },\n  \"src/index.ts\": \"export class Hello {\n  public sayHello() {\n    return 'hello, world!';\n  }\n}\",\n  \"test/hello.test.ts\": \"import { Hello } from '../src';\n\ntest('hello', () => {\n  expect(new Hello().sayHello()).toBe('hello, world!');\n});\",\n  \"tsconfig.dev.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"lib\": Array [\n        \"es2019\",\n      ],\n      \"module\": \"CommonJS\",\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"resolveJsonModule\": true,\n      \"strict\": true,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"ES2019\",\n    },\n    \"exclude\": Array [\n      \"node_modules\",\n    ],\n    \"include\": Array [\n      \".projenrc.js\",\n      \"src/**/*.ts\",\n      \"test/**/*.ts\",\n    ],\n  },\n  \"tsconfig.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"lib\": Array [\n        \"es2019\",\n      ],\n      \"module\": \"CommonJS\",\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"outDir\": \"lib\",\n      \"resolveJsonModule\": true,\n      \"rootDir\": \"src\",\n      \"strict\": true,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"ES2019\",\n    },\n    \"exclude\": Array [],\n    \"include\": Array [\n      \"src/**/*.ts\",\n    ],\n  },\n}\n`;\n\nexports[`pnpm 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n*.snap linguist-generated\n/.gitattributes linguist-generated\n/.github/pull_request_template.md linguist-generated\n/.github/workflows/build.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.github/workflows/upgrade-master.yml linguist-generated\n/.gitignore linguist-generated\n/.mergify.yml linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/pnpm-lock.yaml linguist-generated\",\n  \".github/pull_request_template.md\": \"Fixes #\",\n  \".github/workflows/build.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: build\non:\n  pull_request: {}\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      self_mutation_happened: \\${{ steps.self_mutation.outputs.self_mutation_happened }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v2.2.2\n        with:\n          version: \\\\\"7\\\\\"\n      - name: Install dependencies\n        run: pnpm i --no-frozen-lockfile\n      - name: build\n        run: npx projen build\n      - id: self_mutation\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\n      - if: steps.self_mutation.outputs.self_mutation_happened\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n      - name: Fail build on mutation\n        if: steps.self_mutation.outputs.self_mutation_happened\n        run: |-\n          echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\n          cat .repo.patch\n          exit 1\n  self-mutation:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: always() && needs.build.outputs.self_mutation_happened && !(github.event.pull_request.head.repo.full_name != github.repository)\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Push changes\n        run: |2-\n            git add .\n            git commit -s -m \\\\\"chore: self mutation\\\\\"\n            git push origin HEAD:\\${{ github.event.pull_request.head.ref }}\n\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v2.2.2\n        with:\n          version: \\\\\"7\\\\\"\n      - name: Install dependencies\n        run: pnpm i --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/upgrade-master.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-master\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: master\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v2.2.2\n        with:\n          version: \\\\\"7\\\\\"\n      - name: Install dependencies\n        run: pnpm i --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: master\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-master\\\\\" workflow*\n          branch: github-actions/upgrade-master\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-master\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n/test-reports/\njunit.xml\n/coverage/\n!/.github/workflows/build.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.mergify.yml\n!/.github/workflows/upgrade-master.yml\n!/.github/pull_request_template.md\n\",\n  \".mergify.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projenrc.js\n/.projen/\n/test-reports/\njunit.xml\n/coverage/\n/dist/changelog.md\n/dist/version.txt\n/.mergify.yml\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"aws-sdk\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jest\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"jest-junit\",\n        \"type\": \"build\",\n        \"version\": \"^13\",\n      },\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"standard-version\",\n        \"type\": \"build\",\n        \"version\": \"^9\",\n      },\n      Object {\n        \"name\": \"esbuild\",\n        \"type\": \"runtime\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/pull_request_template.md\",\n      \".github/workflows/build.yml\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".github/workflows/upgrade-master.yml\",\n      \".gitignore\",\n      \".mergify.yml\",\n      \".npmignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"clobber\": Object {\n        \"condition\": \"git diff --exit-code > /dev/null\",\n        \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n        \"env\": Object {\n          \"BRANCH\": \"$(git branch --show-current)\",\n        },\n        \"name\": \"clobber\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"git checkout -b scratch\",\n            \"name\": \"save current HEAD in \\\\\"scratch\\\\\" branch\",\n          },\n          Object {\n            \"exec\": \"git checkout $BRANCH\",\n          },\n          Object {\n            \"exec\": \"git fetch origin\",\n            \"name\": \"fetch latest changes from origin\",\n          },\n          Object {\n            \"exec\": \"git reset --hard origin/$BRANCH\",\n            \"name\": \"hard reset to origin commit\",\n          },\n          Object {\n            \"exec\": \"git clean -fdx\",\n            \"name\": \"clean all untracked files\",\n          },\n          Object {\n            \"say\": \"ready to rock! (unpushed commits are under the \\\\\"scratch\\\\\" branch)\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mkdir -p dist/js\",\n          },\n          Object {\n            \"exec\": \"mv $(npm pack) dist/js/\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"master\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --passWithNoTests --all --updateSnapshot\",\n          },\n        ],\n      },\n      \"test:update\": Object {\n        \"description\": \"Update jest snapshots\",\n        \"name\": \"test:update\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --updateSnapshot\",\n          },\n        ],\n      },\n      \"test:watch\": Object {\n        \"description\": \"Run jest in watch mode\",\n        \"name\": \"test:watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"jest --watch\",\n          },\n        ],\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pnpm update npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"pnpm i --no-frozen-lockfile\",\n          },\n          Object {\n            \"exec\": \"pnpm update\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n    },\n  },\n  \".projenrc.js\": \"const { javascript } = require(\\\\\"projen\\\\\");\n\nconst project = new javascript.NodeProject({\n  name: \\\\\"pnpm-project\\\\\",\n\n  packageManager: javascript.NodePackageManager.PNPM,\n  defaultReleaseBranch: 'master',\n\n  deps: [\\\\\"esbuild\\\\\"],\n\n  devDeps: [\\\\\"aws-sdk\\\\\"],\n});\n\nproject.synth();\n\",\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Object {\n      \"esbuild\": \"*\",\n    },\n    \"devDependencies\": Object {\n      \"aws-sdk\": \"*\",\n      \"jest\": \"*\",\n      \"jest-junit\": \"^13\",\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"standard-version\": \"^9\",\n    },\n    \"jest\": Object {\n      \"clearMocks\": true,\n      \"collectCoverage\": true,\n      \"coverageDirectory\": \"coverage\",\n      \"coveragePathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n      \"coverageReporters\": Array [\n        \"json\",\n        \"lcov\",\n        \"clover\",\n        \"cobertura\",\n        \"text\",\n      ],\n      \"reporters\": Array [\n        \"default\",\n        Array [\n          \"jest-junit\",\n          Object {\n            \"outputDirectory\": \"test-reports\",\n          },\n        ],\n      ],\n      \"testMatch\": Array [\n        \"**/__tests__/**/*.[jt]s?(x)\",\n        \"**/?(*.)+(spec|test).[tj]s?(x)\",\n      ],\n      \"testPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n      \"watchPathIgnorePatterns\": Array [\n        \"/node_modules/\",\n      ],\n    },\n    \"license\": \"Apache-2.0\",\n    \"main\": \"lib/index.js\",\n    \"name\": \"pnpm-project\",\n    \"scripts\": Object {\n      \"build\": \"npx projen build\",\n      \"bump\": \"npx projen bump\",\n      \"clobber\": \"npx projen clobber\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"eject\": \"npx projen eject\",\n      \"package\": \"npx projen package\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"release\": \"npx projen release\",\n      \"test\": \"npx projen test\",\n      \"test:update\": \"npx projen test:update\",\n      \"test:watch\": \"npx projen test:watch\",\n      \"unbump\": \"npx projen unbump\",\n      \"upgrade\": \"npx projen upgrade\",\n    },\n    \"version\": \"0.0.0\",\n  },\n}\n`;\n"
  },
  {
    "path": "test/__snapshots__/inventory.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`inventory 1`] = `\nArray [\n  Object {\n    \"docs\": \"AWS CDK app in Java.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-awscdk-awscdkjavaapp\",\n    \"fqn\": \"projen.awscdk.AwsCdkJavaApp\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"\\\\\"my-app\\\\\"\",\n        \"docs\": \"The artifactId is generally the name that the project is known by.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactId\",\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"artifactId\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifact-id\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"default\": \"- no build command\",\n        \"docs\": \"A command to execute before synthesis.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildCommand\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"buildCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"build-command\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.0.0 < 2.0.0\",\n        \"deprecated\": true,\n        \"docs\": \"Warning: NodeJS only.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssert\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssert\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assert\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.111.0 < 2.0.0\",\n        \"docs\": \"Install the assertions library?\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssertions\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssertions\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assertions\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Which AWS CDKv1 modules this project requires.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-dependencies\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"If this is enabled (default), all modules declared in \\`cdkDependencies\\` will be also added as normal \\`dependencies\\` (as well as \\`peerDependencies\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependenciesAsDeps\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependenciesAsDeps\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-dependencies-as-deps\",\n      },\n      Object {\n        \"default\": \"\\\\\"cdk.out\\\\\"\",\n        \"docs\": \"cdk.out directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkout\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"cdkout\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdkout\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"AWS CDK modules required for testing.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkTestDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkTestDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-test-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.1.0\\\\\"\",\n        \"docs\": \"Minimum version of the AWS CDK to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersion\",\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk-version\",\n      },\n      Object {\n        \"docs\": \"Use pinned version instead of caret version for CDK.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-version-pinning\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"Compile options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.MavenCompileOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.MavenCompileOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"compileOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"compileOptions\",\n        ],\n        \"simpleType\": \"MavenCompileOptions\",\n        \"switch\": \"compile-options\",\n      },\n      Object {\n        \"default\": \"- for CDK 1.x the default is \\\\\"3.2.27\\\\\", for CDK 2.x the default is\n\\\\\"10.0.5\\\\\".\",\n        \"docs\": \"Minimum version of the \\`constructs\\` library to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"- no additional context\",\n        \"docs\": \"Additional context to include in \\`cdk.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"context\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"context\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"context\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of runtime dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"docs\": \"Description of a project is always good.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist/java\\\\\"\",\n        \"docs\": \"Final artifact output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"distdir\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"distdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"distdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include all feature flags in cdk.json.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"featureFlags\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"featureFlags\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"feature-flags\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"default\": \"\\\\\"org.acme\\\\\"\",\n        \"docs\": \"This is generally unique amongst an organization or a project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"groupId\",\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"groupId\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"group-id\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include junit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"junit\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"junit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"junit\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"junit options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.JunitOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.JunitOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"junitOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"junitOptions\",\n        ],\n        \"simpleType\": \"JunitOptions\",\n        \"switch\": \"junit-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"\\\\\"org.acme.MyApp\\\\\"\",\n        \"docs\": \"The name of the Java class with the static \\`main()\\` method.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mainClass\",\n        \"parent\": \"AwsCdkJavaAppOptions\",\n        \"path\": Array [\n          \"mainClass\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"main-class\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"jar\\\\\"\",\n        \"docs\": \"Project packaging format.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packaging\",\n        \"optional\": true,\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"packaging\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"packaging\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"Packaging options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.MavenPackagingOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.MavenPackagingOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"packagingOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"packagingOptions\",\n        ],\n        \"simpleType\": \"MavenPackagingOptions\",\n        \"switch\": \"packaging-options\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use projenrc in java.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJava\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"projenrcJava\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-java\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in java.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJavaOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"projenrcJavaOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-java-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"default\": \"ApprovalLevel.BROADENING\",\n        \"docs\": \"To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.\",\n        \"featured\": false,\n        \"fqn\": \"projen.awscdk.ApprovalLevel\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.awscdk.ApprovalLevel\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"requireApproval\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"requireApproval\",\n        ],\n        \"simpleType\": \"ApprovalLevel\",\n        \"switch\": \"require-approval\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include sample code and test if the relevant directories don't exist.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sample\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectOptions\",\n        \"path\": Array [\n          \"sample\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample\",\n      },\n      Object {\n        \"default\": \"\\\\\"org.acme\\\\\"\",\n        \"docs\": \"The java package to use for the code sample.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleJavaPackage\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectOptions\",\n        \"path\": Array [\n          \"sampleJavaPackage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"sample-java-package\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of test dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"testDeps\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"testDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"test-deps\",\n      },\n      Object {\n        \"docs\": \"The URL, like the name, is not required.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"url\",\n        \"optional\": true,\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"url\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"url\",\n      },\n      Object {\n        \"default\": \"\\\\\"0.1.0\\\\\"\",\n        \"docs\": \"This is the last piece of the naming puzzle.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"version\",\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"version\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Glob patterns to exclude from \\`cdk watch\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"watchExcludes\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"watchExcludes\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"watch-excludes\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Glob patterns to include in \\`cdk watch\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"watchIncludes\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"watchIncludes\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"watch-includes\",\n      },\n    ],\n    \"pjid\": \"awscdk-app-java\",\n    \"typename\": \"awscdk.AwsCdkJavaApp\",\n  },\n  Object {\n    \"docs\": \"AWS CDK app in Python.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-awscdk-awscdkpythonapp\",\n    \"fqn\": \"projen.awscdk.AwsCdkPythonApp\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"\\\\\"app.py\\\\\"\",\n        \"docs\": \"The CDK app's entrypoint (relative to the source directory, which is \\\\\"src\\\\\" by default).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"appEntrypoint\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkPythonAppOptions\",\n        \"path\": Array [\n          \"appEntrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"app-entrypoint\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_EMAIL\",\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_NAME\",\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"default\": \"- no build command\",\n        \"docs\": \"A command to execute before synthesis.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildCommand\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"buildCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"build-command\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.0.0 < 2.0.0\",\n        \"deprecated\": true,\n        \"docs\": \"Warning: NodeJS only.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssert\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssert\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assert\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.111.0 < 2.0.0\",\n        \"docs\": \"Install the assertions library?\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssertions\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssertions\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assertions\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Which AWS CDKv1 modules this project requires.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-dependencies\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"If this is enabled (default), all modules declared in \\`cdkDependencies\\` will be also added as normal \\`dependencies\\` (as well as \\`peerDependencies\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependenciesAsDeps\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependenciesAsDeps\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-dependencies-as-deps\",\n      },\n      Object {\n        \"default\": \"\\\\\"cdk.out\\\\\"\",\n        \"docs\": \"cdk.out directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkout\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"cdkout\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdkout\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"AWS CDK modules required for testing.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkTestDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkTestDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-test-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.1.0\\\\\"\",\n        \"docs\": \"Minimum version of the AWS CDK to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersion\",\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk-version\",\n      },\n      Object {\n        \"docs\": \"Use pinned version instead of caret version for CDK.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-version-pinning\",\n      },\n      Object {\n        \"docs\": \"A list of PyPI trove classifiers that describe the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"classifiers\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"classifiers\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"classifiers\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- for CDK 1.x the default is \\\\\"3.2.27\\\\\", for CDK 2.x the default is\n\\\\\"10.0.5\\\\\".\",\n        \"docs\": \"Minimum version of the \\`constructs\\` library to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"- no additional context\",\n        \"docs\": \"Additional context to include in \\`cdk.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"context\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"context\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"context\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of runtime dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"docs\": \"A short description of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of dev dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include all feature flags in cdk.json.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"featureFlags\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"featureFlags\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"feature-flags\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"A URL to the website of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"docs\": \"License of this package as an SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"$PYTHON_MODULE_NAME\",\n        \"docs\": \"Name of the python package as used in imports and filenames.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"moduleName\",\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"moduleName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"module-name\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"docs\": \"Package name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use pip with a requirements.txt file to track project dependencies.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pip\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pip\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pip\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"poetry\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"poetry\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"poetry\",\n      },\n      Object {\n        \"docs\": \"Additional options to set for poetry if using poetry.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.PoetryPyprojectOptionsWithoutDeps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.PoetryPyprojectOptionsWithoutDeps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"poetryOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"poetryOptions\",\n        ],\n        \"simpleType\": \"PoetryPyprojectOptionsWithoutDeps\",\n        \"switch\": \"poetry-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use projenrc in javascript.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in JavaScript.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use projenrc in Python.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcPython\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcPython\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-python\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in python.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcPythonOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcPythonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-python-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include pytest tests.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pytest\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pytest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pytest\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"pytest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.PytestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.PytestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"pytestOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pytestOptions\",\n        ],\n        \"simpleType\": \"PytestOptions\",\n        \"switch\": \"pytest-options\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"default\": \"ApprovalLevel.BROADENING\",\n        \"docs\": \"To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.\",\n        \"featured\": false,\n        \"fqn\": \"projen.awscdk.ApprovalLevel\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.awscdk.ApprovalLevel\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"requireApproval\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"requireApproval\",\n        ],\n        \"simpleType\": \"ApprovalLevel\",\n        \"switch\": \"require-approval\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include sample code and test if the relevant directories don't exist.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sample\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"sample\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample\",\n      },\n      Object {\n        \"docs\": \"Additional fields to pass in the setup() function if using setuptools.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"setupConfig\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"setupConfig\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"setup-config\",\n      },\n      Object {\n        \"default\": \"- true if the project type is library\",\n        \"docs\": \"Use setuptools with a setup.py script for packaging and publishing.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"setuptools\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"setuptools\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"setuptools\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"tests\\\\\"\",\n        \"docs\": \"Python sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkPythonAppOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use venv to manage a virtual environment for installing dependencies inside.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"venv\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"venv\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"venv\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"Venv options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.VenvOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.VenvOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"venvOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"venvOptions\",\n        ],\n        \"simpleType\": \"VenvOptions\",\n        \"switch\": \"venv-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"0.1.0\\\\\"\",\n        \"docs\": \"Version of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"version\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"version\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Glob patterns to exclude from \\`cdk watch\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"watchExcludes\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"watchExcludes\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"watch-excludes\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Glob patterns to include in \\`cdk watch\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"watchIncludes\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"watchIncludes\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"watch-includes\",\n      },\n    ],\n    \"pjid\": \"awscdk-app-py\",\n    \"typename\": \"awscdk.AwsCdkPythonApp\",\n  },\n  Object {\n    \"docs\": \"AWS CDK app in TypeScript.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-awscdk-awscdktypescriptapp\",\n    \"fqn\": \"projen.awscdk.AwsCdkTypeScriptApp\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"main.ts\\\\\"\",\n        \"docs\": \"The CDK app's entrypoint (relative to the source directory, which is \\\\\"src\\\\\" by default).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"appEntrypoint\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkTypeScriptAppOptions\",\n        \"path\": Array [\n          \"appEntrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"app-entrypoint\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- no build command\",\n        \"docs\": \"A command to execute before synthesis.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildCommand\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"buildCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"build-command\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.0.0 < 2.0.0\",\n        \"deprecated\": true,\n        \"docs\": \"Warning: NodeJS only.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssert\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssert\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assert\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.111.0 < 2.0.0\",\n        \"docs\": \"Install the assertions library?\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssertions\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssertions\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assertions\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Which AWS CDKv1 modules this project requires.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-dependencies\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"If this is enabled (default), all modules declared in \\`cdkDependencies\\` will be also added as normal \\`dependencies\\` (as well as \\`peerDependencies\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependenciesAsDeps\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependenciesAsDeps\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-dependencies-as-deps\",\n      },\n      Object {\n        \"default\": \"\\\\\"cdk.out\\\\\"\",\n        \"docs\": \"cdk.out directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkout\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"cdkout\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdkout\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"AWS CDK modules required for testing.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkTestDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkTestDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-test-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.1.0\\\\\"\",\n        \"docs\": \"Minimum version of the AWS CDK to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersion\",\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk-version\",\n      },\n      Object {\n        \"docs\": \"Use pinned version instead of caret version for CDK.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-version-pinning\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- for CDK 1.x the default is \\\\\"3.2.27\\\\\", for CDK 2.x the default is\n\\\\\"10.0.5\\\\\".\",\n        \"docs\": \"Minimum version of the \\`constructs\\` library to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"- no additional context\",\n        \"docs\": \"Additional context to include in \\`cdk.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"context\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"context\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"context\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`cloudfront.experimental.EdgeFunction\\` for each \\`.edge-lambda.ts\\` handler in your source tree. If this is disabled, you can manually add an \\`awscdk.AutoDiscover\\` component to your project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"edgeLambdaAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkTypeScriptAppOptions\",\n        \"path\": Array [\n          \"edgeLambdaAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"edge-lambda-auto-discover\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include all feature flags in cdk.json.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"featureFlags\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"featureFlags\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"feature-flags\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically discovers and creates integration tests for each \\`.integ.ts\\` file in under your test directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"integrationTestAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkTypeScriptAppOptions\",\n        \"path\": Array [\n          \"integrationTestAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"integration-test-auto-discover\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`awscdk.LambdaFunction\\` for each \\`.lambda.ts\\` handler in your source tree. If this is disabled, you can manually add an \\`awscdk.AutoDiscover\\` component to your project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"lambdaAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkTypeScriptAppOptions\",\n        \"path\": Array [\n          \"lambdaAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"lambda-auto-discover\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`awscdk.LambdaExtension\\` for each \\`.lambda-extension.ts\\` entrypoint in your source tree. If this is disabled, you can manually add an \\`awscdk.AutoDiscover\\` component to your project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"lambdaExtensionAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkTypeScriptAppOptions\",\n        \"path\": Array [\n          \"lambdaExtensionAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"lambda-extension-auto-discover\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Common options for all AWS Lambda functions.\",\n        \"featured\": false,\n        \"fqn\": \"projen.awscdk.LambdaFunctionCommonOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.awscdk.LambdaFunctionCommonOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"lambdaOptions\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkTypeScriptAppOptions\",\n        \"path\": Array [\n          \"lambdaOptions\",\n        ],\n        \"simpleType\": \"LambdaFunctionCommonOptions\",\n        \"switch\": \"lambda-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"ApprovalLevel.BROADENING\",\n        \"docs\": \"To protect you against unintended changes that affect your security posture, the AWS CDK Toolkit prompts you to approve security-related changes before deploying them.\",\n        \"featured\": false,\n        \"fqn\": \"projen.awscdk.ApprovalLevel\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.awscdk.ApprovalLevel\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"requireApproval\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"requireApproval\",\n        ],\n        \"simpleType\": \"ApprovalLevel\",\n        \"switch\": \"require-approval\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Glob patterns to exclude from \\`cdk watch\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"watchExcludes\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"watchExcludes\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"watch-excludes\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Glob patterns to include in \\`cdk watch\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"watchIncludes\",\n        \"optional\": true,\n        \"parent\": \"CdkConfigCommonOptions\",\n        \"path\": Array [\n          \"watchIncludes\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"watch-includes\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"awscdk-app-ts\",\n    \"typename\": \"awscdk.AwsCdkTypeScriptApp\",\n  },\n  Object {\n    \"docs\": \"AWS CDK construct library project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-awscdk-awscdkconstructlibrary\",\n    \"fqn\": \"projen.awscdk.AwsCdkConstructLibrary\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_NAME\",\n        \"docs\": \"The name of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"author\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"author\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_EMAIL\",\n        \"docs\": \"Email or URL of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorAddress\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"authorAddress\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-address\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"- new version will be announced\",\n        \"docs\": \"Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.Catalog\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.Catalog\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"catalog\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryOptions\",\n        \"path\": Array [\n          \"catalog\",\n        ],\n        \"simpleType\": \"Catalog\",\n        \"switch\": \"catalog\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.0.0 < 2.0.0\",\n        \"deprecated\": true,\n        \"docs\": \"Warning: NodeJS only.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssert\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssert\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assert\",\n      },\n      Object {\n        \"default\": \"- will be included by default for AWS CDK >= 1.111.0 < 2.0.0\",\n        \"docs\": \"Install the assertions library?\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkAssertions\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkAssertions\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-assertions\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Which AWS CDKv1 modules this project requires.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-dependencies\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"If this is enabled (default), all modules declared in \\`cdkDependencies\\` will be also added as normal \\`dependencies\\` (as well as \\`peerDependencies\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkDependenciesAsDeps\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkDependenciesAsDeps\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-dependencies-as-deps\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"AWS CDK modules required for testing.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkTestDependencies\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkTestDependencies\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk-test-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.1.0\\\\\"\",\n        \"docs\": \"Minimum version of the AWS CDK to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersion\",\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk-version\",\n      },\n      Object {\n        \"docs\": \"Use pinned version instead of caret version for CDK.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdkVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"cdkVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk-version-pinning\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically run API compatibility test against the latest version published to npm after compilation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compat\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compat\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compat\",\n      },\n      Object {\n        \"default\": \"\\\\\".compatignore\\\\\"\",\n        \"docs\": \"Name of the ignore file for API compatibility tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compatIgnore\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compatIgnore\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"compat-ignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Emit a compressed version of the assembly.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compressAssembly\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compressAssembly\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compress-assembly\",\n      },\n      Object {\n        \"default\": \"- for CDK 1.x the default is \\\\\"3.2.27\\\\\", for CDK 2.x the default is\n\\\\\"10.0.5\\\\\".\",\n        \"docs\": \"Minimum version of the \\`constructs\\` library to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"API.md\\\\\"\",\n        \"docs\": \"File path for generated docs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgenFilePath\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"docgenFilePath\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docgen-file-path\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dotnet\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"dotnet\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"dotnet\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`cloudfront.experimental.EdgeFunction\\` for each \\`.edge-lambda.ts\\` handler in your source tree. If this is disabled, you can manually add an \\`awscdk.AutoDiscover\\` component to your project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"edgeLambdaAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkConstructLibraryOptions\",\n        \"path\": Array [\n          \"edgeLambdaAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"edge-lambda-auto-discover\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"docs\": \"Accepts a list of glob patterns.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"excludeTypescript\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"excludeTypescript\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"exclude-typescript\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically discovers and creates integration tests for each \\`.integ.ts\\` file in under your test directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"integrationTestAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkConstructLibraryOptions\",\n        \"path\": Array [\n          \"integrationTestAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"integration-test-auto-discover\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`aws_lambda.Function\\` for each \\`.lambda.ts\\` handler in your source tree. If this is disabled, you either need to explicitly call \\`aws_lambda.Function.autoDiscover()\\` or define a \\`new aws_lambda.Function()\\` for each handler.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"lambdaAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkConstructLibraryOptions\",\n        \"path\": Array [\n          \"lambdaAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"lambda-auto-discover\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`awscdk.LambdaExtension\\` for each \\`.lambda-extension.ts\\` entrypoint in your source tree. If this is disabled, you can manually add an \\`awscdk.AutoDiscover\\` component to your project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"lambdaExtensionAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkConstructLibraryOptions\",\n        \"path\": Array [\n          \"lambdaExtensionAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"lambda-extension-auto-discover\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Common options for all AWS Lambda functions.\",\n        \"featured\": false,\n        \"fqn\": \"projen.awscdk.LambdaFunctionCommonOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.awscdk.LambdaFunctionCommonOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"lambdaOptions\",\n        \"optional\": true,\n        \"parent\": \"AwsCdkConstructLibraryOptions\",\n        \"path\": Array [\n          \"lambdaOptions\",\n        ],\n        \"simpleType\": \"LambdaFunctionCommonOptions\",\n        \"switch\": \"lambda-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish Go bindings to a git repository.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToGo\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToGo\",\n        ],\n        \"simpleType\": \"JsiiGoTarget\",\n        \"switch\": \"publish-to-go\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to maven.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToMaven\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToMaven\",\n        ],\n        \"simpleType\": \"JsiiJavaTarget\",\n        \"switch\": \"publish-to-maven\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to NuGet.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToNuget\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToNuget\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"publish-to-nuget\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to pypi.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToPypi\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToPypi\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"publish-to-pypi\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"python\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"python\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"python\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_REMOTE\",\n        \"docs\": \"Git repository URL.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryUrl\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"repositoryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-url\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"rootdir\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"rootdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"rootdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"awscdk-construct\",\n    \"typename\": \"awscdk.AwsCdkConstructLibrary\",\n  },\n  Object {\n    \"docs\": \"CDK8s app in Python.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-cdk8s-cdk8spythonapp\",\n    \"fqn\": \"projen.cdk8s.Cdk8sPythonApp\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"\\\\\"app.py\\\\\"\",\n        \"docs\": \"The CDK8s app's entrypoint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"appEntrypoint\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sPythonOptions\",\n        \"path\": Array [\n          \"appEntrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"app-entrypoint\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_EMAIL\",\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_NAME\",\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.0.28\\\\\"\",\n        \"docs\": \"Minumum version of the cdk8s-cli to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sCliVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sCliVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk8s-cli-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for cdk8s-cli.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sCliVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sCliVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-cli-version-pinning\",\n      },\n      Object {\n        \"default\": \"- no additional specs imported\",\n        \"docs\": \"Import additional specs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sImports\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sPythonOptions\",\n        \"path\": Array [\n          \"cdk8sImports\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk8s-imports\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include cdk8s-plus.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sPlus\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sPlus\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-plus\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.0.0-rc.26\\\\\"\",\n        \"docs\": \"Minumum version of the cdk8s-plus-XX to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sPlusVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sPlusVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk8s-plus-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for cdk8s-plus-17.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sPlusVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sPlusVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-plus-version-pinning\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.3.33\\\\\"\",\n        \"docs\": \"Minumum version of the cdk8s to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sVersion\",\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk8s-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for cdk8s.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-version-pinning\",\n      },\n      Object {\n        \"docs\": \"A list of PyPI trove classifiers that describe the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"classifiers\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"classifiers\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"classifiers\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"\\\\\"10.1.42\\\\\"\",\n        \"docs\": \"Minimum version of the \\`constructs\\` library to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for constructs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"constructs-version-pinning\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of runtime dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"docs\": \"A short description of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of dev dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"A URL to the website of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"22\",\n        \"docs\": \"The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"k8sMinorVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"k8sMinorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"k8s-minor-version\",\n      },\n      Object {\n        \"default\": \"- Use the cdk8s default\",\n        \"docs\": \"Import a specific Kubernetes spec version.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"k8sSpecVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sPythonOptions\",\n        \"path\": Array [\n          \"k8sSpecVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"k8s-spec-version\",\n      },\n      Object {\n        \"docs\": \"License of this package as an SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"$PYTHON_MODULE_NAME\",\n        \"docs\": \"Name of the python package as used in imports and filenames.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"moduleName\",\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"moduleName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"module-name\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"docs\": \"Package name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use pip with a requirements.txt file to track project dependencies.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pip\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pip\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pip\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"poetry\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"poetry\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"poetry\",\n      },\n      Object {\n        \"docs\": \"Additional options to set for poetry if using poetry.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.PoetryPyprojectOptionsWithoutDeps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.PoetryPyprojectOptionsWithoutDeps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"poetryOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"poetryOptions\",\n        ],\n        \"simpleType\": \"PoetryPyprojectOptionsWithoutDeps\",\n        \"switch\": \"poetry-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use projenrc in javascript.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in JavaScript.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use projenrc in Python.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcPython\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcPython\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-python\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in python.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcPythonOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcPythonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-python-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include pytest tests.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pytest\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pytest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pytest\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"pytest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.PytestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.PytestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"pytestOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pytestOptions\",\n        ],\n        \"simpleType\": \"PytestOptions\",\n        \"switch\": \"pytest-options\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include sample code and test if the relevant directories don't exist.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sample\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"sample\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample\",\n      },\n      Object {\n        \"docs\": \"Additional fields to pass in the setup() function if using setuptools.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"setupConfig\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"setupConfig\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"setup-config\",\n      },\n      Object {\n        \"default\": \"- true if the project type is library\",\n        \"docs\": \"Use setuptools with a setup.py script for packaging and publishing.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"setuptools\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"setuptools\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"setuptools\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use venv to manage a virtual environment for installing dependencies inside.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"venv\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"venv\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"venv\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"Venv options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.VenvOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.VenvOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"venvOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"venvOptions\",\n        ],\n        \"simpleType\": \"VenvOptions\",\n        \"switch\": \"venv-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"0.1.0\\\\\"\",\n        \"docs\": \"Version of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"version\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"version\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n    ],\n    \"pjid\": \"cdk8s-app-py\",\n    \"typename\": \"cdk8s.Cdk8sPythonApp\",\n  },\n  Object {\n    \"docs\": \"CDK8s app in TypeScript.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-cdk8s-cdk8stypescriptapp\",\n    \"fqn\": \"projen.cdk8s.Cdk8sTypeScriptApp\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"main.ts\\\\\"\",\n        \"docs\": \"The CDK8s app's entrypoint (relative to the source directory, which is \\\\\"src\\\\\" by default).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"appEntrypoint\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sTypeScriptAppOptions\",\n        \"path\": Array [\n          \"appEntrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"app-entrypoint\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.0.28\\\\\"\",\n        \"docs\": \"Minumum version of the cdk8s-cli to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sCliVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sCliVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk8s-cli-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for cdk8s-cli.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sCliVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sCliVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-cli-version-pinning\",\n      },\n      Object {\n        \"default\": \"- no additional specs imported\",\n        \"docs\": \"Import additional specs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sImports\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sTypeScriptAppOptions\",\n        \"path\": Array [\n          \"cdk8sImports\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"cdk8s-imports\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include cdk8s-plus.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sPlus\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sPlus\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-plus\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.0.0-rc.26\\\\\"\",\n        \"docs\": \"Minumum version of the cdk8s-plus-XX to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sPlusVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sPlusVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk8s-plus-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for cdk8s-plus-17.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sPlusVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sPlusVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-plus-version-pinning\",\n      },\n      Object {\n        \"default\": \"\\\\\"2.3.33\\\\\"\",\n        \"docs\": \"Minumum version of the cdk8s to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sVersion\",\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk8s-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for cdk8s.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"cdk8sVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-version-pinning\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"\\\\\"10.1.42\\\\\"\",\n        \"docs\": \"Minimum version of the \\`constructs\\` library to depend on.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for constructs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"constructsVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"constructs-version-pinning\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`cdk8s.IntegrationTest\\` for each \\`.integ.ts\\` app in your test directory. If this is disabled, you can manually add an \\`cdk8s.AutoDiscover\\` component to your project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"integrationTestAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sTypeScriptAppOptions\",\n        \"path\": Array [\n          \"integrationTestAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"integration-test-auto-discover\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"default\": \"22\",\n        \"docs\": \"The cdk8s-plus library depends of Kubernetes minor version For example, cdk8s-plus-22 targets kubernetes version 1.22.0 cdk8s-plus-21 targets kubernetes version 1.21.0.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"k8sMinorVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sDepsCommonOptions\",\n        \"path\": Array [\n          \"k8sMinorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"k8s-minor-version\",\n      },\n      Object {\n        \"default\": \"- Use the cdk8s default\",\n        \"docs\": \"Import a specific Kubernetes spec version.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"k8sSpecVersion\",\n        \"optional\": true,\n        \"parent\": \"Cdk8sTypeScriptAppOptions\",\n        \"path\": Array [\n          \"k8sSpecVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"k8s-spec-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"cdk8s-app-ts\",\n    \"typename\": \"cdk8s.Cdk8sTypeScriptApp\",\n  },\n  Object {\n    \"docs\": \"CDK8s construct library project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-cdk8s-constructlibrarycdk8s\",\n    \"fqn\": \"projen.cdk8s.ConstructLibraryCdk8s\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_NAME\",\n        \"docs\": \"The name of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"author\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"author\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_EMAIL\",\n        \"docs\": \"Email or URL of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorAddress\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"authorAddress\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-address\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"- new version will be announced\",\n        \"docs\": \"Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.Catalog\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.Catalog\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"catalog\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryOptions\",\n        \"path\": Array [\n          \"catalog\",\n        ],\n        \"simpleType\": \"Catalog\",\n        \"switch\": \"catalog\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for cdk8s-plus-17.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sPlusVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryCdk8sOptions\",\n        \"path\": Array [\n          \"cdk8sPlusVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-plus-version-pinning\",\n      },\n      Object {\n        \"default\": \"\\\\\"1.4.10\\\\\"\",\n        \"docs\": \"Minimum target version this library is tested against.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sVersion\",\n        \"parent\": \"ConstructLibraryCdk8sOptions\",\n        \"path\": Array [\n          \"cdk8sVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdk8s-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for CDK8s.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdk8sVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryCdk8sOptions\",\n        \"path\": Array [\n          \"cdk8sVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"cdk8s-version-pinning\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically run API compatibility test against the latest version published to npm after compilation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compat\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compat\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compat\",\n      },\n      Object {\n        \"default\": \"\\\\\".compatignore\\\\\"\",\n        \"docs\": \"Name of the ignore file for API compatibility tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compatIgnore\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compatIgnore\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"compat-ignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Emit a compressed version of the assembly.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compressAssembly\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compressAssembly\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compress-assembly\",\n      },\n      Object {\n        \"default\": \"\\\\\"3.3.196\\\\\"\",\n        \"docs\": \"constructs verion.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryCdk8sOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use pinned version instead of caret version for constructs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersionPinning\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryCdk8sOptions\",\n        \"path\": Array [\n          \"constructsVersionPinning\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"constructs-version-pinning\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"API.md\\\\\"\",\n        \"docs\": \"File path for generated docs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgenFilePath\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"docgenFilePath\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docgen-file-path\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dotnet\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"dotnet\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"dotnet\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"docs\": \"Accepts a list of glob patterns.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"excludeTypescript\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"excludeTypescript\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"exclude-typescript\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically adds an \\`cdk8s.IntegrationTest\\` for each \\`.integ.ts\\` app in your test directory. If this is disabled, you can manually add an \\`cdk8s.AutoDiscover\\` component to your project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"integrationTestAutoDiscover\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryCdk8sOptions\",\n        \"path\": Array [\n          \"integrationTestAutoDiscover\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"integration-test-auto-discover\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish Go bindings to a git repository.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToGo\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToGo\",\n        ],\n        \"simpleType\": \"JsiiGoTarget\",\n        \"switch\": \"publish-to-go\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to maven.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToMaven\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToMaven\",\n        ],\n        \"simpleType\": \"JsiiJavaTarget\",\n        \"switch\": \"publish-to-maven\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to NuGet.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToNuget\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToNuget\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"publish-to-nuget\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to pypi.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToPypi\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToPypi\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"publish-to-pypi\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"python\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"python\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"python\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_REMOTE\",\n        \"docs\": \"Git repository URL.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryUrl\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"repositoryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-url\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"rootdir\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"rootdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"rootdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"cdk8s-construct\",\n    \"typename\": \"cdk8s.ConstructLibraryCdk8s\",\n  },\n  Object {\n    \"docs\": \"CDKTF construct library project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-cdktf-constructlibrarycdktf\",\n    \"fqn\": \"projen.cdktf.ConstructLibraryCdktf\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_NAME\",\n        \"docs\": \"The name of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"author\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"author\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_EMAIL\",\n        \"docs\": \"Email or URL of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorAddress\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"authorAddress\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-address\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"- new version will be announced\",\n        \"docs\": \"Libraries will be picked up by the construct catalog when they are published to npm as jsii modules and will be published under:.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.Catalog\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.Catalog\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"catalog\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryOptions\",\n        \"path\": Array [\n          \"catalog\",\n        ],\n        \"simpleType\": \"Catalog\",\n        \"switch\": \"catalog\",\n      },\n      Object {\n        \"default\": \"\\\\\"^0.8.3\\\\\"\",\n        \"docs\": \"Minimum target version this library is tested against.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"cdktfVersion\",\n        \"parent\": \"ConstructLibraryCdktfOptions\",\n        \"path\": Array [\n          \"cdktfVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"cdktf-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically run API compatibility test against the latest version published to npm after compilation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compat\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compat\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compat\",\n      },\n      Object {\n        \"default\": \"\\\\\".compatignore\\\\\"\",\n        \"docs\": \"Name of the ignore file for API compatibility tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compatIgnore\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compatIgnore\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"compat-ignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Emit a compressed version of the assembly.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compressAssembly\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compressAssembly\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compress-assembly\",\n      },\n      Object {\n        \"default\": \"\\\\\"^10.0.12\\\\\"\",\n        \"docs\": \"Construct version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"constructsVersion\",\n        \"optional\": true,\n        \"parent\": \"ConstructLibraryCdktfOptions\",\n        \"path\": Array [\n          \"constructsVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"constructs-version\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"API.md\\\\\"\",\n        \"docs\": \"File path for generated docs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgenFilePath\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"docgenFilePath\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docgen-file-path\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dotnet\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"dotnet\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"dotnet\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"docs\": \"Accepts a list of glob patterns.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"excludeTypescript\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"excludeTypescript\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"exclude-typescript\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish Go bindings to a git repository.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToGo\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToGo\",\n        ],\n        \"simpleType\": \"JsiiGoTarget\",\n        \"switch\": \"publish-to-go\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to maven.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToMaven\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToMaven\",\n        ],\n        \"simpleType\": \"JsiiJavaTarget\",\n        \"switch\": \"publish-to-maven\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to NuGet.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToNuget\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToNuget\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"publish-to-nuget\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to pypi.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToPypi\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToPypi\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"publish-to-pypi\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"python\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"python\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"python\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_REMOTE\",\n        \"docs\": \"Git repository URL.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryUrl\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"repositoryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-url\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"rootdir\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"rootdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"rootdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"cdktf-construct\",\n    \"typename\": \"cdktf.ConstructLibraryCdktf\",\n  },\n  Object {\n    \"docs\": \"Java project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-java-javaproject\",\n    \"fqn\": \"projen.java.JavaProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"\\\\\"my-app\\\\\"\",\n        \"docs\": \"The artifactId is generally the name that the project is known by.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactId\",\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"artifactId\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifact-id\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"Compile options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.MavenCompileOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.MavenCompileOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"compileOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"compileOptions\",\n        ],\n        \"simpleType\": \"MavenCompileOptions\",\n        \"switch\": \"compile-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of runtime dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"docs\": \"Description of a project is always good.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist/java\\\\\"\",\n        \"docs\": \"Final artifact output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"distdir\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"distdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"distdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"default\": \"\\\\\"org.acme\\\\\"\",\n        \"docs\": \"This is generally unique amongst an organization or a project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"groupId\",\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"groupId\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"group-id\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include junit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"junit\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"junit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"junit\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"junit options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.JunitOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.JunitOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"junitOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"junitOptions\",\n        ],\n        \"simpleType\": \"JunitOptions\",\n        \"switch\": \"junit-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"jar\\\\\"\",\n        \"docs\": \"Project packaging format.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packaging\",\n        \"optional\": true,\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"packaging\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"packaging\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"Packaging options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.MavenPackagingOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.MavenPackagingOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"packagingOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"packagingOptions\",\n        ],\n        \"simpleType\": \"MavenPackagingOptions\",\n        \"switch\": \"packaging-options\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use projenrc in java.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJava\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"projenrcJava\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-java\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in java.\",\n        \"featured\": false,\n        \"fqn\": \"projen.java.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.java.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJavaOptions\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"projenrcJavaOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-java-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include sample code and test if the relevant directories don't exist.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sample\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectOptions\",\n        \"path\": Array [\n          \"sample\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample\",\n      },\n      Object {\n        \"default\": \"\\\\\"org.acme\\\\\"\",\n        \"docs\": \"The java package to use for the code sample.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleJavaPackage\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectOptions\",\n        \"path\": Array [\n          \"sampleJavaPackage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"sample-java-package\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of test dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"testDeps\",\n        \"optional\": true,\n        \"parent\": \"JavaProjectCommonOptions\",\n        \"path\": Array [\n          \"testDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"test-deps\",\n      },\n      Object {\n        \"docs\": \"The URL, like the name, is not required.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"url\",\n        \"optional\": true,\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"url\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"url\",\n      },\n      Object {\n        \"default\": \"\\\\\"0.1.0\\\\\"\",\n        \"docs\": \"This is the last piece of the naming puzzle.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"version\",\n        \"parent\": \"PomOptions\",\n        \"path\": Array [\n          \"version\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n    ],\n    \"pjid\": \"java\",\n    \"typename\": \"java.JavaProject\",\n  },\n  Object {\n    \"docs\": \"Multi-language jsii library project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-cdk-jsiiproject\",\n    \"fqn\": \"projen.cdk.JsiiProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_NAME\",\n        \"docs\": \"The name of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"author\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"author\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_EMAIL\",\n        \"docs\": \"Email or URL of the library author.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorAddress\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"authorAddress\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-address\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically run API compatibility test against the latest version published to npm after compilation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compat\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compat\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compat\",\n      },\n      Object {\n        \"default\": \"\\\\\".compatignore\\\\\"\",\n        \"docs\": \"Name of the ignore file for API compatibility tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compatIgnore\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compatIgnore\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"compat-ignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Emit a compressed version of the assembly.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"compressAssembly\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"compressAssembly\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"compress-assembly\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"API.md\\\\\"\",\n        \"docs\": \"File path for generated docs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgenFilePath\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"docgenFilePath\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docgen-file-path\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dotnet\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"dotnet\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"dotnet\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"docs\": \"Accepts a list of glob patterns.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"excludeTypescript\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"excludeTypescript\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"exclude-typescript\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish Go bindings to a git repository.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiGoTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToGo\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToGo\",\n        ],\n        \"simpleType\": \"JsiiGoTarget\",\n        \"switch\": \"publish-to-go\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to maven.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiJavaTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToMaven\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToMaven\",\n        ],\n        \"simpleType\": \"JsiiJavaTarget\",\n        \"switch\": \"publish-to-maven\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to NuGet.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiDotNetTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToNuget\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToNuget\",\n        ],\n        \"simpleType\": \"JsiiDotNetTarget\",\n        \"switch\": \"publish-to-nuget\",\n      },\n      Object {\n        \"default\": \"- no publishing\",\n        \"docs\": \"Publish to pypi.\",\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"publishToPypi\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"publishToPypi\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"publish-to-pypi\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"featured\": false,\n        \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.cdk.JsiiPythonTarget\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"python\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"python\",\n        ],\n        \"simpleType\": \"JsiiPythonTarget\",\n        \"switch\": \"python\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"$GIT_REMOTE\",\n        \"docs\": \"Git repository URL.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryUrl\",\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"repositoryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-url\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"rootdir\",\n        \"optional\": true,\n        \"parent\": \"JsiiProjectOptions\",\n        \"path\": Array [\n          \"rootdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"rootdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"jsii\",\n    \"typename\": \"cdk.JsiiProject\",\n  },\n  Object {\n    \"docs\": \"Next.js project without TypeScript.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-web-nextjsproject\",\n    \"fqn\": \"projen.web.NextJsProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"default\": \"\\\\\"public\\\\\"\",\n        \"docs\": \"Assets directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"assetsdir\",\n        \"optional\": true,\n        \"parent\": \"NextJsCommonProjectOptions\",\n        \"path\": Array [\n          \"assetsdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"assetsdir\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`pages/\\` and \\`public/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"NextJsProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"NextJsProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup Tailwind CSS as a PostCSS plugin.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tailwind\",\n        \"optional\": true,\n        \"parent\": \"NextJsCommonProjectOptions\",\n        \"path\": Array [\n          \"tailwind\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"tailwind\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"nextjs\",\n    \"typename\": \"web.NextJsProject\",\n  },\n  Object {\n    \"docs\": \"Next.js project with TypeScript.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-web-nextjstypescriptproject\",\n    \"fqn\": \"projen.web.NextJsTypeScriptProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"default\": \"\\\\\"public\\\\\"\",\n        \"docs\": \"Assets directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"assetsdir\",\n        \"optional\": true,\n        \"parent\": \"NextJsCommonProjectOptions\",\n        \"path\": Array [\n          \"assetsdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"assetsdir\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup Tailwind CSS as a PostCSS plugin.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tailwind\",\n        \"optional\": true,\n        \"parent\": \"NextJsCommonProjectOptions\",\n        \"path\": Array [\n          \"tailwind\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"tailwind\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"nextjs-ts\",\n    \"typename\": \"web.NextJsTypeScriptProject\",\n  },\n  Object {\n    \"docs\": \"Node.js project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-javascript-nodeproject\",\n    \"fqn\": \"projen.javascript.NodeProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"node\",\n    \"typename\": \"javascript.NodeProject\",\n  },\n  Object {\n    \"docs\": \"Base project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-project\",\n    \"fqn\": \"projen.Project\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n    ],\n    \"pjid\": \"project\",\n    \"typename\": \"Project\",\n  },\n  Object {\n    \"docs\": \"Python project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-python-pythonproject\",\n    \"fqn\": \"projen.python.PythonProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"$GIT_USER_EMAIL\",\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"default\": \"$GIT_USER_NAME\",\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"A list of PyPI trove classifiers that describe the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"classifiers\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"classifiers\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"classifiers\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of runtime dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"docs\": \"A short description of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"List of dev dependencies for this project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"A URL to the website of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"docs\": \"License of this package as an SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"$PYTHON_MODULE_NAME\",\n        \"docs\": \"Name of the python package as used in imports and filenames.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"moduleName\",\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"moduleName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"module-name\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"docs\": \"Package name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use pip with a requirements.txt file to track project dependencies.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pip\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pip\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pip\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use poetry to manage your project dependencies, virtual environment, and (optional) packaging/publishing.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"poetry\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"poetry\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"poetry\",\n      },\n      Object {\n        \"docs\": \"Additional options to set for poetry if using poetry.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.PoetryPyprojectOptionsWithoutDeps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.PoetryPyprojectOptionsWithoutDeps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"poetryOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"poetryOptions\",\n        ],\n        \"simpleType\": \"PoetryPyprojectOptionsWithoutDeps\",\n        \"switch\": \"poetry-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use projenrc in javascript.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in JavaScript.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use projenrc in Python.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcPython\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcPython\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-python\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options related to projenrc in python.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcPythonOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"projenrcPythonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-python-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include pytest tests.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pytest\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pytest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pytest\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"pytest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.PytestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.PytestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"pytestOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"pytestOptions\",\n        ],\n        \"simpleType\": \"PytestOptions\",\n        \"switch\": \"pytest-options\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include sample code and test if the relevant directories don't exist.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sample\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"sample\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample\",\n      },\n      Object {\n        \"docs\": \"Additional fields to pass in the setup() function if using setuptools.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"setupConfig\",\n        \"optional\": true,\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"setupConfig\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"setup-config\",\n      },\n      Object {\n        \"default\": \"- true if the project type is library\",\n        \"docs\": \"Use setuptools with a setup.py script for packaging and publishing.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"setuptools\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"setuptools\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"setuptools\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use venv to manage a virtual environment for installing dependencies inside.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"venv\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"venv\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"venv\",\n      },\n      Object {\n        \"default\": \"- defaults\",\n        \"docs\": \"Venv options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.python.VenvOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.python.VenvOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"venvOptions\",\n        \"optional\": true,\n        \"parent\": \"PythonProjectOptions\",\n        \"path\": Array [\n          \"venvOptions\",\n        ],\n        \"simpleType\": \"VenvOptions\",\n        \"switch\": \"venv-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"0.1.0\\\\\"\",\n        \"docs\": \"Version of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"version\",\n        \"parent\": \"PythonPackagingOptions\",\n        \"path\": Array [\n          \"version\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n    ],\n    \"pjid\": \"python\",\n    \"typename\": \"python.PythonProject\",\n  },\n  Object {\n    \"docs\": \"React project without TypeScript.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-web-reactproject\",\n    \"fqn\": \"projen.web.ReactProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"- No rewired config.\",\n        \"docs\": \"Rewire webpack configuration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"rewire\",\n        \"optional\": true,\n        \"parent\": \"ReactRewireOptions\",\n        \"path\": Array [\n          \"rewire\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"rewire\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`public/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"ReactProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Source directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"ReactProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"react\",\n    \"typename\": \"web.ReactProject\",\n  },\n  Object {\n    \"docs\": \"React project with TypeScript.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-web-reacttypescriptproject\",\n    \"fqn\": \"projen.web.ReactTypeScriptProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"- No rewired config.\",\n        \"docs\": \"Rewire webpack configuration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"rewire\",\n        \"optional\": true,\n        \"parent\": \"ReactRewireOptions\",\n        \"path\": Array [\n          \"rewire\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"rewire\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"react-ts\",\n    \"typename\": \"web.ReactTypeScriptProject\",\n  },\n  Object {\n    \"docs\": \"TypeScript project.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-typescript-typescriptproject\",\n    \"fqn\": \"projen.typescript.TypeScriptProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"typescript\",\n    \"typename\": \"typescript.TypeScriptProject\",\n  },\n  Object {\n    \"docs\": \"TypeScript app.\",\n    \"docsurl\": \"https://projen.io/api/API.html#projen-typescript-typescriptappproject\",\n    \"fqn\": \"projen.typescript.TypeScriptAppProject\",\n    \"moduleName\": \"projen\",\n    \"options\": Array [\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Allow the project to include \\`peerDependencies\\` and \\`bundledDependencies\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"allowLibraryDependencies\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"allowLibraryDependencies\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"allow-library-dependencies\",\n      },\n      Object {\n        \"default\": \"\\\\\"dist\\\\\"\",\n        \"docs\": \"A directory which will contain build artifacts.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"artifactsDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"artifactsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"artifacts-directory\",\n      },\n      Object {\n        \"docs\": \"Author's e-mail.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-email\",\n      },\n      Object {\n        \"docs\": \"Author's name.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-name\",\n      },\n      Object {\n        \"docs\": \"Author's Organization.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorOrganization\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorOrganization\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"author-organization\",\n      },\n      Object {\n        \"docs\": \"Author's URL / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"authorUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"authorUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"author-url\",\n      },\n      Object {\n        \"default\": \"- auto approve is disabled\",\n        \"docs\": \"Enable and configure the 'auto approve' workflow.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoApproveOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoApproveOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoApproveOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoApproveOptions\",\n        ],\n        \"simpleType\": \"AutoApproveOptions\",\n        \"switch\": \"auto-approve-options\",\n      },\n      Object {\n        \"default\": \"- true\",\n        \"docs\": \"Automatically approve deps upgrade PRs, allowing them to be merged by mergify (if configued).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoApproveUpgrades\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"autoApproveUpgrades\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-approve-upgrades\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically add all executables under the \\`bin\\` directory to your \\`package.json\\` file under the \\`bin\\` section.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoDetectBin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"autoDetectBin\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-detect-bin\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"autoMerge\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMerge\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"auto-merge\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`AutoMergeOptions\\`\",\n        \"docs\": \"Configure options for automatic merging on GitHub.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.AutoMergeOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.AutoMergeOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"autoMergeOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"autoMergeOptions\",\n        ],\n        \"simpleType\": \"AutoMergeOptions\",\n        \"switch\": \"auto-merge-options\",\n      },\n      Object {\n        \"docs\": \"Binary programs vended with your module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bin\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bin\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bin\",\n      },\n      Object {\n        \"docs\": \"The email address to which issues should be reported.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsEmail\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsEmail\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-email\",\n      },\n      Object {\n        \"docs\": \"The url to your project's issue tracker.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"bugsUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bugsUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"bugs-url\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"docs\": \"Define a GitHub workflow for building PRs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"buildWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"build-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"{ pullRequest: {}, workflowDispatch: {} }\\\\\"\",\n        \"docs\": \"Build workflow triggers.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.workflows.Triggers\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.workflows.Triggers\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"buildWorkflowTriggers\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"buildWorkflowTriggers\",\n        ],\n        \"simpleType\": \"Triggers\",\n        \"switch\": \"build-workflow-triggers\",\n      },\n      Object {\n        \"docs\": \"List of dependencies to bundle into this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"bundledDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"bundledDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"bundled-deps\",\n      },\n      Object {\n        \"docs\": \"Options for \\`Bundler\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.BundlerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.BundlerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"bundlerOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"bundlerOptions\",\n        ],\n        \"simpleType\": \"BundlerOptions\",\n        \"switch\": \"bundler-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Add a \\`clobber\\` task which resets the repo to origin.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"clobber\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"clobber\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"clobber\",\n      },\n      Object {\n        \"default\": \"- undefined\",\n        \"docs\": \"Options for npm packages using AWS CodeArtifact.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.CodeArtifactOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"codeArtifactOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"codeArtifactOptions\",\n        ],\n        \"simpleType\": \"CodeArtifactOptions\",\n        \"switch\": \"code-artifact-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/ Uses codecov/codecov-action@v1 A secret is required for private repos. Configured with @codeCovTokenSecret.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCov\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCov\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"code-cov\",\n      },\n      Object {\n        \"default\": \"- if this option is not specified, only public repositories are supported\",\n        \"docs\": \"Define the secret name for a specified https://codecov.io/ token A secret is required to send coverage for private repositories.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"codeCovTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"codeCovTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"code-cov-token-secret\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Whether to commit the managed files by default.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"commitGenerated\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"commitGenerated\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"commit-generated\",\n      },\n      Object {\n        \"default\": \"- defaults to the value of authorName or \\\\\"\\\\\" if \\`authorName\\` is undefined.\",\n        \"docs\": \"License copyright owner.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightOwner\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightOwner\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-owner\",\n      },\n      Object {\n        \"default\": \"- current year\",\n        \"docs\": \"The copyright years to put in the LICENSE file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"copyrightPeriod\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"copyrightPeriod\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"copyright-period\",\n      },\n      Object {\n        \"default\": \"\\\\\"main\\\\\"\",\n        \"docs\": \"The name of the main release branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"defaultReleaseBranch\",\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"defaultReleaseBranch\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"default-release-branch\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use dependabot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"dependabot\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dependabot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for dependabot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.DependabotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.DependabotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"dependabotOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"dependabotOptions\",\n        ],\n        \"simpleType\": \"DependabotOptions\",\n        \"switch\": \"dependabot-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Runtime dependencies of this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"deps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"deps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"deps\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Use github workflows to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"depsUpgrade\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgrade\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"deps-upgrade\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for \\`UpgradeDependencies\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.UpgradeDependenciesOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"depsUpgradeOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"depsUpgradeOptions\",\n        ],\n        \"simpleType\": \"UpgradeDependenciesOptions\",\n        \"switch\": \"deps-upgrade-options\",\n      },\n      Object {\n        \"docs\": \"The description is just a string that helps people understand the purpose of the package.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"description\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"description\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"description\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a VSCode development environment (used for GitHub Codespaces).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"devContainer\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"devContainer\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"dev-container\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Build dependencies for this module.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"devDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"devDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"dev-deps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Do not generate a \\`tsconfig.json\\` file (used by jsii projects since tsconfig.json is generated by the jsii compiler).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"disableTsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"disableTsconfig\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"disable-tsconfig\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Docgen by Typedoc.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docgen\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docgen\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"docgen\",\n      },\n      Object {\n        \"default\": \"\\\\\"docs\\\\\"\",\n        \"docs\": \"Docs directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"docsDirectory\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"docsDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"docs-directory\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib/index.js\\\\\"\",\n        \"docs\": \"Module entrypoint (\\`main\\` in \\`package.json\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypoint\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"entrypoint\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint\",\n      },\n      Object {\n        \"default\": \"- .d.ts file derived from the project's entrypoint (usually lib/index.d.ts)\",\n        \"docs\": \"The .d.ts file that includes the type declarations for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"entrypointTypes\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"entrypointTypes\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"entrypoint-types\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup eslint.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"eslint\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslint\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"eslint\",\n      },\n      Object {\n        \"default\": \"- opinionated default options\",\n        \"docs\": \"Eslint options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.EslintOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.EslintOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"eslintOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"eslintOptions\",\n        ],\n        \"simpleType\": \"EslintOptions\",\n        \"switch\": \"eslint-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable GitHub integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"github\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"github\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"github\",\n      },\n      Object {\n        \"default\": \"- see GitHubOptions\",\n        \"docs\": \"Options for GitHub integration.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitHubOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitHubOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"githubOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"githubOptions\",\n        ],\n        \"simpleType\": \"GitHubOptions\",\n        \"switch\": \"github-options\",\n      },\n      Object {\n        \"docs\": \"Additional entries to .gitignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"gitignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"gitignore\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Add a Gitpod development environment.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"gitpod\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"gitpod\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"gitpod\",\n      },\n      Object {\n        \"docs\": \"Package's Homepage / Website.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"homepage\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"homepage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"homepage\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Setup jest unit tests.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jest\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jest\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"jest\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Jest options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.JestOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.JestOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"jestOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"jestOptions\",\n        ],\n        \"simpleType\": \"JestOptions\",\n        \"switch\": \"jest-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"Version requirement of \\`publib\\` which is used to publish modules to npm.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"jsiiReleaseVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"jsiiReleaseVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"jsii-release-version\",\n      },\n      Object {\n        \"docs\": \"Keywords to include in \\`package.json\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"keywords\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"keywords\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"keywords\",\n      },\n      Object {\n        \"default\": \"\\\\\"lib\\\\\"\",\n        \"docs\": \"Typescript  artifacts output directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"libdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"libdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"libdir\",\n      },\n      Object {\n        \"default\": \"\\\\\"Apache-2.0\\\\\"\",\n        \"docs\": \"License's SPDX identifier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"license\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"license\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"license\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates if a license should be added.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"licensed\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"licensed\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"licensed\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"Configure logging options such as verbosity.\",\n        \"featured\": false,\n        \"fqn\": \"projen.LoggerOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.LoggerOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"logging\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"logging\",\n        ],\n        \"simpleType\": \"LoggerOptions\",\n        \"switch\": \"logging\",\n      },\n      Object {\n        \"default\": \"- Major version is not enforced.\",\n        \"docs\": \"Major version to release from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"majorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"majorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"major-version\",\n      },\n      Object {\n        \"default\": \"- no max\",\n        \"docs\": \"Minimum node.js version to require via \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"maxNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"maxNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"max-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Whether mergify should be enabled on this repository or not.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mergify\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergify\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mergify\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"deprecated\": true,\n        \"docs\": \"Options for mergify.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.MergifyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.MergifyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"mergifyOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"mergifyOptions\",\n        ],\n        \"simpleType\": \"MergifyOptions\",\n        \"switch\": \"mergify-options\",\n      },\n      Object {\n        \"default\": \"- No minimum version is being enforced\",\n        \"docs\": \"Minimal Major version to release.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"number\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minMajorVersion\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"minMajorVersion\",\n        ],\n        \"simpleType\": \"number\",\n        \"switch\": \"min-major-version\",\n      },\n      Object {\n        \"default\": \"- no \\\\\"engines\\\\\" specified\",\n        \"docs\": \"Minimum Node.js version to require via package.json \\`engines\\` (inclusive).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"minNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"minNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"min-node-version\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Automatically update files modified during builds to pull-request branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"mutableBuild\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"mutableBuild\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"mutable-build\",\n      },\n      Object {\n        \"default\": \"$BASEDIR\",\n        \"docs\": \"This is the name of your project.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"name\",\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"name\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"name\",\n      },\n      Object {\n        \"default\": \"- for scoped packages (e.g. \\`foo@bar\\`), the default is\n\\`NpmAccess.RESTRICTED\\`, for non-scoped packages, the default is\n\\`NpmAccess.PUBLIC\\`.\",\n        \"docs\": \"Access level of the npm package.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NpmAccess\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NpmAccess\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"npmAccess\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmAccess\",\n        ],\n        \"simpleType\": \"NpmAccess\",\n        \"switch\": \"npm-access\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"The npmDistTag to use when publishing from the default branch.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmDistTag\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"npmDistTag\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-dist-tag\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"Additional entries to .npmignore.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignore\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignore\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"npmignore\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines an .npmignore file. Normally this is only needed for libraries that are packaged as tarballs.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmignoreEnabled\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"npmignoreEnabled\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"npmignore-enabled\",\n      },\n      Object {\n        \"deprecated\": true,\n        \"docs\": \"The host name of the npm registry to publish to.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistry\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistry\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry\",\n      },\n      Object {\n        \"default\": \"\\\\\"https://registry.npmjs.org\\\\\"\",\n        \"docs\": \"The base URL of the npm package registry.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmRegistryUrl\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmRegistryUrl\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-registry-url\",\n      },\n      Object {\n        \"default\": \"\\\\\"NPM_TOKEN\\\\\"\",\n        \"docs\": \"GitHub secret which contains the NPM token to use when publishing packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"npmTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"npmTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"npm-token-secret\",\n      },\n      Object {\n        \"default\": \"\\\\\".\\\\\"\",\n        \"docs\": \"The root directory of the project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"outdir\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"outdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"outdir\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Defines a \\`package\\` task that will produce an npm tarball under the artifacts directory (e.g. \\`dist\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"package\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"package\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"package\",\n      },\n      Object {\n        \"default\": \"NodePackageManager.YARN\",\n        \"docs\": \"The Node Package Manager used to execute scripts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.NodePackageManager\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.NodePackageManager\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"packageManager\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageManager\",\n        ],\n        \"simpleType\": \"NodePackageManager\",\n        \"switch\": \"package-manager\",\n      },\n      Object {\n        \"default\": \"- defaults to project name\",\n        \"docs\": \"The \\\\\"name\\\\\" in package.json.\",\n        \"featured\": true,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"packageName\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"packageName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"package-name\",\n      },\n      Object {\n        \"docs\": \"The parent project, if this project is part of a bigger project.\",\n        \"featured\": false,\n        \"fqn\": \"projen.Project\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.Project\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"parent\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"parent\",\n        ],\n        \"simpleType\": \"Project\",\n        \"switch\": \"parent\",\n      },\n      Object {\n        \"docs\": \"Options for \\`peerDeps\\`.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PeerDependencyOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"peerDependencyOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDependencyOptions\",\n        ],\n        \"simpleType\": \"PeerDependencyOptions\",\n        \"switch\": \"peer-dependency-options\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Peer dependencies for this module.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"peerDeps\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"peerDeps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"peer-deps\",\n      },\n      Object {\n        \"default\": \"[]\",\n        \"docs\": \"Steps to execute after build as part of the release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"postBuildSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"postBuildSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"post-build-steps\",\n      },\n      Object {\n        \"default\": \"- normal semantic versions\",\n        \"docs\": \"Bump versions from the default branch as pre-releases (e.g. \\\\\"beta\\\\\", \\\\\"alpha\\\\\", \\\\\"pre\\\\\").\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prerelease\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"prerelease\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"prerelease\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Setup prettier.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"prettier\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettier\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"prettier\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Prettier options.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.PrettierOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.PrettierOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"prettierOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"prettierOptions\",\n        ],\n        \"simpleType\": \"PrettierOptions\",\n        \"switch\": \"prettier-options\",\n      },\n      Object {\n        \"default\": \"ProjectType.UNKNOWN\",\n        \"deprecated\": true,\n        \"docs\": \"Which type of project this is (library/app).\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjectType\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjectType\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"enum\",\n        \"name\": \"projectType\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projectType\",\n        ],\n        \"simpleType\": \"ProjectType\",\n        \"switch\": \"project-type\",\n      },\n      Object {\n        \"default\": \"\\\\\"npx projen\\\\\"\",\n        \"docs\": \"The shell command to use in order to run the projen CLI.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenCommand\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenCommand\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-command\",\n      },\n      Object {\n        \"default\": \"- use a personal access token named PROJEN_GITHUB_TOKEN\",\n        \"docs\": \"Choose a method of providing GitHub API access for projen workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GithubCredentials\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GithubCredentials\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"projenCredentials\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenCredentials\",\n        ],\n        \"simpleType\": \"GithubCredentials\",\n        \"switch\": \"projen-credentials\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Indicates of \\\\\"projen\\\\\" should be installed as a devDependency.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenDevDependency\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenDevDependency\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projen-dev-dependency\",\n      },\n      Object {\n        \"default\": \"- true if projenrcJson is false\",\n        \"docs\": \"Generate (once) .projenrc.js (in JavaScript). Set to \\`false\\` in order to disable .projenrc.js generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJs\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-js\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Generate (once) .projenrc.json (in JSON). Set to \\`false\\` in order to disable .projenrc.json generation.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcJson\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJson\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-json\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.json.\",\n        \"featured\": false,\n        \"fqn\": \"projen.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsonOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsonOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-json-options\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for .projenrc.js.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcJsOptions\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenrcJsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-js-options\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use TypeScript for your projenrc file (\\`.projenrc.ts\\`).\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenrcTs\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTs\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"projenrc-ts\",\n      },\n      Object {\n        \"docs\": \"Options for .projenrc.ts.\",\n        \"featured\": false,\n        \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.typescript.ProjenrcOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"projenrcTsOptions\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"projenrcTsOptions\",\n        ],\n        \"simpleType\": \"ProjenrcOptions\",\n        \"switch\": \"projenrc-ts-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"PROJEN_GITHUB_TOKEN\\\\\"\",\n        \"deprecated\": true,\n        \"docs\": \"The name of a secret which includes a GitHub Personal Access Token to be used by projen workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenTokenSecret\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"projenTokenSecret\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-token-secret\",\n      },\n      Object {\n        \"default\": \"- Defaults to the latest version.\",\n        \"docs\": \"Version of projen to install.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"projenVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"projenVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"projen-version\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Instead of actually publishing to package managers, just print the publishing command.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishDryRun\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishDryRun\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-dry-run\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Define publishing tasks that can be executed manually as well as workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"publishTasks\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"publishTasks\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"publish-tasks\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Include a GitHub pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplate\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplate\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"pull-request-template\",\n      },\n      Object {\n        \"default\": \"- default content\",\n        \"docs\": \"The contents of the pull request template.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"pullRequestTemplateContents\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"pullRequestTemplateContents\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"pull-request-template-contents\",\n      },\n      Object {\n        \"default\": \"- { filename: 'README.md', contents: '# replace this' }\",\n        \"docs\": \"The README setup.\",\n        \"featured\": false,\n        \"fqn\": \"projen.SampleReadmeProps\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.SampleReadmeProps\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"readme\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"readme\",\n        ],\n        \"simpleType\": \"SampleReadmeProps\",\n        \"switch\": \"readme\",\n      },\n      Object {\n        \"default\": \"- true (false for subprojects)\",\n        \"docs\": \"Add release management to this project.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"release\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"release\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release\",\n      },\n      Object {\n        \"default\": \"- no additional branches are used for release. you can use\n\\`addBranch()\\` to add additional branches.\",\n        \"docs\": \"Defines additional release branches.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.release.BranchOptions\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseBranches\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseBranches\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-branches\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"deprecated\": true,\n        \"docs\": \"Automatically release new versions every commit to one of branches in \\`releaseBranches\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseEveryCommit\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseEveryCommit\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-every-commit\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Create a github issue on every failed publishing task.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssue\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssue\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-failure-issue\",\n      },\n      Object {\n        \"default\": \"\\\\\"failed-release\\\\\"\",\n        \"docs\": \"The label to apply to issues indicating publish failures.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseFailureIssueLabel\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseFailureIssueLabel\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-failure-issue-label\",\n      },\n      Object {\n        \"default\": \"- no scheduled releases\",\n        \"deprecated\": true,\n        \"docs\": \"CRON schedule to trigger new releases.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseSchedule\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseSchedule\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-schedule\",\n      },\n      Object {\n        \"default\": \"- no prefix\",\n        \"docs\": \"Automatically add the given prefix to release tags. Useful if you are releasing on multiple branches with overlapping version numbers.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseTagPrefix\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTagPrefix\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-tag-prefix\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Automatically release to npm when new versions are introduced.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseToNpm\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseToNpm\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-to-npm\",\n      },\n      Object {\n        \"default\": \"- Continuous releases (\\`ReleaseTrigger.continuous()\\`)\",\n        \"docs\": \"The release trigger to use.\",\n        \"featured\": false,\n        \"fqn\": \"projen.release.ReleaseTrigger\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.release.ReleaseTrigger\",\n        },\n        \"jsonLike\": false,\n        \"kind\": \"class\",\n        \"name\": \"releaseTrigger\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseTrigger\",\n        ],\n        \"simpleType\": \"ReleaseTrigger\",\n        \"switch\": \"release-trigger\",\n      },\n      Object {\n        \"default\": \"- true if not a subproject\",\n        \"deprecated\": true,\n        \"docs\": \"DEPRECATED: renamed to \\`release\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflow\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflow\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"release-workflow\",\n      },\n      Object {\n        \"default\": \"\\\\\"Release\\\\\"\",\n        \"docs\": \"The name of the default release workflow.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowName\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowName\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"release-workflow-name\",\n      },\n      Object {\n        \"docs\": \"A set of workflow steps to execute in order to setup the workflow container.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"releaseWorkflowSetupSteps\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"releaseWorkflowSetupSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"release-workflow-setup-steps\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Use renovatebot to handle dependency upgrades.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"renovatebot\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebot\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"renovatebot\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Options for renovatebot.\",\n        \"featured\": false,\n        \"fqn\": \"projen.RenovatebotOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.RenovatebotOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"renovatebotOptions\",\n        \"optional\": true,\n        \"parent\": \"ProjectOptions\",\n        \"path\": Array [\n          \"renovatebotOptions\",\n        ],\n        \"simpleType\": \"RenovatebotOptions\",\n        \"switch\": \"renovatebot-options\",\n      },\n      Object {\n        \"docs\": \"The repository is the location where the actual code for your package lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repository\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repository\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository\",\n      },\n      Object {\n        \"docs\": \"If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"repositoryDirectory\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"repositoryDirectory\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"repository-directory\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Generate one-time sample in \\`src/\\` and \\`test/\\` if there are no files there.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"sampleCode\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"sampleCode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"sample-code\",\n      },\n      Object {\n        \"default\": \"- fetch all scoped packages from the public npm registry\",\n        \"docs\": \"Options for privately hosted scoped packages.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.javascript.ScopedPackagesOptions\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scopedPackagesOptions\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scopedPackagesOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scoped-packages-options\",\n      },\n      Object {\n        \"default\": \"{}\",\n        \"docs\": \"npm scripts to include.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"scripts\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"scripts\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"scripts\",\n      },\n      Object {\n        \"default\": \"\\\\\"src\\\\\"\",\n        \"docs\": \"Typescript sources directory.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"srcdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"srcdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"srcdir\",\n      },\n      Object {\n        \"docs\": \"Package's Stability.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stability\",\n        \"optional\": true,\n        \"parent\": \"NodePackageOptions\",\n        \"path\": Array [\n          \"stability\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"stability\",\n      },\n      Object {\n        \"default\": \"false\",\n        \"docs\": \"Auto-close of stale issues and pull request.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"stale\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"stale\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"stale\",\n      },\n      Object {\n        \"default\": \"- see defaults in \\`StaleOptions\\`\",\n        \"docs\": \"Auto-close stale issues and pull requests.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.StaleOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.StaleOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"staleOptions\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"staleOptions\",\n        ],\n        \"simpleType\": \"StaleOptions\",\n        \"switch\": \"stale-options\",\n      },\n      Object {\n        \"default\": \"\\\\\"test\\\\\"\",\n        \"docs\": \"Jest tests directory. Tests files should be named \\`xxx.test.ts\\`.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"testdir\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"testdir\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"testdir\",\n      },\n      Object {\n        \"default\": \"- default options\",\n        \"docs\": \"Custom TSConfig.\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfig\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfig\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig\",\n      },\n      Object {\n        \"default\": \"- use the production tsconfig options\",\n        \"docs\": \"Custom tsconfig options for the development tsconfig.json file (used for testing).\",\n        \"featured\": false,\n        \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.javascript.TypescriptConfigOptions\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"tsconfigDev\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDev\",\n        ],\n        \"simpleType\": \"TypescriptConfigOptions\",\n        \"switch\": \"tsconfig-dev\",\n      },\n      Object {\n        \"default\": \"\\\\\"tsconfig.dev.json\\\\\"\",\n        \"docs\": \"The name of the development tsconfig.json file.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"tsconfigDevFile\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"tsconfigDevFile\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"tsconfig-dev-file\",\n      },\n      Object {\n        \"default\": \"\\\\\"latest\\\\\"\",\n        \"docs\": \"TypeScript version to use.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"typescriptVersion\",\n        \"optional\": true,\n        \"parent\": \"TypeScriptProjectOptions\",\n        \"path\": Array [\n          \"typescriptVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"typescript-version\",\n      },\n      Object {\n        \"default\": \"- standard configuration applicable for GitHub repositories\",\n        \"docs\": \"Custom configuration used when creating changelog with standard-version package.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"any\",\n            },\n            \"kind\": \"map\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"versionrcOptions\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"versionrcOptions\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"versionrc-options\",\n      },\n      Object {\n        \"default\": \"true\",\n        \"docs\": \"Enable VSCode integration.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"boolean\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"vscode\",\n        \"optional\": true,\n        \"parent\": \"GitHubProjectOptions\",\n        \"path\": Array [\n          \"vscode\",\n        ],\n        \"simpleType\": \"boolean\",\n        \"switch\": \"vscode\",\n      },\n      Object {\n        \"default\": \"\\\\\"yarn install --frozen-lockfile && yarn projen\\\\\"\",\n        \"docs\": \"Workflow steps to use in order to bootstrap this repo.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"fqn\": \"projen.github.workflows.JobStep\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowBootstrapSteps\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowBootstrapSteps\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-bootstrap-steps\",\n      },\n      Object {\n        \"default\": \"- default image\",\n        \"docs\": \"Container image to use for GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowContainerImage\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowContainerImage\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-container-image\",\n      },\n      Object {\n        \"default\": \"- GitHub Actions\",\n        \"docs\": \"The git identity to use in workflows.\",\n        \"featured\": false,\n        \"fqn\": \"projen.github.GitIdentity\",\n        \"fullType\": Object {\n          \"fqn\": \"projen.github.GitIdentity\",\n        },\n        \"jsonLike\": true,\n        \"kind\": \"interface\",\n        \"name\": \"workflowGitIdentity\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowGitIdentity\",\n        ],\n        \"simpleType\": \"GitIdentity\",\n        \"switch\": \"workflow-git-identity\",\n      },\n      Object {\n        \"default\": \"- same as \\`minNodeVersion\\`\",\n        \"docs\": \"The node version to use in GitHub workflows.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"primitive\": \"string\",\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowNodeVersion\",\n        \"optional\": true,\n        \"parent\": \"NodeProjectOptions\",\n        \"path\": Array [\n          \"workflowNodeVersion\",\n        ],\n        \"simpleType\": \"string\",\n        \"switch\": \"workflow-node-version\",\n      },\n      Object {\n        \"default\": \"[\\\\\"ubuntu-latest\\\\\"]\",\n        \"docs\": \"Github Runner selection labels.\",\n        \"featured\": false,\n        \"fullType\": Object {\n          \"collection\": Object {\n            \"elementtype\": Object {\n              \"primitive\": \"string\",\n            },\n            \"kind\": \"array\",\n          },\n        },\n        \"jsonLike\": true,\n        \"name\": \"workflowRunsOn\",\n        \"optional\": true,\n        \"parent\": \"ReleaseProjectOptions\",\n        \"path\": Array [\n          \"workflowRunsOn\",\n        ],\n        \"simpleType\": \"unknown\",\n        \"switch\": \"workflow-runs-on\",\n      },\n    ],\n    \"pjid\": \"typescript-app\",\n    \"typename\": \"typescript.TypeScriptAppProject\",\n  },\n]\n`;\n"
  },
  {
    "path": "test/__snapshots__/license.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`MIT with owner 1`] = `\n\"Copyright (c) 2022 John Doe\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \\\\\"Software\\\\\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \\\\\"AS IS\\\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\n`;\n\nexports[`MIT with owner and period 1`] = `\n\"Copyright (c) 1900-1920 John Doe\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \\\\\"Software\\\\\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \\\\\"AS IS\\\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\n`;\n\nexports[`MIT-0 with owner 1`] = `\n\"Copyright 2022 John Doe\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \\\\\"Software\\\\\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so.\n\nTHE SOFTWARE IS PROVIDED \\\\\"AS IS\\\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \n\n\"\n`;\n\nexports[`MIT-0 with owner and period 1`] = `\n\"Copyright 1900-1920 John Doe\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \\\\\"Software\\\\\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so.\n\nTHE SOFTWARE IS PROVIDED \\\\\"AS IS\\\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \n\n\"\n`;\n\nexports[`apache with defaults 1`] = `\n\"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\"\n`;\n"
  },
  {
    "path": "test/__snapshots__/new.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`creating java project with enum-typed CLI arg 1`] = `\n\"import io.github.cdklabs.projen.java.JavaProject;\nimport io.github.cdklabs.projen.java.JavaProjectOptions;\nimport io.github.cdklabs.projen.ProjectType;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        JavaProject project = new JavaProject(JavaProjectOptions.builder()\n            .artifactId(\\\\\"my-app\\\\\")\n            .groupId(\\\\\"org.acme\\\\\")\n            .name(\\\\\"my-project\\\\\")\n            .version(\\\\\"0.1.0\\\\\")\n            .projectType(ProjectType.LIB)\n            .projenrcJava(true)\n            .build());\n        project.synth();\n    }\n}\"\n`;\n\nexports[`creating node project with enum-typed CLI arg 1`] = `\n\"const { javascript } = require(\\\\\"projen\\\\\");\nconst project = new javascript.NodeProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n  packageManager: javascript.NodePackageManager.NPM,\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\"\n`;\n\nexports[`creating python project with enum-typed CLI arg 1`] = `\n\"from projen.python import PythonProject\nfrom projen import ProjectType\n\nproject = PythonProject(\n    author_email=\\\\\"my@user.email.com\\\\\",\n    author_name=\\\\\"My User Name\\\\\",\n    module_name=\\\\\"my_project\\\\\",\n    name=\\\\\"my-project\\\\\",\n    version=\\\\\"0.1.0\\\\\",\n    project_type=ProjectType.LIB,\n    projenrc_python=True,\n)\n\nproject.synth()\"\n`;\n\nexports[`projen new awscdk-app-java 1`] = `\nObject {\n  \"src/test/java/projenrc.java\": \"import io.github.cdklabs.projen.awscdk.AwsCdkJavaApp;\nimport io.github.cdklabs.projen.awscdk.AwsCdkJavaAppOptions;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        AwsCdkJavaApp project = new AwsCdkJavaApp(AwsCdkJavaAppOptions.builder()\n            .artifactId(\\\\\"my-app\\\\\")\n            .cdkVersion(\\\\\"2.1.0\\\\\")\n            .groupId(\\\\\"org.acme\\\\\")\n            .mainClass(\\\\\"org.acme.MyApp\\\\\")\n            .name(\\\\\"my-project\\\\\")\n            .version(\\\\\"0.1.0\\\\\")\n            .build());\n        project.synth();\n    }\n}\",\n}\n`;\n\nexports[`projen new awscdk-app-py 1`] = `\nObject {\n  \".projenrc.py\": \"from projen.awscdk import AwsCdkPythonApp\n\nproject = AwsCdkPythonApp(\n    author_email=\\\\\"my@user.email.com\\\\\",\n    author_name=\\\\\"My User Name\\\\\",\n    cdk_version=\\\\\"2.1.0\\\\\",\n    module_name=\\\\\"my_project\\\\\",\n    name=\\\\\"my-project\\\\\",\n    version=\\\\\"0.1.0\\\\\",\n)\n\nproject.synth()\",\n}\n`;\n\nexports[`projen new awscdk-app-ts 1`] = `\nObject {\n  \".projenrc.js\": \"const { awscdk } = require(\\\\\"projen\\\\\");\nconst project = new awscdk.AwsCdkTypeScriptApp({\n  cdkVersion: \\\\\"2.1.0\\\\\",\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new awscdk-construct 1`] = `\nObject {\n  \".projenrc.js\": \"const { awscdk } = require(\\\\\"projen\\\\\");\nconst project = new awscdk.AwsCdkConstructLibrary({\n  author: \\\\\"My User Name\\\\\",\n  authorAddress: \\\\\"my@user.email.com\\\\\",\n  cdkVersion: \\\\\"2.1.0\\\\\",\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n  repositoryUrl: \\\\\"git@boom.com:foo/bar.git\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new cdk8s-app-py 1`] = `\nObject {\n  \".projenrc.py\": \"from projen.cdk8s import Cdk8sPythonApp\n\nproject = Cdk8sPythonApp(\n    author_email=\\\\\"my@user.email.com\\\\\",\n    author_name=\\\\\"My User Name\\\\\",\n    cdk8s_version=\\\\\"2.3.33\\\\\",\n    module_name=\\\\\"my_project\\\\\",\n    name=\\\\\"my-project\\\\\",\n    version=\\\\\"0.1.0\\\\\",\n)\n\nproject.synth()\",\n}\n`;\n\nexports[`projen new cdk8s-app-ts 1`] = `\nObject {\n  \".projenrc.js\": \"const { cdk8s } = require(\\\\\"projen\\\\\");\nconst project = new cdk8s.Cdk8sTypeScriptApp({\n  cdk8sVersion: \\\\\"2.3.33\\\\\",\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new cdk8s-construct 1`] = `\nObject {\n  \".projenrc.js\": \"const { cdk8s } = require(\\\\\"projen\\\\\");\nconst project = new cdk8s.ConstructLibraryCdk8s({\n  author: \\\\\"My User Name\\\\\",\n  authorAddress: \\\\\"my@user.email.com\\\\\",\n  cdk8sVersion: \\\\\"1.4.10\\\\\",\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n  repositoryUrl: \\\\\"git@boom.com:foo/bar.git\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new cdktf-construct 1`] = `\nObject {\n  \".projenrc.js\": \"const { cdktf } = require(\\\\\"projen\\\\\");\nconst project = new cdktf.ConstructLibraryCdktf({\n  author: \\\\\"My User Name\\\\\",\n  authorAddress: \\\\\"my@user.email.com\\\\\",\n  cdktfVersion: \\\\\"^0.8.3\\\\\",\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n  repositoryUrl: \\\\\"git@boom.com:foo/bar.git\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new java 1`] = `\nObject {\n  \"src/test/java/projenrc.java\": \"import io.github.cdklabs.projen.java.JavaProject;\nimport io.github.cdklabs.projen.java.JavaProjectOptions;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        JavaProject project = new JavaProject(JavaProjectOptions.builder()\n            .artifactId(\\\\\"my-app\\\\\")\n            .groupId(\\\\\"org.acme\\\\\")\n            .name(\\\\\"my-project\\\\\")\n            .version(\\\\\"0.1.0\\\\\")\n            .build());\n        project.synth();\n    }\n}\",\n}\n`;\n\nexports[`projen new jsii 1`] = `\nObject {\n  \".projenrc.js\": \"const { cdk } = require(\\\\\"projen\\\\\");\nconst project = new cdk.JsiiProject({\n  author: \\\\\"My User Name\\\\\",\n  authorAddress: \\\\\"my@user.email.com\\\\\",\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n  repositoryUrl: \\\\\"git@boom.com:foo/bar.git\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new nextjs 1`] = `\nObject {\n  \".projenrc.js\": \"const { web } = require(\\\\\"projen\\\\\");\nconst project = new web.NextJsProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n  // tailwind: true,          /* Setup Tailwind CSS as a PostCSS plugin. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new nextjs-ts 1`] = `\nObject {\n  \".projenrc.js\": \"const { web } = require(\\\\\"projen\\\\\");\nconst project = new web.NextJsTypeScriptProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n  // tailwind: true,          /* Setup Tailwind CSS as a PostCSS plugin. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new node 1`] = `\nObject {\n  \".projenrc.js\": \"const { javascript } = require(\\\\\"projen\\\\\");\nconst project = new javascript.NodeProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new project 1`] = `Object {}`;\n\nexports[`projen new python 1`] = `\nObject {\n  \".projenrc.py\": \"from projen.python import PythonProject\n\nproject = PythonProject(\n    author_email=\\\\\"my@user.email.com\\\\\",\n    author_name=\\\\\"My User Name\\\\\",\n    module_name=\\\\\"my_project\\\\\",\n    name=\\\\\"my-project\\\\\",\n    version=\\\\\"0.1.0\\\\\",\n)\n\nproject.synth()\",\n}\n`;\n\nexports[`projen new react 1`] = `\nObject {\n  \".projenrc.js\": \"const { web } = require(\\\\\"projen\\\\\");\nconst project = new web.ReactProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new react-ts 1`] = `\nObject {\n  \".projenrc.js\": \"const { web } = require(\\\\\"projen\\\\\");\nconst project = new web.ReactTypeScriptProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new typescript 1`] = `\nObject {\n  \".projenrc.js\": \"const { typescript } = require(\\\\\"projen\\\\\");\nconst project = new typescript.TypeScriptProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projen new typescript-app 1`] = `\nObject {\n  \".projenrc.js\": \"const { typescript } = require(\\\\\"projen\\\\\");\nconst project = new typescript.TypeScriptAppProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\",\n}\n`;\n\nexports[`projenrc-json creates java project 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/pom.xml linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/pom.xml\n.classpath\n.project\n.settings\ntarget\ndist/java\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"source\": \"1.8\",\n            \"target\": \"1.8\",\n          },\n        },\n        \"name\": \"org.apache.maven.plugins/maven-compiler-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.8.1\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"rules\": Array [\n              Object {\n                \"requireMavenVersion\": Array [\n                  Object {\n                    \"version\": \"3.6\",\n                  },\n                ],\n              },\n            ],\n          },\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"enforce\",\n              ],\n              \"id\": \"enforce-maven\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-enforcer-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0-M3\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"archive\": Object {\n              \"index\": true,\n              \"manifest\": Object {\n                \"addDefaultImplementationEntries\": true,\n                \"addDefaultSpecificationEntries\": true,\n              },\n            },\n          },\n        },\n        \"name\": \"org.apache.maven.plugins/maven-jar-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.0\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"additionalJOptions\": Object {\n              \"additionalJOption\": Array [\n                \"-J-XX:+TieredCompilation\",\n                \"-J-XX:TieredStopAtLevel=1\",\n              ],\n            },\n            \"detectJavaApiLink\": false,\n            \"failOnError\": false,\n            \"show\": \"protected\",\n          },\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"jar\",\n              ],\n              \"id\": \"attach-javadocs\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-javadoc-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.0\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"jar\",\n              ],\n              \"id\": \"attach-sources\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-source-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.1\",\n      },\n      Object {\n        \"name\": \"org.junit.jupiter/junit-jupiter-api\",\n        \"type\": \"test\",\n        \"version\": \"5.7.0\",\n      },\n      Object {\n        \"name\": \"org.junit.jupiter/junit-jupiter-engine\",\n        \"type\": \"test\",\n        \"version\": \"5.7.0\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"pom.xml\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"clobber\": Object {\n        \"condition\": \"git diff --exit-code > /dev/null\",\n        \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n        \"env\": Object {\n          \"BRANCH\": \"$(git branch --show-current)\",\n        },\n        \"name\": \"clobber\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"git checkout -b scratch\",\n            \"name\": \"save current HEAD in \\\\\"scratch\\\\\" branch\",\n          },\n          Object {\n            \"exec\": \"git checkout $BRANCH\",\n          },\n          Object {\n            \"exec\": \"git fetch origin\",\n            \"name\": \"fetch latest changes from origin\",\n          },\n          Object {\n            \"exec\": \"git reset --hard origin/$BRANCH\",\n            \"name\": \"hard reset to origin commit\",\n          },\n          Object {\n            \"exec\": \"git clean -fdx\",\n            \"name\": \"clean all untracked files\",\n          },\n          Object {\n            \"say\": \"ready to rock! (unpushed commits are under the \\\\\"scratch\\\\\" branch)\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:compile\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"env\": Object {\n          \"FILENAME\": \".projenrc.json\",\n        },\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"run-projenrc-json\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"env\": Object {\n          \"MAVEN_OPTS\": \"-XX:+TieredCompilation -XX:TieredStopAtLevel=1\",\n        },\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mkdir -p dist/java\",\n          },\n          Object {\n            \"exec\": \"mvn deploy -D=altDeploymentRepository=local::default::file:///$PWD/dist/java\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn test\",\n          },\n        ],\n      },\n    },\n  },\n  \".projenrc.json\": Object {\n    \"artifactId\": \"my-app\",\n    \"groupId\": \"org.acme\",\n    \"name\": \"my-project\",\n    \"projenrcJson\": true,\n    \"type\": \"projen.java.JavaProject\",\n    \"version\": \"0.1.0\",\n  },\n  \"README.md\": \"# replace this\",\n  \"pom.xml\": \"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-app</artifactId>\n    <version>0.1.0</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>3.0.0-M3</version>\n                <configuration>\n                    <rules>\n                        <requireMavenVersion>\n                            <version>3.6</version>\n                        </requireMavenVersion>\n                    </rules>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>enforce-maven</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <failOnError>false</failOnError>\n                    <show>protected</show>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                    <additionalJOptions>\n                        <additionalJOption>-J-XX:+TieredCompilation</additionalJOption>\n                        <additionalJOption>-J-XX:TieredStopAtLevel=1</additionalJOption>\n                    </additionalJOptions>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\",\n  \"src/main/java/org/acme/Main.java\": \"package org.acme;\n\npublic class Main {\n  public static void main(final String[] args) {\n    System.out.println(\\\\\"Hello, world!\\\\\");\n  }\n}\",\n  \"src/test/java/org/acme/MyTest.java\": \"package org.acme;\n\nimport org.junit.jupiter.api.Test;\n\npublic class MyTest {\n  @Test\n  public void testHello() {\n    System.out.println(\\\\\"Hello, world!\\\\\");\n  }\n}\",\n}\n`;\n\nexports[`projenrc-json creates node-project 1`] = `\nObject {\n  \"defaultReleaseBranch\": \"main\",\n  \"name\": \"my-project\",\n  \"projenrcJson\": true,\n  \"type\": \"projen.javascript.NodeProject\",\n}\n`;\n\nexports[`projenrc-ts creates typescript projenrc 1`] = `\n\"import { typescript } from \\\\\"projen\\\\\";\nconst project = new typescript.TypeScriptProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"my-project\\\\\",\n  projenrcTs: true,\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\"\n`;\n"
  },
  {
    "path": "test/__snapshots__/project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`generated files are commited if commitGenerated is true 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/my.txt\n\"\n`;\n\nexports[`generated files are commited if commitGenerated is undefined 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/my.txt\n\"\n`;\n\nexports[`generated files are ignored from git if commitGenerated is false 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/my.txt\n\"\n`;\n\nexports[`renovatebot: true creates renovatebot configuration 1`] = `\n\"{\n  \\\\\"labels\\\\\": [\n    \\\\\"renotate\\\\\",\n    \\\\\"dependencies\\\\\"\n  ],\n  \\\\\"schedule\\\\\": [\n    \\\\\"at any time\\\\\"\n  ],\n  \\\\\"extends\\\\\": [\n    \\\\\":preserveSemverRanges\\\\\",\n    \\\\\"config:base\\\\\",\n    \\\\\"group:allNonMajor\\\\\",\n    \\\\\"group:recommended\\\\\",\n    \\\\\"group:monorepos\\\\\"\n  ],\n  \\\\\"packageRules\\\\\": [\n    {\n      \\\\\"matchDepTypes\\\\\": [\n        \\\\\"devDependencies\\\\\"\n      ],\n      \\\\\"matchUpdateTypes\\\\\": [\n        \\\\\"patch\\\\\",\n        \\\\\"minor\\\\\"\n      ],\n      \\\\\"groupName\\\\\": \\\\\"devDependencies (non-major)\\\\\"\n    }\n  ],\n  \\\\\"ignoreDeps\\\\\": [\n    \\\\\"projen\\\\\"\n  ]\n// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n}\n\"\n`;\n"
  },
  {
    "path": "test/__snapshots__/projects.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`createProject creates a project and passes in JSON-like project options 1`] = `\n\"const { typescript } = require(\\\\\"projen\\\\\");\nconst project = new typescript.TypeScriptProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  eslintOptions: {\\\\\"dirs\\\\\":[\\\\\"src\\\\\",\\\\\"test\\\\\"],\\\\\"prettier\\\\\":true,\\\\\"aliasMap\\\\\":{\\\\\"@src\\\\\":\\\\\"./src\\\\\",\\\\\"@foo\\\\\":\\\\\"./src/foo\\\\\"}},\n  name: \\\\\"test-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\"\n`;\n\nexports[`createProject creates a project in a directory 1`] = `\n\"const { typescript } = require(\\\\\"projen\\\\\");\nconst project = new typescript.TypeScriptProject({\n  defaultReleaseBranch: \\\\\"main\\\\\",\n  name: \\\\\"test-project\\\\\",\n\n  // deps: [],                /* Runtime dependencies of this module. */\n  // description: undefined,  /* The description is just a string that helps people understand the purpose of the package. */\n  // devDeps: [],             /* Build dependencies for this module. */\n  // packageName: undefined,  /* The \\\\\"name\\\\\" in package.json. */\n});\nproject.synth();\"\n`;\n"
  },
  {
    "path": "test/__snapshots__/xml.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`simple use 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project>\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>com.myorg</groupId>\n    <artifactId>play-202101050157</artifactId>\n    <version>0.1</version>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n"
  },
  {
    "path": "test/awscdk/__snapshots__/integration-test.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`IntegrationTest tasks 1`] = `\nObject {\n  \"description\": \"assert the snapshot of integration test 'foo'\",\n  \"name\": \"integ:foo:assert\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"[ -d \\\\\"test/foo.integ.snapshot\\\\\" ] || (echo \\\\\"No snapshot available for integration test 'foo'. Run 'projen integ:foo:deploy' to capture.\\\\\" && exit 1)\",\n    },\n    Object {\n      \"exec\": \"cdk synth --app \\\\\"ts-node -P tsconfig.dev.json test/foo.integ.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata --context aws-cdk:enableDiffNoFail=true --context @aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId=true --context @aws-cdk/core:enableStackNameDuplicates=true --context @aws-cdk/core:stackRelativeExports=true --context @aws-cdk/aws-ecr-assets:dockerIgnoreSupport=true --context @aws-cdk/aws-secretsmanager:parseOwnedSecretName=true --context @aws-cdk/aws-kms:defaultKeyPolicies=true --context @aws-cdk/aws-s3:grantWriteWithoutAcl=true --context @aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount=true --context @aws-cdk/aws-rds:lowercaseDbIdentifier=true --context @aws-cdk/aws-efs:defaultEncryptionAtRest=true --context @aws-cdk/aws-lambda:recognizeVersionProps=true --context @aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021=true --context @aws-cdk/core:newStyleStackSynthesis=true -o test/.tmp/foo.integ/assert.cdk.out > /dev/null\",\n    },\n    Object {\n      \"exec\": \"diff -r -x asset.* -x cdk.out -x manifest.json -x tree.json test/foo.integ.snapshot/ test/.tmp/foo.integ/assert.cdk.out/\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest tasks 2`] = `\nObject {\n  \"description\": \"deploy integration test 'foo' and capture snapshot\",\n  \"name\": \"integ:foo:deploy\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"rm -fr test/.tmp/foo.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"cdk deploy --app \\\\\"ts-node -P tsconfig.dev.json test/foo.integ.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata --context aws-cdk:enableDiffNoFail=true --context @aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId=true --context @aws-cdk/core:enableStackNameDuplicates=true --context @aws-cdk/core:stackRelativeExports=true --context @aws-cdk/aws-ecr-assets:dockerIgnoreSupport=true --context @aws-cdk/aws-secretsmanager:parseOwnedSecretName=true --context @aws-cdk/aws-kms:defaultKeyPolicies=true --context @aws-cdk/aws-s3:grantWriteWithoutAcl=true --context @aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount=true --context @aws-cdk/aws-rds:lowercaseDbIdentifier=true --context @aws-cdk/aws-efs:defaultEncryptionAtRest=true --context @aws-cdk/aws-lambda:recognizeVersionProps=true --context @aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021=true --context @aws-cdk/core:newStyleStackSynthesis=true '**' --require-approval=never -o test/.tmp/foo.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"rm -fr test/foo.integ.snapshot\",\n    },\n    Object {\n      \"exec\": \"mv test/.tmp/foo.integ/deploy.cdk.out test/foo.integ.snapshot\",\n    },\n    Object {\n      \"spawn\": \"integ:foo:destroy\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest tasks 3`] = `\nObject {\n  \"description\": \"destroy integration test 'foo'\",\n  \"name\": \"integ:foo:destroy\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"cdk destroy --app test/foo.integ.snapshot '**' --no-version-reporting\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest tasks 4`] = `\nObject {\n  \"description\": \"update snapshot for integration test \\\\\"foo\\\\\"\",\n  \"name\": \"integ:foo:snapshot\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"cdk synth --app \\\\\"ts-node -P tsconfig.dev.json test/foo.integ.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata --context aws-cdk:enableDiffNoFail=true --context @aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId=true --context @aws-cdk/core:enableStackNameDuplicates=true --context @aws-cdk/core:stackRelativeExports=true --context @aws-cdk/aws-ecr-assets:dockerIgnoreSupport=true --context @aws-cdk/aws-secretsmanager:parseOwnedSecretName=true --context @aws-cdk/aws-kms:defaultKeyPolicies=true --context @aws-cdk/aws-s3:grantWriteWithoutAcl=true --context @aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount=true --context @aws-cdk/aws-rds:lowercaseDbIdentifier=true --context @aws-cdk/aws-efs:defaultEncryptionAtRest=true --context @aws-cdk/aws-lambda:recognizeVersionProps=true --context @aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021=true --context @aws-cdk/core:newStyleStackSynthesis=true -o test/foo.integ.snapshot > /dev/null\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest tasks 5`] = `\nObject {\n  \"description\": \"watch integration test 'foo' (without updating snapshots)\",\n  \"name\": \"integ:foo:watch\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"cdk watch --app \\\\\"ts-node -P tsconfig.dev.json test/foo.integ.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata --context aws-cdk:enableDiffNoFail=true --context @aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId=true --context @aws-cdk/core:enableStackNameDuplicates=true --context @aws-cdk/core:stackRelativeExports=true --context @aws-cdk/aws-ecr-assets:dockerIgnoreSupport=true --context @aws-cdk/aws-secretsmanager:parseOwnedSecretName=true --context @aws-cdk/aws-kms:defaultKeyPolicies=true --context @aws-cdk/aws-s3:grantWriteWithoutAcl=true --context @aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount=true --context @aws-cdk/aws-rds:lowercaseDbIdentifier=true --context @aws-cdk/aws-efs:defaultEncryptionAtRest=true --context @aws-cdk/aws-lambda:recognizeVersionProps=true --context @aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021=true --context @aws-cdk/core:newStyleStackSynthesis=true '**' -o test/.tmp/foo.integ/deploy.cdk.out\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest tasks 6`] = `\nObject {\n  \"description\": \"update snapshot for all integration tests\",\n  \"name\": \"integ:snapshot-all\",\n  \"steps\": Array [\n    Object {\n      \"spawn\": \"integ:foo:snapshot\",\n    },\n    Object {\n      \"spawn\": \"integ:bar:snapshot\",\n    },\n  ],\n}\n`;\n\nexports[`synthesizing an integration test containing a multi-stack stage 1`] = `\nObject {\n  \"description\": \"deploy integration test 'my-stage' and capture snapshot\",\n  \"name\": \"integ:my-stage:deploy\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"rm -fr test/.tmp/my-stage.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"cdk deploy --app \\\\\"ts-node -P tsconfig.dev.json test/my-stage.myinteg.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata 'my-stage/*' --require-approval=never -o test/.tmp/my-stage.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"rm -fr test/my-stage.integ.snapshot\",\n    },\n    Object {\n      \"exec\": \"mv test/.tmp/my-stage.integ/deploy.cdk.out test/my-stage.integ.snapshot\",\n    },\n    Object {\n      \"spawn\": \"integ:my-stage:destroy\",\n    },\n  ],\n}\n`;\n\nexports[`synthesizing an integration test containing a multi-stack stage 2`] = `\nObject {\n  \"description\": \"update snapshot for integration test \\\\\"my-stage\\\\\"\",\n  \"name\": \"integ:my-stage:snapshot\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"cdk synth --app \\\\\"ts-node -P tsconfig.dev.json test/my-stage.myinteg.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata -o test/my-stage.integ.snapshot > /dev/null\",\n    },\n  ],\n}\n`;\n\nexports[`synthesizing an integration test containing a multi-stack stage 3`] = `\nObject {\n  \"description\": \"watch integration test 'my-stage' (without updating snapshots)\",\n  \"name\": \"integ:my-stage:watch\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"cdk watch --app \\\\\"ts-node -P tsconfig.dev.json test/my-stage.myinteg.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata 'my-stage/*' -o test/.tmp/my-stage.integ/deploy.cdk.out\",\n    },\n  ],\n}\n`;\n\nexports[`synthesizing cdk v2 integration tests 1`] = `\nObject {\n  \"description\": \"deploy integration test 'foo' and capture snapshot\",\n  \"name\": \"integ:foo:deploy\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"rm -fr test/.tmp/foo.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"cdk deploy --app \\\\\"ts-node -P tsconfig.dev.json test/foo.integ.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata '**' --require-approval=never -o test/.tmp/foo.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"rm -fr test/foo.integ.snapshot\",\n    },\n    Object {\n      \"exec\": \"mv test/.tmp/foo.integ/deploy.cdk.out test/foo.integ.snapshot\",\n    },\n    Object {\n      \"spawn\": \"integ:foo:destroy\",\n    },\n  ],\n}\n`;\n\nexports[`synthesizing cdk v2 integration tests 2`] = `\nObject {\n  \"description\": \"update snapshot for integration test \\\\\"foo\\\\\"\",\n  \"name\": \"integ:foo:snapshot\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"cdk synth --app \\\\\"ts-node -P tsconfig.dev.json test/foo.integ.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata -o test/foo.integ.snapshot > /dev/null\",\n    },\n  ],\n}\n`;\n\nexports[`synthesizing cdk v2 integration tests 3`] = `\nObject {\n  \"description\": \"watch integration test 'foo' (without updating snapshots)\",\n  \"name\": \"integ:foo:watch\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"cdk watch --app \\\\\"ts-node -P tsconfig.dev.json test/foo.integ.ts\\\\\" --no-version-reporting --no-asset-metadata --no-path-metadata '**' -o test/.tmp/foo.integ/deploy.cdk.out\",\n    },\n  ],\n}\n`;\n"
  },
  {
    "path": "test/awscdk/__snapshots__/java-app.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`happy flow 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"app\": \"mvn exec:java --quiet -Dexec.mainClass=org.bacme.BoomApp\",\n  \"context\": Object {\n    \"@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId\": true,\n    \"@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021\": true,\n    \"@aws-cdk/aws-ecr-assets:dockerIgnoreSupport\": true,\n    \"@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount\": true,\n    \"@aws-cdk/aws-efs:defaultEncryptionAtRest\": true,\n    \"@aws-cdk/aws-kms:defaultKeyPolicies\": true,\n    \"@aws-cdk/aws-lambda:recognizeVersionProps\": true,\n    \"@aws-cdk/aws-rds:lowercaseDbIdentifier\": true,\n    \"@aws-cdk/aws-s3:grantWriteWithoutAcl\": true,\n    \"@aws-cdk/aws-secretsmanager:parseOwnedSecretName\": true,\n    \"@aws-cdk/core:enableStackNameDuplicates\": true,\n    \"@aws-cdk/core:stackRelativeExports\": true,\n    \"aws-cdk:enableDiffNoFail\": true,\n  },\n  \"output\": \"cdk.out\",\n}\n`;\n\nexports[`happy flow 2`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-app</artifactId>\n    <version>0.1.0</version>\n    <packaging>jar</packaging>\n    <name>my-app</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>3.0.0-M3</version>\n                <configuration>\n                    <rules>\n                        <requireMavenVersion>\n                            <version>3.6</version>\n                        </requireMavenVersion>\n                    </rules>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>enforce-maven</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <failOnError>false</failOnError>\n                    <show>protected</show>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                    <additionalJOptions>\n                        <additionalJOption>-J-XX:+TieredCompilation</additionalJOption>\n                        <additionalJOption>-J-XX:TieredStopAtLevel=1</additionalJOption>\n                    </additionalJOptions>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>software.amazon.awscdk</groupId>\n            <artifactId>core</artifactId>\n            <version>[1.130.0,2.0.0)</version>\n        </dependency>\n        <dependency>\n            <groupId>software.constructs</groupId>\n            <artifactId>constructs</artifactId>\n            <version>[3.2.27,4.0.0)</version>\n        </dependency>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>99.99.99</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>software.amazon.awscdk</groupId>\n            <artifactId>assertions</artifactId>\n            <version>[1.130.0,2.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`happy flow 3`] = `\n\"package org.bacme;\n\nimport org.junit.jupiter.api.Test;\n\npublic class MyTest {\n  @Test\n  public void testHello() {\n    System.out.println(\\\\\"Hello, world!\\\\\");\n  }\n}\"\n`;\n"
  },
  {
    "path": "test/awscdk/__snapshots__/lambda-extension.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`simplest LambdaExtension cdk v2 1`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport { Construct } from 'constructs';\n\n/**\n * Props for ExampleLayerVersion\n */\nexport interface ExampleLayerVersionProps extends lambda.LayerVersionOptions {\n}\n\n/**\n * Provides a Lambda Extension \\`example\\` from src/example.lambda-extension.ts\n */\nexport class ExampleLayerVersion extends lambda.LayerVersion {\n  constructor(scope: Construct, id: string, props?: ExampleLayerVersionProps) {\n    super(scope, id, {\n      description: 'Provides a Lambda Extension \\`example\\` from src/example.lambda-extension.ts',\n      ...props,\n      compatibleRuntimes: [\n        new lambda.Runtime('nodejs12.x', lambda.RuntimeFamily.NODEJS),\n        new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),\n        new lambda.Runtime('nodejs16.x', lambda.RuntimeFamily.NODEJS),\n      ],\n      code: lambda.Code.fromAsset(path.join(__dirname,\n        '../assets/example.lambda-extension')),\n    });\n  }\n}\"\n`;\n"
  },
  {
    "path": "test/awscdk/__snapshots__/lambda-function.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Edge function 1`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as cloudfront from '@aws-cdk/aws-cloudfront';\nimport * as lambda from '@aws-cdk/aws-lambda';\nimport { Construct } from '@aws-cdk/core';\n\n/**\n * Props for HelloFunction\n */\nexport interface HelloFunctionProps extends cloudfront.experimental.EdgeFunctionProps {\n}\n\n/**\n * An AWS Lambda function which executes src/hello.\n */\nexport class HelloFunction extends cloudfront.experimental.EdgeFunction {\n  constructor(scope: Construct, id: string, props?: HelloFunctionProps) {\n    super(scope, id, {\n      description: 'src/hello.edge-lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../assets/hello.edge-lambda')),\n    });\n  }\n}\"\n`;\n\nexports[`auto-discover 1`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from '@aws-cdk/aws-lambda';\nimport { Construct } from '@aws-cdk/core';\n\n/**\n * Props for HelloFunction\n */\nexport interface HelloFunctionProps extends lambda.FunctionOptions {\n}\n\n/**\n * An AWS Lambda function which executes src/hello.\n */\nexport class HelloFunction extends lambda.Function {\n  constructor(scope: Construct, id: string, props?: HelloFunctionProps) {\n    super(scope, id, {\n      description: 'src/hello.lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs12.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../assets/hello.lambda')),\n    });\n    this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\n  }\n}\"\n`;\n\nexports[`auto-discover 2`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from '@aws-cdk/aws-lambda';\nimport { Construct } from '@aws-cdk/core';\n\n/**\n * Props for WorldFunction\n */\nexport interface WorldFunctionProps extends lambda.FunctionOptions {\n}\n\n/**\n * An AWS Lambda function which executes src/subdir/world.\n */\nexport class WorldFunction extends lambda.Function {\n  constructor(scope: Construct, id: string, props?: WorldFunctionProps) {\n    super(scope, id, {\n      description: 'src/subdir/world.lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs12.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/subdir/world.lambda')),\n    });\n    this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\n  }\n}\"\n`;\n\nexports[`auto-discover 3`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from '@aws-cdk/aws-lambda';\nimport { Construct } from '@aws-cdk/core';\n\n/**\n * Props for JangyFunction\n */\nexport interface JangyFunctionProps extends lambda.FunctionOptions {\n}\n\n/**\n * An AWS Lambda function which executes src/subdir/jangy.\n */\nexport class JangyFunction extends lambda.Function {\n  constructor(scope: Construct, id: string, props?: JangyFunctionProps) {\n    super(scope, id, {\n      description: 'src/subdir/jangy.lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs12.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/subdir/jangy.lambda')),\n    });\n    this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\n  }\n}\"\n`;\n\nexports[`auto-discover 4`] = `\nObject {\n  \"description\": \"Prepare assets\",\n  \"name\": \"bundle\",\n  \"steps\": Array [\n    Object {\n      \"spawn\": \"bundle:hello.lambda\",\n    },\n    Object {\n      \"spawn\": \"bundle:subdir/jangy.lambda\",\n    },\n    Object {\n      \"spawn\": \"bundle:subdir/world.lambda\",\n    },\n  ],\n}\n`;\n\nexports[`auto-discover 5`] = `\nObject {\n  \"description\": \"Create a JavaScript bundle from src/hello.lambda.ts\",\n  \"name\": \"bundle:hello.lambda\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"esbuild --bundle src/hello.lambda.ts --target=\\\\\"node12\\\\\" --platform=\\\\\"node\\\\\" --outfile=\\\\\"assets/hello.lambda/index.js\\\\\" --external:aws-sdk\",\n    },\n  ],\n}\n`;\n\nexports[`auto-discover 6`] = `\nObject {\n  \"description\": \"Continuously update the JavaScript bundle from src/hello.lambda.ts\",\n  \"name\": \"bundle:hello.lambda:watch\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"esbuild --bundle src/hello.lambda.ts --target=\\\\\"node12\\\\\" --platform=\\\\\"node\\\\\" --outfile=\\\\\"assets/hello.lambda/index.js\\\\\" --external:aws-sdk --watch\",\n    },\n  ],\n}\n`;\n\nexports[`auto-discover 7`] = `\nObject {\n  \"description\": \"Create a JavaScript bundle from src/subdir/jangy.lambda.ts\",\n  \"name\": \"bundle:subdir/jangy.lambda\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"esbuild --bundle src/subdir/jangy.lambda.ts --target=\\\\\"node12\\\\\" --platform=\\\\\"node\\\\\" --outfile=\\\\\"assets/subdir/jangy.lambda/index.js\\\\\" --external:aws-sdk\",\n    },\n  ],\n}\n`;\n\nexports[`auto-discover 8`] = `\nObject {\n  \"description\": \"Continuously update the JavaScript bundle from src/subdir/jangy.lambda.ts\",\n  \"name\": \"bundle:subdir/jangy.lambda:watch\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"esbuild --bundle src/subdir/jangy.lambda.ts --target=\\\\\"node12\\\\\" --platform=\\\\\"node\\\\\" --outfile=\\\\\"assets/subdir/jangy.lambda/index.js\\\\\" --external:aws-sdk --watch\",\n    },\n  ],\n}\n`;\n\nexports[`auto-discover 9`] = `\nObject {\n  \"description\": \"Create a JavaScript bundle from src/subdir/world.lambda.ts\",\n  \"name\": \"bundle:subdir/world.lambda\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"esbuild --bundle src/subdir/world.lambda.ts --target=\\\\\"node12\\\\\" --platform=\\\\\"node\\\\\" --outfile=\\\\\"assets/subdir/world.lambda/index.js\\\\\" --external:aws-sdk\",\n    },\n  ],\n}\n`;\n\nexports[`auto-discover 10`] = `\nObject {\n  \"description\": \"Continuously update the JavaScript bundle from src/subdir/world.lambda.ts\",\n  \"name\": \"bundle:subdir/world.lambda:watch\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"esbuild --bundle src/subdir/world.lambda.ts --target=\\\\\"node12\\\\\" --platform=\\\\\"node\\\\\" --outfile=\\\\\"assets/subdir/world.lambda/index.js\\\\\" --external:aws-sdk --watch\",\n    },\n  ],\n}\n`;\n\nexports[`bundled function generates source code for a lambda construct 1`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from '@aws-cdk/aws-lambda';\nimport { Construct } from '@aws-cdk/core';\n\n/**\n * Props for HelloFunction\n */\nexport interface HelloFunctionProps extends lambda.FunctionOptions {\n}\n\n/**\n * An AWS Lambda function which executes src/hello.\n */\nexport class HelloFunction extends lambda.Function {\n  constructor(scope: Construct, id: string, props?: HelloFunctionProps) {\n    super(scope, id, {\n      description: 'src/hello.lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../my-assets/hello.lambda')),\n    });\n    this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\n  }\n}\"\n`;\n\nexports[`constructFile and constructName can be used to customize the generated construct 1`] = `undefined`;\n\nexports[`generates cdkv2-compatible imports 1`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport { Construct } from 'constructs';\n\n/**\n * Props for HelloFunction\n */\nexport interface HelloFunctionProps extends lambda.FunctionOptions {\n}\n\n/**\n * An AWS Lambda function which executes src/hello.\n */\nexport class HelloFunction extends lambda.Function {\n  constructor(scope: Construct, id: string, props?: HelloFunctionProps) {\n    super(scope, id, {\n      description: 'src/hello.lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../assets/hello.lambda')),\n    });\n    this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\n  }\n}\"\n`;\n\nexports[`multiple functions 1`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from '@aws-cdk/aws-lambda';\nimport { Construct } from '@aws-cdk/core';\n\n/**\n * Props for HelloFunction\n */\nexport interface HelloFunctionProps extends lambda.FunctionOptions {\n}\n\n/**\n * An AWS Lambda function which executes src/hello.\n */\nexport class HelloFunction extends lambda.Function {\n  constructor(scope: Construct, id: string, props?: HelloFunctionProps) {\n    super(scope, id, {\n      description: 'src/hello.lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../assets/hello.lambda')),\n    });\n    this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\n  }\n}\"\n`;\n\nexports[`multiple functions 2`] = `\n\"// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nimport * as path from 'path';\nimport * as lambda from '@aws-cdk/aws-lambda';\nimport { Construct } from '@aws-cdk/core';\n\n/**\n * Props for WorldFunction\n */\nexport interface WorldFunctionProps extends lambda.FunctionOptions {\n}\n\n/**\n * An AWS Lambda function which executes src/world.\n */\nexport class WorldFunction extends lambda.Function {\n  constructor(scope: Construct, id: string, props?: WorldFunctionProps) {\n    super(scope, id, {\n      description: 'src/world.lambda.ts',\n      ...props,\n      runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),\n      handler: 'index.handler',\n      code: lambda.Code.fromAsset(path.join(__dirname, '../assets/world.lambda')),\n    });\n    this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\n  }\n}\"\n`;\n"
  },
  {
    "path": "test/awscdk/__snapshots__/python-app.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`create cdk python project 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"app\": \"python app.py\",\n  \"output\": \"cdk.out\",\n  \"watch\": Object {\n    \"exclude\": Array [\n      \"README.md\",\n      \"cdk*.json\",\n      \"requirements*.txt\",\n      \"source.bat\",\n      \"**/__init__.py\",\n      \"python/__pycache__\",\n      \"tests\",\n    ],\n    \"include\": Array [\n      \"**\",\n    ],\n  },\n}\n`;\n"
  },
  {
    "path": "test/awscdk/awscdk-app.test.ts",
    "content": "import { mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { AwsCdkTypeScriptApp, LambdaRuntime } from \"../../src/awscdk\";\nimport { mkdtemp, synthSnapshot } from \"../util\";\n\ndescribe(\"cdkVersion is >= 2.0.0\", () => {\n  test('use \"aws-cdk-lib\" the constructs at ^10.0.5', () => {\n    const project = new AwsCdkTypeScriptApp({\n      cdkVersion: \"2.0.0-rc.1\",\n      defaultReleaseBranch: \"main\",\n      name: \"test\",\n    });\n    const snap = synthSnapshot(project);\n    expect(snap[\"package.json\"].dependencies).toStrictEqual({\n      \"aws-cdk-lib\": \"^2.0.0-rc.1\",\n      constructs: \"^10.0.5\",\n    });\n    expect(\n      snap[\"src/main.ts\"].indexOf(\n        \"import { App, Stack, StackProps } from 'aws-cdk-lib'\"\n      )\n    ).not.toEqual(-1);\n  });\n\n  test(\"empty context\", () => {\n    const project = new AwsCdkTypeScriptApp({\n      cdkVersion: \"2.0.0-rc.1\",\n      defaultReleaseBranch: \"main\",\n      name: \"test\",\n    });\n    const snap = synthSnapshot(project);\n    expect(snap[\"cdk.json\"].context).toBeUndefined();\n  });\n});\n\ndescribe(\"lambda functions\", () => {\n  test(\"are auto-discovered by default\", () => {\n    // GIVEN\n    const outdir = mkdtemp();\n    mkdirSync(join(outdir, \"src\"));\n    writeFileSync(join(outdir, \"src\", \"my.lambda.ts\"), \"// dummy\");\n\n    const project = new AwsCdkTypeScriptApp({\n      name: \"hello\",\n      outdir: outdir,\n      defaultReleaseBranch: \"main\",\n      cdkVersion: \"1.100.0\",\n      libdir: \"liblib\",\n      lambdaOptions: {\n        runtime: LambdaRuntime.NODEJS_10_X,\n        bundlingOptions: {\n          externals: [\"foo\", \"bar\"],\n        },\n      },\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\"src/my-function.ts\"]).not.toBeUndefined();\n    expect(\n      snapshot[\".projen/tasks.json\"].tasks[\"bundle:my.lambda\"].steps\n    ).toStrictEqual([\n      {\n        exec: 'esbuild --bundle src/my.lambda.ts --target=\"node10\" --platform=\"node\" --outfile=\"assets/my.lambda/index.js\" --external:foo --external:bar',\n      },\n    ]);\n  });\n\n  test(\"auto-discover can be disabled\", () => {\n    // GIVEN\n    const project = new AwsCdkTypeScriptApp({\n      name: \"hello\",\n      defaultReleaseBranch: \"main\",\n      cdkVersion: \"1.100.0\",\n      lambdaAutoDiscover: false,\n    });\n\n    // WHEN\n    mkdirSync(join(project.outdir, project.srcdir));\n    writeFileSync(\n      join(project.outdir, project.srcdir, \"my.lambda.ts\"),\n      \"// dummy\"\n    );\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\"src/my-function.ts\"]).toBeUndefined();\n    expect(\n      snapshot[\".projen/tasks.json\"].tasks[\"bundle:src/my\"]\n    ).toBeUndefined();\n  });\n});\n\ndescribe(\"synth\", () => {\n  let project: AwsCdkTypeScriptApp;\n  let files: Record<string, any>;\n\n  beforeEach(() => {\n    project = new AwsCdkTypeScriptApp({\n      name: \"hello\",\n      defaultReleaseBranch: \"main\",\n      cdkVersion: \"1.100.0\",\n    });\n\n    files = synthSnapshot(project);\n  });\n\n  it('adds a \"synth\" task', () => {\n    expect(files[\".projen/tasks.json\"].tasks.synth).toStrictEqual({\n      name: \"synth\",\n      description: \"Synthesizes your cdk app into cdk.out\",\n      steps: [{ exec: \"cdk synth\" }],\n    });\n  });\n\n  it('adds a \"synth:silent\" task', () => {\n    expect(files[\".projen/tasks.json\"].tasks[\"synth:silent\"]).toStrictEqual({\n      name: \"synth:silent\",\n      description:\n        'Synthesizes your cdk app into cdk.out and suppresses the template in stdout (part of \"yarn build\")',\n      steps: [{ exec: \"cdk synth -q\" }],\n    });\n  });\n\n  it('spawns a \"synth:silent\" post-compile task', () => {\n    expect(\n      files[\".projen/tasks.json\"].tasks[\"post-compile\"].steps\n    ).toStrictEqual([{ spawn: \"synth:silent\" }]);\n  });\n});\n\ndescribe(\"watch\", () => {\n  let project: AwsCdkTypeScriptApp;\n  let files: Record<string, any>;\n\n  beforeEach(() => {\n    project = new AwsCdkTypeScriptApp({\n      name: \"hello\",\n      defaultReleaseBranch: \"main\",\n      cdkVersion: \"1.100.0\",\n    });\n\n    files = synthSnapshot(project);\n  });\n\n  it('adds a \"watch\" task', () => {\n    expect(files[\".projen/tasks.json\"].tasks.watch).toStrictEqual({\n      name: \"watch\",\n      description:\n        \"Watches changes in your source code and rebuilds and deploys to the current account\",\n      steps: [{ exec: \"cdk deploy --hotswap\" }, { exec: \"cdk watch\" }],\n    });\n  });\n\n  it('configures the \"build\" option in cdk.json to bundle lambda functions', () => {\n    expect(files[\"cdk.json\"].build).toStrictEqual(\"npx projen bundle\");\n  });\n\n  it('removes the \"bundle\" task from pre-compile', () => {\n    expect(\n      files[\".projen/tasks.json\"].tasks[\"pre-compile\"].steps\n    ).toBeUndefined();\n  });\n});\n\ntest(\"CDK v1 usage\", () => {\n  const project = new AwsCdkTypeScriptApp({\n    cdkVersion: \"1.126.0\",\n    defaultReleaseBranch: \"main\",\n    name: \"test\",\n  });\n\n  const snap = synthSnapshot(project);\n  expect(snap[\"package.json\"].dependencies).toStrictEqual({\n    \"@aws-cdk/core\": \"^1.126.0\",\n    constructs: \"^3.2.27\",\n  });\n});\n"
  },
  {
    "path": "test/awscdk/awscdk-construct.test.ts",
    "content": "import { mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport * as YAML from \"yaml\";\nimport { awscdk, LogLevel, Testing } from \"../../src\";\nimport {\n  AwsCdkConstructLibrary,\n  AwsCdkConstructLibraryOptions,\n} from \"../../src/awscdk\";\nimport { NpmAccess } from \"../../src/javascript\";\nimport { mkdtemp, synthSnapshot } from \"../util\";\n\ndescribe(\"constructs dependency selection\", () => {\n  test(\"user-selected\", () => {\n    // GIVEN\n    const project = new TestProject({\n      cdkVersion: \"1.100.0\",\n      constructsVersion: \"3.1337.0-ultimate\",\n    });\n\n    // WHEN\n    const snapshot = synthSnapshot(project);\n\n    // THEN\n    expect(snapshot[\"package.json\"]?.peerDependencies?.constructs).toBe(\n      \"^3.1337.0-ultimate\"\n    );\n    expect(\n      snapshot[\"package.json\"]?.devDependencies?.constructs\n    ).toBeUndefined();\n    expect(snapshot[\"package.json\"]?.dependencies?.constructs).toBeUndefined();\n  });\n\n  test(\"for cdk 1.x\", () => {\n    // GIVEN\n    const project = new TestProject({ cdkVersion: \"1.112.0\" });\n\n    // WHEN\n    const snapshot = synthSnapshot(project);\n\n    // THEN\n    expect(snapshot[\"package.json\"]?.peerDependencies?.constructs).toMatch(\n      /^\\^3\\./\n    );\n    expect(\n      snapshot[\"package.json\"]?.devDependencies?.constructs\n    ).toBeUndefined();\n    expect(\n      snapshot[\"package.json\"]?.devDependencies[\"@aws-cdk/assertions\"]\n    ).toStrictEqual(\"^1.112.0\");\n    expect(\n      snapshot[\"package.json\"]?.devDependencies[\"@aws-cdk/assert\"]\n    ).toStrictEqual(\"^1.112.0\");\n    expect(snapshot[\"package.json\"]?.dependencies?.constructs).toBeUndefined();\n  });\n\n  // assertions library is only available since 1.111.0\n  test(\"for cdk 1.x < 1.111.0\", () => {\n    // GIVEN\n    const project = new TestProject({ cdkVersion: \"1.110.0\" });\n\n    // WHEN\n    const snapshot = synthSnapshot(project);\n\n    // THEN\n    expect(\n      snapshot[\"package.json\"]?.devDependencies[\"@aws-cdk/assertions\"]\n    ).toBeUndefined();\n    expect(\n      snapshot[\"package.json\"]?.devDependencies[\"@aws-cdk/assert\"]\n    ).toStrictEqual(\"^1.110.0\");\n  });\n\n  test(\"for cdk 2.x\", () => {\n    // GIVEN\n    const project = new TestProject({ cdkVersion: \"2.0.0-alpha.5\" });\n\n    // WHEN\n    const snapshot = synthSnapshot(project);\n\n    // THEN\n    expect(snapshot[\"package.json\"]?.peerDependencies?.constructs).toMatch(\n      /^\\^10./\n    );\n    expect(snapshot[\"package.json\"]?.peerDependencies[\"aws-cdk-lib\"]).toMatch(\n      /^\\^2./\n    );\n    expect(snapshot[\"package.json\"]?.devDependencies?.constructs).toMatch(\n      /^10./\n    );\n    expect(snapshot[\"package.json\"]?.devDependencies[\"aws-cdk-lib\"]).toMatch(\n      /^2./\n    );\n    expect(\n      snapshot[\"package.json\"]?.devDependencies[\"@aws-cdk/assertions\"]\n    ).toBeUndefined();\n    expect(snapshot[\"package.json\"]?.dependencies?.constructs).toBeUndefined();\n  });\n\n  test(\"for cdk 2.x, throws if incorrect constructsVersion provided\", () => {\n    expect(\n      () =>\n        new TestProject({\n          cdkVersion: \"2.0.0-alpha.5\",\n          constructsVersion: \"3.2.27\",\n        })\n    ).toThrow(/CDK 2.x requires constructs 10.x/);\n  });\n\n  test(\"for cdk 2.x, throws if cdkDependencies provided\", () => {\n    expect(\n      () =>\n        new TestProject({\n          cdkVersion: \"2.0.0-alpha.5\",\n          cdkDependencies: [\"@aws-cdk/aws-lambda\"],\n        })\n    ).toThrow(\n      /cdkDependencies is not used for CDK 2.x. Use \"peerDeps\" or \"deps\" instead/\n    );\n  });\n\n  test(\"for cdk 2.x, throws if cdkTestDependencies provided\", () => {\n    expect(\n      () =>\n        new TestProject({\n          cdkVersion: \"2.0.0-alpha.5\",\n          cdkTestDependencies: [\"@aws-cdk/aws-lambda\"],\n        })\n    ).toThrow(\n      /cdkTestDependencies is not used for CDK 2.x. Use \"devDeps\" or \"testDeps\" instead/\n    );\n  });\n\n  test(\"for cdk 2.x, throws if cdkDependenciesAsDeps provided\", () => {\n    expect(\n      () =>\n        new TestProject({\n          cdkVersion: \"2.0.0-alpha.5\",\n          cdkDependenciesAsDeps: true,\n        })\n    ).toThrow(/cdkDependenciesAsDeps is not used for CDK 2.x/);\n  });\n\n  test(\"for cdk 2.x, throws if cdkAssert provided\", () => {\n    expect(\n      () =>\n        new TestProject({\n          cdkVersion: \"2.0.0-alpha.5\",\n          cdkAssert: true,\n        })\n    ).toThrow(\n      /cdkAssert is not used for CDK 2.x. Use the assertions library that is provided in aws-cdk-lib/\n    );\n  });\n\n  test(\"for cdk 3.x (does not exist yet)\", () => {\n    // GIVEN\n    expect(() => new TestProject({ cdkVersion: \"3.1337.42\" })).toThrow(\n      /Unsupported AWS CDK major version 3\\.x/\n    );\n  });\n});\n\ndescribe(\"lambda functions\", () => {\n  test(\"are auto-discovered by default\", () => {\n    // GIVEN\n    const outdir = mkdtemp();\n    mkdirSync(join(outdir, \"src\"));\n    writeFileSync(join(outdir, \"src\", \"my.lambda.ts\"), \"// dummy\");\n\n    const project = new TestProject({\n      cdkVersion: \"1.100.0\",\n      libdir: \"liblib\",\n      outdir: outdir,\n      bundlerOptions: {\n        assetsDir: \"resources\",\n      },\n      lambdaOptions: {\n        runtime: awscdk.LambdaRuntime.NODEJS_10_X,\n        bundlingOptions: {\n          externals: [\"foo\", \"bar\"],\n          sourcemap: true,\n        },\n      },\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\"src/my-function.ts\"]).not.toBeUndefined();\n    expect(\n      snapshot[\".projen/tasks.json\"].tasks[\"bundle:my.lambda\"].steps\n    ).toStrictEqual([\n      {\n        exec: 'esbuild --bundle src/my.lambda.ts --target=\"node10\" --platform=\"node\" --outfile=\"resources/my.lambda/index.js\" --external:foo --external:bar --sourcemap',\n      },\n    ]);\n  });\n\n  test(\"auto-discover can be disabled\", () => {\n    // GIVEN\n    const project = new TestProject({\n      cdkVersion: \"1.100.0\",\n      lambdaAutoDiscover: false,\n    });\n\n    // WHEN\n    mkdirSync(join(project.outdir, project.srcdir));\n    writeFileSync(\n      join(project.outdir, project.srcdir, \"my.lambda.ts\"),\n      \"// dummy\"\n    );\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\"src/my-function.ts\"]).toBeUndefined();\n    expect(snapshot[\".projen/tasks.json\"].tasks[\"bundle:my\"]).toBeUndefined();\n  });\n});\n\ndescribe(\"workflow container image\", () => {\n  it(\"uses jsii/superchain:1-buster-slim for cdk v1\", () => {\n    const project = new TestProject({ cdkVersion: \"1.100.0\" });\n    const snapshot = synthSnapshot(project);\n    const buildWorkflow = YAML.parse(snapshot[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.jobs.build.container.image).toStrictEqual(\n      \"jsii/superchain:1-buster-slim\"\n    );\n  });\n\n  it(\"uses jsii/superchain:1-buster-slim-node14 for cdk v2\", () => {\n    const project = new TestProject({ cdkVersion: \"2.12.0\" });\n    const snapshot = synthSnapshot(project);\n    const buildWorkflow = YAML.parse(snapshot[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.jobs.build.container.image).toStrictEqual(\n      \"jsii/superchain:1-buster-slim-node14\"\n    );\n  });\n\n  it(\"uses the user-defined image if specified\", () => {\n    const project = new TestProject({\n      cdkVersion: \"2.12.0\",\n      workflowContainerImage: \"my-custom-image\",\n    });\n    const snapshot = synthSnapshot(project);\n    const buildWorkflow = YAML.parse(snapshot[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.jobs.build.container.image).toStrictEqual(\n      \"my-custom-image\"\n    );\n  });\n});\n\nit(\"warns the user if they add CDK v1 dependencies to a CDK v2 project\", () => {\n  // GIVEN\n  console.error = jest.fn();\n  const project = new TestProject({\n    cdkVersion: \"2.12.0\",\n    deps: [\n      \"@aws-cdk/core\",\n      \"@aws-cdk/aws-s3\",\n      \"@aws-cdk/cfnspec\",\n      \"@aws-cdk/aws-apigatewayv2-alpha@2.25.0-alpha.0\",\n    ],\n    logging: {\n      level: LogLevel.VERBOSE,\n    },\n  });\n\n  // WHEN\n  Testing.synth(project);\n\n  // THEN\n  expect(console.error).toHaveBeenCalledWith(\n    expect.stringContaining(\n      `WARNING: Found CDK v1 deps in your project, even though your \"cdkVersion\" is 2.x: [@aws-cdk/aws-s3, @aws-cdk/core].`\n    )\n  );\n});\n\nconst defaultOptions = {\n  author: \"Nobody\",\n  authorAddress: \"nobody@nowhere.com\",\n  clobber: false,\n  defaultReleaseBranch: \"main\",\n  jest: false,\n  name: \"test-project\",\n  npmAccess: NpmAccess.PUBLIC,\n  repositoryUrl: \"https://github.com/projen/projen.git\",\n} as const;\n\nclass TestProject extends AwsCdkConstructLibrary {\n  constructor(\n    options: Omit<AwsCdkConstructLibraryOptions, keyof typeof defaultOptions>\n  ) {\n    super({\n      ...defaultOptions,\n      ...options,\n    });\n  }\n}\n"
  },
  {
    "path": "test/awscdk/cdk-config.test.ts",
    "content": "import { CdkConfig } from \"../../src/awscdk/cdk-config\";\nimport { TestProject } from \"../util\";\n\ndescribe(\"context values\", () => {\n  test(\"issue #1349\", () => {\n    new CdkConfig(new TestProject(), {\n      app: \"foo\",\n      context: {\n        \"@aws-cdk/aws-ecr-assets:dockerIgnoreSupport\": true,\n      },\n    });\n\n    new CdkConfig(new TestProject(), {\n      app: \"foo\",\n      context: {\n        \"@aws-cdk/aws-ecr-assets:dockerIgnoreSupport\": \"true\",\n      },\n    });\n  });\n});\n\ndescribe(\"includes\", () => {\n  test(\"should retain their initialized value\", () => {\n    const defaultIncludes = [\"src/**/*.ts\", \"test/**/*.ts\"];\n    const config = new CdkConfig(new TestProject(), {\n      app: \"test includes\",\n      watchIncludes: defaultIncludes,\n    });\n\n    expect(config.include).toEqual(defaultIncludes);\n  });\n\n  test(\"should contain updated values when `addIncludes` is called\", () => {\n    const defaultIncludes = [\"src/**/*.ts\", \"test/**/*.ts\"];\n    const newInclude = \"custom/**/*.ts\";\n    const config = new CdkConfig(new TestProject(), {\n      app: \"test includes\",\n      watchIncludes: defaultIncludes,\n    });\n\n    config.addIncludes(newInclude);\n\n    expect(config.include).toContain(newInclude);\n    expect(config.include).toContain(defaultIncludes[0]);\n  });\n\n  test(\"should accept multiple values on `addIncludes`\", () => {\n    const newIncludes = [\"value-one.ts\", \"value-two.ts\"];\n    const config = new CdkConfig(new TestProject(), {\n      app: \"test includes multi value\",\n    });\n\n    config.addIncludes(...newIncludes);\n\n    expect(config.include).toEqual(newIncludes);\n  });\n});\n\ndescribe(\"excludes\", () => {\n  test(\"should retain their initialized value\", () => {\n    const defaultExcludes = [\"README.md\"];\n    const config = new CdkConfig(new TestProject(), {\n      app: \"test excludes\",\n      watchExcludes: defaultExcludes,\n    });\n\n    expect(config.exclude).toEqual(defaultExcludes);\n  });\n\n  test(\"should contain updated values when `addExcludes` is called\", () => {\n    const defaultExcludes = [\"README.md\"];\n    const newExclude = \"node_modules\";\n    const config = new CdkConfig(new TestProject(), {\n      app: \"test excludes\",\n      watchExcludes: defaultExcludes,\n    });\n\n    config.addExcludes(newExclude);\n\n    expect(config.exclude).toContain(newExclude);\n    expect(config.exclude).toContain(defaultExcludes[0]);\n  });\n\n  test(\"should accept multiple values on `addExcludes`\", () => {\n    const newExcludes = [\"node_modules\", \"README.md\"];\n    const config = new CdkConfig(new TestProject(), {\n      app: \"test excludes multi value\",\n    });\n\n    config.addExcludes(...newExcludes);\n\n    expect(config.exclude).toEqual(newExcludes);\n  });\n});\n"
  },
  {
    "path": "test/awscdk/integration-test.test.ts",
    "content": "import { awscdk, DependencyType } from \"../../src\";\nimport { IntegrationTest } from \"../../src/awscdk\";\nimport { AwsCdkDepsJs } from \"../../src/awscdk/awscdk-deps-js\";\nimport { Testing } from \"../../src/testing\";\nimport { TypeScriptProject } from \"../../src/typescript\";\n\ndescribe(\"IntegrationTest\", () => {\n  // GIVEN\n  const project = new awscdk.AwsCdkTypeScriptApp({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    cdkVersion: \"1.134.0\",\n  });\n\n  // WHEN\n  new awscdk.IntegrationTest(project, {\n    entrypoint: \"test/foo.integ.ts\",\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: project.cdkDeps,\n  });\n\n  new awscdk.IntegrationTest(project, {\n    entrypoint: \"test/bar.integ.ts\",\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: project.cdkDeps,\n  });\n\n  // THEN\n  const output = Testing.synth(project);\n\n  // we expect .npmignore to exclude the integration test's cdkout directory\n  // and the various temporary directories created during execution.\n  test(\"npmignore\", () => {\n    [\"test/.tmp\", \"test/foo.integ.snapshot\"].forEach((i) =>\n      expect(output[\".npmignore\"]).toContain(i)\n    );\n  });\n\n  // exclude cloud assembly manifests and assets from\n  // resulting assembly (as well as nested assemblies)\n  // but include cloudformation templates.\n  test(\"gitignore\", () => {\n    [\n      \"test/foo.integ.snapshot/asset.*\",\n      \"test/foo.integ.snapshot/**/asset.*\",\n      \"test/foo.integ.snapshot/cdk.out\",\n      \"test/foo.integ.snapshot/**/cdk.out\",\n      \"test/foo.integ.snapshot/manifest.json\",\n      \"test/foo.integ.snapshot/**/manifest.json\",\n      \"test/foo.integ.snapshot/tree.json\",\n      \"test/foo.integ.snapshot/**/tree.json\",\n      \"test/.tmp\",\n    ].forEach((i) => expect(output[\".gitignore\"]).toContain(i));\n  });\n\n  test(\"tasks\", () => {\n    // list of expected tasks\n    const expectedTaskNames = [\n      \"integ:foo:assert\",\n      \"integ:foo:deploy\",\n      \"integ:foo:destroy\",\n      \"integ:foo:snapshot\",\n      \"integ:foo:watch\",\n      \"integ:snapshot-all\",\n    ];\n\n    const actualTaskNames = Object.keys(output[\".projen/tasks.json\"].tasks);\n    for (const t of expectedTaskNames) {\n      expect(actualTaskNames).toContain(t);\n      expect(output[\".projen/tasks.json\"].tasks[t]).toMatchSnapshot();\n    }\n  });\n});\n\ntest(\"installs ts-node if needed\", () => {\n  const project = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new IntegrationTest(project, {\n    entrypoint: \"test/foo.integ.ts\",\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: new AwsCdkDepsJs(project, {\n      cdkVersion: \"1.0.0\",\n      dependencyType: DependencyType.RUNTIME,\n    }),\n  });\n\n  expect(project.deps.getDependency(\"ts-node\")).toStrictEqual({\n    name: \"ts-node\",\n    type: \"build\",\n  });\n});\n\ntest(\"installs aws-cdk v1 if needed\", () => {\n  const project = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new IntegrationTest(project, {\n    entrypoint: \"test/foo.integ.ts\",\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: new AwsCdkDepsJs(project, {\n      cdkVersion: \"1.0.0\",\n      dependencyType: DependencyType.RUNTIME,\n    }),\n  });\n\n  expect(project.deps.getDependency(\"aws-cdk\")).toStrictEqual({\n    name: \"aws-cdk\",\n    type: \"build\",\n    version: \"^1\",\n  });\n});\n\ntest(\"installs aws-cdk v2 if needed\", () => {\n  const project = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new IntegrationTest(project, {\n    entrypoint: \"test/foo.integ.ts\",\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: new AwsCdkDepsJs(project, {\n      cdkVersion: \"2.8.0\",\n      dependencyType: DependencyType.RUNTIME,\n    }),\n  });\n\n  expect(project.deps.getDependency(\"aws-cdk\")).toStrictEqual({\n    name: \"aws-cdk\",\n    type: \"build\",\n    version: \"^2\",\n  });\n});\n\ntest(\"synthesizing cdk v2 integration tests\", () => {\n  // GIVEN\n  const project = new awscdk.AwsCdkTypeScriptApp({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    cdkVersion: \"2.3.1\",\n  });\n\n  // WHEN\n  new awscdk.IntegrationTest(project, {\n    entrypoint: \"test/foo.integ.ts\",\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: project.cdkDeps,\n  });\n\n  // THEN\n  const output = Testing.synth(project);\n\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:foo:deploy\"]\n  ).toMatchSnapshot();\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:foo:snapshot\"]\n  ).toMatchSnapshot();\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:foo:watch\"]\n  ).toMatchSnapshot();\n});\n\ntest(\"synthesizing an integration test containing a multi-stack stage\", () => {\n  // GIVEN\n  const project = new awscdk.AwsCdkTypeScriptApp({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    cdkVersion: \"2.3.1\",\n  });\n\n  // WHEN\n  new awscdk.IntegrationTest(project, {\n    name: \"my-stage\",\n    entrypoint: \"test/my-stage.myinteg.ts\",\n    stacks: [\"my-stage/*\"],\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: project.cdkDeps,\n  });\n\n  // THEN\n  const output = Testing.synth(project);\n\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:my-stage:deploy\"]\n  ).toMatchSnapshot();\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:my-stage:snapshot\"]\n  ).toMatchSnapshot();\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:my-stage:watch\"]\n  ).toMatchSnapshot();\n});\n\ntest(\"enabling path metadata\", () => {\n  // GIVEN\n  const project = new awscdk.AwsCdkTypeScriptApp({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    cdkVersion: \"2.3.1\",\n  });\n\n  // WHEN\n  new awscdk.IntegrationTest(project, {\n    name: \"my-stage\",\n    entrypoint: \"test/my-stage.myinteg.ts\",\n    stacks: [\"my-stage/*\"],\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: project.cdkDeps,\n    pathMetadata: true,\n  });\n\n  // THEN\n  const output = Testing.synth(project);\n\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:my-stage:deploy\"].steps\n  ).not.toEqual(\n    expect.arrayContaining([\n      { exec: expect.stringContaining(\"--no-path-metadata\") },\n    ])\n  );\n\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:my-stage:snapshot\"].steps\n  ).not.toEqual(\n    expect.arrayContaining([\n      { exec: expect.stringContaining(\"--no-path-metadata\") },\n    ])\n  );\n\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"integ:my-stage:watch\"].steps\n  ).not.toEqual(\n    expect.arrayContaining([\n      { exec: expect.stringContaining(\"--no-path-metadata\") },\n    ])\n  );\n});\n"
  },
  {
    "path": "test/awscdk/java-app.test.ts",
    "content": "import * as xml from \"xmlbuilder2\";\nimport { awscdk } from \"../../src\";\nimport { Testing } from \"../../src/testing\";\n\ntest(\"happy flow\", () => {\n  const p = new awscdk.AwsCdkJavaApp({\n    artifactId: \"my-app\",\n    groupId: \"org.acme\",\n    cdkVersion: \"1.130.0\",\n    mainClass: \"org.bacme.BoomApp\",\n    name: \"my-app\",\n    version: \"0.1.0\",\n  });\n\n  const snapshot = Testing.synth(p);\n  expect(Object.keys(snapshot)).toStrictEqual([\n    \".gitattributes\",\n    \".github/workflows/pull-request-lint.yml\",\n    \".gitignore\",\n    \".projen/deps.json\",\n    \".projen/files.json\",\n    \".projen/tasks.json\",\n    \"cdk.json\",\n    \"pom.xml\",\n    \"README.md\",\n    \"src/main/java/org/bacme/BoomApp.java\",\n    \"src/test/java/org/bacme/MyTest.java\",\n  ]);\n  expect(snapshot[\"cdk.json\"]).toMatchSnapshot();\n  expect(snapshot[\"pom.xml\"]).toMatchSnapshot();\n  expect(snapshot[\"src/test/java/org/bacme/MyTest.java\"]).toMatchSnapshot();\n  expect(snapshot[\"cdk.json\"].app).toStrictEqual(\n    \"mvn exec:java --quiet -Dexec.mainClass=org.bacme.BoomApp\"\n  );\n});\n\ntest(\"mainClass\", () => {\n  const p = new awscdk.AwsCdkJavaApp({\n    artifactId: \"my-app\",\n    groupId: \"org.acme\",\n    cdkVersion: \"1.130.0\",\n    mainClass: \"org.acme.jojo.MyApp\",\n    name: \"my-app\",\n    version: \"0.1.0\",\n  });\n\n  const snapshot = Testing.synth(p);\n  expect(snapshot[\"cdk.json\"].app).toStrictEqual(\n    \"mvn exec:java --quiet -Dexec.mainClass=org.acme.jojo.MyApp\"\n  );\n});\n\ntest(\"deps\", () => {\n  const p = new awscdk.AwsCdkJavaApp({\n    artifactId: \"my-app\",\n    groupId: \"org.acme\",\n    cdkVersion: \"1.120.0\",\n    mainClass: \"org.acme.jojo.MyApp\",\n    name: \"my-app\",\n    version: \"0.1.0\",\n    cdkDependencies: [\n      \"software.amazon.awscdk/aws-lambda\",\n      \"software.amazon.awscdk/aws-sns\",\n    ],\n  });\n\n  p.addCdkDependency(\"software.amazon.awscdk/aws-sqs\");\n\n  const snapshot = Testing.synth(p);\n  const pom = JSON.parse(\n    xml.convert(snapshot[\"pom.xml\"], {\n      format: \"json\",\n    })\n  );\n\n  expect(\n    pom.project.dependencies.dependency.filter(\n      (d: any) => d.groupId === \"software.amazon.awscdk\"\n    )\n  ).toStrictEqual([\n    {\n      artifactId: \"aws-lambda\",\n      groupId: \"software.amazon.awscdk\",\n      version: \"[1.120.0,2.0.0)\",\n    },\n    {\n      artifactId: \"aws-sns\",\n      groupId: \"software.amazon.awscdk\",\n      version: \"[1.120.0,2.0.0)\",\n    },\n    {\n      artifactId: \"aws-sqs\",\n      groupId: \"software.amazon.awscdk\",\n      version: \"[1.120.0,2.0.0)\",\n    },\n    {\n      artifactId: \"core\",\n      groupId: \"software.amazon.awscdk\",\n      version: \"[1.120.0,2.0.0)\",\n    },\n    {\n      artifactId: \"assertions\",\n      groupId: \"software.amazon.awscdk\",\n      version: \"[1.120.0,2.0.0)\",\n      scope: \"test\",\n    },\n  ]);\n\n  expect(\n    pom.project.dependencies.dependency.filter(\n      (d: any) => d.groupId === \"software.constructs\"\n    )\n  ).toStrictEqual([\n    {\n      artifactId: \"constructs\",\n      groupId: \"software.constructs\",\n      version: \"[3.2.27,4.0.0)\",\n    },\n  ]);\n});\n\ntest(\"deps cdkv2\", () => {\n  const p = new awscdk.AwsCdkJavaApp({\n    artifactId: \"my-app\",\n    groupId: \"org.acme\",\n    cdkVersion: \"2.3.0\",\n    mainClass: \"org.acme.jojo.MyApp\",\n    name: \"my-app\",\n    version: \"0.1.0\",\n  });\n\n  const snapshot = Testing.synth(p);\n  const pom = JSON.parse(\n    xml.convert(snapshot[\"pom.xml\"], {\n      format: \"json\",\n    })\n  );\n\n  expect(\n    pom.project.dependencies.dependency.filter(\n      (d: any) => d.groupId === \"software.amazon.awscdk\"\n    )\n  ).toStrictEqual([\n    {\n      artifactId: \"aws-cdk-lib\",\n      groupId: \"software.amazon.awscdk\",\n      version: \"[2.3.0,3.0.0)\",\n    },\n  ]);\n\n  expect(\n    pom.project.dependencies.dependency.filter(\n      (d: any) => d.groupId === \"software.constructs\"\n    )\n  ).toStrictEqual([\n    {\n      artifactId: \"constructs\",\n      groupId: \"software.constructs\",\n      version: \"[10.0.5,11.0.0)\",\n    },\n  ]);\n});\n\ntest(\"can disable sample code\", () => {\n  const p = new awscdk.AwsCdkJavaApp({\n    artifactId: \"my-app\",\n    groupId: \"org.acme\",\n    cdkVersion: \"1.120.0\",\n    mainClass: \"org.acme.jojo.MyApp\",\n    sampleJavaPackage: \"org.acme\",\n    sample: false,\n    name: \"my-app\",\n    version: \"0.1.0\",\n  });\n\n  const snapshot = Testing.synth(p);\n\n  expect(Object.keys(snapshot)).not.toContain(\n    \"src/main/java/org/acme/jojo/MyApp.java\"\n  );\n});\n"
  },
  {
    "path": "test/awscdk/lambda-extension.test.ts",
    "content": "import { DependencyType, Testing } from \"../../src\";\nimport {\n  AwsCdkDeps,\n  AwsCdkDepsJs,\n  LambdaExtension,\n  LambdaRuntime,\n} from \"../../src/awscdk\";\nimport { TypeScriptProject } from \"../../src/typescript\";\n\ntest(\"simplest LambdaExtension cdk v2\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  // WHEN\n  new LambdaExtension(project, {\n    cdkDeps: cdkDepsForProject(project, \"2.1.0\"),\n    entrypoint: \"src/example.lambda-extension.ts\",\n  });\n\n  // THEN\n  const snapshot = Testing.synth(project);\n\n  const tasks = snapshot[\".projen/tasks.json\"].tasks;\n  const bundleTaskExec = tasks[\"bundle:example.lambda-extension\"].steps[0].exec;\n\n  expect(bundleTaskExec).toContain(\n    // Outputs `extensions/${name}` dir\n    '--outfile=\"assets/example.lambda-extension/extensions/example\"'\n  );\n  expect(bundleTaskExec).toContain(\n    // aws-sdk is external\n    \"--external:aws-sdk\"\n  );\n  expect(bundleTaskExec).toContain(\n    // Supports node12\n    '--target=\"node12\"'\n  );\n\n  const generatedSource = snapshot[\"src/example-layer-version.ts\"];\n  expect(generatedSource).toContain(\n    [\n      \"import * as lambda from 'aws-cdk-lib/aws-lambda';\",\n      \"import { Construct } from 'constructs';\",\n    ].join(\"\\n\")\n  );\n  expect(generatedSource).toContain(\n    \"export interface ExampleLayerVersionProps\"\n  );\n  expect(generatedSource).toContain(\"export class ExampleLayerVersion\");\n  expect(generatedSource).toContain(\n    \"new lambda.Runtime('nodejs12.x', lambda.RuntimeFamily.NODEJS)\"\n  );\n  expect(generatedSource).toContain(\n    \"new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS)\"\n  );\n  expect(generatedSource).toMatchSnapshot();\n});\n\ntest(\"simplest LambdaExtension cdk v1\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  // WHEN\n  new LambdaExtension(project, {\n    cdkDeps: cdkDepsForProject(project),\n    entrypoint: \"src/example.lambda-extension.ts\",\n  });\n\n  // THEN\n  const snapshot = Testing.synth(project);\n\n  const generatedSource = snapshot[\"src/example-layer-version.ts\"];\n  expect(generatedSource).toContain(\n    [\n      \"import * as lambda from '@aws-cdk/aws-lambda';\",\n      \"import { Construct } from '@aws-cdk/core';\",\n    ].join(\"\\n\")\n  );\n});\n\ntest(\"changing compatible runtimes\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  // WHEN\n  new LambdaExtension(project, {\n    cdkDeps: cdkDepsForProject(project),\n    entrypoint: \"src/example.lambda-extension.ts\",\n    compatibleRuntimes: [\n      LambdaRuntime.NODEJS_14_X,\n      LambdaRuntime.NODEJS_12_X,\n      LambdaRuntime.NODEJS_10_X,\n    ],\n  });\n\n  // THEN\n  const snapshot = Testing.synth(project);\n\n  const bundleTaskExec =\n    snapshot[\".projen/tasks.json\"].tasks[\"bundle:example.lambda-extension\"]\n      .steps[0].exec;\n\n  expect(bundleTaskExec).toContain(\n    // It picked the lowest compatible runtime\n    '--target=\"node10\"'\n  );\n\n  const generatedSource = snapshot[\"src/example-layer-version.ts\"];\n  expect(generatedSource).toContain(\n    \"new lambda.Runtime('nodejs10.x', lambda.RuntimeFamily.NODEJS)\"\n  );\n  expect(generatedSource).toContain(\n    \"new lambda.Runtime('nodejs12.x', lambda.RuntimeFamily.NODEJS)\"\n  );\n  expect(generatedSource).toContain(\n    \"new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS)\"\n  );\n});\n\ntest(\"bundler options\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  // WHEN\n  new LambdaExtension(project, {\n    cdkDeps: cdkDepsForProject(project),\n    entrypoint: \"src/example.lambda-extension.ts\",\n    bundlingOptions: {\n      externals: [\"foo\"],\n    },\n  });\n\n  // THEN\n  const snapshot = Testing.synth(project);\n\n  const bundleTaskExec =\n    snapshot[\".projen/tasks.json\"].tasks[\"bundle:example.lambda-extension\"]\n      .steps[0].exec;\n\n  expect(bundleTaskExec).toContain(\n    // `foo` is external\n    \"--external:foo\"\n  );\n});\n\ntest(\"changing the extension name\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  // WHEN\n  new LambdaExtension(project, {\n    cdkDeps: cdkDepsForProject(project),\n    entrypoint: \"src/example.lambda-extension.ts\",\n    name: \"other\",\n  });\n\n  // THEN\n  const snapshot = Testing.synth(project);\n\n  const bundleTaskExec =\n    snapshot[\".projen/tasks.json\"].tasks[\"bundle:example.lambda-extension\"]\n      .steps[0].exec;\n\n  expect(bundleTaskExec).toContain(\n    // Outputs `extensions/${name}` dir\n    '--outfile=\"assets/example.lambda-extension/extensions/other\"'\n  );\n});\n\ntest(\"changing construct name and path\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  // WHEN\n  new LambdaExtension(project, {\n    cdkDeps: cdkDepsForProject(project),\n    entrypoint: \"src/example.lambda-extension.ts\",\n    constructName: \"Custom\",\n    constructFile: \"src/example-extension.ts\",\n  });\n\n  // THEN\n  const snapshot = Testing.synth(project);\n  const generatedSource = snapshot[\"src/example-extension.ts\"];\n  expect(generatedSource).toContain(\"export interface CustomProps\");\n  expect(generatedSource).toContain(\"export class Custom\");\n});\n\nfunction cdkDepsForProject(\n  project: TypeScriptProject,\n  cdkVersion = \"1.0.0\"\n): AwsCdkDeps {\n  return new AwsCdkDepsJs(project, {\n    cdkVersion: cdkVersion,\n    dependencyType: DependencyType.RUNTIME,\n  });\n}\n"
  },
  {
    "path": "test/awscdk/lambda-function.test.ts",
    "content": "import { mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { DependencyType } from \"../../src\";\nimport * as awscdk from \"../../src/awscdk\";\nimport { AwsCdkDepsJs } from \"../../src/awscdk/awscdk-deps-js\";\nimport { Testing } from \"../../src/testing\";\nimport { TypeScriptProject } from \"../../src/typescript\";\n\ndescribe(\"bundled function\", () => {\n  let generatedSource: string;\n  let tasks: Record<string, any>;\n  let npmignore: string[];\n  let gitignore: string[];\n\n  beforeEach(() => {\n    const project = new TypeScriptProject({\n      name: \"hello\",\n      defaultReleaseBranch: \"main\",\n      bundlerOptions: {\n        assetsDir: \"my-assets\",\n      },\n    });\n\n    new awscdk.LambdaFunction(project, {\n      entrypoint: join(\"src\", \"hello.lambda.ts\"),\n      cdkDeps: cdkDepsForProject(project),\n    });\n\n    const snapshot = Testing.synth(project);\n\n    generatedSource = snapshot[\"src/hello-function.ts\"];\n    tasks = snapshot[\".projen/tasks.json\"].tasks;\n    npmignore = snapshot[\".npmignore\"].split(\"\\n\");\n    gitignore = snapshot[\".gitignore\"].split(\"\\n\");\n  });\n\n  test(\"generates source code for a lambda construct\", () => {\n    expect(generatedSource).toMatchSnapshot();\n  });\n\n  test(\"creates a single project-wide bundle task\", () => {\n    expect(tasks.bundle).toEqual({\n      description: \"Prepare assets\",\n      name: \"bundle\",\n      steps: [{ spawn: \"bundle:hello.lambda\" }],\n    });\n  });\n\n  test(\"creates a specific bundle task for this function\", () => {\n    expect(tasks[\"bundle:hello.lambda\"]).toEqual({\n      description: \"Create a JavaScript bundle from src/hello.lambda.ts\",\n      name: \"bundle:hello.lambda\",\n      steps: [\n        {\n          exec: 'esbuild --bundle src/hello.lambda.ts --target=\"node14\" --platform=\"node\" --outfile=\"my-assets/hello.lambda/index.js\" --external:aws-sdk',\n        },\n      ],\n    });\n  });\n\n  test(\"spawns the bundle task as part of pre-compilation\", () => {\n    expect(tasks[\"pre-compile\"].steps).toStrictEqual([{ spawn: \"bundle\" }]);\n  });\n\n  test(\"includes the bundle directory inside the node package but not commit to source control\", () => {\n    expect(npmignore).toContain(\"!/my-assets/\");\n    expect(gitignore).toContain(\"/my-assets/\");\n  });\n});\n\ntest(\"fails if entrypoint does not have the .lambda suffix\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n  expect(\n    () =>\n      new awscdk.LambdaFunction(project, {\n        entrypoint: join(\"src\", \"hello-no-lambda.ts\"),\n        cdkDeps: cdkDepsForProject(project),\n      })\n  ).toThrow(\n    \"hello-no-lambda.ts must have a .lambda.ts or .edge-lambda.ts extension\"\n  );\n});\n\ntest(\"constructFile and constructName can be used to customize the generated construct\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    constructFile: \"my-construct.ts\",\n    constructName: \"MyConstruct\",\n    cdkDeps: cdkDepsForProject(project),\n  });\n\n  const snapshot = Testing.synth(project);\n  const generatedSource = snapshot[\"src/my-construct.ts\"];\n  expect(generatedSource).toMatchSnapshot();\n});\n\ntest(\"runtime can be used to customize the lambda runtime and esbuild target\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    runtime: awscdk.LambdaRuntime.NODEJS_12_X,\n    cdkDeps: cdkDepsForProject(project),\n  });\n\n  const snapshot = Testing.synth(project);\n  const generatedSource = snapshot[\"src/hello-function.ts\"];\n  const tasks = snapshot[\".projen/tasks.json\"].tasks;\n  expect(generatedSource).toContain(\n    \"runtime: new lambda.Runtime('nodejs12.x', lambda.RuntimeFamily.NODEJS),\"\n  );\n  expect(tasks[\"bundle:hello.lambda\"]).toEqual({\n    description: \"Create a JavaScript bundle from src/hello.lambda.ts\",\n    name: \"bundle:hello.lambda\",\n    steps: [\n      {\n        exec: 'esbuild --bundle src/hello.lambda.ts --target=\"node12\" --platform=\"node\" --outfile=\"assets/hello.lambda/index.js\" --external:aws-sdk',\n      },\n    ],\n  });\n});\n\ntest(\"AWS SDK connection reuse\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n  });\n\n  const snapshot = Testing.synth(project);\n  const generatedSource = snapshot[\"src/hello-function.ts\"];\n  expect(generatedSource).toContain(\n    \"this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\"\n  );\n});\n\ntest(\"AWS SDK connection reuse can be disabled\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n    awsSdkConnectionReuse: false,\n  });\n\n  const snapshot = Testing.synth(project);\n  const generatedSource = snapshot[\"src/hello-function.ts\"];\n  expect(generatedSource).not.toContain(\n    \"this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });\"\n  );\n});\n\ntest(\"Edge function\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.edge-lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n    edgeLambda: true,\n  });\n\n  const snapshot = Testing.synth(project);\n  const generatedSource = snapshot[\"src/hello-function.ts\"];\n  expect(generatedSource).toMatchSnapshot();\n});\n\ntest(\"eslint allows handlers to import dev dependencies\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n  });\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"world.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n  });\n\n  const snapshot = Testing.synth(project);\n  expect(\n    snapshot[\".eslintrc.json\"].rules[\"import/no-extraneous-dependencies\"]\n  ).toStrictEqual([\n    \"error\",\n    {\n      devDependencies: [\n        \"**/test/**\",\n        \"**/build-tools/**\",\n        \"src/hello.lambda.ts\",\n        \"src/world.lambda.ts\",\n      ],\n      optionalDependencies: false,\n      peerDependencies: true,\n    },\n  ]);\n});\n\ntest(\"esbuild dependency is added\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n  });\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"world.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n  });\n\n  const snapshot = Testing.synth(project);\n  const deps = snapshot[\".projen/deps.json\"].dependencies;\n  expect(deps.filter((d: any) => d.name === \"esbuild\").length).toEqual(1);\n});\n\ntest(\"multiple functions\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n  });\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"world.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project),\n  });\n\n  const snapshot = Testing.synth(project);\n  expect(snapshot[\"src/hello-function.ts\"]).toMatchSnapshot();\n  expect(snapshot[\"src/world-function.ts\"]).toMatchSnapshot();\n});\n\ntest(\"auto-discover\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  // create fake handlers\n  const srcdir = join(project.outdir, project.srcdir);\n  mkdirSync(join(srcdir, \"subdir\"), { recursive: true });\n  writeFileSync(\n    join(srcdir, \"hello.lambda.ts\"),\n    \"export function handler() {}\"\n  );\n  writeFileSync(\n    join(srcdir, \"subdir\", \"world.lambda.ts\"),\n    \"export function handler() {}\"\n  );\n  writeFileSync(\n    join(srcdir, \"subdir\", \"jangy.lambda.ts\"),\n    \"export function handler() {}\"\n  );\n\n  new awscdk.AutoDiscover(project, {\n    srcdir: project.srcdir,\n    testdir: project.testdir,\n    tsconfigPath: project.tsconfigDev.fileName,\n    cdkDeps: new AwsCdkDepsJs(project, {\n      cdkVersion: \"1.23.0\",\n      dependencyType: DependencyType.RUNTIME,\n    }),\n    lambdaOptions: {\n      runtime: awscdk.LambdaRuntime.NODEJS_12_X,\n    },\n  });\n\n  const snapshot = Testing.synth(project);\n  expect(snapshot[\"src/hello-function.ts\"]).toMatchSnapshot();\n  expect(snapshot[\"src/subdir/world-function.ts\"]).toMatchSnapshot();\n  expect(snapshot[\"src/subdir/jangy-function.ts\"]).toMatchSnapshot();\n  const tasks = snapshot[\".projen/tasks.json\"].tasks;\n  expect(tasks.bundle).toMatchSnapshot();\n\n  const expected = [\n    \"bundle:hello.lambda\",\n    \"bundle:hello.lambda:watch\",\n    \"bundle:subdir/jangy.lambda\",\n    \"bundle:subdir/jangy.lambda:watch\",\n    \"bundle:subdir/world.lambda\",\n    \"bundle:subdir/world.lambda:watch\",\n  ];\n\n  for (const name of expected) {\n    expect(tasks[name]).not.toBeUndefined();\n    expect(tasks[name]).toMatchSnapshot();\n  }\n});\n\ntest(\"generates cdkv2-compatible imports\", () => {\n  const project = new TypeScriptProject({\n    name: \"hello\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  new awscdk.LambdaFunction(project, {\n    entrypoint: join(\"src\", \"hello.lambda.ts\"),\n    cdkDeps: cdkDepsForProject(project, \"2.3.1\"),\n  });\n\n  const snapshot = Testing.synth(project);\n  expect(snapshot[\"src/hello-function.ts\"]).toMatchSnapshot();\n});\n\nfunction cdkDepsForProject(\n  project: TypeScriptProject,\n  cdkVersion = \"1.0.0\"\n): awscdk.AwsCdkDeps {\n  return new AwsCdkDepsJs(project, {\n    cdkVersion: cdkVersion,\n    dependencyType: DependencyType.RUNTIME,\n  });\n}\n"
  },
  {
    "path": "test/awscdk/python-app.test.ts",
    "content": "import { AwsCdkPythonApp } from \"../../src/awscdk\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"create cdk python project\", () => {\n  const p = new AwsCdkPythonApp({\n    authorEmail: \"test@cdkpythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk_python_app_project\",\n    name: \"test-cdk-python-app-project\",\n    version: \"0.1.0\",\n    cdkVersion: \"2.8.0\",\n  });\n\n  const snapshot = synthSnapshot(p);\n  expect(Object.keys(snapshot)).toStrictEqual([\n    \".gitattributes\",\n    \".github/workflows/pull-request-lint.yml\",\n    \".gitignore\",\n    \".projen/deps.json\",\n    \".projen/files.json\",\n    \".projen/tasks.json\",\n    \"app.py\",\n    \"cdk.json\",\n    \"README.md\",\n    \"requirements-dev.txt\",\n    \"requirements.txt\",\n    \"test_cdk_python_app_project/__init__.py\",\n    \"test_cdk_python_app_project/main.py\",\n    \"tests/__init__.py\",\n    \"tests/test_example.py\",\n  ]);\n  expect(snapshot[\"cdk.json\"]).toMatchSnapshot();\n});\n\ntest(\"CDK v2 deps\", () => {\n  const p = new AwsCdkPythonApp({\n    authorEmail: \"test@cdkpythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk_python_app_project\",\n    name: \"test-cdk-python-app-project\",\n    version: \"0.1.0\",\n    cdkVersion: \"2.8.0\",\n  });\n\n  const snapshot = synthSnapshot(p);\n\n  expect(snapshot[\"requirements.txt\"]).toContain(\n    '# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".'\n  );\n  expect(snapshot[\"requirements.txt\"]).toContain(\"aws-cdk-lib>=2.8.0, <3.0.0\");\n  expect(snapshot[\"requirements.txt\"]).toContain(\"constructs>=10.0.5, <11.0.0\");\n\n  expect(snapshot[\"requirements-dev.txt\"]).toContain(\n    '# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".'\n  );\n  expect(snapshot[\"requirements-dev.txt\"]).toContain(\"projen==99.99.99\");\n});\n\ntest(\"CDK v1 deps\", () => {\n  const p = new AwsCdkPythonApp({\n    authorEmail: \"test@cdkpythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk_python_app_project\",\n    name: \"test-cdk-python-app-project\",\n    version: \"0.1.0\",\n    cdkVersion: \"1.140.0\",\n  });\n\n  const snapshot = synthSnapshot(p);\n\n  expect(snapshot[\"requirements.txt\"]).toContain(\n    '# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".'\n  );\n  expect(snapshot[\"requirements.txt\"]).toContain(\n    \"aws_cdk.core>=1.140.0, <2.0.0\"\n  );\n  expect(snapshot[\"requirements.txt\"]).toContain(\"constructs>=3.2.27, <4.0.0\");\n\n  expect(snapshot[\"requirements-dev.txt\"]).toContain(\n    '# ~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".'\n  );\n  expect(snapshot[\"requirements-dev.txt\"]).toContain(\"projen==99.99.99\");\n});\n"
  },
  {
    "path": "test/cdk/__snapshots__/jsii.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`language bindings package:dotnet task 1`] = `\nObject {\n  \"description\": \"Create dotnet language bindings\",\n  \"name\": \"package:dotnet\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"jsii-pacmak -v --target dotnet\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings package:go task 1`] = `\nObject {\n  \"description\": \"Create go language bindings\",\n  \"name\": \"package:go\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"jsii-pacmak -v --target go\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings package:java task 1`] = `\nObject {\n  \"description\": \"Create java language bindings\",\n  \"name\": \"package:java\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"jsii-pacmak -v --target java\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings package:js task 1`] = `\nObject {\n  \"description\": \"Create js language bindings\",\n  \"name\": \"package:js\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"jsii-pacmak -v --target js\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings package:python task 1`] = `\nObject {\n  \"description\": \"Create python language bindings\",\n  \"name\": \"package:python\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"jsii-pacmak -v --target python\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings package-all creates all bindings 1`] = `\nObject {\n  \"description\": \"Packages artifacts for all target languages\",\n  \"name\": \"package-all\",\n  \"steps\": Array [\n    Object {\n      \"spawn\": \"package:js\",\n    },\n    Object {\n      \"spawn\": \"package:java\",\n    },\n    Object {\n      \"spawn\": \"package:python\",\n    },\n    Object {\n      \"spawn\": \"package:dotnet\",\n    },\n    Object {\n      \"spawn\": \"package:go\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings release workflow includes release_golang job 1`] = `\nObject {\n  \"if\": \"needs.release.outputs.latest_commit == github.sha\",\n  \"name\": \"Publish to GitHub Go Module Repository\",\n  \"needs\": \"release\",\n  \"permissions\": Object {\n    \"contents\": \"read\",\n  },\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-go@v3\",\n      \"with\": Object {\n        \"go-version\": \"^1.16.0\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create go artifact\",\n      \"run\": \"cd .repo && npx projen package:go\",\n    },\n    Object {\n      \"name\": \"Collect go Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n    Object {\n      \"env\": Object {\n        \"GITHUB_TOKEN\": \"\\${{ secrets.GO_GITHUB_TOKEN }}\",\n        \"GIT_USER_EMAIL\": \"github-actions@github.com\",\n        \"GIT_USER_NAME\": \"github-actions\",\n      },\n      \"name\": \"Release\",\n      \"run\": \"npx -p publib@latest publib-golang\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings release workflow includes release_maven job 1`] = `\nObject {\n  \"if\": \"needs.release.outputs.latest_commit == github.sha\",\n  \"name\": \"Publish to Maven Central\",\n  \"needs\": \"release\",\n  \"permissions\": Object {\n    \"contents\": \"read\",\n  },\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-java@v3\",\n      \"with\": Object {\n        \"distribution\": \"temurin\",\n        \"java-version\": \"11.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create java artifact\",\n      \"run\": \"cd .repo && npx projen package:java\",\n    },\n    Object {\n      \"name\": \"Collect java Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n    Object {\n      \"env\": Object {\n        \"MAVEN_GPG_PRIVATE_KEY\": \"\\${{ secrets.MAVEN_GPG_PRIVATE_KEY }}\",\n        \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\": \"\\${{ secrets.MAVEN_GPG_PRIVATE_KEY_PASSPHRASE }}\",\n        \"MAVEN_PASSWORD\": \"\\${{ secrets.MAVEN_PASSWORD }}\",\n        \"MAVEN_STAGING_PROFILE_ID\": \"\\${{ secrets.MAVEN_STAGING_PROFILE_ID }}\",\n        \"MAVEN_USERNAME\": \"\\${{ secrets.MAVEN_USERNAME }}\",\n      },\n      \"name\": \"Release\",\n      \"run\": \"npx -p publib@latest publib-maven\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings release workflow includes release_npm job 1`] = `\nObject {\n  \"if\": \"needs.release.outputs.latest_commit == github.sha\",\n  \"name\": \"Publish to npm\",\n  \"needs\": \"release\",\n  \"permissions\": Object {\n    \"contents\": \"read\",\n  },\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create js artifact\",\n      \"run\": \"cd .repo && npx projen package:js\",\n    },\n    Object {\n      \"name\": \"Collect js Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n    Object {\n      \"env\": Object {\n        \"NPM_DIST_TAG\": \"latest\",\n        \"NPM_REGISTRY\": \"registry.npmjs.org\",\n        \"NPM_TOKEN\": \"\\${{ secrets.NPM_TOKEN }}\",\n      },\n      \"name\": \"Release\",\n      \"run\": \"npx -p publib@latest publib-npm\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings release workflow includes release_nuget job 1`] = `\nObject {\n  \"if\": \"needs.release.outputs.latest_commit == github.sha\",\n  \"name\": \"Publish to NuGet Gallery\",\n  \"needs\": \"release\",\n  \"permissions\": Object {\n    \"contents\": \"read\",\n  },\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-dotnet@v2\",\n      \"with\": Object {\n        \"dotnet-version\": \"3.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create dotnet artifact\",\n      \"run\": \"cd .repo && npx projen package:dotnet\",\n    },\n    Object {\n      \"name\": \"Collect dotnet Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n    Object {\n      \"env\": Object {\n        \"NUGET_API_KEY\": \"\\${{ secrets.NUGET_API_KEY }}\",\n      },\n      \"name\": \"Release\",\n      \"run\": \"npx -p publib@latest publib-nuget\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings release workflow includes release_pypi job 1`] = `\nObject {\n  \"if\": \"needs.release.outputs.latest_commit == github.sha\",\n  \"name\": \"Publish to PyPI\",\n  \"needs\": \"release\",\n  \"permissions\": Object {\n    \"contents\": \"read\",\n  },\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-python@v3\",\n      \"with\": Object {\n        \"python-version\": \"3.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create python artifact\",\n      \"run\": \"cd .repo && npx projen package:python\",\n    },\n    Object {\n      \"name\": \"Collect python Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n    Object {\n      \"env\": Object {\n        \"TWINE_PASSWORD\": \"\\${{ secrets.TWINE_PASSWORD }}\",\n        \"TWINE_USERNAME\": \"\\${{ secrets.TWINE_USERNAME }}\",\n      },\n      \"name\": \"Release\",\n      \"run\": \"npx -p publib@latest publib-pypi\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings snapshot dotnet 1`] = `\nObject {\n  \"if\": \"! needs.build.outputs.self_mutation_happened\",\n  \"needs\": \"build\",\n  \"permissions\": Object {},\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-dotnet@v2\",\n      \"with\": Object {\n        \"dotnet-version\": \"3.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create dotnet artifact\",\n      \"run\": \"cd .repo && npx projen package:dotnet\",\n    },\n    Object {\n      \"name\": \"Collect dotnet Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings snapshot go 1`] = `\nObject {\n  \"if\": \"! needs.build.outputs.self_mutation_happened\",\n  \"needs\": \"build\",\n  \"permissions\": Object {},\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-go@v3\",\n      \"with\": Object {\n        \"go-version\": \"^1.16.0\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create go artifact\",\n      \"run\": \"cd .repo && npx projen package:go\",\n    },\n    Object {\n      \"name\": \"Collect go Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings snapshot java 1`] = `\nObject {\n  \"if\": \"! needs.build.outputs.self_mutation_happened\",\n  \"needs\": \"build\",\n  \"permissions\": Object {},\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-java@v3\",\n      \"with\": Object {\n        \"distribution\": \"temurin\",\n        \"java-version\": \"11.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create java artifact\",\n      \"run\": \"cd .repo && npx projen package:java\",\n    },\n    Object {\n      \"name\": \"Collect java Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings snapshot js 1`] = `\nObject {\n  \"if\": \"! needs.build.outputs.self_mutation_happened\",\n  \"needs\": \"build\",\n  \"permissions\": Object {},\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create js artifact\",\n      \"run\": \"cd .repo && npx projen package:js\",\n    },\n    Object {\n      \"name\": \"Collect js Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n  ],\n}\n`;\n\nexports[`language bindings snapshot python 1`] = `\nObject {\n  \"if\": \"! needs.build.outputs.self_mutation_happened\",\n  \"needs\": \"build\",\n  \"permissions\": Object {},\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"uses\": \"actions/setup-node@v3\",\n      \"with\": Object {\n        \"node-version\": \"14.x\",\n      },\n    },\n    Object {\n      \"uses\": \"actions/setup-python@v3\",\n      \"with\": Object {\n        \"python-version\": \"3.x\",\n      },\n    },\n    Object {\n      \"name\": \"Download build artifacts\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \"build-artifact\",\n        \"path\": \"dist\",\n      },\n    },\n    Object {\n      \"name\": \"Prepare Repository\",\n      \"run\": \"mv dist .repo\",\n    },\n    Object {\n      \"name\": \"Install Dependencies\",\n      \"run\": \"cd .repo && yarn install --check-files --frozen-lockfile\",\n    },\n    Object {\n      \"name\": \"Create python artifact\",\n      \"run\": \"cd .repo && npx projen package:python\",\n    },\n    Object {\n      \"name\": \"Collect python Artifact\",\n      \"run\": \"mv .repo/dist dist\",\n    },\n  ],\n}\n`;\n\nexports[`publish to go customizations 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Collect GitHub Metadata\n        run: mv .repo/dist dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: registry.npmjs.org\n          NPM_TOKEN: \\${{ secrets.NPM_TOKEN }}\n  release_golang:\n    name: Publish to GitHub Go Module Repository\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-go@v3\n        with:\n          go-version: ^1.16.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create go artifact\n        run: cd .repo && npx projen package:go\n      - name: Collect go Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-golang\n        env:\n          GITHUB_REPO: github.com/foo/bar\n          GIT_BRANCH: custom-branch\n          GIT_USER_NAME: custom user\n          GIT_USER_EMAIL: custom@email.com\n          GIT_COMMIT_MESSAGE: custom commit message\n          GITHUB_TOKEN: \\${{ secrets.CUSTOM_SECRET }}\n\"\n`;\n\nexports[`publish to go defaults 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Collect GitHub Metadata\n        run: mv .repo/dist dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: registry.npmjs.org\n          NPM_TOKEN: \\${{ secrets.NPM_TOKEN }}\n  release_golang:\n    name: Publish to GitHub Go Module Repository\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-go@v3\n        with:\n          go-version: ^1.16.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create go artifact\n        run: cd .repo && npx projen package:go\n      - name: Collect go Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-golang\n        env:\n          GIT_USER_NAME: github-actions\n          GIT_USER_EMAIL: github-actions@github.com\n          GITHUB_TOKEN: \\${{ secrets.GO_GITHUB_TOKEN }}\n\"\n`;\n\nexports[`publish to nuget all options 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Collect GitHub Metadata\n        run: mv .repo/dist dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: registry.npmjs.org\n          NPM_TOKEN: \\${{ secrets.NPM_TOKEN }}\n  release_nuget:\n    name: Publish to NuGet Gallery\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-dotnet@v2\n        with:\n          dotnet-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create dotnet artifact\n        run: cd .repo && npx projen package:dotnet\n      - name: Collect dotnet Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-nuget\n        env:\n          NUGET_API_KEY: \\${{ secrets.NUGET_API_KEY }}\n\"\n`;\n\nexports[`publish to nuget minimal options 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Collect GitHub Metadata\n        run: mv .repo/dist dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create js artifact\n        run: cd .repo && npx projen package:js\n      - name: Collect js Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: registry.npmjs.org\n          NPM_TOKEN: \\${{ secrets.NPM_TOKEN }}\n  release_nuget:\n    name: Publish to NuGet Gallery\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-dotnet@v2\n        with:\n          dotnet-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Prepare Repository\n        run: mv dist .repo\n      - name: Install Dependencies\n        run: cd .repo && yarn install --check-files --frozen-lockfile\n      - name: Create dotnet artifact\n        run: cd .repo && npx projen package:dotnet\n      - name: Collect dotnet Artifact\n        run: mv .repo/dist dist\n      - name: Release\n        run: npx -p publib@latest publib-nuget\n        env:\n          NUGET_API_KEY: \\${{ secrets.NUGET_API_KEY }}\n\"\n`;\n"
  },
  {
    "path": "test/cdk/auto-discover-base.test.ts",
    "content": "import { Project } from \"../../src\";\nimport { AutoDiscoverBase } from \"../../src/cdk\";\n\ntest(\"auto discover entrypoints\", () => {\n  // GIVEN\n  const project = new Project({\n    name: \"project\",\n    outdir: __dirname,\n  });\n\n  // WHEN\n  const autoDiscover = new TestAutoDiscover(project);\n\n  // THEN\n  expect(autoDiscover.entrypoints).toEqual([\"testtree/abc.myext.ts\"]);\n});\n\nclass TestAutoDiscover extends AutoDiscoverBase {\n  constructor(project: Project) {\n    super(project, {\n      extension: \".myext.ts\",\n      projectdir: \"testtree\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/cdk/jsii.test.ts",
    "content": "import * as yaml from \"yaml\";\nimport { JsiiProject } from \"../../src/cdk\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"author\", () => {\n  test(\"authorEmail and authorAddress can be the same value\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"hello@hello.com\",\n      authorEmail: \"hello@hello.com\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"project\",\n      defaultReleaseBranch: \"master\",\n    });\n\n    const pkgjson = synthSnapshot(project)[\"package.json\"];\n    expect(pkgjson.author).toStrictEqual({\n      email: \"hello@hello.com\",\n      name: \"My Name\",\n      organization: false,\n    });\n  });\n\n  test(\"authorUrl and authorAddress can be the same value\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"project\",\n      defaultReleaseBranch: \"master\",\n    });\n\n    const pkgjson = synthSnapshot(project)[\"package.json\"];\n    expect(pkgjson.author).toStrictEqual({\n      name: \"My Name\",\n      organization: false,\n      url: \"https://foo.bar\",\n    });\n  });\n});\n\ndescribe(\"maven repository options\", () => {\n  test(\"use maven central as repository\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      publishToMaven: {\n        javaPackage: \"io.github.cdklabs.watchful\",\n        mavenGroupId: \"io.github.cdklabs\",\n        mavenArtifactId: \"cdk-watchful\",\n      },\n      defaultReleaseBranch: \"master\",\n      publishTasks: true,\n    });\n\n    const outdir = synthSnapshot(project);\n\n    expect(outdir[\".projen/tasks.json\"].tasks[\"publish:maven\"]).toStrictEqual({\n      name: \"publish:maven\",\n      description: \"Publish this package to Maven Central\",\n      requiredEnv: [\n        \"MAVEN_GPG_PRIVATE_KEY\",\n        \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\",\n        \"MAVEN_PASSWORD\",\n        \"MAVEN_USERNAME\",\n        \"MAVEN_STAGING_PROFILE_ID\",\n      ],\n      steps: [\n        { exec: 'test \"$(git branch --show-current)\" = \"master\"' },\n        { exec: \"npx -p publib@latest publib-maven\" },\n      ],\n    });\n\n    const workflow = outdir[\".github/workflows/release.yml\"];\n    expect(workflow).toContain(\"run: npx -p publib@latest publib-maven\");\n    expect(workflow).toContain(\"MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}\");\n    expect(workflow).not.toContainEqual(\"MAVEN_SERVER_ID\");\n    expect(workflow).not.toContainEqual(\"MAVEN_REPOSITORY_URL\");\n    expect(workflow).not.toContain(\"packages: write\");\n  });\n\n  test(\"use nexus repo new endpoint\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      publishToMaven: {\n        javaPackage: \"io.github.cdklabs.watchful\",\n        mavenGroupId: \"io.github.cdklabs\",\n        mavenArtifactId: \"cdk-watchful\",\n        mavenEndpoint: \"https://s01.oss.sonatype.org\",\n      },\n      defaultReleaseBranch: \"master\",\n      publishTasks: true,\n    });\n\n    const outdir = synthSnapshot(project);\n\n    expect(outdir[\".projen/tasks.json\"].tasks[\"publish:maven\"]).toStrictEqual({\n      name: \"publish:maven\",\n      description: \"Publish this package to Maven Central\",\n      env: {\n        MAVEN_ENDPOINT: \"https://s01.oss.sonatype.org\",\n      },\n      requiredEnv: [\n        \"MAVEN_GPG_PRIVATE_KEY\",\n        \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\",\n        \"MAVEN_PASSWORD\",\n        \"MAVEN_USERNAME\",\n        \"MAVEN_STAGING_PROFILE_ID\",\n      ],\n      steps: [\n        { exec: 'test \"$(git branch --show-current)\" = \"master\"' },\n        { exec: \"npx -p publib@latest publib-maven\" },\n      ],\n    });\n\n    const workflow = outdir[\".github/workflows/release.yml\"];\n    expect(workflow).toContain(\"run: npx -p publib@latest publib-maven\");\n    expect(workflow).toContain(\"MAVEN_ENDPOINT: https://s01.oss.sonatype.org\");\n    expect(workflow).toContain(\"MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}\");\n    expect(workflow).not.toContainEqual(\"MAVEN_SERVER_ID\");\n    expect(workflow).not.toContainEqual(\"MAVEN_REPOSITORY_URL\");\n    expect(workflow).not.toContain(\"packages: write\");\n  });\n\n  test(\"use github as repository\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      publishToMaven: {\n        javaPackage: \"io.github.cdklabs.watchful\",\n        mavenGroupId: \"io.github.cdklabs\",\n        mavenArtifactId: \"cdk-watchful\",\n        mavenRepositoryUrl: \"https://maven.pkg.github.com/eladb\",\n      },\n      defaultReleaseBranch: \"master\",\n      publishTasks: true,\n    });\n\n    const outdir = synthSnapshot(project);\n\n    expect(outdir[\".projen/tasks.json\"].tasks[\"publish:maven\"]).toStrictEqual({\n      name: \"publish:maven\",\n      description: \"Publish this package to Maven Central\",\n      env: {\n        MAVEN_SERVER_ID: \"github\",\n        MAVEN_REPOSITORY_URL: \"https://maven.pkg.github.com/eladb\",\n      },\n      requiredEnv: [\"MAVEN_PASSWORD\", \"MAVEN_USERNAME\"],\n      steps: [\n        { exec: 'test \"$(git branch --show-current)\" = \"master\"' },\n        { exec: \"npx -p publib@latest publib-maven\" },\n      ],\n    });\n\n    const workflow = outdir[\".github/workflows/release.yml\"];\n    expect(workflow).toContain(\"MAVEN_SERVER_ID: github\");\n    expect(workflow).toContain(\n      \"MAVEN_REPOSITORY_URL: https://maven.pkg.github.com/eladb\"\n    );\n    expect(workflow).toContain(\"MAVEN_USERNAME: ${{ github.actor }}\");\n    expect(workflow).toContain(\"MAVEN_PASSWORD: ${{ secrets.GITHUB_TOKEN }}\");\n    expect(workflow).toContain(\"packages: write\");\n  });\n\n  test(\"using github as repository with incorrect server id should throw\", () => {\n    expect(\n      () =>\n        new JsiiProject({\n          authorAddress: \"https://foo.bar\",\n          authorUrl: \"https://foo.bar\",\n          repositoryUrl: \"https://github.com/foo/bar.git\",\n          author: \"My Name\",\n          name: \"testproject\",\n          publishToMaven: {\n            javaPackage: \"io.github.cdklabs.watchful\",\n            mavenGroupId: \"io.github.cdklabs\",\n            mavenArtifactId: \"cdk-watchful\",\n            mavenServerId: \"something-else\",\n            mavenRepositoryUrl: \"https://maven.pkg.github.com/eladb\",\n          },\n          defaultReleaseBranch: \"master\",\n          publishTasks: true,\n        })\n    ).toThrow(\n      'publishing to GitHub Packages requires the \"mavenServerId\" to be \"github\"'\n    );\n  });\n});\n\ndescribe(\"publish to go\", () => {\n  test(\"defaults\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      publishToGo: {\n        moduleName: \"github.com/foo/bar\",\n      },\n      defaultReleaseBranch: \"master\",\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    const targets = output[\"package.json\"].jsii.targets;\n    expect(targets).toStrictEqual({\n      go: {\n        moduleName: \"github.com/foo/bar\",\n      },\n    });\n\n    expect(output[\".github/workflows/release.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"release to npm undefined\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      defaultReleaseBranch: \"main\",\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    expect(output[\".github/workflows/release.yml\"]).toContain(\"release_npm\");\n  });\n\n  test(\"release to npm true\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      defaultReleaseBranch: \"main\",\n      releaseToNpm: true,\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    expect(output[\".github/workflows/release.yml\"]).toContain(\"release_npm\");\n  });\n\n  test(\"release to npm false\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      defaultReleaseBranch: \"main\",\n      releaseToNpm: false,\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    expect(output[\".github/workflows/release.yml\"]).not.toContain(\n      \"release_npm\"\n    );\n  });\n\n  test(\"customizations\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      publishToGo: {\n        moduleName: \"github.com/foo/bar\",\n\n        gitBranch: \"custom-branch\",\n        gitCommitMessage: \"custom commit message\",\n        gitUserEmail: \"custom@email.com\",\n        gitUserName: \"custom user\",\n        githubRepo: \"github.com/foo/bar\",\n        githubTokenSecret: \"CUSTOM_SECRET\",\n      },\n      defaultReleaseBranch: \"master\",\n      excludeTypescript: [\"src/**/test/*.ts\", \"src/**/__tests__/*.ts\"],\n    });\n\n    const output = synthSnapshot(project);\n    expect(output[\"package.json\"].jsii.targets.go).toStrictEqual({\n      moduleName: \"github.com/foo/bar\",\n    });\n    expect(output[\".github/workflows/release.yml\"]).toMatchSnapshot();\n    expect(output[\"package.json\"].jsii.excludeTypescript).toStrictEqual([\n      \"src/**/test/*.ts\",\n      \"src/**/__tests__/*.ts\",\n    ]);\n  });\n});\n\ndescribe(\"publish to nuget\", () => {\n  test(\"minimal options\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      publishToNuget: {\n        dotNetNamespace: \"DotNet.Namespace\",\n        packageId: \"PackageId\",\n      },\n      defaultReleaseBranch: \"master\",\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    const targets = output[\"package.json\"].jsii.targets;\n    expect(targets).toStrictEqual({\n      dotnet: {\n        namespace: \"DotNet.Namespace\",\n        packageId: \"PackageId\",\n      },\n    });\n\n    expect(output[\".github/workflows/release.yml\"]).toMatchSnapshot();\n  });\n  test(\"all options\", () => {\n    const project = new JsiiProject({\n      authorAddress: \"https://foo.bar\",\n      authorUrl: \"https://foo.bar\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      author: \"My Name\",\n      name: \"testproject\",\n      publishToNuget: {\n        dotNetNamespace: \"DotNet.Namespace\",\n        packageId: \"PackageId\",\n        iconUrl: \"https://example.com/logo.png\",\n      },\n      defaultReleaseBranch: \"master\",\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    const targets = output[\"package.json\"].jsii.targets;\n    expect(targets).toStrictEqual({\n      dotnet: {\n        namespace: \"DotNet.Namespace\",\n        packageId: \"PackageId\",\n        iconUrl: \"https://example.com/logo.png\",\n      },\n    });\n\n    expect(output[\".github/workflows/release.yml\"]).toMatchSnapshot();\n  });\n});\n\ndescribe(\"docgen\", () => {\n  test(\"true should just work\", () => {\n    const project = new JsiiProject({\n      author: \"My name\",\n      name: \"testproject\",\n      authorAddress: \"https://foo.bar\",\n      defaultReleaseBranch: \"main\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      docgen: true,\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    expect(\n      output[\".projen/tasks.json\"].tasks.docgen.steps[0].exec\n    ).toStrictEqual(\"jsii-docgen -o API.md\");\n  });\n\n  test(\"can customize output\", () => {\n    const project = new JsiiProject({\n      author: \"My name\",\n      name: \"testproject\",\n      authorAddress: \"https://foo.bar\",\n      defaultReleaseBranch: \"main\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      docgen: true,\n      docgenFilePath: \"docs.md\",\n      publishTasks: true,\n    });\n\n    const output = synthSnapshot(project);\n    expect(\n      output[\".projen/tasks.json\"].tasks.docgen.steps[0].exec\n    ).toStrictEqual(\"jsii-docgen -o docs.md\");\n  });\n});\n\ndescribe(\"compile options\", () => {\n  test(\"be default, assembly is not compressed\", () => {\n    const project = new JsiiProject({\n      author: \"My name\",\n      name: \"testproject\",\n      authorAddress: \"https://foo.bar\",\n      defaultReleaseBranch: \"main\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n    });\n\n    const output = synthSnapshot(project);\n    expect(\n      output[\".projen/tasks.json\"].tasks.compile.steps[0].exec\n    ).toStrictEqual(\"jsii --silence-warnings=reserved-word\");\n  });\n\n  test(\"assembly can be compressed\", () => {\n    const project = new JsiiProject({\n      author: \"My name\",\n      name: \"testproject\",\n      authorAddress: \"https://foo.bar\",\n      defaultReleaseBranch: \"main\",\n      repositoryUrl: \"https://github.com/foo/bar.git\",\n      compressAssembly: true,\n    });\n\n    const output = synthSnapshot(project);\n    expect(\n      output[\".projen/tasks.json\"].tasks.compile.steps[0].exec\n    ).toStrictEqual(\n      \"jsii --silence-warnings=reserved-word --compress-assembly\"\n    );\n  });\n});\n\ndescribe(\"language bindings\", () => {\n  const project = new JsiiProject({\n    author: \"My name\",\n    name: \"testproject\",\n    authorAddress: \"https://foo.bar\",\n    defaultReleaseBranch: \"main\",\n    repositoryUrl: \"https://github.com/foo/bar.git\",\n    publishToGo: { moduleName: \"github.com/foo/bar\" },\n    publishToMaven: {\n      javaPackage: \"io.github.cdklabs.watchful\",\n      mavenGroupId: \"io.github.cdklabs\",\n      mavenArtifactId: \"cdk-watchful\",\n    },\n    publishToNuget: {\n      dotNetNamespace: \"DotNet.Namespace\",\n      packageId: \"PackageId\",\n    },\n    publishToPypi: { distName: \"dist-name\", module: \"module-name\" },\n  });\n\n  const output = synthSnapshot(project);\n  const build = yaml.parse(output[\".github/workflows/build.yml\"]);\n  const release = yaml.parse(output[\".github/workflows/release.yml\"]);\n  const tasks = output[\".projen/tasks.json\"].tasks;\n\n  test(\"build workflow includes packaging jobs\", () => {\n    expect(Object.keys(build.jobs)).toStrictEqual([\n      \"build\",\n      \"self-mutation\",\n      \"package-js\",\n      \"package-java\",\n      \"package-python\",\n      \"package-dotnet\",\n      \"package-go\",\n    ]);\n  });\n\n  test.each([\"js\", \"java\", \"python\", \"dotnet\", \"go\"])(\n    \"snapshot %s\",\n    (language) => {\n      expect(build.jobs[`package-${language}`]).toMatchSnapshot();\n    }\n  );\n\n  test.each([\"js\", \"java\", \"python\", \"dotnet\", \"go\"])(\n    \"package:%s task\",\n    (language) => {\n      expect(tasks[`package:${language}`]).toMatchSnapshot();\n    }\n  );\n\n  test(\"package-all creates all bindings\", () => {\n    expect(tasks[\"package-all\"]).toBeDefined();\n    expect(tasks[\"package-all\"]).toMatchSnapshot();\n  });\n\n  test.each([\"pypi\", \"nuget\", \"npm\", \"maven\", \"golang\"])(\n    \"release workflow includes release_%s job\",\n    (language) => {\n      const job = release.jobs[`release_${language}`];\n      expect(job).toBeDefined();\n      expect(job).toMatchSnapshot();\n    }\n  );\n});\n\ndescribe(\"workflows use global workflowRunsOn option\", () => {\n  const project = new JsiiProject({\n    author: \"My name\",\n    name: \"testproject\",\n    authorAddress: \"https://foo.bar\",\n    defaultReleaseBranch: \"main\",\n    repositoryUrl: \"https://github.com/foo/bar.git\",\n    publishToGo: { moduleName: \"github.com/foo/bar\" },\n    publishToMaven: {\n      javaPackage: \"io.github.cdklabs.watchful\",\n      mavenGroupId: \"io.github.cdklabs\",\n      mavenArtifactId: \"cdk-watchful\",\n    },\n    publishToNuget: {\n      dotNetNamespace: \"DotNet.Namespace\",\n      packageId: \"PackageId\",\n    },\n    publishToPypi: { distName: \"dist-name\", module: \"module-name\" },\n    workflowRunsOn: [\"self-hosted\", \"linux\", \"x64\"],\n  });\n\n  const output = synthSnapshot(project);\n  const build = yaml.parse(output[\".github/workflows/build.yml\"]);\n  const release = yaml.parse(output[\".github/workflows/release.yml\"]);\n\n  const EXPECTED_RUNS_ON = [\"self-hosted\", \"linux\", \"x64\"];\n\n  expect(build).toHaveProperty(\"jobs.build.runs-on\", EXPECTED_RUNS_ON);\n  expect(build).toHaveProperty(\"jobs.self-mutation.runs-on\", EXPECTED_RUNS_ON);\n\n  test.each([\"js\", \"java\", \"python\", \"dotnet\", \"go\"])(\n    \"snapshot %s\",\n    (language) => {\n      expect(build).toHaveProperty(\n        `jobs.package-${language}.runs-on`,\n        EXPECTED_RUNS_ON\n      );\n    }\n  );\n\n  test.each([\"pypi\", \"nuget\", \"npm\", \"maven\", \"golang\"])(\n    \"release workflow includes release_%s job\",\n    (language) => {\n      expect(release).toHaveProperty(\n        `jobs.release_${language}.runs-on`,\n        EXPECTED_RUNS_ON\n      );\n    }\n  );\n});\n"
  },
  {
    "path": "test/cdk/testtree/abc.myext.ts",
    "content": "// Placeholder\n"
  },
  {
    "path": "test/cdk8s/__snapshots__/integration-test.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`IntegrationTest adding an integration test 1`] = `\nObject {\n  \"description\": \"update snapshot for integration test \\\\\"my-test-name\\\\\"\",\n  \"name\": \"integ:my-test-name:snapshot\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"rm -fr test/my-test-name.integ.snapshot\",\n    },\n    Object {\n      \"exec\": \"cdk8s synth --app \\\\\"ts-node -P tsconfig.dev.json test/my-test-name.integ.ts\\\\\" -o test/my-test-name.integ.snapshot\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest adding an integration test 2`] = `\nObject {\n  \"description\": \"deploy integration test 'my-test-name' and capture snapshot\",\n  \"name\": \"integ:my-test-name:deploy\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"rm -fr test/.tmp/my-test-name.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"cdk8s synth --app \\\\\"ts-node -P tsconfig.dev.json test/my-test-name.integ.ts\\\\\" -o test/.tmp/my-test-name.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"kubectl apply -f test/.tmp/my-test-name.integ/deploy.cdk.out\",\n    },\n    Object {\n      \"exec\": \"rm -fr test/my-test-name.integ.snapshot\",\n    },\n    Object {\n      \"exec\": \"mv test/.tmp/my-test-name.integ/deploy.cdk.out test/my-test-name.integ.snapshot\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest adding an integration test 3`] = `\nObject {\n  \"description\": \"assert the snapshot of integration test 'my-test-name'\",\n  \"name\": \"integ:my-test-name:assert\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"[ -d \\\\\"test/my-test-name.integ.snapshot\\\\\" ] || (echo \\\\\"No snapshot available for integration test 'my-test-name'. Run 'projen integ:my-test-name:deploy' to capture.\\\\\" && exit 1)\",\n    },\n    Object {\n      \"exec\": \"cdk8s synth --app \\\\\"ts-node -P tsconfig.dev.json test/my-test-name.integ.ts\\\\\" -o test/.tmp/my-test-name.integ/assert.cdk.out > /dev/null\",\n    },\n    Object {\n      \"exec\": \"diff test/my-test-name.integ.snapshot/ test/.tmp/my-test-name.integ/assert.cdk.out/\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest adding an integration test 4`] = `\nObject {\n  \"description\": \"update snapshot for all integration tests\",\n  \"name\": \"integ:snapshot-all\",\n  \"steps\": Array [\n    Object {\n      \"spawn\": \"integ:my-test-name:snapshot\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest adding an integration test 5`] = `\nObject {\n  \"description\": \"Run tests\",\n  \"name\": \"test\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"jest --passWithNoTests --all --updateSnapshot\",\n    },\n    Object {\n      \"spawn\": \"eslint\",\n    },\n    Object {\n      \"spawn\": \"integ:my-test-name:assert\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest explicit name 1`] = `\nObject {\n  \"description\": \"update snapshot for all integration tests\",\n  \"name\": \"integ:snapshot-all\",\n  \"steps\": Array [\n    Object {\n      \"spawn\": \"integ:foobar:snapshot\",\n    },\n  ],\n}\n`;\n\nexports[`IntegrationTest explicit name 2`] = `\nObject {\n  \"description\": \"Run tests\",\n  \"name\": \"test\",\n  \"steps\": Array [\n    Object {\n      \"exec\": \"jest --passWithNoTests --all --updateSnapshot\",\n    },\n    Object {\n      \"spawn\": \"eslint\",\n    },\n    Object {\n      \"spawn\": \"integ:foobar:assert\",\n    },\n  ],\n}\n`;\n"
  },
  {
    "path": "test/cdk8s/cdk8s-app-project-py.test.ts",
    "content": "import * as yaml from \"yaml\";\nimport { Cdk8sPythonApp } from \"../../src/cdk8s\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"basic options\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"1.5.53\",\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  // expect a synth task\n  expect(output[\".projen/tasks.json\"].tasks.synth.steps).toStrictEqual([\n    {\n      exec: \"cdk8s synth\",\n    },\n  ]);\n\n  // expect cdk8s.yaml to contain the k8s import\n  expect(yaml.parse(output[\"cdk8s.yaml\"])).toStrictEqual({\n    app: \"python app.py\",\n    imports: [\"k8s\"],\n    language: \"python\",\n  });\n\n  // expect postcompile step to contain synth\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"post-compile\"].steps\n  ).toStrictEqual([{ spawn: \"synth\" }]);\n\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s>=1.5.53, <2.0.0\");\n});\n\ntest(\"CDK8s version pinning\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"1.1.0\",\n    cdk8sVersionPinning: true,\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s==1.1.0\");\n});\n\ntest(\"CDK8s V1 and constructs version undefined\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"1.5.53\",\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s>=1.5.53, <2.0.0\");\n  expect(output[\"requirements.txt\"]).toContain(\"constructs>=3.4.39, <4.0.0\");\n});\n\ntest(\"CDK8s V1 and constructs version defined\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"1.1.0\",\n    constructsVersion: \"3.2.34\",\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s>=1.1.0, <2.0.0\");\n  expect(output[\"requirements.txt\"]).toContain(\"constructs>=3.2.34, <4.0.0\");\n});\n\ntest(\"CDK8s V2 and constructs version undefined\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"2.3.33\",\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s>=2.3.33, <3.0.0\");\n  expect(output[\"requirements.txt\"]).toContain(\"constructs>=10.1.42, <11.0.0\");\n});\n\ntest(\"CDK8s V2 and constructs version defined\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"2.3.33\",\n    constructsVersion: \"10.0.0\",\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s>=2.3.33, <3.0.0\");\n  expect(output[\"requirements.txt\"]).toContain(\"constructs>=10.0.0, <11.0.0\");\n});\n\ntest(\"CDK8s V2 and constructs version pinning\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"2.3.33\",\n    constructsVersion: \"10.0.0\",\n    constructsVersionPinning: true,\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s>=2.3.33, <3.0.0\");\n  expect(output[\"requirements.txt\"]).toContain(\"constructs==10.0.0\");\n});\n\ntest(\"cdk8s-plus-22 undefined\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"2.3.33\",\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\n    \"cdk8s-plus-22>=2.0.0rc26, <3.0.0\"\n  );\n});\n\ntest(\"cdk8s-plus-22 defined\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"2.3.33\",\n    cdk8sPlusVersion: \"2.0.0-rc.27\",\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\n    \"cdk8s-plus-22>=2.0.0rc27, <3.0.0\"\n  );\n});\n\ntest(\"cdk8s-plus-22 pinning\", () => {\n  // GIVEN\n  const project = new Cdk8sPythonApp({\n    authorEmail: \"test@cdk8spythonapp.com\",\n    authorName: \"First Last\",\n    moduleName: \"test_cdk8s_python_app_project\",\n    name: \"test-cdk8s-python-app-project\",\n    version: \"0.1.0\",\n    cdk8sVersion: \"2.3.33\",\n    cdk8sPlusVersion: \"2.0.0-rc.26\",\n    cdk8sPlusVersionPinning: true,\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\"requirements.txt\"]).toContain(\"cdk8s-plus-22==2.0.0rc26\");\n});\n"
  },
  {
    "path": "test/cdk8s/cdk8s-app-project-ts.test.ts",
    "content": "import * as yaml from \"yaml\";\nimport { TaskRuntime } from \"../../src\";\nimport { Cdk8sTypeScriptApp } from \"../../src/cdk8s\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"test if cdk8s synth is possible\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.18\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n  });\n\n  const output = synthSnapshot(project);\n\n  // expect a synth script\n  expect(output[\"package.json\"].scripts.synth).toContain(\"npx projen synth\");\n\n  // expect a synth task\n  expect(output[\".projen/tasks.json\"].tasks.synth.steps).toStrictEqual([\n    {\n      exec: \"cdk8s synth\",\n    },\n  ]);\n\n  // expect an import task\n  expect(output[\".projen/tasks.json\"].tasks.import.steps).toStrictEqual([\n    {\n      exec: \"cdk8s import -o src/imports\",\n    },\n  ]);\n\n  // expect cdk8s.yaml to contain the k8s import\n  expect(yaml.parse(output[\"cdk8s.yaml\"])).toStrictEqual({\n    app: \"node lib/main.js\",\n    imports: [\"k8s\"],\n    language: \"typescript\",\n  });\n\n  // expect postcompile step to contain synth\n  expect(\n    output[\".projen/tasks.json\"].tasks[\"post-compile\"].steps\n  ).toStrictEqual([{ spawn: \"synth\" }]);\n\n  expect(output[\"package.json\"].dependencies).toStrictEqual({\n    cdk8s: \"^1.0.0-beta.18\",\n    constructs: \"^3.3.75\",\n    \"cdk8s-plus-22\": \"^1.0.0-beta.222\",\n  });\n});\n\ntest(\"adding cdk8sImports\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.18\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n    k8sSpecVersion: \"1.20.0\",\n    cdk8sImports: [\"github:crossplane/crossplane@0.14.0\"],\n  });\n\n  // WHEN\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\".projen/tasks.json\"].tasks.import.steps).toStrictEqual([\n    {\n      exec: \"cdk8s import -o src/imports\",\n    },\n  ]);\n  expect(yaml.parse(output[\"cdk8s.yaml\"])).toStrictEqual({\n    app: \"node lib/main.js\",\n    imports: [\"k8s@1.20.0\", \"github:crossplane/crossplane@0.14.0\"],\n    language: \"typescript\",\n  });\n});\n\ntest(\"constructs version undefined\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.11\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].dependencies).toStrictEqual({\n    cdk8s: \"^1.0.0-beta.11\",\n    constructs: \"^3.4.39\",\n    \"cdk8s-plus-22\": \"^1.0.0-beta.222\",\n  });\n});\n\ntest(\"constructs version pinning\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.18\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n    constructsVersionPinning: true,\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].dependencies).toStrictEqual({\n    cdk8s: \"^1.0.0-beta.18\",\n    constructs: \"3.3.75\",\n    \"cdk8s-plus-22\": \"^1.0.0-beta.222\",\n  });\n});\n\ntest(\"cdk8sPlusVersion undefined\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.11\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].dependencies).toStrictEqual({\n    cdk8s: \"^1.0.0-beta.11\",\n    constructs: \"^3.3.75\",\n    \"cdk8s-plus-22\": \"^1.0.0-beta.222\",\n  });\n});\n\ntest(\"cdk8sPlusVersion defined\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.11\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n    cdk8sPlusVersion: \"1.0.0-beta.200\",\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].dependencies).toStrictEqual({\n    cdk8s: \"^1.0.0-beta.11\",\n    constructs: \"^3.3.75\",\n    \"cdk8s-plus-22\": \"^1.0.0-beta.200\",\n  });\n});\n\ntest(\"cdk8sPlusVersion pinning\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.11\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    cdk8sPlusVersionPinning: true,\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].dependencies).toStrictEqual({\n    cdk8s: \"^1.0.0-beta.11\",\n    constructs: \"^3.3.75\",\n    \"cdk8s-plus-22\": \"1.0.0-beta.222\",\n  });\n});\n\ntest(\"upgrade task ignores pinned versions\", () => {\n  const project = new Cdk8sTypeScriptApp({\n    cdk8sVersion: \"1.0.0-beta.11\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    constructsVersionPinning: true,\n    cdk8sVersionPinning: true,\n    cdk8sCliVersionPinning: true,\n    cdk8sPlusVersionPinning: true,\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n  });\n  const tasks = synthSnapshot(project)[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[1].exec).toStrictEqual(\n    \"npm-check-updates --dep dev --upgrade --target=minor --reject='cdk8s-cli,cdk8s-plus-22,cdk8s,constructs'\"\n  );\n});\n"
  },
  {
    "path": "test/cdk8s/cdk8s-construct.test.ts",
    "content": "import { cdk8s } from \"../../src\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"constructs version defined\", () => {\n  const project = new cdk8s.ConstructLibraryCdk8s({\n    cdk8sVersion: \"1.4.9\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n    repositoryUrl: \"github.com/test/test\",\n    author: \"test\",\n    authorAddress: \"test@test.com\",\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].peerDependencies).toStrictEqual({\n    cdk8s: \"^1.4.9\",\n    constructs: \"^3.3.75\",\n  });\n});\n\ntest(\"constructs version undefined\", () => {\n  const project = new cdk8s.ConstructLibraryCdk8s({\n    cdk8sVersion: \"1.4.9\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    repositoryUrl: \"github.com/test/test\",\n    author: \"test\",\n    authorAddress: \"test@test.com\",\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].peerDependencies).toStrictEqual({\n    cdk8s: \"^1.4.9\",\n    constructs: \"^3.3.196\",\n  });\n});\n\ntest(\"constructs version pinning\", () => {\n  const project = new cdk8s.ConstructLibraryCdk8s({\n    cdk8sVersion: \"1.4.9\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    constructsVersion: \"3.3.75\",\n    constructsVersionPinning: true,\n    repositoryUrl: \"github.com/test/test\",\n    author: \"test\",\n    authorAddress: \"test@test.com\",\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].peerDependencies).toStrictEqual({\n    cdk8s: \"^1.4.9\",\n    constructs: \"3.3.75\",\n  });\n});\n\ntest(\"cdk8sPlusVersion undefined\", () => {\n  const project = new cdk8s.ConstructLibraryCdk8s({\n    cdk8sVersion: \"1.4.9\",\n    name: \"project\",\n    defaultReleaseBranch: \"main\",\n    releaseWorkflow: true,\n    repositoryUrl: \"github.com/test/test\",\n    author: \"test\",\n    authorAddress: \"test@test.com\",\n    constructsVersion: \"3.3.75\",\n  });\n\n  const output = synthSnapshot(project);\n\n  expect(output[\"package.json\"].peerDependencies).toStrictEqual({\n    cdk8s: \"^1.4.9\",\n    constructs: \"^3.3.75\",\n  });\n});\n\ndescribe(\"cdk8s and consructs version\", () => {\n  test(\"throws if not compatible\", () => {\n    // Given\n    const cdk8sVersion = \"2.0.0\";\n    const constructsVersion = \"3.3.196\";\n\n    // When\n    const createCdk8sConstructLibrary = () => {\n      new cdk8s.ConstructLibraryCdk8s({\n        cdk8sVersion,\n        name: \"project\",\n        defaultReleaseBranch: \"main\",\n        releaseWorkflow: true,\n        constructsVersion,\n        repositoryUrl: \"github.com/test/test\",\n        author: \"test\",\n        authorAddress: \"test@test.com\",\n      });\n    };\n\n    // Then\n    expect(createCdk8sConstructLibrary).toThrow(\n      /cdk8s 2.x requires constructs 10.x/\n    );\n  });\n\n  test(\"uses constructs v10 for cdk8s v2\", () => {\n    // Given\n    const cdk8sVersion = \"2.0.0\";\n\n    // When\n    const project = new cdk8s.ConstructLibraryCdk8s({\n      cdk8sVersion,\n      name: \"project\",\n      defaultReleaseBranch: \"main\",\n      releaseWorkflow: true,\n      repositoryUrl: \"github.com/test/test\",\n      author: \"test\",\n      authorAddress: \"test@test.com\",\n    });\n    const output = synthSnapshot(project);\n\n    // Then\n    expect(output[\"package.json\"].peerDependencies).toStrictEqual({\n      cdk8s: \"^2.0.0\",\n      constructs: \"^10.0.0\",\n    });\n  });\n\n  test(\"uses constructs v3 for cdk8s v1\", () => {\n    // Given\n    const cdk8sVersion = \"1.0.0\";\n\n    // When\n    const project = new cdk8s.ConstructLibraryCdk8s({\n      cdk8sVersion,\n      name: \"project\",\n      defaultReleaseBranch: \"main\",\n      releaseWorkflow: true,\n      repositoryUrl: \"github.com/test/test\",\n      author: \"test\",\n      authorAddress: \"test@test.com\",\n    });\n    const output = synthSnapshot(project);\n\n    // Then\n    expect(output[\"package.json\"].peerDependencies).toStrictEqual({\n      cdk8s: \"^1.0.0\",\n      constructs: \"^3.3.196\",\n    });\n  });\n});\n"
  },
  {
    "path": "test/cdk8s/integration-test.test.ts",
    "content": "import { cdk8s } from \"../../src\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"IntegrationTest\", () => {\n  test(\"adding an integration test\", () => {\n    const project = new cdk8s.Cdk8sTypeScriptApp({\n      cdk8sVersion: \"1.0.0-beta.11\",\n      name: \"project\",\n      defaultReleaseBranch: \"main\",\n      releaseWorkflow: true,\n    });\n\n    // WHEN\n    new cdk8s.IntegrationTest(project, {\n      entrypoint: \"test/my-test-name.integ.ts\",\n      tsconfigPath: project.tsconfigDev.fileName,\n    });\n\n    // THEN\n    const output = synthSnapshot(project);\n    const tasks = output[\".projen/tasks.json\"].tasks;\n    expect(tasks[\"integ:my-test-name:snapshot\"]).toMatchSnapshot();\n    expect(tasks[\"integ:my-test-name:deploy\"]).toMatchSnapshot();\n    expect(tasks[\"integ:my-test-name:assert\"]).toMatchSnapshot();\n    expect(tasks[\"integ:snapshot-all\"]).toMatchSnapshot();\n    expect(tasks.test).toMatchSnapshot();\n  });\n\n  test(\"explicit name\", () => {\n    const project = new cdk8s.Cdk8sTypeScriptApp({\n      cdk8sVersion: \"1.0.0-beta.11\",\n      name: \"project\",\n      defaultReleaseBranch: \"main\",\n      releaseWorkflow: true,\n    });\n\n    // WHEN\n    new cdk8s.IntegrationTest(project, {\n      name: \"foobar\",\n      entrypoint: \"test/my-test-name.integ.ts\",\n      tsconfigPath: project.tsconfigDev.fileName,\n    });\n\n    // THEN\n    const output = synthSnapshot(project);\n    const tasks = output[\".projen/tasks.json\"].tasks;\n    expect(tasks[\"integ:foobar:snapshot\"]).toBeDefined();\n    expect(tasks[\"integ:foobar:deploy\"]).toBeDefined();\n    expect(tasks[\"integ:foobar:assert\"]).toBeDefined();\n    expect(tasks[\"integ:snapshot-all\"]).toMatchSnapshot();\n    expect(tasks.test).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "test/cdktf/cdktf-construct.test.ts",
    "content": "import {\n  ConstructLibraryCdktf,\n  ConstructLibraryCdktfOptions,\n} from \"../../src/cdktf\";\nimport { NpmAccess } from \"../../src/javascript\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"constructs dependency selection\", () => {\n  test(\"user-selected\", () => {\n    // GIVEN\n    const project = new TestProject({ cdktfVersion: \"0.99\" });\n\n    // WHEN\n    const snapshot = synthSnapshot(project);\n\n    // THEN\n    expect(snapshot[\"package.json\"]?.peerDependencies?.cdktf).toBe(\"0.99\");\n    expect(snapshot[\"package.json\"]?.devDependencies?.cdktf).toBe(\"0.99.0\");\n    expect(snapshot[\"package.json\"]?.dependencies?.cdktf).toBeUndefined();\n  });\n\n  test(\"user-selected constructs version\", () => {\n    // GIVEN\n    const project = new TestProject({\n      cdktfVersion: \"0.99\",\n      constructsVersion: \"10.0.1\",\n    });\n\n    // WHEN\n    const snapshot = synthSnapshot(project);\n\n    // THEN\n    expect(snapshot[\"package.json\"]?.peerDependencies?.constructs).toBe(\n      \"10.0.1\"\n    );\n    expect(snapshot[\"package.json\"]?.devDependencies?.constructs).toBe(\n      \"10.0.1\"\n    );\n    expect(snapshot[\"package.json\"]?.dependencies?.constructs).toBeUndefined();\n  });\n});\n\nconst defaultOptions = {\n  author: \"Nobody\",\n  authorAddress: \"nobody@nowhere.com\",\n  clobber: false,\n  defaultReleaseBranch: \"main\",\n  jest: false,\n  name: \"test-project\",\n  npmAccess: NpmAccess.PUBLIC,\n  repositoryUrl: \"https://github.com/projen/projen.git\",\n} as const;\n\nclass TestProject extends ConstructLibraryCdktf {\n  constructor(\n    options: Omit<ConstructLibraryCdktfOptions, keyof typeof defaultOptions>\n  ) {\n    super({\n      ...defaultOptions,\n      ...options,\n    });\n  }\n}\n"
  },
  {
    "path": "test/cirlceci/__snapshots__/circleci.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`additional workflow can be added 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2.1\norbs:\n  hello: world:2.0\nworkflows:\n  workflow1:\n    jobs:\n      - job1:\n          context:\n            - context1\n      - job2:\n          name: customName2\n  workflow3:\n    jobs:\n      - job3:\n          context:\n            - context3\n\"\n`;\n\nexports[`full spec of api should be provided 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2.1\norbs:\n  hello: world:2.0\njobs:\n  custom-job-1:\n    docker:\n      - image: golang:alpine\n        environment:\n          GO111MODULE: true\n    working_directory: .\n    machine:\n      image: node:alpine\n    steps:\n      - checkout\n      - run:\n          command: |-\n            echo $HELLOW_WORLD\n            echo this is multiline\n    parameters:\n      job1Param:\n        description: job1Param description\n        type: string\n        default: job1Param default\nworkflows:\n  workflow1:\n    when:\n      or:\n        - equal:\n            - main\n            - << pipeline.git.branch >>\n        - equal:\n            - staging\n            - << pipeline.git.branch >>\n    triggers:\n      - schedule:\n          cron: 0 0 * * *\n          filters:\n            branches:\n              only:\n                - main\n                - beta\n    jobs:\n      - job1:\n          name: renamedJob2\n          matrix:\n            parameters:\n              version:\n                - 0.1\n                - 0.2\n                - 0.3\n              platform:\n                - macos\n                - windows\n                - linux\n          install-yarn: true\n          node_version: 16.13\n      - checkout\n\"\n`;\n\nexports[`orb with the same id can not be added 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2.1\norbs:\n  hello: world:2.0\nworkflows:\n  workflow1:\n    jobs:\n      - job1:\n          name: renamedJob2\n\"\n`;\n"
  },
  {
    "path": "test/cirlceci/circleci.test.ts",
    "content": "import * as YAML from \"yaml\";\nimport { WorkflowJob } from \"../../lib/circleci\";\nimport {\n  Circleci,\n  CircleCiProps,\n  isObjectContainingFieldExactly,\n  PipelineParameterType,\n} from \"../../src/circleci\";\n// @ts-ignore\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"full spec of api should be provided\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const options: CircleCiProps = {\n    orbs: {\n      hello: \"world:2.0\",\n    },\n    jobs: [\n      {\n        identifier: \"custom-job-1\",\n        docker: [\n          {\n            image: \"golang:alpine\",\n            environment: {\n              GO111MODULE: true,\n            },\n          },\n        ],\n        workingDirectory: \".\",\n        machine: {\n          image: \"node:alpine\",\n        },\n        steps: [\n          \"checkout\",\n          {\n            run: {\n              command: [\"echo $HELLOW_WORLD\", \"echo this is multiline\"].join(\n                \"\\n\"\n              ),\n            },\n          },\n        ],\n        parameters: {\n          job1Param: {\n            description: \"job1Param description\",\n            type: PipelineParameterType.STRING,\n            default: \"job1Param default\",\n          },\n        },\n      },\n    ],\n    workflows: [\n      {\n        identifier: \"workflow1\",\n        when: {\n          or: [\n            { equal: [\"main\", \"<< pipeline.git.branch >>\"] },\n            { equal: [\"staging\", \"<< pipeline.git.branch >>\"] },\n          ],\n        },\n        triggers: [\n          {\n            schedule: {\n              cron: \"0 0 * * *\",\n              filters: {\n                branches: {\n                  only: [\"main\", \"beta\"],\n                },\n              },\n            },\n          },\n        ],\n        jobs: [\n          {\n            identifier: \"job1\",\n            name: \"renamedJob2\",\n            orbParameters: {\n              \"install-yarn\": true,\n              node_version: 16.13,\n            },\n            matrix: {\n              parameters: {\n                version: [0.1, 0.2, 0.3],\n                platform: [\"macos\", \"windows\", \"linux\"],\n              },\n            },\n          },\n          {\n            identifier: \"checkout\",\n          },\n        ],\n      },\n    ],\n  };\n  new Circleci(p, options);\n  const snapshot = synthSnapshot(p);\n  const circleci = snapshot[\".circleci/config.yml\"];\n  const yaml = YAML.parse(circleci);\n\n  expect(circleci).toMatchSnapshot();\n  expect(circleci).toContain(\"renamedJob2\");\n  expect(circleci).toContain(\"0 0 * * *\");\n  expect(circleci).toContain(\"windows\");\n  const wJob = yaml.workflows.workflow1.jobs[0].job1;\n  // testing orb parameters and snake case should be ignored here\n  expect(wJob).toEqual(\n    expect.objectContaining({\n      \"install-yarn\": true,\n      node_version: 16.13,\n    })\n  );\n\n  const customJob = yaml.jobs[\"custom-job-1\"];\n  expect(customJob.docker[0].image).toEqual(\"golang:alpine\");\n  expect(customJob.machine.image).toEqual(\"node:alpine\");\n  expect(customJob.steps).toHaveLength(2);\n  expect(customJob.steps).toContain(\"checkout\");\n  expect(customJob).toEqual(\n    // test snake case\n    expect.objectContaining({ working_directory: \".\" })\n  );\n  expect(customJob).toEqual(\n    // test parameters\n    expect.objectContaining({\n      parameters: {\n        job1Param: {\n          description: \"job1Param description\",\n          type: \"string\",\n          default: \"job1Param default\",\n        },\n      },\n    })\n  );\n});\n\ntest(\"test type conversion for workflow jobs with identifier only\", () => {\n  const job1: WorkflowJob = {\n    identifier: \"checkout\",\n  };\n  const job2: WorkflowJob = {\n    identifier: \"checkout\",\n    name: \"hello-world\",\n  };\n  expect(isObjectContainingFieldExactly(job1, \"identifier\")).toEqual(true);\n  expect(isObjectContainingFieldExactly(job2, \"identifier\")).toEqual(false);\n});\n\ntest(\"additional workflow can be added\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const options: CircleCiProps = {\n    orbs: {\n      hello: \"world:2.0\",\n    },\n    workflows: [\n      {\n        identifier: \"workflow1\",\n        jobs: [\n          {\n            identifier: \"job1\",\n            context: [\"context1\"],\n          },\n          {\n            identifier: \"job2\",\n            name: \"customName2\",\n          },\n        ],\n      },\n    ],\n  };\n  const circle = new Circleci(p, options);\n  circle.addWorkflow({\n    identifier: \"workflow3\",\n    jobs: [{ identifier: \"job3\", context: [\"context3\"] }],\n  });\n  const snapshot = synthSnapshot(p);\n  const circleci = snapshot[\".circleci/config.yml\"];\n  expect(circleci).toMatchSnapshot();\n  expect(circleci).toContain(\"customName2\");\n  expect(circleci).toContain(\"context3\");\n});\n\ntest(\"orb with the same id can not be added\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const options: CircleCiProps = {\n    orbs: {\n      hello: \"world:2.0\",\n    },\n    workflows: [\n      {\n        identifier: \"workflow1\",\n        jobs: [\n          {\n            identifier: \"job1\",\n            name: \"renamedJob2\",\n          },\n        ],\n      },\n    ],\n  };\n  const circle = new Circleci(p, options);\n  expect(() => circle.addOrb(\"hello\", \"world:3.0\")).toThrowError(\n    \"Circleci Config already contains an orb named hello.\"\n  );\n\n  const snapshot = synthSnapshot(p);\n  const circleci = snapshot[\".circleci/config.yml\"];\n  expect(circleci).toMatchSnapshot();\n  expect(circleci).toContain(\"workflow1\");\n  expect(circleci).toContain(\"world:2.0\");\n  expect(circleci).not.toContain(\"world:3.0\");\n});\n"
  },
  {
    "path": "test/cleanup.test.ts",
    "content": "import { join } from \"path\";\nimport { readJsonSync } from \"fs-extra\";\nimport { DependencyType, JsonFile, SampleFile, TextFile } from \"../src\";\nimport { cleanup, FILE_MANIFEST } from \"../src/cleanup\";\nimport { PROJEN_MARKER } from \"../src/common\";\nimport { directorySnapshot, TestProject } from \"./util\";\n\ntest(\"cleanup uses cache file\", () => {\n  // GIVEN\n  const p = new TestProject();\n  p.deps.addDependency(\"test\", DependencyType.BUILD);\n  const textFile = new TextFile(p, \"foo/bar.txt\");\n  new SampleFile(p, \"sample.txt\", {\n    contents: PROJEN_MARKER,\n  });\n\n  // WHEN\n  p.synth();\n\n  const preDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const preFiles = Object.keys(preDirSnapshot);\n\n  const fileList: string[] = readJsonSync(join(p.outdir, FILE_MANIFEST)).files;\n\n  cleanup(p.outdir, [], []);\n\n  const postDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const postFiles = Object.keys(postDirSnapshot);\n\n  const deletedFiles = preFiles.filter((f) => !postFiles.includes(f));\n\n  // THEN\n  expect(deletedFiles).toEqual(fileList);\n  expect(deletedFiles).toContain(textFile.path);\n  expect(deletedFiles).not.toContain(\"sample.txt\");\n  expect(deletedFiles).toMatchSnapshot();\n});\n\ntest(\"cleanup falls back to greedy method\", () => {\n  // GIVEN\n  const p = new TestProject();\n  p.deps.addDependency(\"test\", DependencyType.BUILD);\n\n  // This file would not normally get cleaned up up by the file manifest\n  new TextFile(p, \"delete.txt\", {\n    readonly: false,\n    lines: [PROJEN_MARKER],\n  });\n\n  // corrupt file manifest\n  p.tryFindObjectFile(FILE_MANIFEST)!.addDeletionOverride(\"files\");\n\n  // WHEN\n  p.synth();\n\n  const preDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const preFiles = Object.keys(preDirSnapshot);\n\n  cleanup(p.outdir, [], []);\n\n  const postDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const postFiles = Object.keys(postDirSnapshot);\n\n  const deletedFiles = preFiles.filter((f) => !postFiles.includes(f));\n\n  // THEN\n  expect(postFiles).not.toContain(\"delete.txt\");\n  expect(deletedFiles).toMatchSnapshot();\n});\n\ntest(\"cleanup only orphaned files\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const keepFile = new TextFile(p, \"keep-this\");\n  const deleteFile = new TextFile(p, \"not-this\");\n\n  // WHEN\n  p.synth();\n\n  const preDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const preFiles = Object.keys(preDirSnapshot);\n\n  const fileList: string[] = readJsonSync(join(p.outdir, FILE_MANIFEST)).files;\n\n  cleanup(p.outdir, [\"keep-this\"], []);\n\n  const postDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const postFiles = Object.keys(postDirSnapshot);\n\n  const deletedFiles = preFiles.filter((f) => !postFiles.includes(f));\n\n  // THEN\n  expect(deletedFiles).not.toEqual(fileList);\n  expect(deletedFiles).toContain(deleteFile.path);\n  expect(deletedFiles).not.toContain(keepFile.path);\n  expect(deletedFiles).toMatchSnapshot();\n});\n\ntest(\"cleanup empty files\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const emptyFile = new JsonFile(p, \"will-be-empty\", { obj: { test: \"test\" } });\n\n  // WHEN\n  p.synth();\n\n  // Force file to be empty on next synth\n  (emptyFile as any).synthesizeContent = () => undefined;\n\n  const preDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const preFiles = Object.keys(preDirSnapshot);\n  const fileList: string[] = readJsonSync(join(p.outdir, FILE_MANIFEST)).files;\n\n  p.synth();\n\n  const postDirSnapshot = directorySnapshot(p.outdir, { onlyFileNames: true });\n  const postFiles = Object.keys(postDirSnapshot);\n  const deletedFiles = preFiles.filter((f) => !postFiles.includes(f));\n\n  // THEN\n  expect(deletedFiles).not.toEqual(fileList);\n  expect(deletedFiles).toContain(emptyFile.path);\n  expect(deletedFiles).toMatchSnapshot();\n});\n"
  },
  {
    "path": "test/cli.test.ts",
    "content": "import { join } from \"path\";\nimport { writeFileSync } from \"fs-extra\";\nimport { Project } from \"../src/project\";\nimport { directorySnapshot, execProjenCLI, mkdtemp } from \"./util\";\n\nconst MOCK_PROJENRC =\n  \"new (require('projen').Project)({ name: 'foo' }).synth()\";\n\ntest('the \"--rc\" option can be used to specify projenrc location', () => {\n  const dir1 = mkdtemp();\n  const dir2 = mkdtemp();\n\n  const rcfile = join(dir1, \"custom-projenrc.js\");\n  writeFileSync(rcfile, MOCK_PROJENRC);\n\n  execProjenCLI(dir2, [\"--rc\", rcfile]);\n  expect(directorySnapshot(dir2)).toMatchSnapshot();\n});\n\ntest('running \"projen\" with no arguments will execute .projenrc.js', () => {\n  const workdir = mkdtemp();\n  const rcfile = join(workdir, \".projenrc.js\");\n  writeFileSync(rcfile, MOCK_PROJENRC);\n\n  execProjenCLI(workdir);\n  expect(directorySnapshot(workdir)).toMatchSnapshot();\n});\n\ntest('running \"projen\" for projects with a \"default\" task will execute it', () => {\n  const project = new Project({ name: \"my-project\" });\n  project.defaultTask?.exec('echo \"foo\" > bar.txt');\n  project.synth();\n\n  execProjenCLI(project.outdir);\n  expect(directorySnapshot(project.outdir)[\"bar.txt\"]).toStrictEqual(\"foo\\n\");\n});\n"
  },
  {
    "path": "test/deps.test.ts",
    "content": "import { join } from \"path\";\nimport { existsSync, readFileSync } from \"fs-extra\";\nimport { Project } from \"../src\";\nimport { Dependencies, DependencyType } from \"../src/dependencies\";\nimport { TestProject } from \"./util\";\n\ntest(\"no dependencies, no manifest\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // THEN\n  expect(depsManifest(p)).toBeUndefined();\n});\n\ntest(\"minimal case\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  const dep = p.deps.addDependency(\"my-first-dep\", DependencyType.RUNTIME);\n\n  // THEN\n  expect(dep.name).toBe(\"my-first-dep\");\n  expect(dep.version).toBeUndefined();\n  expect(dep.type).toBe(DependencyType.RUNTIME);\n  expect(depsManifest(p)).toMatchSnapshot();\n});\n\ntest(\"with version requirement\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  const dep = p.deps.addDependency(\"depy@^7\", DependencyType.PEER);\n\n  // THEN\n  expect(dep.name).toBe(\"depy\");\n  expect(dep.version).toBe(\"^7\");\n  expect(dep.type).toBe(DependencyType.PEER);\n\n  expect(depsManifest(p)).toMatchSnapshot();\n});\n\ntest(\"with package alias\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  const dep = p.deps.addDependency(\"bar@npm:@bar/legacy\", DependencyType.PEER);\n\n  // THEN\n  expect(dep.name).toBe(\"bar\");\n  expect(dep.version).toBe(\"npm:@bar/legacy\");\n  expect(dep.type).toBe(DependencyType.PEER);\n\n  expect(depsManifest(p)).toMatchSnapshot();\n});\n\ntest(\"deps.all returns all the dependencies\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.deps.addDependency(\"dep1\", DependencyType.DEVENV);\n  p.deps.addDependency(\"dep2\", DependencyType.RUNTIME);\n  p.deps.addDependency(\"dep3\", DependencyType.PEER);\n\n  // THEN\n  expect(p.deps.all).toMatchSnapshot();\n});\n\ntest(\"duplicates are ignored\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.deps.addDependency(\"depy\", DependencyType.PEER);\n  p.deps.addDependency(\"depy\", DependencyType.PEER);\n\n  // THEN\n  expect(p.deps.getDependency(\"depy\")).toBeDefined();\n  expect(p.deps.all.length).toEqual(1);\n  expect(depsManifest(p)).toMatchSnapshot();\n});\n\ntest(\"can be overridden with more specific version\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.deps.addDependency(\"depy\", DependencyType.PEER);\n  p.deps.addDependency(\"depy@^9\", DependencyType.PEER);\n\n  // THEN\n  expect(p.deps.getDependency(\"depy\").version).toEqual(\"^9\");\n  expect(depsManifest(p)).toMatchSnapshot();\n});\n\ndescribe(\"removeDependency()\", () => {\n  test(\"can be used to remove a dependency\", () => {\n    // GIVEN\n    const p = new TestProject();\n    p.deps.addDependency(\"mydep\", DependencyType.RUNTIME);\n\n    // WHEN\n    p.deps.removeDependency(\"mydep\");\n\n    // THEN\n    expect(p.deps.all).toStrictEqual([]);\n  });\n\n  test(\"dep is defined for multiple types (e.g. dev + runtime)\", () => {\n    // GIVEN\n    const p = new TestProject();\n    p.deps.addDependency(\"mydep\", DependencyType.RUNTIME);\n    p.deps.addDependency(\"mydep\", DependencyType.BUILD);\n\n    // WHEN\n    p.deps.removeDependency(\"mydep\", DependencyType.BUILD);\n\n    // THEN\n    expect(p.deps.all).toStrictEqual([\n      {\n        name: \"mydep\",\n        type: \"runtime\",\n      },\n    ]);\n  });\n\n  test(\"fails if type is not provided and there are more then one\", () => {\n    // GIVEN\n    const p = new TestProject();\n\n    // WHEN\n    p.deps.addDependency(\"foo\", DependencyType.BUILD);\n    p.deps.addDependency(\"foo\", DependencyType.RUNTIME);\n\n    // THEN\n    expect(() => p.deps.removeDependency(\"foo\")).toThrow(\n      /\"foo\" is defined for multiple dependency types\\: build\\,runtime/\n    );\n  });\n\n  test(\"no-op if the dependency is not defined\", () => {\n    // GIVEN\n    const p = new TestProject();\n    p.deps.addDependency(\"hey\", DependencyType.RUNTIME);\n\n    // WHEN\n    p.deps.removeDependency(\"bam\");\n\n    // THEN\n    expect(p.deps.all).toStrictEqual([\n      {\n        name: \"hey\",\n        type: \"runtime\",\n      },\n    ]);\n  });\n});\n\ndescribe(\"getDependency()\", () => {\n  test(\"returns a single dependency\", () => {\n    // GIVEN\n    const p = new TestProject();\n\n    // WHEN\n    p.deps.addDependency(\"bar@^1.1.1\", DependencyType.RUNTIME);\n\n    // THEN\n    expect(p.deps.getDependency(\"bar\")).toStrictEqual({\n      name: \"bar\",\n      version: \"^1.1.1\",\n      type: DependencyType.RUNTIME,\n    });\n  });\n\n  test(\"matches type\", () => {\n    // GIVEN\n    const p = new TestProject();\n    p.deps.addDependency(\"boo\", DependencyType.BUILD);\n    p.deps.addDependency(\"zar\", DependencyType.RUNTIME);\n    p.deps.addDependency(\"hey@^1.0.0\", DependencyType.RUNTIME);\n\n    // WHEN\n    p.deps.addDependency(\"bar@^1.1.1\", DependencyType.RUNTIME);\n\n    // THEN\n    expect(p.deps.getDependency(\"bar\", DependencyType.RUNTIME)).toStrictEqual({\n      name: \"bar\",\n      version: \"^1.1.1\",\n      type: DependencyType.RUNTIME,\n    });\n  });\n\n  test(\"matches type (multiple)\", () => {\n    // GIVEN\n    const p = new TestProject();\n\n    // WHEN\n    p.deps.addDependency(\"bar@^1.2.1\", DependencyType.RUNTIME);\n    p.deps.addDependency(\"bar@^1.1.1\", DependencyType.BUILD);\n\n    // THEN\n    expect(p.deps.getDependency(\"bar\", DependencyType.RUNTIME)).toStrictEqual({\n      name: \"bar\",\n      version: \"^1.2.1\",\n      type: DependencyType.RUNTIME,\n    });\n  });\n\n  test(\"fails if there is no dependency by that name\", () => {\n    // GIVEN\n    const p = new TestProject();\n    p.deps.addDependency(\"bar@1.1.1\", DependencyType.RUNTIME);\n\n    // THEN\n    expect(() => p.deps.getDependency(\"test\")).toThrow(\n      /there is no dependency defined on \\\"test\\\"/\n    );\n  });\n\n  test(\"fails if there is more then one type and type is not provided\", () => {\n    // GIVEN\n    const p = new TestProject();\n\n    // WHEN\n    p.deps.addDependency(\"zoo\", DependencyType.RUNTIME);\n    p.deps.addDependency(\"zoo\", DependencyType.DEVENV);\n\n    // THEN\n    expect(() => p.deps.getDependency(\"zoo\")).toThrow(\n      /\\\"zoo\\\" is defined for multiple dependency types: runtime,devenv. Please specify dependency type/\n    );\n  });\n\n  test(\"fails if type does not match\", () => {\n    // GIVEN\n    const p = new TestProject();\n\n    // WHEN\n    p.deps.addDependency(\"zoo\", DependencyType.RUNTIME);\n\n    // THEN\n    expect(() => p.deps.getDependency(\"zoo\", DependencyType.BUILD)).toThrow(\n      /there is no build dependency defined on \\\"zoo\\\"/\n    );\n  });\n});\n\ntest(\"tryGetDependency() returns undefined if there is no dep\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.deps.addDependency(\"zoo\", DependencyType.RUNTIME);\n\n  // THEN\n  expect(p.deps.tryGetDependency(\"zoo\")).toStrictEqual({\n    name: \"zoo\",\n    type: \"runtime\",\n  });\n  expect(p.deps.tryGetDependency(\"zoo\", DependencyType.RUNTIME)).toStrictEqual({\n    name: \"zoo\",\n    type: \"runtime\",\n  });\n  expect(p.deps.tryGetDependency(\"zoo\", DependencyType.BUILD)).toBeUndefined();\n  expect(p.deps.tryGetDependency(\"boo\")).toBeUndefined();\n});\n\ntest(\"it is possible to overwrite dependency specs\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.deps.addDependency(\"zoo@^0.3.4\", DependencyType.RUNTIME);\n  p.deps.addDependency(\"zoo@1.2.3\", DependencyType.RUNTIME);\n  p.deps.addDependency(\"zoo@^2.3.4\", DependencyType.BUILD);\n\n  // THEN\n  expect(p.deps.all).toStrictEqual([\n    { name: \"zoo\", type: \"build\", version: \"^2.3.4\" },\n    { name: \"zoo\", type: \"runtime\", version: \"1.2.3\" },\n  ]);\n});\n\ntest(\"it is possible to have local file dependencies\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.deps.addDependency(\"cowsay@file:./cowsay\", DependencyType.RUNTIME);\n  p.deps.addDependency(\"lolcat@file:../path/to/lolcat\", DependencyType.BUILD);\n  p.deps.addDependency(\n    \"fortune@file:../../path/to/fortune\",\n    DependencyType.PEER\n  );\n\n  // THEN\n  expect(p.deps.all).toStrictEqual([\n    { name: \"lolcat\", type: \"build\", version: \"file:../path/to/lolcat\" },\n    { name: \"fortune\", type: \"peer\", version: \"file:../../path/to/fortune\" },\n    { name: \"cowsay\", type: \"runtime\", version: \"file:./cowsay\" },\n  ]);\n});\n\nfunction depsManifest(p: Project) {\n  p.synth();\n  const filepath = join(p.outdir, Dependencies.MANIFEST_FILE);\n  if (!existsSync(filepath)) {\n    return undefined;\n  }\n  return JSON.parse(readFileSync(filepath, \"utf-8\"));\n}\n"
  },
  {
    "path": "test/docker-compose.test.ts",
    "content": "import * as child_process from \"child_process\";\nimport * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { DockerCompose, DockerComposeProtocol } from \"../src\";\nimport * as logging from \"../src/logging\";\nimport { TestProject } from \"./util\";\n\nlogging.disable();\n\ndescribe(\"docker-compose\", () => {\n  test(\"errors when no services\", () => {\n    const project = new TestProject();\n    new DockerCompose(project);\n\n    expect(() => project.synth()).toThrow(/at least one service/i);\n  });\n\n  test(\"errors when imageBuild and image not specified in service\", () => {\n    const project = new TestProject();\n    const dc = new DockerCompose(project);\n\n    expect(() => dc.addService(\"service\", {})).toThrow(\n      /requires exactly one of.*imageBuild.*image/i\n    );\n  });\n\n  test(\"errors when imageBuild and image are both specified in service\", () => {\n    const project = new TestProject();\n    const dc = new DockerCompose(project);\n\n    expect(() =>\n      dc.addService(\"service\", {\n        image: \"nginx\",\n        imageBuild: {\n          context: \".\",\n        },\n      })\n    ).toThrow(/requires exactly one of.*imageBuild.*image/i);\n  });\n\n  test(\"errors when version tag is not a number\", () => {\n    const project = new TestProject();\n    expect(\n      () =>\n        new DockerCompose(project, {\n          schemaVersion: \"blub\",\n          services: {\n            myservice: {\n              image: \"nginx\",\n            },\n          },\n        })\n    ).toThrow(/Version tag needs to be a number/i);\n  });\n\n  test(\"version tag explicit set and created as float\", () => {\n    const project = new TestProject();\n\n    const dc = new DockerCompose(project, {\n      schemaVersion: \"3.1\",\n      services: {\n        myservice: {\n          image: \"nginx\",\n        },\n      },\n    });\n\n    expect(dc._synthesizeDockerCompose()).toEqual({\n      version: \"3.1\",\n      services: {\n        myservice: {\n          image: \"nginx\",\n        },\n      },\n    });\n\n    project.synth();\n    assertDockerComposeFileValidates(project.outdir);\n  });\n\n  test(\"version tag explicit set and created as int\", () => {\n    const project = new TestProject();\n\n    const dc = new DockerCompose(project, {\n      schemaVersion: \"3\",\n      services: {\n        myservice: {\n          image: \"nginx\",\n        },\n      },\n    });\n\n    expect(dc._synthesizeDockerCompose()).toEqual({\n      version: \"3\",\n      services: {\n        myservice: {\n          image: \"nginx\",\n        },\n      },\n    });\n\n    project.synth();\n    assertDockerComposeFileValidates(project.outdir);\n  });\n\n  test(\"version tag defaults to 3.3 when not set\", () => {\n    const project = new TestProject();\n\n    const dc = new DockerCompose(project, {\n      services: {\n        myservice: {\n          image: \"nginx\",\n        },\n      },\n    });\n\n    expect(dc._synthesizeDockerCompose()).toEqual({\n      version: \"3.3\",\n      services: {\n        myservice: {\n          image: \"nginx\",\n        },\n      },\n    });\n\n    project.synth();\n    assertDockerComposeFileValidates(project.outdir);\n  });\n\n  test(\"can build an image\", () => {\n    const project = new TestProject();\n\n    const dc = new DockerCompose(project, {\n      services: {\n        custom: {\n          imageBuild: {\n            context: \".\",\n            dockerfile: \"docker-compose.test.Dockerfile\",\n            args: {\n              FROM: \"alpine\",\n            },\n          },\n          command: [\"sh\", \"-c\", \"echo hi\"],\n        },\n      },\n    });\n\n    expect(dc._synthesizeDockerCompose()).toEqual({\n      version: \"3.3\",\n      services: {\n        custom: {\n          build: {\n            context: \".\",\n            dockerfile: \"docker-compose.test.Dockerfile\",\n            args: {\n              FROM: \"alpine\",\n            },\n          },\n          command: [\"sh\", \"-c\", \"echo hi\"],\n        },\n      },\n    });\n\n    project.synth();\n    assertDockerComposeFileValidates(project.outdir);\n  });\n\n  test(\"can choose a name suffix for the docker-compose.yml\", () => {\n    const project = new TestProject();\n    new DockerCompose(project, {\n      nameSuffix: \"myname\",\n      services: {\n        myservice: {\n          image: \"nginx\",\n        },\n      },\n    });\n\n    project.synth();\n    expect(\n      fs.existsSync(path.join(project.outdir, \"docker-compose.myname.yml\"))\n    );\n  });\n\n  test(\"can add a container command\", () => {\n    const project = new TestProject();\n    const dc = new DockerCompose(project, {\n      services: {\n        alpine: {\n          image: \"alpine\",\n          command: [\"sh\", \"-c\", \"echo I ran\"],\n        },\n      },\n    });\n\n    expect(dc._synthesizeDockerCompose()).toEqual({\n      version: \"3.3\",\n      services: {\n        alpine: {\n          image: \"alpine\",\n          command: [\"sh\", \"-c\", \"echo I ran\"],\n        },\n      },\n    });\n\n    project.synth();\n    assertDockerComposeFileValidates(project.outdir);\n  });\n\n  describe(\"can add a volume\", () => {\n    test(\"bind volume\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project, {\n        services: {\n          myservice: {\n            image: \"nginx\",\n            volumes: [DockerCompose.bindVolume(\"./docroot\", \"/var/www/html\")],\n          },\n        },\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual({\n        version: \"3.3\",\n        services: {\n          myservice: {\n            image: \"nginx\",\n            volumes: [\n              {\n                type: \"bind\",\n                source: \"./docroot\",\n                target: \"/var/www/html\",\n              },\n            ],\n          },\n        },\n      });\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n\n    test(\"named volume\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project, {\n        services: {\n          myservice: {\n            image: \"nginx\",\n            volumes: [DockerCompose.namedVolume(\"html\", \"/var/www/html\")],\n          },\n        },\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual({\n        version: \"3.3\",\n        services: {\n          myservice: {\n            image: \"nginx\",\n            volumes: [\n              {\n                type: \"volume\",\n                source: \"html\",\n                target: \"/var/www/html\",\n              },\n            ],\n          },\n        },\n        volumes: {\n          html: {},\n        },\n      });\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n\n    test(\"named volume with special driver\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project, {\n        services: {\n          web: {\n            image: \"nginx\",\n            volumes: [\n              DockerCompose.namedVolume(\"web\", \"/var/www/html\", {\n                driverOpts: {\n                  type: \"nfs\",\n                  o: \"addr=10.40.0.199,nolock,soft,rw\",\n                  device: \":/docker/example\",\n                },\n              }),\n            ],\n          },\n        },\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual({\n        version: \"3.3\",\n        services: {\n          web: {\n            image: \"nginx\",\n            volumes: [\n              {\n                type: \"volume\",\n                source: \"web\",\n                target: \"/var/www/html\",\n              },\n            ],\n          },\n        },\n        volumes: {\n          web: {\n            driver_opts: {\n              type: \"nfs\",\n              o: \"addr=10.40.0.199,nolock,soft,rw\",\n              device: \":/docker/example\",\n            },\n          },\n        },\n      });\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n\n    test(\"imperatively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project);\n\n      const service = dc.addService(\"myservice\", {\n        image: \"nginx\",\n      });\n      service.addVolume(DockerCompose.namedVolume(\"html\", \"/var/www/html\"));\n\n      expect(dc._synthesizeDockerCompose()).toEqual({\n        version: \"3.3\",\n        services: {\n          myservice: {\n            image: \"nginx\",\n            volumes: [\n              {\n                type: \"volume\",\n                source: \"html\",\n                target: \"/var/www/html\",\n              },\n            ],\n          },\n        },\n        volumes: {\n          html: {},\n        },\n      });\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n  });\n\n  describe(\"can map a port\", () => {\n    const expected = {\n      version: \"3.3\",\n      services: {\n        port: {\n          image: \"nginx\",\n          ports: [\n            {\n              published: 8080,\n              target: 80,\n              protocol: \"tcp\",\n              mode: \"host\",\n            },\n            {\n              published: 8080,\n              target: 80,\n              protocol: \"udp\",\n              mode: \"host\",\n            },\n          ],\n        },\n      },\n    };\n\n    test(\"declaratively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project, {\n        services: {\n          port: {\n            image: \"nginx\",\n            ports: [\n              DockerCompose.portMapping(8080, 80),\n              DockerCompose.portMapping(8080, 80, {\n                protocol: DockerComposeProtocol.UDP,\n              }),\n            ],\n          },\n        },\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n\n    test(\"imperatively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project);\n\n      const service = dc.addService(\"port\", {\n        image: \"nginx\",\n      });\n\n      service.addPort(8080, 80);\n      service.addPort(8080, 80, {\n        protocol: DockerComposeProtocol.UDP,\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n  });\n\n  describe(\"can add depends_on\", () => {\n    const expected = {\n      version: \"3.3\",\n      services: {\n        first: { image: \"alpine\" },\n        second: {\n          depends_on: [\"first\"],\n          image: \"nginx\",\n        },\n      },\n    };\n\n    test(\"declaratively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project, {\n        services: {\n          first: { image: \"alpine\" },\n          second: {\n            dependsOn: [DockerCompose.serviceName(\"first\")],\n            image: \"nginx\",\n          },\n        },\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n\n    test(\"imperatively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project);\n\n      const first = dc.addService(\"first\", { image: \"alpine\" });\n      const second = dc.addService(\"second\", { image: \"nginx\" });\n      second.addDependsOn(first);\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n  });\n\n  describe(\"can add environment variables\", () => {\n    const expected = {\n      version: \"3.3\",\n      services: {\n        www: {\n          image: \"nginx\",\n          environment: {\n            FOO: \"bar\",\n            Baz: \"xyz\",\n          },\n        },\n      },\n    };\n\n    test(\"declaratively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project, {\n        services: {\n          www: {\n            image: \"nginx\",\n            environment: {\n              FOO: \"bar\",\n              Baz: \"xyz\",\n            },\n          },\n        },\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n\n    test(\"imperatively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project);\n\n      const service = dc.addService(\"www\", {\n        image: \"nginx\",\n      });\n\n      service.addEnvironment(\"FOO\", \"bar\");\n      service.addEnvironment(\"Baz\", \"xyz\");\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n  });\n\n  test(\"errors when a service reference by name does not exist\", () => {\n    const project = new TestProject();\n\n    new DockerCompose(project, {\n      services: {\n        www: {\n          image: \"nginx\",\n          dependsOn: [DockerCompose.serviceName(\"nope\")],\n        },\n      },\n    });\n\n    expect(() => project.synth()).toThrow(/unable to resolve.*nope.*www/i);\n  });\n\n  test(\"errors when a service depends on itself\", () => {\n    const project = new TestProject();\n\n    new DockerCompose(project, {\n      services: {\n        www: {\n          image: \"nginx\",\n          dependsOn: [DockerCompose.serviceName(\"www\")],\n        },\n      },\n    });\n\n    expect(() => project.synth()).toThrow(/depend on itself/i);\n  });\n\n  describe(\"can create a wordpress dev env\", () => {\n    const expected = {\n      version: \"3.3\",\n      services: {\n        setup: {\n          image: \"alpine\",\n          command: [\"sh\", \"-c\", \"chmod a+w -R /uploads\"],\n          volumes: [\n            {\n              type: \"volume\",\n              source: \"uploads\",\n              target: \"/uploads\",\n            },\n          ],\n        },\n        db: {\n          image: \"mysql:8\",\n          volumes: [\n            {\n              type: \"volume\",\n              source: \"database\",\n              target: \"/var/lib/mysql\",\n            },\n          ],\n          environment: {\n            MYSQL_RANDOM_ROOT_PASSWORD: \"1\",\n            MYSQL_USER: \"wpuser\",\n            MYSQL_PASSWORD: \"wppass\",\n            MYSQL_DATABASE: \"wp\",\n          },\n        },\n        wordpress: {\n          image: \"wordpress:php7.4-apache\",\n          depends_on: [\"db\", \"setup\"],\n          volumes: [\n            {\n              source: \"uploads\",\n              target: \"/var/www/html/wp-content/uploads\",\n              type: \"volume\",\n            },\n            {\n              source: \"docroot\",\n              target: \"/var/www/html\",\n              type: \"volume\",\n            },\n            {\n              source: \"plugins\",\n              target: \"/var/www/html/wp-content/plugins\",\n              type: \"volume\",\n            },\n            {\n              source: \"themes\",\n              target: \"/var/www/html/wp-content/themes\",\n              type: \"volume\",\n            },\n          ],\n          ports: [\n            {\n              mode: \"host\",\n              published: 8081,\n              target: 80,\n              protocol: \"tcp\",\n            },\n          ],\n          environment: {\n            WORDPRESS_DB_HOST: \"db\",\n            WORDPRESS_DB_USER: \"wpuser\",\n            WORDPRESS_DB_PASSWORD: \"wppass\",\n            WORDPRESS_DB_NAME: \"wp\",\n          },\n        },\n      },\n      volumes: {\n        database: {},\n        docroot: {},\n        plugins: {},\n        themes: {},\n        uploads: {},\n      },\n    };\n\n    test(\"declaratively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project, {\n        services: {\n          setup: {\n            image: \"alpine\",\n            command: [\"sh\", \"-c\", \"chmod a+w -R /uploads\"],\n            volumes: [DockerCompose.namedVolume(\"uploads\", \"/uploads\")],\n          },\n          db: {\n            image: \"mysql:8\",\n            volumes: [DockerCompose.namedVolume(\"database\", \"/var/lib/mysql\")],\n            environment: {\n              MYSQL_RANDOM_ROOT_PASSWORD: \"1\",\n              MYSQL_USER: \"wpuser\",\n              MYSQL_PASSWORD: \"wppass\",\n              MYSQL_DATABASE: \"wp\",\n            },\n          },\n          wordpress: {\n            dependsOn: [\n              DockerCompose.serviceName(\"db\"),\n              DockerCompose.serviceName(\"setup\"),\n            ],\n            image: \"wordpress:php7.4-apache\",\n            ports: [DockerCompose.portMapping(8081, 80)],\n            volumes: [\n              DockerCompose.namedVolume(\n                \"uploads\",\n                \"/var/www/html/wp-content/uploads\"\n              ),\n              DockerCompose.namedVolume(\"docroot\", \"/var/www/html\"),\n              DockerCompose.namedVolume(\n                \"plugins\",\n                \"/var/www/html/wp-content/plugins\"\n              ),\n              DockerCompose.namedVolume(\n                \"themes\",\n                \"/var/www/html/wp-content/themes\"\n              ),\n            ],\n            environment: {\n              WORDPRESS_DB_HOST: \"db\",\n              WORDPRESS_DB_USER: \"wpuser\",\n              WORDPRESS_DB_PASSWORD: \"wppass\",\n              WORDPRESS_DB_NAME: \"wp\",\n            },\n          },\n        },\n      });\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n\n    test(\"imperatively\", () => {\n      const project = new TestProject();\n      const dc = new DockerCompose(project);\n\n      const setup = dc.addService(\"setup\", {\n        image: \"alpine\",\n        command: [\"sh\", \"-c\", \"chmod a+w -R /uploads\"],\n        volumes: [DockerCompose.namedVolume(\"uploads\", \"/uploads\")],\n      });\n\n      const db = dc.addService(\"db\", {\n        image: \"mysql:8\",\n        volumes: [DockerCompose.namedVolume(\"database\", \"/var/lib/mysql\")],\n        environment: {\n          MYSQL_RANDOM_ROOT_PASSWORD: \"1\",\n          MYSQL_USER: \"wpuser\",\n          MYSQL_PASSWORD: \"wppass\",\n          MYSQL_DATABASE: \"wp\",\n        },\n      });\n\n      const wp = dc.addService(\"wordpress\", {\n        dependsOn: [db],\n        image: \"wordpress:php7.4-apache\",\n        ports: [DockerCompose.portMapping(8081, 80)],\n        volumes: [\n          DockerCompose.namedVolume(\n            \"uploads\",\n            \"/var/www/html/wp-content/uploads\"\n          ),\n        ],\n        environment: {\n          WORDPRESS_DB_HOST: \"db\",\n          WORDPRESS_DB_USER: \"wpuser\",\n          WORDPRESS_DB_PASSWORD: \"wppass\",\n          WORDPRESS_DB_NAME: \"wp\",\n        },\n      });\n\n      wp.addDependsOn(setup);\n      wp.addVolume(DockerCompose.namedVolume(\"docroot\", \"/var/www/html\"));\n      wp.addVolume(\n        DockerCompose.namedVolume(\"plugins\", \"/var/www/html/wp-content/plugins\")\n      );\n      wp.addVolume(\n        DockerCompose.namedVolume(\"themes\", \"/var/www/html/wp-content/themes\")\n      );\n\n      expect(dc._synthesizeDockerCompose()).toEqual(expected);\n\n      project.synth();\n      assertDockerComposeFileValidates(project.outdir);\n    });\n  });\n});\n\nconst hasDockerCompose =\n  child_process.spawnSync(\"docker-compose\", [\"version\"]).status === 0;\n\nfunction assertDockerComposeFileValidates(dir: string) {\n  const filePath = path.join(dir, \"docker-compose.yml\");\n  expect(fs.existsSync(filePath)).toBeTruthy();\n\n  if (hasDockerCompose) {\n    const res = child_process.spawnSync(\"docker-compose\", [\n      \"-f\",\n      filePath,\n      \"config\",\n    ]);\n    if (res.status !== 0) {\n      throw new Error(\n        `docker-compose file does not validate: ${res.stderr.toString()}`\n      );\n    }\n  } else {\n    console.warn(\n      \"docker-compose is not present, so we cannot validate via client\"\n    );\n  }\n}\n"
  },
  {
    "path": "test/github/__snapshots__/auto-approve.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`auto-approve all users 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: auto-approve\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\njobs:\n  approve:\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    if: contains(github.event.pull_request.labels.*.name, 'auto-approve')\n    steps:\n      - uses: hmarr/auto-approve-action@v2.2.1\n        with:\n          github-token: \\${{ secrets.MY_SECRET }}\n\"\n`;\n\nexports[`auto-approve configure options 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: auto-approve\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\njobs:\n  approve:\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    if: contains(github.event.pull_request.labels.*.name, 'my-approve') && (github.event.pull_request.user.login == 'bot-1' || github.event.pull_request.user.login == 'bot-2')\n    steps:\n      - uses: hmarr/auto-approve-action@v2.2.1\n        with:\n          github-token: \\${{ secrets.MY_SECRET }}\n\"\n`;\n\nexports[`auto-approve default 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: auto-approve\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\njobs:\n  approve:\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    if: contains(github.event.pull_request.labels.*.name, 'auto-approve') && (github.event.pull_request.user.login == 'github-actions[bot]')\n    steps:\n      - uses: hmarr/auto-approve-action@v2.2.1\n        with:\n          github-token: \\${{ secrets.GITHUB_TOKEN }}\n\"\n`;\n"
  },
  {
    "path": "test/github/__snapshots__/dependabot.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`dependabot default 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2\nupdates:\n  - package-ecosystem: npm\n    versioning-strategy: lockfile-only\n    directory: /\n    schedule:\n      interval: daily\n    ignore:\n      - dependency-name: projen\n\"\n`;\n\nexports[`dependabot ignoring ignore with a single version 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2\nupdates:\n  - package-ecosystem: npm\n    versioning-strategy: lockfile-only\n    directory: /\n    schedule:\n      interval: daily\n    ignore:\n      - dependency-name: testlib\n        versions:\n          - \\\\\">10.x\\\\\"\n      - dependency-name: projen\n\"\n`;\n\nexports[`dependabot ignoring ignore with ignoreProjen set to false 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2\nupdates:\n  - package-ecosystem: npm\n    versioning-strategy: lockfile-only\n    directory: /\n    schedule:\n      interval: daily\n\"\n`;\n\nexports[`dependabot ignoring ignore with multiple versions 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2\nupdates:\n  - package-ecosystem: npm\n    versioning-strategy: lockfile-only\n    directory: /\n    schedule:\n      interval: daily\n    ignore:\n      - dependency-name: testlib\n        versions:\n          - 10.x\n          - 20.x\n      - dependency-name: projen\n\"\n`;\n\nexports[`dependabot ignoring ignore with no version 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2\nupdates:\n  - package-ecosystem: npm\n    versioning-strategy: lockfile-only\n    directory: /\n    schedule:\n      interval: daily\n    ignore:\n      - dependency-name: testlib\n      - dependency-name: projen\n\"\n`;\n\nexports[`dependabot ignoring ignores projen by default 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2\nupdates:\n  - package-ecosystem: npm\n    versioning-strategy: lockfile-only\n    directory: /\n    schedule:\n      interval: daily\n    ignore:\n      - dependency-name: projen\n\"\n`;\n\nexports[`dependabot private registries 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nversion: 2\nregistries:\n  npm-registry-npm-pkg-github-com:\n    type: npm-registry\n    url: https://npm.pkg.github.com\n    token: \\${{ secrets.TOKEN }}\n    replaces-base: true\n    username: test\n    password: \\${{ secrets.TOKEN }}\n    key: abc123\nupdates:\n  - package-ecosystem: npm\n    versioning-strategy: lockfile-only\n    directory: /\n    schedule:\n      interval: daily\n    ignore:\n      - dependency-name: projen\n    registries:\n      - npm-registry-npm-pkg-github-com\n\"\n`;\n"
  },
  {
    "path": "test/github/__snapshots__/github-workflow.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`github-workflow workflow job calling a reusable workflow & inherited secrets 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: test-workflow\non: {}\njobs:\n  call-another-workflow:\n    name: Some reusable workflow\n    permissions: {}\n    uses: some-user/example-action.yaml@v1\n    secrets: inherit\n\"\n`;\n\nexports[`github-workflow workflow job calling a reusable workflow 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: test-workflow\non: {}\njobs:\n  call-another-workflow:\n    name: Some reusable workflow\n    permissions: {}\n    uses: some-user/example-action.yaml@v1\n    with:\n      foo: true\n      bar: example\n    secrets:\n      credentials: super-secret\n\"\n`;\n"
  },
  {
    "path": "test/github/__snapshots__/mergify.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`mergify default 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n\"\n`;\n\nexports[`mergify with automerge options 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=3\\\\\"\n      - -label~=(do-not-merge|missing-tests)\n      - status-success=build\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=3\\\\\"\n      - -label~=(do-not-merge|missing-tests)\n      - status-success=build\n\"\n`;\n\nexports[`mergify without automerge, with custom rules 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules: []\npull_request_rules:\n  - actions:\n      - action\n    conditions:\n      - condition\n    name: rule-name\n\"\n`;\n"
  },
  {
    "path": "test/github/__snapshots__/pull-request-lint.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`default 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\"\n`;\n\nexports[`semantic titles configure scopes 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n          requireScope: false\n\"\n`;\n\nexports[`semantic titles require scope 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: true\n\"\n`;\n"
  },
  {
    "path": "test/github/__snapshots__/stale.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`customizations 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: stale\non:\n  schedule:\n    - cron: 0 1 * * *\n  workflow_dispatch: {}\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n    steps:\n      - uses: actions/stale@v4\n        with:\n          days-before-stale: -1\n          days-before-close: -1\n          days-before-pr-stale: 30\n          days-before-pr-close: 2\n          stale-pr-message: This pull request is now marked as stale because it hasn't seen activity for a while. Add a comment or it will be closed soon. If you wish to exclude this issue from being marked as stale, add the \\\\\"backlog\\\\\" label.\n          close-pr-message: closing pull request\n          stale-pr-label: I-AM-STALE\n          exempt-pr-labels: backlog\n          days-before-issue-stale: -1\n          days-before-issue-close: -1\n\"\n`;\n\nexports[`stale enabled 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: stale\non:\n  schedule:\n    - cron: 0 1 * * *\n  workflow_dispatch: {}\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n    steps:\n      - uses: actions/stale@v4\n        with:\n          days-before-stale: -1\n          days-before-close: -1\n          days-before-pr-stale: 14\n          days-before-pr-close: 2\n          stale-pr-message: This pull request is now marked as stale because it hasn't seen activity for a while. Add a comment or it will be closed soon. If you wish to exclude this issue from being marked as stale, add the \\\\\"backlog\\\\\" label.\n          close-pr-message: Closing this pull request as it hasn't seen activity for a while. Please add a comment @mentioning a maintainer to reopen. If you wish to exclude this issue from being marked as stale, add the \\\\\"backlog\\\\\" label.\n          stale-pr-label: stale\n          exempt-pr-labels: backlog\n          days-before-issue-stale: 60\n          days-before-issue-close: 7\n          stale-issue-message: This issue is now marked as stale because it hasn't seen activity for a while. Add a comment or it will be closed soon. If you wish to exclude this issue from being marked as stale, add the \\\\\"backlog\\\\\" label.\n          close-issue-message: Closing this issue as it hasn't seen activity for a while. Please add a comment @mentioning a maintainer to reopen. If you wish to exclude this issue from being marked as stale, add the \\\\\"backlog\\\\\" label.\n          stale-issue-label: stale\n          exempt-issue-labels: backlog\n\"\n`;\n"
  },
  {
    "path": "test/github/__snapshots__/task-workflow.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`task-workflow default 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: task-workflow\non:\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions: {}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: gh-workflow-test\n        run: projen gh-workflow-test\n\"\n`;\n\nexports[`task-workflow upload artifacts 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: task-workflow\non:\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions: {}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: gh-workflow-test\n        run: projen gh-workflow-test\n      - name: Upload artifact\n        uses: actions/upload-artifact@v2.1.1\n        if: always()\n        with:\n          name: ./artifacts/\n          path: ./artifacts/\n\"\n`;\n"
  },
  {
    "path": "test/github/__snapshots__/workflows.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`adding empty workflow 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: my-workflow\non: {}\njobs: {}\n\"\n`;\n"
  },
  {
    "path": "test/github/auto-approve.test.ts",
    "content": "import { AutoApprove } from \"../../src/github/auto-approve\";\nimport { NodeProject, NodeProjectOptions } from \"../../src/javascript\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"auto-approve\", () => {\n  test(\"default\", () => {\n    const project = createProject();\n\n    new AutoApprove(project.github!);\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/auto-approve.yml\"]).toBeDefined();\n    expect(snapshot[\".github/workflows/auto-approve.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"configure options\", () => {\n    const project = createProject();\n\n    new AutoApprove(project.github!, {\n      secret: \"MY_SECRET\",\n      label: \"my-approve\",\n      allowedUsernames: [\"bot-1\", \"bot-2\"],\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/auto-approve.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"all users\", () => {\n    const project = createProject();\n\n    new AutoApprove(project.github!, {\n      secret: \"MY_SECRET\",\n      allowedUsernames: [],\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/auto-approve.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"with custom runner\", () => {\n    const project = createProject();\n\n    new AutoApprove(project.github!, {\n      secret: \"MY_SECRET\",\n      runsOn: [\"self-hosted\"],\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/auto-approve.yml\"]).toContain(\n      \"runs-on: self-hosted\"\n    );\n  });\n});\n\ntype ProjectOptions = Omit<\n  NodeProjectOptions,\n  \"outdir\" | \"defaultReleaseBranch\" | \"name\"\n>;\nfunction createProject(options: ProjectOptions = {}): NodeProject {\n  return new NodeProject({\n    defaultReleaseBranch: \"main\",\n    name: \"node-project\",\n    ...options,\n  });\n}\n"
  },
  {
    "path": "test/github/dependabot.test.ts",
    "content": "import { Dependabot, DependabotRegistryType } from \"../../src/github\";\nimport { NodeProject, NodeProjectOptions } from \"../../src/javascript\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"dependabot\", () => {\n  test(\"default\", () => {\n    const project = createProject();\n\n    new Dependabot(project.github!);\n\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\".github/dependabot.yml\"]).toBeDefined();\n    expect(snapshot[\".github/dependabot.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"private registries\", () => {\n    const project = createProject();\n\n    const registryName = \"npm-registry-npm-pkg-github-com\";\n\n    new Dependabot(project.github!, {\n      registries: {\n        [registryName]: {\n          type: DependabotRegistryType.NPM_REGISTRY,\n          url: \"https://npm.pkg.github.com\",\n          token: \"${{ secrets.TOKEN }}\",\n          replacesBase: true,\n          username: \"test\",\n          password: \"${{ secrets.TOKEN }}\",\n          key: \"abc123\",\n        },\n      },\n    });\n\n    const snapshot = synthSnapshot(project);\n    const dependabot = snapshot[\".github/dependabot.yml\"];\n    expect(dependabot).toBeDefined();\n    expect(dependabot).toMatchSnapshot();\n    expect(dependabot).toContain(\"registries\");\n    expect(dependabot).toContain(registryName);\n  });\n\n  describe(\"ignoring\", () => {\n    test(\"ignores projen by default\", () => {\n      const project = createProject();\n      new Dependabot(project.github!, {});\n      const snapshot = synthSnapshot(project);\n      const dependabot = snapshot[\".github/dependabot.yml\"];\n      expect(dependabot).toMatchSnapshot();\n      expect(dependabot).toContain(\"ignore:\");\n      expect(dependabot).toContain(\"dependency-name: projen\");\n    });\n\n    test(\"ignore with ignoreProjen set to false\", () => {\n      const project = createProject();\n      new Dependabot(project.github!, { ignoreProjen: false });\n      const snapshot = synthSnapshot(project);\n      const dependabot = snapshot[\".github/dependabot.yml\"];\n      expect(dependabot).toMatchSnapshot();\n      expect(dependabot).not.toContain(\"ignore:\");\n      expect(dependabot).not.toContain(\"dependency-name: projen\");\n    });\n\n    test(\"ignore with no version\", () => {\n      const project = createProject();\n      new Dependabot(project.github!, {\n        ignore: [{ dependencyName: \"testlib\" }],\n      });\n\n      const snapshot = synthSnapshot(project);\n      const dependabot = snapshot[\".github/dependabot.yml\"];\n      expect(dependabot).toMatchSnapshot();\n      expect(dependabot).toContain(\"ignore\");\n      expect(dependabot).toContain(\"dependency-name: testlib\");\n      expect(dependabot).not.toContain(\"versions\");\n    });\n\n    test(\"ignore with a single version\", () => {\n      const project = createProject();\n      new Dependabot(project.github!, {\n        ignore: [{ dependencyName: \"testlib\", versions: [\">10.x\"] }],\n      });\n\n      const snapshot = synthSnapshot(project);\n      const dependabot = snapshot[\".github/dependabot.yml\"];\n      expect(dependabot).toMatchSnapshot();\n      expect(dependabot).toContain(\"ignore\");\n      expect(dependabot).toContain(\"dependency-name: testlib\");\n      expect(dependabot).toContain(\"versions\");\n      expect(dependabot).toContain(\">10.x\");\n    });\n\n    test(\"ignore with multiple versions\", () => {\n      const project = createProject();\n      new Dependabot(project.github!, {\n        ignore: [{ dependencyName: \"testlib\", versions: [\"10.x\", \"20.x\"] }],\n      });\n\n      const snapshot = synthSnapshot(project);\n      const dependabot = snapshot[\".github/dependabot.yml\"];\n      expect(dependabot).toMatchSnapshot();\n      expect(dependabot).toContain(\"ignore\");\n      expect(dependabot).toContain(\"dependency-name: testlib\");\n      expect(dependabot).toContain(\"versions\");\n      expect(dependabot).toContain(\"10.x\");\n      expect(dependabot).toContain(\"20.x\");\n    });\n  });\n});\n\ntype ProjectOptions = Omit<\n  NodeProjectOptions,\n  \"outdir\" | \"defaultReleaseBranch\" | \"name\"\n>;\nfunction createProject(options: ProjectOptions = {}): NodeProject {\n  return new NodeProject({\n    defaultReleaseBranch: \"main\",\n    name: \"node-project\",\n    ...options,\n  });\n}\n"
  },
  {
    "path": "test/github/github-workflow.test.ts",
    "content": "import { GithubWorkflow } from \"../../src/github/workflows\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ndescribe(\"github-workflow\", () => {\n  const workflowName = \"test-workflow\";\n\n  test(\"Default concurrency allowed\", () => {\n    const project = new TestProject();\n\n    new GithubWorkflow(project.github!, workflowName);\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[`.github/workflows/${workflowName}.yml`]).not.toContain(\n      \"concurrency\"\n    );\n  });\n\n  test(\"concurrency set\", () => {\n    const concurrencyName = \"my-concurrency\";\n    const project = new TestProject();\n\n    new GithubWorkflow(project.github!, workflowName, {\n      concurrency: concurrencyName,\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[`.github/workflows/${workflowName}.yml`]).toContain(\n      `concurrency: ${concurrencyName}`\n    );\n  });\n\n  test(\"workflow job calling a reusable workflow\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const workflow = new GithubWorkflow(project.github!, workflowName);\n\n    workflow.addJob(\"call-another-workflow\", {\n      name: \"Some reusable workflow\",\n      uses: \"some-user/example-action.yaml@v1\",\n      permissions: {},\n      with: {\n        foo: true,\n        bar: \"example\",\n      },\n      secrets: {\n        credentials: \"super-secret\",\n      },\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[`.github/workflows/${workflowName}.yml`]).toMatchSnapshot();\n  });\n\n  test(\"workflow job calling a reusable workflow & inherited secrets\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const workflow = new GithubWorkflow(project.github!, workflowName);\n\n    workflow.addJob(\"call-another-workflow\", {\n      name: \"Some reusable workflow\",\n      uses: \"some-user/example-action.yaml@v1\",\n      permissions: {},\n      secrets: \"inherit\",\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[`.github/workflows/${workflowName}.yml`]).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "test/github/mergify.test.ts",
    "content": "import { NodeProject, NodeProjectOptions } from \"../../src/javascript\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"mergify\", () => {\n  test(\"default\", () => {\n    // GIVEN\n    const project = createProject();\n\n    // WHEN\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\".mergify.yml\"]).toBeDefined();\n    expect(snapshot[\".mergify.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"with automerge options\", () => {\n    // GIVEN\n    const project = createProject({\n      autoMerge: true,\n      autoMergeOptions: {\n        approvedReviews: 3,\n        blockingLabels: [\"do-not-merge\", \"missing-tests\"],\n      },\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\".mergify.yml\"]).toBeDefined();\n    expect(snapshot[\".mergify.yml\"]).toContain(\n      \"- -label~=(do-not-merge|missing-tests)\"\n    );\n    expect(snapshot[\".mergify.yml\"]).toContain('- \"#approved-reviews-by>=3\"');\n    expect(snapshot[\".mergify.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"without automerge\", () => {\n    // GIVEN\n    const project = createProject({\n      autoMerge: false,\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\".mergify.yml\"]).toBeUndefined();\n  });\n\n  test(\"without automerge, with custom rules\", () => {\n    // GIVEN\n    const project = createProject({\n      autoMerge: false,\n      mergifyOptions: {\n        rules: [\n          {\n            actions: [\"action\"],\n            conditions: [\"condition\"],\n            name: \"rule-name\",\n          },\n        ],\n      },\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(snapshot[\".mergify.yml\"]).toBeDefined();\n    expect(snapshot[\".mergify.yml\"]).toMatchSnapshot();\n  });\n});\n\ntype ProjectOptions = Omit<\n  NodeProjectOptions,\n  \"outdir\" | \"defaultReleaseBranch\" | \"name\"\n>;\nfunction createProject(options: ProjectOptions = {}): NodeProject {\n  return new NodeProject({\n    defaultReleaseBranch: \"main\",\n    name: \"node-project\",\n    ...options,\n  });\n}\n"
  },
  {
    "path": "test/github/pull-request-lint.test.ts",
    "content": "import { PullRequestLint } from \"../../src/github/pull-request-lint\";\nimport { NodeProject, NodeProjectOptions } from \"../../src/javascript\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"default\", () => {\n  // GIVEN\n  const project = createProject();\n\n  // WHEN\n  new PullRequestLint(project.github!);\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/pull-request-lint.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/pull-request-lint.yml\"]).toMatchSnapshot();\n});\n\ndescribe(\"semantic titles\", () => {\n  test(\"configure scopes\", () => {\n    // GIVEN\n    const project = createProject();\n\n    // WHEN\n    new PullRequestLint(project.github!, {\n      semanticTitle: true,\n      semanticTitleOptions: {\n        types: [\"feat\", \"fix\"],\n      },\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(\n      snapshot[\".github/workflows/pull-request-lint.yml\"]\n    ).toMatchSnapshot();\n  });\n\n  test(\"require scope\", () => {\n    // GIVEN\n    const project = createProject();\n\n    // WHEN\n    new PullRequestLint(project.github!, {\n      semanticTitle: true,\n      semanticTitleOptions: {\n        requireScope: true,\n      },\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project);\n    expect(\n      snapshot[\".github/workflows/pull-request-lint.yml\"]\n    ).toMatchSnapshot();\n  });\n});\n\ntest(\"with custom runner\", () => {\n  // GIVEN\n  const project = createProject();\n\n  // WHEN\n  new PullRequestLint(project.github!, {\n    runsOn: [\"self-hosted\"],\n  });\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/pull-request-lint.yml\"]).toContain(\n    \"runs-on: self-hosted\"\n  );\n});\n\ntype ProjectOptions = Omit<\n  NodeProjectOptions,\n  \"outdir\" | \"defaultReleaseBranch\" | \"name\"\n>;\nfunction createProject(options: ProjectOptions = {}): NodeProject {\n  return new NodeProject({\n    defaultReleaseBranch: \"main\",\n    name: \"node-project\",\n    githubOptions: {\n      pullRequestLintOptions: {\n        semanticTitle: false,\n      },\n    },\n    ...options,\n  });\n}\n"
  },
  {
    "path": "test/github/stale.test.ts",
    "content": "import * as YAML from \"yaml\";\nimport { StaleBehavior } from \"../../src/github\";\nimport { renderBehavior } from \"../../src/github/stale-util\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\nconst defaults = { stale: 10, close: 11, type: \"issue\" };\n\ntest(\"default project behavior\", () => {\n  const project = new TestProject();\n  expect(synthSnapshot(project)[\".github/workflows/stale.yml\"]).toBeUndefined();\n});\n\ntest(\"stale enabled\", () => {\n  const project = new TestProject({\n    stale: true,\n  });\n\n  expect(\n    synthSnapshot(project)[\".github/workflows/stale.yml\"]\n  ).toMatchSnapshot();\n});\n\ntest(\"customizations\", () => {\n  const project = new TestProject({\n    stale: true,\n    staleOptions: {\n      issues: { enabled: false },\n      pullRequest: {\n        closeMessage: \"closing pull request\",\n        staleLabel: \"I-AM-STALE\",\n        daysBeforeStale: 30,\n      },\n    },\n  });\n\n  expect(\n    synthSnapshot(project)[\".github/workflows/stale.yml\"]\n  ).toMatchSnapshot();\n});\n\ntest(\"with custom runner\", () => {\n  const project = new TestProject({\n    stale: true,\n    staleOptions: {\n      runsOn: [\"self-hosted\"],\n    },\n  });\n\n  expect(synthSnapshot(project)[\".github/workflows/stale.yml\"]).toContain(\n    \"runs-on: self-hosted\"\n  );\n});\n\ndescribe(\"renderBehavior()\", () => {\n  test(\"defaults\", () => {\n    expect(\n      renderBehavior(undefined, { stale: 10, close: 11, type: \"issue\" })\n    ).toStrictEqual({\n      closeMessage:\n        'Closing this issue as it hasn\\'t seen activity for a while. Please add a comment @mentioning a maintainer to reopen. If you wish to exclude this issue from being marked as stale, add the \"backlog\" label.',\n      daysBeforeClose: 11,\n      daysBeforeStale: 10,\n      staleLabel: \"stale\",\n      exemptLabels: [\"backlog\"],\n      staleMessage:\n        'This issue is now marked as stale because it hasn\\'t seen activity for a while. Add a comment or it will be closed soon. If you wish to exclude this issue from being marked as stale, add the \"backlog\" label.',\n    });\n\n    expect(\n      renderBehavior(undefined, { stale: 99, close: 65, type: \"xomo\" })\n    ).toStrictEqual({\n      closeMessage:\n        'Closing this xomo as it hasn\\'t seen activity for a while. Please add a comment @mentioning a maintainer to reopen. If you wish to exclude this issue from being marked as stale, add the \"backlog\" label.',\n      daysBeforeClose: 65,\n      daysBeforeStale: 99,\n      exemptLabels: [\"backlog\"],\n      staleLabel: \"stale\",\n      staleMessage:\n        'This xomo is now marked as stale because it hasn\\'t seen activity for a while. Add a comment or it will be closed soon. If you wish to exclude this issue from being marked as stale, add the \"backlog\" label.',\n    });\n  });\n\n  test(\"disabled\", () => {\n    expect(renderBehavior({ enabled: false }, defaults)).toMatchObject({\n      daysBeforeClose: -1,\n      daysBeforeStale: -1,\n    });\n  });\n\n  test(\"customize\", () => {\n    const behavior: StaleBehavior = {\n      closeMessage: \"I am the close message\",\n      daysBeforeClose: 1,\n      daysBeforeStale: 2,\n      staleLabel: \"my-label\",\n      staleMessage: \"I am stale\",\n      exemptLabels: [\"foo\", \"bar\"],\n    };\n\n    expect(renderBehavior(behavior, defaults)).toStrictEqual({\n      closeMessage: \"I am the close message\",\n      daysBeforeClose: 1,\n      daysBeforeStale: 2,\n      staleLabel: \"my-label\",\n      staleMessage: \"I am stale\",\n      exemptLabels: [\"foo\", \"bar\"],\n    });\n  });\n\n  test(\"disable exempt label\", () => {\n    expect(renderBehavior({ exemptLabels: [] }, defaults)).toStrictEqual({\n      closeMessage:\n        \"Closing this issue as it hasn't seen activity for a while. Please add a comment @mentioning a maintainer to reopen.\",\n      daysBeforeClose: 11,\n      daysBeforeStale: 10,\n      staleLabel: \"stale\",\n      exemptLabels: [],\n      staleMessage:\n        \"This issue is now marked as stale because it hasn't seen activity for a while. Add a comment or it will be closed soon.\",\n    });\n  });\n});\n\ndescribe(\"exempt labels in workflow output\", () => {\n  const project = new TestProject({\n    stale: true,\n    staleOptions: {\n      issues: { exemptLabels: [] },\n      pullRequest: { exemptLabels: [\"foo\", \"bar\"] },\n    },\n  });\n\n  const workflow = YAML.parse(\n    synthSnapshot(project)[\".github/workflows/stale.yml\"]\n  );\n\n  expect(workflow.jobs.stale.steps[0]).toStrictEqual({\n    uses: \"actions/stale@v4\",\n    with: {\n      \"close-issue-message\":\n        \"Closing this issue as it hasn't seen activity for a while. Please add a comment @mentioning a maintainer to reopen.\",\n      \"close-pr-message\":\n        'Closing this pull request as it hasn\\'t seen activity for a while. Please add a comment @mentioning a maintainer to reopen. If you wish to exclude this issue from being marked as stale, add the \"foo\" label.',\n      \"days-before-close\": -1,\n      \"days-before-issue-close\": 7,\n      \"days-before-issue-stale\": 60,\n      \"days-before-pr-close\": 2,\n      \"days-before-pr-stale\": 14,\n      \"days-before-stale\": -1,\n      \"exempt-pr-labels\": \"foo,bar\",\n      \"stale-issue-label\": \"stale\",\n      \"stale-issue-message\":\n        \"This issue is now marked as stale because it hasn't seen activity for a while. Add a comment or it will be closed soon.\",\n      \"stale-pr-label\": \"stale\",\n      \"stale-pr-message\":\n        'This pull request is now marked as stale because it hasn\\'t seen activity for a while. Add a comment or it will be closed soon. If you wish to exclude this issue from being marked as stale, add the \"foo\" label.',\n    },\n  });\n});\n"
  },
  {
    "path": "test/github/task-workflow.test.ts",
    "content": "import { TaskWorkflow } from \"../../src/github/task-workflow\";\nimport { Task } from \"../../src/task\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ndescribe(\"task-workflow\", () => {\n  test(\"default\", () => {\n    const project = new TestProject();\n\n    new TaskWorkflow(project.github!, {\n      name: \"task-workflow\",\n      task,\n      permissions: {},\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/task-workflow.yml\"]).toBeDefined();\n    expect(snapshot[\".github/workflows/task-workflow.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"upload artifacts\", () => {\n    const project = new TestProject();\n\n    new TaskWorkflow(project.github!, {\n      name: \"task-workflow\",\n      task,\n      artifactsDirectory: \"./artifacts/\",\n      permissions: {},\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/task-workflow.yml\"]).toMatchSnapshot();\n  });\n\n  test(\"issue comment error\", () => {\n    const project = new TestProject();\n\n    expect(\n      () =>\n        new TaskWorkflow(project.github!, {\n          name: \"task-workflow\",\n          task,\n          triggers: {\n            issueComment: {},\n          },\n          permissions: {},\n        })\n    ).toThrow(\n      /Trigger \\\"issueComment\\\" should not be used due to a security concern/\n    );\n  });\n\n  test(\"with custom runner\", () => {\n    const project = new TestProject();\n\n    new TaskWorkflow(project.github!, {\n      name: \"task-workflow\",\n      task,\n      permissions: {},\n      runsOn: [\"self-hosted\"],\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/task-workflow.yml\"]).toContain(\n      \"runs-on: self-hosted\"\n    );\n  });\n\n  test(\"with custom runner, multiple labels\", () => {\n    const project = new TestProject();\n\n    new TaskWorkflow(project.github!, {\n      name: \"task-workflow\",\n      task,\n      permissions: {},\n      runsOn: [\"self-hosted\", \"ubuntu-18.04\"],\n    });\n\n    const snapshot = synthSnapshot(project);\n\n    expect(snapshot[\".github/workflows/task-workflow.yml\"]).toMatch(\n      /runs-on:\\n\\s+- self-hosted\\n\\s+- ubuntu-18\\.04/m\n    );\n  });\n});\n\nconst task = new Task(\"gh-workflow-test\", {\n  description: \"Task GitHub workflow test\",\n});\n"
  },
  {
    "path": "test/github/workflows.test.ts",
    "content": "import { Project } from \"../../src/project\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"no workflow\", () => {\n  // GIVEN\n  const p = new TestProject({\n    githubOptions: {\n      workflows: false,\n    },\n  });\n\n  // THEN\n  const workflows = synthWorkflows(p);\n  expect(Object.keys(workflows).length).toEqual(0);\n});\n\ntest(\"adding empty workflow\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.github?.addWorkflow(\"my-workflow\");\n\n  // THEN\n  const workflows = synthWorkflows(p);\n  expect(workflows[\".github/workflows/my-workflow.yml\"]).toMatchSnapshot();\n});\n\ntest(\"throws when adding workflow with existing name\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n\n  // THEN\n  expect(() => p.github?.addWorkflow(\"stale\")).toThrow(\n    /there is already a file under/\n  );\n});\n\ntest(\"tryFind valid workflow\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.github?.addWorkflow(\"workflow1\");\n  p.github?.addWorkflow(\"workflow2\");\n  const workflow1 = p.github?.tryFindWorkflow(\"workflow1\");\n\n  // THEN\n  const workflows = synthWorkflows(p);\n  expect(workflows[\".github/workflows/workflow1.yml\"]).toBeDefined();\n  expect(workflows[\".github/workflows/workflow2.yml\"]).toBeDefined();\n  expect(workflow1).toBeDefined();\n  expect(workflow1?.name).toEqual(\"workflow1\");\n});\n\ntest(\"tryFind unknown workflow\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.github?.addWorkflow(\"workflow1\");\n  p.github?.addWorkflow(\"workflow2\");\n  const workflow3 = p.github?.tryFindWorkflow(\"workflow3\");\n\n  // THEN\n  const workflows = synthWorkflows(p);\n  expect(workflows[\".github/workflows/workflow1.yml\"]).toBeDefined();\n  expect(workflows[\".github/workflows/workflow2.yml\"]).toBeDefined();\n  expect(workflow3).toBeUndefined();\n});\n\nfunction synthWorkflows(p: Project): any {\n  const snapshot = synthSnapshot(p);\n  const filtered = Object.keys(snapshot)\n    .filter((path) => path.startsWith(\".github/workflows/\"))\n    .reduce((obj, key) => {\n      return {\n        ...obj,\n        [key]: snapshot[key],\n      };\n    }, {});\n  return filtered;\n}\n"
  },
  {
    "path": "test/gitlab/__snapshots__/configuration.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`adds correct entries for file-based caching 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\ndefault:\n  cache:\n    key:\n      files:\n        - Gemfile.lock\n        - package.json\n      prefix: \\${CI_COMMIT_REF_SLUG}\n\"\n`;\n\nexports[`adds correct entries for path-based caching 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\ndefault:\n  cache:\n    paths:\n      - node_modules\n    key: \\${CI_COMMIT_REF_SLUG}\n\"\n`;\n"
  },
  {
    "path": "test/gitlab/configuration.test.ts",
    "content": "import { CiConfiguration } from \"../../src/gitlab\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"throws when adding an existing service with same name and alias\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new CiConfiguration(p, \"foo\");\n  c.addServices({ name: \"bar\" });\n  // THEN\n  expect(() => c.addServices({ name: \"bar\" })).toThrowError(\n    /GitLab CI already contains/\n  );\n  expect(() =>\n    c.addServices({ name: \"foobar\" }, { name: \"foobar\" })\n  ).toThrowError(/GitLab CI already contains/);\n});\n\ntest(\"does not throw when adding an services with same name and different alias\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new CiConfiguration(p, \"foo\");\n  c.addServices({ name: \"foo\", alias: \"foobar\" });\n  // THEN\n  expect(() => c.addServices({ name: \"foo\", alias: \"baz\" })).not.toThrowError(\n    /GitLab CI already contains/\n  );\n});\n\ntest(\"does not throw when adding an valid include\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new CiConfiguration(p, \"foo\");\n  // THEN\n  expect(() => c.addIncludes({ local: \"foo\" })).not.toThrowError(\n    /A valid include configuration specifies/\n  );\n  expect(() =>\n    c.addIncludes({ file: [\"foo\"], project: \"foo\" })\n  ).not.toThrowError(/A valid include configuration specifies/);\n  expect(() => c.addIncludes({ remote: \"foo\" })).not.toThrowError(\n    /A valid include configuration specifies/\n  );\n  expect(() => c.addIncludes({ template: \"foo\" })).not.toThrowError(\n    /A valid include configuration specifies/\n  );\n});\n\ntest(\"throws when adding an invalid include\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new CiConfiguration(p, \"foo\");\n  // THEN\n  expect(() =>\n    c.addIncludes({ file: [\"foo\"], project: \"foo\", local: \"foo\" })\n  ).toThrow(/contains 2 property combination/);\n  expect(() => c.addIncludes({ project: \"foo\" })).toThrow(\n    /contains 0 property combination/\n  );\n});\n\ntest(\"throws when adding an existing includes\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new CiConfiguration(p, \"foo\");\n  c.addIncludes(\n    { local: \"foo\" },\n    { file: [\"foo\"], project: \"foo\" },\n    { remote: \"foo\" },\n    { template: \"foo\" }\n  );\n  // THEN\n  expect(() => c.addIncludes({ local: \"foo\" })).toThrowError(\n    /already contains one or more templates specified in/\n  );\n  expect(() => c.addIncludes({ file: [\"foo\"], project: \"foo\" })).toThrowError(\n    /already contains one or more templates specified in/\n  );\n  expect(() => c.addIncludes({ remote: \"foo\" })).toThrowError(\n    /already contains one or more templates specified in/\n  );\n  expect(() => c.addIncludes({ template: \"foo\" })).toThrowError(\n    /already contains one or more templates specified in/\n  );\n});\n\ntest(\"respected the original format when variables are added to jobs\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  new CiConfiguration(p, \"foo\", {\n    jobs: {\n      build: {\n        variables: { AWS_REGION: \"eu-central-1\" },\n      },\n    },\n  });\n  const snapshot = synthSnapshot(p);\n  // THEN\n  expect(snapshot[\".gitlab/ci-templates/foo.yml\"]).toContain(\n    \"AWS_REGION: eu-central-1\"\n  );\n});\n\ntest(\"respect the original format when adding global variables\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new CiConfiguration(p, \"foo\", {});\n  c.addGlobalVariables({\n    AWS_REGION: \"eu-central-1\",\n  });\n  const snapshot = synthSnapshot(p);\n  // THEN\n  expect(snapshot[\".gitlab/ci-templates/foo.yml\"]).toContain(\n    \"AWS_REGION: eu-central-1\"\n  );\n});\n\ntest(\"adds correct entries for path-based caching\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  new CiConfiguration(p, \"foo\", {\n    default: {\n      cache: {\n        paths: [\"node_modules\"],\n        key: \"${CI_COMMIT_REF_SLUG}\",\n      },\n    },\n  });\n  const snapshot = synthSnapshot(p);\n  // THEN\n  expect(snapshot[\".gitlab/ci-templates/foo.yml\"]).toMatchSnapshot();\n});\n\ntest(\"adds correct entries for file-based caching\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  new CiConfiguration(p, \"foo\", {\n    default: {\n      cache: {\n        key: {\n          files: [\"Gemfile.lock\", \"package.json\"],\n          prefix: \"${CI_COMMIT_REF_SLUG}\",\n        },\n      },\n    },\n  });\n  const snapshot = synthSnapshot(p);\n  // THEN\n  expect(snapshot[\".gitlab/ci-templates/foo.yml\"]).toMatchSnapshot();\n});\n"
  },
  {
    "path": "test/gitlab/gitlab-configuration.test.ts",
    "content": "import { GitlabConfiguration } from \"../../src/gitlab\";\nimport { TestProject } from \"../util\";\n\ntest(\"throws when adding an adding a job to a non-existent nested template\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new GitlabConfiguration(p);\n  c.createNestedTemplates({ foo: {} });\n  // THEN\n  expect(() => c.nestedTemplates.bar.addStages(\"baz\")).toThrowError;\n});\n\ntest(\"does not throw when adding an services with an existing nested template\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new GitlabConfiguration(p);\n  c.createNestedTemplates({ foo: {} });\n  // THEN\n  expect(() => c.nestedTemplates.foo.addStages(\"baz\")).not.toThrowError;\n});\n\ntest(\"main configuration inherits child configuration stages\", () => {\n  // GIVEN\n  const p = new TestProject({\n    stale: true,\n  });\n  const c = new GitlabConfiguration(p);\n  c.createNestedTemplates({ foo: { jobs: { bar: { stage: \"baz\" } } } });\n  // THEN\n  expect(c.stages).toContain(\"baz\");\n});\n"
  },
  {
    "path": "test/ignore-file.test.ts",
    "content": "import { IgnoreFile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"ignorefile synthesizes correctly\", () => {\n  // GIVEN\n  const prj = new TestProject();\n\n  // WHEN\n  new IgnoreFile(prj, \".dockerignore\");\n\n  // THEN\n  expect(splitAndIgnoreMarker(synthSnapshot(prj)[\".dockerignore\"])).toEqual([]);\n});\n\ntest(\"ignorefile includes file after exclusion and inclusion\", () => {\n  // GIVEN\n  const prj = new TestProject();\n\n  // WHEN\n  const file = new IgnoreFile(prj, \".dockerignore\");\n  file.exclude(\"a.txt\");\n  file.include(\"a.txt\");\n\n  // THEN\n  expect(splitAndIgnoreMarker(synthSnapshot(prj)[\".dockerignore\"])).toEqual([\n    \"!a.txt\",\n  ]);\n});\n\ntest(\"ignorefile excludes file after inclusion and exclusion\", () => {\n  // GIVEN\n  const prj = new TestProject();\n\n  // WHEN\n  const file = new IgnoreFile(prj, \".dockerignore\");\n  file.include(\"a.txt\");\n  file.exclude(\"a.txt\");\n\n  // THEN\n  expect(splitAndIgnoreMarker(synthSnapshot(prj)[\".dockerignore\"])).toEqual([\n    \"a.txt\",\n  ]);\n});\n\ntest(\"ignorefile omits duplicated includes and excludes\", () => {\n  // GIVEN\n  const prj = new TestProject();\n\n  // WHEN\n  const file = new IgnoreFile(prj, \".dockerignore\");\n  file.exclude(\"a.txt\", \"b.txt\");\n  file.include(\"c.txt\", \"d.txt\");\n  file.exclude(\"a.txt\", \"b.txt\");\n  file.include(\"c.txt\", \"d.txt\");\n\n  // THEN\n  expect(splitAndIgnoreMarker(synthSnapshot(prj)[\".dockerignore\"])).toEqual([\n    \"a.txt\",\n    \"b.txt\",\n    \"!c.txt\",\n    \"!d.txt\",\n  ]);\n});\n\ntest('if include() is called with \"!\", then strip it', () => {\n  // GIVEN\n  const prj = new TestProject();\n  const ignore = new IgnoreFile(prj, \".myignorefile\");\n\n  // WHEN\n  ignore.include(\"!*.js\");\n\n  // THEN\n  expect(\n    splitAndIgnoreMarker(synthSnapshot(prj)[\".myignorefile\"])\n  ).toStrictEqual([\"!*.js\"]);\n});\n\ntest(\"removePatters() can be used to remove previously added patters\", () => {\n  // GIVEN\n  const prj = new TestProject();\n  const ignore = new IgnoreFile(prj, \".myignorefile\");\n\n  // WHEN\n  ignore.addPatterns(\"*.js\");\n  ignore.addPatterns(\"my_file\");\n  ignore.addPatterns(\"!boom/bam\");\n  ignore.removePatterns(\"*.zz\", \"*.js\", \"!boom/bam\");\n  ignore.addPatterns(\"*.zz\");\n  ignore.addPatterns(\"boom/bam\");\n\n  // THEN\n  expect(\n    splitAndIgnoreMarker(synthSnapshot(prj)[\".myignorefile\"])\n  ).toStrictEqual([\"my_file\", \"*.zz\", \"boom/bam\"]);\n});\n\ntest(\"comments are filtered out\", () => {\n  // GIVEN\n  const prj = new TestProject();\n  const ignore = new IgnoreFile(prj, \".myignorefile\");\n\n  // WHEN\n  ignore.addPatterns(\"*.js\", \"#comment\");\n  ignore.addPatterns(\"!foo\");\n  ignore.addPatterns(\"# hello world\");\n  ignore.addPatterns(\"bar\");\n\n  // THEN\n  expect(\n    splitAndIgnoreMarker(synthSnapshot(prj)[\".myignorefile\"])\n  ).toStrictEqual([\"*.js\", \"!foo\", \"bar\"]);\n});\n\ntest(\"included directories are removed when a parent directory is excluded\", () => {\n  // GIVEN\n  const prj = new TestProject();\n  const ignore = new IgnoreFile(prj, \".myignorefile\");\n\n  // WHEN\n  ignore.addPatterns(\"src/hello.txt\", \"src/greetings/world.txt\");\n  ignore.addPatterns(\"src/__tests__\");\n  ignore.addPatterns(\"bloop/\", \"!floop/\");\n  ignore.addPatterns(\"!src/\");\n\n  // THEN\n  expect(\n    splitAndIgnoreMarker(synthSnapshot(prj)[\".myignorefile\"])\n  ).toStrictEqual([\"bloop/\", \"!floop/\", \"!src/\"]);\n});\n\ntest(\"excluded directories are removed when a parent directory is included\", () => {\n  // GIVEN\n  const prj = new TestProject();\n  const ignore = new IgnoreFile(prj, \".myignorefile\");\n\n  // WHEN\n  ignore.addPatterns(\"!src/hello.txt\", \"!src/greetings/world.txt\");\n  ignore.addPatterns(\"!src/__tests__\");\n  ignore.addPatterns(\"bloop/\", \"!floop/\");\n  ignore.addPatterns(\"src/\");\n\n  // THEN\n  expect(\n    splitAndIgnoreMarker(synthSnapshot(prj)[\".myignorefile\"])\n  ).toStrictEqual([\"bloop/\", \"!floop/\", \"src/\"]);\n});\n\n// parses file contents without 'Generated by...' spiel\nfunction splitAndIgnoreMarker(fileContents: string) {\n  const lines = fileContents.split(\"\\n\");\n  return lines.slice(1, lines.length - 1);\n}\n"
  },
  {
    "path": "test/ini.test.ts",
    "content": "import * as INI from \"ini\";\nimport { IniFile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"ini object can be mutated before synthesis\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {\n    hello: \"world\",\n  };\n\n  new IniFile(prj, \"my/ini/file.ini\", { obj, marker: false });\n\n  // mutate obj (should be reflected in the output)\n  obj.anotherField = {\n    foo: 1234,\n  };\n\n  const out = synthSnapshot(prj);\n  expect(INI.parse(out[\"my/ini/file.ini\"])).toMatchObject({\n    hello: \"world\",\n    anotherField: { foo: \"1234\" },\n  });\n});\n\ntest(\"ini file can contain projen marker\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {};\n\n  const file = new IniFile(prj, \"my/ini/file-marker.ini\", {\n    obj,\n    marker: true,\n  });\n\n  const output = synthSnapshot(prj)[\"my/ini/file-marker.ini\"];\n\n  const firstLine = output.split(\"\\n\")[0];\n\n  expect(firstLine).toBe(`# ${file.marker}`);\n});\n"
  },
  {
    "path": "test/integ.test.ts",
    "content": "import { join, dirname, basename } from \"path\";\nimport { copySync } from \"fs-extra\";\nimport { glob } from \"glob\";\nimport {\n  mkdtemp,\n  directorySnapshot,\n  execProjenCLI,\n  sanitizeOutput,\n} from \"./util\";\n\nconst samples = join(__dirname, \"integration\");\nconst files = glob.sync(\"**/*.projenrc.js\", { cwd: samples });\n\nfor (const projenrc of files) {\n  test(basename(projenrc, \".projenrc.js\"), () => {\n    const workdir = mkdtemp();\n    const base = join(samples, dirname(projenrc));\n    if (base !== samples) {\n      copySync(base, workdir, { recursive: true });\n    }\n    copySync(join(samples, projenrc), join(workdir, \".projenrc.js\"));\n    execProjenCLI(workdir, [\"--no-post\"]);\n\n    // patch the projen version in package.json to match the current version\n    // otherwise, every bump would need to update these snapshots.\n    sanitizeOutput(workdir);\n\n    expect(\n      directorySnapshot(workdir, { excludeGlobs: [\"node_modules/**\"] })\n    ).toMatchSnapshot();\n  });\n}\n"
  },
  {
    "path": "test/integration/cdk-watchful.projenrc.js",
    "content": "const { awscdk, Semver } = require('projen');\n\nconst project = new awscdk.ConstructLibraryAws({\n  name: 'cdk-watchful',\n  description: 'Watching your CDK apps since 2019',\n  defaultReleaseBranch: 'master',\n  authorName: 'Elad Ben-Israel',\n  authorEmail: 'elad.benisrael@gmail.com',\n  repository: 'https://github.com/eladb/cdk-watchful.git',\n  keywords: [\n    'cloudwatch',\n    'monitoring',\n  ],\n\n  catalog: {\n    twitter: 'emeshbi',\n  },\n\n  // creates PRs for projen upgrades\n  projenUpgradeSecret: 'PROJEN_GITHUB_TOKEN',\n\n  cdkVersion: '1.75.0',\n  cdkDependencies: [\n    '@aws-cdk/aws-apigateway',\n    '@aws-cdk/aws-cloudwatch',\n    '@aws-cdk/aws-cloudwatch-actions',\n    '@aws-cdk/aws-dynamodb',\n    '@aws-cdk/aws-ecs',\n    '@aws-cdk/aws-ecs-patterns',\n    '@aws-cdk/aws-elasticloadbalancingv2',\n    '@aws-cdk/aws-events',\n    '@aws-cdk/aws-events-targets',\n    '@aws-cdk/aws-lambda',\n    '@aws-cdk/aws-rds',\n    '@aws-cdk/aws-sns',\n    '@aws-cdk/aws-sns-subscriptions',\n    '@aws-cdk/aws-sqs',\n    '@aws-cdk/core',\n  ],\n\n  devDeps: [\n    'aws-sdk',\n  ],\n\n  // jsii publishing\n\n  publishToMaven: {\n    javaPackage: 'com.github.eladb.watchful',\n    mavenGroupId: 'com.github.eladb',\n    mavenArtifactId: 'cdk-watchful',\n  },\n\n  publishToPypi: {\n    distName: 'cdk-watchful',\n    module: 'cdk_watchful',\n  },\n\n  minNodeVersion: '14.0.0',\n});\n\nproject.gitignore.exclude('.env', '.idea');\nproject.gitignore.exclude('example/*.js', 'example/*.d.ts');\n\nproject.synth();\n"
  },
  {
    "path": "test/integration/cdk8s/cdk8s-cli.projenrc.js",
    "content": "const { typescript } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new typescript.TypeScriptLibraryProject({\n  name: 'cdk8s-cli',\n  description: 'CDK for Kubernetes CLI',\n  defaultReleaseBranch: 'master',\n  bin: {\n    cdk8s: 'bin/cdk8s',\n  },\n  deps: [\n    'cdk8s@^0.0.0',\n    'codemaker',\n    `constructs`,\n    'fs-extra',\n    'jsii-srcmak',\n    'jsii-pacmak',\n    'sscaff',\n    'yaml',\n    'yargs',\n    'json2jsii',\n    'colors',\n\n    // add @types/node as a regular dependency since it's needed to during \"import\"\n    // to compile the generated jsii code.\n    '@types/node',\n  ],\n  devDeps: [\n    '@types/fs-extra',\n    '@types/json-schema',\n  ],\n  ...common.options,\n});\n\nproject.eslint.addIgnorePattern('/templates/');\nproject.jest.addIgnorePattern('/templates/');\n\ncommon.fixup(project);\n\nproject.synth();\n"
  },
  {
    "path": "test/integration/cdk8s/cdk8s.common.js",
    "content": "exports.options = {\n  minNodeVersion: '12.7.0',\n  repository: 'https://github.com/awslabs/cdk8s.git',\n  authorName: 'Amazon Web Services',\n  authorUrl: 'https://aws.amazon.com',\n  authorOrganization: true,\n  buildWorkflow: false,\n  rebuildBot: false,\n  stability: 'experimental',\n  releaseWorkflow: false,\n  dependabot: false,\n  mergify: false,\n  compat: false,\n  dependabot: false,\n  pullRequestTemplate: false,\n  keywords: [\n    \"cdk\",\n    \"kubernetes\",\n    \"k8s\",\n    \"constructs\"\n  ]\n};\n\n// some common fixups for projects\nexports.fixup = project => {\n  // override the default \"build\" from projen because currently in this\n  // repo it means \"compile\"\n  project.setScript('build', 'yarn compile');\n\n  // // add \"compile\" after test because the test command deletes lib/ and we run tests *after* build in this repo.\n  project.addTestCommand('yarn compile');\n\n  // jsii-release is declared at the root level, we don't need it here.\n  project.deps.removeDependency('jsii-release');\n\n  delete project.manifest.scripts.bump;\n  delete project.manifest.scripts.release;\n};\n"
  },
  {
    "path": "test/integration/cdk8s/cdk8s.projenrc.js",
    "content": "const { cdk } = require('projen');\n\nconst common = require('./cdk8s.common');\n\nconst project = new cdk.JsiiProject({\n  name: 'cdk8s',\n  description: 'Cloud Development Kit for Kubernetes',\n  defaultReleaseBranch: 'master',\n  stability: common.options.stability,\n\n  // without this, the version of 'constructs' would need to be controlled\n  // from this file, since otherwise it would create a 0.0.0 dev dependency.\n  peerDependencyOptions: {\n    pinnedDevDependency: false,\n  },\n\n  ...common.options,\n\n  peerDeps: [\n    'constructs',\n  ],\n  bundledDeps: [\n    'yaml',\n    'json-stable-stringify',\n    'follow-redirects',\n    'fast-json-patch',\n  ],\n  devDeps: [\n    'constructs',\n    '@types/follow-redirects',\n    '@types/json-stable-stringify',\n    '@types/yaml',\n    'json-schema-to-typescript',\n  ],\n\n  // jsii configuration\n  publishToMaven: {\n    javaPackage: 'org.cdk8s',\n    mavenGroupId: 'org.cdk8s',\n    mavenArtifactId: 'cdk8s',\n  },\n  publishToPypi: {\n    distName: 'cdk8s',\n    module: 'cdk8s',\n  },\n  publishToNuget: {\n    dotNetNamespace: 'Org.Cdk8s',\n    packageId: 'Org.Cdk8s',\n  },\n});\n\ncommon.fixup(project);\n\n// _loadurl.js is written in javascript so we need to commit it and also copy it\n// after compilation to the `lib/` directory.\nproject.gitignore.include('/src/_loadurl.js');\nproject.addCompileCommand('cp src/_loadurl.js lib/');\n\nproject.synth();\n"
  },
  {
    "path": "test/integration/pnpm.projenrc.js",
    "content": "const { javascript } = require(\"projen\");\n\nconst project = new javascript.NodeProject({\n  name: \"pnpm-project\",\n\n  packageManager: javascript.NodePackageManager.PNPM,\n  defaultReleaseBranch: 'master',\n\n  deps: [\"esbuild\"],\n\n  devDeps: [\"aws-sdk\"],\n});\n\nproject.synth();\n"
  },
  {
    "path": "test/inventory/gzip_compression/.jsii",
    "content": "{\n  \"schema\":\"jsii/file-redirect\",\n  \"compression\":\"gzip\",\n  \"filename\":\".jsii.gz\"}"
  },
  {
    "path": "test/inventory/no_compression/.jsii",
    "content": "{\n  \"schema\": \"jsii/0.10.0\",\n  \"compression\": \"none\"\n}"
  },
  {
    "path": "test/inventory.test.ts",
    "content": "import * as path from \"path\";\nimport * as inventory from \"../src/inventory\";\n\nconst result = inventory.discover();\n\ntest(\"read manifest - no compression\", () => {\n  const manifest = inventory.readManifest(\n    path.join(__dirname, \"inventory/no_compression\")\n  );\n\n  expect(manifest.schema).toEqual(\"jsii/0.10.0\");\n  expect(manifest.compression).toEqual(\"none\");\n});\n\ntest(\"read manifest - gzip compression\", () => {\n  const manifest = inventory.readManifest(\n    path.join(__dirname, \"inventory/gzip_compression\")\n  );\n\n  expect(manifest.schema).toEqual(\"jsii/0.10.0\");\n  expect(manifest.compression).toEqual(\"gzip\");\n});\n\ntest(\"project id\", () => {\n  expect(result.map((x) => x.pjid).sort()).toContain(\"jsii\");\n  expect(result.map((x) => x.pjid).sort()).toContain(\"awscdk-construct\");\n  expect(result.map((x) => x.pjid).sort()).toContain(\"typescript\");\n});\n\ntest(\"inventory\", () => {\n  expect(result).toMatchSnapshot();\n});\n\ntest(\"remote discover project id simulation\", () => {\n  const remoteDiscoverResult = inventory.discover(path.join(__dirname, \"..\"));\n  expect(remoteDiscoverResult.map((x) => x.pjid).sort()).toContain(\"jsii\");\n  expect(remoteDiscoverResult.map((x) => x.pjid).sort()).toContain(\n    \"awscdk-construct\"\n  );\n  expect(remoteDiscoverResult.map((x) => x.pjid).sort()).toContain(\n    \"typescript\"\n  );\n});\n\ntest(\"renderable default values simulation\", () => {\n  const baseOption = {\n    path: [\"myOption\"],\n    name: \"myOption\",\n    switch: \"my-option\",\n    simpleType: \"boolean\",\n    fullType: { primitive: \"boolean\" },\n    parent: \"MyModule\",\n  };\n  expect(() => throwIfNotRenderable(baseOption)).not.toThrowError();\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: \"undefined\" })\n  ).not.toThrowError();\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: \"$BASEDIR\" })\n  ).not.toThrowError();\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: '{ \"a\": 3 }' })\n  ).not.toThrowError();\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: \"2048\" })\n  ).not.toThrowError();\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: \"true\" })\n  ).not.toThrowError();\n\n  expect(() =>\n    throwIfNotRenderable({\n      ...baseOption,\n      default: \"MyEnum.OptionA\",\n      simpleType: \"MyEnum\",\n    })\n  ).not.toThrowError();\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: \"MyEnum.OptionA\" })\n  ).toThrowError();\n  expect(() =>\n    throwIfNotRenderable({\n      ...baseOption,\n      default: \"MyEnum.OptionA\",\n      simpleType: \"BaseEnum\",\n    })\n  ).toThrowError();\n\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: \"- current year\" })\n  ).not.toThrowError();\n  expect(() =>\n    throwIfNotRenderable({ ...baseOption, default: \"current year\" })\n  ).toThrowError();\n});\n\ndescribe(\"all default values in docstrings are renderable JS values\", () => {\n  result.forEach((project) => {\n    project.options.forEach((option) => {\n      test(`${project.pjid}:${option.path.join(\".\")}=${option.default}`, () => {\n        expect(() => throwIfNotRenderable(option)).not.toThrowError();\n      });\n    });\n  });\n});\n\nfunction throwIfNotRenderable(option: inventory.ProjectOption) {\n  return (\n    option.default === undefined ||\n    option.default === \"undefined\" ||\n    option.default.startsWith(\"$\") ||\n    option.default.startsWith(\"-\") ||\n    option.default.startsWith(option.simpleType) ||\n    JSON.parse(option.default)\n  );\n}\n"
  },
  {
    "path": "test/java/__snapshots__/java-project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`defaults 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/pom.xml linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/pom.xml\n.classpath\n.project\n.settings\ntarget\ndist/java\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"source\": \"1.8\",\n            \"target\": \"1.8\",\n          },\n        },\n        \"name\": \"org.apache.maven.plugins/maven-compiler-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.8.1\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"rules\": Array [\n              Object {\n                \"requireMavenVersion\": Array [\n                  Object {\n                    \"version\": \"3.6\",\n                  },\n                ],\n              },\n            ],\n          },\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"enforce\",\n              ],\n              \"id\": \"enforce-maven\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-enforcer-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0-M3\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"archive\": Object {\n              \"index\": true,\n              \"manifest\": Object {\n                \"addDefaultImplementationEntries\": true,\n                \"addDefaultSpecificationEntries\": true,\n              },\n            },\n          },\n        },\n        \"name\": \"org.apache.maven.plugins/maven-jar-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.0\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"additionalJOptions\": Object {\n              \"additionalJOption\": Array [\n                \"-J-XX:+TieredCompilation\",\n                \"-J-XX:TieredStopAtLevel=1\",\n              ],\n            },\n            \"detectJavaApiLink\": false,\n            \"failOnError\": false,\n            \"show\": \"protected\",\n          },\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"jar\",\n              ],\n              \"id\": \"attach-javadocs\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-javadoc-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.0\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"jar\",\n              ],\n              \"id\": \"attach-sources\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-source-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.1\",\n      },\n      Object {\n        \"name\": \"org.codehaus.mojo/exec-maven-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0\",\n      },\n      Object {\n        \"name\": \"io.github.cdklabs/projen\",\n        \"type\": \"test\",\n        \"version\": \"^1.2.3\",\n      },\n      Object {\n        \"name\": \"org.junit.jupiter/junit-jupiter-api\",\n        \"type\": \"test\",\n        \"version\": \"5.7.0\",\n      },\n      Object {\n        \"name\": \"org.junit.jupiter/junit-jupiter-engine\",\n        \"type\": \"test\",\n        \"version\": \"5.7.0\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"pom.xml\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"clobber\": Object {\n        \"condition\": \"git diff --exit-code > /dev/null\",\n        \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n        \"env\": Object {\n          \"BRANCH\": \"$(git branch --show-current)\",\n        },\n        \"name\": \"clobber\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"git checkout -b scratch\",\n            \"name\": \"save current HEAD in \\\\\"scratch\\\\\" branch\",\n          },\n          Object {\n            \"exec\": \"git checkout $BRANCH\",\n          },\n          Object {\n            \"exec\": \"git fetch origin\",\n            \"name\": \"fetch latest changes from origin\",\n          },\n          Object {\n            \"exec\": \"git reset --hard origin/$BRANCH\",\n            \"name\": \"hard reset to origin commit\",\n          },\n          Object {\n            \"exec\": \"git clean -fdx\",\n            \"name\": \"clean all untracked files\",\n          },\n          Object {\n            \"say\": \"ready to rock! (unpushed commits are under the \\\\\"scratch\\\\\" branch)\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:compile\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:testCompile --quiet\",\n          },\n          Object {\n            \"exec\": \"mvn exec:java --quiet -Dexec.mainClass=projenrc -Dexec.classpathScope=\\\\\"test\\\\\"\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"env\": Object {\n          \"MAVEN_OPTS\": \"-XX:+TieredCompilation -XX:TieredStopAtLevel=1\",\n        },\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mkdir -p dist/java\",\n          },\n          Object {\n            \"exec\": \"mvn deploy -D=altDeploymentRepository=local::default::file:///$PWD/dist/java\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn test\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"pom.xml\": \"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.0.0</version>\n    <packaging>jar</packaging>\n    <name>test-project</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>3.0.0-M3</version>\n                <configuration>\n                    <rules>\n                        <requireMavenVersion>\n                            <version>3.6</version>\n                        </requireMavenVersion>\n                    </rules>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>enforce-maven</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <failOnError>false</failOnError>\n                    <show>protected</show>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                    <additionalJOptions>\n                        <additionalJOption>-J-XX:+TieredCompilation</additionalJOption>\n                        <additionalJOption>-J-XX:TieredStopAtLevel=1</additionalJOption>\n                    </additionalJOptions>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>[1.2.3,2.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\",\n  \"src/main/java/org/acme/Main.java\": \"package org.acme;\n\npublic class Main {\n  public static void main(final String[] args) {\n    System.out.println(\\\\\"Hello, world!\\\\\");\n  }\n}\",\n  \"src/test/java/org/acme/MyTest.java\": \"package org.acme;\n\nimport org.junit.jupiter.api.Test;\n\npublic class MyTest {\n  @Test\n  public void testHello() {\n    System.out.println(\\\\\"Hello, world!\\\\\");\n  }\n}\",\n  \"src/test/java/projenrc.java\": \"import io.github.cdklabs.projen.java.JavaProject;\nimport io.github.cdklabs.projen.java.JavaProjectOptions;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        JavaProject project = new JavaProject(JavaProjectOptions.builder()\n            .groupId(\\\\\"org.acme\\\\\")\n            .artifactId(\\\\\"my-artifact\\\\\")\n            .name(\\\\\"test-project\\\\\")\n            .version(\\\\\"1.0.0\\\\\")\n            .projenrcJavaOptions({\\\\\"projenVersion\\\\\":\\\\\"^1.2.3\\\\\"})\n            .build());\n        project.synth();\n    }\n}\",\n}\n`;\n\nexports[`dependencies 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.0.0</version>\n    <packaging>jar</packaging>\n    <name>test-project</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>3.0.0-M3</version>\n                <configuration>\n                    <rules>\n                        <requireMavenVersion>\n                            <version>3.6</version>\n                        </requireMavenVersion>\n                    </rules>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>enforce-maven</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <failOnError>false</failOnError>\n                    <show>protected</show>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                    <additionalJOptions>\n                        <additionalJOption>-J-XX:+TieredCompilation</additionalJOption>\n                        <additionalJOption>-J-XX:TieredStopAtLevel=1</additionalJOption>\n                    </additionalJOptions>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>software.amazon.awscdk</groupId>\n            <artifactId>core</artifactId>\n            <version>[1.2.3,2.0.0)</version>\n        </dependency>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>[1.2.3,2.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.assertj</groupId>\n            <artifactId>assertj-core</artifactId>\n            <version>3.18.1</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`dependencies via ctor 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.0.0</version>\n    <packaging>jar</packaging>\n    <name>test-project</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>3.0.0-M3</version>\n                <configuration>\n                    <rules>\n                        <requireMavenVersion>\n                            <version>3.6</version>\n                        </requireMavenVersion>\n                    </rules>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>enforce-maven</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <failOnError>false</failOnError>\n                    <show>protected</show>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                    <additionalJOptions>\n                        <additionalJOption>-J-XX:+TieredCompilation</additionalJOption>\n                        <additionalJOption>-J-XX:TieredStopAtLevel=1</additionalJOption>\n                    </additionalJOptions>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>software.amazon.awscdk</groupId>\n            <artifactId>aws-s3</artifactId>\n            <version>[1.0.0,2.0.0)</version>\n        </dependency>\n        <dependency>\n            <groupId>software.amazon.awscdk</groupId>\n            <artifactId>core</artifactId>\n            <version>[1.2.3,2.0.0)</version>\n        </dependency>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>[1.2.3,2.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.assertj</groupId>\n            <artifactId>assertj-core</artifactId>\n            <version>[3.0.0,4.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`no junit 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/pom.xml linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/pom.xml\n.classpath\n.project\n.settings\ntarget\ndist/java\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"source\": \"1.8\",\n            \"target\": \"1.8\",\n          },\n        },\n        \"name\": \"org.apache.maven.plugins/maven-compiler-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.8.1\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"rules\": Array [\n              Object {\n                \"requireMavenVersion\": Array [\n                  Object {\n                    \"version\": \"3.6\",\n                  },\n                ],\n              },\n            ],\n          },\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"enforce\",\n              ],\n              \"id\": \"enforce-maven\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-enforcer-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0-M3\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"archive\": Object {\n              \"index\": true,\n              \"manifest\": Object {\n                \"addDefaultImplementationEntries\": true,\n                \"addDefaultSpecificationEntries\": true,\n              },\n            },\n          },\n        },\n        \"name\": \"org.apache.maven.plugins/maven-jar-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.0\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"configuration\": Object {\n            \"additionalJOptions\": Object {\n              \"additionalJOption\": Array [\n                \"-J-XX:+TieredCompilation\",\n                \"-J-XX:TieredStopAtLevel=1\",\n              ],\n            },\n            \"detectJavaApiLink\": false,\n            \"failOnError\": false,\n            \"show\": \"protected\",\n          },\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"jar\",\n              ],\n              \"id\": \"attach-javadocs\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-javadoc-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.0\",\n      },\n      Object {\n        \"metadata\": Object {\n          \"executions\": Array [\n            Object {\n              \"goals\": Array [\n                \"jar\",\n              ],\n              \"id\": \"attach-sources\",\n            },\n          ],\n        },\n        \"name\": \"org.apache.maven.plugins/maven-source-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.2.1\",\n      },\n      Object {\n        \"name\": \"org.codehaus.mojo/exec-maven-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0\",\n      },\n      Object {\n        \"name\": \"io.github.cdklabs/projen\",\n        \"type\": \"test\",\n        \"version\": \"^1.2.3\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"pom.xml\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"clobber\": Object {\n        \"condition\": \"git diff --exit-code > /dev/null\",\n        \"description\": \"hard resets to HEAD of origin and cleans the local repo\",\n        \"env\": Object {\n          \"BRANCH\": \"$(git branch --show-current)\",\n        },\n        \"name\": \"clobber\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"git checkout -b scratch\",\n            \"name\": \"save current HEAD in \\\\\"scratch\\\\\" branch\",\n          },\n          Object {\n            \"exec\": \"git checkout $BRANCH\",\n          },\n          Object {\n            \"exec\": \"git fetch origin\",\n            \"name\": \"fetch latest changes from origin\",\n          },\n          Object {\n            \"exec\": \"git reset --hard origin/$BRANCH\",\n            \"name\": \"hard reset to origin commit\",\n          },\n          Object {\n            \"exec\": \"git clean -fdx\",\n            \"name\": \"clean all untracked files\",\n          },\n          Object {\n            \"say\": \"ready to rock! (unpushed commits are under the \\\\\"scratch\\\\\" branch)\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:compile\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:testCompile --quiet\",\n          },\n          Object {\n            \"exec\": \"mvn exec:java --quiet -Dexec.mainClass=projenrc -Dexec.classpathScope=\\\\\"test\\\\\"\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"env\": Object {\n          \"MAVEN_OPTS\": \"-XX:+TieredCompilation -XX:TieredStopAtLevel=1\",\n        },\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mkdir -p dist/java\",\n          },\n          Object {\n            \"exec\": \"mvn deploy -D=altDeploymentRepository=local::default::file:///$PWD/dist/java\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"pom.xml\": \"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.0.0</version>\n    <packaging>jar</packaging>\n    <name>test-project</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>3.0.0-M3</version>\n                <configuration>\n                    <rules>\n                        <requireMavenVersion>\n                            <version>3.6</version>\n                        </requireMavenVersion>\n                    </rules>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>enforce-maven</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <failOnError>false</failOnError>\n                    <show>protected</show>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                    <additionalJOptions>\n                        <additionalJOption>-J-XX:+TieredCompilation</additionalJOption>\n                        <additionalJOption>-J-XX:TieredStopAtLevel=1</additionalJOption>\n                    </additionalJOptions>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>[1.2.3,2.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\",\n  \"src/main/java/org/acme/Main.java\": \"package org.acme;\n\npublic class Main {\n  public static void main(final String[] args) {\n    System.out.println(\\\\\"Hello, world!\\\\\");\n  }\n}\",\n  \"src/test/java/projenrc.java\": \"import io.github.cdklabs.projen.java.JavaProject;\nimport io.github.cdklabs.projen.java.JavaProjectOptions;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        JavaProject project = new JavaProject(JavaProjectOptions.builder()\n            .junit(false)\n            .groupId(\\\\\"org.acme\\\\\")\n            .artifactId(\\\\\"my-artifact\\\\\")\n            .name(\\\\\"test-project\\\\\")\n            .version(\\\\\"1.0.0\\\\\")\n            .projenrcJavaOptions({\\\\\"projenVersion\\\\\":\\\\\"^1.2.3\\\\\"})\n            .build());\n        project.synth();\n    }\n}\",\n}\n`;\n\nexports[`pom options 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.0.0</version>\n    <packaging>jar</packaging>\n    <name>test-project</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-enforcer-plugin</artifactId>\n                <version>3.0.0-M3</version>\n                <configuration>\n                    <rules>\n                        <requireMavenVersion>\n                            <version>3.6</version>\n                        </requireMavenVersion>\n                    </rules>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>enforce-maven</id>\n                        <goals>\n                            <goal>enforce</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>\n                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>3.2.0</version>\n                <configuration>\n                    <failOnError>false</failOnError>\n                    <show>protected</show>\n                    <detectJavaApiLink>false</detectJavaApiLink>\n                    <additionalJOptions>\n                        <additionalJOption>-J-XX:+TieredCompilation</additionalJOption>\n                        <additionalJOption>-J-XX:TieredStopAtLevel=1</additionalJOption>\n                    </additionalJOptions>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>attach-javadocs</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.2.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>[1.2.3,2.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>5.7.0</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`projenrc in java 1`] = `\n\"import io.github.cdklabs.projen.java.JavaProject;\nimport io.github.cdklabs.projen.java.JavaProjectOptions;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        JavaProject project = new JavaProject(JavaProjectOptions.builder()\n            .groupId(\\\\\"org.acme\\\\\")\n            .artifactId(\\\\\"my-artifact\\\\\")\n            .name(\\\\\"test-project\\\\\")\n            .version(\\\\\"1.0.0\\\\\")\n            .projenrcJavaOptions({\\\\\"projenVersion\\\\\":\\\\\"^1.2.3\\\\\"})\n            .build());\n        project.synth();\n    }\n}\"\n`;\n"
  },
  {
    "path": "test/java/__snapshots__/pom.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`addDependency() 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <dependencies>\n        <dependency>\n            <groupId>software.amazon.awscdk</groupId>\n            <artifactId>core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.assertj</groupId>\n            <artifactId>assertj-core</artifactId>\n            <version>[3.18.1,4.0.0)</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`addPlugin() 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>1.8</source>\n                    <target>1.8</target>\n                </configuration>\n                <dependencies>\n                    <dependency>\n                        <groupId>org.projen</groupId>\n                        <artifactId>projen</artifactId>\n                        <version>[0.14.0,0.15.0)</version>\n                    </dependency>\n                </dependencies>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-shade-plugin</artifactId>\n                <version>3.2.2</version>\n                <configuration>\n                    <createDependencyReducedPom>false</createDependencyReducedPom>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>shade-task</id>\n                        <goals>\n                            <goal>shade</goal>\n                        </goals>\n                        <phase>package</phase>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n                <configuration>\n                    <mainClass>com.myorg.Play202101050157App</mainClass>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.projen</groupId>\n                <artifactId>projen</artifactId>\n                <version>[0.14.0,0.15.0)</version>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`addProperty() 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <junit.version>5.7.0</junit.version>\n    </properties>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`addRepository() 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.acme</groupId>\n    <artifactId>my-artifact</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <repositories>\n        <repository>\n            <id>my-local-repository</id>\n            <url>file://my/local/repository</url>\n        </repository>\n        <repository>\n            <id>my-remote-repository</id>\n            <name>Remote Repo</name>\n            <url>https://myserver/repo</url>\n            <layout>default</layout>\n        </repository>\n    </repositories>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`group/artifact/version 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>my.group.id</groupId>\n    <artifactId>mfoo-bar</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n\nexports[`optional metadata 1`] = `\n\"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>my.group.id</groupId>\n    <artifactId>mfoo-bar</artifactId>\n    <version>1.2.3</version>\n    <packaging>not_jar</packaging>\n    <name>my-project</name>\n    <description>hello, world!</description>\n    <url>https://foo/bar</url>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\"\n`;\n"
  },
  {
    "path": "test/java/__snapshots__/projenrc.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`generate projenrc in java 1`] = `\n\"import io.github.cdklabs.projen.java.JavaProject;\nimport io.github.cdklabs.projen.java.JavaProjectOptions;\n\npublic class projenrc {\n    public static void main(String[] args) {\n        JavaProject project = new JavaProject();\n        project.synth();\n    }\n}\"\n`;\n\nexports[`projenrc.java support 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/pom.xml linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/pom.xml\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"org.codehaus.mojo/exec-maven-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0\",\n      },\n      Object {\n        \"name\": \"io.github.cdklabs/projen\",\n        \"type\": \"test\",\n        \"version\": \"1.0.0\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"pom.xml\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:testCompile --quiet\",\n          },\n          Object {\n            \"exec\": \"mvn exec:java --quiet -Dexec.mainClass=projenrc -Dexec.classpathScope=\\\\\"test\\\\\"\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"pom.xml\": \"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>my.group.id</groupId>\n    <artifactId>hello-world</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>1.0.0</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\",\n}\n`;\n\nexports[`set the class name 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/pom.xml linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/pom.xml\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"org.codehaus.mojo/exec-maven-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0\",\n      },\n      Object {\n        \"name\": \"io.github.cdklabs/projen\",\n        \"type\": \"test\",\n        \"version\": \"7.7.7\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"pom.xml\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:testCompile --quiet\",\n          },\n          Object {\n            \"exec\": \"mvn exec:java --quiet -Dexec.mainClass=boom.bam.projenrc -Dexec.classpathScope=\\\\\"test\\\\\"\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"pom.xml\": \"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>my.group.id</groupId>\n    <artifactId>hello-world</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>7.7.7</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\",\n}\n`;\n\nexports[`use a non-test scope 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/pom.xml linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/pom.xml\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"org.codehaus.mojo/exec-maven-plugin\",\n        \"type\": \"build\",\n        \"version\": \"3.0.0\",\n      },\n      Object {\n        \"name\": \"io.github.cdklabs/projen\",\n        \"type\": \"runtime\",\n        \"version\": \"7.7.7\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"pom.xml\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mvn compiler:compile --quiet\",\n          },\n          Object {\n            \"exec\": \"mvn exec:java --quiet -Dexec.mainClass=projenrc\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"pom.xml\": \"<?xml version=\\\\\"1.0\\\\\" encoding=\\\\\"UTF-8\\\\\"?>\n<project xsi:schemaLocation=\\\\\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\\\\\" xmlns=\\\\\"http://maven.apache.org/POM/4.0.0\\\\\" xmlns:xsi=\\\\\"http://www.w3.org/2001/XMLSchema-instance\\\\\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>my.group.id</groupId>\n    <artifactId>hello-world</artifactId>\n    <version>1.2.3</version>\n    <packaging>jar</packaging>\n    <name>my-project</name>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>exec-maven-plugin</artifactId>\n                <version>3.0.0</version>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <dependency>\n            <groupId>io.github.cdklabs</groupId>\n            <artifactId>projen</artifactId>\n            <version>7.7.7</version>\n        </dependency>\n    </dependencies>\n</project>\n<!-- ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\". -->\",\n}\n`;\n"
  },
  {
    "path": "test/java/java-project.test.ts",
    "content": "import { JavaProject, JavaProjectOptions } from \"../../src/java/java-project\";\nimport { renderProjenInitOptions } from \"../../src/javascript/render-options\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"defaults\", () => {\n  const p = new TestJavaProject();\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"pom options\", () => {\n  const p = new TestJavaProject({\n    groupId: \"com.myorg\",\n    artifactId: \"play-202101050157\",\n  });\n\n  snapPom(p);\n});\n\ntest(\"dependencies\", () => {\n  const p = new TestJavaProject();\n  p.pom.addDependency(\"software.amazon.awscdk/core@^1.2.3\");\n  p.pom.addTestDependency(\"org.assertj/assertj-core@3.18.1\");\n  p.pom.addPlugin(\"org.apache.maven.plugins/maven-compiler-plugin@3.8.1\", {\n    configuration: {\n      source: \"1.8\",\n      target: \"1.8\",\n    },\n  });\n  snapPom(p);\n});\n\ntest(\"dependencies via ctor\", () => {\n  const p = new TestJavaProject({\n    deps: [\n      \"software.amazon.awscdk/core@^1.2.3\",\n      \"software.amazon.awscdk/aws-s3@^1\",\n    ],\n    testDeps: [\"org.assertj/assertj-core@^3\"],\n  });\n  snapPom(p);\n});\n\ntest(\"no junit\", () => {\n  const p = new TestJavaProject({\n    junit: false,\n  });\n\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"projenrc in java\", () => {\n  const p = new TestJavaProject();\n  expect(synthSnapshot(p)[\"src/test/java/projenrc.java\"]).toMatchSnapshot();\n});\n\ntest(\"disable projenrc in java\", () => {\n  const p = new TestJavaProject({\n    projenrcJava: false,\n  });\n\n  expect(synthSnapshot(p)[\"src/test/java/projenrc.java\"]).toBeUndefined();\n});\n\nfunction snapPom(p: JavaProject) {\n  expect(synthSnapshot(p)[\"pom.xml\"]).toMatchSnapshot();\n}\n\nclass TestJavaProject extends JavaProject {\n  constructor(options: Partial<JavaProjectOptions> = {}) {\n    super(\n      renderProjenInitOptions(\"projen.java.JavaProject\", {\n        ...options,\n        groupId: \"org.acme\",\n        artifactId: \"my-artifact\",\n        name: \"test-project\",\n        version: \"1.0.0\",\n        projenrcJavaOptions: {\n          projenVersion: \"^1.2.3\",\n        },\n      })\n    );\n  }\n}\n"
  },
  {
    "path": "test/java/pom.test.ts",
    "content": "import { DependencyType } from \"../../src/dependencies\";\nimport { Pom, PomOptions } from \"../../src/java\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"group/artifact/version\", () => {\n  const pom = new TestPom({\n    groupId: \"my.group.id\",\n    artifactId: \"mfoo-bar\",\n    version: \"1.2.3\",\n  });\n\n  expect(actualPom(pom)).toMatchSnapshot();\n});\n\ntest(\"optional metadata\", () => {\n  const pom = new TestPom({\n    groupId: \"my.group.id\",\n    artifactId: \"mfoo-bar\",\n    version: \"1.2.3\",\n\n    description: \"hello, world!\",\n    url: \"https://foo/bar\",\n    packaging: \"not_jar\",\n  });\n\n  expect(actualPom(pom)).toMatchSnapshot();\n});\n\ntest(\"addProperty()\", () => {\n  const pom = new TestPom();\n  pom.addProperty(\"project.build.sourceEncoding\", \"UTF-8\");\n  pom.addProperty(\"junit.version\", \"5.7.0\");\n\n  expect(actualPom(pom)).toMatchSnapshot();\n});\n\ntest(\"addDependency()\", () => {\n  const pom = new TestPom();\n  pom.addDependency(\"software.amazon.awscdk/core\");\n\n  // dependencies are managed at the project level\n  pom.project.deps.addDependency(\n    \"org.assertj/assertj-core@^3.18.1\",\n    DependencyType.TEST\n  );\n\n  expect(actualPom(pom)).toMatchSnapshot();\n\n  // check that pom.addDependency() updates the project\n  expect(\n    pom.project.deps.getDependency(\"software.amazon.awscdk/core\")\n  ).toStrictEqual({\n    name: \"software.amazon.awscdk/core\",\n    type: \"runtime\",\n  });\n});\n\ntest(\"addPlugin()\", () => {\n  const pom = new TestPom();\n\n  pom.addPlugin(\"org.apache.maven.plugins/maven-compiler-plugin@3.8.1\", {\n    dependencies: [\"org.projen/projen@^0.14\"],\n    configuration: {\n      source: \"1.8\",\n      target: \"1.8\",\n    },\n  });\n\n  pom.addPlugin(\"org.apache.maven.plugins/maven-shade-plugin@3.2.2\", {\n    configuration: {\n      createDependencyReducedPom: false,\n    },\n    executions: [\n      {\n        id: \"shade-task\",\n        phase: \"package\",\n        goals: [\"shade\"],\n      },\n    ],\n  });\n\n  // alteratively\n  pom.project.deps.addDependency(\n    \"org.codehaus.mojo/exec-maven-plugin@3.0.0\",\n    DependencyType.BUILD,\n    {\n      configuration: {\n        mainClass: \"com.myorg.Play202101050157App\",\n      },\n    }\n  );\n\n  expect(actualPom(pom)).toMatchSnapshot();\n});\n\ntest(\"addRepository()\", () => {\n  const pom = new TestPom();\n\n  pom.addRepository({\n    id: \"my-local-repository\",\n    url: \"file://my/local/repository\",\n  });\n\n  pom.addRepository({\n    id: \"my-remote-repository\",\n    name: \"Remote Repo\",\n    url: \"https://myserver/repo\",\n    layout: \"default\",\n  });\n\n  expect(actualPom(pom)).toMatchSnapshot();\n});\n\nfunction actualPom(p: Pom) {\n  const snap = synthSnapshot(p.project);\n  return snap[p.fileName];\n}\n\nclass TestPom extends Pom {\n  constructor(options?: PomOptions) {\n    super(\n      new TestProject(),\n      options ?? {\n        groupId: \"org.acme\",\n        artifactId: \"my-artifact\",\n        version: \"1.2.3\",\n      }\n    );\n  }\n}\n"
  },
  {
    "path": "test/java/projenrc.test.ts",
    "content": "import { ProjectOption } from \"../../lib/inventory\";\nimport { generateJavaOptionNames } from \"../../lib/java\";\nimport { Pom } from \"../../src/java\";\nimport { Projenrc, getJavaImport } from \"../../src/java/projenrc\";\nimport { renderProjenInitOptions } from \"../../src/javascript/render-options\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"projenrc.java support\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const pom = new Pom(project, {\n    groupId: \"my.group.id\",\n    artifactId: \"hello-world\",\n    version: \"1.2.3\",\n  });\n\n  // WHEN\n  new Projenrc(project, pom, {\n    projenVersion: \"1.0.0\",\n  });\n\n  // THEN\n  expect(synthSnapshot(project)).toMatchSnapshot();\n});\n\ntest(\"use a non-test scope\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const pom = new Pom(project, {\n    groupId: \"my.group.id\",\n    artifactId: \"hello-world\",\n    version: \"1.2.3\",\n  });\n\n  // WHEN\n  new Projenrc(project, pom, {\n    testScope: false,\n    projenVersion: \"7.7.7\",\n  });\n\n  // THEN\n  expect(synthSnapshot(project)).toMatchSnapshot();\n});\n\ntest(\"set the class name\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const pom = new Pom(project, {\n    groupId: \"my.group.id\",\n    artifactId: \"hello-world\",\n    version: \"1.2.3\",\n  });\n\n  // WHEN\n  new Projenrc(project, pom, {\n    className: \"boom.bam.projenrc\",\n    projenVersion: \"7.7.7\",\n  });\n\n  // THEN\n  expect(synthSnapshot(project)).toMatchSnapshot();\n});\n\ntest(\"generate projenrc in java\", () => {\n  // GIVEN\n  const project = new TestProject(\n    renderProjenInitOptions(\"projen.java.JavaProject\", {})\n  );\n  const pom = new Pom(project, {\n    groupId: \"my.group.id\",\n    artifactId: \"hello-world\",\n    version: \"1.2.3\",\n  });\n\n  // WHEN\n  new Projenrc(project, pom);\n\n  // THEN\n  expect(\n    synthSnapshot(project)[\"src/test/java/projenrc.java\"]\n  ).toMatchSnapshot();\n});\n\ntest(\"assert unknown manifest type doesn't throw\", () => {\n  // GIVEN\n  const options: ProjectOption[] = [\n    {\n      fqn: \"unknown.fqn\",\n      path: [],\n      name: \"unknownFqn\",\n      simpleType: \"\",\n      switch: \"\",\n      fullType: {},\n      parent: \"\",\n    },\n    {\n      fqn: \"known.fqn\",\n      path: [],\n      name: \"knownFqn\",\n      simpleType: \"\",\n      switch: \"\",\n      fullType: {},\n      parent: \"\",\n    },\n  ];\n\n  const jsiiManifest: any = {\n    types: {\n      \"known.fqn\": {\n        namespace: \"known_namespace\",\n        name: \"component\",\n      },\n    },\n  };\n\n  // WHEN\n  const optionNames = generateJavaOptionNames(options, jsiiManifest);\n\n  // THEN\n  const optionNameKeys = Object.keys(optionNames);\n  expect(optionNameKeys.length).toEqual(1);\n  expect(optionNames[optionNameKeys[0]]).toEqual(\"known_namespace.component\");\n});\n\ntest(\"assert getJavaImport returns the correct import for submodules.\", () => {\n  // GIVEN\n\n  const jsiiTypeWithSubmodule = {\n    assembly: \"@aws/lib\",\n    namespace: \"sub_module\",\n    name: \"Component\",\n  };\n\n  const jsiiManifest: any = {\n    submodules: {\n      \"@aws/lib.sub_module\": {\n        targets: {\n          java: {\n            package: \"software.aws.sdk.submodule\",\n          },\n        },\n      },\n    },\n    types: {\n      \"@aws/lib.sub_module.Component\": jsiiTypeWithSubmodule,\n    },\n  };\n\n  // WHEN\n  const fullNameWithSubmodule = getJavaImport(\n    jsiiTypeWithSubmodule,\n    jsiiManifest\n  );\n\n  // THEN\n  expect(fullNameWithSubmodule).toEqual(\"software.aws.sdk.submodule.Component\");\n});\n\ntest(\"assert getJavaImport returns the correct import with no submodules\", () => {\n  // GIVEN\n  const jsiiType = {\n    assembly: \"@aws/lib\",\n    name: \"Component\",\n  };\n\n  const jsiiManifest: any = {\n    types: {\n      \"@aws/lib.Component\": jsiiType,\n    },\n    targets: {\n      java: {\n        package: \"software.aws.sdk\",\n      },\n    },\n  };\n\n  // WHEN\n  const fullName = getJavaImport(jsiiType, jsiiManifest);\n\n  // THEN\n  expect(fullName).toEqual(\"software.aws.sdk.Component\");\n});\n"
  },
  {
    "path": "test/javascript/__snapshots__/eslint.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`devdirs 1`] = `\nObject {\n  \"env\": Object {\n    \"jest\": true,\n    \"node\": true,\n  },\n  \"extends\": Array [\n    \"plugin:import/typescript\",\n  ],\n  \"ignorePatterns\": Array [\n    \"*.js\",\n    \"!.projenrc.js\",\n    \"*.d.ts\",\n    \"node_modules/\",\n    \"*.generated.ts\",\n    \"coverage\",\n  ],\n  \"overrides\": Array [\n    Object {\n      \"files\": Array [\n        \".projenrc.js\",\n      ],\n      \"rules\": Object {\n        \"@typescript-eslint/no-require-imports\": \"off\",\n        \"import/no-extraneous-dependencies\": \"off\",\n      },\n    },\n  ],\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": Object {\n    \"ecmaVersion\": 2018,\n    \"project\": \"./tsconfig.json\",\n    \"sourceType\": \"module\",\n  },\n  \"plugins\": Array [\n    \"@typescript-eslint\",\n    \"import\",\n  ],\n  \"root\": true,\n  \"rules\": Object {\n    \"@typescript-eslint/indent\": Array [\n      \"error\",\n      2,\n    ],\n    \"@typescript-eslint/member-delimiter-style\": Array [\n      \"error\",\n    ],\n    \"@typescript-eslint/member-ordering\": Array [\n      \"error\",\n      Object {\n        \"default\": Array [\n          \"public-static-field\",\n          \"public-static-method\",\n          \"protected-static-field\",\n          \"protected-static-method\",\n          \"private-static-field\",\n          \"private-static-method\",\n          \"field\",\n          \"constructor\",\n          \"method\",\n        ],\n      },\n    ],\n    \"@typescript-eslint/no-floating-promises\": Array [\n      \"error\",\n    ],\n    \"@typescript-eslint/no-require-imports\": Array [\n      \"error\",\n    ],\n    \"@typescript-eslint/no-shadow\": Array [\n      \"error\",\n    ],\n    \"@typescript-eslint/return-await\": Array [\n      \"error\",\n    ],\n    \"array-bracket-newline\": Array [\n      \"error\",\n      \"consistent\",\n    ],\n    \"array-bracket-spacing\": Array [\n      \"error\",\n      \"never\",\n    ],\n    \"brace-style\": Array [\n      \"error\",\n      \"1tbs\",\n      Object {\n        \"allowSingleLine\": true,\n      },\n    ],\n    \"comma-dangle\": Array [\n      \"error\",\n      \"always-multiline\",\n    ],\n    \"comma-spacing\": Array [\n      \"error\",\n      Object {\n        \"after\": true,\n        \"before\": false,\n      },\n    ],\n    \"curly\": Array [\n      \"error\",\n      \"multi-line\",\n      \"consistent\",\n    ],\n    \"dot-notation\": Array [\n      \"error\",\n    ],\n    \"import/no-extraneous-dependencies\": Array [\n      \"error\",\n      Object {\n        \"devDependencies\": Array [\n          \"**/foo/**\",\n          \"**/bar/**\",\n        ],\n        \"optionalDependencies\": false,\n        \"peerDependencies\": true,\n      },\n    ],\n    \"import/no-unresolved\": Array [\n      \"error\",\n    ],\n    \"import/order\": Array [\n      \"warn\",\n      Object {\n        \"alphabetize\": Object {\n          \"caseInsensitive\": true,\n          \"order\": \"asc\",\n        },\n        \"groups\": Array [\n          \"builtin\",\n          \"external\",\n        ],\n      },\n    ],\n    \"indent\": Array [\n      \"off\",\n    ],\n    \"key-spacing\": Array [\n      \"error\",\n    ],\n    \"keyword-spacing\": Array [\n      \"error\",\n    ],\n    \"max-len\": Array [\n      \"error\",\n      Object {\n        \"code\": 150,\n        \"ignoreComments\": true,\n        \"ignoreRegExpLiterals\": true,\n        \"ignoreStrings\": true,\n        \"ignoreTemplateLiterals\": true,\n        \"ignoreUrls\": true,\n      },\n    ],\n    \"no-bitwise\": Array [\n      \"error\",\n    ],\n    \"no-duplicate-imports\": Array [\n      \"error\",\n    ],\n    \"no-multi-spaces\": Array [\n      \"error\",\n      Object {\n        \"ignoreEOLComments\": false,\n      },\n    ],\n    \"no-multiple-empty-lines\": Array [\n      \"error\",\n    ],\n    \"no-return-await\": Array [\n      \"off\",\n    ],\n    \"no-shadow\": Array [\n      \"off\",\n    ],\n    \"no-trailing-spaces\": Array [\n      \"error\",\n    ],\n    \"object-curly-newline\": Array [\n      \"error\",\n      Object {\n        \"consistent\": true,\n        \"multiline\": true,\n      },\n    ],\n    \"object-curly-spacing\": Array [\n      \"error\",\n      \"always\",\n    ],\n    \"object-property-newline\": Array [\n      \"error\",\n      Object {\n        \"allowAllPropertiesOnSameLine\": true,\n      },\n    ],\n    \"quote-props\": Array [\n      \"error\",\n      \"consistent-as-needed\",\n    ],\n    \"quotes\": Array [\n      \"error\",\n      \"single\",\n      Object {\n        \"avoidEscape\": true,\n      },\n    ],\n    \"semi\": Array [\n      \"error\",\n      \"always\",\n    ],\n    \"space-before-blocks\": Array [\n      \"error\",\n    ],\n  },\n  \"settings\": Object {\n    \"import/parsers\": Object {\n      \"@typescript-eslint/parser\": Array [\n        \".ts\",\n        \".tsx\",\n      ],\n    },\n    \"import/resolver\": Object {\n      \"node\": Object {},\n      \"typescript\": Object {\n        \"alwaysTryTypes\": true,\n        \"project\": \"./tsconfig.json\",\n      },\n    },\n  },\n}\n`;\n\nexports[`prettier snapshot 1`] = `\nObject {\n  \"env\": Object {\n    \"jest\": true,\n    \"node\": true,\n  },\n  \"extends\": Array [\n    \"plugin:import/typescript\",\n    \"prettier\",\n    \"plugin:prettier/recommended\",\n  ],\n  \"ignorePatterns\": Array [\n    \"*.js\",\n    \"!.projenrc.js\",\n    \"*.d.ts\",\n    \"node_modules/\",\n    \"*.generated.ts\",\n    \"coverage\",\n  ],\n  \"overrides\": Array [\n    Object {\n      \"files\": Array [\n        \".projenrc.js\",\n      ],\n      \"rules\": Object {\n        \"@typescript-eslint/no-require-imports\": \"off\",\n        \"import/no-extraneous-dependencies\": \"off\",\n      },\n    },\n  ],\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": Object {\n    \"ecmaVersion\": 2018,\n    \"project\": \"./tsconfig.json\",\n    \"sourceType\": \"module\",\n  },\n  \"plugins\": Array [\n    \"@typescript-eslint\",\n    \"import\",\n    \"prettier\",\n  ],\n  \"root\": true,\n  \"rules\": Object {\n    \"@typescript-eslint/member-ordering\": Array [\n      \"error\",\n      Object {\n        \"default\": Array [\n          \"public-static-field\",\n          \"public-static-method\",\n          \"protected-static-field\",\n          \"protected-static-method\",\n          \"private-static-field\",\n          \"private-static-method\",\n          \"field\",\n          \"constructor\",\n          \"method\",\n        ],\n      },\n    ],\n    \"@typescript-eslint/no-floating-promises\": Array [\n      \"error\",\n    ],\n    \"@typescript-eslint/no-require-imports\": Array [\n      \"error\",\n    ],\n    \"@typescript-eslint/no-shadow\": Array [\n      \"error\",\n    ],\n    \"@typescript-eslint/return-await\": Array [\n      \"error\",\n    ],\n    \"dot-notation\": Array [\n      \"error\",\n    ],\n    \"import/no-extraneous-dependencies\": Array [\n      \"error\",\n      Object {\n        \"devDependencies\": Array [],\n        \"optionalDependencies\": false,\n        \"peerDependencies\": true,\n      },\n    ],\n    \"import/no-unresolved\": Array [\n      \"error\",\n    ],\n    \"import/order\": Array [\n      \"warn\",\n      Object {\n        \"alphabetize\": Object {\n          \"caseInsensitive\": true,\n          \"order\": \"asc\",\n        },\n        \"groups\": Array [\n          \"builtin\",\n          \"external\",\n        ],\n      },\n    ],\n    \"key-spacing\": Array [\n      \"error\",\n    ],\n    \"no-bitwise\": Array [\n      \"error\",\n    ],\n    \"no-duplicate-imports\": Array [\n      \"error\",\n    ],\n    \"no-multiple-empty-lines\": Array [\n      \"error\",\n    ],\n    \"no-return-await\": Array [\n      \"off\",\n    ],\n    \"no-shadow\": Array [\n      \"off\",\n    ],\n    \"no-trailing-spaces\": Array [\n      \"error\",\n    ],\n    \"prettier/prettier\": Array [\n      \"error\",\n    ],\n  },\n  \"settings\": Object {\n    \"import/parsers\": Object {\n      \"@typescript-eslint/parser\": Array [\n        \".ts\",\n        \".tsx\",\n      ],\n    },\n    \"import/resolver\": Object {\n      \"node\": Object {},\n      \"typescript\": Object {\n        \"alwaysTryTypes\": true,\n        \"project\": \"./tsconfig.json\",\n      },\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "test/javascript/__snapshots__/node-package.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`all bugs field present 1`] = `\nObject {\n  \"email\": \"bugs@foobar.local\",\n  \"url\": \"bugs.foobar.local\",\n}\n`;\n\nexports[`no bugs field present 1`] = `undefined`;\n\nexports[`npm overrides 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/index.js\",\n  \"name\": \"my-project\",\n  \"overrides\": Object {\n    \"other-dep\": \"*\",\n    \"some-dep\": \"1.0.0\",\n  },\n  \"scripts\": Object {\n    \"build\": \"npx projen build\",\n    \"compile\": \"npx projen compile\",\n    \"default\": \"npx projen default\",\n    \"eject\": \"npx projen eject\",\n    \"package\": \"npx projen package\",\n    \"post-compile\": \"npx projen post-compile\",\n    \"pre-compile\": \"npx projen pre-compile\",\n    \"test\": \"npx projen test\",\n  },\n  \"version\": \"0.0.0\",\n}\n`;\n\nexports[`pnpm overrides 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/index.js\",\n  \"name\": \"my-project\",\n  \"pnpm\": Object {\n    \"overrides\": Object {\n      \"other-dep\": \"*\",\n      \"some-dep\": \"1.0.0\",\n    },\n  },\n  \"scripts\": Object {\n    \"build\": \"npx projen build\",\n    \"compile\": \"npx projen compile\",\n    \"default\": \"npx projen default\",\n    \"eject\": \"npx projen eject\",\n    \"package\": \"npx projen package\",\n    \"post-compile\": \"npx projen post-compile\",\n    \"pre-compile\": \"npx projen pre-compile\",\n    \"test\": \"npx projen test\",\n  },\n  \"version\": \"0.0.0\",\n}\n`;\n\nexports[`single bugs field present 1`] = `\nObject {\n  \"email\": \"bugs@foobar.local\",\n}\n`;\n\nexports[`yarn resolutions 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/index.js\",\n  \"name\": \"my-project\",\n  \"resolutions\": Object {\n    \"other-dep\": \"*\",\n    \"some-dep\": \"1.0.0\",\n  },\n  \"scripts\": Object {\n    \"build\": \"npx projen build\",\n    \"compile\": \"npx projen compile\",\n    \"default\": \"npx projen default\",\n    \"eject\": \"npx projen eject\",\n    \"package\": \"npx projen package\",\n    \"post-compile\": \"npx projen post-compile\",\n    \"pre-compile\": \"npx projen pre-compile\",\n    \"test\": \"npx projen test\",\n  },\n  \"version\": \"0.0.0\",\n}\n`;\n"
  },
  {
    "path": "test/javascript/__snapshots__/node-project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`deps upgrade commit can be signed 1`] = `\nObject {\n  \"if\": \"\\${{ needs.upgrade.outputs.patch_created }}\",\n  \"name\": \"Create Pull Request\",\n  \"needs\": \"upgrade\",\n  \"permissions\": Object {\n    \"contents\": \"write\",\n    \"pull-requests\": \"write\",\n  },\n  \"runs-on\": \"ubuntu-latest\",\n  \"steps\": Array [\n    Object {\n      \"name\": \"Checkout\",\n      \"uses\": \"actions/checkout@v3\",\n      \"with\": Object {\n        \"ref\": \"main\",\n        \"token\": \"\\${{ secrets.PROJEN_GITHUB_TOKEN }}\",\n      },\n    },\n    Object {\n      \"name\": \"Download patch\",\n      \"uses\": \"actions/download-artifact@v3\",\n      \"with\": Object {\n        \"name\": \".repo.patch\",\n        \"path\": \"\\${{ runner.temp }}\",\n      },\n    },\n    Object {\n      \"name\": \"Apply patch\",\n      \"run\": \"[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"\",\n    },\n    Object {\n      \"name\": \"Set git identity\",\n      \"run\": \"git config user.name \\\\\"github-actions\\\\\"\ngit config user.email \\\\\"github-actions@github.com\\\\\"\",\n    },\n    Object {\n      \"id\": \"create-pr\",\n      \"name\": \"Create Pull Request\",\n      \"uses\": \"peter-evans/create-pull-request@v3\",\n      \"with\": Object {\n        \"author\": \"github-actions <github-actions@github.com>\",\n        \"body\": \"Upgrades project dependencies. See details in [workflow run].\n\n[Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n------\n\n*Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\",\n        \"branch\": \"github-actions/upgrade-main\",\n        \"commit-message\": \"chore(deps): upgrade dependencies\n\nUpgrades project dependencies. See details in [workflow run].\n\n[Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n------\n\n*Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\",\n        \"committer\": \"github-actions <github-actions@github.com>\",\n        \"signoff\": true,\n        \"title\": \"chore(deps): upgrade dependencies\",\n        \"token\": \"\\${{ secrets.PROJEN_GITHUB_TOKEN }}\",\n      },\n    },\n  ],\n}\n`;\n\nexports[`disabling mutableBuild will skip pushing changes to PR branches 1`] = `\nArray [\n  Object {\n    \"name\": \"Checkout\",\n    \"uses\": \"actions/checkout@v3\",\n    \"with\": Object {\n      \"ref\": \"\\${{ github.event.pull_request.head.ref }}\",\n      \"repository\": \"\\${{ github.event.pull_request.head.repo.full_name }}\",\n    },\n  },\n  Object {\n    \"name\": \"Install dependencies\",\n    \"run\": \"yarn install --check-files --frozen-lockfile\",\n  },\n  Object {\n    \"name\": \"build\",\n    \"run\": \"npx projen build\",\n  },\n  Object {\n    \"id\": \"self_mutation\",\n    \"name\": \"Find mutations\",\n    \"run\": \"git add .\ngit diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\",\n  },\n  Object {\n    \"if\": \"steps.self_mutation.outputs.self_mutation_happened\",\n    \"name\": \"Upload patch\",\n    \"uses\": \"actions/upload-artifact@v2\",\n    \"with\": Object {\n      \"name\": \".repo.patch\",\n      \"path\": \".repo.patch\",\n    },\n  },\n  Object {\n    \"if\": \"steps.self_mutation.outputs.self_mutation_happened\",\n    \"name\": \"Fail build on mutation\",\n    \"run\": \"echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\ncat .repo.patch\nexit 1\",\n  },\n]\n`;\n\nexports[`enabling renovatebot does not overturn mergify: false 1`] = `\n\"{\n  \\\\\"schedule\\\\\": [\n    \\\\\"at any time\\\\\"\n  ],\n  \\\\\"extends\\\\\": [\n    \\\\\":preserveSemverRanges\\\\\",\n    \\\\\"config:base\\\\\",\n    \\\\\"group:allNonMajor\\\\\",\n    \\\\\"group:recommended\\\\\",\n    \\\\\"group:monorepos\\\\\"\n  ],\n  \\\\\"packageRules\\\\\": [\n    {\n      \\\\\"matchDepTypes\\\\\": [\n        \\\\\"devDependencies\\\\\"\n      ],\n      \\\\\"matchUpdateTypes\\\\\": [\n        \\\\\"patch\\\\\",\n        \\\\\"minor\\\\\"\n      ],\n      \\\\\"groupName\\\\\": \\\\\"devDependencies (non-major)\\\\\"\n    }\n  ],\n  \\\\\"ignoreDeps\\\\\": [\n    \\\\\"jest-junit\\\\\",\n    \\\\\"npm-check-updates\\\\\",\n    \\\\\"standard-version\\\\\",\n    \\\\\"projen\\\\\"\n  ]\n// ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n}\n\"\n`;\n\nexports[`mutableBuild will push changes to PR branches 1`] = `\nArray [\n  Object {\n    \"name\": \"Checkout\",\n    \"uses\": \"actions/checkout@v3\",\n    \"with\": Object {\n      \"ref\": \"\\${{ github.event.pull_request.head.ref }}\",\n      \"repository\": \"\\${{ github.event.pull_request.head.repo.full_name }}\",\n    },\n  },\n  Object {\n    \"name\": \"Install dependencies\",\n    \"run\": \"yarn install --check-files\",\n  },\n  Object {\n    \"name\": \"build\",\n    \"run\": \"npx projen build\",\n  },\n  Object {\n    \"id\": \"self_mutation\",\n    \"name\": \"Find mutations\",\n    \"run\": \"git add .\ngit diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\",\n  },\n  Object {\n    \"if\": \"steps.self_mutation.outputs.self_mutation_happened\",\n    \"name\": \"Upload patch\",\n    \"uses\": \"actions/upload-artifact@v2\",\n    \"with\": Object {\n      \"name\": \".repo.patch\",\n      \"path\": \".repo.patch\",\n    },\n  },\n  Object {\n    \"if\": \"steps.self_mutation.outputs.self_mutation_happened\",\n    \"name\": \"Fail build on mutation\",\n    \"run\": \"echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\ncat .repo.patch\nexit 1\",\n  },\n]\n`;\n\nexports[`mutableBuild will push changes to PR branches 2`] = `\nArray [\n  Object {\n    \"name\": \"Checkout\",\n    \"uses\": \"actions/checkout@v3\",\n    \"with\": Object {\n      \"ref\": \"\\${{ github.event.pull_request.head.ref }}\",\n      \"repository\": \"\\${{ github.event.pull_request.head.repo.full_name }}\",\n      \"token\": \"\\${{ secrets.PROJEN_GITHUB_TOKEN }}\",\n    },\n  },\n  Object {\n    \"name\": \"Download patch\",\n    \"uses\": \"actions/download-artifact@v3\",\n    \"with\": Object {\n      \"name\": \".repo.patch\",\n      \"path\": \"\\${{ runner.temp }}\",\n    },\n  },\n  Object {\n    \"name\": \"Apply patch\",\n    \"run\": \"[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"\",\n  },\n  Object {\n    \"name\": \"Set git identity\",\n    \"run\": \"git config user.name \\\\\"github-actions\\\\\"\ngit config user.email \\\\\"github-actions@github.com\\\\\"\",\n  },\n  Object {\n    \"name\": \"Push changes\",\n    \"run\": \"  git add .\n  git commit -s -m \\\\\"chore: self mutation\\\\\"\n  git push origin HEAD:\\${{ github.event.pull_request.head.ref }}\",\n  },\n]\n`;\n\nexports[`node project can be ejected 1`] = `\nObject {\n  \"devDependencies\": Object {\n    \"jest\": \"*\",\n    \"jest-junit\": \"^13\",\n    \"npm-check-updates\": \"^15\",\n    \"standard-version\": \"^9\",\n    \"test\": \"*\",\n  },\n  \"jest\": Object {\n    \"clearMocks\": true,\n    \"collectCoverage\": true,\n    \"coverageDirectory\": \"coverage\",\n    \"coveragePathIgnorePatterns\": Array [\n      \"/node_modules/\",\n    ],\n    \"coverageReporters\": Array [\n      \"json\",\n      \"lcov\",\n      \"clover\",\n      \"cobertura\",\n      \"text\",\n    ],\n    \"reporters\": Array [\n      \"default\",\n      Array [\n        \"jest-junit\",\n        Object {\n          \"outputDirectory\": \"test-reports\",\n        },\n      ],\n    ],\n    \"testMatch\": Array [\n      \"**/__tests__/**/*.[jt]s?(x)\",\n      \"**/?(*.)+(spec|test).[tj]s?(x)\",\n    ],\n    \"testPathIgnorePatterns\": Array [\n      \"/node_modules/\",\n    ],\n    \"watchPathIgnorePatterns\": Array [\n      \"/node_modules/\",\n    ],\n  },\n  \"license\": \"Apache-2.0\",\n  \"main\": \"lib/index.js\",\n  \"name\": \"test-node-project\",\n  \"scripts\": Object {\n    \"build\": \"scripts/run-task build\",\n    \"bump\": \"scripts/run-task bump\",\n    \"clobber\": \"scripts/run-task clobber\",\n    \"compile\": \"scripts/run-task compile\",\n    \"package\": \"scripts/run-task package\",\n    \"post-compile\": \"scripts/run-task post-compile\",\n    \"post-upgrade\": \"scripts/run-task post-upgrade\",\n    \"pre-compile\": \"scripts/run-task pre-compile\",\n    \"release\": \"scripts/run-task release\",\n    \"test\": \"scripts/run-task test\",\n    \"test:update\": \"scripts/run-task test:update\",\n    \"test:watch\": \"scripts/run-task test:watch\",\n    \"unbump\": \"scripts/run-task unbump\",\n    \"upgrade\": \"scripts/run-task upgrade\",\n  },\n  \"version\": \"0.0.0\",\n}\n`;\n"
  },
  {
    "path": "test/javascript/__snapshots__/npm-config.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`default registry is used correctly 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n@company:registry=https://my.registry.com/private\n\"\n`;\n\nexports[`generic prop is set correctly 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nkey=value\n\"\n`;\n\nexports[`override default registry via setter 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nregistry=https://my.registry.com/mirror2\n@company:registry=https://my.registry.com/private\n\"\n`;\n\nexports[`registry is handled correctly 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nregistry=https://my.registry.com/mirror\n@company:registry=https://my.registry.com/private\n\"\n`;\n"
  },
  {
    "path": "test/javascript/__snapshots__/prettier.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`prettier snapshot 1`] = `\nObject {\n  \"overrides\": Array [],\n  \"printWidth\": 140,\n}\n`;\n\nexports[`prettier snapshot with ignore 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nbuild\n\"\n`;\n\nexports[`prettier snapshot with ignore 2`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nsrc/example.ts\n\"\n`;\n"
  },
  {
    "path": "test/javascript/__snapshots__/upgrade-dependencies.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`branches default to release branches 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`branches default to release branches 2`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-branch1\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: branch1\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: branch1\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch1\\\\\" workflow*\n          branch: github-actions/upgrade-branch1\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch1\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`branches default to release branches 3`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-branch2\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: branch2\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: branch2\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch2\\\\\" workflow*\n          branch: github-actions/upgrade-branch2\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch2\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`can upgrade multiple branches 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-branch1\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: branch1\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: branch1\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch1\\\\\" workflow*\n          branch: github-actions/upgrade-branch1\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch1\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`can upgrade multiple branches 2`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-branch2\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: branch2\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: branch2\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch2\\\\\" workflow*\n          branch: github-actions/upgrade-branch2\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch2\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`considers branches added post project instantiation 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`considers branches added post project instantiation 2`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-branch1\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: branch1\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: branch1\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch1\\\\\" workflow*\n          branch: github-actions/upgrade-branch1\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch1\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`considers branches added post project instantiation 3`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-branch2\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: branch2\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: branch2\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch2\\\\\" workflow*\n          branch: github-actions/upgrade-branch2\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-branch2\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`custom options 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 1 * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`default options 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`disables automatic upgrades 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n\nexports[`with a GitHub app for authentication 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 1 * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Generate token\n        id: generate_token\n        uses: tibdex/github-app-token@7ce9ffdcdeb2ba82b01b51d6584a6a85872336d4\n        with:\n          app_id: \\${{ secrets.PROJEN_APP_ID }}\n          private_key: \\${{ secrets.PROJEN_APP_PRIVATE_KEY }}\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ steps.generate_token.outputs.token }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ steps.generate_token.outputs.token }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\"\n`;\n"
  },
  {
    "path": "test/javascript/bundler.test.ts",
    "content": "import { Bundler, NodeProject } from \"../../src/javascript\";\nimport { renderBundleName } from \"../../src/javascript/util\";\nimport { Testing } from \"../../src/testing\";\n\ntest(\"node projects have a bundler\", () => {\n  const p = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  expect(Bundler.of(p)).not.toBeUndefined();\n  expect(p.bundler).toEqual(Bundler.of(p));\n  expect(p.deps.all.find((d) => d.name === \"esbuild\")).toBeUndefined(); // no \"esbuild\" dependency\n});\n\ntest(\"There is no bundle task by default\", () => {\n  const p = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  expect(p.tasks.tryFind(\"bundle\")).toBeUndefined();\n});\n\ntest(\"bundler.addBundle() defines a bundle\", () => {\n  const p = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  const hello = p.bundler.addBundle(\"./src/hello.ts\", {\n    platform: \"node\",\n    target: \"node12\",\n  });\n\n  const world = p.bundler.addBundle(\"./src/foo/world.ts\", {\n    platform: \"node\",\n    target: \"node14\",\n    externals: [\"aws-sdk\", \"request\"],\n    sourcemap: true,\n  });\n\n  // THEN\n  const snapshot = Testing.synth(p);\n  const tasks = snapshot[\".projen/tasks.json\"].tasks;\n\n  expect(hello.outfile).toStrictEqual(\"assets/hello/index.js\");\n  expect(world.outfile).toStrictEqual(\"assets/foo/world/index.js\");\n\n  // aggregated \"bundle\" task spawns all bundle tasks\n  expect(tasks.bundle).toStrictEqual({\n    description: \"Prepare assets\",\n    name: \"bundle\",\n    steps: [{ spawn: \"bundle:hello\" }, { spawn: \"bundle:foo/world\" }],\n  });\n\n  // \"compile\" task spawns the aggregate \"bundle\" task\n  expect(tasks[\"pre-compile\"].steps).toStrictEqual([\n    {\n      spawn: \"bundle\",\n    },\n  ]);\n\n  expect(tasks[\"bundle:hello\"]).toStrictEqual({\n    description: \"Create a JavaScript bundle from ./src/hello.ts\",\n    name: \"bundle:hello\",\n    steps: [\n      {\n        exec: 'esbuild --bundle ./src/hello.ts --target=\"node12\" --platform=\"node\" --outfile=\"assets/hello/index.js\"',\n      },\n    ],\n  });\n\n  expect(tasks[\"bundle:foo/world\"]).toStrictEqual({\n    description: \"Create a JavaScript bundle from ./src/foo/world.ts\",\n    name: \"bundle:foo/world\",\n    steps: [\n      {\n        exec: 'esbuild --bundle ./src/foo/world.ts --target=\"node14\" --platform=\"node\" --outfile=\"assets/foo/world/index.js\" --external:aws-sdk --external:request --sourcemap',\n      },\n    ],\n  });\n});\n\ntest(\"no specific esbuild version by default\", () => {\n  const p = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  p.bundler.addBundle(\"./src/index.ts\", {\n    platform: \"node\",\n    target: \"node12\",\n  });\n\n  const snapshot = Testing.synth(p);\n  const deps = snapshot[\".projen/deps.json\"].dependencies;\n\n  expect(deps.find((d: any) => d.name === \"esbuild\")).toStrictEqual({\n    name: \"esbuild\",\n    type: \"build\",\n  });\n});\n\ntest('esbuildVersion can be used to specify version requirement for \"esbuild\"', () => {\n  const p = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    bundlerOptions: {\n      esbuildVersion: \"^3\",\n    },\n  });\n\n  p.bundler.addBundle(\"./src/index.ts\", {\n    platform: \"node\",\n    target: \"node12\",\n  });\n\n  const snapshot = Testing.synth(p);\n  const deps = snapshot[\".projen/deps.json\"].dependencies;\n\n  expect(deps.find((d: any) => d.name === \"esbuild\")).toStrictEqual({\n    name: \"esbuild\",\n    type: \"build\",\n    version: \"^3\",\n  });\n});\n\ntest(\"sourcemaps can be disabled\", () => {\n  const p = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  p.bundler.addBundle(\"./src/hello.ts\", {\n    platform: \"node\",\n    target: \"node12\",\n    sourcemap: false,\n  });\n\n  const snapshot = Testing.synth(p);\n  const tasks = snapshot[\".projen/tasks.json\"].tasks;\n\n  expect(tasks[\"bundle:hello\"]).toStrictEqual({\n    description: \"Create a JavaScript bundle from ./src/hello.ts\",\n    name: \"bundle:hello\",\n    steps: [\n      {\n        exec: 'esbuild --bundle ./src/hello.ts --target=\"node12\" --platform=\"node\" --outfile=\"assets/hello/index.js\"',\n      },\n    ],\n  });\n});\n\ndescribe(\"bundle:watch\", () => {\n  test(\"a bundle:xyz:watch task is added by default\", () => {\n    const p = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"main\",\n    });\n\n    p.bundler.addBundle(\"./src/hello.ts\", {\n      platform: \"node\",\n      target: \"node12\",\n    });\n\n    const snapshot = Testing.synth(p);\n    const tasks = snapshot[\".projen/tasks.json\"].tasks;\n\n    expect(tasks[\"bundle:hello:watch\"]).toStrictEqual({\n      description:\n        \"Continuously update the JavaScript bundle from ./src/hello.ts\",\n      name: \"bundle:hello:watch\",\n      steps: [\n        {\n          exec: 'esbuild --bundle ./src/hello.ts --target=\"node12\" --platform=\"node\" --outfile=\"assets/hello/index.js\" --watch',\n        },\n      ],\n    });\n  });\n\n  test(\"watch can be disabled\", () => {\n    const p = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"main\",\n    });\n\n    p.bundler.addBundle(\"./src/index.ts\", {\n      platform: \"node\",\n      target: \"node12\",\n      watchTask: false,\n    });\n\n    const snapshot = Testing.synth(p);\n    const tasks = snapshot[\".projen/tasks.json\"].tasks;\n\n    expect(tasks[\"bundle:hello:watch\"]).toBeUndefined();\n  });\n});\n\ntest(\"bundledir controls the root output directory\", () => {\n  const p = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    bundlerOptions: {\n      assetsDir: \"resources\",\n    },\n  });\n\n  const bundle = p.bundler.addBundle(\"./src/hello.ts\", {\n    platform: \"node\",\n    target: \"node12\",\n    watchTask: false,\n  });\n\n  expect(bundle.outfile).toStrictEqual(\"resources/hello/index.js\");\n});\n\ntest(\"renderBundleName\", () => {\n  expect(renderBundleName(\"src/foo.lambda.ts\")).toBe(\"foo.lambda\");\n  expect(renderBundleName(\"nosrc/foo.lambda.ts\")).toBe(\"nosrc/foo.lambda\");\n  expect(renderBundleName(\"src/bar/foo.lambda.ts\")).toBe(\"bar/foo.lambda\");\n});\n"
  },
  {
    "path": "test/javascript/eslint.test.ts",
    "content": "import { Eslint, NodeProject } from \"../../src/javascript\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"devdirs\", () => {\n  // GIVEN\n  const project = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"master\",\n  });\n\n  // WHEN\n  new Eslint(project, {\n    devdirs: [\"foo\", \"bar\"],\n    dirs: [\"mysrc\"],\n  });\n\n  // THEN\n  expect(synthSnapshot(project)[\".eslintrc.json\"]).toMatchSnapshot();\n});\n\ndescribe(\"prettier\", () => {\n  test(\"snapshot\", () => {\n    // GIVEN\n    const project = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"master\",\n    });\n\n    // WHEN\n    new Eslint(project, {\n      dirs: [\"mysrc\"],\n      prettier: true,\n    });\n\n    // THEN\n    expect(synthSnapshot(project)[\".eslintrc.json\"]).toMatchSnapshot();\n  });\n\n  test(\"error on formatting when enabled\", () => {\n    // GIVEN\n    const project = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"master\",\n    });\n\n    // WHEN\n    new Eslint(project, {\n      dirs: [\"mysrc\"],\n      prettier: true,\n    });\n\n    // THEN\n    const output = synthSnapshot(project);\n    expect(output[\".eslintrc.json\"].rules).toHaveProperty(\"prettier/prettier\", [\n      \"error\",\n    ]);\n  });\n});\n\ndescribe(\"alias\", () => {\n  test(\"custom config\", () => {\n    // GIVEN\n    const project = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"master\",\n    });\n\n    // WHEN\n    const eslint = new Eslint(project, {\n      dirs: [\"mysrc\"],\n      aliasMap: {\n        \"@src\": \"./src\",\n        \"@foo\": \"./src/foo\",\n      },\n      aliasExtensions: [\".ts\", \".js\"],\n    });\n\n    // THEN\n    expect(eslint.config.settings[\"import/resolver\"].alias).toHaveProperty(\n      \"map\",\n      [\n        [\"@src\", \"./src\"],\n        [\"@foo\", \"./src/foo\"],\n      ]\n    );\n    expect(eslint.config.settings[\"import/resolver\"].alias).toHaveProperty(\n      \"extensions\",\n      [\".ts\", \".js\"]\n    );\n  });\n});\n\ntest(\"tsAlwaysTryTypes\", () => {\n  // GIVEN\n  const project = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"master\",\n  });\n\n  // WHEN\n  const eslint = new Eslint(project, {\n    dirs: [\"mysrc\"],\n    tsAlwaysTryTypes: true,\n  });\n\n  // THEN\n  expect(eslint.config.settings[\"import/resolver\"].typescript).toHaveProperty(\n    \"alwaysTryTypes\",\n    true\n  );\n});\n\ntest(\"if the prettier is configured, eslint is configured accordingly\", () => {\n  // GIVEN\n  const project = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"master\",\n    prettier: true,\n  });\n\n  // WHEN\n  new Eslint(project, {\n    dirs: [\"src\"],\n  });\n\n  // THEN\n  const output = synthSnapshot(project);\n  expect(output[\".eslintrc.json\"].rules).toMatchObject({\n    \"prettier/prettier\": [\"error\"],\n  });\n});\n\ntest(\"can output yml instead of json\", () => {\n  // GIVEN\n  const project = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    prettier: true,\n  });\n\n  // WHEN\n  new Eslint(project, {\n    dirs: [\"src\"],\n    yaml: true,\n  });\n\n  // THEN\n  const output = synthSnapshot(project);\n  expect(output[\".eslintrc.yml\"]).toBeDefined();\n  expect(output[\".eslintrc.json\"]).toBeUndefined();\n});\n\ntest(\"can override the parser\", () => {\n  // GIVEN\n  const project = new NodeProject({\n    name: \"test\",\n    defaultReleaseBranch: \"master\",\n    prettier: true,\n  });\n\n  // WHEN\n  const eslint = new Eslint(project, {\n    dirs: [\"src\"],\n  });\n  eslint.addOverride({\n    files: [\"*.json\", \"*.json5\", \"*.jsonc\"],\n    parser: \"jsonc-eslint-parser\",\n  });\n  const output = synthSnapshot(project);\n\n  // THEN\n  expect(output[\".eslintrc.json\"].overrides).toContainEqual({\n    files: [\"*.json\", \"*.json5\", \"*.jsonc\"],\n    parser: \"jsonc-eslint-parser\",\n  });\n});\n"
  },
  {
    "path": "test/javascript/jest.test.ts",
    "content": "import { PROJEN_RC } from \"../../src/common\";\nimport { NodeProject, Jest } from \"../../src/javascript\";\nimport * as logging from \"../../src/logging\";\nimport { TypeScriptProject } from \"../../src/typescript\";\nimport { mkdtemp, synthSnapshot } from \"../util\";\n\nlogging.disable();\n\nconst compilerOptionDefaults = {\n  alwaysStrict: true,\n  declaration: true,\n  esModuleInterop: true,\n  experimentalDecorators: true,\n  inlineSourceMap: true,\n  inlineSources: true,\n  lib: [\"es2019\"],\n  module: \"CommonJS\",\n  noEmitOnError: false,\n  noFallthroughCasesInSwitch: true,\n  noImplicitAny: true,\n  noImplicitReturns: true,\n  noImplicitThis: true,\n  noUnusedLocals: true,\n  noUnusedParameters: true,\n  resolveJsonModule: true,\n  strict: true,\n  strictNullChecks: true,\n  strictPropertyInitialization: true,\n  stripInternal: true,\n  target: \"ES2019\",\n};\n\ntest(\"Node Project Jest Defaults Configured\", () => {\n  const project = new NodeProject({\n    name: \"test-node-project\",\n    mergify: false,\n    projenDevDependency: false,\n    defaultReleaseBranch: \"master\",\n    jest: true,\n  });\n\n  expect(project.jest?.config).toBeTruthy();\n  expect(project.jest?.config.clearMocks).toEqual(true);\n  expect(project.jest?.config.collectCoverage).toEqual(true);\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\"package.json\"].jest).toBeTruthy();\n\n  const jest = snapshot[\"package.json\"].jest;\n  expect(jest.clearMocks).toEqual(true);\n  expect(jest.collectCoverage).toEqual(true);\n  expect(jest.coverageDirectory).toEqual(\"coverage\");\n});\n\ntest(\"Node Project Jest With Options Configured\", () => {\n  const project = new NodeProject({\n    name: \"test-node-project\",\n    defaultReleaseBranch: \"master\",\n    mergify: false,\n    projenDevDependency: false,\n    jest: true,\n    jestOptions: {\n      jestConfig: {\n        automock: true,\n        bail: 5,\n        notify: false,\n        maxWorkers: 1,\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\"package.json\"].jest).toBeTruthy();\n\n  const jest = snapshot[\"package.json\"].jest;\n  expect(jest.automock).toEqual(true);\n  expect(jest.bail).toEqual(5);\n  expect(jest.notify).toEqual(false);\n  expect(jest.maxWorkers).toEqual(1);\n});\n\ntest(\"Node Project Jest With Path Configured\", () => {\n  const project = new NodeProject({\n    name: \"test-node-project\",\n    defaultReleaseBranch: \"master\",\n    mergify: false,\n    projenDevDependency: false,\n    jest: true,\n    jestOptions: {\n      configFilePath: \"jest.config.json\",\n      jestConfig: {\n        automock: true,\n        bail: 5,\n        notify: false,\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\"package.json\"].jest).toBeUndefined();\n\n  const jest = snapshot[\"jest.config.json\"];\n  expect(jest.automock).toEqual(true);\n  expect(jest.bail).toEqual(5);\n  expect(jest.notify).toEqual(false);\n});\n\ntest(\"Typescript Project Jest Defaults Configured\", () => {\n  // WHEN\n  const project = new TypeScriptProject({\n    name: \"test-typescript-project\",\n    defaultReleaseBranch: \"master\",\n    mergify: false,\n    projenDevDependency: false,\n    jest: true,\n  });\n\n  const snapshot = synthSnapshot(project);\n  const jestTypescriptConfig = snapshot[\"tsconfig.dev.json\"];\n\n  expect(jestTypescriptConfig.compilerOptions).toBeTruthy();\n  expect(jestTypescriptConfig.compilerOptions).toStrictEqual(\n    compilerOptionDefaults\n  );\n  expect(jestTypescriptConfig.include).toEqual([\n    PROJEN_RC,\n    \"src/**/*.ts\",\n    \"test/**/*.ts\",\n  ]);\n  expect(jestTypescriptConfig.exclude).toEqual([\"node_modules\"]);\n});\n\ntest(\"Typescript Project Jest With Compiler Options\", () => {\n  const compilerOptions = {\n    esModuleInterop: false,\n    noImplicitAny: false,\n  };\n\n  const project = new TypeScriptProject({\n    name: \"test-typescript-project\",\n    defaultReleaseBranch: \"master\",\n    mergify: false,\n    projenDevDependency: false,\n    jest: true,\n    tsconfigDev: {\n      compilerOptions,\n    },\n  });\n\n  const mergedCompilerOptions = {\n    ...compilerOptionDefaults,\n    ...compilerOptions,\n  };\n\n  const snapshot = synthSnapshot(project);\n  const jestTypescriptConfig = snapshot[\"tsconfig.dev.json\"];\n\n  expect(jestTypescriptConfig.compilerOptions).toBeTruthy();\n  expect(jestTypescriptConfig.compilerOptions).toStrictEqual(\n    mergedCompilerOptions\n  );\n});\n\ntest(\"jestOptions.typeScriptCompilerOptions is deprecated\", () => {\n  expect(\n    () =>\n      new TypeScriptProject({\n        name: \"test-typescript-project\",\n        defaultReleaseBranch: \"master\",\n        mergify: false,\n        projenDevDependency: false,\n        jestOptions: {\n          typescriptConfig: {\n            esModuleInterop: false,\n            noImplicitAny: false,\n          },\n        } as any,\n      })\n  ).toThrow(\n    '\"jestOptions.typescriptConfig\" is deprecated. Use \"typescriptProject.tsconfigDev\" instead'\n  );\n});\n\ntest(\"testdir is under src\", () => {\n  // WHEN\n  const project = new TypeScriptProject({\n    defaultReleaseBranch: \"master\",\n    name: \"test-typescript-project\",\n    srcdir: \"mysrc\",\n    testdir: \"mysrc/boom/bam/__tests\",\n  });\n\n  // THEN\n  const files = synthSnapshot(project);\n  expect(files[\"package.json\"].jest.testMatch).toStrictEqual([\n    \"**/lib/boom/bam/__tests/**/?(*.)+(spec|test).js?(x)\",\n  ]);\n});\n\ntest(\"addTestMatch() can be used to add patterns\", () => {\n  // GIVEN\n  const project = new NodeProject({\n    outdir: mkdtemp(),\n    defaultReleaseBranch: \"master\",\n    name: \"test\",\n  });\n  const jest = new Jest(project, { jestConfig: { testMatch: [] } });\n\n  // WHEN\n  jest.addTestMatch(\"foo/**\");\n  jest.addTestMatch(\"bar/baz/**\");\n\n  // THEN\n  expect(synthSnapshot(project)[\"package.json\"].jest.testMatch).toStrictEqual([\n    \"foo/**\",\n    \"bar/baz/**\",\n  ]);\n});\n\ntest(\"can set extra CLI options\", () => {\n  // GIVEN\n  const project = new NodeProject({\n    outdir: mkdtemp(),\n    defaultReleaseBranch: \"master\",\n    name: \"test\",\n  });\n\n  // WHEN\n  new Jest(project, {\n    extraCliOptions: [\"--json\", \"--outputFile=jest-report.json\"],\n  });\n\n  // THEN\n  const clFragments = project.testTask.steps.pop()?.exec?.split(\" \");\n  expect(clFragments).toContain(\"--json\");\n  expect(clFragments).toContain(\"--outputFile=jest-report.json\");\n});\n"
  },
  {
    "path": "test/javascript/node-package.test.ts",
    "content": "import { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { readJsonSync } from \"fs-extra\";\nimport semver from \"semver\";\nimport * as YAML from \"yaml\";\nimport { Project } from \"../../src\";\nimport {\n  NodePackage,\n  NodePackageManager,\n} from \"../../src/javascript/node-package\";\nimport { minVersion } from \"../../src/javascript/util\";\nimport * as util from \"../../src/util\";\nimport { mkdtemp, synthSnapshot, TestProject } from \"../util\";\n\n/**\n * Mocks a yarn install, writing to yarn.lock\n * and creating package.json files in node_modules for all dependencies\n * Will \"install\" the max version that complies with all dependency ranges\n * NOT A PERFECT MODEL OF YARN. JUST CLOSE ENOUGH.\n * @param outdir Test project's outdir, where package.json and node_modules live\n * @param latestPackages Package name and version to \"install\" for \"*\" deps\n */\nfunction mockYarnInstall(\n  outdir: string,\n  latestPackages: Record<string, string>\n) {\n  const pkgJson = readJsonSync(join(outdir, \"package.json\"));\n  const yarnLock: Record<string, string> = {};\n  const depRanges: Record<string, string[]> = {};\n  const depVersions: Record<string, string[]> = {};\n  const depTypes = [\n    \"dependencies\",\n    \"devDependencies\",\n    \"peerDependencies\",\n    \"bundledDependencies\",\n    \"optionalDependencies\",\n  ];\n  for (const depType of depTypes) {\n    // Look up the ranges for each dependency\n    for (const [depName, depVer] of Object.entries(pkgJson[depType] ?? {})) {\n      // init arrays if undefined\n      depRanges[depName] = depRanges[depName] ?? [];\n      depVersions[depName] = depVersions[depName] ?? [];\n      if (depVer === \"*\") {\n        if (!latestPackages[depName]) {\n          throw new Error(\n            `No latest package defined for dependency ${depName}`\n          );\n        }\n        depRanges[depName].push(\"*\");\n        depVersions[depName].push(latestPackages[depName]);\n      } else {\n        const ver = minVersion(`${depVer}`);\n        if (!ver) {\n          throw new Error(\n            `unable to determine min version for ${depName}@${depVer}`\n          );\n        }\n        // If we're given a latest package, no dependency can require higher\n        if (\n          latestPackages[depName] &&\n          semver.validRange(`${ver}`) &&\n          semver.gt(`${ver}`, latestPackages[depName])\n        ) {\n          throw new Error(\n            `${depType} requirement ${depName}@${depVer} exceeds provided \"latest\" version ${latestPackages[depName]}`\n          );\n        }\n        depRanges[depName].push(`${depVer}`);\n        // Also take the min version as a valid install version\n        depVersions[depName].push(ver);\n      }\n    }\n  }\n  // Resolve version to install that satisfies all ranges for dep\n  for (const dep of Object.keys(depRanges)) {\n    let installVersion: string | null;\n    if (!semver.validRange(depVersions[dep][0])) {\n      // if a dependency is \"file:...\" or something else, just install that\n      installVersion = depVersions[dep][0];\n    } else {\n      installVersion = semver.maxSatisfying(\n        depVersions[dep],\n        depRanges[dep].join(\" || \")\n      );\n    }\n    if (!installVersion) {\n      throw new Error(`No version given satisfies all constraints on ${dep}`);\n    }\n    mkdirSync(join(outdir, `node_modules/${dep}`), { recursive: true });\n    writeFileSync(\n      join(outdir, `node_modules/${dep}/package.json`),\n      JSON.stringify({\n        name: `${dep}`,\n        version: `${installVersion}`,\n      })\n    );\n    // Not accurate to yaml.lock v1 format, but close enough.\n    yarnLock[\n      `${depRanges[dep].map((range) => `${dep}@${range}`).join(\", \")}`\n    ] = `version \"${installVersion}\"`;\n  }\n  // Use double quoted keys just to make output more predictable\n  writeFileSync(\n    join(outdir, \"yarn.lock\"),\n    YAML.stringify(yarnLock, { defaultKeyType: \"QUOTE_DOUBLE\" })\n  );\n}\n\nafterEach(() => {\n  jest.resetAllMocks();\n  jest.restoreAllMocks();\n});\n\ntest(\"all bugs field present\", () => {\n  const project = new TestProject();\n\n  new NodePackage(project, {\n    bugsEmail: \"bugs@foobar.local\",\n    bugsUrl: \"bugs.foobar.local\",\n  });\n\n  expect(synthSnapshot(project)[\"package.json\"].bugs).toMatchSnapshot();\n});\n\ntest(\"no bugs field present\", () => {\n  const project = new TestProject();\n\n  new NodePackage(project, {});\n\n  const snps = synthSnapshot(project);\n\n  expect(snps[\"package.json\"].bugs).toMatchSnapshot();\n\n  expect(snps[\"package.json\"].bugs).toStrictEqual(undefined);\n});\n\ntest(\"single bugs field present\", () => {\n  const project = new TestProject();\n\n  const _email = \"bugs@foobar.local\";\n\n  new NodePackage(project, {\n    bugsEmail: _email,\n  });\n\n  const snps = synthSnapshot(project);\n\n  expect(snps[\"package.json\"].bugs).toMatchSnapshot();\n\n  expect(snps[\"package.json\"].bugs.url).toStrictEqual(undefined);\n  expect(snps[\"package.json\"].bugs.email).toStrictEqual(_email);\n});\n\ntest('lockfile updated (install twice) after \"*\"s are resolved', () => {\n  const execMock = jest\n    .spyOn(util, \"exec\")\n    .mockImplementation((command, options) => {\n      expect(command.startsWith(\"yarn install\")).toBeTruthy();\n      mockYarnInstall(options.cwd, { ms: \"2.1.3\" });\n    });\n\n  const project = new Project({ name: \"test\" });\n  const pkg = new NodePackage(project);\n\n  pkg.addDeps(\"ms\");\n\n  project.synth();\n\n  const yarnLockPath = join(project.outdir, \"yarn.lock\");\n  const yarnLock: string | undefined = readFileSync(yarnLockPath, \"utf8\");\n\n  expect(yarnLock).toStrictEqual('\"ms@^2.1.3\": version \"2.1.3\"\\n');\n  expect(execMock).toBeCalledTimes(2);\n});\n\ntest(\"install only once if all versions are resolved\", () => {\n  const execMock = jest.spyOn(util, \"exec\").mockReturnValueOnce();\n  const project = new Project({ name: \"test\" });\n  const pkg = new NodePackage(project);\n\n  pkg.addDeps(\"ms@^2\");\n\n  project.synth();\n\n  expect(execMock).toBeCalledTimes(1);\n});\n\ntest(\"no install if package.json did not change at all\", () => {\n  const execMock = jest.spyOn(util, \"exec\").mockReturnValueOnce();\n  const outdir = mkdtemp({ cleanup: false });\n\n  const orig = {\n    name: \"test\",\n    scripts: {\n      build: \"npx projen build\",\n      compile: \"npx projen compile\",\n      default: \"npx projen default\",\n      eject: \"npx projen eject\",\n      package: \"npx projen package\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      test: \"npx projen test\",\n    },\n    dependencies: {\n      ms: \"^2\",\n    },\n    main: \"lib/index.js\",\n    license: \"Apache-2.0\",\n    version: \"0.0.0\",\n    \"//\": '~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".',\n  };\n\n  writeFileSync(\n    join(outdir, \"package.json\"),\n    JSON.stringify(orig, undefined, 2)\n  );\n  mkdirSync(join(outdir, \"node_modules\")); // <-- also causes an \"install\"\n\n  const project = new Project({ name: \"test\", outdir });\n  project.addExcludeFromCleanup(\"package.json\");\n  const pkg = new NodePackage(project);\n\n  pkg.addDeps(\"ms@^2\");\n\n  project.synth();\n  expect(execMock).not.toBeCalled();\n});\n\ntest('\"*\" peer dependencies are pinned in devDependencies', () => {\n  // Post-synth dependency version resolution uses installed package from node_modules folder\n  // Mock install command to add this folder with a fixed dependency version,\n  // mimicking yarn installing the latest package for \"*\"\n  jest.spyOn(util, \"exec\").mockImplementation((command, options) => {\n    expect(command.startsWith(\"yarn install\")).toBeTruthy();\n    mockYarnInstall(options.cwd, { ms: \"1.2.3\" });\n  });\n\n  const project = new Project({ name: \"test\" });\n  const pkg = new NodePackage(project, {\n    peerDependencyOptions: {\n      pinnedDevDependency: true,\n    },\n  });\n\n  pkg.addPeerDeps(\"ms\");\n\n  project.synth();\n\n  const pkgFile = readJsonSync(join(project.outdir, \"package.json\"));\n\n  expect(pkgFile.peerDependencies).toStrictEqual({ ms: \"^1.2.3\" });\n  expect(pkgFile.devDependencies).toStrictEqual({ ms: \"1.2.3\" });\n});\n\ntest(\"manually set devDependencies are not changed when a peerDependency is added\", () => {\n  // Post-synth dependency version resolution uses installed package from node_modules folder\n  // Mock install command to add this folder with a fixed dependency version,\n  // mimicking yarn installing the latest package for \"*\"\n  jest.spyOn(util, \"exec\").mockImplementation((command, options) => {\n    expect(command.startsWith(\"yarn install\")).toBeTruthy();\n    mockYarnInstall(options.cwd, { ms: \"1.3.4\" });\n  });\n\n  const project = new Project({ name: \"test\" });\n  const pkg = new NodePackage(project, {\n    peerDependencyOptions: {\n      pinnedDevDependency: true,\n    },\n  });\n\n  const orig = {\n    name: \"test\",\n    devDependencies: {\n      ms: \"^1.3.0\",\n    },\n    main: \"lib/index.js\",\n    license: \"Apache-2.0\",\n    version: \"0.0.0\",\n    \"//\": '~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".',\n  };\n\n  writeFileSync(\n    join(project.outdir, \"package.json\"),\n    JSON.stringify(orig, undefined, 2)\n  );\n\n  pkg.addPeerDeps(\"ms\");\n\n  project.synth();\n\n  const pkgFile = readJsonSync(join(project.outdir, \"package.json\"));\n\n  expect(pkgFile.peerDependencies).toStrictEqual({ ms: \"^1.3.4\" });\n  expect(pkgFile.devDependencies).toStrictEqual({ ms: \"^1.3.0\" });\n});\n\ntest(\"devDependencies are not pinned by peerDependencies if a regular (runtime) dependency also exists\", () => {\n  // Post-synth dependency version resolution uses installed package from node_modules folder\n  // Mock install command to add this folder with a fixed dependency version,\n  // mimicking yarn installing the latest package for \"*\"\n  jest.spyOn(util, \"exec\").mockImplementation((command, options) => {\n    expect(command.startsWith(\"yarn install\")).toBeTruthy();\n    mockYarnInstall(options.cwd, { ms: \"1.3.8\" });\n  });\n\n  const project = new Project({ name: \"test\" });\n  const pkg = new NodePackage(project, {\n    peerDependencyOptions: {\n      pinnedDevDependency: true,\n    },\n  });\n\n  pkg.addDeps(\"ms\");\n  pkg.addPeerDeps(\"ms\");\n\n  project.synth();\n\n  const pkgFile = readJsonSync(join(project.outdir, \"package.json\"));\n\n  expect(pkgFile.peerDependencies).toStrictEqual({ ms: \"^1.3.8\" });\n  expect(pkgFile.dependencies).toStrictEqual({ ms: \"^1.3.8\" });\n  expect(pkgFile.devDependencies).toBeUndefined();\n});\n\ntest(\"devDependencies are not pinned by peerDependencies if pinnedDevDependency is false\", () => {\n  // Post-synth dependency version resolution uses installed package from node_modules folder\n  // Mock install command to add this folder with a fixed dependency version,\n  // mimicking yarn installing the latest package for \"*\"\n  jest.spyOn(util, \"exec\").mockImplementation((command, options) => {\n    expect(command.startsWith(\"yarn install\")).toBeTruthy();\n    mockYarnInstall(options.cwd, { ms: \"1.4.0\" });\n  });\n\n  const project = new Project({ name: \"test\" });\n  const pkg = new NodePackage(project, {\n    peerDependencyOptions: {\n      pinnedDevDependency: false,\n    },\n  });\n\n  pkg.addPeerDeps(\"ms\");\n\n  project.synth();\n\n  const pkgFile = readJsonSync(join(project.outdir, \"package.json\"));\n\n  expect(pkgFile.peerDependencies).toStrictEqual({ ms: \"^1.4.0\" });\n  expect(pkgFile.devDependencies).toBeUndefined();\n});\n\ntest(\"file path dependencies are respected\", () => {\n  // Post-synth dependency version resolution uses installed package from node_modules folder\n  // Mock install command to add this folder with a fixed dependency version,\n  // mimicking yarn installing the latest package for \"*\"\n  jest.spyOn(util, \"exec\").mockImplementation((command, options) => {\n    expect(command.startsWith(\"yarn install\")).toBeTruthy();\n    mockYarnInstall(options.cwd, { ms: \"file:../ms\" });\n  });\n\n  const project = new Project({ name: \"test\" });\n  const pkg = new NodePackage(project, {\n    peerDependencyOptions: {\n      pinnedDevDependency: false,\n    },\n  });\n\n  pkg.addPeerDeps(\"ms@file:../ms\");\n\n  project.synth();\n\n  const pkgFile = readJsonSync(join(project.outdir, \"package.json\"));\n\n  expect(pkgFile.peerDependencies).toStrictEqual({ ms: \"file:../ms\" });\n  expect(pkgFile.devDependencies).toBeUndefined();\n});\n\ntest(\"local dependencies can be specified using 'file:' prefix\", () => {\n  jest.spyOn(util, \"exec\");\n  const localDepPath = mkdtemp({ cleanup: false });\n  const localPackage = {\n    name: \"local-dep\",\n    version: \"0.0.0\",\n  };\n\n  writeFileSync(\n    join(localDepPath, \"package.json\"),\n    JSON.stringify(localPackage, undefined, 2)\n  );\n\n  const project = new TestProject();\n  const pkg = new NodePackage(project);\n  pkg.addPeerDeps(`file:${localDepPath}`);\n\n  project.synth();\n\n  const pkgFile = readJsonSync(join(project.outdir, \"package.json\"));\n\n  expect(pkgFile.peerDependencies).toStrictEqual({ \"local-dep\": localDepPath });\n});\n\ntest(\"yarn resolutions\", () => {\n  const project = new TestProject();\n\n  const pkg = new NodePackage(project, {\n    packageManager: NodePackageManager.YARN,\n  });\n\n  pkg.addPackageResolutions(\"some-dep@1.0.0\", \"other-dep\");\n\n  const snps = synthSnapshot(project);\n\n  expect(snps[\"package.json\"].resolutions).toBeDefined();\n  expect(snps[\"package.json\"]).toMatchSnapshot();\n});\n\ntest(\"npm overrides\", () => {\n  const project = new TestProject();\n\n  const pkg = new NodePackage(project, {\n    packageManager: NodePackageManager.NPM,\n  });\n\n  pkg.addPackageResolutions(\"some-dep@1.0.0\", \"other-dep\");\n\n  const snps = synthSnapshot(project);\n\n  expect(snps[\"package.json\"].overrides).toBeDefined();\n  expect(snps[\"package.json\"]).toMatchSnapshot();\n});\n\ntest(\"pnpm overrides\", () => {\n  const project = new TestProject();\n\n  const pkg = new NodePackage(project, {\n    packageManager: NodePackageManager.PNPM,\n  });\n\n  pkg.addPackageResolutions(\"some-dep@1.0.0\", \"other-dep\");\n\n  const snps = synthSnapshot(project);\n\n  expect(snps[\"package.json\"].pnpm.overrides).toBeDefined();\n  expect(snps[\"package.json\"]).toMatchSnapshot();\n});\n"
  },
  {
    "path": "test/javascript/node-project.test.ts",
    "content": "import * as json5 from \"json5\";\nimport * as yaml from \"yaml\";\nimport { PROJEN_MARKER } from \"../../src/common\";\nimport { DependencyType } from \"../../src/dependencies\";\nimport { GithubCredentials } from \"../../src/github\";\nimport { secretToString } from \"../../src/github/util\";\nimport { JobPermission } from \"../../src/github/workflows-model\";\nimport {\n  NodeProject,\n  NodeProjectOptions,\n  NodePackage,\n  NpmAccess,\n} from \"../../src/javascript\";\nimport { JsonFile } from \"../../src/json\";\nimport * as logging from \"../../src/logging\";\nimport { Project } from \"../../src/project\";\nimport { SampleFile } from \"../../src/sample-file\";\nimport { TaskRuntime } from \"../../src/task-runtime\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\nlogging.disable();\n\ntest(\"license file is added by default\", () => {\n  // WHEN\n  const project = new TestNodeProject();\n\n  // THEN\n  expect(synthSnapshot(project).LICENSE).toContain(\"Apache License\");\n});\n\ntest(\"license file is not added if licensed is false\", () => {\n  // WHEN\n  const project = new TestNodeProject({\n    licensed: false,\n  });\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  expect(snapshot.LICENSE).toBeUndefined();\n  expect(snapshot[\".gitignore\"]).not.toContain(\"LICENSE\");\n  expect(snapshot[\"package.json\"].license).toEqual(\"UNLICENSED\");\n});\n\ndescribe(\"deps\", () => {\n  test(\"runtime deps\", () => {\n    // GIVEN\n    const project = new TestNodeProject({\n      deps: [\"aaa@^1.2.3\", \"bbb@~4.5.6\"],\n    });\n\n    // WHEN\n    project.addDeps(\"ccc\");\n    project.deps.addDependency(\"ddd\", DependencyType.RUNTIME);\n\n    // THEN\n    const pkgjson = packageJson(project);\n    expect(pkgjson.dependencies).toStrictEqual({\n      aaa: \"^1.2.3\",\n      bbb: \"~4.5.6\",\n      ccc: \"*\",\n      ddd: \"*\",\n    });\n    expect(pkgjson.peerDependencies).toBeUndefined();\n  });\n\n  test(\"dev dependencies\", () => {\n    // GIVEN\n    const project = new TestNodeProject({\n      devDeps: [\"aaa@^1.2.3\", \"bbb@~4.5.6\"],\n    });\n\n    // WHEN\n    project.addDevDeps(\"ccc\");\n    project.deps.addDependency(\"ddd\", DependencyType.TEST);\n    project.deps.addDependency(\"eee@^1\", DependencyType.DEVENV);\n    project.deps.addDependency(\"fff@^2\", DependencyType.BUILD);\n\n    // THEN\n    const pkgjson = packageJson(project);\n    expect(pkgjson.devDependencies.aaa).toStrictEqual(\"^1.2.3\");\n    expect(pkgjson.devDependencies.bbb).toStrictEqual(\"~4.5.6\");\n    expect(pkgjson.devDependencies.ccc).toStrictEqual(\"*\");\n    expect(pkgjson.devDependencies.ddd).toStrictEqual(\"*\");\n    expect(pkgjson.devDependencies.eee).toStrictEqual(\"^1\");\n    expect(pkgjson.devDependencies.fff).toStrictEqual(\"^2\");\n    expect(pkgjson.peerDependencies).toBeUndefined();\n    expect(pkgjson.dependencieds).toBeUndefined();\n  });\n\n  test(\"peerDependencies\", () => {\n    // GIVEN\n    const project = new TestNodeProject({\n      peerDeps: [\"aaa@^1.2.3\", \"bbb@~4.5.6\"],\n    });\n\n    // WHEN\n    project.addPeerDeps(\"ccc\");\n    project.deps.addDependency(\"ddd\", DependencyType.PEER);\n\n    // THEN\n    const pkgjson = packageJson(project);\n    expect(pkgjson.peerDependencies).toStrictEqual({\n      aaa: \"^1.2.3\",\n      bbb: \"~4.5.6\",\n      ccc: \"*\",\n      ddd: \"*\",\n    });\n\n    // devDependencies are added with pinned versions\n    expect(pkgjson.devDependencies.aaa).toStrictEqual(\"1.2.3\");\n    expect(pkgjson.devDependencies.bbb).toStrictEqual(\"4.5.6\");\n    expect(pkgjson.devDependencies.ccc).toStrictEqual(\"*\");\n    expect(pkgjson.devDependencies.ddd).toStrictEqual(\"*\");\n    expect(pkgjson.dependencieds).toBeUndefined();\n  });\n\n  test(\"peerDependencies without pinnedDevDep\", () => {\n    // GIVEN\n    const project = new TestNodeProject({\n      peerDependencyOptions: {\n        pinnedDevDependency: false,\n      },\n      peerDeps: [\"aaa@^1.2.3\", \"bbb@~4.5.6\"],\n    });\n\n    // WHEN\n    project.addPeerDeps(\"ccc\");\n    project.deps.addDependency(\"ddd\", DependencyType.PEER);\n\n    // THEN\n    const pkgjson = packageJson(project);\n    expect(pkgjson.peerDependencies).toStrictEqual({\n      aaa: \"^1.2.3\",\n      bbb: \"~4.5.6\",\n      ccc: \"*\",\n      ddd: \"*\",\n    });\n\n    // sanitize\n    [\n      \"npm-check-updates\",\n      \"jest\",\n      \"jest-junit\",\n      \"projen\",\n      \"standard-version\",\n    ].forEach((d) => delete pkgjson.devDependencies[d]);\n\n    expect(pkgjson.devDependencies).toStrictEqual({});\n    expect(pkgjson.dependencieds).toBeUndefined();\n  });\n\n  test(\"devDeps are only added for peerDeps if a runtime dep does not already exist\", () => {\n    // GIVEN\n    const project = new TestNodeProject();\n\n    // WHEN\n    project.addPeerDeps(\"ccc@^2\");\n    project.addDeps(\"ccc@^2.3.3\");\n\n    // THEN\n    const pkgjson = packageJson(project);\n\n    // sanitize\n    [\n      \"npm-check-updates\",\n      \"jest\",\n      \"jest-junit\",\n      \"projen\",\n      \"standard-version\",\n    ].forEach((d) => delete pkgjson.devDependencies[d]);\n\n    expect(pkgjson.peerDependencies).toStrictEqual({ ccc: \"^2\" });\n    expect(pkgjson.dependencies).toStrictEqual({ ccc: \"^2.3.3\" });\n    expect(pkgjson.devDependencies).toStrictEqual({});\n  });\n\n  test(\"bundled deps are automatically added as normal deps\", () => {\n    // GIVEN\n    const project = new TestNodeProject({\n      bundledDeps: [\"hey@2.1.1\"],\n    });\n\n    // WHEN\n    project.addBundledDeps(\"foo@^1.2.3\");\n    project.deps.addDependency(\"bar@~1.0.0\", DependencyType.BUNDLED);\n\n    // THEN\n    const pkgjson = packageJson(project);\n    expect(pkgjson.dependencies).toStrictEqual({\n      hey: \"2.1.1\",\n      foo: \"^1.2.3\",\n      bar: \"~1.0.0\",\n    });\n    expect(pkgjson.bundledDependencies).toStrictEqual([\"bar\", \"foo\", \"hey\"]);\n  });\n});\n\ndescribe(\"deps upgrade\", () => {\n  test(\"throws when trying to auto approve deps but auto approve is not defined\", () => {\n    expect(() => {\n      new TestNodeProject({ autoApproveUpgrades: true });\n    }).toThrow(\n      \"Automatic approval of dependencies upgrades requires configuring `autoApproveOptions`\"\n    );\n  });\n\n  test(\"workflow can be auto approved\", () => {\n    const project = new TestNodeProject({\n      autoApproveOptions: {\n        allowedUsernames: [\"dummy\"],\n        secret: \"dummy\",\n      },\n      autoApproveUpgrades: true,\n    });\n\n    const snapshot = yaml.parse(\n      synthSnapshot(project)[\".github/workflows/upgrade-main.yml\"]\n    );\n    expect(snapshot.jobs.pr.steps[4].with.labels).toStrictEqual(\n      project.autoApprove?.label\n    );\n  });\n\n  test(\"commit can be signed\", () => {\n    const project = new TestNodeProject({\n      depsUpgradeOptions: {\n        signoff: true,\n      },\n    });\n\n    const snapshot = yaml.parse(\n      synthSnapshot(project)[\".github/workflows/upgrade-main.yml\"]\n    );\n    expect(snapshot.jobs.pr).toMatchSnapshot();\n  });\n\n  test(\"dependabot can be auto approved\", () => {\n    const project = new TestNodeProject({\n      dependabot: true,\n      autoApproveOptions: {\n        allowedUsernames: [\"dummy\"],\n        secret: \"dummy\",\n      },\n      autoApproveUpgrades: true,\n    });\n\n    const snapshot = yaml.parse(\n      synthSnapshot(project)[\".github/dependabot.yml\"]\n    );\n    expect(snapshot.updates[0].labels).toStrictEqual([\"auto-approve\"]);\n  });\n\n  test(\"throws when dependabot is configued with depsUpgrade\", () => {\n    expect(() => {\n      new TestNodeProject({ dependabot: true, depsUpgrade: true });\n    }).toThrow(\"'dependabot' cannot be configured together with 'depsUpgrade'\");\n  });\n\n  test(\"can specity nested config withtout loosing default values\", () => {\n    const project = new TestNodeProject({\n      autoApproveUpgrades: true,\n      autoApproveOptions: {\n        label: \"auto-approve\",\n        secret: \"GITHUB_TOKEN\",\n      },\n      depsUpgradeOptions: {\n        workflowOptions: {\n          projenCredentials: GithubCredentials.fromPersonalAccessToken({\n            secret: \"PROJEN_SECRET\",\n          }),\n        },\n      },\n    });\n    const snapshot = synthSnapshot(project);\n    const upgrade = yaml.parse(snapshot[\".github/workflows/upgrade-main.yml\"]);\n\n    // we expect the default auto-approve label to be applied\n    expect(upgrade.jobs.pr.steps[4].with.labels).toEqual(\"auto-approve\");\n  });\n\n  test(\"git identity of the upgrade workflow is customizable\", () => {\n    const project = new TestNodeProject({\n      workflowGitIdentity: {\n        name: \"hey\",\n        email: \"there@foo.com\",\n      },\n    });\n\n    const snapshot = synthSnapshot(project);\n    const upgrade = yaml.parse(snapshot[\".github/workflows/upgrade-main.yml\"]);\n\n    // we expect the default auto-approve label to be applied\n    expect(upgrade.jobs.pr.steps[3]).toStrictEqual({\n      name: \"Set git identity\",\n      run: [\n        'git config user.name \"hey\"',\n        'git config user.email \"there@foo.com\"',\n      ].join(\"\\n\"),\n    });\n  });\n});\n\ndescribe(\"npm publishing options\", () => {\n  test(\"defaults\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      packageName: \"my-package\",\n    });\n\n    // THEN\n    expect(npm.npmAccess).toStrictEqual(NpmAccess.PUBLIC);\n    expect(npm.npmRegistry).toStrictEqual(\"registry.npmjs.org\");\n    expect(npm.npmRegistryUrl).toStrictEqual(\"https://registry.npmjs.org/\");\n    expect(npm.npmTokenSecret).toStrictEqual(\"NPM_TOKEN\");\n\n    // since these are all defaults, publishConfig is not defined.\n    expect(\n      synthSnapshot(project)[\"package.json\"].publishConfig\n    ).toBeUndefined();\n  });\n\n  test(\"scoped packages default to RESTRICTED access\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      packageName: \"scoped@my-package\",\n    });\n\n    // THEN\n    expect(npm.npmAccess).toStrictEqual(NpmAccess.RESTRICTED);\n\n    // since these are all defaults, publishConfig is not defined.\n    expect(packageJson(project).publishConfig).toBeUndefined();\n  });\n\n  test(\"non-scoped package cannot be RESTRICTED\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // THEN\n    expect(\n      () =>\n        new NodePackage(project, {\n          packageName: \"my-package\",\n          npmAccess: NpmAccess.RESTRICTED,\n        })\n    ).toThrow(/\"npmAccess\" cannot be RESTRICTED for non-scoped npm package/);\n  });\n\n  test(\"custom settings\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      packageName: \"scoped@my-package\",\n      npmRegistryUrl: \"https://foo.bar\",\n      npmAccess: NpmAccess.PUBLIC,\n      npmTokenSecret: \"GITHUB_TOKEN\",\n    });\n\n    // THEN\n    expect(npm.npmRegistry).toStrictEqual(\"foo.bar\");\n    expect(npm.npmRegistryUrl).toStrictEqual(\"https://foo.bar/\");\n    expect(npm.npmAccess).toStrictEqual(NpmAccess.PUBLIC);\n    expect(npm.npmTokenSecret).toStrictEqual(\"GITHUB_TOKEN\");\n    expect(packageJson(project).publishConfig).toStrictEqual({\n      access: \"public\",\n      registry: \"https://foo.bar/\",\n    });\n  });\n\n  test(\"registry with path\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      npmRegistryUrl: \"https://foo.bar/path/\",\n    });\n\n    // THEN\n    expect(npm.npmRegistry).toStrictEqual(\"foo.bar/path/\");\n    expect(npm.npmRegistryUrl).toStrictEqual(\"https://foo.bar/path/\");\n    expect(packageJson(project).publishConfig).toStrictEqual({\n      registry: \"https://foo.bar/path/\",\n    });\n  });\n\n  test(\"AWS CodeArtifact registry\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      npmRegistryUrl:\n        \"https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n    });\n\n    // THEN\n    expect(npm.npmRegistry).toStrictEqual(\n      \"my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\"\n    );\n    expect(npm.npmRegistryUrl).toStrictEqual(\n      \"https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\"\n    );\n    expect(packageJson(project).publishConfig).toStrictEqual({\n      registry:\n        \"https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n    });\n    expect(npm.codeArtifactOptions?.accessKeyIdSecret).toStrictEqual(\n      \"AWS_ACCESS_KEY_ID\"\n    );\n    expect(npm.codeArtifactOptions?.secretAccessKeySecret).toStrictEqual(\n      \"AWS_SECRET_ACCESS_KEY\"\n    );\n  });\n\n  test(\"AWS CodeArtifact registry custom values\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      npmRegistryUrl:\n        \"https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n      codeArtifactOptions: {\n        accessKeyIdSecret: \"OTHER_AWS_ACCESS_KEY_ID\",\n        secretAccessKeySecret: \"OTHER_AWS_SECRET_ACCESS_KEY\",\n      },\n    });\n\n    // THEN\n    expect(npm.codeArtifactOptions?.accessKeyIdSecret).toStrictEqual(\n      \"OTHER_AWS_ACCESS_KEY_ID\"\n    );\n    expect(npm.codeArtifactOptions?.secretAccessKeySecret).toStrictEqual(\n      \"OTHER_AWS_SECRET_ACCESS_KEY\"\n    );\n  });\n\n  test(\"throw when 'npmTokenSecret' is used with AWS CodeArtifact\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // THEN\n    expect(() => {\n      new NodePackage(project, {\n        npmRegistryUrl:\n          \"https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n        npmTokenSecret: \"INVALID_VALUE\",\n      });\n    }).toThrow(\n      '\"npmTokenSecret\" must not be specified when publishing AWS CodeArtifact.'\n    );\n  });\n\n  test(\"throw when 'codeArtifactOptions.accessKeyIdSecret' or 'codeArtifactOptions.secretAccessKeySecret' is used without AWS CodeArtifact\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // THEN\n    expect(() => {\n      new NodePackage(project, {\n        codeArtifactOptions: {\n          accessKeyIdSecret: \"INVALID_AWS_ACCESS_KEY_ID\",\n        },\n      });\n    }).toThrow(\n      \"codeArtifactOptions must only be specified when publishing AWS CodeArtifact or used in scoped packages.\"\n    );\n    expect(() => {\n      new NodePackage(project, {\n        codeArtifactOptions: {\n          secretAccessKeySecret: \"INVALID_AWS_SECRET_ACCESS_KEY\",\n        },\n      });\n    }).toThrow(\n      \"codeArtifactOptions must only be specified when publishing AWS CodeArtifact or used in scoped packages.\"\n    );\n  });\n\n  test(\"AWS CodeArtifact registry role to assume\", () => {\n    // GIVEN\n    const project = new TestProject();\n    const roleArn = \"role-arn\";\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      npmRegistryUrl:\n        \"https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n      codeArtifactOptions: {\n        roleToAssume: roleArn,\n      },\n    });\n\n    // THEN\n    expect(npm.codeArtifactOptions?.roleToAssume).toStrictEqual(roleArn);\n  });\n\n  test(\"deprecated npmRegistry can be used instead of npmRegistryUrl and then https:// is assumed\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const npm = new NodePackage(project, {\n      packageName: \"scoped@my-package\",\n      npmRegistry: \"foo.bar.com\",\n    });\n\n    // THEN\n    expect(npm.npmRegistry).toStrictEqual(\"foo.bar.com\");\n    expect(npm.npmRegistryUrl).toStrictEqual(\"https://foo.bar.com/\");\n    expect(packageJson(project).publishConfig).toStrictEqual({\n      registry: \"https://foo.bar.com/\",\n    });\n  });\n});\n\ntest(\"extend github release workflow\", () => {\n  const project = new TestNodeProject();\n\n  project.release?.addJobs({\n    publish_docker_hub: {\n      permissions: {\n        contents: JobPermission.READ,\n      },\n      runsOn: [\"ubuntu-latest\"],\n      env: {\n        CI: \"true\",\n      },\n      steps: [\n        {\n          name: \"Check out the repo\",\n          uses: \"actions/checkout@v3\",\n        },\n        {\n          name: \"Push to Docker Hub\",\n          uses: \"docker/build-push-action@v1\",\n          with: {\n            username: \"${{ secrets.DOCKER_USERNAME }}\",\n            password: \"${{ secrets.DOCKER_PASSWORD }}\",\n            repository: \"projen/projen-docker\",\n            tag_with_ref: \"true\",\n          },\n        },\n      ],\n    },\n  });\n\n  const workflow = synthSnapshot(project)[\".github/workflows/release.yml\"];\n  expect(workflow).toContain(\n    \"publish_docker_hub:\\n    runs-on: ubuntu-latest\\n\"\n  );\n  expect(workflow).toContain(\n    \"username: ${{ secrets.DOCKER_USERNAME }}\\n          password: ${{ secrets.DOCKER_PASSWORD }}\"\n  );\n});\n\ntest(\"codecov upload added to github release workflow\", () => {\n  const project = new TestNodeProject({\n    codeCov: true,\n  });\n\n  const workflow = synthSnapshot(project)[\".github/workflows/release.yml\"];\n  expect(workflow).toContain(\"uses: codecov/codecov-action@v1\");\n});\n\ntest(\"codecov upload not added to github release workflow\", () => {\n  const project = new TestNodeProject({\n    codeCov: false,\n  });\n\n  const workflow = synthSnapshot(project)[\".github/workflows/release.yml\"];\n  expect(workflow).not.toContain(\"uses: codecov/codecov-action@v1\");\n});\n\ndescribe(\"scripts\", () => {\n  test(\"addTask and setScript\", () => {\n    const p = new TestNodeProject();\n    p.addTask(\"chortle\", { exec: 'echo \"frabjous day!\"' });\n    p.setScript(\"slithy-toves\", \"gyre && gimble\");\n    const pkg = packageJson(p);\n    expect(pkg.scripts).toHaveProperty(\"chortle\");\n    expect(pkg.scripts).toHaveProperty(\"slithy-toves\");\n  });\n\n  test(\"removeScript will remove tasks and scripts\", () => {\n    const p = new TestNodeProject();\n\n    p.addTask(\"chortle\", { exec: 'echo \"frabjous day!\"' });\n    p.setScript(\"slithy-toves\", \"gyre && gimble\");\n    p.removeScript(\"chortle\");\n    p.removeScript(\"slithy-toves\");\n    const pkg = packageJson(p);\n    expect(pkg.scripts).not.toHaveProperty(\"chortle\");\n    expect(pkg.scripts).not.toHaveProperty(\"slithy-toves\");\n  });\n});\n\ntest(\"mutableBuild will push changes to PR branches\", () => {\n  // WHEN\n  const project = new TestNodeProject({\n    mutableBuild: true,\n  });\n\n  // THEN\n  const workflowYaml = synthSnapshot(project)[\".github/workflows/build.yml\"];\n  const workflow = yaml.parse(workflowYaml);\n  expect(workflow.jobs.build.steps).toMatchSnapshot();\n  expect(Object.keys(workflow.jobs)).toContain(\"self-mutation\");\n  expect(workflow.jobs[\"self-mutation\"].steps).toMatchSnapshot();\n});\n\ntest(\"disabling mutableBuild will skip pushing changes to PR branches\", () => {\n  // WHEN\n  const project = new TestNodeProject({\n    mutableBuild: false,\n  });\n\n  // THEN\n  const workflowYaml = synthSnapshot(project)[\".github/workflows/build.yml\"];\n  const workflow = yaml.parse(workflowYaml);\n  expect(workflow.jobs.build.steps).toMatchSnapshot();\n  expect(Object.keys(workflow.jobs)).not.toContain(\"self-mutation\");\n});\n\ntest(\"projen synth is only executed for subprojects\", () => {\n  // GIVEN\n  const root = new TestNodeProject();\n\n  // WHEN\n  new TestNodeProject({ parent: root, outdir: \"child\" });\n\n  // THEN\n  const snapshot = synthSnapshot(root);\n  const rootBuildTask = snapshot[\".projen/tasks.json\"].tasks.build;\n  const childBuildTask = snapshot[\"child/.projen/tasks.json\"].tasks.build;\n  expect(rootBuildTask).toStrictEqual({\n    description: \"Full release build\",\n    name: \"build\",\n    steps: [\n      { spawn: \"default\" },\n      { spawn: \"pre-compile\" },\n      { spawn: \"compile\" },\n      { spawn: \"post-compile\" },\n      { spawn: \"test\" },\n      { spawn: \"package\" },\n    ],\n  });\n  expect(childBuildTask).toStrictEqual({\n    description: \"Full release build\",\n    name: \"build\",\n    steps: [\n      { spawn: \"pre-compile\" },\n      { spawn: \"compile\" },\n      { spawn: \"post-compile\" },\n      { spawn: \"test\" },\n      { spawn: \"package\" },\n    ],\n  });\n});\n\ntest(\"enabling dependabot does not overturn mergify: false\", () => {\n  // WHEN\n  const project = new TestNodeProject({\n    dependabot: true,\n    mergify: false,\n  });\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  // Note: brackets important, they prevent \".\" in filenames to be interpreted\n  //       as JSON object path delimiters.\n  expect(snapshot).not.toHaveProperty([\".mergify.yml\"]);\n  expect(snapshot).toHaveProperty([\".github/dependabot.yml\"]);\n});\n\ntest(\"enabling renovatebot does not overturn mergify: false\", () => {\n  // WHEN\n  const project = new TestNodeProject({\n    renovatebot: true,\n    mergify: false,\n  });\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  // Note: brackets important, they prevent \".\" in filenames to be interpreted\n  //       as JSON object path delimiters.\n  expect(snapshot).not.toHaveProperty([\".mergify.yml\"]);\n  expect(snapshot).toHaveProperty([\"renovate.json5\"]);\n  expect(json5.parse(snapshot[\"renovate.json5\"]).ignoreDeps).toEqual([\n    \"jest-junit\",\n    \"npm-check-updates\",\n    \"standard-version\",\n    \"projen\",\n  ]);\n  expect(snapshot[\"renovate.json5\"]).toMatchSnapshot();\n});\n\ntest(\"github: false disables github integration\", () => {\n  // WHEN\n  const project = new TestNodeProject({\n    github: false,\n    autoApproveUpgrades: true,\n    autoApproveOptions: {},\n  });\n\n  // THEN\n  const output = synthSnapshot(project);\n  expect(\n    Object.keys(output).filter((p) => p.startsWith(\".github/\"))\n  ).toStrictEqual([]);\n});\n\ntest(\"githubOptions.workflows:false disables github workflows but not github integration\", () => {\n  // WHEN\n  const project = new TestNodeProject({\n    githubOptions: {\n      workflows: false,\n    },\n  });\n\n  // THEN\n  const output = synthSnapshot(project);\n  expect(\n    Object.keys(output).filter((p) => p.startsWith(\".github/\"))\n  ).toStrictEqual([\".github/pull_request_template.md\"]);\n});\n\ntest(\"using GitHub npm registry will default npm secret to GITHUB_TOKEN\", () => {\n  // GIVEN\n  const project = new TestNodeProject({\n    npmRegistryUrl: \"https://npm.pkg.github.com\",\n  });\n\n  // THEN\n  const output = synthSnapshot(project);\n  expect(output[\".github/workflows/release.yml\"]).not.toMatch(\"NPM_TOKEN\");\n});\n\nfunction packageJson(project: Project) {\n  return synthSnapshot(project)[\"package.json\"];\n}\n\ntest(\"buildWorkflow can use GitHub App for API access\", () => {\n  // GIVEN\n  const appId = \"APP_ID\";\n  const privateKey = \"PRIVATE_KEY\";\n  const project = new TestNodeProject({\n    githubOptions: {\n      projenCredentials: GithubCredentials.fromApp({\n        appIdSecret: appId,\n        privateKeySecret: privateKey,\n      }),\n    },\n  });\n\n  // THEN\n  const output = synthSnapshot(project);\n  const buildWorkflow = yaml.parse(output[\".github/workflows/build.yml\"]);\n  expect(buildWorkflow.jobs[\"self-mutation\"].steps[0]).toMatchObject({\n    name: \"Generate token\",\n    with: {\n      app_id: `\\${{ secrets.${appId} }}`,\n      private_key: `\\${{ secrets.${privateKey} }}`,\n    },\n  });\n  expect(buildWorkflow.jobs[\"self-mutation\"].steps[1]).toMatchObject({\n    name: \"Checkout\",\n    with: {\n      token: \"${{ steps.generate_token.outputs.token }}\",\n    },\n  });\n});\n\ntest(\"workflowGitIdentity can be used to customize the git identity used in build workflows\", () => {\n  // GIVEN\n  const project = new TestNodeProject({\n    workflowGitIdentity: {\n      name: \"heya\",\n      email: \"there@z.com\",\n    },\n  });\n\n  // THEN\n  const output = synthSnapshot(project);\n  const buildWorkflow = yaml.parse(output[\".github/workflows/build.yml\"]);\n  expect(buildWorkflow.jobs[\"self-mutation\"].steps[3]).toStrictEqual({\n    name: \"Set git identity\",\n    run: [\n      'git config user.name \"heya\"',\n      'git config user.email \"there@z.com\"',\n    ].join(\"\\n\"),\n  });\n});\n\ndescribe(\"workflowRunsOn\", () => {\n  test(\"default to ubuntu-latest\", () => {\n    // WHEN\n    const project = new TestNodeProject();\n\n    // THEN\n    const output = synthSnapshot(project);\n    const buildWorkflow = yaml.parse(output[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.jobs.build[\"runs-on\"]).toEqual(\"ubuntu-latest\");\n    expect(buildWorkflow.jobs[\"self-mutation\"][\"runs-on\"]).toEqual(\n      \"ubuntu-latest\"\n    );\n  });\n\n  test(\"use github runner specified in workflowRunsOn\", () => {\n    // WHEN\n    const project = new TestNodeProject({\n      workflowRunsOn: [\"self-hosted\"],\n    });\n\n    // THEN\n    const output = synthSnapshot(project);\n    const buildWorkflow = yaml.parse(output[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.jobs.build[\"runs-on\"]).toEqual(\"self-hosted\");\n    expect(buildWorkflow.jobs[\"self-mutation\"][\"runs-on\"]).toEqual(\n      \"self-hosted\"\n    );\n  });\n});\n\ndescribe(\"buildWorkflowTriggers\", () => {\n  test(\"default to pull request and workflow dispatch\", () => {\n    // WHEN\n    const project = new TestNodeProject();\n\n    // THEN\n    const output = synthSnapshot(project);\n    const buildWorkflow = yaml.parse(output[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.on).toEqual({\n      pull_request: {},\n      workflow_dispatch: {},\n    });\n  });\n\n  test(\"use custom triggers in build workflow\", () => {\n    // WHEN\n    const project = new TestNodeProject({\n      buildWorkflowTriggers: {\n        push: {\n          branches: [\"feature/*\"],\n        },\n      },\n    });\n\n    // THEN\n    const output = synthSnapshot(project);\n    const buildWorkflow = yaml.parse(output[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.on).toEqual({\n      push: {\n        branches: [\"feature/*\"],\n      },\n    });\n  });\n});\n\ntest(\"post-upgrade workflow\", () => {\n  // GIVEN\n  const project = new TestNodeProject();\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  const tasks = snapshot[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[tasks.upgrade.steps.length - 1]).toStrictEqual({\n    spawn: \"post-upgrade\",\n  });\n});\n\ntest(\"node project can be ejected\", () => {\n  // GIVEN\n  // equivalent to running \"eject\" task - needs to be enabled at construction time\n  process.env.PROJEN_EJECTING = \"true\";\n\n  // WHEN\n  const p = new TestNodeProject();\n  p.deps.addDependency(\"test\", DependencyType.BUILD);\n  new JsonFile(p, \"foo/bar.json\", { obj: { hello: \"world!\" } });\n  new SampleFile(p, \"sample.txt\", {\n    contents: \"the file\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(p);\n  expect(outdir[\"package.json\"]).toMatchSnapshot();\n  expect(outdir[\"package.json\"]).not.toContain(PROJEN_MARKER);\n  expect(outdir[\"package.json\"][\"//\"]).toBeUndefined();\n  expect(outdir[\"package.json\"].scripts.eject).toBeUndefined();\n  expect(outdir[\"package.json\"].scripts.default).toBeUndefined();\n  expect(outdir[\"package.json\"].devDependencies.projen).toBeUndefined();\n  expect(outdir[\"scripts/run-task\"]).toBeDefined();\n  expect(outdir[\"foo/bar.json\"]).not.toContain(PROJEN_MARKER);\n  expect(outdir[\"sample.txt\"]).not.toContain(PROJEN_MARKER);\n  expect(outdir[\".projenrc.js\"]).toBeUndefined();\n  expect(outdir[\".projen/deps.json\"]).toBeUndefined();\n  expect(outdir[\".projen/files.json\"]).toBeUndefined();\n});\n\ndescribe(\"scoped private packages\", () => {\n  const accountId = \"123456789012\";\n  const domain = \"my-domain\";\n  const region = \"my-region-1\";\n  const repository = \"MyRepository\";\n  const scope = \"@stub-scope\";\n  const defaultAccessKeyIdSecret = \"AWS_ACCESS_KEY_ID\";\n  const defaultSecretAccessKeySecret = \"AWS_SECRET_ACCESS_KEY\";\n  const registry = `${domain}-${accountId}.d.codeartifact.${region}.amazonaws.com/npm/${repository}/`;\n  const registryUrl = `https://${registry}`;\n\n  test(\"adds AWS Code Artifact Login step prior to install to build workflow\", () => {\n    const project = new TestNodeProject({\n      scopedPackagesOptions: [\n        {\n          registryUrl,\n          scope,\n        },\n      ],\n    });\n    const output = synthSnapshot(project);\n\n    const buildWorkflow = yaml.parse(output[\".github/workflows/build.yml\"]);\n    expect(buildWorkflow.jobs.build.steps).toEqual(\n      expect.arrayContaining([\n        {\n          name: \"AWS CodeArtifact Login\",\n          run: \"yarn run ca:login\",\n          env: {\n            AWS_ACCESS_KEY_ID: secretToString(defaultAccessKeyIdSecret),\n            AWS_SECRET_ACCESS_KEY: secretToString(defaultSecretAccessKeySecret),\n          },\n        },\n        { name: \"Install dependencies\", run: \"yarn install --check-files\" },\n      ])\n    );\n  });\n\n  test(\"adds AWS Code Artifact Login step prior to install to release workflow\", () => {\n    const project = new TestNodeProject({\n      scopedPackagesOptions: [\n        {\n          registryUrl,\n          scope,\n        },\n      ],\n    });\n    const output = synthSnapshot(project);\n    const releaseWorkflow = yaml.parse(output[\".github/workflows/release.yml\"]);\n    expect(releaseWorkflow.jobs.release.steps).toEqual(\n      expect.arrayContaining([\n        {\n          name: \"AWS CodeArtifact Login\",\n          run: \"yarn run ca:login\",\n          env: {\n            AWS_ACCESS_KEY_ID: secretToString(defaultAccessKeyIdSecret),\n            AWS_SECRET_ACCESS_KEY: secretToString(defaultSecretAccessKeySecret),\n          },\n        },\n        {\n          name: \"Install dependencies\",\n          run: \"yarn install --check-files --frozen-lockfile\",\n        },\n      ])\n    );\n  });\n\n  test(\"adds AWS Code Artifact Login step prior to install to workflow when multiple scoped packages defined\", () => {\n    const accountId2 = \"123456789013\";\n    const domain2 = \"my-domain-2\";\n    const region2 = \"my-region-2\";\n    const repository2 = \"MyRepository2\";\n    const scope2 = \"@stub-scope-2\";\n    const registryUrl2 = `https://${domain2}-${accountId2}.d.codeartifact.${region2}.amazonaws.com/npm/${repository2}/`;\n    const project = new TestNodeProject({\n      scopedPackagesOptions: [\n        {\n          registryUrl,\n          scope,\n        },\n        {\n          registryUrl: registryUrl2,\n          scope: scope2,\n        },\n      ],\n    });\n    const output = synthSnapshot(project);\n    const releaseWorkflow = yaml.parse(output[\".github/workflows/release.yml\"]);\n    expect(releaseWorkflow.jobs.release.steps).toEqual(\n      expect.arrayContaining([\n        {\n          name: \"AWS CodeArtifact Login\",\n          run: \"yarn run ca:login\",\n          env: {\n            AWS_ACCESS_KEY_ID: secretToString(defaultAccessKeyIdSecret),\n            AWS_SECRET_ACCESS_KEY: secretToString(defaultSecretAccessKeySecret),\n          },\n        },\n        {\n          name: \"Install dependencies\",\n          run: \"yarn install --check-files --frozen-lockfile\",\n        },\n      ])\n    );\n  });\n\n  test(\"adds specified AWS secrets and Code Artifact Login step prior to install to workflow\", () => {\n    const accessKeyIdSecret = \"stub-access-key-id\";\n    const secretAccessKeySecret = \"stub-secret-access-key\";\n    const project = new TestNodeProject({\n      scopedPackagesOptions: [\n        {\n          registryUrl,\n          scope,\n        },\n      ],\n      codeArtifactOptions: {\n        accessKeyIdSecret,\n        secretAccessKeySecret,\n      },\n    });\n    const output = synthSnapshot(project);\n    const releaseWorkflow = yaml.parse(output[\".github/workflows/release.yml\"]);\n    expect(releaseWorkflow.jobs.release.steps).toEqual(\n      expect.arrayContaining([\n        {\n          name: \"AWS CodeArtifact Login\",\n          run: \"yarn run ca:login\",\n          env: {\n            AWS_ACCESS_KEY_ID: secretToString(accessKeyIdSecret),\n            AWS_SECRET_ACCESS_KEY: secretToString(secretAccessKeySecret),\n          },\n        },\n        {\n          name: \"Install dependencies\",\n          run: \"yarn install --check-files --frozen-lockfile\",\n        },\n      ])\n    );\n  });\n\n  test(\"adds AWS assume role and Code Artifact Login step prior to install to workflow\", () => {\n    const roleToAssume = `stub-role-to-assume`;\n    const project = new TestNodeProject({\n      scopedPackagesOptions: [\n        {\n          registryUrl,\n          scope,\n        },\n      ],\n      codeArtifactOptions: {\n        roleToAssume,\n      },\n    });\n    const output = synthSnapshot(project);\n    const releaseWorkflow = yaml.parse(output[\".github/workflows/release.yml\"]);\n    expect(releaseWorkflow.jobs.release.steps).toEqual(\n      expect.arrayContaining([\n        {\n          name: \"Configure AWS Credentials\",\n          uses: \"aws-actions/configure-aws-credentials@v1\",\n          with: {\n            \"aws-access-key-id\": secretToString(defaultAccessKeyIdSecret),\n            \"aws-secret-access-key\": secretToString(\n              defaultSecretAccessKeySecret\n            ),\n            \"aws-region\": \"us-east-2\",\n            \"role-to-assume\": roleToAssume,\n            \"role-duration-seconds\": 900,\n          },\n        },\n        {\n          name: \"AWS CodeArtifact Login\",\n          run: \"yarn run ca:login\",\n        },\n        {\n          name: \"Install dependencies\",\n          run: \"yarn install --check-files --frozen-lockfile\",\n        },\n      ])\n    );\n  });\n\n  test(\"throws error if scope is invalid\", () => {\n    const anotherScope = \"another-scope\";\n    expect(\n      () =>\n        new TestNodeProject({\n          scopedPackagesOptions: [\n            {\n              registryUrl,\n              scope: anotherScope,\n            },\n          ],\n        })\n    ).toThrow(`Scope must start with \"@\" in options, found ${anotherScope}`);\n  });\n\n  test(\"throws error if registryUrl is invalid\", () => {\n    expect(\n      () =>\n        new TestNodeProject({\n          scopedPackagesOptions: [\n            {\n              registryUrl: `https://${accountId}.d.codeartifact.${region}.amazonaws.com/npm/${repository}/`,\n              scope,\n            },\n          ],\n        })\n    ).toThrow(\"Could not get CodeArtifact details from npm Registry\");\n  });\n\n  test(\"adds ca:login script when single scoped package defined\", () => {\n    const project = new TestNodeProject({\n      scopedPackagesOptions: [\n        {\n          registryUrl,\n          scope,\n        },\n      ],\n    });\n    const output = synthSnapshot(project);\n\n    const tasks = output[TaskRuntime.MANIFEST_FILE].tasks;\n    expect(tasks[\"ca:login\"]).toEqual({\n      name: \"ca:login\",\n      requiredEnv: [\"AWS_ACCESS_KEY_ID\", \"AWS_SECRET_ACCESS_KEY\"],\n      steps: [\n        {\n          exec: \"which aws\",\n        },\n        {\n          exec: `npm config set ${scope}:registry ${registryUrl}; CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token --domain ${domain} --region ${region} --domain-owner ${accountId} --query authorizationToken --output text); npm config set //${registry}:_authToken=$CODEARTIFACT_AUTH_TOKEN; npm config set //${registry}:always-auth=true`,\n        },\n      ],\n    });\n  });\n\n  test(\"adds ca:login script when multiple scoped packages defined\", () => {\n    const accountId2 = \"123456789013\";\n    const domain2 = \"my-domain-2\";\n    const region2 = \"my-region-2\";\n    const repository2 = \"MyRepository2\";\n    const scope2 = \"@stub-scope-2\";\n    const registry2 = `${domain2}-${accountId2}.d.codeartifact.${region2}.amazonaws.com/npm/${repository2}/`;\n    const registryUrl2 = `https://${registry2}`;\n    const project = new TestNodeProject({\n      scopedPackagesOptions: [\n        {\n          registryUrl,\n          scope,\n        },\n        {\n          registryUrl: registryUrl2,\n          scope: scope2,\n        },\n      ],\n    });\n    const output = synthSnapshot(project);\n\n    const tasks = output[TaskRuntime.MANIFEST_FILE].tasks;\n    expect(tasks[\"ca:login\"]).toEqual({\n      name: \"ca:login\",\n      requiredEnv: [\"AWS_ACCESS_KEY_ID\", \"AWS_SECRET_ACCESS_KEY\"],\n      steps: [\n        {\n          exec: \"which aws\",\n        },\n        {\n          exec: `npm config set ${scope}:registry ${registryUrl}; CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token --domain ${domain} --region ${region} --domain-owner ${accountId} --query authorizationToken --output text); npm config set //${registry}:_authToken=$CODEARTIFACT_AUTH_TOKEN; npm config set //${registry}:always-auth=true`,\n        },\n        {\n          exec: `npm config set ${scope2}:registry ${registryUrl2}; CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token --domain ${domain2} --region ${region2} --domain-owner ${accountId2} --query authorizationToken --output text); npm config set //${registry2}:_authToken=$CODEARTIFACT_AUTH_TOKEN; npm config set //${registry2}:always-auth=true`,\n        },\n      ],\n    });\n  });\n});\n\nclass TestNodeProject extends NodeProject {\n  constructor(options: Partial<NodeProjectOptions> = {}) {\n    super({\n      name: \"test-node-project\",\n      defaultReleaseBranch: \"main\",\n      ...options,\n    });\n  }\n}\n"
  },
  {
    "path": "test/javascript/npm-config.test.ts",
    "content": "import { NodeProject, NodeProjectOptions } from \"../../src/javascript\";\nimport { NpmConfig } from \"../../src/javascript/npm-config\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"registry is handled correctly\", () => {\n  const prj = new TestNodeProject({\n    name: \"test-project\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  const npmrc = new NpmConfig(prj, {\n    registry: \"https://my.registry.com/mirror\",\n  });\n  npmrc.addRegistry(\"https://my.registry.com/private\", \"@company\");\n\n  const out = synthSnapshot(prj);\n  expect(out[\".npmrc\"]).toMatchSnapshot();\n});\n\ntest(\"default registry is used correctly\", () => {\n  const prj = new TestNodeProject({\n    name: \"test-project\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  const npmrc = new NpmConfig(prj);\n  npmrc.addRegistry(\"https://my.registry.com/private\", \"@company\");\n\n  const out = synthSnapshot(prj);\n  expect(out[\".npmrc\"]).toMatchSnapshot();\n});\n\ntest(\"override default registry via setter\", () => {\n  const prj = new TestNodeProject({\n    name: \"test-project\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  const npmrc = new NpmConfig(prj, {\n    registry: \"https://my.registry.com/mirror\",\n  });\n  npmrc.addRegistry(\"https://my.registry.com/mirror2\");\n  npmrc.addRegistry(\"https://my.registry.com/private\", \"@company\");\n\n  const out = synthSnapshot(prj);\n  expect(out[\".npmrc\"]).toMatchSnapshot();\n});\n\ntest(\"generic prop is set correctly\", () => {\n  const prj = new TestNodeProject({\n    name: \"test-project\",\n    defaultReleaseBranch: \"main\",\n  });\n\n  const npmrc = new NpmConfig(prj);\n  npmrc.addConfig(\"key\", \"value\");\n\n  const out = synthSnapshot(prj);\n  expect(out[\".npmrc\"]).toMatchSnapshot();\n});\n\nclass TestNodeProject extends NodeProject {\n  constructor(options: Partial<NodeProjectOptions> = {}) {\n    super({\n      name: \"test-node-project\",\n      defaultReleaseBranch: \"master\",\n      ...options,\n    });\n  }\n}\n"
  },
  {
    "path": "test/javascript/prettier.test.ts",
    "content": "import { SourceCode } from \"../../src\";\nimport { ArrowParens, NodeProject, TrailingComma } from \"../../src/javascript\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"prettier\", () => {\n  test(\"snapshot\", () => {\n    // GIVEN\n    const project = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"master\",\n      prettier: true,\n      prettierOptions: { settings: { printWidth: 140 } },\n    });\n\n    // THEN\n    expect(synthSnapshot(project)[\".prettierrc.json\"]).toMatchSnapshot();\n  });\n\n  test(\"snapshot with ignore\", () => {\n    // GIVEN\n    const project = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"master\",\n      prettier: true,\n      prettierOptions: { settings: { printWidth: 140 } },\n    });\n\n    project.prettier?.ignoreFile?.addPatterns(\"build\");\n\n    // THEN\n    expect(synthSnapshot(project)[\".prettierignore\"]).toMatchSnapshot();\n  });\n\n  test(\"sample config is created\", () => {\n    // GIVEN\n    const project = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"master\",\n      prettier: true,\n      prettierOptions: {\n        settings: {\n          trailingComma: TrailingComma.ALL,\n          bracketSpacing: true,\n          tabWidth: 2,\n          semi: true,\n          singleQuote: true,\n          arrowParens: ArrowParens.ALWAYS,\n          printWidth: 140,\n          useTabs: false,\n          parser: \"typescript\",\n        },\n      },\n    });\n\n    // THEN\n    expect(project.prettier?.settings).toMatchObject({\n      trailingComma: \"all\",\n      bracketSpacing: true,\n      tabWidth: 2,\n      semi: true,\n      singleQuote: true,\n      arrowParens: \"always\",\n      printWidth: 140,\n      useTabs: false,\n      parser: \"typescript\",\n    });\n  });\n\n  test(\"snapshot with ignore\", () => {\n    // GIVEN\n    const project = new NodeProject({\n      name: \"test\",\n      defaultReleaseBranch: \"master\",\n      prettier: true,\n    });\n    new SourceCode(project, \"src/example.ts\");\n\n    // THEN\n    expect(synthSnapshot(project)[\".prettierignore\"]).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "test/javascript/upgrade-dependencies.test.ts",
    "content": "import * as yaml from \"yaml\";\nimport { GithubCredentials } from \"../../src/github\";\nimport {\n  NodeProject,\n  NodeProjectOptions,\n  UpgradeDependenciesSchedule,\n} from \"../../src/javascript\";\nimport { TaskRuntime } from \"../../src/task-runtime\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"upgrades command includes all dependencies\", () => {\n  const project = createProject({\n    deps: [\"some-dep\"],\n  });\n\n  const tasks = synthSnapshot(project)[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[7].exec).toStrictEqual(`yarn upgrade`); // implicitly all dependencies\n});\n\ntest(\"upgrades command includes dependencies added post instantiation\", () => {\n  const project = createProject({});\n\n  project.addDeps(\"some-dep\");\n\n  const tasks = synthSnapshot(project)[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[7].exec).toStrictEqual(`yarn upgrade`); // implicitly all dependencies\n});\n\ntest(\"upgrades command doesn't include ignored packages\", () => {\n  const project = createProject({\n    deps: [\"dep1\", \"dep2\"],\n    depsUpgradeOptions: {\n      exclude: [\"dep2\"],\n    },\n  });\n\n  const deps = \"jest jest-junit npm-check-updates projen standard-version dep1\";\n\n  const tasks = synthSnapshot(project)[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[7].exec).toStrictEqual(`yarn upgrade ${deps}`);\n});\n\ntest(\"upgrades command includes only included packages\", () => {\n  const project = createProject({\n    deps: [\"dep1\", \"dep2\"],\n    depsUpgradeOptions: {\n      include: [\"dep1\"],\n    },\n  });\n\n  const deps = \"dep1\";\n\n  const tasks = synthSnapshot(project)[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[7].exec).toStrictEqual(`yarn upgrade ${deps}`); // implicitly all dependencies\n});\n\ntest(\"upgrade task can be overwritten\", () => {\n  const project = createProject({\n    depsUpgrade: true,\n  });\n\n  project.removeTask(\"upgrade\");\n  const newTask = project.addTask(\"upgrade\");\n  newTask.exec(\"echo 'hello world'\");\n\n  const tasks = synthSnapshot(project)[TaskRuntime.MANIFEST_FILE].tasks;\n\n  expect(tasks.upgrade.steps[0].exec).toStrictEqual(`echo 'hello world'`);\n});\n\ntest(\"upgrade workflow can be overwritten\", () => {\n  const project = createProject({\n    depsUpgrade: true,\n    github: true,\n  });\n\n  project\n    .tryFindObjectFile(\".github/workflows/upgrade-main.yml\")\n    ?.addOverride(\"hello\", \"world\");\n\n  const snapshot = synthSnapshot(project);\n  const upgrade = yaml.parse(snapshot[\".github/workflows/upgrade-main.yml\"]);\n  expect(upgrade.hello).toStrictEqual(\"world\");\n});\n\ntest(\"default options\", () => {\n  const project = createProject();\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toMatchSnapshot();\n});\n\ntest(\"custom options\", () => {\n  const project = createProject({\n    depsUpgradeOptions: {\n      workflowOptions: {\n        schedule: UpgradeDependenciesSchedule.MONTHLY,\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toMatchSnapshot();\n});\n\ntest(\"disables automatic upgrades\", () => {\n  const project = createProject({\n    depsUpgradeOptions: {\n      workflowOptions: {\n        schedule: UpgradeDependenciesSchedule.NEVER,\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toMatchSnapshot();\n});\n\ntest(\"with a GitHub app for authentication\", () => {\n  const project = createProject({\n    githubOptions: {\n      projenCredentials: GithubCredentials.fromApp(),\n    },\n    depsUpgradeOptions: {\n      workflowOptions: {\n        schedule: UpgradeDependenciesSchedule.MONTHLY,\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toMatchSnapshot();\n});\n\ntest(\"branches default to release branches\", () => {\n  const project = createProject({\n    majorVersion: 1,\n    releaseBranches: {\n      branch1: { majorVersion: 2 },\n      branch2: { majorVersion: 3 },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toMatchSnapshot();\n  expect(snapshot[\".github/workflows/upgrade-branch1.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-branch1.yml\"]).toMatchSnapshot();\n  expect(snapshot[\".github/workflows/upgrade-branch2.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-branch2.yml\"]).toMatchSnapshot();\n});\n\ntest(\"considers branches added post project instantiation\", () => {\n  const project = createProject({\n    majorVersion: 1,\n    releaseBranches: {\n      branch1: { majorVersion: 2 },\n    },\n  });\n\n  project.release?.addBranch(\"branch2\", { majorVersion: 3 });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-main.yml\"]).toMatchSnapshot();\n  expect(snapshot[\".github/workflows/upgrade-branch1.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-branch1.yml\"]).toMatchSnapshot();\n  expect(snapshot[\".github/workflows/upgrade-branch2.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-branch2.yml\"]).toMatchSnapshot();\n});\n\ntest(\"can upgrade multiple branches\", () => {\n  const project = createProject({\n    depsUpgradeOptions: {\n      workflowOptions: {\n        branches: [\"branch1\", \"branch2\"],\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\".github/workflows/upgrade-branch1.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-branch1.yml\"]).toMatchSnapshot();\n  expect(snapshot[\".github/workflows/upgrade-branch2.yml\"]).toBeDefined();\n  expect(snapshot[\".github/workflows/upgrade-branch2.yml\"]).toMatchSnapshot();\n});\n\ntest(\"git identity can be customized\", () => {\n  const project = createProject({\n    depsUpgradeOptions: {\n      workflowOptions: {\n        gitIdentity: {\n          name: \"Foo Bar\",\n          email: \"foo@bar.com\",\n        },\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  const upgrade = yaml.parse(snapshot[\".github/workflows/upgrade-main.yml\"]);\n  expect(upgrade.jobs.pr.steps[3]).toEqual({\n    name: \"Set git identity\",\n    run: [\n      'git config user.name \"Foo Bar\"',\n      'git config user.email \"foo@bar.com\"',\n    ].join(\"\\n\"),\n  });\n});\n\ntest(\"github runner can be customized\", () => {\n  const project = createProject({\n    depsUpgradeOptions: {\n      workflowOptions: {\n        runsOn: [\"self-hosted\"],\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  const upgrade = yaml.parse(snapshot[\".github/workflows/upgrade-main.yml\"]);\n  expect(upgrade.jobs.upgrade[\"runs-on\"]).toEqual(\"self-hosted\");\n  expect(upgrade.jobs.pr[\"runs-on\"]).toEqual(\"self-hosted\");\n});\n\ntest(\"labels and assignees can be customized\", () => {\n  const project = createProject({\n    depsUpgradeOptions: {\n      workflowOptions: {\n        labels: [\"deps-upgrade-label\"],\n        assignees: [\"repo-maintainer\"],\n      },\n    },\n  });\n\n  const snapshot = synthSnapshot(project);\n  const upgrade = yaml.parse(snapshot[\".github/workflows/upgrade-main.yml\"]);\n  expect(upgrade.jobs.pr.steps[4].with.labels).toEqual(\"deps-upgrade-label\");\n  expect(upgrade.jobs.pr.steps[4].with.assignees).toEqual(\"repo-maintainer\");\n});\n\ntest(\"upgrade task created without projen defined versions at NodeProject\", () => {\n  const prj = new NodeProject({\n    defaultReleaseBranch: \"main\",\n    name: \"test project\",\n    deps: [\"npm@^8\", \"axios@~0.20.0\", \"markdownlint@0.24.0\"],\n  });\n  const tasks = synthSnapshot(prj)[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[1].exec).toStrictEqual(\n    \"npm-check-updates --dep dev --upgrade --target=minor --reject='axios,markdownlint'\"\n  );\n});\n\nfunction createProject(\n  options: Omit<\n    NodeProjectOptions,\n    \"outdir\" | \"defaultReleaseBranch\" | \"name\" | \"dependenciesUpgrade\"\n  > = {}\n): NodeProject {\n  return new NodeProject({\n    defaultReleaseBranch: \"main\",\n    name: \"node-project\",\n    ...options,\n  });\n}\n"
  },
  {
    "path": "test/json/__snapshots__/projenrc.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`projenrc.json default project 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"env\": Object {\n          \"FILENAME\": \".projenrc.json\",\n        },\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"run-projenrc-json\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`projenrc.json with typed options 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"env\": Object {\n          \"FILENAME\": \".projenrc.json\",\n        },\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"run-projenrc-json\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \".projenrc.json\": Object {\n    \"name\": \"@example/foo\",\n    \"npmAccess\": \"public\",\n    \"staleOptions\": Object {\n      \"issues\": Object {\n        \"daysBeforeStale\": 100,\n      },\n      \"pullRequest\": Object {\n        \"enabled\": false,\n      },\n    },\n    \"type\": \"projen.typescript.TypeScriptProject\",\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n"
  },
  {
    "path": "test/json/projenrc.test.ts",
    "content": "import { renderProjenInitOptions } from \"../../src/javascript/render-options\";\nimport { Projenrc } from \"../../src/projenrc-json\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"projenrc.json default project\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Projenrc(project);\n\n  // THEN\n  expect(synthSnapshot(project)).toMatchSnapshot();\n});\n\ntest(\"projenrc.json with typed options\", () => {\n  // GIVEN\n  const project = new TestProject(\n    renderProjenInitOptions(\"projen.typescript.TypeScriptProject\", {\n      staleOptions: {\n        issues: {\n          daysBeforeStale: 100, // number, nested option\n        },\n        pullRequest: {\n          enabled: false, // boolean, nested option\n        },\n      },\n      name: \"@example/foo\", // string\n      npmAccess: \"public\", // enum provided as string\n    })\n  );\n\n  // WHEN\n  new Projenrc(project);\n\n  // THEN\n  expect(synthSnapshot(project)).toMatchSnapshot();\n});\n"
  },
  {
    "path": "test/json.test.ts",
    "content": "import { readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { JsonFile } from \"../src\";\nimport { writeFile } from \"../src/util\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"json object can be mutated before synthesis\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {\n    hello: \"world\",\n  };\n\n  new JsonFile(prj, \"my/json/file.json\", { obj, marker: false });\n\n  // mutate obj (should be reflected in the output)\n  obj.anotherField = {\n    foo: 1234,\n  };\n\n  expect(synthSnapshot(prj)[\"my/json/file.json\"]).toStrictEqual({\n    hello: \"world\",\n    anotherField: { foo: 1234 },\n  });\n});\n\ntest(\"omitEmpty\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  new JsonFile(p, \"file.json\", {\n    omitEmpty: true,\n    obj: {\n      hello: 1234,\n      empty: {},\n      array_with_undefined: [undefined, 123, 456],\n      child: {\n        with: \"hello\",\n        empty: {\n          subchild: {},\n        },\n        empty_strings_are_not_omitted: \"\",\n        zeros_are_not_omitted: 0,\n        empty_array: [],\n        array_with_empty_objects: [{}, 123],\n        array_with_empty_subobjects: [\n          {\n            i_am_empty: {},\n            i_am_not: \"hi there\",\n          },\n          {\n            just: 1234,\n          },\n        ],\n      },\n    },\n    marker: false,\n  });\n\n  // THEN\n  expect(synthSnapshot(p)[\"file.json\"]).toStrictEqual({\n    hello: 1234,\n    array_with_undefined: [123, 456], // undefined is skipped\n    child: {\n      with: \"hello\",\n      empty_strings_are_not_omitted: \"\",\n      zeros_are_not_omitted: 0,\n      array_with_empty_objects: [123],\n      array_with_empty_subobjects: [\n        {\n          i_am_not: \"hi there\",\n        },\n        {\n          just: 1234,\n        },\n      ],\n    },\n  });\n});\n\ntest(\"json file can contain projen marker\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {};\n\n  const file = new JsonFile(prj, \"my/json/file-marker.json\", {\n    obj,\n    marker: true,\n  });\n\n  const output = synthSnapshot(prj)[\"my/json/file-marker.json\"];\n\n  expect(output[\"//\"]).toBe(file.marker);\n});\n\ntest(\"json5 file can contain projen marker as comment\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {};\n\n  const file = new JsonFile(prj, \"my/json/file-marker.json5\", {\n    obj,\n    marker: true,\n  });\n\n  const output = synthSnapshot(prj)[\"my/json/file-marker.json5\"];\n\n  expect(output).toContain(`// ${file.marker}`);\n});\n\ntest(\"jsonc file can contain projen marker as comment\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {};\n\n  const file = new JsonFile(prj, \"my/json/file-marker.jsonc\", {\n    obj,\n    marker: true,\n  });\n\n  const output = synthSnapshot(prj)[\"my/json/file-marker.jsonc\"];\n\n  expect(output).toContain(`// ${file.marker}`);\n});\n\ntest(\"json file with allowComments can contain projen marker as comment\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {};\n\n  const file = new JsonFile(prj, \"my/json/file-marker.json\", {\n    obj,\n    marker: true,\n    allowComments: true,\n  });\n\n  const output = synthSnapshot(prj, {\n    parseJson: false,\n  })[\"my/json/file-marker.json\"];\n\n  expect(output).toContain(`// ${file.marker}`);\n});\n\ndescribe(\"newline\", () => {\n  const obj = {\n    hello: \"world\",\n  };\n\n  test(\"is enabled by default\", () => {\n    const prj = new TestProject();\n\n    new JsonFile(prj, \"hello.json\", { obj });\n\n    prj.synth();\n    const output = readFileSync(join(prj.outdir, \"hello.json\"), \"utf-8\");\n    expect(output.endsWith(\"\\n\")).toBe(true);\n  });\n\n  test(\"can be disabled\", () => {\n    const prj = new TestProject();\n\n    new JsonFile(prj, \"hello.json\", { obj, newline: false });\n\n    prj.synth();\n    const output = readFileSync(join(prj.outdir, \"hello.json\"), \"utf-8\");\n    expect(output.endsWith(\"\\n\")).toBe(false);\n  });\n});\n\ndescribe(\"changed\", () => {\n  const obj = { hello: \"world\" };\n\n  it('is \"undefined\" before synthesis', () => {\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"hello.json\", { obj });\n    expect(file.changed).toBeUndefined();\n  });\n\n  it('is set to \"true\" for new files', () => {\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"hello.json\", { obj });\n    prj.synth();\n    expect(file.changed).toBeTruthy();\n  });\n\n  it('is set to \"true\" if the file changed', () => {\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"hello.json\", { obj });\n    writeFileSync(\n      join(prj.outdir, \"hello.json\"),\n      JSON.stringify({ hello: \"world1\" }, undefined, 2)\n    );\n    prj.synth();\n    expect(file.changed).toBeTruthy();\n  });\n\n  it('is set to \"true\" if the file permissions changed', () => {\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"hello.json\", {\n      obj,\n      newline: false,\n      marker: false,\n    });\n    writeFile(\n      join(prj.outdir, \"hello.json\"),\n      JSON.stringify(obj, undefined, 2),\n      { readonly: true, executable: true }\n    );\n    prj.synth();\n    expect(file.changed).toBeTruthy();\n  });\n\n  it('is set to \"false\" if the file did not change', () => {\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"hello.json\", {\n      obj,\n      newline: false,\n      marker: false,\n    });\n    writeFile(\n      join(prj.outdir, \"hello.json\"),\n      JSON.stringify(obj, undefined, 2),\n      { readonly: true, executable: false }\n    );\n    prj.synth();\n    expect(file.changed).toStrictEqual(false);\n  });\n});\n"
  },
  {
    "path": "test/license.test.ts",
    "content": "import { License } from \"../src/license\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"apache with defaults\", () => {\n  const project = new TestProject();\n\n  new License(project, {\n    spdx: \"Apache-2.0\",\n  });\n\n  expect(synthSnapshot(project).LICENSE).toMatchSnapshot();\n});\n\ntest(\"fails for MIT with no owner because substitution is required\", () => {\n  const project = new TestProject();\n\n  expect(\n    () =>\n      new License(project, {\n        spdx: \"MIT\",\n      })\n  ).toThrow(/The MIT license requires \\\"copyrightOwner\\\" to be specified/);\n});\n\ntest(\"MIT with owner\", () => {\n  const project = new TestProject();\n\n  new License(project, {\n    spdx: \"MIT\",\n    copyrightOwner: \"John Doe\",\n  });\n\n  expect(synthSnapshot(project).LICENSE).toMatchSnapshot();\n});\n\ntest(\"MIT with owner and period\", () => {\n  const project = new TestProject();\n\n  new License(project, {\n    spdx: \"MIT\",\n    copyrightOwner: \"John Doe\",\n    copyrightPeriod: \"1900-1920\",\n  });\n\n  expect(synthSnapshot(project).LICENSE).toMatchSnapshot();\n});\n\ntest(\"fails for MIT-0 with no owner because substitution is required\", () => {\n  const project = new TestProject();\n\n  expect(\n    () =>\n      new License(project, {\n        spdx: \"MIT-0\",\n      })\n  ).toThrow(/The MIT-0 license requires \\\"copyrightOwner\\\" to be specified/);\n});\n\ntest(\"MIT-0 with owner\", () => {\n  const project = new TestProject();\n\n  new License(project, {\n    spdx: \"MIT-0\",\n    copyrightOwner: \"John Doe\",\n  });\n\n  expect(synthSnapshot(project).LICENSE).toMatchSnapshot();\n});\n\ntest(\"MIT-0 with owner and period\", () => {\n  const project = new TestProject();\n\n  new License(project, {\n    spdx: \"MIT-0\",\n    copyrightOwner: \"John Doe\",\n    copyrightPeriod: \"1900-1920\",\n  });\n\n  expect(synthSnapshot(project).LICENSE).toMatchSnapshot();\n});\n"
  },
  {
    "path": "test/makefile.test.ts",
    "content": "import { Makefile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"makefile synthesizes correctly\", () => {\n  const prj = new TestProject();\n\n  new Makefile(prj, \"Makefile\", {\n    all: [\"one\", \"two\", \"three\"],\n    rules: [\n      {\n        targets: [\"one\"],\n        recipe: [\"touch one\"],\n        phony: false,\n      },\n      {\n        targets: [\"two\", \"three\"],\n        prerequisites: [\"one\"],\n        recipe: [\"touch $@\"],\n      },\n      {\n        targets: [\"clean\"],\n        recipe: [\"rm -f one two three\"],\n        phony: true,\n      },\n    ],\n  });\n\n  expect(synthSnapshot(prj).Makefile).toStrictEqual(\n    [\n      \".PHONY: all\",\n      \"all: one two three\",\n      \"\",\n      \"one:\",\n      \"\\ttouch one\",\n      \"\",\n      \"two three: one\",\n      \"\\ttouch $@\",\n      \"\",\n      \".PHONY: clean\",\n      \"clean:\",\n      \"\\trm -f one two three\",\n      \"\", // new line at end of file\n    ].join(\"\\n\")\n  );\n});\n\ntest(\"makefile synthesizes correctly using imperative API\", () => {\n  const prj = new TestProject();\n\n  new Makefile(prj, \"Makefile\")\n    .addRule({\n      targets: [\"one\"],\n      recipe: [\"touch one\"],\n      phony: false,\n    })\n    .addRules(\n      {\n        targets: [\"two\", \"three\"],\n        prerequisites: [\"one\"],\n        recipe: [\"touch $@\"],\n      },\n      {\n        targets: [\"clean\"],\n        recipe: [\"rm -f one two three\"],\n        phony: true,\n      }\n    )\n    .addAll(\"one\")\n    .addAlls(\"two\", \"three\");\n\n  expect(synthSnapshot(prj).Makefile).toStrictEqual(\n    [\n      \".PHONY: all\",\n      \"all: one two three\",\n      \"\",\n      \"one:\",\n      \"\\ttouch one\",\n      \"\",\n      \"two three: one\",\n      \"\\ttouch $@\",\n      \"\",\n      \".PHONY: clean\",\n      \"clean:\",\n      \"\\trm -f one two three\",\n      \"\", // new line at end of file\n    ].join(\"\\n\")\n  );\n});\n"
  },
  {
    "path": "test/new.test.ts",
    "content": "// tests for `projen new`: we run `projen new` for each supported project type\n// and compare against a golden snapshot.\nimport { join } from \"path\";\nimport { pathExistsSync } from \"fs-extra\";\nimport * as inventory from \"../src/inventory\";\nimport { execCapture } from \"../src/util\";\nimport {\n  directorySnapshot,\n  execProjenCLI,\n  synthSnapshot,\n  synthSnapshotWithPost,\n  TestProject,\n  withProjectDir,\n} from \"./util\";\n\nfor (const type of inventory.discover()) {\n  test(`projen new ${type.pjid}`, () => {\n    withProjectDir((projectdir) => {\n      // execute `projen new PJID --no-synth` in the project directory\n      execProjenCLI(projectdir, [\"new\", \"--no-synth\", type.pjid]);\n\n      // compare generated .projenrc.js to the snapshot\n      const actual = directorySnapshot(projectdir, {\n        excludeGlobs: [\".git/**\"],\n      });\n\n      expect(actual).toMatchSnapshot();\n    });\n  });\n}\n\ntest(\"post-synthesis option enabled\", () => {\n  const project = new TestProject();\n\n  expect(synthSnapshotWithPost(project)[\".postsynth\"]).toContain(\"postsynth\");\n});\n\ntest(\"post-synthesis option disabled\", () => {\n  const project = new TestProject();\n\n  expect(synthSnapshot(project)[\".postsynth\"]).toBeUndefined();\n});\n\n/**\n * commented out due to breaking changes in projen@0.37.0\n\ntest('projen new --from external', () => {\n  withProjectDir(projectdir => {\n\n    // execute `projen new --from cdk-appsync-project` in the project directory\n    execProjenCLI(projectdir, ['new', '--from', 'cdk-appsync-project@1.1.3', '--no-post', MIN_NODE_VERSION_OPTION]);\n\n    // patch the projen version in package.json to match the current version\n    // otherwise, every bump would need to update these snapshots.\n    sanitizeOutput(projectdir);\n\n    // compare generated .projenrc.js to the snapshot\n    const actual = directorySnapshot(projectdir, {\n      excludeGlobs: [\n        '.git/**',\n        '.github/**',\n        'node_modules/**',\n        'yarn.lock',\n      ],\n    });\n\n    expect(actual).toMatchSnapshot();\n    expect(actual['schema.graphql']).toBeDefined();\n\n  });\n});\n\ntest('projen new --from external tarball', () => {\n  withProjectDir(projectdir => {\n    const shell = (command: string) => execSync(command, { cwd: projectdir });\n    // downloads cdk-appsync-project-1.1.3.tgz\n    shell('npm pack cdk-appsync-project@1.1.3');\n\n    execProjenCLI(projectdir, ['new', '--from', './cdk-appsync-project-1.1.3.tgz', '--no-post', MIN_NODE_VERSION_OPTION]);\n\n    // patch the projen version in package.json to match the current version\n    // otherwise, every bump would need to update these snapshots.\n    sanitizeOutput(projectdir);\n\n    // compare generated .projenrc.js to the snapshot\n    const actual = directorySnapshot(projectdir, {\n      excludeGlobs: [\n        '.git/**',\n        '.github/**',\n        'node_modules/**',\n        'yarn.lock',\n      ],\n    });\n\n    expect(actual['package.json']).toMatchSnapshot();\n    expect(actual['.projenrc.js']).toMatchSnapshot();\n    expect(actual['schema.graphql']).toBeDefined();\n  });\n});\n\ntest('projen new --from external dist tag', () => {\n  withProjectDir(projectdir => {\n    execProjenCLI(projectdir, ['new', '--from', 'cdk-appsync-project@latest', '--no-post', MIN_NODE_VERSION_OPTION]);\n\n    // compare generated .projenrc.js to the snapshot\n    const actual = directorySnapshot(projectdir, {\n      excludeGlobs: [\n        '.git/**',\n        '.github/**',\n        'node_modules/**',\n        'yarn.lock',\n      ],\n    });\n\n    // Not doing a snapshot test because @latest is used\n    expect(actual['schema.graphql']).toBeDefined();\n  });\n});\n\ntest('options are not overwritten when creating from external project types', () => {\n  withProjectDir(projectdir => {\n\n    // execute `projen new --from cdk-appsync-project` in the project directory\n    execProjenCLI(projectdir, ['new', '--from', 'cdk-appsync-project@1.1.3', '--no-synth', '--cdk-version', '1.63.0', MIN_NODE_VERSION_OPTION]);\n\n    // compare generated .projenrc.js to the snapshot\n    const actual = directorySnapshot(projectdir, {\n      excludeGlobs: [\n        '.git/**',\n        '.github/**',\n        'node_modules/**',\n        'yarn.lock',\n      ],\n    });\n\n    expect(actual['.projenrc.js']).toContain('cdkVersion: \\'1.63.0\\'');\n  });\n});\n\ntest('can choose from one of multiple external project types', () => {\n  withProjectDir(projectdir => {\n\n    // execute `projen new --from cdk-appsync-project` in the project directory\n    execProjenCLI(projectdir, ['new', '--from', '@taimos/projen@0.0.126', 'taimos-ts-lib', '--no-post', MIN_NODE_VERSION_OPTION]);\n\n    // patch the projen version in package.json to match the current version\n    // otherwise, every bump would need to update these snapshots.\n    sanitizeOutput(projectdir);\n\n    // compare generated .projenrc.js to the snapshot\n    const actual = directorySnapshot(projectdir, {\n      excludeGlobs: [\n        '.git/**',\n        '.github/**',\n        'node_modules/**',\n        'yarn.lock',\n      ],\n    });\n\n    expect(actual['.projenrc.js']).toContain('@taimos/projen@0.0.126');\n  });\n});\n\n**/\n\ntest(\"projen new --no-comments\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\"new\", \"node\", \"--no-comments\", \"--no-synth\"]);\n\n    const projenrc = directorySnapshot(projectdir)[\".projenrc.js\"];\n    expect(projenrc).toBeDefined();\n    expect(projenrc).not.toMatch(\"//\");\n  });\n});\n\ntest(\"creating node project with enum-typed CLI arg\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\n      \"new\",\n      \"node\",\n      \"--package-manager\",\n      \"npm\",\n      \"--no-synth\",\n    ]);\n\n    const projenrc = directorySnapshot(projectdir)[\".projenrc.js\"];\n    expect(projenrc).toMatchSnapshot();\n  });\n});\n\ntest(\"creating python project with enum-typed CLI arg\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\n      \"new\",\n      \"python\",\n      \"--project-type\",\n      \"lib\",\n      \"--projenrc-python\",\n      \"--no-synth\",\n    ]);\n\n    const projenrc = directorySnapshot(projectdir)[\".projenrc.py\"];\n    expect(projenrc).toMatchSnapshot();\n  });\n});\n\ntest(\"creating java project with enum-typed CLI arg\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\n      \"new\",\n      \"java\",\n      \"--project-type\",\n      \"lib\",\n      \"--projenrc-java\",\n      \"--no-synth\",\n    ]);\n\n    const projenrc =\n      directorySnapshot(projectdir)[\"src/test/java/projenrc.java\"];\n    expect(projenrc).toMatchSnapshot();\n  });\n});\n\ntest(\"projenrc-json creates node-project\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\"new\", \"node\", \"--projenrc-json\", \"--no-synth\"]);\n\n    const projenrc = directorySnapshot(projectdir)[\".projenrc.json\"];\n    expect(projenrc).toMatchSnapshot();\n  });\n});\n\ntest(\"projenrc-json creates java project\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\"new\", \"java\", \"--projenrc-json\"]);\n\n    expect(directorySnapshot(projectdir)).toMatchSnapshot();\n  });\n});\n\n/**\n * commented out due to breaking changes in projen@0.37.0\n\ntest('projenrc-json creates external project type', () => {\n  withProjectDir(projectdir => {\n    execProjenCLI(projectdir, ['new', '--from', 'cdk-appsync-project@1.1.3', '--cdk-version', '1.63.0', '--projenrc-json', '--no-synth', MIN_NODE_VERSION_OPTION]);\n\n    // exclude node_modules to work around bug where node_modules is generated AND one of the\n    // dependencies includes a file with .json extension that isn't valid JSON\n    const projenrc = directorySnapshot(projectdir, { excludeGlobs: ['node_modules/**'] })['.projenrc.json'];\n    expect(projenrc).toMatchSnapshot();\n  });\n});\n\n*/\n\ntest(\"projenrc-ts creates typescript projenrc\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\n      \"new\",\n      \"typescript\",\n      \"--projenrc-ts\",\n      \"--no-synth\",\n    ]);\n    const projenrc = directorySnapshot(projectdir)[\".projenrc.ts\"];\n    expect(projenrc).toMatchSnapshot();\n  });\n});\n\ntest(\"python project includes .projenrc.py by default\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\"new\", \"python\", \"--no-synth\"]);\n\n    const output = directorySnapshot(projectdir);\n    expect(output[\".projenrc.py\"]).toBeDefined();\n  });\n});\n\ntest(\"python project can include .projenrc.js\", () => {\n  withProjectDir((projectdir) => {\n    execProjenCLI(projectdir, [\"new\", \"python\", \"--projenrc-js\", \"--no-synth\"]);\n\n    const output = directorySnapshot(projectdir);\n    expect(output[\".projenrc.py\"]).toBeUndefined();\n    expect(output[\".projenrc.js\"]).toBeDefined();\n  });\n});\n\n// test(\"projen new node --outdir path/to/mydir\", () => {\n//   withProjectDir((projectdir) => {\n//     // GIVEN\n//     const shell = (command: string) => execSync(command, { cwd: projectdir });\n//     shell(`mkdir -p ${join(\"path\", \"to\", \"mydir\")}`);\n\n//     // WHEN\n//     execProjenCLI(projectdir, [\"new\", \"node\", \"--outdir\", \"path/to/mydir\"]);\n\n//     // THEN\n//     const targetDirSnapshot = directorySnapshot(\n//       join(projectdir, \"path\", \"to\", \"mydir\"),\n//       { excludeGlobs: [\"node_modules/**\"] }\n//     );\n//     expect(targetDirSnapshot[\".projenrc.js\"]).toMatchSnapshot();\n//     expect(targetDirSnapshot[\"package.json\"]).toBeDefined();\n//   });\n// });\n\ndescribe(\"git\", () => {\n  test(\"--git (default) will initialize a git repo and create a commit\", () => {\n    withProjectDir((projectdir) => {\n      execProjenCLI(projectdir, [\"new\", \"project\"]);\n      expect(\n        execCapture(\"git log\", { cwd: projectdir })\n          .toString(\"utf8\")\n          .includes(\"chore: project created with projen\")\n      ).toBeTruthy();\n    });\n  });\n\n  test(\"--no-git will not create a git repo\", () => {\n    withProjectDir(\n      (projectdir) => {\n        execProjenCLI(projectdir, [\"new\", \"project\", \"--no-git\"]);\n        expect(pathExistsSync(join(projectdir, \".git\"))).toBeFalsy();\n      },\n      { git: false }\n    );\n  });\n});\n"
  },
  {
    "path": "test/object-file.test.ts",
    "content": "import { ObjectFile } from \"../src\";\nimport { JsonFile } from \"../src/json\";\nimport { JsonPatch } from \"../src/json-patch\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\nclass ChildObjectFile extends ObjectFile {}\n\ntest(\"json object can be mutated before synthesis\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {\n    hello: \"world\",\n  };\n\n  new ChildObjectFile(prj, \"my/object/file.json\", { obj, marker: false });\n\n  // mutate obj (should be reflected in the output)\n  obj.anotherField = {\n    foo: 1234,\n  };\n\n  expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n    hello: \"world\",\n    anotherField: { foo: 1234 },\n  });\n});\n\ndescribe(\"overrides\", () => {\n  test(\"addOverride(p, v) allows assigning arbitrary values to synthesized resource definitions\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: { initialObj: \"must be nonempty\" },\n      marker: false,\n    });\n\n    // WHEN\n    file.addOverride(\"metadata\", { key: 12 });\n    file.addOverride(\"use.dot.notation\", \"to create subtrees\");\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      initialObj: \"must be nonempty\",\n      use: { dot: { notation: \"to create subtrees\" } },\n      metadata: { key: 12 },\n    });\n  });\n\n  test(\"addOverride(p, v) allows indexing into arrays to reach particular paths\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: {\n        myArray: [1, 2, { foo: \"bar\" }],\n      },\n      marker: false,\n    });\n\n    // WHEN\n    file.addOverride(\"myArray.0\", 123);\n    file.addOverride(\"myArray.2.foo\", \"baz\");\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      myArray: [123, 2, { foo: \"baz\" }],\n    });\n  });\n\n  test(\"addOverride(p, undefined) can be used to delete a value\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: {\n        hello: {\n          world: {\n            value1: \"Hello\",\n            value2: 129,\n          },\n        },\n      },\n      marker: false,\n    });\n\n    // WHEN\n    file.addOverride(\"hello.world.value2\", undefined);\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      hello: {\n        world: {\n          value1: \"Hello\",\n        },\n      },\n    });\n  });\n\n  test(\"addOverride(p, undefined) will not create empty trees\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: { initialObj: \"must be nonempty\" },\n      marker: false,\n    });\n\n    // WHEN\n    file.addOverride(\"tree.exists\", 42);\n    file.addOverride(\"tree.does.not.exist\", undefined);\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      initialObj: \"must be nonempty\",\n      tree: {\n        exists: 42,\n      },\n    });\n  });\n\n  test(\"addDeletionOverride(p) is sugar for `undefined`\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: {\n        hello: {\n          world: {\n            value1: \"Hello\",\n            value2: 129,\n            value3: [\"foo\", \"bar\"],\n          },\n        },\n      },\n      marker: false,\n    });\n\n    // WHEN\n    file.addDeletionOverride(\"hello.world.value2\");\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      hello: {\n        world: {\n          value1: \"Hello\",\n          value3: [\"foo\", \"bar\"],\n        },\n      },\n    });\n  });\n\n  test(\"addOverride(p, v) will overwrite any non-objects along the path\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: {\n        hello: {\n          world: 42,\n        },\n      },\n      marker: false,\n    });\n\n    // WHEN\n    file.addOverride(\"override1\", [\"Hello\", 123]);\n    file.addOverride(\"override1.override2\", { foo: [1] });\n    file.addOverride(\"hello.world.foo.bar\", 42);\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      hello: { world: { foo: { bar: 42 } } },\n      override1: {\n        override2: { foo: [1] },\n      },\n    });\n  });\n\n  test(\"addOverride(p, v) will not split on escaped dots\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: { initialObj: \"cannot be empty\" },\n      marker: false,\n    });\n\n    // WHEN\n    file.addOverride(String.raw`Hello\\.World.Foo\\.Bar\\.Baz`, 42);\n    file.addOverride(String.raw`Single\\Back\\Slashes`, 42);\n    file.addOverride(String.raw`Escaped\\\\.Back\\\\.Slashes`, 42);\n    file.addOverride(String.raw`DoublyEscaped\\\\\\\\Back\\\\\\\\Slashes`, 42);\n    file.addOverride(\"EndWith\\\\\", 42); // Raw string cannot end with a backslash\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      initialObj: \"cannot be empty\",\n      \"Hello.World\": { \"Foo.Bar.Baz\": 42 },\n      SingleBackSlashes: 42,\n      \"Escaped\\\\\": { \"Back\\\\\": { Slashes: 42 } },\n      \"DoublyEscaped\\\\\\\\Back\\\\\\\\Slashes\": 42,\n      \"EndWith\\\\\": 42,\n    });\n  });\n});\n\ndescribe(\"addToArray\", () => {\n  test(\"addToArray(p, v) adds to an existing array\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: { first: { second: { array: [\"initial value\"] } } },\n      marker: false,\n    });\n\n    // WHEN\n    file.addToArray(\n      \"first.second.array\",\n      \"first extra value\",\n      \"second extra value\"\n    );\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      first: {\n        second: {\n          array: [\"initial value\", \"first extra value\", \"second extra value\"],\n        },\n      },\n    });\n  });\n\n  test(\"addToArray(p, v) creates an array\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: {},\n      marker: false,\n    });\n\n    // WHEN\n    file.addToArray(\n      \"first.second.array\",\n      \"first extra value\",\n      \"second extra value\"\n    );\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      first: {\n        second: {\n          array: [\"first extra value\", \"second extra value\"],\n        },\n      },\n    });\n  });\n\n  test(\"addToArray(p, v) replaces an object\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: { first: { second: { object: { some: \"value\" } } } },\n      marker: false,\n    });\n\n    // WHEN\n    file.addToArray(\n      \"first.second.object\",\n      \"first extra value\",\n      \"second extra value\"\n    );\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      first: {\n        second: {\n          object: [\"first extra value\", \"second extra value\"],\n        },\n      },\n    });\n  });\n\n  test(\"addToArray(p, v) works with lazy values\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: {\n        first: {\n          second: {\n            array: () => {\n              return [\"initial value\"];\n            },\n          },\n        },\n      },\n      marker: false,\n    });\n\n    // WHEN\n    file.addToArray(\n      \"first.second.array\",\n      \"first extra value\",\n      \"second extra value\"\n    );\n\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      first: {\n        second: {\n          array: [\"initial value\", \"first extra value\", \"second extra value\"],\n        },\n      },\n    });\n  });\n});\n\ndescribe(\"patch\", () => {\n  test(\"patch(p, v) can add to an existing array\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: { first: { second: { array: [\"initial value\"] } } },\n      marker: false,\n    });\n    // WHEN\n    file.patch(JsonPatch.add(\"/first/second/array/-\", \"first extra value\"));\n    file.patch(JsonPatch.add(\"/first/second/array/-\", \"second extra value\"));\n    file.patch(JsonPatch.add(\"/first/second/array/1\", \"third extra value\"));\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      first: {\n        second: {\n          array: [\n            \"initial value\",\n            \"third extra value\",\n            \"first extra value\",\n            \"second extra value\",\n          ],\n        },\n      },\n    });\n  });\n  test(\"patch(p, v) can create an array\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: { first: { second: {} } },\n      marker: false,\n    });\n    // WHEN\n    file.patch(\n      JsonPatch.add(\"/first/second/array\", []),\n      JsonPatch.add(\"/first/second/array/-\", \"first extra value\"),\n      JsonPatch.add(\"/first/second/array/-\", \"second extra value\")\n    );\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      first: {\n        second: {\n          array: [\"first extra value\", \"second extra value\"],\n        },\n      },\n    });\n  });\n\n  test(\"patch(p, v) can work with lazy values\", () => {\n    // GIVEN\n    const prj = new TestProject();\n    const file = new JsonFile(prj, \"my/object/file.json\", {\n      obj: {\n        first: {\n          second: {\n            array: () => {\n              return [\"initial value\"];\n            },\n          },\n        },\n      },\n      marker: false,\n    });\n    // WHEN\n    file.patch(\n      JsonPatch.add(\"/first/second/array/-\", \"first extra value\"),\n      JsonPatch.add(\"/first/second/array/-\", \"second extra value\")\n    );\n    // THEN\n    expect(synthSnapshot(prj)[\"my/object/file.json\"]).toStrictEqual({\n      first: {\n        second: {\n          array: [\"initial value\", \"first extra value\", \"second extra value\"],\n        },\n      },\n    });\n  });\n});\n"
  },
  {
    "path": "test/pr-template.test.ts",
    "content": "import { GitHub } from \"../src/github\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\nconst PULL_REQUEST_TEMPLATE_FILE = \".github/pull_request_template.md\";\n\ntest(\"default\", () => {\n  // GIVEN\n  const project = new TestProject({ github: false });\n  const github = new GitHub(project);\n\n  // WHEN\n  github.addPullRequestTemplate();\n\n  // THEN\n  expect(synthSnapshot(project)[PULL_REQUEST_TEMPLATE_FILE]).toStrictEqual(\n    \"Fixes #\"\n  );\n});\n\ntest(\"custom content\", () => {\n  // GIVEN\n  const project = new TestProject({ github: false });\n  const github = new GitHub(project);\n\n  // WHEN\n  github.addPullRequestTemplate(\"hello\", \"world\", \"\", \"foobar\");\n\n  // THEN\n  expect(synthSnapshot(project)[PULL_REQUEST_TEMPLATE_FILE]).toStrictEqual(\n    [\"hello\", \"world\", \"\", \"foobar\"].join(\"\\n\")\n  );\n});\n"
  },
  {
    "path": "test/project.test.ts",
    "content": "import * as path from \"path\";\nimport { JsonFile, Project, Testing, TextFile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"file paths are relative to the project outdir\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  const f = new TextFile(p, \"foo/bar.txt\");\n\n  // THEN\n  expect(f.absolutePath).toBe(path.resolve(p.outdir, f.path));\n  expect(path.isAbsolute(f.absolutePath)).toBeTruthy();\n});\n\ntest(\"all files added to the project can be enumerated\", () => {\n  // GIVEN\n  const p = new TestProject();\n  new TextFile(p, \"my.txt\");\n  new JsonFile(p, \"your/file/me.json\", { obj: {} });\n\n  // WHEN\n  const result = p.files;\n\n  // THEN\n  const exp = (e: string) =>\n    expect(result.map((x) => x.path).includes(e)).toBeTruthy();\n  exp(\"my.txt\");\n  exp(\"your/file/me.json\");\n});\n\ntest(\"generated files are commited if commitGenerated is undefined\", () => {\n  // GIVEN\n  const p = new TestProject();\n  new TextFile(p, \"my.txt\");\n\n  // WHEN\n  const gitIgnoreContents = synthSnapshot(p)[\".gitignore\"];\n\n  // THEN\n  expect(gitIgnoreContents).toMatchSnapshot();\n});\n\ntest(\"generated files are commited if commitGenerated is true\", () => {\n  // GIVEN\n  const p = new TestProject({ commitGenerated: true });\n  new TextFile(p, \"my.txt\");\n\n  // WHEN\n  const gitIgnoreContents = synthSnapshot(p)[\".gitignore\"];\n\n  // THEN\n  expect(gitIgnoreContents).toMatchSnapshot();\n});\n\ntest.only(\"generated files are ignored from git if commitGenerated is false\", () => {\n  // GIVEN\n  const p = new TestProject({ commitGenerated: false });\n  new TextFile(p, \"my.txt\");\n\n  // WHEN\n  const gitIgnoreContents = synthSnapshot(p)[\".gitignore\"];\n\n  // THEN\n  expect(gitIgnoreContents).toMatchSnapshot();\n});\n\ntest(\"tryFindFile() can be used to find a file either absolute or relative path\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const file = new JsonFile(p, \"your/file/me.json\", { obj: {} });\n\n  // WHEN\n  const result1 = p.tryFindFile(\"your/file/me.json\");\n  const result2 = p.tryFindFile(path.resolve(p.outdir, \"your/file/me.json\"));\n\n  // THEN\n  expect(result1 === file).toBeTruthy();\n  expect(result2 === file).toBeTruthy();\n});\n\ntest(\"tryFindFile() will also look up files in subprojects\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const child = new Project({\n    name: \"foobar\",\n    parent: p,\n    outdir: \"subproject/foo/bar\",\n  });\n  const fchild = new TextFile(child, \"fchild.txt\");\n\n  // WHEN\n  const result1 = p.tryFindFile(\"subproject/foo/bar/fchild.txt\");\n  const result2 = child.tryFindFile(\"fchild.txt\");\n\n  // THEN\n  expect(result1 === fchild).toBeTruthy();\n  expect(result2 === fchild).toBeTruthy();\n});\n\ntest(\"tryRemoveFile() can be used to remove a file with a relative path\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const file = new JsonFile(p, \"your/file/me.json\", { obj: {} });\n\n  // WHEN\n  const result1 = p.tryRemoveFile(\"your/file/me.json\");\n  const result2 = p.tryRemoveFile(\"your/file/me.json\");\n\n  // THEN\n  const outdir = Testing.synth(p);\n  expect(outdir[\"your/file/me.json\"]).toBeUndefined();\n  expect(result1 === file).toBeTruthy();\n  expect(result2).toBeUndefined();\n});\n\ntest(\"tryRemoveFile() can be used to remove a file with an absolute path\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const file = new JsonFile(p, \"your/file/me.json\", { obj: {} });\n\n  // WHEN\n  const result1 = p.tryRemoveFile(path.resolve(p.outdir, \"your/file/me.json\"));\n  const result2 = p.tryRemoveFile(path.resolve(p.outdir, \"your/file/me.json\"));\n\n  // THEN\n  const outdir = Testing.synth(p);\n  expect(outdir[\"your/file/me.json\"]).toBeUndefined();\n  expect(result1 === file).toBeTruthy();\n  expect(result2).toBeUndefined();\n});\n\ntest(\"tryRemoveFile() will also remove a file in a subproject\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const child = new Project({\n    name: \"foobar\",\n    parent: p,\n    outdir: \"subproject/foo/bar\",\n  });\n  const fchild = new TextFile(child, \"fchild.txt\");\n\n  // WHEN\n  const result1 = p.tryRemoveFile(\"subproject/foo/bar/fchild.txt\");\n  const result2 = p.tryRemoveFile(\"subproject/foo/bar/fchild.txt\");\n\n  // THEN\n  const outdir = Testing.synth(p);\n  expect(outdir[\"subproject/foo/bar/fchild.txt\"]).toBeUndefined();\n  expect(result1 === fchild).toBeTruthy();\n  expect(result2).toBeUndefined();\n});\n\ntest(\"tryRemoveFile() can be used to override an existing file\", () => {\n  // GIVEN\n  const p = new TestProject();\n  new TextFile(p, \"your/file/me.txt\", { lines: [\"original\"] });\n\n  // WHEN\n  p.tryRemoveFile(\"your/file/me.txt\");\n  const newFile = new TextFile(p, \"your/file/me.txt\", { lines: [\"better\"] });\n  const result = p.tryFindFile(\"your/file/me.txt\");\n\n  // THEN\n  const outdir = Testing.synth(p);\n  expect(outdir[\"your/file/me.txt\"]).toContain(\"better\");\n  expect(result === newFile).toBeTruthy();\n});\n\ntest(\"autoApprove is configured\", () => {\n  // WHEN\n  const p = new TestProject({\n    autoApproveOptions: {\n      secret: \"MY_SECRET\",\n    },\n  });\n\n  // THEN\n  expect(p.autoApprove).toBeDefined();\n  expect(p.autoApprove?.label).toEqual(\"auto-approve\");\n});\n\ntest(\"github: false disables github integration\", () => {\n  // WHEN\n  const p = new TestProject({\n    github: false,\n  });\n\n  // THEN\n  expect(p.github).toBeUndefined();\n});\n\ntest(\"renovatebot: true creates renovatebot configuration\", () => {\n  // GIVEN\n  const p = new TestProject({\n    renovatebot: true,\n    renovatebotOptions: {\n      labels: [\"renotate\", \"dependencies\"],\n    },\n  });\n\n  // WHEN\n  const snapshot = synthSnapshot(p);\n\n  // THEN\n  expect(snapshot[\"renovate.json5\"]).toMatchSnapshot();\n});\n"
  },
  {
    "path": "test/projects.test.ts",
    "content": "import { InitProjectOptionHints } from \"../src/option-hints\";\nimport { Projects } from \"../src/projects\";\nimport { directorySnapshot, withProjectDir } from \"./util\";\n\ndescribe(\"createProject\", () => {\n  test(\"creates a project in a directory\", () => {\n    withProjectDir(\n      (projectdir) => {\n        // GIVEN\n        Projects.createProject({\n          optionHints: InitProjectOptionHints.FEATURED,\n          dir: projectdir,\n          post: false,\n          synth: false,\n          projectFqn: \"projen.typescript.TypeScriptProject\",\n          projectOptions: {\n            name: \"test-project\",\n            defaultReleaseBranch: \"main\",\n          },\n        });\n\n        // THEN\n        const snapshot = directorySnapshot(projectdir, {\n          excludeGlobs: [\"node_modules/**\"],\n        });\n        expect(snapshot[\".projenrc.js\"]).toMatchSnapshot();\n      },\n      { chdir: true }\n    );\n  });\n\n  test(\"creates a project and passes in JSON-like project options\", () => {\n    withProjectDir(\n      (projectdir) => {\n        // GIVEN\n        Projects.createProject({\n          optionHints: InitProjectOptionHints.FEATURED,\n          dir: projectdir,\n          post: false,\n          synth: false,\n          projectFqn: \"projen.typescript.TypeScriptProject\",\n          projectOptions: {\n            name: \"test-project\",\n            defaultReleaseBranch: \"main\",\n            eslintOptions: {\n              dirs: [\"src\", \"test\"],\n              prettier: true,\n              aliasMap: {\n                \"@src\": \"./src\",\n                \"@foo\": \"./src/foo\",\n              },\n            },\n          },\n        });\n\n        // THEN\n        const snapshot = directorySnapshot(projectdir, {\n          excludeGlobs: [\"node_modules/**\"],\n        });\n        expect(snapshot[\".projenrc.js\"]).toMatchSnapshot();\n      },\n      { chdir: true }\n    );\n  });\n\n  /**\n   * commented out due to breaking changes in projen@0.37.0\n\n  test('creates a project from an external project type, if it\\'s installed', () => {\n    withProjectDir(projectdir => {\n      // GIVEN\n      installPackage(projectdir, 'cdk-appsync-project@1.1.3');\n\n      // WHEN\n      Projects.createProject({\n        optionHints: InitProjectOptionHints.FEATURED,\n        dir: projectdir,\n        post: false,\n        synth: false,\n        projectFqn: 'cdk-appsync-project.AwsCdkAppSyncApp',\n        projectOptions: {\n          name: 'test-project',\n          defaultReleaseBranch: 'main',\n          cdkVersion: '1.63.0',\n          transformerVersion: '1.77.15',\n          devDeps: ['cdk-appsync-project@1.1.3'],\n        },\n      });\n\n      // THEN\n      const snapshot = directorySnapshot(projectdir, {\n        excludeGlobs: ['node_modules/**'],\n      });\n      expect(snapshot['.projenrc.js']).toMatchSnapshot();\n    }, { chdir: true });\n  });\n\n  */\n});\n"
  },
  {
    "path": "test/python/__snapshots__/poetry.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`poetry enabled with poetry-specific options 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/pyproject.toml linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/pyproject.toml\n/poetry.toml\n__pycache__/\n*.py[cod]\n*$py.class\n*.so\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n*.manifest\n*.spec\npip-log.txt\npip-delete-this-directory.txt\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n*.mo\n*.pot\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\ninstance/\n.webassets-cache\n.scrapy\ndocs/_build/\n.pybuilder/\ntarget/\n.ipynb_checkpoints\nprofile_default/\nipython_config.py\n__pypackages__/\ncelerybeat-schedule\ncelerybeat.pid\n*.sage.py\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n.spyderproject\n.spyproject\n.ropeproject\n/site\n.mypy_cache/\n.dmypy.json\ndmypy.json\n.pyre/\n.pytype/\n\ncython_debug/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"devenv\",\n        \"version\": \"99.99.99\",\n      },\n      Object {\n        \"name\": \"package1\",\n        \"type\": \"runtime\",\n        \"version\": \"0.0.1\",\n      },\n      Object {\n        \"name\": \"package2\",\n        \"type\": \"runtime\",\n        \"version\": \"0.0.2\",\n      },\n      Object {\n        \"name\": \"pytest\",\n        \"type\": \"test\",\n        \"version\": \"6.2.1\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"poetry.toml\",\n      \"pyproject.toml\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(echo $(poetry env info -p)/bin:$PATH)\",\n      \"VIRTUAL_ENV\": \"$(poetry env info -p)\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"python .projenrc.py\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"install\": Object {\n        \"description\": \"Install and upgrade dependencies\",\n        \"name\": \"install\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"poetry update\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"poetry build\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish\": Object {\n        \"description\": \"Uploads the package to PyPI.\",\n        \"name\": \"publish\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"poetry publish\",\n          },\n        ],\n      },\n      \"publish:test\": Object {\n        \"description\": \"Uploads the package against a test PyPI endpoint.\",\n        \"name\": \"publish:test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"poetry publish -r testpypi\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pytest\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"poetry.toml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n[repositories.testpypi]\nurl = \\\\\"https://test.pypi.org/legacy/\\\\\"\n\",\n  \"pyproject.toml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n[build-system]\nrequires = [ \\\\\"poetry_core>=1.0.0\\\\\" ]\nbuild-backend = \\\\\"poetry.core.masonry.api\\\\\"\n\n[tool.poetry]\nname = \\\\\"test-python-project\\\\\"\nversion = \\\\\"0.1.0\\\\\"\ndescription = \\\\\"a short project description\\\\\"\nlicense = \\\\\"Apache-2.0\\\\\"\nauthors = [ \\\\\"First Last <email@example.com>\\\\\" ]\nhomepage = \\\\\"http://www.example.com\\\\\"\nclassifiers = [ \\\\\"Development Status :: 4 - Beta\\\\\" ]\nreadme = \\\\\"README.md\\\\\"\nmaintainers = [ \\\\\"First-2 Last-2\\\\\" ]\nrepository = \\\\\"https://github.com/test-python-project\\\\\"\nkeywords = [ \\\\\"Keyword1\\\\\" ]\ninclude = [ \\\\\"CHANGELOG.md\\\\\" ]\nexclude = [ \\\\\"my_package/excluded.py\\\\\" ]\n\n  [[tool.poetry.packages]]\n  include = \\\\\"my_package\\\\\"\n  format = \\\\\"sdist\\\\\"\n\n  [[tool.poetry.source]]\n  name = \\\\\"pypi_\\\\\"\n  url = \\\\\"https://pypi.org/simple/\\\\\"\n  default = true\n\n  [tool.poetry.scripts]\n  test-python-cli = \\\\\"test-python-project.cli:cli\\\\\"\n\n  [tool.poetry.extras]\n  cli = [ \\\\\"package1\\\\\", \\\\\"package2\\\\\" ]\n\n[tool.poetry.plugins.\\\\\"blogtool.parsers\\\\\"]\n\\\\\".rst\\\\\" = \\\\\"some_module:SomeClass\\\\\"\n\n  [tool.poetry.urls]\n  \\\\\"bug tracker\\\\\" = \\\\\"https://github.com/test-python-project/issues\\\\\"\n\n  [tool.poetry.dependencies]\n  package1 = \\\\\"0.0.1\\\\\"\n  package2 = \\\\\"0.0.2\\\\\"\n  python = \\\\\"^3.6\\\\\"\n\n  [tool.poetry.dev-dependencies]\n  projen = \\\\\"99.99.99\\\\\"\n\",\n  \"test_python_project/__init__.py\": \"__version__ = \\\\\"0.1.0\\\\\"\n\",\n  \"test_python_project/__main__.py\": \"from .example import hello\n\nif __name__ == \\\\\"__main__\\\\\":\n    name = input(\\\\\"What is your name? \\\\\")\n    print(hello(name))\n\",\n  \"test_python_project/example.py\": \"def hello(name: str) -> str:\n    \\\\\"\\\\\"\\\\\"A simple greeting.\n    Args:\n        name (str): Name to greet.\n    Returns:\n        str: greeting message\n    \\\\\"\\\\\"\\\\\"\n    return f\\\\\"Hello {name}!\\\\\"\n\",\n  \"tests/__init__.py\": \"\",\n  \"tests/test_example.py\": \"import pytest\n\nfrom test_python_project.example import hello\n\n@pytest.mark.parametrize(\n    (\\\\\"name\\\\\", \\\\\"expected\\\\\"),\n    [\n        (\\\\\"A. Musing\\\\\", \\\\\"Hello A. Musing!\\\\\"),\n        (\\\\\"traveler\\\\\", \\\\\"Hello traveler!\\\\\"),\n        (\\\\\"projen developer\\\\\", \\\\\"Hello projen developer!\\\\\"),\n    ],\n)\ndef test_hello(name, expected):\n    \\\\\"\\\\\"\\\\\"Example test with parametrization.\\\\\"\\\\\"\\\\\"\n    assert hello(name) == expected\n\",\n}\n`;\n"
  },
  {
    "path": "test/python/__snapshots__/projenrc.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`generate projenrc in python 1`] = `\n\"from projen.python import PythonProject\n\nproject = PythonProject()\n\nproject.synth()\"\n`;\n\nexports[`javascript values are translated to python 1`] = `\n\"from projen.python import PythonProject\nfrom projen import ProjectType\n\nproject = PythonProject(\n    string_arg=\\\\\"hello\\\\\",\n    int_arg=123,\n    float_arg=123.45,\n    boolean_arg=False,\n    undefined_arg=None,\n    null_arg=None,\n    object_arg={\\\\\"foo\\\\\":\\\\\"bar\\\\\"},\n    project_type=ProjectType.LIB,\n)\n\nproject.synth()\"\n`;\n\nexports[`projenrc.py support 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"devenv\",\n        \"version\": \"1.2.3\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"python .projenrc.py\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n"
  },
  {
    "path": "test/python/__snapshots__/python-project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`defaults 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/requirements-dev.txt linguist-generated\n/requirements.txt linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/.env\n!/requirements.txt\n!/requirements-dev.txt\n__pycache__/\n*.py[cod]\n*$py.class\n*.so\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n*.manifest\n*.spec\npip-log.txt\npip-delete-this-directory.txt\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n*.mo\n*.pot\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\ninstance/\n.webassets-cache\n.scrapy\ndocs/_build/\n.pybuilder/\ntarget/\n.ipynb_checkpoints\nprofile_default/\nipython_config.py\n__pypackages__/\ncelerybeat-schedule\ncelerybeat.pid\n*.sage.py\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n.spyderproject\n.spyproject\n.ropeproject\n/site\n.mypy_cache/\n.dmypy.json\ndmypy.json\n.pyre/\n.pytype/\n\ncython_debug/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"devenv\",\n        \"version\": \"99.99.99\",\n      },\n      Object {\n        \"name\": \"pytest\",\n        \"type\": \"test\",\n        \"version\": \"6.2.1\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"requirements-dev.txt\",\n      \"requirements.txt\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(echo $PWD/.env/bin:$PATH)\",\n      \"VIRTUAL_ENV\": \"$(echo $PWD/.env)\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"python .projenrc.py\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"install\": Object {\n        \"description\": \"Install and upgrade dependencies\",\n        \"name\": \"install\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pip install --upgrade pip\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements.txt\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements-dev.txt\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pytest\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"requirements-dev.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nprojen==99.99.99\n\",\n  \"requirements.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\",\n  \"test_python_project/__init__.py\": \"__version__ = \\\\\"0.1.0\\\\\"\n\",\n  \"test_python_project/__main__.py\": \"from .example import hello\n\nif __name__ == \\\\\"__main__\\\\\":\n    name = input(\\\\\"What is your name? \\\\\")\n    print(hello(name))\n\",\n  \"test_python_project/example.py\": \"def hello(name: str) -> str:\n    \\\\\"\\\\\"\\\\\"A simple greeting.\n    Args:\n        name (str): Name to greet.\n    Returns:\n        str: greeting message\n    \\\\\"\\\\\"\\\\\"\n    return f\\\\\"Hello {name}!\\\\\"\n\",\n  \"tests/__init__.py\": \"\",\n  \"tests/test_example.py\": \"import pytest\n\nfrom test_python_project.example import hello\n\n@pytest.mark.parametrize(\n    (\\\\\"name\\\\\", \\\\\"expected\\\\\"),\n    [\n        (\\\\\"A. Musing\\\\\", \\\\\"Hello A. Musing!\\\\\"),\n        (\\\\\"traveler\\\\\", \\\\\"Hello traveler!\\\\\"),\n        (\\\\\"projen developer\\\\\", \\\\\"Hello projen developer!\\\\\"),\n    ],\n)\ndef test_hello(name, expected):\n    \\\\\"\\\\\"\\\\\"Example test with parametrization.\\\\\"\\\\\"\\\\\"\n    assert hello(name) == expected\n\",\n}\n`;\n\nexports[`dependencies 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/requirements-dev.txt linguist-generated\n/requirements.txt linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/.env\n!/requirements.txt\n!/requirements-dev.txt\n__pycache__/\n*.py[cod]\n*$py.class\n*.so\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n*.manifest\n*.spec\npip-log.txt\npip-delete-this-directory.txt\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n*.mo\n*.pot\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\ninstance/\n.webassets-cache\n.scrapy\ndocs/_build/\n.pybuilder/\ntarget/\n.ipynb_checkpoints\nprofile_default/\nipython_config.py\n__pypackages__/\ncelerybeat-schedule\ncelerybeat.pid\n*.sage.py\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n.spyderproject\n.spyproject\n.ropeproject\n/site\n.mypy_cache/\n.dmypy.json\ndmypy.json\n.pyre/\n.pytype/\n\ncython_debug/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"hypothesis\",\n        \"type\": \"devenv\",\n        \"version\": \"^6.0.3\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"devenv\",\n        \"version\": \"99.99.99\",\n      },\n      Object {\n        \"name\": \"aws-cdk.core\",\n        \"type\": \"runtime\",\n        \"version\": \"*\",\n      },\n      Object {\n        \"name\": \"Django\",\n        \"type\": \"runtime\",\n        \"version\": \"3.1.5\",\n      },\n      Object {\n        \"name\": \"pytest\",\n        \"type\": \"test\",\n        \"version\": \"6.2.1\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"requirements-dev.txt\",\n      \"requirements.txt\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(echo $PWD/.env/bin:$PATH)\",\n      \"VIRTUAL_ENV\": \"$(echo $PWD/.env)\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"python .projenrc.py\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"install\": Object {\n        \"description\": \"Install and upgrade dependencies\",\n        \"name\": \"install\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pip install --upgrade pip\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements.txt\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements-dev.txt\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pytest\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"requirements-dev.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nhypothesis>=6.0.3, <7.0.0\nprojen==99.99.99\n\",\n  \"requirements.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\naws-cdk.core>=0.0.0\nDjango==3.1.5\n\",\n  \"test_python_project/__init__.py\": \"__version__ = \\\\\"0.1.0\\\\\"\n\",\n  \"test_python_project/__main__.py\": \"from .example import hello\n\nif __name__ == \\\\\"__main__\\\\\":\n    name = input(\\\\\"What is your name? \\\\\")\n    print(hello(name))\n\",\n  \"test_python_project/example.py\": \"def hello(name: str) -> str:\n    \\\\\"\\\\\"\\\\\"A simple greeting.\n    Args:\n        name (str): Name to greet.\n    Returns:\n        str: greeting message\n    \\\\\"\\\\\"\\\\\"\n    return f\\\\\"Hello {name}!\\\\\"\n\",\n  \"tests/__init__.py\": \"\",\n  \"tests/test_example.py\": \"import pytest\n\nfrom test_python_project.example import hello\n\n@pytest.mark.parametrize(\n    (\\\\\"name\\\\\", \\\\\"expected\\\\\"),\n    [\n        (\\\\\"A. Musing\\\\\", \\\\\"Hello A. Musing!\\\\\"),\n        (\\\\\"traveler\\\\\", \\\\\"Hello traveler!\\\\\"),\n        (\\\\\"projen developer\\\\\", \\\\\"Hello projen developer!\\\\\"),\n    ],\n)\ndef test_hello(name, expected):\n    \\\\\"\\\\\"\\\\\"Example test with parametrization.\\\\\"\\\\\"\\\\\"\n    assert hello(name) == expected\n\",\n}\n`;\n\nexports[`dependencies via ctor 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/requirements-dev.txt linguist-generated\n/requirements.txt linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/.env\n!/requirements.txt\n!/requirements-dev.txt\n__pycache__/\n*.py[cod]\n*$py.class\n*.so\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n*.manifest\n*.spec\npip-log.txt\npip-delete-this-directory.txt\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n*.mo\n*.pot\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\ninstance/\n.webassets-cache\n.scrapy\ndocs/_build/\n.pybuilder/\ntarget/\n.ipynb_checkpoints\nprofile_default/\nipython_config.py\n__pypackages__/\ncelerybeat-schedule\ncelerybeat.pid\n*.sage.py\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n.spyderproject\n.spyproject\n.ropeproject\n/site\n.mypy_cache/\n.dmypy.json\ndmypy.json\n.pyre/\n.pytype/\n\ncython_debug/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"hypothesis\",\n        \"type\": \"devenv\",\n        \"version\": \"^6.0.3\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"devenv\",\n        \"version\": \"99.99.99\",\n      },\n      Object {\n        \"name\": \"aws-cdk.core\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"Django\",\n        \"type\": \"runtime\",\n        \"version\": \"3.1.5\",\n      },\n      Object {\n        \"name\": \"pytest\",\n        \"type\": \"test\",\n        \"version\": \"6.2.1\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"requirements-dev.txt\",\n      \"requirements.txt\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(echo $PWD/.env/bin:$PATH)\",\n      \"VIRTUAL_ENV\": \"$(echo $PWD/.env)\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"python .projenrc.py\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"install\": Object {\n        \"description\": \"Install and upgrade dependencies\",\n        \"name\": \"install\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pip install --upgrade pip\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements.txt\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements-dev.txt\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pytest\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"requirements-dev.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nhypothesis>=6.0.3, <7.0.0\nprojen==99.99.99\n\",\n  \"requirements.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\naws-cdk.core\nDjango==3.1.5\n\",\n  \"test_python_project/__init__.py\": \"__version__ = \\\\\"0.1.0\\\\\"\n\",\n  \"test_python_project/__main__.py\": \"from .example import hello\n\nif __name__ == \\\\\"__main__\\\\\":\n    name = input(\\\\\"What is your name? \\\\\")\n    print(hello(name))\n\",\n  \"test_python_project/example.py\": \"def hello(name: str) -> str:\n    \\\\\"\\\\\"\\\\\"A simple greeting.\n    Args:\n        name (str): Name to greet.\n    Returns:\n        str: greeting message\n    \\\\\"\\\\\"\\\\\"\n    return f\\\\\"Hello {name}!\\\\\"\n\",\n  \"tests/__init__.py\": \"\",\n  \"tests/test_example.py\": \"import pytest\n\nfrom test_python_project.example import hello\n\n@pytest.mark.parametrize(\n    (\\\\\"name\\\\\", \\\\\"expected\\\\\"),\n    [\n        (\\\\\"A. Musing\\\\\", \\\\\"Hello A. Musing!\\\\\"),\n        (\\\\\"traveler\\\\\", \\\\\"Hello traveler!\\\\\"),\n        (\\\\\"projen developer\\\\\", \\\\\"Hello projen developer!\\\\\"),\n    ],\n)\ndef test_hello(name, expected):\n    \\\\\"\\\\\"\\\\\"Example test with parametrization.\\\\\"\\\\\"\\\\\"\n    assert hello(name) == expected\n\",\n}\n`;\n\nexports[`no pytest 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/requirements-dev.txt linguist-generated\n/requirements.txt linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/.env\n!/requirements.txt\n!/requirements-dev.txt\n__pycache__/\n*.py[cod]\n*$py.class\n*.so\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n*.manifest\n*.spec\npip-log.txt\npip-delete-this-directory.txt\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n*.mo\n*.pot\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\ninstance/\n.webassets-cache\n.scrapy\ndocs/_build/\n.pybuilder/\ntarget/\n.ipynb_checkpoints\nprofile_default/\nipython_config.py\n__pypackages__/\ncelerybeat-schedule\ncelerybeat.pid\n*.sage.py\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n.spyderproject\n.spyproject\n.ropeproject\n/site\n.mypy_cache/\n.dmypy.json\ndmypy.json\n.pyre/\n.pytype/\n\ncython_debug/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"devenv\",\n        \"version\": \"99.99.99\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"requirements-dev.txt\",\n      \"requirements.txt\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(echo $PWD/.env/bin:$PATH)\",\n      \"VIRTUAL_ENV\": \"$(echo $PWD/.env)\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"python .projenrc.py\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"install\": Object {\n        \"description\": \"Install and upgrade dependencies\",\n        \"name\": \"install\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"pip install --upgrade pip\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements.txt\",\n          },\n          Object {\n            \"exec\": \"pip install -r requirements-dev.txt\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n  \"requirements-dev.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nprojen==99.99.99\n\",\n  \"requirements.txt\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\",\n  \"test_python_project/__init__.py\": \"__version__ = \\\\\"0.1.0\\\\\"\n\",\n  \"test_python_project/__main__.py\": \"from .example import hello\n\nif __name__ == \\\\\"__main__\\\\\":\n    name = input(\\\\\"What is your name? \\\\\")\n    print(hello(name))\n\",\n  \"test_python_project/example.py\": \"def hello(name: str) -> str:\n    \\\\\"\\\\\"\\\\\"A simple greeting.\n    Args:\n        name (str): Name to greet.\n    Returns:\n        str: greeting message\n    \\\\\"\\\\\"\\\\\"\n    return f\\\\\"Hello {name}!\\\\\"\n\",\n}\n`;\n"
  },
  {
    "path": "test/python/poetry.test.ts",
    "content": "import { python } from \"../../src\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"poetry enabled\", () => {\n  const p = new TestPythonProject({\n    venv: false,\n    pip: false,\n    setuptools: false,\n    poetry: true,\n    homepage: \"http://www.example.com\",\n    description: \"a short project description\",\n    license: \"Apache-2.0\",\n    classifiers: [\"Development Status :: 4 - Beta\"],\n  });\n\n  const snapshot = synthSnapshot(p);\n  expect(snapshot[\"pyproject.toml\"]).toContain(\"First Last\");\n  expect(snapshot[\"pyproject.toml\"]).toContain(\"email@example.com\");\n  expect(snapshot[\"pyproject.toml\"]).toContain(\"http://www.example.com\");\n  expect(snapshot[\"pyproject.toml\"]).toContain(\"a short project description\");\n  expect(snapshot[\"pyproject.toml\"]).toContain(\"Apache-2.0\");\n  expect(snapshot[\"pyproject.toml\"]).toContain(\n    \"Development Status :: 4 - Beta\"\n  );\n  expect(snapshot[\"pyproject.toml\"]).toContain('python = \"^3.6\"'); // default python version\n});\n\ntest(\"poetry enabled with specified python version\", () => {\n  const p = new TestPythonProject({\n    venv: false,\n    pip: false,\n    setuptools: false,\n    poetry: true,\n    homepage: \"http://www.example.com\",\n    description: \"a short project description\",\n    license: \"Apache-2.0\",\n    classifiers: [\"Development Status :: 4 - Beta\"],\n  });\n  p.addDependency(\"python@^3.7,<=3.9\");\n\n  const snapshot = synthSnapshot(p);\n  expect(snapshot[\"pyproject.toml\"]).toContain('python = \"^3.7,<=3.9\"');\n});\n\ntest(\"poetry enabled with poetry-specific options\", () => {\n  const p = new TestPythonProject({\n    venv: false,\n    pip: false,\n    setuptools: false,\n    poetry: true,\n    homepage: \"http://www.example.com\",\n    description: \"a short project description\",\n    license: \"Apache-2.0\",\n    classifiers: [\"Development Status :: 4 - Beta\"],\n    deps: [\"package1@0.0.1\", \"package2@0.0.2\"],\n    poetryOptions: {\n      maintainers: [\"First-2 Last-2\"],\n      repository: \"https://github.com/test-python-project\",\n      keywords: [\"Keyword1\"],\n      packages: [\n        {\n          include: \"my_package\",\n          format: \"sdist\",\n        },\n      ],\n      include: [\"CHANGELOG.md\"],\n      exclude: [\"my_package/excluded.py\"],\n      source: [\n        {\n          name: \"pypi_\",\n          url: \"https://pypi.org/simple/\",\n          default: true,\n        },\n      ],\n      scripts: {\n        \"test-python-cli\": \"test-python-project.cli:cli\",\n      },\n      extras: {\n        cli: [\"package1\", \"package2\"],\n      },\n      plugins: {\n        \"blogtool.parsers\": {\n          \".rst\": \"some_module:SomeClass\",\n        },\n      },\n      urls: {\n        \"bug tracker\": \"https://github.com/test-python-project/issues\",\n      },\n    },\n  });\n\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\nclass TestPythonProject extends python.PythonProject {\n  constructor(options: Partial<python.PythonProjectOptions> = {}) {\n    super({\n      ...options,\n      clobber: false,\n      name: \"test-python-project\",\n      moduleName: \"test_python_project\",\n      authorName: \"First Last\",\n      authorEmail: \"email@example.com\",\n      version: \"0.1.0\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/python/projenrc.test.ts",
    "content": "import { renderProjenInitOptions } from \"../../src/javascript/render-options\";\nimport { ProjectType } from \"../../src/project\";\nimport { Projenrc, resolvePythonImportName } from \"../../src/python/projenrc\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"projenrc.py support\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Projenrc(project, {\n    projenVersion: \"1.2.3\",\n  });\n\n  // THEN\n  expect(synthSnapshot(project)).toMatchSnapshot();\n});\n\ntest(\"generate projenrc in python\", () => {\n  // GIVEN\n  const project = new TestProject(\n    renderProjenInitOptions(\"projen.python.PythonProject\", {})\n  );\n\n  // WHEN\n  new Projenrc(project);\n\n  // THEN\n  expect(synthSnapshot(project)[\".projenrc.py\"]).toMatchSnapshot();\n});\n\ntest(\"javascript values are translated to python\", () => {\n  // GIVEN\n  const project = new TestProject(\n    renderProjenInitOptions(\"projen.python.PythonProject\", {\n      stringArg: \"hello\",\n      intArg: 123,\n      floatArg: 123.45,\n      booleanArg: false,\n      undefinedArg: undefined,\n      nullArg: null,\n      objectArg: { foo: \"bar\" },\n      projectType: ProjectType.LIB,\n    })\n  );\n\n  // WHEN\n  new Projenrc(project);\n\n  // THEN\n  expect(synthSnapshot(project)[\".projenrc.py\"]).toMatchSnapshot();\n});\n\ntest(\"ensure python import is correctly resolved when python module exists\", () => {\n  // GIVEN\n  const jsiiManifest: any = {\n    targets: {\n      python: {\n        module: \"my_module\",\n      },\n    },\n  };\n\n  const fqnInputToExpectedImportMap = {\n    \"my-module.component\": \"my_module.component\",\n    \"my_module.component\": \"my_module.component\",\n    \"my_module.nested.component\": \"my_module.nested.component\",\n  };\n\n  Object.entries(fqnInputToExpectedImportMap).forEach(\n    ([jsiiFqn, expectedImportName]) => {\n      // WHEN\n      const resolvedImportName = resolvePythonImportName(jsiiFqn, jsiiManifest);\n\n      // THEN\n      expect(resolvedImportName).toEqual(expectedImportName);\n    }\n  );\n});\n\ntest(\"ensure python import is correctly resolved to jsiiFqn when python module is undefined\", () => {\n  // GIVEN\n  const jsiiManifest: any = {};\n  const jsiiFqn = \"my-module.component\";\n\n  // WHEN\n  const resolvedImportName = resolvePythonImportName(jsiiFqn, jsiiManifest);\n\n  // THEN\n  expect(resolvedImportName).toEqual(jsiiFqn);\n});\n"
  },
  {
    "path": "test/python/python-project.test.ts",
    "content": "import { python } from \"../../src\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"defaults\", () => {\n  const p = new TestPythonProject();\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"dependencies\", () => {\n  const p = new TestPythonProject();\n  p.addDependency(\"Django@3.1.5\");\n  p.addDependency(\"aws-cdk.core@*\");\n  p.addDevDependency(\"hypothesis@^6.0.3\");\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"dependencies via ctor\", () => {\n  const p = new TestPythonProject({\n    deps: [\"Django@3.1.5\", \"aws-cdk.core\"],\n    devDeps: [\"hypothesis@^6.0.3\"],\n  });\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"no pytest\", () => {\n  const p = new TestPythonProject({\n    pytest: false,\n  });\n\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"pytest maxfailures\", () => {\n  const p = new TestPythonProject({\n    pytestOptions: {\n      maxFailures: 3,\n    },\n  });\n\n  expect(\n    synthSnapshot(p)[\".projen/tasks.json\"].tasks.test.steps[0].exec\n  ).toContain(\"--maxfail=3\");\n});\n\ntest(\"cannot specify multiple projenrc types\", () => {\n  expect(\n    () =>\n      new TestPythonProject({\n        projenrcPython: true,\n        projenrcJs: true,\n      })\n  ).toThrow(\n    /Only one of projenrcPython, projenrcJs, and projenrcJson can be selected./\n  );\n});\n\nclass TestPythonProject extends python.PythonProject {\n  constructor(options: Partial<python.PythonProjectOptions> = {}) {\n    super({\n      ...options,\n      clobber: false,\n      name: \"test-python-project\",\n      moduleName: \"test_python_project\",\n      authorName: \"First Last\",\n      authorEmail: \"email@example.com\",\n      version: \"0.1.0\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/python/setuptools.test.ts",
    "content": "import { python } from \"../../src\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"setuptools enabled\", () => {\n  const p = new TestPythonProject({\n    setuptools: true,\n    homepage: \"http://www.example.com\",\n    description: \"a short project description\",\n    license: \"Apache Software License\",\n    classifiers: [\"Development Status :: 4 - Beta\"],\n  });\n\n  const snapshot = synthSnapshot(p);\n  expect(snapshot[\"setup.py\"]).toContain(\"First Last\");\n  expect(snapshot[\"setup.py\"]).toContain(\"email@example.com\");\n  expect(snapshot[\"setup.py\"]).toContain(\"http://www.example.com\");\n  expect(snapshot[\"setup.py\"]).toContain(\"a short project description\");\n  expect(snapshot[\"setup.py\"]).toContain(\"Apache Software License\");\n  expect(snapshot[\"setup.py\"]).toContain(\"Development Status :: 4 - Beta\");\n});\n\nclass TestPythonProject extends python.PythonProject {\n  constructor(options: Partial<python.PythonProjectOptions> = {}) {\n    super({\n      ...options,\n      clobber: false,\n      name: \"test-python-project\",\n      moduleName: \"test_python_project\",\n      authorName: \"First Last\",\n      authorEmail: \"email@example.com\",\n      version: \"0.1.0\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/readme.test.ts",
    "content": "import * as logging from \"../src/logging\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\nlogging.disable();\n\ndescribe(\"SampleReadProps\", () => {\n  test(\"default SampleReadme\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const output = synthSnapshot(project);\n\n    // THEN\n    const upper = output[\"README.md\"];\n    const lower = output[\"readme.md\"];\n    expect(upper).toBeTruthy();\n    expect(lower).toBeFalsy();\n  });\n\n  test(\"customized w/ default SampleReadme\", () => {\n    // GIVEN\n    const project = new TestProject({\n      readme: {\n        filename: \"README.md\",\n      },\n    });\n\n    // WHEN\n    const output = synthSnapshot(project);\n\n    // THEN\n    const upper = output[\"README.md\"];\n    const lower = output[\"readme.md\"];\n    expect(upper).toBeTruthy();\n    expect(lower).toBeFalsy();\n  });\n\n  test(\"customized SampleReadme\", () => {\n    // GIVEN\n    const project = new TestProject({\n      readme: {\n        filename: \"readme.md\",\n      },\n    });\n\n    // WHEN\n    const output = synthSnapshot(project);\n\n    // THEN\n    const upper = output[\"README.md\"];\n    const lower = output[\"readme.md\"];\n    expect(upper).toBeFalsy();\n    expect(lower).toBeTruthy();\n  });\n\n  test(\"SampleReadme customized contents in constructor\", () => {\n    // GIVEN\n    const project = new TestProject({\n      readme: {\n        contents: \"my stuff\",\n      },\n    });\n\n    // WHEN\n    const output = synthSnapshot(project);\n\n    // THEN\n    const readme = output[\"README.md\"];\n    expect(readme).toBeTruthy();\n    expect(readme).toStrictEqual(\"my stuff\");\n  });\n});\n"
  },
  {
    "path": "test/release/__snapshots__/release.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`AWS CodeArtifact is supported by npm 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\n          AWS_ACCESS_KEY_ID: \\${{ secrets.AWS_ACCESS_KEY_ID }}\n          AWS_SECRET_ACCESS_KEY: \\${{ secrets.AWS_SECRET_ACCESS_KEY }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:npm\": Object {\n        \"description\": \"Publish this package to npm\",\n        \"env\": Object {\n          \"NPM_DIST_TAG\": \"latest\",\n          \"NPM_REGISTRY\": \"my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n        },\n        \"name\": \"publish:npm\",\n        \"requiredEnv\": Array [\n          \"AWS_ACCESS_KEY_ID\",\n          \"AWS_SECRET_ACCESS_KEY\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-npm\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`AWS CodeArtifact is supported by npm with AWS access keys 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\n          AWS_ACCESS_KEY_ID: \\${{ secrets.OTHER_AWS_ACCESS_KEY_ID }}\n          AWS_SECRET_ACCESS_KEY: \\${{ secrets.OTHER_AWS_SECRET_ACCESS_KEY }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:npm\": Object {\n        \"description\": \"Publish this package to npm\",\n        \"env\": Object {\n          \"NPM_DIST_TAG\": \"latest\",\n          \"NPM_REGISTRY\": \"my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n        },\n        \"name\": \"publish:npm\",\n        \"requiredEnv\": Array [\n          \"AWS_ACCESS_KEY_ID\",\n          \"AWS_SECRET_ACCESS_KEY\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-npm\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`AWS CodeArtifact is supported with role to assume 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\n          AWS_ACCESS_KEY_ID: \\${{ secrets.AWS_ACCESS_KEY_ID }}\n          AWS_SECRET_ACCESS_KEY: \\${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          AWS_ROLE_TO_ASSUME: role-arn\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:npm\": Object {\n        \"description\": \"Publish this package to npm\",\n        \"env\": Object {\n          \"NPM_DIST_TAG\": \"latest\",\n          \"NPM_REGISTRY\": \"my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n        },\n        \"name\": \"publish:npm\",\n        \"requiredEnv\": Array [\n          \"AWS_ACCESS_KEY_ID\",\n          \"AWS_SECRET_ACCESS_KEY\",\n          \"AWS_ROLE_TO_ASSUME\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-npm\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`addBranch() can be used for additional release branches 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release-10.x.yml linguist-generated\n/.github/workflows/release-2.x.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release-10.x.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release-10.x\non:\n  push:\n    branches:\n      - 10.x\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:10.x\n        run: projen release:10.x\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/release-2.x.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release-2.x\non:\n  push:\n    branches:\n      - 2.x\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:2.x\n        run: projen release:2.x\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.github/workflows/release-2.x.yml\n!/.github/workflows/release-10.x.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release-10.x.yml\",\n      \".github/workflows/release-2.x.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:github:10.x\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:10.x\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"10.x\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:github:2.x\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:2.x\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"2.x\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"1\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"release:10.x\": Object {\n        \"description\": \"Prepare a release from \\\\\"10.x\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"10\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release:10.x\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"release:2.x\": Object {\n        \"description\": \"Prepare a release from \\\\\"2.x\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"2\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release:2.x\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`addJobs() can be used to add arbitrary jobs to the release workflows 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/foo-workflow.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/foo-workflow.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: foo-workflow\non:\n  push:\n    branches:\n      - foo\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:foo\n        run: projen release:foo\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_pypi:\n    name: Publish to PyPI\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-pypi\n        env:\n          TWINE_USERNAME: \\${{ secrets.TWINE_USERNAME }}\n          TWINE_PASSWORD: \\${{ secrets.TWINE_PASSWORD }}\n  random_job:\n    runs-on: foo\n    permissions:\n      actions: none\n    steps: []\n\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_pypi:\n    name: Publish to PyPI\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-pypi\n        env:\n          TWINE_USERNAME: \\${{ secrets.TWINE_USERNAME }}\n          TWINE_PASSWORD: \\${{ secrets.TWINE_PASSWORD }}\n  random_job:\n    runs-on: foo\n    permissions:\n      actions: none\n    steps: []\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.github/workflows/foo-workflow.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/foo-workflow.yml\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:github:foo\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:foo\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"foo\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:pypi\": Object {\n        \"description\": \"Publish this package to PyPI\",\n        \"name\": \"publish:pypi\",\n        \"requiredEnv\": Array [\n          \"TWINE_USERNAME\",\n          \"TWINE_PASSWORD\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-pypi\",\n          },\n        ],\n      },\n      \"publish:pypi:foo\": Object {\n        \"description\": \"Publish this package to PyPI\",\n        \"name\": \"publish:pypi:foo\",\n        \"requiredEnv\": Array [\n          \"TWINE_USERNAME\",\n          \"TWINE_PASSWORD\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"foo\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-pypi\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"0\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"release:foo\": Object {\n        \"description\": \"Prepare a release from \\\\\"foo\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"4\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release:foo\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`can be modified with escape hatches 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n      FOO: VALUE1\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n    env:\n      BAR: VALUE2\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`can enable issue creation on failed releases with a custom label 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      issues: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n      - name: Extract Version\n        if: \\${{ failure() }}\n        id: extract-version\n        run: echo \\\\\"::set-output name=VERSION::$(cat dist/version.txt)\\\\\"\n      - name: Create Issue\n        if: \\${{ failure() }}\n        uses: imjohnbo/issue-bot@v3\n        with:\n          labels: custom-label\n          title: Publishing v\\${{ steps.extract-version.outputs.VERSION }} to GitHub Releases failed\n          body: See https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n      issues: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: npm.pkg.github.com\n          NPM_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n      - name: Extract Version\n        if: \\${{ failure() }}\n        id: extract-version\n        run: echo \\\\\"::set-output name=VERSION::$(cat dist/version.txt)\\\\\"\n      - name: Create Issue\n        if: \\${{ failure() }}\n        uses: imjohnbo/issue-bot@v3\n        with:\n          labels: custom-label\n          title: Publishing v\\${{ steps.extract-version.outputs.VERSION }} to npm failed\n          body: See https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n\"\n`;\n\nexports[`github packages are supported by npm, maven, and nuget 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_REGISTRY: npm.pkg.github.com\n          NPM_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n  release_maven:\n    name: Publish to Maven Central\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-java@v3\n        with:\n          distribution: temurin\n          java-version: 11.x\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-maven\n        env:\n          MAVEN_REPOSITORY_URL: maven.pkg.github.com\n          MAVEN_GPG_PRIVATE_KEY: \\${{ secrets.MAVEN_GPG_PRIVATE_KEY }}\n          MAVEN_GPG_PRIVATE_KEY_PASSPHRASE: \\${{ secrets.MAVEN_GPG_PRIVATE_KEY_PASSPHRASE }}\n          MAVEN_PASSWORD: \\${{ secrets.MAVEN_PASSWORD }}\n          MAVEN_USERNAME: \\${{ secrets.MAVEN_USERNAME }}\n          MAVEN_STAGING_PROFILE_ID: \\${{ secrets.MAVEN_STAGING_PROFILE_ID }}\n  release_nuget:\n    name: Publish to NuGet Gallery\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-dotnet@v2\n        with:\n          dotnet-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-nuget\n        env:\n          NUGET_API_KEY: \\${{ secrets.NUGET_API_KEY }}\n          NUGET_SERVER: nuget.pkg.github.com\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:maven\": Object {\n        \"description\": \"Publish this package to Maven Central\",\n        \"env\": Object {\n          \"MAVEN_REPOSITORY_URL\": \"maven.pkg.github.com\",\n        },\n        \"name\": \"publish:maven\",\n        \"requiredEnv\": Array [\n          \"MAVEN_GPG_PRIVATE_KEY\",\n          \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\",\n          \"MAVEN_PASSWORD\",\n          \"MAVEN_USERNAME\",\n          \"MAVEN_STAGING_PROFILE_ID\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-maven\",\n          },\n        ],\n      },\n      \"publish:npm\": Object {\n        \"description\": \"Publish this package to npm\",\n        \"env\": Object {\n          \"NPM_DIST_TAG\": \"latest\",\n          \"NPM_REGISTRY\": \"npm.pkg.github.com\",\n        },\n        \"name\": \"publish:npm\",\n        \"requiredEnv\": Array [\n          \"NPM_TOKEN\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-npm\",\n          },\n        ],\n      },\n      \"publish:nuget\": Object {\n        \"description\": \"Publish this package to NuGet Gallery\",\n        \"name\": \"publish:nuget\",\n        \"requiredEnv\": Array [\n          \"NUGET_API_KEY\",\n          \"NUGET_SERVER\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"npx -p publib@latest publib-nuget\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`majorVersion can be 0 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\"\n`;\n\nexports[`majorVersion can be 0 2`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"tasks\": Object {\n    \"build\": Object {\n      \"description\": \"Full release build\",\n      \"name\": \"build\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n        Object {\n          \"spawn\": \"pre-compile\",\n        },\n        Object {\n          \"spawn\": \"compile\",\n        },\n        Object {\n          \"spawn\": \"post-compile\",\n        },\n        Object {\n          \"spawn\": \"test\",\n        },\n        Object {\n          \"spawn\": \"package\",\n        },\n      ],\n    },\n    \"bump\": Object {\n      \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n      \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n      \"env\": Object {\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"OUTFILE\": \"goo.json\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\",\n      },\n      \"name\": \"bump\",\n      \"steps\": Array [\n        Object {\n          \"builtin\": \"release/bump-version\",\n        },\n      ],\n    },\n    \"compile\": Object {\n      \"description\": \"Only compile\",\n      \"name\": \"compile\",\n    },\n    \"default\": Object {\n      \"description\": \"Synthesize project files\",\n      \"name\": \"default\",\n    },\n    \"eject\": Object {\n      \"description\": \"Remove projen from the project\",\n      \"env\": Object {\n        \"PROJEN_EJECTING\": \"true\",\n      },\n      \"name\": \"eject\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n      ],\n    },\n    \"package\": Object {\n      \"description\": \"Creates the distribution package\",\n      \"name\": \"package\",\n    },\n    \"post-compile\": Object {\n      \"description\": \"Runs after successful compilation\",\n      \"name\": \"post-compile\",\n    },\n    \"pre-compile\": Object {\n      \"description\": \"Prepare the project for compilation\",\n      \"name\": \"pre-compile\",\n    },\n    \"publish:github\": Object {\n      \"description\": \"Publish this package to GitHub Releases\",\n      \"name\": \"publish:github\",\n      \"requiredEnv\": Array [\n        \"GITHUB_TOKEN\",\n        \"GITHUB_REPOSITORY\",\n        \"GITHUB_REF\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n        },\n      ],\n    },\n    \"release\": Object {\n      \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n      \"env\": Object {\n        \"MAJOR\": \"0\",\n        \"RELEASE\": \"true\",\n      },\n      \"name\": \"release\",\n      \"steps\": Array [\n        Object {\n          \"exec\": \"rm -fr dist\",\n        },\n        Object {\n          \"spawn\": \"bump\",\n        },\n        Object {\n          \"spawn\": \"build\",\n        },\n        Object {\n          \"spawn\": \"unbump\",\n        },\n        Object {\n          \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n        },\n      ],\n    },\n    \"test\": Object {\n      \"description\": \"Run tests\",\n      \"name\": \"test\",\n    },\n    \"unbump\": Object {\n      \"description\": \"Restores version to 0.0.0\",\n      \"env\": Object {\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"OUTFILE\": \"goo.json\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\",\n      },\n      \"name\": \"unbump\",\n      \"steps\": Array [\n        Object {\n          \"builtin\": \"release/reset-version\",\n        },\n      ],\n    },\n  },\n}\n`;\n\nexports[`minimal 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`prerelease can be specified per branch 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\"\n`;\n\nexports[`prerelease can be specified per branch 2`] = `undefined`;\n\nexports[`prerelease can be specified per branch 3`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"tasks\": Object {\n    \"build\": Object {\n      \"description\": \"Full release build\",\n      \"name\": \"build\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n        Object {\n          \"spawn\": \"pre-compile\",\n        },\n        Object {\n          \"spawn\": \"compile\",\n        },\n        Object {\n          \"spawn\": \"post-compile\",\n        },\n        Object {\n          \"spawn\": \"test\",\n        },\n        Object {\n          \"spawn\": \"package\",\n        },\n      ],\n    },\n    \"bump\": Object {\n      \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n      \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n      \"env\": Object {\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"OUTFILE\": \"goo.json\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\",\n      },\n      \"name\": \"bump\",\n      \"steps\": Array [\n        Object {\n          \"builtin\": \"release/bump-version\",\n        },\n      ],\n    },\n    \"compile\": Object {\n      \"description\": \"Only compile\",\n      \"name\": \"compile\",\n    },\n    \"default\": Object {\n      \"description\": \"Synthesize project files\",\n      \"name\": \"default\",\n    },\n    \"eject\": Object {\n      \"description\": \"Remove projen from the project\",\n      \"env\": Object {\n        \"PROJEN_EJECTING\": \"true\",\n      },\n      \"name\": \"eject\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n      ],\n    },\n    \"package\": Object {\n      \"description\": \"Creates the distribution package\",\n      \"name\": \"package\",\n    },\n    \"post-compile\": Object {\n      \"description\": \"Runs after successful compilation\",\n      \"name\": \"post-compile\",\n    },\n    \"pre-compile\": Object {\n      \"description\": \"Prepare the project for compilation\",\n      \"name\": \"pre-compile\",\n    },\n    \"publish:github\": Object {\n      \"description\": \"Publish this package to GitHub Releases\",\n      \"name\": \"publish:github\",\n      \"requiredEnv\": Array [\n        \"GITHUB_TOKEN\",\n        \"GITHUB_REPOSITORY\",\n        \"GITHUB_REF\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n        },\n      ],\n    },\n    \"publish:github:10.x\": Object {\n      \"description\": \"Publish this package to GitHub Releases\",\n      \"name\": \"publish:github:10.x\",\n      \"requiredEnv\": Array [\n        \"GITHUB_TOKEN\",\n        \"GITHUB_REPOSITORY\",\n        \"GITHUB_REF\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"10.x\\\\\"\",\n        },\n        Object {\n          \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n        },\n      ],\n    },\n    \"release\": Object {\n      \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n      \"env\": Object {\n        \"MAJOR\": \"0\",\n        \"RELEASE\": \"true\",\n      },\n      \"name\": \"release\",\n      \"steps\": Array [\n        Object {\n          \"exec\": \"rm -fr dist\",\n        },\n        Object {\n          \"spawn\": \"bump\",\n        },\n        Object {\n          \"spawn\": \"build\",\n        },\n        Object {\n          \"spawn\": \"unbump\",\n        },\n        Object {\n          \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n        },\n      ],\n    },\n    \"release:10.x\": Object {\n      \"description\": \"Prepare a release from \\\\\"10.x\\\\\" branch\",\n      \"env\": Object {\n        \"MAJOR\": \"10\",\n        \"PRERELEASE\": \"pre\",\n        \"RELEASE\": \"true\",\n      },\n      \"name\": \"release:10.x\",\n      \"steps\": Array [\n        Object {\n          \"exec\": \"rm -fr dist\",\n        },\n        Object {\n          \"spawn\": \"bump\",\n        },\n        Object {\n          \"spawn\": \"build\",\n        },\n        Object {\n          \"spawn\": \"unbump\",\n        },\n        Object {\n          \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n        },\n      ],\n    },\n    \"test\": Object {\n      \"description\": \"Run tests\",\n      \"name\": \"test\",\n    },\n    \"unbump\": Object {\n      \"description\": \"Restores version to 0.0.0\",\n      \"env\": Object {\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"OUTFILE\": \"goo.json\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\",\n      },\n      \"name\": \"unbump\",\n      \"steps\": Array [\n        Object {\n          \"builtin\": \"release/reset-version\",\n        },\n      ],\n    },\n  },\n}\n`;\n\nexports[`publisher (defaults) 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n  release_golang:\n    name: Publish to GitHub Go Module Repository\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-go@v3\n        with:\n          go-version: ^1.16.0\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-golang\n        env:\n          GIT_USER_NAME: github-actions\n          GIT_USER_EMAIL: github-actions@github.com\n          GITHUB_TOKEN: \\${{ secrets.GO_GITHUB_TOKEN }}\n  release_maven:\n    name: Publish to Maven Central\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-java@v3\n        with:\n          distribution: temurin\n          java-version: 11.x\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-maven\n        env:\n          MAVEN_GPG_PRIVATE_KEY: \\${{ secrets.MAVEN_GPG_PRIVATE_KEY }}\n          MAVEN_GPG_PRIVATE_KEY_PASSPHRASE: \\${{ secrets.MAVEN_GPG_PRIVATE_KEY_PASSPHRASE }}\n          MAVEN_PASSWORD: \\${{ secrets.MAVEN_PASSWORD }}\n          MAVEN_USERNAME: \\${{ secrets.MAVEN_USERNAME }}\n          MAVEN_STAGING_PROFILE_ID: \\${{ secrets.MAVEN_STAGING_PROFILE_ID }}\n  release_npm:\n    name: Publish to npm\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-npm\n        env:\n          NPM_DIST_TAG: latest\n          NPM_TOKEN: \\${{ secrets.NPM_TOKEN }}\n  release_nuget:\n    name: Publish to NuGet Gallery\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-dotnet@v2\n        with:\n          dotnet-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-nuget\n        env:\n          NUGET_API_KEY: \\${{ secrets.NUGET_API_KEY }}\n  release_pypi:\n    name: Publish to PyPI\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - uses: actions/setup-python@v3\n        with:\n          python-version: 3.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: npx -p publib@latest publib-pypi\n        env:\n          TWINE_USERNAME: \\${{ secrets.TWINE_USERNAME }}\n          TWINE_PASSWORD: \\${{ secrets.TWINE_PASSWORD }}\n\"\n`;\n\nexports[`publisher (defaults) 2`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"tasks\": Object {\n    \"build\": Object {\n      \"description\": \"Full release build\",\n      \"name\": \"build\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n        Object {\n          \"spawn\": \"pre-compile\",\n        },\n        Object {\n          \"spawn\": \"compile\",\n        },\n        Object {\n          \"spawn\": \"post-compile\",\n        },\n        Object {\n          \"spawn\": \"test\",\n        },\n        Object {\n          \"spawn\": \"package\",\n        },\n      ],\n    },\n    \"bump\": Object {\n      \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n      \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n      \"env\": Object {\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"OUTFILE\": \"version.json\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\",\n      },\n      \"name\": \"bump\",\n      \"steps\": Array [\n        Object {\n          \"builtin\": \"release/bump-version\",\n        },\n      ],\n    },\n    \"compile\": Object {\n      \"description\": \"Only compile\",\n      \"name\": \"compile\",\n    },\n    \"default\": Object {\n      \"description\": \"Synthesize project files\",\n      \"name\": \"default\",\n    },\n    \"eject\": Object {\n      \"description\": \"Remove projen from the project\",\n      \"env\": Object {\n        \"PROJEN_EJECTING\": \"true\",\n      },\n      \"name\": \"eject\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n      ],\n    },\n    \"package\": Object {\n      \"description\": \"Creates the distribution package\",\n      \"name\": \"package\",\n    },\n    \"post-compile\": Object {\n      \"description\": \"Runs after successful compilation\",\n      \"name\": \"post-compile\",\n    },\n    \"pre-compile\": Object {\n      \"description\": \"Prepare the project for compilation\",\n      \"name\": \"pre-compile\",\n    },\n    \"publish:github\": Object {\n      \"description\": \"Publish this package to GitHub Releases\",\n      \"name\": \"publish:github\",\n      \"requiredEnv\": Array [\n        \"GITHUB_TOKEN\",\n        \"GITHUB_REPOSITORY\",\n        \"GITHUB_REF\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n        },\n      ],\n    },\n    \"publish:golang\": Object {\n      \"description\": \"Publish this package to GitHub Go Module Repository\",\n      \"env\": Object {\n        \"GIT_USER_EMAIL\": \"github-actions@github.com\",\n        \"GIT_USER_NAME\": \"github-actions\",\n      },\n      \"name\": \"publish:golang\",\n      \"requiredEnv\": Array [\n        \"GITHUB_TOKEN\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"npx -p publib@latest publib-golang\",\n        },\n      ],\n    },\n    \"publish:maven\": Object {\n      \"description\": \"Publish this package to Maven Central\",\n      \"name\": \"publish:maven\",\n      \"requiredEnv\": Array [\n        \"MAVEN_GPG_PRIVATE_KEY\",\n        \"MAVEN_GPG_PRIVATE_KEY_PASSPHRASE\",\n        \"MAVEN_PASSWORD\",\n        \"MAVEN_USERNAME\",\n        \"MAVEN_STAGING_PROFILE_ID\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"npx -p publib@latest publib-maven\",\n        },\n      ],\n    },\n    \"publish:npm\": Object {\n      \"description\": \"Publish this package to npm\",\n      \"env\": Object {\n        \"NPM_DIST_TAG\": \"latest\",\n      },\n      \"name\": \"publish:npm\",\n      \"requiredEnv\": Array [\n        \"NPM_TOKEN\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"npx -p publib@latest publib-npm\",\n        },\n      ],\n    },\n    \"publish:nuget\": Object {\n      \"description\": \"Publish this package to NuGet Gallery\",\n      \"name\": \"publish:nuget\",\n      \"requiredEnv\": Array [\n        \"NUGET_API_KEY\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"npx -p publib@latest publib-nuget\",\n        },\n      ],\n    },\n    \"publish:pypi\": Object {\n      \"description\": \"Publish this package to PyPI\",\n      \"name\": \"publish:pypi\",\n      \"requiredEnv\": Array [\n        \"TWINE_USERNAME\",\n        \"TWINE_PASSWORD\",\n      ],\n      \"steps\": Array [\n        Object {\n          \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n        },\n        Object {\n          \"exec\": \"npx -p publib@latest publib-pypi\",\n        },\n      ],\n    },\n    \"release\": Object {\n      \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n      \"env\": Object {\n        \"RELEASE\": \"true\",\n      },\n      \"name\": \"release\",\n      \"steps\": Array [\n        Object {\n          \"exec\": \"rm -fr dist\",\n        },\n        Object {\n          \"spawn\": \"bump\",\n        },\n        Object {\n          \"spawn\": \"build\",\n        },\n        Object {\n          \"spawn\": \"unbump\",\n        },\n        Object {\n          \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n        },\n      ],\n    },\n    \"test\": Object {\n      \"description\": \"Run tests\",\n      \"name\": \"test\",\n    },\n    \"unbump\": Object {\n      \"description\": \"Restores version to 0.0.0\",\n      \"env\": Object {\n        \"BUMPFILE\": \"dist/version.txt\",\n        \"CHANGELOG\": \"dist/changelog.md\",\n        \"OUTFILE\": \"version.json\",\n        \"RELEASETAG\": \"dist/releasetag.txt\",\n        \"RELEASE_TAG_PREFIX\": \"\",\n      },\n      \"name\": \"unbump\",\n      \"steps\": Array [\n        Object {\n          \"builtin\": \"release/reset-version\",\n        },\n      ],\n    },\n  },\n}\n`;\n\nexports[`releaseBranches can be defined with different tag prefixes to the same major version 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release-firefox.yml linguist-generated\n/.github/workflows/release-safari.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release-firefox.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release-firefox\non:\n  push:\n    branches:\n      - firefox\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:firefox\n        run: projen release:firefox\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/release-safari.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release-safari\non:\n  push:\n    branches:\n      - safari\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:safari\n        run: projen release:safari\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release-firefox.yml\n!/.github/workflows/release-safari.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release-firefox.yml\",\n      \".github/workflows/release-safari.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"goo.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"firefox/\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github:firefox\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:firefox\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"firefox\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:github:safari\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:safari\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"safari\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"release:firefox\": Object {\n        \"description\": \"Prepare a release from \\\\\"firefox\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"1\",\n          \"RELEASE\": \"true\",\n          \"RELEASE_TAG_PREFIX\": \"firefox/\",\n        },\n        \"name\": \"release:firefox\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"release:safari\": Object {\n        \"description\": \"Prepare a release from \\\\\"safari\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"1\",\n          \"RELEASE\": \"true\",\n          \"RELEASE_TAG_PREFIX\": \"safari/\",\n        },\n        \"name\": \"release:safari\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"goo.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"firefox/\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`releaseBranches can be use to define additional branches 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release-3.x.yml linguist-generated\n/.github/workflows/release-next.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release-3.x.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release-3.x\non:\n  push:\n    branches:\n      - 3.x\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:3.x\n        run: projen release:3.x\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/release-next.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release-next\non:\n  push:\n    branches:\n      - next\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:next\n        run: projen release:next\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release\n        run: projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.github/workflows/release-3.x.yml\n!/.github/workflows/release-next.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release-3.x.yml\",\n      \".github/workflows/release-next.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"goo.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"main\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:github:3.x\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:3.x\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"3.x\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"publish:github:next\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:next\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"next\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"1\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"release:3.x\": Object {\n        \"description\": \"Prepare a release from \\\\\"3.x\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"3\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release:3.x\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"release:next\": Object {\n        \"description\": \"Prepare a release from \\\\\"next\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"4\",\n          \"PRERELEASE\": \"pre\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release:next\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"goo.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`with major version filter 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - 10.x\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:10.x\n        run: projen release:10.x\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github:10.x\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:10.x\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"10.x\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"release:10.x\": Object {\n        \"description\": \"Prepare a release from \\\\\"10.x\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"10\",\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release:10.x\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n\nexports[`with release tag prefix 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.gitignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - 10.x\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: release:10.x\n        run: projen release:10.x\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\nnode_modules/\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n\",\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".gitignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"prefix/\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"publish:github:10.x\": Object {\n        \"description\": \"Publish this package to GitHub Releases\",\n        \"name\": \"publish:github:10.x\",\n        \"requiredEnv\": Array [\n          \"GITHUB_TOKEN\",\n          \"GITHUB_REPOSITORY\",\n          \"GITHUB_REF\",\n        ],\n        \"steps\": Array [\n          Object {\n            \"exec\": \"test \\\\\"$(git branch --show-current)\\\\\" = \\\\\"10.x\\\\\"\",\n          },\n          Object {\n            \"exec\": \"errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\",\n          },\n        ],\n      },\n      \"release:10.x\": Object {\n        \"description\": \"Prepare a release from \\\\\"10.x\\\\\" branch\",\n        \"env\": Object {\n          \"MAJOR\": \"10\",\n          \"RELEASE\": \"true\",\n          \"RELEASE_TAG_PREFIX\": \"prefix/\",\n        },\n        \"name\": \"release:10.x\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"version.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"prefix/\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n    },\n  },\n  \"README.md\": \"# replace this\",\n}\n`;\n"
  },
  {
    "path": "test/release/bump.test.ts",
    "content": "import { execSync } from \"child_process\";\nimport { mkdtempSync } from \"fs\";\nimport { tmpdir } from \"os\";\nimport { join } from \"path\";\nimport { readFile, readJson, writeFile } from \"fs-extra\";\nimport * as logging from \"../../src/logging\";\nimport { bump, BumpOptions } from \"../../src/release/bump-version\";\n\nlogging.disable();\njest.setTimeout(1000 * 60 * 5); // 5min\n\ntest(\"first release\", async () => {\n  const result = await testBump();\n  expect(result.version).toStrictEqual(\"0.0.0\");\n  expect(result.changelog).toMatch(/.*## 0\\.0\\.0 \\(\\d{4}-\\d{2}-\\d{2}\\).*/); // ## 0.0.0 (2021-01-01)\n  expect(result.bumpfile).toStrictEqual(\"0.0.0\");\n  expect(result.tag).toStrictEqual(\"v0.0.0\");\n});\n\ntest(\"first release, with major\", async () => {\n  const result = await testBump({\n    options: { majorVersion: 2 },\n  });\n  expect(result.version).toStrictEqual(\"2.0.0\");\n  expect(result.changelog).toMatch(/.*## 2\\.0\\.0 \\(\\d{4}-\\d{2}-\\d{2}\\).*/); // ## 2.0.0 (2021-01-01)\n  expect(result.bumpfile).toStrictEqual(\"2.0.0\");\n  expect(result.tag).toStrictEqual(\"v2.0.0\");\n});\n\ntest(\"first release, with new major\", async () => {\n  const result = await testBump({\n    options: { majorVersion: 4 },\n    commits: [{ message: \"v1\", tag: \"v1.2.3\" }, { message: \"commit2\" }],\n  });\n  expect(result.version).toStrictEqual(\"4.0.0\");\n  expect(result.changelog.includes(\"## [4.0.0]\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"4.0.0\");\n  expect(result.tag).toStrictEqual(\"v4.0.0\");\n});\n\ntest(\"first release, with prerelease\", async () => {\n  const result = await testBump({\n    options: { prerelease: \"beta\" },\n  });\n  expect(result.version).toStrictEqual(\"0.0.0-beta.0\");\n  expect(result.changelog.includes(\"## 0.0.0-beta.0\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"0.0.0-beta.0\");\n});\n\ntest(\"first release, with prefix\", async () => {\n  const result = await testBump({\n    options: { tagPrefix: \"prefix/\" },\n  });\n  expect(result.version).toStrictEqual(\"0.0.0\");\n  expect(result.changelog.includes(\"## 0.0.0\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"0.0.0\");\n  expect(result.tag).toStrictEqual(\"prefix/v0.0.0\");\n});\n\ntest(\"select latest\", async () => {\n  const result = await testBump({\n    commits: [\n      { message: \"first version\", tag: \"v1.1.0\" },\n      { message: \"second version\", tag: \"v1.2.0\" },\n      { message: \"fix: bug\" },\n      { message: \"fix: another bug\" },\n    ],\n  });\n\n  expect(result.version).toEqual(\"1.2.1\");\n  expect(result.changelog.includes(\"Bug Fixes\")).toBeTruthy();\n  expect(result.changelog.includes(\"another bug\")).toBeTruthy();\n  expect(result.changelog.includes(\"bug\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"1.2.1\");\n  expect(result.tag).toStrictEqual(\"v1.2.1\");\n});\n\ntest(\"select latest, with prefix\", async () => {\n  const result = await testBump({\n    options: { tagPrefix: \"prefix/\" },\n    commits: [\n      { message: \"first version\", tag: \"prefix/v1.1.0\" },\n      { message: \"unrelated version\", tag: \"v2.0.0\" },\n      { message: \"feat: feature 1\", tag: \"prefix/v1.2.0\" },\n      { message: \"fix: bug\" },\n      { message: \"fix: another bug\" },\n    ],\n  });\n\n  expect(result.version).toEqual(\"1.2.1\");\n  expect(result.changelog.includes(\"Bug Fixes\")).toBeTruthy();\n  expect(result.changelog.includes(\"another bug\")).toBeTruthy();\n  expect(result.changelog.includes(\"bug\")).toBeTruthy();\n  expect(result.changelog.includes(\"feature 1\")).toBeFalsy();\n  expect(result.bumpfile).toStrictEqual(\"1.2.1\");\n  expect(result.tag).toStrictEqual(\"prefix/v1.2.1\");\n});\n\ntest(\"select latest with major\", async () => {\n  const commits = [\n    { message: \"first version\", tag: \"v1.1.0\" },\n    { message: \"boom\", tag: \"v10.21.0\" },\n    { message: \"second version\", tag: \"v1.2.0\" },\n    { message: \"fix: bug\" },\n    { message: \"fix: another bug\" },\n  ];\n\n  const result1 = await testBump({\n    options: { majorVersion: 1 },\n    commits: commits,\n  });\n\n  expect(result1.version).toEqual(\"1.2.1\");\n  expect(result1.bumpfile).toEqual(\"1.2.1\");\n  expect(result1.tag).toStrictEqual(\"v1.2.1\");\n\n  const result10 = await testBump({\n    options: { majorVersion: 10 },\n    commits: commits,\n  });\n\n  expect(result10.version).toEqual(\"10.21.1\");\n  expect(result10.bumpfile).toStrictEqual(\"10.21.1\");\n  expect(result10.tag).toStrictEqual(\"v10.21.1\");\n});\n\ntest(\"bump with major equal to 0\", async () => {\n  const commits = [\n    { message: \"first version\", tag: \"v0.1.0\" },\n    { message: \"second version\", tag: \"v0.1.1\" },\n    { message: \"stable branch\", tag: \"v1.0.0\" },\n    { message: \"fix: bug\" },\n  ];\n\n  const result1 = await testBump({\n    options: { majorVersion: 0 },\n    commits: commits,\n  });\n\n  expect(result1.version).toEqual(\"0.1.2\");\n  expect(result1.bumpfile).toEqual(\"0.1.2\");\n  expect(result1.tag).toStrictEqual(\"v0.1.2\");\n});\n\ntest(\"already tagged version is not bumped again\", async () => {\n  const result = await testBump({\n    commits: [\n      { message: \"first version\", tag: \"v1.1.0\" },\n      { message: \"second version\", tag: \"v1.2.0\" },\n      { message: \"fix: bug\", tag: \"v1.2.1\" },\n    ],\n  });\n\n  expect(result.version).toEqual(\"1.2.1\");\n  expect(result.changelog.includes(\"Bug Fixes\")).toBeTruthy();\n  expect(result.changelog.includes(\"bug\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"1.2.1\");\n  expect(result.tag).toStrictEqual(\"v1.2.1\");\n});\n\ntest(\"bump fails due to crossing major version\", async () => {\n  const commits = [\n    { message: \"first version\", tag: \"v1.1.0\" },\n    { message: \"boom\", tag: \"v10.21.0\" },\n    { message: \"second version\", tag: \"v1.2.0\" },\n    {\n      message: \"fix: another bug\\n\\nBREAKING CHANGE: cause major version bump\",\n    },\n    { message: \"fix: bug\" },\n  ];\n\n  const promise = testBump({\n    options: { majorVersion: 1 },\n    commits: commits,\n  });\n\n  await expect(promise).rejects.toThrow(\n    /bump failed: this branch is configured to only publish v1 releases - bump resulted in 2.0.0/\n  );\n});\n\ntest(\"customization to versionrc reflects to changelog\", async () => {\n  const commits = [\n    { message: \"first version\", tag: \"v1.1.0\" },\n    { message: \"fix: bug\" },\n  ];\n  const result = await testBump({\n    options: { versionrcOptions: { compareUrlFormat: \"testCompareUrl\" } },\n    commits,\n  });\n\n  await expect(result.changelog).toContain(\"testCompareUrl\");\n});\n\ntest(\"minMajorVersion increases major version if current release is lower\", async () => {\n  const result = await testBump({\n    options: { minMajorVersion: 1 },\n    commits: [{ message: \"v0\", tag: \"v0.1.2\" }, { message: \"commit2\" }],\n  });\n  expect(result.version).toStrictEqual(\"1.0.0\");\n  expect(result.changelog.includes(\"## [1.0.0]\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"1.0.0\");\n  expect(result.tag).toStrictEqual(\"v1.0.0\");\n});\n\ntest(\"minMajorVersion keeps release version if version is equal\", async () => {\n  const result = await testBump({\n    options: { minMajorVersion: 1 },\n    commits: [{ message: \"v1\", tag: \"v1.2.3\" }, { message: \"commit2\" }],\n  });\n  expect(result.version).toStrictEqual(\"1.2.4\");\n  expect(result.changelog.includes(\"## [1.2.4]\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"1.2.4\");\n  expect(result.tag).toStrictEqual(\"v1.2.4\");\n});\n\ntest(\"minMajorVersion has no effect if version is higher\", async () => {\n  const result = await testBump({\n    options: { minMajorVersion: 1 },\n    commits: [{ message: \"v2\", tag: \"v2.3.3\" }, { message: \"commit2\" }],\n  });\n  expect(result.version).toStrictEqual(\"2.3.4\");\n  expect(result.changelog.includes(\"## [2.3.4]\")).toBeTruthy();\n  expect(result.bumpfile).toStrictEqual(\"2.3.4\");\n  expect(result.tag).toStrictEqual(\"v2.3.4\");\n});\n\ntest(\"minMajorVersion throws if set together with majorVersion\", async () => {\n  await expect(\n    testBump({\n      options: { minMajorVersion: 1, majorVersion: 1 },\n      commits: [{ message: \"v0\", tag: \"v0.1.2\" }, { message: \"commit2\" }],\n    })\n  ).rejects.toThrow(/minMajorVersion and majorVersion cannot be used together/);\n});\n\n//----------------------------------------------------------------------------------------------------------------------------------\n\nasync function testBump(\n  opts: {\n    options?: Partial<BumpOptions>;\n    commits?: { message: string; tag?: string }[];\n  } = {}\n) {\n  const workdir = mkdtempSync(join(tmpdir(), \"bump-test-\"));\n\n  const git = (cmd: string) =>\n    execSync(`git ${cmd}`, {\n      cwd: workdir,\n      stdio: \"inherit\",\n      timeout: 10_000, // let's try to catch hanging processes sooner than later\n    });\n\n  // init a git repository\n  git(\"init -b main\");\n  git('config user.email \"you@example.com\"');\n  git('config user.name \"Your Name\"');\n  git(\"config commit.gpgsign false\");\n  git(\"config tag.gpgsign false\");\n\n  const commit = async (message: string) => {\n    await writeFile(join(workdir, \"dummy.txt\"), message);\n    git(\"add .\");\n    git(`commit -m \"${message}\"`);\n  };\n\n  await commit(\"initial commit\");\n\n  for (const c of opts.commits ?? []) {\n    await commit(c.message);\n    if (c.tag) {\n      git(`tag ${c.tag}`);\n    }\n  }\n\n  await bump(workdir, {\n    changelog: \"changelog.md\",\n    versionFile: \"version.json\",\n    bumpFile: \"bump.txt\",\n    releaseTagFile: \"releasetag.txt\",\n    ...opts.options,\n  });\n\n  return {\n    version: (await readJson(join(workdir, \"version.json\"))).version,\n    changelog: await readFile(join(workdir, \"changelog.md\"), \"utf8\"),\n    bumpfile: await readFile(join(workdir, \"bump.txt\"), \"utf8\"),\n    tag: await readFile(join(workdir, \"releasetag.txt\"), \"utf8\"),\n  };\n}\n"
  },
  {
    "path": "test/release/release-trigger.test.ts",
    "content": "import { ReleaseTrigger } from \"../../src/release/release-trigger\";\n\nlet releaseTrigger: ReleaseTrigger;\n\ndescribe(\"manual release\", () => {\n  beforeAll(() => {\n    releaseTrigger = ReleaseTrigger.manual();\n  });\n\n  test(\"has a changelog by default\", () => {\n    expect(releaseTrigger.changelogPath).toEqual(\"CHANGELOG.md\");\n  });\n\n  test(\"is not continuous\", () => {\n    expect(releaseTrigger.isContinuous).toBe(false);\n  });\n\n  test(\"does not have a schedule\", () => {\n    expect(releaseTrigger.schedule).toBeUndefined();\n  });\n\n  test(\"is manual\", () => {\n    expect(releaseTrigger.isManual).toBe(true);\n  });\n\n  describe(\"without changelog\", () => {\n    test(\"does not have a changelog\", () => {\n      releaseTrigger = ReleaseTrigger.manual({ changelog: false });\n\n      expect(releaseTrigger.changelogPath).toBeUndefined();\n    });\n\n    test(\"ignores changelogPath\", () => {\n      releaseTrigger = ReleaseTrigger.manual({\n        changelog: false,\n        changelogPath: \"out/changelog.md\",\n      });\n\n      expect(releaseTrigger.changelogPath).toBeUndefined();\n    });\n  });\n\n  describe(\"with custom git-push command\", () => {\n    test(\"has custom git-push command\", () => {\n      releaseTrigger = ReleaseTrigger.manual({\n        gitPushCommand: \"git push --follow-tags -o ci.skip origin main\",\n      });\n\n      expect(releaseTrigger.gitPushCommand).toEqual(\n        \"git push --follow-tags -o ci.skip origin main\"\n      );\n    });\n  });\n});\n\ndescribe(\"continuous release\", () => {\n  beforeAll(() => {\n    releaseTrigger = ReleaseTrigger.continuous();\n  });\n\n  test(\"is continuous\", () => {\n    expect(releaseTrigger.isContinuous).toBe(true);\n  });\n\n  test(\"is not manual\", () => {\n    expect(releaseTrigger.isManual).toBe(false);\n  });\n\n  test(\"does not have a schedule\", () => {\n    expect(releaseTrigger.schedule).toBeUndefined();\n  });\n\n  test(\"does not have a changelog\", () => {\n    expect(releaseTrigger.changelogPath).toBeUndefined();\n  });\n});\n\ndescribe(\"scheduled release\", () => {\n  let releaseSchedule = \"0 17 * * *\";\n\n  beforeAll(() => {\n    releaseTrigger = ReleaseTrigger.scheduled({\n      schedule: releaseSchedule,\n    });\n  });\n\n  test(\"is not continuous\", () => {\n    expect(releaseTrigger.isContinuous).toBe(false);\n  });\n\n  test(\"is not manual\", () => {\n    expect(releaseTrigger.isManual).toBe(false);\n  });\n\n  test(\"has a schedule\", () => {\n    expect(releaseTrigger.schedule).toEqual(releaseSchedule);\n  });\n\n  test(\"does not have a changelog\", () => {\n    expect(releaseTrigger.changelogPath).toBeUndefined();\n  });\n});\n"
  },
  {
    "path": "test/release/release.test.ts",
    "content": "import * as YAML from \"yaml\";\nimport { JobPermission } from \"../../src/github/workflows-model\";\nimport { Publisher, Release, ReleaseTrigger } from \"../../src/release\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"minimal\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"with major version filter\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"10.x\",\n    majorVersion: 10,\n    releaseWorkflowName: \"release\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toBeDefined();\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"with release tag prefix\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"10.x\",\n    majorVersion: 10,\n    releaseTagPrefix: \"prefix/\",\n    releaseWorkflowName: \"release\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toBeDefined();\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"addBranch() can be used for additional release branches\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    majorVersion: 1,\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.addBranch(\"2.x\", { majorVersion: 2 });\n  release.addBranch(\"10.x\", { majorVersion: 10 });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toBeDefined();\n  expect(outdir[\".github/workflows/release-2.x.yml\"]).toBeDefined();\n  expect(outdir[\".github/workflows/release-10.x.yml\"]).toBeDefined();\n  expect(outdir).toMatchSnapshot();\n});\n\ntest('if multiple branches are defined, the default branch requires a \"majorVersion\"', () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  const addBranch = () => release.addBranch(\"2.x\", { majorVersion: 2 });\n\n  // THEN\n  expect(addBranch).toThrow(\n    /you must specify \\\"majorVersion\\\" for the default branch when adding multiple release branches/\n  );\n});\n\ntest(\"publisher (defaults)\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true,\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToGo();\n  release.publisher.publishToMaven();\n  release.publisher.publishToNpm();\n  release.publisher.publishToNuget();\n  release.publisher.publishToPyPi();\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toMatchSnapshot();\n  expect(outdir[\".projen/tasks.json\"]).toMatchSnapshot();\n});\n\ntest(\"publishers are added as jobs to all release workflows\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    majorVersion: 1,\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.addBranch(\"2.x\", { majorVersion: 2 });\n  release.publisher.publishToNpm();\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  const wf1 = YAML.parse(outdir[\".github/workflows/release.yml\"]);\n  expect(wf1).toMatchObject({\n    on: { push: { branches: [\"main\"] } },\n    jobs: {\n      release: {\n        steps: expect.any(Array),\n      },\n      release_npm: {},\n    },\n  });\n  expect(wf1.jobs.release.steps.length).toBe(5);\n  const wf2 = YAML.parse(outdir[\".github/workflows/release-2.x.yml\"]);\n  expect(wf2).toMatchObject({\n    on: { push: { branches: [\"2.x\"] } },\n    jobs: {\n      release: {\n        steps: expect.any(Array),\n      },\n      release_npm: {},\n    },\n  });\n  expect(wf2.jobs.release.steps.length).toBe(5);\n});\n\ntest(\"manual releases do not generate a release workflow\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    releaseTrigger: ReleaseTrigger.manual(),\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toBeUndefined();\n});\n\ntest(\"releaseSchedule schedules releases\", () => {\n  // GIVEN\n  const schedule = \"0 17 * * *\";\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    releaseEveryCommit: false,\n    releaseSchedule: schedule,\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  const wf1 = YAML.parse(outdir[\".github/workflows/release.yml\"]);\n  expect(wf1).toMatchObject({\n    on: {\n      schedule: expect.arrayContaining([{ cron: schedule }]),\n    },\n  });\n});\n\ntest(\"manual release publish happens after anti-tamper check\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    releaseTrigger: ReleaseTrigger.manual(),\n    artifactsDirectory: \"dist\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  const steps: Object[] = outdir[\".projen/tasks.json\"].tasks.release.steps;\n  const antiTamperStepIndex = steps.findIndex(\n    (obj: any) => obj.exec === Release.ANTI_TAMPER_CMD\n  );\n  const publishGitStepIndex = steps.findIndex(\n    (obj: any) => obj.spawn === Publisher.PUBLISH_GIT_TASK_NAME\n  );\n  expect(publishGitStepIndex).toBeGreaterThan(antiTamperStepIndex);\n});\n\ntest(\"manual release with custom git-push\", () => {\n  // GIVEN\n  const project = new TestProject();\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    releaseTrigger: ReleaseTrigger.manual({\n      gitPushCommand: \"git push --follow-tags -o ci.skip origin main\",\n    }),\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  const steps =\n    outdir[\".projen/tasks.json\"].tasks[Publisher.PUBLISH_GIT_TASK_NAME].steps;\n  expect(steps).toEqual(\n    expect.arrayContaining([\n      expect.objectContaining({\n        exec: \"git push --follow-tags -o ci.skip origin main\",\n      }),\n    ])\n  );\n});\n\ntest(\"addJobs() can be used to add arbitrary jobs to the release workflows\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    majorVersion: 0,\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  release.addBranch(\"foo\", { majorVersion: 4, workflowName: \"foo-workflow\" });\n  release.publisher.publishToPyPi();\n\n  // WHEN\n  release.addJobs({\n    random_job: {\n      runsOn: [\"foo\"],\n      permissions: {\n        actions: JobPermission.NONE,\n      },\n      steps: [],\n    },\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"majorVersion can be 0\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"goo.json\",\n    branch: \"main\",\n    majorVersion: 0,\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toMatchSnapshot();\n  expect(outdir[\".projen/tasks.json\"]).toMatchSnapshot();\n});\n\ntest(\"prerelease can be specified per branch\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"goo.json\",\n    branch: \"main\",\n    majorVersion: 0,\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  release.addBranch(\"10.x\", { majorVersion: 10, prerelease: \"pre\" });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toMatchSnapshot();\n  expect(outdir[\".github/workflows/release.10.x.yml\"]).toMatchSnapshot();\n  expect(outdir[\".projen/tasks.json\"]).toMatchSnapshot();\n});\n\ntest(\"releaseBranches can be use to define additional branches\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"goo.json\",\n    branch: \"main\",\n    majorVersion: 1,\n    releaseBranches: {\n      \"3.x\": { majorVersion: 3 },\n      next: { majorVersion: 4, prerelease: \"pre\" },\n    },\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"releaseBranches can be defined with different tag prefixes to the same major version\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"goo.json\",\n    branch: \"firefox\",\n    majorVersion: 1,\n    releaseWorkflowName: \"release-firefox\",\n    releaseTagPrefix: \"firefox/\",\n    releaseBranches: {\n      safari: { majorVersion: 1, tagPrefix: \"safari/\" },\n    },\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"releaseBranches as an array throws an error since type was changed\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  expect(\n    () =>\n      new Release(project, {\n        task: project.buildTask,\n        versionFile: \"goo.json\",\n        branch: \"main\",\n        majorVersion: 1,\n        releaseBranches: [\"10.x\", \"2.x\"] as any,\n        artifactsDirectory: \"dist\",\n      })\n  ).toThrow(/\\\"releaseBranches\\\" is no longer an array. See type annotations/);\n});\n\ntest(\"github packages are supported by npm, maven, and nuget\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToNpm({\n    registry: \"npm.pkg.github.com\",\n  });\n  release.publisher.publishToMaven({\n    mavenRepositoryUrl: \"maven.pkg.github.com\",\n  });\n  release.publisher.publishToNuget({\n    nugetServer: \"nuget.pkg.github.com\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"can enable issue creation on failed releases with a custom label\", () => {\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    releaseFailureIssue: true,\n    releaseFailureIssueLabel: \"custom-label\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToNpm({\n    registry: \"npm.pkg.github.com\",\n  });\n\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toMatchSnapshot();\n});\n\ntest(\"AWS CodeArtifact is supported by npm\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToNpm({\n    registry:\n      \"my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"AWS CodeArtifact is supported by npm with AWS access keys\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToNpm({\n    registry:\n      \"my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n    codeArtifactOptions: {\n      accessKeyIdSecret: \"OTHER_AWS_ACCESS_KEY_ID\",\n      secretAccessKeySecret: \"OTHER_AWS_SECRET_ACCESS_KEY\",\n    },\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"AWS CodeArtifact is supported with role to assume\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const roleArn = \"role-arn\";\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToNpm({\n    registry:\n      \"my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/\",\n    codeArtifactOptions: {\n      roleToAssume: roleArn,\n    },\n  });\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"can be modified with escape hatches\", () => {\n  // GIVEN\n  const project = new TestProject();\n  new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  project\n    .github!.tryFindWorkflow(\"release\")!\n    .file!.addOverride(\"jobs.release.env.FOO\", \"VALUE1\");\n  project\n    .github!.tryFindWorkflow(\"release\")!\n    .file!.addOverride(\"jobs.release_github.env.BAR\", \"VALUE2\");\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  expect(outdir[\".github/workflows/release.yml\"]).toContain(\"FOO: VALUE1\");\n  expect(outdir[\".github/workflows/release.yml\"]).toContain(\"BAR: VALUE2\");\n  expect(outdir).toMatchSnapshot();\n});\n\ntest(\"publisher can use custom github runner\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    workflowRunsOn: [\"self-hosted\"],\n    publishTasks: true, // to increase coverage\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToGo();\n  release.publisher.publishToMaven();\n  release.publisher.publishToNpm();\n  release.publisher.publishToNuget();\n  release.publisher.publishToPyPi();\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  const workflow = YAML.parse(outdir[\".github/workflows/release.yml\"]);\n  for (let job of Object.keys(workflow.jobs)) {\n    expect(workflow.jobs[job][\"runs-on\"]).toEqual(\"self-hosted\");\n  }\n});\n\ndescribe(\"npmDistTag\", () => {\n  test(\"determines npm dist-tag used in the workflow\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const release = new Release(project, {\n      releaseBranches: {\n        \"main-3\": { majorVersion: 3, npmDistTag: \"latest-3\" },\n      },\n      branch: \"main\",\n      majorVersion: 1,\n      task: project.buildTask,\n      versionFile: \"version.json\",\n      publishTasks: true, // to increase coverage\n      artifactsDirectory: \"dist\",\n    });\n\n    release.publisher.publishToNpm();\n\n    // THEN\n    const files = synthSnapshot(project);\n    const main = YAML.parse(files[\".github/workflows/release.yml\"]);\n    const main3 = YAML.parse(files[\".github/workflows/release-main-3.yml\"]);\n    expect(main.jobs.release_npm.steps[2].env).toStrictEqual({\n      NPM_DIST_TAG: \"latest\",\n      NPM_TOKEN: \"${{ secrets.NPM_TOKEN }}\",\n    });\n    expect(main3.jobs.release_npm.steps[2].env).toStrictEqual({\n      NPM_TOKEN: \"${{ secrets.NPM_TOKEN }}\",\n      NPM_DIST_TAG: \"latest-3\",\n    });\n  });\n\n  test(\"the dist-tag for the default branch is set at the root\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const release = new Release(project, {\n      releaseBranches: {\n        \"main-3\": { majorVersion: 3, npmDistTag: \"latest-3\" },\n      },\n      branch: \"main\",\n      majorVersion: 1,\n      npmDistTag: \"main-tag\",\n      task: project.buildTask,\n      versionFile: \"version.json\",\n      publishTasks: true, // to increase coverage\n      artifactsDirectory: \"dist\",\n    });\n\n    release.publisher.publishToNpm();\n\n    // THEN\n    const files = synthSnapshot(project);\n    const main = YAML.parse(files[\".github/workflows/release.yml\"]);\n    const main3 = YAML.parse(files[\".github/workflows/release-main-3.yml\"]);\n    expect(main.jobs.release_npm.steps[2].env).toStrictEqual({\n      NPM_TOKEN: \"${{ secrets.NPM_TOKEN }}\",\n      NPM_DIST_TAG: \"main-tag\",\n    });\n    expect(main3.jobs.release_npm.steps[2].env).toStrictEqual({\n      NPM_TOKEN: \"${{ secrets.NPM_TOKEN }}\",\n      NPM_DIST_TAG: \"latest-3\",\n    });\n  });\n\n  test(\"if branch-level dist-tag is set, then publishToNpm cannot specify dist-tag\", () => {\n    // GIVEN\n    const project = new TestProject();\n\n    // WHEN\n    const release = new Release(project, {\n      releaseBranches: {\n        \"main-3\": { majorVersion: 3, npmDistTag: \"latest-3\" },\n      },\n      branch: \"main\",\n      majorVersion: 1,\n      task: project.buildTask,\n      versionFile: \"version.json\",\n      publishTasks: true, // to increase coverage\n      artifactsDirectory: \"dist\",\n    });\n\n    release.publisher.publishToNpm({ distTag: \"next\" });\n\n    expect(() => project.synth()).toThrow(\n      /cannot set branch-level npmDistTag and npmDistTag in publishToNpm/\n    );\n  });\n});\n\ntest(\"if publishTasks is disabled, no publish tasks are created\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    workflowRunsOn: [\"self-hosted\"],\n    artifactsDirectory: \"dist\",\n  });\n\n  // WHEN\n  release.publisher.publishToGo();\n  release.publisher.publishToMaven();\n  release.publisher.publishToNpm();\n  release.publisher.publishToNuget();\n  release.publisher.publishToPyPi();\n\n  // THEN\n  const files = synthSnapshot(project);\n  const tasks = files[\".projen/tasks.json\"].tasks;\n  expect(\n    Object.keys(tasks).filter((t) => t.startsWith(\"publish:\")).length\n  ).toBe(0);\n});\n\ntest(\"dryRun\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  const release = new Release(project, {\n    task: project.buildTask,\n    versionFile: \"version.json\",\n    branch: \"main\",\n    artifactsDirectory: \"dist\",\n    publishDryRun: true,\n  });\n\n  // WHEN\n  release.publisher.publishToGo();\n  release.publisher.publishToMaven();\n  release.publisher.publishToNpm();\n  release.publisher.publishToNuget();\n  release.publisher.publishToPyPi();\n\n  // THEN\n  const files = synthSnapshot(project);\n  const releaseWorkflow = YAML.parse(files[\".github/workflows/release.yml\"]);\n  const releaseJobs = Object.keys(releaseWorkflow.jobs).filter((name) =>\n    name.startsWith(\"release_\")\n  );\n  for (const name of releaseJobs) {\n    const job = releaseWorkflow.jobs[name];\n    expect(\n      job.steps.slice(-1)[0].run.startsWith('echo \"DRY RUN:')\n    ).toBeTruthy();\n  }\n});\n"
  },
  {
    "path": "test/release/tag.test.ts",
    "content": "import { execSync } from \"child_process\";\nimport { mkdtempSync } from \"fs\";\nimport { tmpdir } from \"os\";\nimport { join } from \"path\";\nimport { writeFile } from \"fs-extra\";\nimport * as logging from \"../../src/logging\";\nimport { tag, TagOptions } from \"../../src/release/tag-version\";\nimport { execCapture } from \"../../src/util\";\n\nlogging.disable();\njest.setTimeout(1000 * 60); // 1min\n\nconst DEFAULT_RELEASE_TAG = \"v0.1.1\";\nconst DEFAULT_RELEASE_TAG_FILE = \"releasetag.txt\";\nconst DEFAULT_CHANGELOG_CONTENT = \"foo bar baz\";\nconst DEFAULT_CHANGELOG = \"changelog.md\";\n\ntest(\"tag from bump artifacts\", async () => {\n  const result = await testTag();\n  expect(result.latestTag).toMatch(`${DEFAULT_RELEASE_TAG}`);\n  expect(result.latestTagAnnotation).toMatch(DEFAULT_CHANGELOG_CONTENT);\n});\n\ntest(\"empty release tag file\", async () => {\n  await expect(testTag({ testOptions: { releaseTag: \"\" } })).rejects.toThrow();\n});\n\ntest(\"missing release tag file\", async () => {\n  await expect(\n    testTag({ testOptions: { releaseTagPath: \"bogus\" } })\n  ).rejects.toThrow();\n});\n\ntest(\"missing changelog file\", async () => {\n  await expect(\n    testTag({ testOptions: { changelogPath: \"bogus\" } })\n  ).rejects.toThrow();\n});\n\ninterface TestTagOpts {\n  tagOptions?: Partial<TagOptions>;\n  testOptions?: {\n    releaseTag?: string;\n    changelogContent?: string;\n    changelogPath?: string;\n    releaseTagPath?: string;\n  };\n}\n\nasync function testTag(opts: TestTagOpts = {}) {\n  const workdir = mkdtempSync(join(tmpdir(), \"tag-test-\"));\n  const releaseTag = opts.testOptions?.releaseTag ?? DEFAULT_RELEASE_TAG;\n  const changelogContent =\n    opts.testOptions?.changelogContent ?? DEFAULT_CHANGELOG_CONTENT;\n  const changelog = opts.tagOptions?.changelog ?? DEFAULT_CHANGELOG;\n  const releaseTagFile =\n    opts.tagOptions?.releaseTagFile ?? DEFAULT_RELEASE_TAG_FILE;\n\n  const git = gitFunc(workdir);\n  const getLatestTag = latestTagFunc(workdir);\n  const getTagAnnotation = tagAnnotationFunc(workdir);\n\n  // init a git repository\n  git(\"init -q\");\n  git('config user.email \"you@example.com\"');\n  git('config user.name \"Your Name\"');\n  git(\"config commit.gpgsign false\");\n  git(\"config tag.gpgsign false\");\n  await writeFile(\n    join(workdir, opts.testOptions?.releaseTagPath || \"\", releaseTagFile),\n    releaseTag\n  );\n  await writeFile(\n    join(workdir, opts.testOptions?.changelogPath || \"\", changelog),\n    changelogContent\n  );\n  git(\"add .\");\n  git('commit -m \"chore: foo\"');\n\n  await tag(workdir, {\n    changelog,\n    releaseTagFile,\n  });\n\n  const latestTag = await getLatestTag();\n  const latestTagAnnotation = await getTagAnnotation(latestTag);\n\n  return {\n    latestTag,\n    latestTagAnnotation,\n  };\n}\n\nconst gitFunc = (cwd: string) => (cmd: string) =>\n  execSync(`git ${cmd}`, { cwd: cwd, stdio: \"inherit\" });\nconst latestTagFunc = (cwd: string) => () =>\n  execCapture(\"git describe --tags --abbrev=0\", { cwd: cwd }).toString();\nconst tagAnnotationFunc = (cwd: string) => (releaseTag: string) =>\n  execCapture(`git tag -l --format='%(contents)' ${releaseTag}`, {\n    cwd: cwd,\n  }).toString();\n"
  },
  {
    "path": "test/release/update-changelog.test.ts",
    "content": "import { execSync } from \"child_process\";\nimport { mkdtempSync } from \"fs\";\nimport { tmpdir } from \"os\";\nimport { join } from \"path\";\nimport { writeFile, mkdir } from \"fs-extra\";\nimport * as logging from \"../../src/logging\";\nimport {\n  updateChangelog,\n  UpdateChangelogOptions,\n} from \"../../src/release/update-changelog\";\nimport { execCapture, tryReadFile } from \"../../src/util\";\n\nlogging.disable();\njest.setTimeout(1000 * 60); // 1min\n\nconst DEFAULT_VERSION = \"0.1.1\";\nconst DEFAULT_VERSION_FILE = \"dist/version.txt\";\nconst DEFAULT_INPUT_CHANGELOG = \"dist/changelog.md\";\nconst DEFAULT_INPUT_CHANGELOG_CONTENT = `### [${DEFAULT_VERSION}](https://examplerepourl.com/diff/path) (2021-09-04)`;\nconst DEFAULT_OUTPUT_CHANGELOG = \"CHANGELOG.md\";\nconst DEFAULT_OUTPUT_CHANGELOG_CONTENT =\n  \"### output changelog original content\";\n\ntest(\"updates project changelog from bump artifacts\", async () => {\n  const result = await testUpdateChangelog();\n\n  expect(result.projectChangelogContent).toMatch(DEFAULT_VERSION);\n});\n\ntest(\"commits new changelog\", async () => {\n  const result = await testUpdateChangelog();\n\n  expect(result.commits[0]).toMatch(`chore(release): ${DEFAULT_VERSION}`);\n  expect(result.lastCommitContent).toMatch(/.*CHANGELOG\\.md.*/g);\n});\n\ntest(\"adds a new changelog if missing\", async () => {\n  const result = await testUpdateChangelog({\n    testOptions: {\n      skipOutputChangelog: true,\n    },\n  });\n\n  expect(result.projectChangelogContent.length).toBeGreaterThan(0);\n});\n\ntest(\"matches first changelog entry missing brackets around the version\", async () => {\n  const result = await testUpdateChangelog({\n    testOptions: {\n      inputChangelogContent: `## ${DEFAULT_VERSION} (2021-09-04)`,\n    },\n  });\n\n  expect(result.commits[0]).toMatch(`chore(release): ${DEFAULT_VERSION}`);\n  expect(result.lastCommitContent).toMatch(/.*CHANGELOG\\.md.*/g);\n});\n\ntest(\"duplicate release tag update is idempotent\", async () => {\n  const result1 = await testUpdateChangelog();\n  const result2 = await testUpdateChangelog({\n    testOptions: {\n      cwd: result1.cwd,\n    },\n  });\n  const commitsForVersion = result2.commits.filter((commit) =>\n    commit.includes(DEFAULT_VERSION)\n  );\n\n  expect(commitsForVersion.length).toEqual(1);\n  expect(\n    result2.projectChangelogContent.match(DEFAULT_VERSION)?.length\n  ).toEqual(1);\n});\n\ntest(\"missing release tag throws an error\", async () => {\n  await expect(\n    testUpdateChangelog({\n      testOptions: {\n        version: \"\",\n      },\n    })\n  ).rejects.toThrow();\n});\n\ntest(\"mismatched release tag and input changelog release tag throws an error\", async () => {\n  const version = \"1.2.0\";\n  const inputChangelogVersion = \"1.1.0\";\n\n  await expect(\n    testUpdateChangelog({\n      testOptions: {\n        version: version,\n        inputChangelogContent: `### [${inputChangelogVersion}](https://examplerepourl.com/diff/path) (2021-09-04)`,\n      },\n    })\n  ).rejects.toThrow();\n});\n\ninterface TestUpdateChangelogOpts {\n  updateChangelogOptions?: Partial<UpdateChangelogOptions>;\n  testOptions?: {\n    cwd?: string;\n    version?: string;\n    inputChangelogContent?: string;\n    skipOutputChangelog?: boolean;\n    versionPath?: string;\n    updateCount?: number;\n  };\n}\n\nasync function testUpdateChangelog(opts: TestUpdateChangelogOpts = {}) {\n  const workdir =\n    opts.testOptions?.cwd ?? mkdtempSync(join(tmpdir(), \"tag-test-\"));\n  const version = opts.testOptions?.version ?? DEFAULT_VERSION;\n  const versionFile =\n    opts.updateChangelogOptions?.versionFile ?? DEFAULT_VERSION_FILE;\n  const inputChangelogContent =\n    opts.testOptions?.inputChangelogContent ?? DEFAULT_INPUT_CHANGELOG_CONTENT;\n  const inputChangelog =\n    opts.updateChangelogOptions?.inputChangelog ?? DEFAULT_INPUT_CHANGELOG;\n  const outputChangelogContent = DEFAULT_OUTPUT_CHANGELOG_CONTENT;\n  const outputChangelog =\n    opts.updateChangelogOptions?.outputChangelog ?? DEFAULT_OUTPUT_CHANGELOG;\n  const skipOutputChangelog = opts.testOptions?.skipOutputChangelog ?? false;\n\n  const inputChangelogFullPath = join(workdir, inputChangelog);\n  const outputChangelogFullPath = join(workdir, outputChangelog);\n\n  const git = gitFunc(workdir);\n\n  if (!opts.testOptions?.cwd) {\n    // init a git repository and make initial commit\n    git(\"init -q\");\n    git('config user.email \"you@example.com\"');\n    git('config user.name \"Your Name\"');\n    git(\"config commit.gpgsign false\");\n    await mkdir(join(workdir, \"dist\"));\n    await writeFile(join(workdir, versionFile), version);\n    await writeFile(inputChangelogFullPath, inputChangelogContent);\n    if (!skipOutputChangelog) {\n      await writeFile(outputChangelogFullPath, outputChangelogContent);\n      git(`add ${outputChangelogFullPath}`);\n      git('commit -m \"chore: setup\"');\n    }\n  }\n\n  await updateChangelog(workdir, {\n    inputChangelog,\n    outputChangelog,\n    versionFile: versionFile,\n  });\n\n  const commits = execCapture(\"git log --oneline\", {\n    cwd: workdir,\n  })\n    .toString()\n    .split(\"\\n\");\n  const lastCommitContent = execCapture(\n    \"git diff-tree --no-commit-id --name-only -r HEAD\",\n    { cwd: workdir }\n  ).toString();\n  const projectChangelogContent = await tryReadFile(outputChangelogFullPath);\n\n  return {\n    cwd: workdir,\n    projectChangelogContent,\n    lastCommitContent,\n    commits,\n  };\n}\n\nconst gitFunc = (cwd: string) => (cmd: string) =>\n  execSync(`git ${cmd}`, { cwd: cwd, stdio: \"inherit\" });\n"
  },
  {
    "path": "test/resolve.test.ts",
    "content": "import { resolve } from \"../src/_resolve\";\nimport { IResolvable } from \"../src/file\";\n\ntest(\"null\", () => {\n  expect(resolve(null)).toStrictEqual(null);\n});\n\ntest(\"undefined\", () => {\n  expect(resolve(undefined)).toStrictEqual(undefined);\n});\n\ntest(\"string\", () => {\n  expect(resolve(\"\")).toStrictEqual(\"\");\n  expect(resolve(\"hello\")).toStrictEqual(\"hello\");\n  expect(resolve(\"0\")).toStrictEqual(\"0\");\n  expect(resolve(\"hello world\")).toStrictEqual(\"hello world\");\n  expect(resolve(\"  \")).toStrictEqual(\"  \");\n});\n\ntest(\"number\", () => {\n  expect(resolve(0)).toStrictEqual(0);\n  expect(resolve(10)).toStrictEqual(10);\n  expect(resolve(-102)).toStrictEqual(-102);\n});\n\ntest(\"boolean\", () => {\n  expect(resolve(true)).toStrictEqual(true);\n  expect(resolve(false)).toStrictEqual(false);\n});\n\ntest(\"array\", () => {\n  expect(resolve([])).toStrictEqual([]);\n  expect(resolve([1, 2, 3])).toStrictEqual([1, 2, 3]);\n});\n\ntest(\"object\", () => {\n  expect(resolve(Object.create(null))).toStrictEqual({});\n  expect(resolve({})).toStrictEqual({});\n  expect(resolve({ foo: 123, hello: [1, 2, { bar: 3 }] })).toStrictEqual({\n    foo: 123,\n    hello: [1, 2, { bar: 3 }],\n  });\n});\n\ntest(\"functions are resolved\", () => {\n  expect(resolve(() => 123)).toStrictEqual(123);\n  expect(resolve(() => \"hello\")).toStrictEqual(\"hello\");\n  expect(resolve(() => undefined)).toStrictEqual(undefined);\n});\n\ntest(\"resolvable objects are resolved\", () => {\n  const resolvedContent = \"Content\";\n  const resolvable: IResolvable = { toJSON: () => resolvedContent };\n  expect(resolve({ foo: resolvable })).toStrictEqual({ foo: resolvedContent });\n});\n\ntest(\"recursive resolve\", () => {\n  expect(resolve(() => [1, 2, () => 30])).toStrictEqual([1, 2, 30]);\n  expect(resolve(() => ({ foo: 123, bar: () => \"bar\" }))).toStrictEqual({\n    foo: 123,\n    bar: \"bar\",\n  });\n  expect(\n    resolve(() => ({\n      foo: 123,\n      bar: () => [\"bar\", \"baz\", { hello: () => \"world\" }],\n    }))\n  ).toStrictEqual({\n    foo: 123,\n    bar: [\"bar\", \"baz\", { hello: \"world\" }],\n  });\n});\n\ntest(\"context is passed to functions\", () => {\n  expect(resolve((x: number) => x + 1, { args: [10] })).toStrictEqual(11);\n\n  type Calculator = {\n    [op: string]: (lhs: number, rhs: number, text?: string) => any;\n  };\n\n  const calculator: Calculator = {\n    add: (a, b) => a + b,\n    sub: (a, b) => a - b,\n    mul: (a, b) => a * b,\n    div: (a, b) => a / b,\n\n    fun: (a1, b1, text) => [\n      `this is ${text}`,\n      (a2: number) => a1 * a2,\n      (_: number, b2: number) => b1 + b2,\n      {\n        another: {\n          level: (a3: number, b3: number, text3: string) =>\n            `hello ${text3} ${b3} ${a3}`,\n        },\n      },\n    ],\n  };\n\n  expect(resolve(calculator, { args: [10, 2, \"fun\"] })).toStrictEqual({\n    add: 12,\n    sub: 8,\n    mul: 20,\n    div: 5,\n    fun: [\"this is fun\", 100, 4, { another: { level: \"hello fun 2 10\" } }],\n  });\n});\n\ntest('\"undefined\" values are omitted', () => {\n  const r = (o: any) => resolve(o);\n  expect(r({ foo: undefined })).toStrictEqual({});\n  expect(r({ foo: { bar: undefined } })).toStrictEqual({ foo: {} });\n  expect(r({ foo: { bar: undefined, hello: 123 } })).toStrictEqual({\n    foo: { hello: 123 },\n  });\n  expect(r({ foo: [undefined] })).toStrictEqual({ foo: [] });\n});\n\ntest(\"omitEmpty\", () => {\n  const r = (o: any) => resolve(o, { omitEmpty: true });\n  expect(r({ foo: {} })).toStrictEqual(undefined);\n  expect(r({ foo: { bar: {} } })).toStrictEqual(undefined);\n  expect(r({ foo: [] })).toStrictEqual(undefined);\n  expect(r({ bar: { foo: [] } })).toStrictEqual(undefined);\n  expect(r({ foo: { hello: \"world\", boom: { bar: [] } } })).toStrictEqual({\n    foo: { hello: \"world\" },\n  });\n});\n"
  },
  {
    "path": "test/sample-file.test.ts",
    "content": "import * as path from \"path\";\nimport { Project, ProjectOptions } from \"../src\";\nimport { SampleDir, SampleFile } from \"../src/sample-file\";\nimport { synthSnapshot } from \"./util\";\n\ntest(\"sample file from text contents\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new SampleFile(project, \"welcome.txt\", { contents: \"hello\\nworld\" });\n\n  // THEN\n  expect(synthSnapshot(project)[\"welcome.txt\"]).toMatch(\"hello\\nworld\");\n});\n\ntest(\"sample file from source\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new SampleFile(project, \"logo.svg\", {\n    sourcePath: path.resolve(__dirname, \"..\", \"logo\", \"projen.svg\"),\n  });\n\n  // THEN\n  expect(synthSnapshot(project)[\"logo.svg\"]).toMatch(\n    '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>'\n  );\n});\n\ntest(\"sample directory from files\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new SampleDir(project, \"public\", {\n    files: {\n      \"foo.txt\": \"Hello world!\",\n      \"bar.txt\": \"Test test test\",\n    },\n  });\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\"public/foo.txt\"]).toMatch(\"Hello world!\");\n  expect(snapshot[\"public/bar.txt\"]).toMatch(\"Test test test\");\n});\n\ntest(\"sample directory from source\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new SampleDir(project, \"public\", {\n    sourceDir: path.resolve(__dirname, \"..\", \"assets\", \"web\", \"react\"),\n  });\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\"public/robots.txt\"].length).toBeGreaterThan(0);\n  expect(snapshot[\"public/index.html\"].length).toBeGreaterThan(0);\n  expect(Object.keys(snapshot[\"public/manifest.json\"]).length).toBeGreaterThan(\n    0\n  );\n});\n\ntest(\"sample directory from source with overwritten files\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new SampleDir(project, \"public\", {\n    files: {\n      \"index.html\": \"<!doctype html><body>Hello world!</body>\",\n    },\n    sourceDir: path.resolve(__dirname, \"..\", \"assets\", \"web\", \"react\"),\n  });\n\n  // THEN\n  const snapshot = synthSnapshot(project);\n  expect(snapshot[\"public/index.html\"]).toMatch(\n    \"<!doctype html><body>Hello world!</body>\"\n  );\n  expect(snapshot[\"public/robots.txt\"].length).toBeGreaterThan(0);\n  expect(Object.keys(snapshot[\"public/manifest.json\"]).length).toBeGreaterThan(\n    0\n  );\n});\n\nexport class TestProject extends Project {\n  constructor(options: Omit<ProjectOptions, \"name\"> = {}) {\n    super({\n      name: \"my-project\",\n      ...options,\n    });\n  }\n}\n"
  },
  {
    "path": "test/smithy/smithy-build.test.ts",
    "content": "import { SmithyBuild } from \"../../src/smithy/smithy-build\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\ntest(\"adds default smithy-build.json file\", () => {\n  // WHEN\n  const project = new TestProject();\n  new SmithyBuild(project, {});\n  const snps = synthSnapshot(project);\n\n  // THEN\n  expect(snps[\"smithy-build.json\"].version).toBe(\"1.0\");\n});\n\ntest(\"does not add smithy-build.json file by default\", () => {\n  // WHEN\n  const project = new TestProject();\n  const snps = synthSnapshot(project);\n\n  // THEN\n  expect(snps[\"smithy-build.json\"]).toBeUndefined();\n});\n\ntest(\"can add imports\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const smithyBuild = new SmithyBuild(project, {});\n\n  // WHEN\n  smithyBuild.addImport(\"foo.json\");\n  const snps = synthSnapshot(project);\n\n  // THEN\n  expect(snps[\"smithy-build.json\"].imports).toContain(\"foo.json\");\n});\n\ntest(\"can add plugins\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const smithyBuild = new SmithyBuild(project, {});\n\n  // WHEN\n  smithyBuild.addPlugins({\n    \"my-plugin\": {\n      service: \"my-service\",\n    },\n  });\n  const snps = synthSnapshot(project);\n\n  // THEN\n  expect(snps[\"smithy-build.json\"].plugins).toStrictEqual({\n    \"my-plugin\": {\n      service: \"my-service\",\n    },\n  });\n});\n\ntest(\"can add projections\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const smithyBuild = new SmithyBuild(project, {});\n\n  // WHEN\n  smithyBuild.addProjections({\n    testProjection: {\n      imports: [\"foo.json\"],\n      transforms: [\n        {\n          name: \"changeTypes\",\n          args: {},\n        },\n      ],\n    },\n  });\n  const snps = synthSnapshot(project);\n\n  // THEN\n  expect(snps[\"smithy-build.json\"].projections).toStrictEqual({\n    testProjection: {\n      imports: [\"foo.json\"],\n      transforms: [\n        {\n          name: \"changeTypes\",\n          args: {},\n        },\n      ],\n    },\n  });\n});\n"
  },
  {
    "path": "test/source-code.test.ts",
    "content": "import { SourceCode } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"lines\", () => {\n  const project = new TestProject();\n  const hello = new SourceCode(project, \"test.txt\");\n  hello.line(\"this is my first source file\");\n  hello.line(); // empty line\n  hello.line(\"last line\");\n\n  expect(synthSnapshot(project)[\"test.txt\"]).toStrictEqual(\n    [\"this is my first source file\", \"\", \"last line\"].join(\"\\n\")\n  );\n});\n\ntest(\"open/close\", () => {\n  const project = new TestProject();\n  const hello = new SourceCode(project, \"test.txt\");\n  hello.line(\"level0\");\n  hello.open();\n  hello.line(\"level1\");\n  hello.open();\n  hello.line(\"level2\");\n  hello.close();\n  hello.line(\"level1\");\n  hello.close();\n  hello.line(\"level0\");\n  expect(synthSnapshot(project)[\"test.txt\"]).toStrictEqual(\n    [\"level0\", \"  level1\", \"    level2\", \"  level1\", \"level0\"].join(\"\\n\")\n  );\n});\n\ntest(\"indent\", () => {\n  const project = new TestProject();\n  const hello = new SourceCode(project, \"test.txt\", { indent: 4 });\n  hello.line(\"level0\");\n  hello.open();\n  hello.line(\"level1\");\n  hello.close();\n  hello.line(\"level0\");\n  expect(synthSnapshot(project)[\"test.txt\"]).toStrictEqual(\n    [\"level0\", \"    level1\", \"level0\"].join(\"\\n\")\n  );\n});\n\ntest(\"trailing whitespace is trimmed\", () => {\n  const project = new TestProject();\n  const hello = new SourceCode(project, \"test.txt\", { indent: 4 });\n  hello.open();\n  hello.line();\n  hello.open();\n  hello.line(\"hello, world.   \");\n  hello.close();\n  hello.close();\n\n  expect(synthSnapshot(project)[\"test.txt\"]).toStrictEqual(\n    [\"\", \"        hello, world.\"].join(\"\\n\")\n  );\n});\n"
  },
  {
    "path": "test/subproject.test.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { Project, TextFile, ProjectOptions } from \"../src\";\nimport { PROJEN_MARKER } from \"../src/common\";\nimport { TestProject } from \"./util\";\n\ntest(\"composing projects declaratively\", () => {\n  const comp = new TestProject();\n  new Project({\n    name: \"foo\",\n    parent: comp,\n    outdir: path.join(\"packages\", \"foo\"),\n  });\n  comp.synth();\n\n  // THEN\n  expect(\n    fs.existsSync(path.join(comp.outdir, \"packages\", \"foo\", \".gitignore\"))\n  ).toBeTruthy();\n});\n\ntest(\"composing projects synthesizes to subdirs\", () => {\n  // GIVEN\n  const comp = new TestProject();\n\n  // WHEN\n  new Project({\n    name: \"foo\",\n    parent: comp,\n    outdir: path.join(\"packages\", \"foo\"),\n  });\n  new Project({\n    name: \"bar\",\n    parent: comp,\n    outdir: path.join(\"packages\", \"bar\"),\n  });\n\n  comp.synth();\n\n  // THEN\n  expect(fs.pathExistsSync(path.join(comp.outdir, \"README.md\")));\n  expect(\n    fs.pathExistsSync(path.join(comp.outdir, \"packages\", \"foo\", \".gitignore\"))\n  );\n  expect(\n    fs.pathExistsSync(path.join(comp.outdir, \"packages\", \"bar\", \".gitignore\"))\n  );\n});\n\ntest(\"errors when paths overlap\", () => {\n  // GIVEN\n  const comp = new TestProject();\n  new Project({\n    name: \"foo\",\n    parent: comp,\n    outdir: path.join(\"packages\", \"foo\"),\n  });\n\n  // WHEN/THEN\n  expect(\n    () =>\n      new Project({\n        name: \"foo\",\n        parent: comp,\n        outdir: path.join(\"packages\", \"foo\"),\n      })\n  ).toThrowError(/there is already a sub-project with/i);\n});\n\ntest(\"multiple levels\", () => {\n  const root = new TestProject();\n  const child1 = new Project({\n    name: \"child1\",\n    parent: root,\n    outdir: \"child1\",\n  });\n  const child2 = new Project({\n    name: \"child2\",\n    parent: child1,\n    outdir: \"child2\",\n  });\n\n  expect(child1.outdir).toEqual(path.join(root.outdir, \"child1\"));\n  expect(child2.outdir).toEqual(path.join(root.outdir, \"child1\", \"child2\"));\n});\n\ntest(\"subprojects cannot introduce files that override each other\", () => {\n  const root = new TestProject();\n  const child = new Project({\n    name: \"sub-project\",\n    parent: root,\n    outdir: \"sub-project\",\n  });\n\n  new TextFile(root, \"sub-project/file.txt\");\n  expect(() => new TextFile(child, \"file.txt\")).toThrow(\n    /there is already a file under sub-project(\\\\|\\/)file\\.txt/\n  );\n});\n\ntest('\"outdir\" for subprojects must be relative', () => {\n  const root = new TestProject();\n  expect(\n    () => new Project({ name: \"foobar\", parent: root, outdir: \"/foo/bar\" })\n  ).toThrow(/\"outdir\" must be a relative path/);\n});\n\ntest(\"subproject generated files do not get cleaned up by parent project\", () => {\n  const root = new TestProject();\n  const child = new PreSynthProject({ parent: root, outdir: \"sub-project\" });\n\n  // no files have been generated yet\n  expect(fs.existsSync(child.file.absolutePath)).toEqual(false);\n\n  // generate all project files at least once\n  root.synth();\n  expect(child.fileExistedDuringPresynth).toEqual(false);\n  expect(fs.existsSync(child.file.absolutePath)).toEqual(true);\n\n  // resynthesize projects with all generated files already existing\n  root.synth();\n  expect(child.fileExistedDuringPresynth).toEqual(true);\n  expect(fs.existsSync(child.file.absolutePath)).toEqual(true);\n});\n\n// a project that depends on generated files during preSynthesize()\nclass PreSynthProject extends Project {\n  public file: TextFile;\n  public fileExistedDuringPresynth: boolean;\n  constructor(options: Omit<ProjectOptions, \"name\"> = {}) {\n    super({ name: \"presynth-project\", ...options });\n\n    this.file = new TextFile(this, \"presynth.txt\", { lines: [PROJEN_MARKER] });\n    this.fileExistedDuringPresynth = false;\n  }\n\n  preSynthesize() {\n    this.fileExistedDuringPresynth = fs.existsSync(this.file.absolutePath);\n  }\n}\n"
  },
  {
    "path": "test/tasks/__snapshots__/tasks.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`default tasks 1`] = `\nObject {\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n  \"tasks\": Object {\n    \"build\": Object {\n      \"description\": \"Full release build\",\n      \"name\": \"build\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n        Object {\n          \"spawn\": \"pre-compile\",\n        },\n        Object {\n          \"spawn\": \"compile\",\n        },\n        Object {\n          \"spawn\": \"post-compile\",\n        },\n        Object {\n          \"spawn\": \"test\",\n        },\n        Object {\n          \"spawn\": \"package\",\n        },\n      ],\n    },\n    \"compile\": Object {\n      \"description\": \"Only compile\",\n      \"name\": \"compile\",\n    },\n    \"default\": Object {\n      \"description\": \"Synthesize project files\",\n      \"name\": \"default\",\n    },\n    \"eject\": Object {\n      \"description\": \"Remove projen from the project\",\n      \"env\": Object {\n        \"PROJEN_EJECTING\": \"true\",\n      },\n      \"name\": \"eject\",\n      \"steps\": Array [\n        Object {\n          \"spawn\": \"default\",\n        },\n      ],\n    },\n    \"package\": Object {\n      \"description\": \"Creates the distribution package\",\n      \"name\": \"package\",\n    },\n    \"post-compile\": Object {\n      \"description\": \"Runs after successful compilation\",\n      \"name\": \"post-compile\",\n    },\n    \"pre-compile\": Object {\n      \"description\": \"Prepare the project for compilation\",\n      \"name\": \"pre-compile\",\n    },\n    \"test\": Object {\n      \"description\": \"Run tests\",\n      \"name\": \"test\",\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "test/tasks/runtime.test.ts",
    "content": "import { spawnSync } from \"child_process\";\nimport { EOL } from \"os\";\nimport { basename, join } from \"path\";\nimport { mkdirpSync } from \"fs-extra\";\nimport { Project } from \"../../src\";\nimport { TaskRuntime } from \"../../src/task-runtime\";\nimport { TestProject } from \"../util\";\n\ntest(\"minimal case (just a shell command)\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.addTask(\"test1\", {\n    exec: \"echo hello_tasks!\",\n  });\n\n  // THEN\n  expect(executeTask(p, \"test1\")).toEqual([\"hello_tasks!\"]);\n});\n\ntest(\"fails if the step fails\", () => {\n  // GIVEN\n  const p = new TestProject();\n\n  // WHEN\n  p.addTask(\"testme\", {\n    exec: \"false\",\n  });\n\n  // THEN\n  expect(() => executeTask(p, \"testme\")).toThrow(\n    /Task \\\"testme\\\" failed when executing \\\"false\\\"/\n  );\n});\n\ntest(\"multiple steps\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const t = p.addTask(\"testme\");\n\n  // WHEN\n  t.exec(\"echo step1\");\n  t.exec(\"echo step2\");\n  t.exec(\"echo step3\");\n\n  // THEN\n  expect(executeTask(p, \"testme\")).toEqual([\"step1\", \"step2\", \"step3\"]);\n});\n\ntest(\"execution stops if a step fails\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const t = p.addTask(\"testme\");\n\n  // WHEN\n  t.exec(\"echo step1\");\n  t.exec(\"echo step2\");\n  t.exec(\"echo step3\");\n  t.exec(\"echo failing && false\");\n  t.exec(\"echo step4\");\n\n  // THEN\n  expect(() => executeTask(p, \"testme\")).toThrow(\n    /Task \\\"testme\\\" failed when executing \\\"echo failing && false\\\"/\n  );\n});\n\ndescribe(\"condition\", () => {\n  test(\"zero exit code means that steps should be executed\", () => {\n    // GIVEN\n    const p = new TestProject();\n\n    // WHEN\n    const t = p.addTask(\"foo\", {\n      condition: \"echo evaluating_condition\",\n    });\n\n    t.exec(\"echo step1\");\n    t.exec(\"echo step2\");\n\n    // THEN\n    expect(executeTask(p, \"foo\")).toEqual([\n      \"evaluating_condition\",\n      \"step1\",\n      \"step2\",\n    ]);\n  });\n\n  test(\"non-zero exit code means steps should not be executed\", () => {\n    // GIVEN\n    const p = new TestProject();\n\n    // WHEN\n    const t = p.addTask(\"foo\", {\n      condition: \"echo failing_condition && false\",\n    });\n\n    t.exec(\"echo step1\");\n    t.exec(\"echo step2\");\n\n    // THEN\n    expect(executeTask(p, \"foo\")).toEqual([\"failing_condition\"]);\n  });\n});\n\ndescribe(\"cwd\", () => {\n  test(\"default cwd is project root\", () => {\n    const p = new TestProject();\n    p.addTask(\"testme\", { exec: \"echo cwd is $PWD\" });\n    expect(\n      executeTask(p, \"testme\")[0].includes(basename(p.outdir))\n    ).toBeTruthy();\n  });\n\n  test(\"if a step changes cwd, it will not affect next steps\", () => {\n    const p = new TestProject();\n    const task = p.addTask(\"testme\");\n    task.exec(\"cd /tmp\");\n    task.exec(\"echo $PWD\");\n    expect(\n      executeTask(p, \"testme\")[0].includes(basename(p.outdir))\n    ).toBeTruthy();\n  });\n\n  test(\"cwd can be set at the task level\", () => {\n    const p = new TestProject();\n    const cwd = join(p.outdir, \"mypwd\");\n    mkdirpSync(cwd);\n    const task = p.addTask(\"testme\", {\n      cwd,\n    });\n    task.exec(\"echo step1=$PWD\");\n    task.exec(\"echo step2=$PWD\");\n    for (const line of executeTask(p, \"testme\")) {\n      expect(line.includes(\"mypwd\")).toBeTruthy();\n    }\n  });\n\n  test(\"cwd can be set at step level\", () => {\n    const p = new TestProject();\n    const taskcwd = join(p.outdir, \"mypwd\");\n    const stepcwd = join(p.outdir, \"yourpwd\");\n    mkdirpSync(taskcwd);\n    mkdirpSync(stepcwd);\n    const task = p.addTask(\"testme\", { cwd: taskcwd });\n    task.exec(\"echo step1=$PWD\");\n    task.exec(\"echo step2=$PWD\", { cwd: stepcwd });\n\n    const lines = executeTask(p, \"testme\");\n    expect(lines[0].includes(\"mypwd\")).toBeTruthy();\n    expect(lines[1].includes(\"yourpwd\")).toBeTruthy();\n  });\n\n  test(\"fails gracefully if cwd does not exist (task level)\", () => {\n    const p = new TestProject();\n    p.addTask(\"testme\", {\n      cwd: join(p.outdir, \"not-found\"),\n      exec: \"echo hi\",\n    });\n    expect(() => executeTask(p, \"testme\")).toThrow(/invalid workdir/);\n  });\n\n  test(\"fails gracefully if cwd does not exist (step level)\", () => {\n    const p = new TestProject();\n    const task = p.addTask(\"testme\");\n    task.exec(\"echo step\", { cwd: join(p.outdir, \"mystep\") });\n    expect(() => executeTask(p, \"testme\")).toThrow(\n      /must be an existing directory/\n    );\n  });\n});\n\ndescribe(\"say\", () => {\n  test('\"say\" can be used to print an info log during execution', () => {\n    const p = new TestProject();\n    const task = p.addTask(\"say\");\n    task.say(\"hello, world\");\n\n    p.synth();\n\n    const rt = new TaskRuntime(p.outdir);\n    expect(rt.tasks.find((t) => t.name === \"say\")).toStrictEqual({\n      name: \"say\",\n      steps: [{ say: \"hello, world\" }],\n    });\n  });\n});\n\ntest(\"builtin tasks are scripts embedded inside projen\", () => {\n  const p = new TestProject();\n  const task = p.addTask(\"boom\");\n  task.builtin(\"builtin-example\");\n  p.synth();\n\n  const lines = executeTask(p, \"boom\");\n  expect(lines).toStrictEqual([\"hello, I am a builtin task\", \"second line\"]);\n});\n\ntest(\"env is inherited from parent tasks\", () => {\n  const p = new TestProject();\n  const parent = p.addTask(\"parent\", { env: { E1: \"parent1\", E2: \"parent2\" } });\n  const child = p.addTask(\"child\", {\n    env: { E2: \"child1\", E3: \"child2\" },\n    exec: 'echo \"child: [$E1,$E2,$E3]\"',\n  });\n  parent.exec('echo \"parent: [$E1,$E2,$E3]\"');\n  parent.spawn(child);\n\n  const lines = executeTask(p, \"parent\");\n  expect(lines).toStrictEqual([\n    \"parent: [parent1,parent2,]\",\n    \"child: [parent1,child1,child2]\",\n  ]);\n});\n\ntest(\"requiredEnv can be used to specify required environment variables\", () => {\n  const p = new TestProject();\n  p.addTask(\"my-task\", {\n    requiredEnv: [\"ENV1\", \"ENV2\", \"ENV3\"],\n    exec: 'echo \"$ENV1 $ENV2 $ENV3\"',\n  });\n\n  expect(() => executeTask(p, \"my-task\")).toThrow(\n    /missing required environment variables: ENV1,ENV2,ENV3/\n  );\n  expect(() => executeTask(p, \"my-task\", { ENV1: \"env1\" })).toThrow(\n    /missing required environment variables: ENV2,ENV3/\n  );\n  expect(\n    executeTask(p, \"my-task\", { ENV1: \"env1\", ENV2: \"env2\", ENV3: \"env3\" })\n  ).toStrictEqual([\"env1 env2 env3\"]);\n});\n\nfunction executeTask(\n  p: Project,\n  taskName: string,\n  env: Record<string, string> = {}\n) {\n  p.synth();\n\n  const args = [require.resolve(\"../../lib/cli\"), taskName].map(\n    (x) => `\"${x}\"`\n  );\n\n  const result = spawnSync(`\"${process.execPath}\"`, args, {\n    cwd: p.outdir,\n    shell: true,\n    env: { ...process.env, ...env },\n    timeout: 10_000, // let's try to catch hanging processes sooner than later\n  });\n  if (result.status !== 0) {\n    throw new Error(`non-zero exit code: ${result.stderr.toString(\"utf-8\")}`);\n  }\n\n  return result.stdout.toString(\"utf-8\").trim().split(EOL);\n}\n"
  },
  {
    "path": "test/tasks/tasks.test.ts",
    "content": "import { Project, TaskRuntime } from \"../../src\";\nimport { TasksManifest, TaskStep } from \"../../src/task-model\";\nimport { TestProject, synthSnapshot } from \"../util\";\n\ntest(\"default tasks\", () => {\n  const p = new TestProject();\n  expect(synthTasksManifest(p)).toMatchSnapshot();\n});\n\ntest(\"empty task\", () => {\n  const p = new TestProject();\n\n  // WHEN\n  p.addTask(\"empty\");\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      empty: {\n        name: \"empty\",\n      },\n    },\n  });\n});\n\ntest(\"remove task\", () => {\n  const p = new TestProject();\n\n  // WHEN\n  const task = p.addTask(\"task1\");\n  p.addTask(\"task2\");\n  const removeTask = p.removeTask(\"task1\");\n\n  // THEN\n  expect(removeTask).toEqual(task);\n  expectManifest(p, {\n    tasks: {\n      task2: {\n        name: \"task2\",\n      },\n    },\n  });\n});\n\ntest(\"re-add removed task\", () => {\n  const p = new TestProject();\n\n  // WHEN\n  p.addTask(\"task1\");\n  p.addTask(\"task2\");\n  const removeTask = p.removeTask(\"task2\");\n  p.addTask(\"task2\");\n\n  // THEN\n  expect(removeTask).toBeTruthy();\n  expectManifest(p, {\n    tasks: {\n      task1: {\n        name: \"task1\",\n      },\n      task2: {\n        name: \"task2\",\n      },\n    },\n  });\n});\n\ntest(\"throw when removing a dependent task\", () => {\n  const p = new TestProject();\n\n  // WHEN\n  const primary = p.addTask(\"primary\");\n  const dependent = p.addTask(\"dependent\");\n  primary.spawn(dependent);\n\n  // THEN\n  expect(() => p.removeTask(\"dependent\")).toThrowError(\n    'Unable to remove task \"dependent\" because the following tasks depend on it: primary'\n  );\n});\n\ntest(\"remove already removed task\", () => {\n  const p = new TestProject();\n\n  expect(p.removeTask(\"task1\")).toBe(undefined);\n});\n\ntest('multiple \"exec\" commands', () => {\n  const p = new TestProject();\n\n  // WHEN\n  const task = p.addTask(\"hello\", {\n    description: \"hello, world\",\n    exec: \"echo hello\", // initial command\n    env: {\n      FOO: \"bar\",\n    },\n  });\n\n  task.exec(\"echo world\");\n  task.exec('echo \"with quotes\"');\n  task.env(\"BAR\", \"baz\");\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      hello: {\n        name: \"hello\",\n        description: \"hello, world\",\n        env: {\n          FOO: \"bar\",\n          BAR: \"baz\",\n        },\n        steps: [\n          { exec: \"echo hello\" },\n          { exec: \"echo world\" },\n          { exec: 'echo \"with quotes\"' },\n        ],\n      },\n    },\n  });\n});\n\ntest(\"subtasks\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const hello = p.addTask(\"hello\", { exec: \"echo hello\" });\n  const world = p.addTask(\"world\");\n\n  // WHEN\n  world.exec('echo \"running hello\"');\n  world.spawn(hello);\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      hello: {\n        name: \"hello\",\n        steps: [{ exec: \"echo hello\" }],\n      },\n      world: {\n        name: \"world\",\n        steps: [{ exec: 'echo \"running hello\"' }, { spawn: \"hello\" }],\n      },\n    },\n  });\n});\n\ntest(\"reset() can be used to reset task steps\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const t0 = p.addTask(\"your-task\");\n  const t = p.addTask(\"my-task\");\n  t.exec(\"line1\");\n  t.spawn(t0);\n  t.exec(\"line2\");\n\n  // WHEN\n  t.reset(\"line3\");\n  t.exec(\"line4\", { cwd: \"foo\" });\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      \"your-task\": {\n        name: \"your-task\",\n      },\n      \"my-task\": {\n        name: \"my-task\",\n        steps: [{ exec: \"line3\" }, { cwd: \"foo\", exec: \"line4\" }],\n      },\n    },\n  });\n});\n\ntest(\"prependXXX() can be used to add steps from the top\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const sub = p.addTask(\"my-sub-task\", { exec: \"subexec\" });\n\n  const t = p.addTask(\"my-task\");\n  t.exec(\"line1\");\n\n  // WHEN\n  t.prependExec(\"line2\");\n  t.prependSpawn(sub);\n  t.prependSay(\"message\");\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      \"my-sub-task\": {\n        name: \"my-sub-task\",\n        steps: [{ exec: \"subexec\" }],\n      },\n      \"my-task\": {\n        name: \"my-task\",\n        steps: [\n          { say: \"message\" },\n          { spawn: \"my-sub-task\" },\n          { exec: \"line2\" },\n          { exec: \"line1\" },\n        ],\n      },\n    },\n  });\n});\n\ntest(\"env() can be used to add environment variables\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const t = p.addTask(\"my-task\", {\n    env: {\n      INITIAL: \"123\",\n      ENV: \"456\",\n    },\n  });\n\n  // WHEN\n  t.env(\"FOO\", \"BAR\");\n  t.env(\"HELLO\", \"world\");\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      \"my-task\": {\n        name: \"my-task\",\n        env: {\n          INITIAL: \"123\",\n          ENV: \"456\",\n          FOO: \"BAR\",\n          HELLO: \"world\",\n        },\n      },\n    },\n  });\n});\n\ntest(\".steps can be used to list all steps in the current task\", () => {\n  // GIVEN\n  const p = new TestProject();\n  const t0 = p.addTask(\"your\");\n  const t = p.addTask(\"my\");\n  t.exec(\"step1\");\n  t.exec(\"step2\");\n  t.exec(\"step3\");\n  t.spawn(t0);\n  t.exec(\"step4\");\n\n  // WHEN\n  const steps = t.steps;\n\n  // THEN\n  expect(steps).toStrictEqual([\n    { exec: \"step1\" },\n    { exec: \"step2\" },\n    { exec: \"step3\" },\n    { spawn: \"your\" },\n    { exec: \"step4\" },\n  ] as TaskStep[]);\n});\n\ntest('\"condition\" can be used to define a command that will determine if a task should be skipped', () => {\n  // GIVEN\n  const p = new TestProject();\n  p.addTask(\"foo\", {\n    condition: \"false\",\n    exec: \"foo bar\",\n  });\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      foo: {\n        name: \"foo\",\n        condition: \"false\",\n        steps: [{ exec: \"foo bar\" }],\n      },\n    },\n  });\n});\n\ntest('\"builtin\" can be used to execute builtin commands', () => {\n  const p = new TestProject();\n  const task = p.addTask(\"foo\", {\n    condition: \"false\",\n  });\n\n  task.builtin(\"my/builtin\");\n  task.builtin(\"your/builtin\");\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      foo: {\n        name: \"foo\",\n        condition: \"false\",\n        steps: [{ builtin: \"my/builtin\" }, { builtin: \"your/builtin\" }],\n      },\n    },\n  });\n});\n\ntest('\"requiredEnv\" can be used to specify required environment variables', () => {\n  const p = new TestProject();\n  p.addTask(\"foo\", {\n    requiredEnv: [\"MISSING1\", \"MISSING2\", \"NOT_MISSING\"],\n  });\n\n  // THEN\n  expectManifest(p, {\n    tasks: {\n      foo: {\n        name: \"foo\",\n        requiredEnv: [\"MISSING1\", \"MISSING2\", \"NOT_MISSING\"],\n      },\n    },\n  });\n});\n\ntest(\"lock() can be used to disallow modifications\", () => {\n  const p = new TestProject();\n  const t = p.addTask(\"t1\");\n  const t2 = p.addTask(\"t2\");\n  t.exec(\"echo hello\");\n  t.exec(\"echo world\");\n\n  t.lock();\n\n  const error = 'Task \"t1\" is locked for changes';\n\n  expect(() => t.reset()).toThrow(error);\n  expect(() => t.exec(\"boom\")).toThrow(error);\n  expect(() => t.prependExec(\"pre\")).toThrow(error);\n  expect(() => t.spawn(t2)).toThrow(error);\n  expect(() => t.prependSpawn(t2)).toThrow(error);\n  expect(() => t.builtin(\"damn\")).toThrow(error);\n  expect(() => t.env(\"Foo\", \"bar\")).toThrow(error);\n  expect(() => t.say(\"hoho\")).toThrow(error);\n  expect(() => t.prependSay(\"hoho\")).toThrow(error);\n});\n\ntest(\"it is possible to edit the description\", () => {\n  const p = new TestProject();\n  const t1 = p.addTask(\"t1\");\n  const t2 = p.addTask(\"t2\", { description: \"my description\" });\n\n  // WHEN\n  t1.description = \"hello\";\n  t2.description = \"world\";\n\n  // THEN\n  const files = synthSnapshot(p);\n  expect(files[\".projen/tasks.json\"].tasks.t1.description).toBe(\"hello\");\n  expect(files[\".projen/tasks.json\"].tasks.t2.description).toBe(\"world\");\n});\n\nfunction expectManifest(p: Project, toStrictEqual: TasksManifest) {\n  const manifest = synthTasksManifest(p);\n  delete manifest[\"//\"];\n\n  // delete all standard tasks\n  delete manifest.tasks.build;\n  delete manifest.tasks[\"pre-compile\"];\n  delete manifest.tasks.compile;\n  delete manifest.tasks[\"post-compile\"];\n  delete manifest.tasks.test;\n  delete manifest.tasks.default;\n  delete manifest.tasks.package;\n  delete manifest.tasks.eject;\n\n  expect(manifest).toStrictEqual(toStrictEqual);\n}\n\nfunction synthTasksManifest(p: Project) {\n  return synthSnapshot(p)[TaskRuntime.MANIFEST_FILE];\n}\n"
  },
  {
    "path": "test/textfile.test.ts",
    "content": "import { TextFile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"empty file\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new TextFile(project, \"hello/foo.txt\");\n\n  // THEN\n  const output = synthSnapshot(project)[\"hello/foo.txt\"];\n  expect(output).toEqual(\"\");\n});\n\ntest(\"initialized with some lines\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  new TextFile(project, \"boom/boom/bam.txt\", {\n    lines: [\"line1\", \"line2\", \"line3\"],\n  });\n\n  // THEN\n  const output = synthSnapshot(project)[\"boom/boom/bam.txt\"];\n  expect(output).toEqual([\"line1\", \"line2\", \"line3\"].join(\"\\n\"));\n});\n\ntest(\"addLine() can add lines later\", () => {\n  // GIVEN\n  const project = new TestProject();\n  const tf = new TextFile(project, \"hello-world.txt\", {\n    lines: [\"line1\", \"line2\"],\n  });\n\n  // WHEN\n  tf.addLine(\"hey there\");\n  tf.addLine(\"you too\");\n\n  // THEN\n  const output = synthSnapshot(project)[\"hello-world.txt\"];\n  expect(output).toEqual([\"line1\", \"line2\", \"hey there\", \"you too\"].join(\"\\n\"));\n});\n"
  },
  {
    "path": "test/toml.test.ts",
    "content": "import * as TOML from \"@iarna/toml\";\nimport { TomlFile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"toml object can be mutated before synthesis\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {\n    hello: \"world\",\n  };\n\n  new TomlFile(prj, \"my/toml/file.toml\", { obj });\n\n  // mutate obj (should be reflected in the output)\n  obj.anotherField = {\n    foo: 1234,\n  };\n\n  const out = synthSnapshot(prj);\n  expect(TOML.parse(out[\"my/toml/file.toml\"])).toStrictEqual({\n    hello: \"world\",\n    anotherField: { foo: 1234 },\n  });\n});\n\ntest(\"toml file can contain projen marker\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {};\n\n  const file = new TomlFile(prj, \"my/toml/file-marker.toml\", {\n    obj,\n    marker: true,\n  });\n\n  const output = synthSnapshot(prj)[\"my/toml/file-marker.toml\"];\n\n  const firstLine = output.split(\"\\n\")[0];\n\n  expect(firstLine).toBe(`# ${file.marker}`);\n});\n"
  },
  {
    "path": "test/typescript/__snapshots__/typescript.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`sources and compiled output can be collocated 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n/test-reports/\njunit.xml\n/coverage/\n!/.github/workflows/build.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.mergify.yml\n!/.github/workflows/upgrade-test.yml\n!/.github/pull_request_template.md\n!/test/\n!/tsconfig.json\n!/tsconfig.dev.json\n!/lib/\n/lib/**/*.js\n/lib/**/*.d.ts\n/lib/**/*.d.ts.map\n/dist/\n!/.eslintrc.json\n\"\n`;\n\nexports[`sources and compiled output can be collocated 2`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projen/\n/test-reports/\njunit.xml\n/coverage/\n/dist/changelog.md\n/dist/version.txt\n/.mergify.yml\n/test/\n/tsconfig.dev.json\n!/lib/\n!/lib/**/*.js\n!/lib/**/*.d.ts\ndist\n/tsconfig.json\n/.github/\n/.vscode/\n/.idea/\n/.projenrc.js\ntsconfig.tsbuildinfo\n/.eslintrc.json\n\"\n`;\n"
  },
  {
    "path": "test/typescript/typescript.test.ts",
    "content": "import { TaskRuntime } from \"../../src\";\nimport { PROJEN_RC } from \"../../src/common\";\nimport { mergeTsconfigOptions, TypeScriptProject } from \"../../src/typescript\";\nimport { synthSnapshot } from \"../util\";\n\ndescribe(\"mergeTsconfigOptions\", () => {\n  test(\"merging includes\", () => {\n    const mergedTsconfigOptions = mergeTsconfigOptions(\n      {\n        include: [\"typescript.test.ts\"],\n        compilerOptions: {},\n      },\n      {\n        include: [\"abc\"],\n        compilerOptions: {},\n      }\n    );\n\n    expect(mergedTsconfigOptions).toEqual(\n      expect.objectContaining({\n        include: [\"typescript.test.ts\", \"abc\"],\n      })\n    );\n  });\n\n  test(\"merging excludes\", () => {\n    const mergedTsconfigOptions = mergeTsconfigOptions(\n      {\n        exclude: [\"typescript.test.ts\"],\n        compilerOptions: {},\n      },\n      {\n        exclude: [\"abc\"],\n        compilerOptions: {},\n      }\n    );\n\n    expect(mergedTsconfigOptions).toEqual(\n      expect.objectContaining({\n        exclude: [\"typescript.test.ts\", \"abc\"],\n      })\n    );\n  });\n\n  test(\"merging compilerOptions\", () => {\n    const mergedTsconfigOptions = mergeTsconfigOptions(\n      {\n        compilerOptions: {\n          esModuleInterop: false,\n        },\n      },\n      {\n        compilerOptions: {\n          esModuleInterop: true,\n        },\n      }\n    );\n\n    expect(mergedTsconfigOptions).toEqual(\n      expect.objectContaining({\n        compilerOptions: {\n          esModuleInterop: true,\n        },\n      })\n    );\n  });\n});\n\ntest(\"tsconfig prop is propagated to eslint and jest tsconfigs\", () => {\n  const prj = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"test\",\n    tsconfig: {\n      include: [\"typescript.test.ts\"],\n      compilerOptions: {\n        esModuleInterop: true,\n      },\n    },\n  });\n\n  const out = synthSnapshot(prj);\n\n  expect(out[\"tsconfig.json\"]).toEqual(\n    expect.objectContaining({\n      include: expect.arrayContaining([\n        `${prj.srcdir}/**/*.ts`,\n        \"typescript.test.ts\",\n      ]),\n      compilerOptions: expect.objectContaining({\n        esModuleInterop: true,\n      }),\n    })\n  );\n\n  expect(out[\"tsconfig.dev.json\"]).toEqual(\n    expect.objectContaining({\n      include: expect.arrayContaining([\n        PROJEN_RC,\n        `${prj.srcdir}/**/*.ts`,\n        `${prj.testdir}/**/*.ts`,\n        \"typescript.test.ts\",\n      ]),\n      compilerOptions: expect.objectContaining({\n        esModuleInterop: true,\n      }),\n    })\n  );\n\n  expect(out[\"tsconfig.dev.json\"]).toEqual(\n    expect.objectContaining({\n      include: expect.arrayContaining([\n        PROJEN_RC,\n        `${prj.srcdir}/**/*.ts`,\n        `${prj.testdir}/**/*.ts`,\n        \"typescript.test.ts\",\n      ]),\n      compilerOptions: expect.objectContaining({\n        esModuleInterop: true,\n      }),\n    })\n  );\n});\n\ntest(\"sources and compiled output can be collocated\", () => {\n  const prj = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"test\",\n    libdir: \"lib\",\n    srcdir: \"lib\",\n  });\n\n  expect(prj.tsconfig?.exclude).not.toContain(\"/lib\");\n\n  const snapshot = synthSnapshot(prj);\n  expect(snapshot[\".gitignore\"]).toMatchSnapshot();\n  expect(snapshot[\".npmignore\"]).toMatchSnapshot();\n});\n\ntest(\"tsconfigDevFile can be used to control the name of the tsconfig dev file\", () => {\n  const prj = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"test\",\n    tsconfigDevFile: \"tsconfig.foo.json\",\n    libdir: \"lib\",\n    srcdir: \"lib\",\n  });\n\n  expect(prj.tsconfigDev.fileName).toBe(\"tsconfig.foo.json\");\n\n  const snapshot = synthSnapshot(prj);\n  expect(snapshot[\"tsconfig.foo.json\"]).not.toBeUndefined();\n});\n\ntest(\"projenrc.ts\", () => {\n  const prj = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    projenrcTs: true,\n  });\n\n  const snapshot = synthSnapshot(prj);\n  expect(snapshot[\".projen/tasks.json\"].tasks.default).toStrictEqual({\n    description: \"Synthesize project files\",\n    name: \"default\",\n    steps: [{ exec: \"ts-node --project tsconfig.dev.json .projenrc.ts\" }],\n  });\n});\n\ntest(\"eslint configured to support .projenrc.ts and projenrc src dir\", () => {\n  const prj = new TypeScriptProject({\n    name: \"test\",\n    defaultReleaseBranch: \"main\",\n    projenrcTs: true,\n  });\n\n  const snapshot = synthSnapshot(prj);\n  expect(snapshot[\".projen/tasks.json\"].tasks.eslint).toStrictEqual({\n    description: \"Runs eslint against the codebase\",\n    name: \"eslint\",\n    steps: [\n      {\n        exec: \"eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test build-tools projenrc .projenrc.ts\",\n      },\n    ],\n  });\n  expect(snapshot[\".eslintrc.json\"]).toMatchObject({\n    ignorePatterns: expect.arrayContaining([\n      \"!.projenrc.ts\",\n      \"!projenrc/**/*.ts\",\n    ]),\n    rules: expect.objectContaining({\n      \"import/no-extraneous-dependencies\": [\n        \"error\",\n        expect.objectContaining({\n          devDependencies: expect.arrayContaining([\n            \".projenrc.ts\",\n            \"projenrc/**/*.ts\",\n          ]),\n        }),\n      ],\n    }),\n  });\n});\n\ntest(\"upgrade task ignores pinned versions\", () => {\n  const prj = new TypeScriptProject({\n    defaultReleaseBranch: \"main\",\n    name: \"test\",\n    deps: [\"npm@^8\"],\n    typescriptVersion: \"4.4.4\",\n  });\n  const tasks = synthSnapshot(prj)[TaskRuntime.MANIFEST_FILE].tasks;\n  expect(tasks.upgrade.steps[1].exec).toStrictEqual(\n    \"npm-check-updates --dep dev --upgrade --target=minor --reject='typescript'\"\n  );\n});\n"
  },
  {
    "path": "test/util.test.ts",
    "content": "import { JsonFile } from \"../src/json\";\nimport {\n  decamelizeKeysRecursively,\n  dedupArray,\n  deepMerge,\n  isTruthy,\n  getFilePermissions,\n  formatAsPythonModule,\n  getGitVersion,\n} from \"../src/util\";\nimport { TestProject } from \"./util\";\n\ndescribe(\"decamelizeRecursively\", () => {\n  test(\"decamel recurses an object structure\", () => {\n    // GIVEN\n    const input = {\n      dependsOn: [\"a\", \"b\", \"c\"],\n      volumes: [\n        {\n          driver: \"tmpfs\",\n          driverOpts: {\n            type: \"nfs\",\n            o: \"addr=...\",\n            device: \":/docker/example\",\n          },\n        },\n      ],\n    };\n\n    // WHEN\n    const output = decamelizeKeysRecursively(input);\n\n    // THEN\n    expect(output).toEqual({\n      depends_on: [\"a\", \"b\", \"c\"],\n      volumes: [\n        {\n          driver: \"tmpfs\",\n          driver_opts: {\n            type: \"nfs\",\n            o: \"addr=...\",\n            device: \":/docker/example\",\n          },\n        },\n      ],\n    });\n  });\n\n  test(\"decamel quits when it recurses too deeply\", () => {\n    // GIVEN\n    const circle: Record<string, any> = {};\n    circle.circle = circle;\n\n    // WHEN\n    expect(() => decamelizeKeysRecursively(circle)).toThrow(\n      /circular reference/\n    );\n  });\n\n  test(\"decamel can know when not to decamelize a key\", () => {\n    // GIVEN\n    const input = {\n      dependsOn: [\"a\", \"b\"],\n      environment: {\n        leaveThisAlone: true,\n        LEAVE_CASE_ALONE: true,\n      },\n    };\n\n    // WHEN\n    const output = decamelizeKeysRecursively(input, {\n      shouldDecamelize(path, _value) {\n        return !/^environment\\./.test(path.join(\".\"));\n      },\n    });\n\n    // THEN\n    expect(output).toEqual({\n      depends_on: [\"a\", \"b\"],\n      environment: {\n        leaveThisAlone: true,\n        LEAVE_CASE_ALONE: true,\n      },\n    });\n  });\n});\n\ntest(\"isTruthy\", () => {\n  expect(isTruthy(undefined)).toEqual(false);\n  expect(isTruthy(\"false\")).toEqual(false);\n  expect(isTruthy(\"0\")).toEqual(false);\n  expect(isTruthy(\"null\")).toEqual(false);\n  expect(isTruthy(\"\")).toEqual(false);\n  expect(isTruthy(\"true\")).toEqual(true);\n  expect(isTruthy(\"1\")).toEqual(true);\n  expect(isTruthy(\"enabled\")).toEqual(true);\n});\n\ndescribe(\"deepMerge (destructive: false)\", () => {\n  test(\"merges objects\", () => {\n    // GIVEN\n    const original = { a: { b: 3 } };\n\n    // WHEN\n    deepMerge([original, { a: { c: 4 } }]);\n\n    // THEN\n    expect(original).toEqual({ a: { b: 3, c: 4 } });\n  });\n\n  test(\"overwrites non-objects\", () => {\n    // GIVEN\n    const original = { a: \"foo\" };\n\n    // WHEN\n    deepMerge([original, { a: { b: 3 } }]);\n\n    // THEN\n    expect(original).toEqual({ a: { b: 3 } });\n  });\n\n  test('does not overwrite if rightmost is \"undefined\"', () => {\n    // GIVEN\n    const original = { a: 1 };\n\n    // WHEN\n    deepMerge([original, { a: undefined }]);\n\n    // THEN\n    expect(original).toEqual({ a: 1 });\n  });\n\n  test(\"does not recurse on projects\", () => {\n    // GIVEN\n    const proj1 = new TestProject();\n    const proj2 = new TestProject();\n    const objA = { a: proj1 };\n    const objB = { a: proj2 };\n\n    // WHEN\n    deepMerge([objA, objB]);\n\n    // THEN\n    expect(objA).toEqual(objB);\n  });\n\n  test(\"does not recurse on components\", () => {\n    // GIVEN\n    const proj = new TestProject();\n    const comp1 = new JsonFile(proj, \"foo\", { obj: 3 });\n    const comp2 = new JsonFile(proj, \"bar\", { obj: 5 });\n    const objA = { a: comp1 };\n    const objB = { a: comp2 };\n\n    // WHEN\n    deepMerge([objA, objB]);\n\n    // THEN\n    expect(objA).toEqual(objB);\n  });\n});\n\ndescribe(\"deepMerge (destructive: true)\", () => {\n  test(\"merges objects\", () => {\n    // GIVEN\n    const original = { a: { b: 3 } };\n\n    // WHEN\n    deepMerge([original, { a: { c: 4 } }], true);\n\n    // THEN\n    expect(original).toEqual({ a: { b: 3, c: 4 } });\n  });\n\n  test(\"overwrites non-objects\", () => {\n    // GIVEN\n    const original = { a: \"foo\" };\n\n    // WHEN\n    deepMerge([original, { a: { b: 3 } }], true);\n\n    // THEN\n    expect(original).toEqual({ a: { b: 3 } });\n  });\n\n  test('does overwrite if rightmost is \"undefined\"', () => {\n    // GIVEN\n    const original = { a: 1 };\n\n    // WHEN\n    deepMerge([original, { a: undefined }], true);\n\n    // THEN\n    expect(original).toEqual({}); // ! different from the non-destructive case\n  });\n\n  test(\"does not recurse on projects\", () => {\n    // GIVEN\n    const proj1 = new TestProject();\n    const proj2 = new TestProject();\n    const objA = { a: proj1 };\n    const objB = { a: proj2 };\n\n    // WHEN\n    deepMerge([objA, objB], true);\n\n    // THEN\n    expect(objA).toEqual(objB);\n  });\n\n  test(\"does not recurse on components\", () => {\n    // GIVEN\n    const proj = new TestProject();\n    const comp1 = new JsonFile(proj, \"foo\", { obj: 3 });\n    const comp2 = new JsonFile(proj, \"bar\", { obj: 5 });\n    const objA = { a: comp1 };\n    const objB = { a: comp2 };\n\n    // WHEN\n    deepMerge([objA, objB], true);\n\n    // THEN\n    expect(objA).toEqual(objB);\n  });\n});\n\ntest(\"dedupArray\", () => {\n  expect(dedupArray([\"a\", \"b\", \"c\"])).toEqual([\"a\", \"b\", \"c\"]);\n  expect(dedupArray([\"a\", \"a\", \"b\", \"a\"])).toEqual([\"a\", \"b\"]);\n});\n\ntest(\"getFilePermissions\", () => {\n  expect(getFilePermissions({})).toEqual(\"644\");\n  expect(getFilePermissions({ readonly: true, executable: true })).toEqual(\n    \"544\"\n  );\n  expect(getFilePermissions({ readonly: true, executable: false })).toEqual(\n    \"444\"\n  );\n  expect(getFilePermissions({ readonly: false, executable: true })).toEqual(\n    \"755\"\n  );\n  expect(getFilePermissions({ readonly: false, executable: false })).toEqual(\n    \"644\"\n  );\n  expect(getFilePermissions({ readonly: false })).toEqual(\"644\");\n  expect(getFilePermissions({ executable: true })).toEqual(\"755\");\n});\n\ntest(\"getGitVersion\", () => {\n  expect(getGitVersion(\"git version 2.24.3 \")).toEqual(\"2.24.3\");\n  expect(getGitVersion(\"git version 2.30.1 (Apple Git-128)\")).toEqual(\"2.30.1\");\n});\n\ntest(\"formatAsPythonModule\", () => {\n  expect(formatAsPythonModule(\"foo-bar-baz\")).toEqual(\"foo_bar_baz\");\n  expect(formatAsPythonModule(\"foo.bar.baz\")).toEqual(\"foo_bar_baz\");\n});\n"
  },
  {
    "path": "test/util.ts",
    "content": "import * as cp from \"child_process\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { Project } from \"../src\";\nimport { GitHubProject, GitHubProjectOptions } from \"../src/github\";\nimport * as logging from \"../src/logging\";\nimport { Task } from \"../src/task\";\nimport { exec } from \"../src/util\";\nimport { directorySnapshot } from \"../src/util/synth\";\n\nconst PROJEN_CLI = require.resolve(\"../lib/cli/index.js\");\n\nlogging.disable(); // no logging during tests\n\nexport class TestProject extends GitHubProject {\n  constructor(options: Omit<GitHubProjectOptions, \"name\"> = {}) {\n    super({\n      name: \"my-project\",\n      clobber: false,\n      ...options,\n    });\n  }\n\n  // override runTaskCommand in tests since the default includes the version\n  // number and that will break regresion tests.\n  public runTaskCommand(task: Task) {\n    return `projen ${task.name}`;\n  }\n\n  postSynthesize() {\n    fs.writeFileSync(path.join(this.outdir, \".postsynth\"), \"# postsynth\");\n  }\n}\n\nexport function execProjenCLI(workdir: string, args: string[] = []) {\n  const command = [process.execPath, PROJEN_CLI, ...args];\n\n  return exec(command.map((x) => `\"${x}\"`).join(\" \"), { cwd: workdir });\n}\n\nconst autoRemove = new Set<string>();\n\n// Hook to automatically remove temporary directories without needing each\n// place to actually handle this specifically.\nafterAll((done) => {\n  // Array.from used to get a copy, so we can safely remove from the set\n  for (const dir of Array.from(autoRemove)) {\n    try {\n      // Note - fs-extra.removeSync is idempotent, so we're safe if the\n      // directory has already been cleaned up before we get there!\n      fs.removeSync(dir);\n    } catch (e) {\n      done.fail(e);\n    }\n    autoRemove.delete(dir);\n  }\n  done();\n});\n\nexport function mkdtemp(opts: { cleanup?: boolean } = {}) {\n  const tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), \"projen-test-\"));\n  if (opts.cleanup ?? true) {\n    autoRemove.add(tmpdir);\n  }\n  return tmpdir;\n}\n\nexport function synthSnapshotWithPost(project: Project) {\n  try {\n    project.synth();\n    return directorySnapshot(project.outdir);\n  } finally {\n    fs.removeSync(project.outdir);\n  }\n}\n\nexport function withProjectDir(\n  code: (workdir: string) => void,\n  options: { git?: boolean; chdir?: boolean } = {}\n) {\n  const origDir = process.cwd();\n  const outdir = mkdtemp();\n  try {\n    // create project under \"my-project\" so that basedir is deterministic\n    const projectdir = path.join(outdir, \"my-project\");\n    fs.mkdirSync(projectdir);\n\n    const shell = (command: string) =>\n      cp.execSync(command, { cwd: projectdir });\n    if (options.git ?? true) {\n      shell(\"git init -b main\");\n      shell(\"git remote add origin git@boom.com:foo/bar.git\");\n      shell('git config user.name \"My User Name\"');\n      shell('git config user.email \"my@user.email.com\"');\n      shell(\"git config commit.gpgsign false\");\n      shell(\"git config tag.gpgsign false\");\n    } else if (process.env.CI) {\n      // if \"git\" is set to \"false\", we still want to make sure global user is defined\n      // (relevant in CI context)\n      shell(\n        'git config user.name || git config --global user.name \"My User Name\"'\n      );\n      shell(\n        'git config user.email || git config --global user.email \"my@user.email.com\"'\n      );\n    }\n\n    if (options.chdir ?? false) {\n      process.chdir(projectdir);\n    }\n\n    code(projectdir);\n  } finally {\n    process.chdir(origDir);\n    fs.removeSync(outdir);\n  }\n}\n\n/**\n * Removes any non-deterministic aspects from the synthesized output.\n * @param dir The output directory.\n */\nexport function sanitizeOutput(dir: string) {\n  const filepath = path.join(dir, \"package.json\");\n  const pkg = fs.readJsonSync(filepath);\n  const prev = pkg.devDependencies.projen;\n  if (!prev) {\n    throw new Error(\n      `expecting \"${filepath}\" to include a devDependency on \"projen\"`\n    );\n  }\n\n  // replace the current projen version with 999.999.999 for deterministic output.\n  // this will preserve any semantic version requirements (e.g. \"^\", \"~\", etc).\n  pkg.devDependencies.projen = prev.replace(/\\d+\\.\\d+\\.\\d+/, \"999.999.999\");\n  fs.writeJsonSync(filepath, pkg);\n\n  // we will also patch deps.json so that all projen deps will be set to 999.999.999\n  const depsPath = path.join(dir, \".projen\", \"deps.json\");\n  const deps = fs.readJsonSync(depsPath);\n  for (const dep of deps.dependencies) {\n    if (dep.name === \"projen\" && dep.version) {\n      dep.version = dep.version.replace(/\\d+\\.\\d+\\.\\d+/, \"999.999.999\");\n    }\n  }\n  fs.chmodSync(depsPath, \"777\");\n  fs.writeJsonSync(depsPath, deps);\n}\n\nexport {\n  synthSnapshot,\n  directorySnapshot,\n  SynthOutput,\n  DirectorySnapshotOptions,\n} from \"../src/util/synth\";\n"
  },
  {
    "path": "test/vscode/__snapshots__/dev-env.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`dev environment constructor for gitpod 1`] = `\n\"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nimage: ubuntu:latest\ntasks:\n  - name: dummy-task\n    command: npx projen dummy-task\ngithub:\n  prebuilds:\n    pullRequests: true\nports:\n  - port: \\\\\"3000\\\\\"\nvscode:\n  extensions:\n    - dbaeumer.vscode-eslint@2.1.13:5sYlSD6wJi5s3xqD8hupUw==\n\"\n`;\n"
  },
  {
    "path": "test/vscode/dev-env.test.ts",
    "content": "import * as path from \"path\";\nimport * as fs from \"fs-extra\";\nimport { DevEnvironmentDockerImage } from \"../../src/dev-env\";\nimport { Gitpod, GitpodOpenIn, GitpodOpenMode } from \"../../src/gitpod\";\nimport * as logging from \"../../src/logging\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\n// This is duplicated vs exported\nconst GITPOD_FILE = \".gitpod.yml\";\nconst DEVCONTAINER_FILE = \".devcontainer.json\";\n\nlogging.disable();\n\ndescribe(\"dev environment constructor\", () => {\n  test(\"for gitpod\", () => {\n    // GIVEN\n    const project = new TestProject({\n      gitpod: false,\n    });\n    const task = project.addTask(\"dummy-task\", { exec: \"echo hello\" });\n\n    // WHEN\n    new Gitpod(project, {\n      dockerImage: DevEnvironmentDockerImage.fromImage(\"ubuntu:latest\"),\n      prebuilds: {\n        pullRequests: true,\n      },\n      tasks: [task],\n      ports: [\"3000\"],\n      vscodeExtensions: [\n        \"dbaeumer.vscode-eslint@2.1.13:5sYlSD6wJi5s3xqD8hupUw==\",\n      ],\n    });\n    project.synth();\n\n    // THEN\n    const outdir = synthSnapshot(project);\n    expect(outdir[GITPOD_FILE]).toMatchSnapshot();\n  });\n});\n\ndescribe(\"dev environment enable/disable\", () => {\n  test(\"given gitpod and devContainer are false\", () => {\n    // GIVEN\n    const project = new TestProject({\n      gitpod: false,\n      devContainer: false,\n    });\n\n    // WHEN\n    project.synth();\n\n    // THEN\n    const gitpodFilePath = path.join(project.outdir, GITPOD_FILE);\n    const devContainerFilePath = path.join(project.outdir, DEVCONTAINER_FILE);\n    expect(fs.existsSync(gitpodFilePath)).toBeFalsy();\n    expect(fs.existsSync(devContainerFilePath)).toBeFalsy();\n  });\n\n  test(\"no gitpod/devcontainer files if they are empty\", () => {\n    // WHEN\n    const project = new TestProject({\n      gitpod: true,\n      devContainer: true,\n    });\n\n    // THEN\n    project.synth();\n    const gitpodFilePath = path.join(project.outdir, GITPOD_FILE);\n    const devContainerFilePath = path.join(project.outdir, DEVCONTAINER_FILE);\n    expect(fs.existsSync(gitpodFilePath)).toBeFalsy();\n    expect(fs.existsSync(devContainerFilePath)).toBeFalsy();\n  });\n\n  test(\"given gitpod and devContainer are true\", () => {\n    // GIVEN\n    const project = new TestProject({\n      gitpod: true,\n      devContainer: true,\n    });\n\n    // WHEN\n    project.gitpod?.addDockerImage({ image: \"foo\" });\n    project.devContainer?.addPorts(\"1234\");\n\n    // THEN\n    project.synth();\n    const gitpodFilePath = path.join(project.outdir, GITPOD_FILE);\n    const devContainerFilePath = path.join(project.outdir, DEVCONTAINER_FILE);\n    expect(fs.existsSync(gitpodFilePath)).toBeTruthy();\n    expect(fs.existsSync(devContainerFilePath)).toBeTruthy();\n  });\n});\n\ndescribe(\"dev environment docker options\", () => {\n  test(\"given an image\", () => {\n    // GIVEN\n    const project = new TestProject({\n      gitpod: true,\n      devContainer: true,\n    });\n\n    // WHEN\n    project.gitpod?.addDockerImage(\n      DevEnvironmentDockerImage.fromImage(\"jsii/superchain:node14\")\n    );\n    project.devContainer?.addDockerImage(\n      DevEnvironmentDockerImage.fromImage(\"jsii/uberchain\")\n    );\n\n    // THEN\n    const outdir = synthSnapshot(project);\n    const gitpodSnapshot = outdir[GITPOD_FILE];\n    expect(gitpodSnapshot).toContain(\"image: jsii/superchain:node14\");\n\n    const devContainerSnapshot = outdir[DEVCONTAINER_FILE];\n    expect(devContainerSnapshot).toStrictEqual({\n      \"//\": expect.anything(),\n      image: \"jsii/uberchain\",\n    });\n  });\n\n  test(\"given a docker file dep\", () => {\n    // GIVEN\n    const project = new TestProject({\n      gitpod: true,\n      devContainer: true,\n    });\n\n    // WHEN\n    project.gitpod?.addDockerImage(\n      DevEnvironmentDockerImage.fromFile(\".gitpod.Dockerfile\")\n    );\n    project.devContainer?.addDockerImage(\n      DevEnvironmentDockerImage.fromFile(\"Dockerfile\")\n    );\n\n    // THEN\n    const outdir = synthSnapshot(project);\n    const gitpodSnapshot = outdir[GITPOD_FILE];\n    expect(gitpodSnapshot).toContain(\"image:\");\n    expect(gitpodSnapshot).toContain(\"file: .gitpod.Dockerfile\");\n\n    const devContainerSnapshot = outdir[DEVCONTAINER_FILE];\n    expect(devContainerSnapshot).toStrictEqual({\n      \"//\": expect.anything(),\n      build: { dockerfile: \"Dockerfile\" },\n    });\n  });\n});\n\ndescribe(\"dev environment tasks\", () => {\n  test(\"given custom task\", () => {\n    // GIVEN\n    const project = new TestProject({\n      gitpod: true,\n      devContainer: true,\n    });\n\n    // WHEN\n    const task = project.addTask(\"gitpod-test\", { exec: \"text\" });\n    project.gitpod?.addTasks(task);\n    project.devContainer?.addTasks(task);\n\n    // THEN\n    const outdir = synthSnapshot(project);\n    const gitpodSnapshot = outdir[GITPOD_FILE];\n    expect(gitpodSnapshot).toContain(\"command\");\n    expect(gitpodSnapshot).toContain(\"gitpod-test\");\n\n    const devContainerSnapshot = outdir[DEVCONTAINER_FILE];\n    expect(devContainerSnapshot.postCreateCommand).toContain(\"gitpod-test\");\n  });\n\n  test(\"given gitpod task options\", () => {\n    // GIVEN\n    const project = new TestProject({\n      gitpod: true,\n      devContainer: true,\n    });\n\n    // WHEN\n    const task = project.addTask(\"gitpod-test\", { exec: \"text\" });\n    project.gitpod?.addCustomTask({\n      init: \"echo Initializing\",\n      openIn: GitpodOpenIn.LEFT,\n      openMode: GitpodOpenMode.SPLIT_BOTTOM,\n      command: `npx projen ${task.name}`,\n    });\n\n    // THEN\n    const snapshot = synthSnapshot(project)[GITPOD_FILE];\n    expect(snapshot).toContain(\"init: echo Initializing\");\n    expect(snapshot).toContain(\"openIn: left\");\n    expect(snapshot).toContain(\"openMode: split-bottom\");\n    expect(snapshot).toContain(\"command: npx projen gitpod-test\");\n  });\n});\n\ntest(\"dev environment ports\", () => {\n  // GIVEN\n  const project = new TestProject({\n    gitpod: true,\n    devContainer: true,\n  });\n\n  // WHEN\n  project.gitpod?.addPorts(\"8080\", \"3000-3999\");\n  project.devContainer?.addPorts(\"8080\", \"3000\");\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  const gitpodSnapshot = outdir[GITPOD_FILE];\n  expect(gitpodSnapshot).toContain('port: \"8080\"');\n  expect(gitpodSnapshot).toContain(\"port: 3000-3999\");\n\n  const devContainerSnapshot = outdir[DEVCONTAINER_FILE];\n  expect(devContainerSnapshot).toStrictEqual({\n    \"//\": expect.anything(),\n    forwardPorts: [\"8080\", \"3000\"],\n  });\n});\n\ntest(\"gitpod prebuilds config\", () => {\n  // GIVEN\n  const project = new TestProject({\n    gitpod: true,\n    devContainer: false,\n  });\n\n  // WHEN\n  project.gitpod?.addPrebuilds({\n    master: true,\n    branches: true,\n    pullRequestsFromForks: true,\n    addBadge: false,\n  });\n\n  // THEN\n  const gitpodSnapshot = synthSnapshot(project)[GITPOD_FILE];\n  expect(gitpodSnapshot).toContain(\"github\");\n  expect(gitpodSnapshot).toContain(\"prebuilds\");\n  expect(gitpodSnapshot).toContain(\"master\");\n  expect(gitpodSnapshot).toContain(\"branches\");\n  expect(gitpodSnapshot).toContain(\"pullRequestsFromForks\");\n  expect(gitpodSnapshot).toContain(\"addBadge\");\n});\n\ntest(\"dev environment vscode extensions\", () => {\n  // GIVEN\n  const project = new TestProject({\n    gitpod: true,\n    devContainer: true,\n  });\n\n  // WHEN\n  project.gitpod?.addVscodeExtensions(\n    \"dbaeumer.vscode-eslint@2.1.13:5sYlSD6wJi5s3xqD8hupUw==\"\n  );\n  project.devContainer?.addVscodeExtensions(\"dbaeumer.vscode-eslint\");\n\n  // THEN\n  const outdir = synthSnapshot(project);\n  const gitpodSnapshot = outdir[GITPOD_FILE];\n  expect(gitpodSnapshot).toContain(\"extensions:\");\n  expect(gitpodSnapshot).toContain(\n    \"dbaeumer.vscode-eslint@2.1.13:5sYlSD6wJi5s3xqD8hupUw==\"\n  );\n\n  const devContainerSnapshot = outdir[DEVCONTAINER_FILE];\n  expect(devContainerSnapshot).toStrictEqual({\n    \"//\": expect.anything(),\n    extensions: [\"dbaeumer.vscode-eslint\"],\n  });\n});\n"
  },
  {
    "path": "test/vscode/extensions.test.ts",
    "content": "import json5 from \"json5\";\nimport { PROJEN_MARKER } from \"../../src/common\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\nconst VSCODE_EXTENSIONS_FILE = \".vscode/extensions.json\";\n\ntest(\"no extensions configured\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.extensions;\n\n  // THEN\n  expect(synthSnapshot(project)).not.toHaveProperty(VSCODE_EXTENSIONS_FILE);\n});\n\ntest(\"recommend extensions\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.extensions.addRecommendations(\n    \"vscode.csharp\",\n    \"dbaeumer.vscode-eslint\"\n  );\n\n  // THEN\n  const extensionsFile = synthSnapshot(project, {\n    parseJson: false,\n  })[VSCODE_EXTENSIONS_FILE];\n  const extensionsObject = json5.parse(extensionsFile);\n\n  expect(extensionsFile).toContain(`// ${PROJEN_MARKER}`);\n  expect(extensionsObject).toStrictEqual({\n    recommendations: [\"vscode.csharp\", \"dbaeumer.vscode-eslint\"],\n  });\n});\n\ntest(\"unwanted recommendations\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.extensions.addUnwantedRecommendations(\n    \"amazonwebservices.aws-toolkit-vscode\",\n    \"ms-toolsai.jupyter\"\n  );\n\n  // THEN\n  const extensionsFile = synthSnapshot(project, {\n    parseJson: false,\n  })[VSCODE_EXTENSIONS_FILE];\n  const extensionsObject = json5.parse(extensionsFile);\n\n  expect(extensionsFile).toContain(`// ${PROJEN_MARKER}`);\n  expect(extensionsObject).toStrictEqual({\n    unwantedRecommendations: [\n      \"amazonwebservices.aws-toolkit-vscode\",\n      \"ms-toolsai.jupyter\",\n    ],\n  });\n});\n\ntest(\"recommended extensions and unwanted recommendations\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.extensions.addRecommendations(\n    \"vscode.csharp\",\n    \"dbaeumer.vscode-eslint\"\n  );\n  project.vscode?.extensions.addUnwantedRecommendations(\n    \"amazonwebservices.aws-toolkit-vscode\",\n    \"ms-toolsai.jupyter\"\n  );\n\n  // THEN\n  const extensionsFile = synthSnapshot(project, {\n    parseJson: false,\n  })[VSCODE_EXTENSIONS_FILE];\n  const extensionsObject = json5.parse(extensionsFile);\n\n  expect(extensionsFile).toContain(`// ${PROJEN_MARKER}`);\n  expect(extensionsObject).toStrictEqual({\n    recommendations: [\"vscode.csharp\", \"dbaeumer.vscode-eslint\"],\n    unwantedRecommendations: [\n      \"amazonwebservices.aws-toolkit-vscode\",\n      \"ms-toolsai.jupyter\",\n    ],\n  });\n});\n"
  },
  {
    "path": "test/vscode/settings.test.ts",
    "content": "import { synthSnapshot, TestProject } from \"../util\";\n\nconst VSCODE_SETTINGS_FILE = \".vscode/settings.json\";\n\ntest(\"no settings configured\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.settings;\n\n  // THEN\n  expect(synthSnapshot(project)).not.toHaveProperty(VSCODE_SETTINGS_FILE);\n});\n\ntest(\"add single settings\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.settings.addSetting(\"files.autoSave\", \"afterDelay\");\n  project.vscode?.settings.addSetting(\"editor.minimap.enabled\", true);\n  project.vscode?.settings.addSetting(\"files.autoSaveDelay\", 1000);\n  project.vscode?.settings.addSetting(\"editor.rulers\", []);\n  project.vscode?.settings.addSetting(\"search.exclude\", {\n    \"**/node_modules\": true,\n    \"**/bower_components\": true,\n  });\n  project.vscode?.settings.addSetting(\n    \"editor.defaultFormatter\",\n    \"esbenp.prettier-vscode\",\n    \"javascript\"\n  );\n  project.vscode?.settings.addSetting(\n    \"editor.defaultFormatter\",\n    \"esbenp.prettier-vscode\",\n    \"typescript\"\n  );\n\n  // THEN\n  const settings = synthSnapshot(project)[VSCODE_SETTINGS_FILE];\n\n  expect(settings).toStrictEqual({\n    \"//\": expect.anything(),\n    \"files.autoSave\": \"afterDelay\",\n    \"editor.minimap.enabled\": true,\n    \"files.autoSaveDelay\": 1000,\n    \"editor.rulers\": [],\n    \"search.exclude\": { \"**/node_modules\": true, \"**/bower_components\": true },\n    \"[javascript]\": {\n      \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n    },\n    \"[typescript]\": {\n      \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n    },\n  });\n});\n\ntest(\"batch add settings\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.settings.addSettings({\n    \"files.autoSave\": \"afterDelay\",\n    \"editor.minimap.enabled\": true,\n    \"files.autoSaveDelay\": 1000,\n    \"editor.rulers\": [],\n    \"search.exclude\": { \"**/node_modules\": true, \"**/bower_components\": true },\n  });\n  project.vscode?.settings.addSettings(\n    {\n      \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n      \"eslint.format.enable\": true,\n    },\n    [\"javascript\", \"typescript\"]\n  );\n  project.vscode?.settings.addSettings(\n    {\n      \"python.formatting.provider\": \"black\",\n    },\n    \"python\"\n  );\n\n  // THEN\n  const settings = synthSnapshot(project)[VSCODE_SETTINGS_FILE];\n\n  expect(settings).toStrictEqual({\n    \"//\": expect.anything(),\n    \"files.autoSave\": \"afterDelay\",\n    \"editor.minimap.enabled\": true,\n    \"files.autoSaveDelay\": 1000,\n    \"editor.rulers\": [],\n    \"search.exclude\": { \"**/node_modules\": true, \"**/bower_components\": true },\n    \"[javascript]\": {\n      \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n      \"eslint.format.enable\": true,\n    },\n    \"[typescript]\": {\n      \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n      \"eslint.format.enable\": true,\n    },\n    \"[python]\": {\n      \"python.formatting.provider\": \"black\",\n    },\n  });\n});\n"
  },
  {
    "path": "test/vscode/vscode-launch-config.test.ts",
    "content": "import { Console, InternalConsoleOptions } from \"../../src/vscode\";\nimport { synthSnapshot, TestProject } from \"../util\";\n\nconst VSCODE_DEBUGGER_FILE = \".vscode/launch.json\";\n\ntest(\"empty launch configuration\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  project.vscode?.launchConfiguration;\n\n  // THEN\n  expect(synthSnapshot(project)[VSCODE_DEBUGGER_FILE]).toStrictEqual({\n    \"//\": expect.anything(),\n    version: \"0.2.0\",\n    configurations: [],\n  });\n});\n\ntest(\"adding a launch configuration entry\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  const launchConfig = project.vscode?.launchConfiguration;\n  launchConfig?.addConfiguration({\n    type: \"node\",\n    request: \"launch\",\n    name: \"CDK Debugger\",\n    skipFiles: [\"<node_internals>/**\"],\n    runtimeArgs: [\"-r\", \"./node_modules/ts-node/register/transpile-only\"],\n    args: [\"${workspaceFolder}/src/main.ts\"],\n    console: Console.EXTERNAL_TERMINAL,\n  });\n\n  // THEN\n  expect(synthSnapshot(project)[VSCODE_DEBUGGER_FILE]).toStrictEqual({\n    \"//\": expect.anything(),\n    version: \"0.2.0\",\n    configurations: [\n      {\n        type: \"node\",\n        request: \"launch\",\n        name: \"CDK Debugger\",\n        skipFiles: [\"<node_internals>/**\"],\n        runtimeArgs: [\"-r\", \"./node_modules/ts-node/register/transpile-only\"],\n        args: [\"${workspaceFolder}/src/main.ts\"],\n        console: \"externalTerminal\",\n      },\n    ],\n  });\n});\n\ntest(\"adding multiple launch configuration entries\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  const launchConfig = project.vscode?.launchConfiguration;\n  launchConfig?.addConfiguration({\n    type: \"node\",\n    request: \"launch\",\n    name: \"CDK Debugger\",\n    skipFiles: [\"<node_internals>/**\"],\n    runtimeArgs: [\"-r\", \"./node_modules/ts-node/register/transpile-only\"],\n    args: [\"${workspaceFolder}/src/main.ts\"],\n  });\n\n  launchConfig?.addConfiguration({\n    type: \"node\",\n    request: \"launch\",\n    name: \"Launch Program\",\n    skipFiles: [\"<node_internals>/**\"],\n    program: \"${workspaceFolder}/lib/index.js\",\n    preLaunchTask: \"tsc: build - tsconfig.json\",\n    outFiles: [\"${workspaceFolder}/lib/**/*.js\"],\n    internalConsoleOptions: InternalConsoleOptions.OPEN_ON_SESSION_START,\n  });\n\n  launchConfig?.addConfiguration({\n    type: \"pwa-chrome\",\n    request: \"launch\",\n    name: \"Launch Chrome against localhost\",\n    url: \"http://localhost:8080\",\n    webRoot: \"${workspaceFolder}\",\n    debugServer: 4711,\n  });\n\n  // THEN\n  expect(synthSnapshot(project)[VSCODE_DEBUGGER_FILE]).toStrictEqual({\n    \"//\": expect.anything(),\n    version: \"0.2.0\",\n    configurations: [\n      {\n        type: \"node\",\n        request: \"launch\",\n        name: \"CDK Debugger\",\n        skipFiles: [\"<node_internals>/**\"],\n        runtimeArgs: [\"-r\", \"./node_modules/ts-node/register/transpile-only\"],\n        args: [\"${workspaceFolder}/src/main.ts\"],\n      },\n      {\n        type: \"node\",\n        request: \"launch\",\n        name: \"Launch Program\",\n        skipFiles: [\"<node_internals>/**\"],\n        program: \"${workspaceFolder}/lib/index.js\",\n        preLaunchTask: \"tsc: build - tsconfig.json\",\n        outFiles: [\"${workspaceFolder}/lib/**/*.js\"],\n        internalConsoleOptions: \"openOnSessionStart\",\n      },\n      {\n        type: \"pwa-chrome\",\n        request: \"launch\",\n        name: \"Launch Chrome against localhost\",\n        url: \"http://localhost:8080\",\n        webRoot: \"${workspaceFolder}\",\n        debugServer: 4711,\n      },\n    ],\n  });\n});\n\ntest(\"check correct env output\", () => {\n  // GIVEN\n  const project = new TestProject();\n\n  // WHEN\n  const launchConfig = project.vscode?.launchConfiguration;\n  launchConfig?.addConfiguration({\n    type: \"node\",\n    request: \"launch\",\n    name: \"CDK Debugger\",\n    env: {\n      ONE: \"value\",\n      TWO: false,\n    },\n  });\n\n  // THEN\n  expect(synthSnapshot(project)[VSCODE_DEBUGGER_FILE]).toStrictEqual({\n    \"//\": expect.anything(),\n    version: \"0.2.0\",\n    configurations: [\n      {\n        type: \"node\",\n        request: \"launch\",\n        name: \"CDK Debugger\",\n        env: {\n          ONE: \"value\",\n          TWO: null,\n        },\n      },\n    ],\n  });\n});\n"
  },
  {
    "path": "test/web/__snapshots__/nextjs-project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`defaults 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/pull_request_template.md linguist-generated\n/.github/workflows/build.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.github/workflows/upgrade-main.yml linguist-generated\n/.gitignore linguist-generated\n/.mergify.yml linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/postcss.config.json linguist-generated\n/tailwind.config.json linguist-generated\n/yarn.lock linguist-generated\",\n  \".github/pull_request_template.md\": \"Fixes #\",\n  \".github/workflows/build.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: build\non:\n  pull_request: {}\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      self_mutation_happened: \\${{ steps.self_mutation.outputs.self_mutation_happened }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Install dependencies\n        run: yarn install --check-files\n      - name: build\n        run: npx projen build\n      - id: self_mutation\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\n      - if: steps.self_mutation.outputs.self_mutation_happened\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n      - name: Fail build on mutation\n        if: steps.self_mutation.outputs.self_mutation_happened\n        run: |-\n          echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\n          cat .repo.patch\n          exit 1\n  self-mutation:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: always() && needs.build.outputs.self_mutation_happened && !(github.event.pull_request.head.repo.full_name != github.repository)\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Push changes\n        run: |2-\n            git add .\n            git commit -s -m \\\\\"chore: self mutation\\\\\"\n            git push origin HEAD:\\${{ github.event.pull_request.head.ref }}\n\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/upgrade-main.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n!/.github/workflows/build.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.mergify.yml\n!/.github/workflows/upgrade-main.yml\n!/.github/pull_request_template.md\n!/tailwind.config.json\n!/postcss.config.json\n/.next/\n\",\n  \".mergify.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projenrc.js\n/.projen/\n/dist/changelog.md\n/dist/version.txt\n/.mergify.yml\n/tailwind.config.json\n/postcss.config.json\n/.next/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"standard-version\",\n        \"type\": \"build\",\n        \"version\": \"^9\",\n      },\n      Object {\n        \"name\": \"autoprefixer\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"next\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"postcss\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react-dom\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"tailwindcss\",\n        \"type\": \"runtime\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/pull_request_template.md\",\n      \".github/workflows/build.yml\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".github/workflows/upgrade-main.yml\",\n      \".gitignore\",\n      \".mergify.yml\",\n      \".npmignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n      \"postcss.config.json\",\n      \"tailwind.config.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next build\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"dev\": Object {\n        \"description\": \"Starts the Next.js application in development mode\",\n        \"name\": \"dev\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next dev\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"export\": Object {\n        \"description\": \"Exports the application for production deployment\",\n        \"name\": \"export\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next export\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mkdir -p dist/js\",\n          },\n          Object {\n            \"exec\": \"mv $(npm pack) dist/js/\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"server\": Object {\n        \"description\": \"Starts the Next.js application in production mode\",\n        \"name\": \"server\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next start\",\n          },\n        ],\n      },\n      \"telemetry\": Object {\n        \"description\": \"Checks the status of Next.js telemetry collection\",\n        \"name\": \"telemetry\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next telemetry\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"yarn upgrade npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"yarn install --check-files\",\n          },\n          Object {\n            \"exec\": \"yarn upgrade\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n    },\n  },\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"next-env.d.ts\": \"/// <reference types=\\\\\"next\\\\\" />\n/// <reference types=\\\\\"next/types/global\\\\\" />\n/// <reference types=\\\\\"next/image-types/global\\\\\" />\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/basic-features/typescript for more information.\n\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Object {\n      \"autoprefixer\": \"*\",\n      \"next\": \"*\",\n      \"postcss\": \"*\",\n      \"react\": \"*\",\n      \"react-dom\": \"*\",\n      \"tailwindcss\": \"*\",\n    },\n    \"devDependencies\": Object {\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"standard-version\": \"^9\",\n    },\n    \"engines\": Object {\n      \"node\": \">= 12.22.0\",\n    },\n    \"license\": \"Apache-2.0\",\n    \"main\": \"lib/index.js\",\n    \"name\": \"test-nextjs-project\",\n    \"scripts\": Object {\n      \"build\": \"npx projen build\",\n      \"bump\": \"npx projen bump\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"dev\": \"npx projen dev\",\n      \"eject\": \"npx projen eject\",\n      \"export\": \"npx projen export\",\n      \"package\": \"npx projen package\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"release\": \"npx projen release\",\n      \"server\": \"npx projen server\",\n      \"telemetry\": \"npx projen telemetry\",\n      \"test\": \"npx projen test\",\n      \"unbump\": \"npx projen unbump\",\n      \"upgrade\": \"npx projen upgrade\",\n    },\n    \"version\": \"0.0.0\",\n  },\n  \"pages/index.js\": \"import \\\\\"tailwindcss/tailwind.css\\\\\"\nimport Head from \\\\\"next/head\\\\\"\n\nexport default function Home() {\n  return (\n    <div className=\\\\\"container\\\\\">\n      <Head>\n        <title>Create Next App</title>\n      </Head>\n\n      <main>\n        <h1 className=\\\\\"title\\\\\">\n          Welcome to <a href=\\\\\"https://nextjs.org\\\\\">Next.js!</a>\n        </h1>\n\n        <p className=\\\\\"description\\\\\">\n          Get started by editing <code>pages/index.js</code>\n        </p>\n\n        <div className=\\\\\"grid\\\\\">\n          <a href=\\\\\"https://nextjs.org/docs\\\\\" className=\\\\\"card\\\\\">\n            <h3>Documentation &rarr;</h3>\n            <p>Find in-depth information about Next.js features and API.</p>\n          </a>\n\n          <a href=\\\\\"https://nextjs.org/learn\\\\\" className=\\\\\"card\\\\\">\n            <h3>Learn &rarr;</h3>\n            <p>Learn about Next.js in an interactive course with quizzes!</p>\n          </a>\n\n          <a\n            href=\\\\\"https://github.com/vercel/next.js/tree/master/examples\\\\\"\n            className=\\\\\"card\\\\\"\n          >\n            <h3>Examples &rarr;</h3>\n            <p>Discover and deploy boilerplate example Next.js projects.</p>\n          </a>\n\n          <a\n            href=\\\\\"https://vercel.com/import?filter=next.js&utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app\\\\\"\n            className=\\\\\"card\\\\\"\n          >\n            <h3>Deploy &rarr;</h3>\n            <p>\n              Instantly deploy your Next.js site to a public URL with Vercel.\n            </p>\n          </a>\n        </div>\n      </main>\n\n      <footer>\n        <a\n          href=\\\\\"https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app\\\\\"\n          target=\\\\\"_blank\\\\\"\n          rel=\\\\\"noopener noreferrer\\\\\"\n        >\n          Powered by Vercel\n          <img src=\\\\\"/vercel.svg\\\\\" alt=\\\\\"Vercel Logo\\\\\" className=\\\\\"logo\\\\\" />\n        </a>\n      </footer>\n\n      <style jsx>{\\`\n        .container {\n          min-height: 100vh;\n          padding: 0 0.5rem;\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          align-items: center;\n        }\n\n        main {\n          padding: 5rem 0;\n          flex: 1;\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          align-items: center;\n        }\n\n        footer {\n          width: 100%;\n          height: 100px;\n          border-top: 1px solid #eaeaea;\n          display: flex;\n          justify-content: center;\n          align-items: center;\n        }\n\n        footer img {\n          margin-left: 0.5rem;\n        }\n\n        footer a {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n        }\n\n        a {\n          color: inherit;\n          text-decoration: none;\n        }\n\n        .title a {\n          color: #0070f3;\n          text-decoration: none;\n        }\n\n        .title a:hover,\n        .title a:focus,\n        .title a:active {\n          text-decoration: underline;\n        }\n\n        .title {\n          margin: 0;\n          line-height: 1.15;\n          font-size: 4rem;\n        }\n\n        .title,\n        .description {\n          text-align: center;\n        }\n\n        .description {\n          line-height: 1.5;\n          font-size: 1.5rem;\n        }\n\n        code {\n          background: #fafafa;\n          border-radius: 5px;\n          padding: 0.75rem;\n          font-size: 1.1rem;\n          font-family: Menlo, Monaco, Lucida Console, Liberation Mono,\n            DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;\n        }\n\n        .grid {\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          flex-wrap: wrap;\n\n          max-width: 800px;\n          margin-top: 3rem;\n        }\n\n        .card {\n          margin: 1rem;\n          flex-basis: 45%;\n          padding: 1.5rem;\n          text-align: left;\n          color: inherit;\n          text-decoration: none;\n          border: 1px solid #eaeaea;\n          border-radius: 10px;\n          transition: color 0.15s ease, border-color 0.15s ease;\n        }\n\n        .card:hover,\n        .card:focus,\n        .card:active {\n          color: #0070f3;\n          border-color: #0070f3;\n        }\n\n        .card h3 {\n          margin: 0 0 1rem 0;\n          font-size: 1.5rem;\n        }\n\n        .card p {\n          margin: 0;\n          font-size: 1.25rem;\n          line-height: 1.5;\n        }\n\n        .logo {\n          height: 1em;\n        }\n\n        @media (max-width: 600px) {\n          .grid {\n            width: 100%;\n            flex-direction: column;\n          }\n        }\n      \\`}</style>\n\n      <style jsx global>{\\`\n        html,\n        body {\n          padding: 0;\n          margin: 0;\n          font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,\n            Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue,\n            sans-serif;\n        }\n\n        * {\n          box-sizing: border-box;\n        }\n      \\`}</style>\n    </div>\n  )\n}\n\",\n  \"postcss.config.json\": Object {\n    \"plugins\": Object {\n      \"autoprefixer\": Object {},\n      \"tailwindcss\": Object {\n        \"config\": \"tailwind.config.json\",\n      },\n    },\n  },\n  \"public/vercel.svg\": \"<svg width=\\\\\"283\\\\\" height=\\\\\"64\\\\\" viewBox=\\\\\"0 0 283 64\\\\\" fill=\\\\\"none\\\\\" \n    xmlns=\\\\\"http://www.w3.org/2000/svg\\\\\">\n    <path d=\\\\\"M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z\\\\\" fill=\\\\\"#000\\\\\"/>\n</svg>\",\n  \"tailwind.config.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"darkMode\": false,\n    \"plugins\": Array [],\n    \"purge\": Array [],\n    \"theme\": Object {\n      \"extend\": Object {},\n    },\n    \"variants\": Object {\n      \"extend\": Object {},\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "test/web/__snapshots__/nextjs-ts-project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`defaults 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/pull_request_template.md linguist-generated\n/.github/workflows/build.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/upgrade.yml linguist-generated\n/.gitignore linguist-generated\n/.mergify.yml linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/postcss.config.json linguist-generated\n/tailwind.config.json linguist-generated\n/tsconfig.dev.json linguist-generated\n/tsconfig.json linguist-generated\n/yarn.lock linguist-generated\",\n  \".github/pull_request_template.md\": \"Fixes #\",\n  \".github/workflows/build.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: build\non:\n  pull_request: {}\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      self_mutation_happened: \\${{ steps.self_mutation.outputs.self_mutation_happened }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Install dependencies\n        run: yarn install --check-files\n      - name: build\n        run: npx projen build\n      - id: self_mutation\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\n      - if: steps.self_mutation.outputs.self_mutation_happened\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n      - name: Fail build on mutation\n        if: steps.self_mutation.outputs.self_mutation_happened\n        run: |-\n          echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\n          cat .repo.patch\n          exit 1\n  self-mutation:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: always() && needs.build.outputs.self_mutation_happened && !(github.event.pull_request.head.repo.full_name != github.repository)\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Push changes\n        run: |2-\n            git add .\n            git commit -s -m \\\\\"chore: self mutation\\\\\"\n            git push origin HEAD:\\${{ github.event.pull_request.head.ref }}\n\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/upgrade.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          branch: github-actions/upgrade\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n!/.github/workflows/build.yml\n!/.mergify.yml\n!/.github/workflows/upgrade.yml\n!/.github/pull_request_template.md\n!/test/\n!/tsconfig.json\n!/tsconfig.dev.json\n!/pages/\n/lib\n/dist/\n!/tailwind.config.json\n!/postcss.config.json\n/.next/\n\",\n  \".mergify.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projen/\n/.mergify.yml\n/test/\n/tsconfig.dev.json\n/pages/\n!/lib/\n!/lib/**/*.js\n!/lib/**/*.d.ts\ndist\n/tsconfig.json\n/.github/\n/.vscode/\n/.idea/\n/.projenrc.js\ntsconfig.tsbuildinfo\n/tailwind.config.json\n/postcss.config.json\n/.next/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"@types/node\",\n        \"type\": \"build\",\n        \"version\": \"^12\",\n      },\n      Object {\n        \"name\": \"@types/react\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/react-dom\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"autoprefixer\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"next\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"postcss\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react-dom\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"tailwindcss\",\n        \"type\": \"runtime\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/pull_request_template.md\",\n      \".github/workflows/build.yml\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/upgrade.yml\",\n      \".gitignore\",\n      \".mergify.yml\",\n      \".npmignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n      \"postcss.config.json\",\n      \"tailwind.config.json\",\n      \"tsconfig.dev.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"tsc --build\",\n          },\n          Object {\n            \"exec\": \"next build\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"dev\": Object {\n        \"description\": \"Starts the Next.js application in development mode\",\n        \"name\": \"dev\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next dev\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"export\": Object {\n        \"description\": \"Exports the application for production deployment\",\n        \"name\": \"export\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next export\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"server\": Object {\n        \"description\": \"Starts the Next.js application in production mode\",\n        \"name\": \"server\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next start\",\n          },\n        ],\n      },\n      \"telemetry\": Object {\n        \"description\": \"Checks the status of Next.js telemetry collection\",\n        \"name\": \"telemetry\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"next telemetry\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"yarn upgrade npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"yarn install --check-files\",\n          },\n          Object {\n            \"exec\": \"yarn upgrade\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n      \"watch\": Object {\n        \"description\": \"Watch & compile in the background\",\n        \"name\": \"watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"tsc --build -w\",\n          },\n        ],\n      },\n    },\n  },\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"next-env.d.ts\": \"/// <reference types=\\\\\"next\\\\\" />\n/// <reference types=\\\\\"next/types/global\\\\\" />\n/// <reference types=\\\\\"next/image-types/global\\\\\" />\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/basic-features/typescript for more information.\n\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Object {\n      \"autoprefixer\": \"*\",\n      \"next\": \"*\",\n      \"postcss\": \"*\",\n      \"react\": \"*\",\n      \"react-dom\": \"*\",\n      \"tailwindcss\": \"*\",\n    },\n    \"devDependencies\": Object {\n      \"@types/node\": \"^12\",\n      \"@types/react\": \"*\",\n      \"@types/react-dom\": \"*\",\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"typescript\": \"*\",\n    },\n    \"engines\": Object {\n      \"node\": \">= 12.22.0\",\n    },\n    \"license\": \"Apache-2.0\",\n    \"name\": \"test-nextjs-project\",\n    \"scripts\": Object {\n      \"build\": \"npx projen build\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"dev\": \"npx projen dev\",\n      \"eject\": \"npx projen eject\",\n      \"export\": \"npx projen export\",\n      \"package\": \"npx projen package\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"server\": \"npx projen server\",\n      \"telemetry\": \"npx projen telemetry\",\n      \"test\": \"npx projen test\",\n      \"upgrade\": \"npx projen upgrade\",\n      \"watch\": \"npx projen watch\",\n    },\n    \"version\": \"0.0.0\",\n  },\n  \"pages/index.tsx\": \"import \\\\\"tailwindcss/tailwind.css\\\\\"\nimport Head from \\\\\"next/head\\\\\"\n\nexport default function Home() {\n  return (\n    <div className=\\\\\"container\\\\\">\n      <Head>\n        <title>Create Next App</title>\n      </Head>\n\n      <main>\n        <h1 className=\\\\\"title\\\\\">\n          Welcome to <a href=\\\\\"https://nextjs.org\\\\\">Next.js!</a>\n        </h1>\n\n        <p className=\\\\\"description\\\\\">\n          Get started by editing <code>pages/index.js</code>\n        </p>\n\n        <div className=\\\\\"grid\\\\\">\n          <a href=\\\\\"https://nextjs.org/docs\\\\\" className=\\\\\"card\\\\\">\n            <h3>Documentation &rarr;</h3>\n            <p>Find in-depth information about Next.js features and API.</p>\n          </a>\n\n          <a href=\\\\\"https://nextjs.org/learn\\\\\" className=\\\\\"card\\\\\">\n            <h3>Learn &rarr;</h3>\n            <p>Learn about Next.js in an interactive course with quizzes!</p>\n          </a>\n\n          <a\n            href=\\\\\"https://github.com/vercel/next.js/tree/master/examples\\\\\"\n            className=\\\\\"card\\\\\"\n          >\n            <h3>Examples &rarr;</h3>\n            <p>Discover and deploy boilerplate example Next.js projects.</p>\n          </a>\n\n          <a\n            href=\\\\\"https://vercel.com/import?filter=next.js&utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app\\\\\"\n            className=\\\\\"card\\\\\"\n          >\n            <h3>Deploy &rarr;</h3>\n            <p>\n              Instantly deploy your Next.js site to a public URL with Vercel.\n            </p>\n          </a>\n        </div>\n      </main>\n\n      <footer>\n        <a\n          href=\\\\\"https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app\\\\\"\n          target=\\\\\"_blank\\\\\"\n          rel=\\\\\"noopener noreferrer\\\\\"\n        >\n          Powered by Vercel\n          <img src=\\\\\"/vercel.svg\\\\\" alt=\\\\\"Vercel Logo\\\\\" className=\\\\\"logo\\\\\" />\n        </a>\n      </footer>\n\n      <style jsx>{\\`\n        .container {\n          min-height: 100vh;\n          padding: 0 0.5rem;\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          align-items: center;\n        }\n\n        main {\n          padding: 5rem 0;\n          flex: 1;\n          display: flex;\n          flex-direction: column;\n          justify-content: center;\n          align-items: center;\n        }\n\n        footer {\n          width: 100%;\n          height: 100px;\n          border-top: 1px solid #eaeaea;\n          display: flex;\n          justify-content: center;\n          align-items: center;\n        }\n\n        footer img {\n          margin-left: 0.5rem;\n        }\n\n        footer a {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n        }\n\n        a {\n          color: inherit;\n          text-decoration: none;\n        }\n\n        .title a {\n          color: #0070f3;\n          text-decoration: none;\n        }\n\n        .title a:hover,\n        .title a:focus,\n        .title a:active {\n          text-decoration: underline;\n        }\n\n        .title {\n          margin: 0;\n          line-height: 1.15;\n          font-size: 4rem;\n        }\n\n        .title,\n        .description {\n          text-align: center;\n        }\n\n        .description {\n          line-height: 1.5;\n          font-size: 1.5rem;\n        }\n\n        code {\n          background: #fafafa;\n          border-radius: 5px;\n          padding: 0.75rem;\n          font-size: 1.1rem;\n          font-family: Menlo, Monaco, Lucida Console, Liberation Mono,\n            DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;\n        }\n\n        .grid {\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          flex-wrap: wrap;\n\n          max-width: 800px;\n          margin-top: 3rem;\n        }\n\n        .card {\n          margin: 1rem;\n          flex-basis: 45%;\n          padding: 1.5rem;\n          text-align: left;\n          color: inherit;\n          text-decoration: none;\n          border: 1px solid #eaeaea;\n          border-radius: 10px;\n          transition: color 0.15s ease, border-color 0.15s ease;\n        }\n\n        .card:hover,\n        .card:focus,\n        .card:active {\n          color: #0070f3;\n          border-color: #0070f3;\n        }\n\n        .card h3 {\n          margin: 0 0 1rem 0;\n          font-size: 1.5rem;\n        }\n\n        .card p {\n          margin: 0;\n          font-size: 1.25rem;\n          line-height: 1.5;\n        }\n\n        .logo {\n          height: 1em;\n        }\n\n        @media (max-width: 600px) {\n          .grid {\n            width: 100%;\n            flex-direction: column;\n          }\n        }\n      \\`}</style>\n\n      <style jsx global>{\\`\n        html,\n        body {\n          padding: 0;\n          margin: 0;\n          font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,\n            Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue,\n            sans-serif;\n        }\n\n        * {\n          box-sizing: border-box;\n        }\n      \\`}</style>\n    </div>\n  )\n}\n\",\n  \"postcss.config.json\": Object {\n    \"plugins\": Object {\n      \"autoprefixer\": Object {},\n      \"tailwindcss\": Object {\n        \"config\": \"tailwind.config.json\",\n      },\n    },\n  },\n  \"public/vercel.svg\": \"<svg width=\\\\\"283\\\\\" height=\\\\\"64\\\\\" viewBox=\\\\\"0 0 283 64\\\\\" fill=\\\\\"none\\\\\" \n    xmlns=\\\\\"http://www.w3.org/2000/svg\\\\\">\n    <path d=\\\\\"M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z\\\\\" fill=\\\\\"#000\\\\\"/>\n</svg>\",\n  \"tailwind.config.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"darkMode\": false,\n    \"plugins\": Array [],\n    \"purge\": Array [],\n    \"theme\": Object {\n      \"extend\": Object {},\n    },\n    \"variants\": Object {\n      \"extend\": Object {},\n    },\n  },\n  \"tsconfig.dev.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"allowJs\": true,\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"incremental\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"isolatedModules\": true,\n      \"jsx\": \"preserve\",\n      \"lib\": Array [\n        \"dom\",\n        \"dom.iterable\",\n        \"esnext\",\n      ],\n      \"module\": \"CommonJS\",\n      \"moduleResolution\": \"node\",\n      \"noEmit\": true,\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"resolveJsonModule\": true,\n      \"skipLibCheck\": true,\n      \"strict\": false,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"es5\",\n    },\n    \"exclude\": Array [\n      \"node_modules\",\n    ],\n    \"include\": Array [\n      \".projenrc.js\",\n      \"pages/**/*.ts\",\n      \"test/**/*.ts\",\n      \"**/*.ts\",\n      \"**/*.tsx\",\n    ],\n  },\n  \"tsconfig.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"allowJs\": true,\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"incremental\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"isolatedModules\": true,\n      \"jsx\": \"preserve\",\n      \"lib\": Array [\n        \"dom\",\n        \"dom.iterable\",\n        \"esnext\",\n      ],\n      \"module\": \"CommonJS\",\n      \"moduleResolution\": \"node\",\n      \"noEmit\": true,\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"outDir\": \"lib\",\n      \"resolveJsonModule\": true,\n      \"rootDir\": \"pages\",\n      \"skipLibCheck\": true,\n      \"strict\": false,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"es5\",\n    },\n    \"exclude\": Array [],\n    \"include\": Array [\n      \"pages/**/*.ts\",\n      \"**/*.ts\",\n      \"**/*.tsx\",\n    ],\n  },\n}\n`;\n"
  },
  {
    "path": "test/web/__snapshots__/react-project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`defaults 1`] = `\nObject {\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.gitattributes linguist-generated\n/.github/pull_request_template.md linguist-generated\n/.github/workflows/build.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/release.yml linguist-generated\n/.github/workflows/upgrade-main.yml linguist-generated\n/.gitignore linguist-generated\n/.mergify.yml linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/yarn.lock linguist-generated\",\n  \".github/pull_request_template.md\": \"Fixes #\",\n  \".github/workflows/build.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: build\non:\n  pull_request: {}\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      self_mutation_happened: \\${{ steps.self_mutation.outputs.self_mutation_happened }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Install dependencies\n        run: yarn install --check-files\n      - name: build\n        run: npx projen build\n      - id: self_mutation\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\n      - if: steps.self_mutation.outputs.self_mutation_happened\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n      - name: Fail build on mutation\n        if: steps.self_mutation.outputs.self_mutation_happened\n        run: |-\n          echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\n          cat .repo.patch\n          exit 1\n  self-mutation:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: always() && needs.build.outputs.self_mutation_happened && !(github.event.pull_request.head.repo.full_name != github.repository)\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Push changes\n        run: |2-\n            git add .\n            git commit -s -m \\\\\"chore: self mutation\\\\\"\n            git push origin HEAD:\\${{ github.event.pull_request.head.ref }}\n\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/release.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: release\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch: {}\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      latest_commit: \\${{ steps.git_remote.outputs.latest_commit }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: release\n        run: npx projen release\n      - name: Check for new commits\n        id: git_remote\n        run: echo ::set-output name=latest_commit::\\\\\"$(git ls-remote origin -h \\${{ github.ref }} | cut -f1)\\\\\"\n      - name: Upload artifact\n        if: \\${{ steps.git_remote.outputs.latest_commit == github.sha }}\n        uses: actions/upload-artifact@v2.1.1\n        with:\n          name: build-artifact\n          path: dist\n  release_github:\n    name: Publish to GitHub Releases\n    needs: release\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: needs.release.outputs.latest_commit == github.sha\n    steps:\n      - uses: actions/setup-node@v3\n        with:\n          node-version: 14.x\n      - name: Download build artifacts\n        uses: actions/download-artifact@v3\n        with:\n          name: build-artifact\n          path: dist\n      - name: Release\n        run: errout=$(mktemp); gh release create $(cat dist/releasetag.txt) -R $GITHUB_REPOSITORY -F dist/changelog.md -t $(cat dist/releasetag.txt) --target $GITHUB_REF 2> $errout && true; exitcode=$?; if [ $exitcode -ne 0 ] && ! grep -q \\\\\"Release.tag_name already exists\\\\\" $errout; then cat $errout; exit $exitcode; fi\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n          GITHUB_REPOSITORY: \\${{ github.repository }}\n          GITHUB_REF: \\${{ github.ref }}\n\",\n  \".github/workflows/upgrade-main.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade-main\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: main\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: main\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          branch: github-actions/upgrade-main\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade-main\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n!/.github/workflows/build.yml\n/dist/changelog.md\n/dist/version.txt\n!/.github/workflows/release.yml\n!/.mergify.yml\n!/.github/workflows/upgrade-main.yml\n!/.github/pull_request_template.md\n/build/\n\",\n  \".mergify.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projenrc.js\n/.projen/\n/dist/changelog.md\n/dist/version.txt\n/.mergify.yml\n/build/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"@testing-library/jest-dom\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@testing-library/react\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@testing-library/user-event\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"standard-version\",\n        \"type\": \"build\",\n        \"version\": \"^9\",\n      },\n      Object {\n        \"name\": \"react\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react-dom\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react-scripts\",\n        \"type\": \"runtime\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"web-vitals\",\n        \"type\": \"runtime\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".gitattributes\",\n      \".github/pull_request_template.md\",\n      \".github/workflows/build.yml\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/release.yml\",\n      \".github/workflows/upgrade-main.yml\",\n      \".gitignore\",\n      \".mergify.yml\",\n      \".npmignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"bump\": Object {\n        \"condition\": \"! git log --oneline -1 | grep -q \\\\\"chore(release):\\\\\"\",\n        \"description\": \"Bumps version based on latest git tag and generates a changelog entry\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"bump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/bump-version\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"react-scripts build\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"dev\": Object {\n        \"description\": \"Starts the react application\",\n        \"name\": \"dev\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"react-scripts start\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"mkdir -p dist/js\",\n          },\n          Object {\n            \"exec\": \"mv $(npm pack) dist/js/\",\n          },\n        ],\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"release\": Object {\n        \"description\": \"Prepare a release from \\\\\"main\\\\\" branch\",\n        \"env\": Object {\n          \"RELEASE\": \"true\",\n        },\n        \"name\": \"release\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"rm -fr dist\",\n          },\n          Object {\n            \"spawn\": \"bump\",\n          },\n          Object {\n            \"spawn\": \"build\",\n          },\n          Object {\n            \"spawn\": \"unbump\",\n          },\n          Object {\n            \"exec\": \"git diff --ignore-space-at-eol --exit-code\",\n          },\n        ],\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"react-scripts test --watchAll=false\",\n          },\n        ],\n      },\n      \"unbump\": Object {\n        \"description\": \"Restores version to 0.0.0\",\n        \"env\": Object {\n          \"BUMPFILE\": \"dist/version.txt\",\n          \"CHANGELOG\": \"dist/changelog.md\",\n          \"OUTFILE\": \"package.json\",\n          \"RELEASETAG\": \"dist/releasetag.txt\",\n          \"RELEASE_TAG_PREFIX\": \"\",\n        },\n        \"name\": \"unbump\",\n        \"steps\": Array [\n          Object {\n            \"builtin\": \"release/reset-version\",\n          },\n        ],\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"yarn upgrade npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"yarn install --check-files\",\n          },\n          Object {\n            \"exec\": \"yarn upgrade\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n    },\n  },\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"browserslist\": Object {\n      \"development\": Array [\n        \"last 1 chrome version\",\n        \"last 1 firefox version\",\n        \"last 1 safari version\",\n      ],\n      \"production\": Array [\n        \">0.2%\",\n        \"not dead\",\n        \"not op_mini all\",\n      ],\n    },\n    \"dependencies\": Object {\n      \"react\": \"*\",\n      \"react-dom\": \"*\",\n      \"react-scripts\": \"^5\",\n      \"web-vitals\": \"*\",\n    },\n    \"devDependencies\": Object {\n      \"@testing-library/jest-dom\": \"*\",\n      \"@testing-library/react\": \"*\",\n      \"@testing-library/user-event\": \"*\",\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"standard-version\": \"^9\",\n    },\n    \"eslintConfig\": Object {\n      \"extends\": Array [\n        \"react-app\",\n        \"react-app/jest\",\n      ],\n    },\n    \"license\": \"Apache-2.0\",\n    \"main\": \"lib/index.js\",\n    \"name\": \"test-nextjs-project\",\n    \"scripts\": Object {\n      \"build\": \"npx projen build\",\n      \"bump\": \"npx projen bump\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"dev\": \"npx projen dev\",\n      \"eject\": \"npx projen eject\",\n      \"package\": \"npx projen package\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"release\": \"npx projen release\",\n      \"test\": \"npx projen test\",\n      \"unbump\": \"npx projen unbump\",\n      \"upgrade\": \"npx projen upgrade\",\n    },\n    \"version\": \"0.0.0\",\n  },\n  \"public/index.html\": \"<!DOCTYPE html>\n<html lang=\\\\\"en\\\\\">\n  <head>\n    <meta charset=\\\\\"utf-8\\\\\" />\n    <link rel=\\\\\"icon\\\\\" href=\\\\\"%PUBLIC_URL%/favicon.ico\\\\\" />\n    <meta name=\\\\\"viewport\\\\\" content=\\\\\"width=device-width, initial-scale=1\\\\\" />\n    <meta name=\\\\\"theme-color\\\\\" content=\\\\\"#000000\\\\\" />\n    <meta\n      name=\\\\\"description\\\\\"\n      content=\\\\\"Web site created using create-react-app\\\\\"\n    />\n    <link rel=\\\\\"apple-touch-icon\\\\\" href=\\\\\"%PUBLIC_URL%/logo192.png\\\\\" />\n    <!--\n      manifest.json provides metadata used when your web app is installed on a\n      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n    -->\n    <link rel=\\\\\"manifest\\\\\" href=\\\\\"%PUBLIC_URL%/manifest.json\\\\\" />\n    <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the \\`public\\` folder during the build.\n      Only files inside the \\`public\\` folder can be referenced from the HTML.\n\n      Unlike \\\\\"/favicon.ico\\\\\" or \\\\\"favicon.ico\\\\\", \\\\\"%PUBLIC_URL%/favicon.ico\\\\\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running \\`npm run build\\`.\n    -->\n    <title>React App</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\\\\\"root\\\\\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run \\`npm start\\` or \\`yarn start\\`.\n      To create a production bundle, use \\`npm run build\\` or \\`yarn build\\`.\n    -->\n  </body>\n</html>\n\",\n  \"public/manifest.json\": Object {\n    \"background_color\": \"#ffffff\",\n    \"display\": \"standalone\",\n    \"icons\": Array [\n      Object {\n        \"sizes\": \"64x64 32x32 24x24 16x16\",\n        \"src\": \"favicon.ico\",\n        \"type\": \"image/x-icon\",\n      },\n      Object {\n        \"sizes\": \"192x192\",\n        \"src\": \"logo192.png\",\n        \"type\": \"image/png\",\n      },\n      Object {\n        \"sizes\": \"512x512\",\n        \"src\": \"logo512.png\",\n        \"type\": \"image/png\",\n      },\n    ],\n    \"name\": \"Create React App Sample\",\n    \"short_name\": \"React App\",\n    \"start_url\": \".\",\n    \"theme_color\": \"#000000\",\n  },\n  \"public/robots.txt\": \"# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n\",\n  \"src/App.css\": \".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\",\n  \"src/App.jsx\": \"import logo from './logo.svg';\nimport './App.css'\n\nfunction App() {\n  return (\n   <div className=\\\\\"App\\\\\">\n      <header className=\\\\\"App-header\\\\\">\n        <img src={logo} className=\\\\\"App-logo\\\\\" alt=\\\\\"logo\\\\\" />\n        <p>\n          Edit <code>src/App.jsx</code> and save to reload.\n        </p>\n        <a className=\\\\\"App-link\\\\\"\n          href=\\\\\"https://reactjs.org\\\\\"\n          target=\\\\\"_blank\\\\\"\n          rel=\\\\\"noopener noreferrer\\\\\"\n        >\n          Learn React\n        </a>\n      </header>\n    </div>\n  );\n}\n\nexport default App;\n\",\n  \"src/App.test.jsx\": \"import { render, screen } from '@testing-library/react';\nimport App from './App';\n\ntest('renders learn react link', () => {\n  render(<App />);\n  const linkElement = screen.getByText(/learn react/i);\n  expect(linkElement).toBeInTheDocument();\n});\n\",\n  \"src/index.css\": \"body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n    sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n    monospace;\n}\n\",\n  \"src/index.jsx\": \"import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n\",\n  \"src/logo.svg\": \"<svg xmlns=\\\\\"http://www.w3.org/2000/svg\\\\\" viewBox=\\\\\"0 0 841.9 595.3\\\\\">\n    <g fill=\\\\\"#61DAFB\\\\\">\n        <path d=\\\\\"M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z\\\\\"/>\n        <circle cx=\\\\\"420.9\\\\\" cy=\\\\\"296.5\\\\\" r=\\\\\"45.7\\\\\"/>\n        <path d=\\\\\"M520.5 78.1z\\\\\"/>\n    </g>\n</svg>\n\",\n  \"src/react-app-env.d.ts\": \"/// <reference types=\\\\\"react-scripts\\\\\" />\",\n  \"src/reportWebVitals.js\": \"import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(\n      ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n        getCLS(onPerfEntry);\n        getFID(onPerfEntry);\n        getFCP(onPerfEntry);\n        getLCP(onPerfEntry);\n        getTTFB(onPerfEntry);\n      },\n      () => {}\n    );\n  }\n};\n\nexport default reportWebVitals;\",\n  \"src/setupTests.js\": \"// jest-dom adds custom jest matchers for asserting on DOM nodes.\n// allows you to do things like:\n// expect(element).toHaveTextContent(/react/i)\n// learn more: https://github.com/testing-library/jest-dom\nimport '@testing-library/jest-dom';\n\",\n}\n`;\n\nexports[`rewire creates config-overrides.js 1`] = `\n\"/**\n * Override CRA configuration without needing to eject.\n *\n * @see https://www.npmjs.com/package/react-app-rewired\n */\nmodule.exports = function override(config, env) {\n  config.module.prop1 = false;\n  config.module.prop2 = 5;\n  config.module.prop3 = [1,2];\n  config.module.prop4 = {\\\\\"one\\\\\":2};\n  config.module.prop5 = \\\\\"one\\\\\";\n  return config;\n};\"\n`;\n"
  },
  {
    "path": "test/web/__snapshots__/react-ts-project.test.ts.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`defaults 1`] = `\nObject {\n  \".eslintrc.json\": Object {\n    \"env\": Object {\n      \"jest\": true,\n      \"node\": true,\n    },\n    \"extends\": Array [\n      \"plugin:import/typescript\",\n    ],\n    \"ignorePatterns\": Array [\n      \"*.js\",\n      \"!.projenrc.js\",\n      \"*.d.ts\",\n      \"node_modules/\",\n      \"*.generated.ts\",\n      \"coverage\",\n    ],\n    \"overrides\": Array [\n      Object {\n        \"files\": Array [\n          \".projenrc.js\",\n        ],\n        \"rules\": Object {\n          \"@typescript-eslint/no-require-imports\": \"off\",\n          \"import/no-extraneous-dependencies\": \"off\",\n        },\n      },\n    ],\n    \"parser\": \"@typescript-eslint/parser\",\n    \"parserOptions\": Object {\n      \"ecmaVersion\": 2018,\n      \"project\": \"./tsconfig.dev.json\",\n      \"sourceType\": \"module\",\n    },\n    \"plugins\": Array [\n      \"@typescript-eslint\",\n      \"import\",\n    ],\n    \"root\": true,\n    \"rules\": Object {\n      \"@typescript-eslint/indent\": Array [\n        \"error\",\n        2,\n      ],\n      \"@typescript-eslint/member-delimiter-style\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/member-ordering\": Array [\n        \"error\",\n        Object {\n          \"default\": Array [\n            \"public-static-field\",\n            \"public-static-method\",\n            \"protected-static-field\",\n            \"protected-static-method\",\n            \"private-static-field\",\n            \"private-static-method\",\n            \"field\",\n            \"constructor\",\n            \"method\",\n          ],\n        },\n      ],\n      \"@typescript-eslint/no-floating-promises\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-require-imports\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/no-shadow\": Array [\n        \"error\",\n      ],\n      \"@typescript-eslint/return-await\": Array [\n        \"error\",\n      ],\n      \"array-bracket-newline\": Array [\n        \"error\",\n        \"consistent\",\n      ],\n      \"array-bracket-spacing\": Array [\n        \"error\",\n        \"never\",\n      ],\n      \"brace-style\": Array [\n        \"error\",\n        \"1tbs\",\n        Object {\n          \"allowSingleLine\": true,\n        },\n      ],\n      \"comma-dangle\": Array [\n        \"error\",\n        \"always-multiline\",\n      ],\n      \"comma-spacing\": Array [\n        \"error\",\n        Object {\n          \"after\": true,\n          \"before\": false,\n        },\n      ],\n      \"curly\": Array [\n        \"error\",\n        \"multi-line\",\n        \"consistent\",\n      ],\n      \"dot-notation\": Array [\n        \"error\",\n      ],\n      \"import/no-extraneous-dependencies\": Array [\n        \"error\",\n        Object {\n          \"devDependencies\": Array [\n            \"**/src/**/*.test.tsx\",\n            \"**/src/setupTests.ts\",\n          ],\n          \"optionalDependencies\": false,\n          \"peerDependencies\": true,\n        },\n      ],\n      \"import/no-unresolved\": Array [\n        \"error\",\n      ],\n      \"import/order\": Array [\n        \"warn\",\n        Object {\n          \"alphabetize\": Object {\n            \"caseInsensitive\": true,\n            \"order\": \"asc\",\n          },\n          \"groups\": Array [\n            \"builtin\",\n            \"external\",\n          ],\n        },\n      ],\n      \"indent\": Array [\n        \"off\",\n      ],\n      \"key-spacing\": Array [\n        \"error\",\n      ],\n      \"keyword-spacing\": Array [\n        \"error\",\n      ],\n      \"max-len\": Array [\n        \"error\",\n        Object {\n          \"code\": 150,\n          \"ignoreComments\": true,\n          \"ignoreRegExpLiterals\": true,\n          \"ignoreStrings\": true,\n          \"ignoreTemplateLiterals\": true,\n          \"ignoreUrls\": true,\n        },\n      ],\n      \"no-bitwise\": Array [\n        \"error\",\n      ],\n      \"no-duplicate-imports\": Array [\n        \"error\",\n      ],\n      \"no-multi-spaces\": Array [\n        \"error\",\n        Object {\n          \"ignoreEOLComments\": false,\n        },\n      ],\n      \"no-multiple-empty-lines\": Array [\n        \"error\",\n      ],\n      \"no-return-await\": Array [\n        \"off\",\n      ],\n      \"no-shadow\": Array [\n        \"off\",\n      ],\n      \"no-trailing-spaces\": Array [\n        \"error\",\n      ],\n      \"object-curly-newline\": Array [\n        \"error\",\n        Object {\n          \"consistent\": true,\n          \"multiline\": true,\n        },\n      ],\n      \"object-curly-spacing\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"object-property-newline\": Array [\n        \"error\",\n        Object {\n          \"allowAllPropertiesOnSameLine\": true,\n        },\n      ],\n      \"quote-props\": Array [\n        \"error\",\n        \"consistent-as-needed\",\n      ],\n      \"quotes\": Array [\n        \"error\",\n        \"single\",\n        Object {\n          \"avoidEscape\": true,\n        },\n      ],\n      \"semi\": Array [\n        \"error\",\n        \"always\",\n      ],\n      \"space-before-blocks\": Array [\n        \"error\",\n      ],\n    },\n    \"settings\": Object {\n      \"import/parsers\": Object {\n        \"@typescript-eslint/parser\": Array [\n          \".ts\",\n          \".tsx\",\n        ],\n      },\n      \"import/resolver\": Object {\n        \"node\": Object {},\n        \"typescript\": Object {\n          \"alwaysTryTypes\": true,\n          \"project\": \"./tsconfig.dev.json\",\n        },\n      },\n    },\n  },\n  \".gitattributes\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\n/.eslintrc.json linguist-generated\n/.gitattributes linguist-generated\n/.github/pull_request_template.md linguist-generated\n/.github/workflows/build.yml linguist-generated\n/.github/workflows/pull-request-lint.yml linguist-generated\n/.github/workflows/upgrade.yml linguist-generated\n/.gitignore linguist-generated\n/.mergify.yml linguist-generated\n/.npmignore linguist-generated\n/.projen/** linguist-generated\n/.projen/deps.json linguist-generated\n/.projen/files.json linguist-generated\n/.projen/tasks.json linguist-generated\n/LICENSE linguist-generated\n/package.json linguist-generated\n/tsconfig.dev.json linguist-generated\n/tsconfig.json linguist-generated\n/yarn.lock linguist-generated\",\n  \".github/pull_request_template.md\": \"Fixes #\",\n  \".github/workflows/build.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: build\non:\n  pull_request: {}\n  workflow_dispatch: {}\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    outputs:\n      self_mutation_happened: \\${{ steps.self_mutation.outputs.self_mutation_happened }}\n    env:\n      CI: \\\\\"true\\\\\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Install dependencies\n        run: yarn install --check-files\n      - name: build\n        run: npx projen build\n      - id: self_mutation\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=self_mutation_happened::true\\\\\"\n      - if: steps.self_mutation.outputs.self_mutation_happened\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n      - name: Fail build on mutation\n        if: steps.self_mutation.outputs.self_mutation_happened\n        run: |-\n          echo \\\\\"::error::Files were changed during build (see build log). If this was triggered from a fork, you will need to update your branch.\\\\\"\n          cat .repo.patch\n          exit 1\n  self-mutation:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    if: always() && needs.build.outputs.self_mutation_happened && !(github.event.pull_request.head.repo.full_name != github.repository)\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          ref: \\${{ github.event.pull_request.head.ref }}\n          repository: \\${{ github.event.pull_request.head.repo.full_name }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Push changes\n        run: |2-\n            git add .\n            git commit -s -m \\\\\"chore: self mutation\\\\\"\n            git push origin HEAD:\\${{ github.event.pull_request.head.ref }}\n\",\n  \".github/workflows/pull-request-lint.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: pull-request-lint\non:\n  pull_request_target:\n    types:\n      - labeled\n      - opened\n      - synchronize\n      - reopened\n      - ready_for_review\n      - edited\njobs:\n  validate:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - uses: amannn/action-semantic-pull-request@v4.5.0\n        env:\n          GITHUB_TOKEN: \\${{ secrets.GITHUB_TOKEN }}\n        with:\n          types: |-\n            feat\n            fix\n            chore\n          requireScope: false\n\",\n  \".github/workflows/upgrade.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nname: upgrade\non:\n  workflow_dispatch: {}\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  upgrade:\n    name: Upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    outputs:\n      patch_created: \\${{ steps.create_patch.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Install dependencies\n        run: yarn install --check-files --frozen-lockfile\n      - name: Upgrade dependencies\n        run: npx projen upgrade\n      - id: create_patch\n        name: Find mutations\n        run: |-\n          git add .\n          git diff --staged --patch --exit-code > .repo.patch || echo \\\\\"::set-output name=patch_created::true\\\\\"\n      - if: steps.create_patch.outputs.patch_created\n        name: Upload patch\n        uses: actions/upload-artifact@v2\n        with:\n          name: .repo.patch\n          path: .repo.patch\n  pr:\n    name: Create Pull Request\n    needs: upgrade\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    if: \\${{ needs.upgrade.outputs.patch_created }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n      - name: Download patch\n        uses: actions/download-artifact@v3\n        with:\n          name: .repo.patch\n          path: \\${{ runner.temp }}\n      - name: Apply patch\n        run: '[ -s \\${{ runner.temp }}/.repo.patch ] && git apply \\${{ runner.temp }}/.repo.patch || echo \\\\\"Empty patch. Skipping.\\\\\"'\n      - name: Set git identity\n        run: |-\n          git config user.name \\\\\"github-actions\\\\\"\n          git config user.email \\\\\"github-actions@github.com\\\\\"\n      - name: Create Pull Request\n        id: create-pr\n        uses: peter-evans/create-pull-request@v3\n        with:\n          token: \\${{ secrets.PROJEN_GITHUB_TOKEN }}\n          commit-message: |-\n            chore(deps): upgrade dependencies\n\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          branch: github-actions/upgrade\n          title: \\\\\"chore(deps): upgrade dependencies\\\\\"\n          body: |-\n            Upgrades project dependencies. See details in [workflow run].\n\n            [Workflow Run]: https://github.com/\\${{ github.repository }}/actions/runs/\\${{ github.run_id }}\n\n            ------\n\n            *Automatically created by projen via the \\\\\"upgrade\\\\\" workflow*\n          author: github-actions <github-actions@github.com>\n          committer: github-actions <github-actions@github.com>\n          signoff: true\n\",\n  \".gitignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n!/.gitattributes\n!/.projen/tasks.json\n!/.projen/deps.json\n!/.projen/files.json\n!/.github/workflows/pull-request-lint.yml\n!/package.json\n!/LICENSE\n!/.npmignore\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\npids\n*.pid\n*.seed\n*.pid.lock\nlib-cov\ncoverage\n*.lcov\n.nyc_output\nbuild/Release\nnode_modules/\njspm_packages/\n*.tsbuildinfo\n.eslintcache\n*.tgz\n.yarn-integrity\n.cache\n!/.projenrc.js\n!/.github/workflows/build.yml\n!/.mergify.yml\n!/.github/workflows/upgrade.yml\n!/.github/pull_request_template.md\n!/test/\n!/tsconfig.json\n!/tsconfig.dev.json\n!/src/\n/lib\n/dist/\n!/.eslintrc.json\n/build/\n\",\n  \".mergify.yml\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n\nqueue_rules:\n  - name: default\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\npull_request_rules:\n  - name: Automatic merge on approval and successful build\n    actions:\n      delete_head_branch: {}\n      queue:\n        method: squash\n        name: default\n        commit_message_template: |-\n          {{ title }} (#{{ number }})\n\n          {{ body }}\n    conditions:\n      - \\\\\"#approved-reviews-by>=1\\\\\"\n      - -label~=(do-not-merge)\n      - status-success=build\n\",\n  \".npmignore\": \"# ~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\n/.projen/\n/.mergify.yml\n/test/\n/tsconfig.dev.json\n/src/\n!/lib/\n!/lib/**/*.js\n!/lib/**/*.d.ts\ndist\n/tsconfig.json\n/.github/\n/.vscode/\n/.idea/\n/.projenrc.js\ntsconfig.tsbuildinfo\n/.eslintrc.json\n/build/\n\",\n  \".projen/deps.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"dependencies\": Array [\n      Object {\n        \"name\": \"@testing-library/jest-dom\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@testing-library/react\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@testing-library/user-event\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/jest\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/node\",\n        \"type\": \"build\",\n        \"version\": \"^14\",\n      },\n      Object {\n        \"name\": \"@types/react\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@types/react-dom\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/eslint-plugin\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"@typescript-eslint/parser\",\n        \"type\": \"build\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-node\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-import-resolver-typescript\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint-plugin-import\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"eslint\",\n        \"type\": \"build\",\n        \"version\": \"^8\",\n      },\n      Object {\n        \"name\": \"json-schema\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"npm-check-updates\",\n        \"type\": \"build\",\n        \"version\": \"^15\",\n      },\n      Object {\n        \"name\": \"projen\",\n        \"type\": \"build\",\n      },\n      Object {\n        \"name\": \"typescript\",\n        \"type\": \"build\",\n        \"version\": \"^4.0.3\",\n      },\n      Object {\n        \"name\": \"react\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react-dom\",\n        \"type\": \"runtime\",\n      },\n      Object {\n        \"name\": \"react-scripts\",\n        \"type\": \"runtime\",\n        \"version\": \"^5\",\n      },\n      Object {\n        \"name\": \"web-vitals\",\n        \"type\": \"runtime\",\n      },\n    ],\n  },\n  \".projen/files.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"files\": Array [\n      \".eslintrc.json\",\n      \".gitattributes\",\n      \".github/pull_request_template.md\",\n      \".github/workflows/build.yml\",\n      \".github/workflows/pull-request-lint.yml\",\n      \".github/workflows/upgrade.yml\",\n      \".gitignore\",\n      \".mergify.yml\",\n      \".npmignore\",\n      \".projen/deps.json\",\n      \".projen/files.json\",\n      \".projen/tasks.json\",\n      \"LICENSE\",\n      \"tsconfig.dev.json\",\n      \"tsconfig.json\",\n    ],\n  },\n  \".projen/tasks.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"env\": Object {\n      \"PATH\": \"$(npx -c \\\\\"node -e \\\\\\\\\\\\\"console.log(process.env.PATH)\\\\\\\\\\\\\"\\\\\")\",\n    },\n    \"tasks\": Object {\n      \"build\": Object {\n        \"description\": \"Full release build\",\n        \"name\": \"build\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n          Object {\n            \"spawn\": \"pre-compile\",\n          },\n          Object {\n            \"spawn\": \"compile\",\n          },\n          Object {\n            \"spawn\": \"post-compile\",\n          },\n          Object {\n            \"spawn\": \"test\",\n          },\n          Object {\n            \"spawn\": \"package\",\n          },\n        ],\n      },\n      \"compile\": Object {\n        \"description\": \"Only compile\",\n        \"name\": \"compile\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"react-scripts build\",\n          },\n        ],\n      },\n      \"default\": Object {\n        \"description\": \"Synthesize project files\",\n        \"name\": \"default\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"node .projenrc.js\",\n          },\n        ],\n      },\n      \"dev\": Object {\n        \"description\": \"Starts the react application\",\n        \"name\": \"dev\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"react-scripts start\",\n          },\n        ],\n      },\n      \"eject\": Object {\n        \"description\": \"Remove projen from the project\",\n        \"env\": Object {\n          \"PROJEN_EJECTING\": \"true\",\n        },\n        \"name\": \"eject\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"default\",\n          },\n        ],\n      },\n      \"eslint\": Object {\n        \"description\": \"Runs eslint against the codebase\",\n        \"name\": \"eslint\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"eslint --ext .ts,.tsx --fix --no-error-on-unmatched-pattern src test build-tools .projenrc.js\",\n          },\n        ],\n      },\n      \"package\": Object {\n        \"description\": \"Creates the distribution package\",\n        \"name\": \"package\",\n      },\n      \"post-compile\": Object {\n        \"description\": \"Runs after successful compilation\",\n        \"name\": \"post-compile\",\n      },\n      \"post-upgrade\": Object {\n        \"description\": \"Runs after upgrading dependencies\",\n        \"name\": \"post-upgrade\",\n      },\n      \"pre-compile\": Object {\n        \"description\": \"Prepare the project for compilation\",\n        \"name\": \"pre-compile\",\n      },\n      \"test\": Object {\n        \"description\": \"Run tests\",\n        \"name\": \"test\",\n        \"steps\": Array [\n          Object {\n            \"spawn\": \"eslint\",\n          },\n          Object {\n            \"exec\": \"react-scripts test --watchAll=false\",\n          },\n        ],\n      },\n      \"upgrade\": Object {\n        \"description\": \"upgrade dependencies\",\n        \"env\": Object {\n          \"CI\": \"0\",\n        },\n        \"name\": \"upgrade\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"yarn upgrade npm-check-updates\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep dev --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep optional --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep peer --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep prod --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"npm-check-updates --dep bundle --upgrade --target=minor\",\n          },\n          Object {\n            \"exec\": \"yarn install --check-files\",\n          },\n          Object {\n            \"exec\": \"yarn upgrade\",\n          },\n          Object {\n            \"exec\": \"npx projen\",\n          },\n          Object {\n            \"spawn\": \"post-upgrade\",\n          },\n        ],\n      },\n      \"watch\": Object {\n        \"description\": \"Watch & compile in the background\",\n        \"name\": \"watch\",\n        \"steps\": Array [\n          Object {\n            \"exec\": \"tsc --build -w\",\n          },\n        ],\n      },\n    },\n  },\n  \"LICENSE\": \"\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \\\\\"License\\\\\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \\\\\"Licensor\\\\\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \\\\\"Legal Entity\\\\\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \\\\\"control\\\\\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \\\\\"You\\\\\" (or \\\\\"Your\\\\\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \\\\\"Source\\\\\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \\\\\"Object\\\\\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \\\\\"Work\\\\\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \\\\\"Derivative Works\\\\\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \\\\\"Contribution\\\\\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \\\\\"submitted\\\\\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \\\\\"Not a Contribution.\\\\\"\n\n      \\\\\"Contributor\\\\\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \\\\\"NOTICE\\\\\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \\\\\"AS IS\\\\\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \\\\\"[]\\\\\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \\\\\"printed page\\\\\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \\\\\"License\\\\\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \\\\\"AS IS\\\\\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\",\n  \"README.md\": \"# replace this\",\n  \"package.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"browserslist\": Object {\n      \"development\": Array [\n        \"last 1 chrome version\",\n        \"last 1 firefox version\",\n        \"last 1 safari version\",\n      ],\n      \"production\": Array [\n        \">0.2%\",\n        \"not dead\",\n        \"not op_mini all\",\n      ],\n    },\n    \"dependencies\": Object {\n      \"react\": \"*\",\n      \"react-dom\": \"*\",\n      \"react-scripts\": \"^5\",\n      \"web-vitals\": \"*\",\n    },\n    \"devDependencies\": Object {\n      \"@testing-library/jest-dom\": \"*\",\n      \"@testing-library/react\": \"*\",\n      \"@testing-library/user-event\": \"*\",\n      \"@types/jest\": \"*\",\n      \"@types/node\": \"^14\",\n      \"@types/react\": \"*\",\n      \"@types/react-dom\": \"*\",\n      \"@typescript-eslint/eslint-plugin\": \"^5\",\n      \"@typescript-eslint/parser\": \"^5\",\n      \"eslint\": \"^8\",\n      \"eslint-import-resolver-node\": \"*\",\n      \"eslint-import-resolver-typescript\": \"*\",\n      \"eslint-plugin-import\": \"*\",\n      \"json-schema\": \"*\",\n      \"npm-check-updates\": \"^15\",\n      \"projen\": \"*\",\n      \"typescript\": \"^4.0.3\",\n    },\n    \"eslintConfig\": Object {\n      \"extends\": Array [\n        \"react-app\",\n        \"react-app/jest\",\n      ],\n    },\n    \"license\": \"Apache-2.0\",\n    \"name\": \"test-nextjs-project\",\n    \"scripts\": Object {\n      \"build\": \"npx projen build\",\n      \"compile\": \"npx projen compile\",\n      \"default\": \"npx projen default\",\n      \"dev\": \"npx projen dev\",\n      \"eject\": \"npx projen eject\",\n      \"eslint\": \"npx projen eslint\",\n      \"package\": \"npx projen package\",\n      \"post-compile\": \"npx projen post-compile\",\n      \"post-upgrade\": \"npx projen post-upgrade\",\n      \"pre-compile\": \"npx projen pre-compile\",\n      \"projen\": \"npx projen\",\n      \"test\": \"npx projen test\",\n      \"upgrade\": \"npx projen upgrade\",\n      \"watch\": \"npx projen watch\",\n    },\n    \"version\": \"0.0.0\",\n  },\n  \"public/index.html\": \"<!DOCTYPE html>\n<html lang=\\\\\"en\\\\\">\n  <head>\n    <meta charset=\\\\\"utf-8\\\\\" />\n    <link rel=\\\\\"icon\\\\\" href=\\\\\"%PUBLIC_URL%/favicon.ico\\\\\" />\n    <meta name=\\\\\"viewport\\\\\" content=\\\\\"width=device-width, initial-scale=1\\\\\" />\n    <meta name=\\\\\"theme-color\\\\\" content=\\\\\"#000000\\\\\" />\n    <meta\n      name=\\\\\"description\\\\\"\n      content=\\\\\"Web site created using create-react-app\\\\\"\n    />\n    <link rel=\\\\\"apple-touch-icon\\\\\" href=\\\\\"%PUBLIC_URL%/logo192.png\\\\\" />\n    <!--\n      manifest.json provides metadata used when your web app is installed on a\n      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n    -->\n    <link rel=\\\\\"manifest\\\\\" href=\\\\\"%PUBLIC_URL%/manifest.json\\\\\" />\n    <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the \\`public\\` folder during the build.\n      Only files inside the \\`public\\` folder can be referenced from the HTML.\n\n      Unlike \\\\\"/favicon.ico\\\\\" or \\\\\"favicon.ico\\\\\", \\\\\"%PUBLIC_URL%/favicon.ico\\\\\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running \\`npm run build\\`.\n    -->\n    <title>React App</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\\\\\"root\\\\\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run \\`npm start\\` or \\`yarn start\\`.\n      To create a production bundle, use \\`npm run build\\` or \\`yarn build\\`.\n    -->\n  </body>\n</html>\n\",\n  \"public/manifest.json\": Object {\n    \"background_color\": \"#ffffff\",\n    \"display\": \"standalone\",\n    \"icons\": Array [\n      Object {\n        \"sizes\": \"64x64 32x32 24x24 16x16\",\n        \"src\": \"favicon.ico\",\n        \"type\": \"image/x-icon\",\n      },\n      Object {\n        \"sizes\": \"192x192\",\n        \"src\": \"logo192.png\",\n        \"type\": \"image/png\",\n      },\n      Object {\n        \"sizes\": \"512x512\",\n        \"src\": \"logo512.png\",\n        \"type\": \"image/png\",\n      },\n    ],\n    \"name\": \"Create React App Sample\",\n    \"short_name\": \"React App\",\n    \"start_url\": \".\",\n    \"theme_color\": \"#000000\",\n  },\n  \"public/robots.txt\": \"# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n\",\n  \"src/App.css\": \".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n\",\n  \"src/App.test.tsx\": \"import { render, screen } from '@testing-library/react';\nimport App from './App';\n\ntest('renders learn react link', () => {\n  render(<App />);\n  const linkElement = screen.getByText(/learn react/i);\n  expect(linkElement).toBeInTheDocument();\n});\n\",\n  \"src/App.tsx\": \"import logo from './logo.svg';\nimport './App.css'\n\nfunction App() {\n  return (\n   <div className=\\\\\"App\\\\\">\n      <header className=\\\\\"App-header\\\\\">\n        <img src={logo} className=\\\\\"App-logo\\\\\" alt=\\\\\"logo\\\\\" />\n        <p>\n          Edit <code>src/App.tsx</code> and save to reload.\n        </p>\n        <a className=\\\\\"App-link\\\\\"\n          href=\\\\\"https://reactjs.org\\\\\"\n          target=\\\\\"_blank\\\\\"\n          rel=\\\\\"noopener noreferrer\\\\\"\n        >\n          Learn React\n        </a>\n      </header>\n    </div>\n  );\n}\n\nexport default App;\n\",\n  \"src/index.css\": \"body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n    sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n    monospace;\n}\n\",\n  \"src/index.tsx\": \"import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n\",\n  \"src/logo.svg\": \"<svg xmlns=\\\\\"http://www.w3.org/2000/svg\\\\\" viewBox=\\\\\"0 0 841.9 595.3\\\\\">\n    <g fill=\\\\\"#61DAFB\\\\\">\n        <path d=\\\\\"M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z\\\\\"/>\n        <circle cx=\\\\\"420.9\\\\\" cy=\\\\\"296.5\\\\\" r=\\\\\"45.7\\\\\"/>\n        <path d=\\\\\"M520.5 78.1z\\\\\"/>\n    </g>\n</svg>\n\",\n  \"src/react-app-env.d.ts\": \"/// <reference types=\\\\\"react-scripts\\\\\" />\",\n  \"src/reportWebVitals.ts\": \"import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(\n      ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n        getCLS(onPerfEntry);\n        getFID(onPerfEntry);\n        getFCP(onPerfEntry);\n        getLCP(onPerfEntry);\n        getTTFB(onPerfEntry);\n      },\n      () => {}\n    );\n  }\n};\n\nexport default reportWebVitals;\",\n  \"src/setupTests.ts\": \"// jest-dom adds custom jest matchers for asserting on DOM nodes.\n// allows you to do things like:\n// expect(element).toHaveTextContent(/react/i)\n// learn more: https://github.com/testing-library/jest-dom\nimport '@testing-library/jest-dom';\n\",\n  \"tsconfig.dev.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"allowJs\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"isolatedModules\": true,\n      \"jsx\": \"react-jsx\",\n      \"lib\": Array [\n        \"dom\",\n        \"dom.iterable\",\n        \"esnext\",\n      ],\n      \"module\": \"commonjs\",\n      \"moduleResolution\": \"node\",\n      \"noEmit\": true,\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"resolveJsonModule\": true,\n      \"skipLibCheck\": true,\n      \"strict\": true,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"es5\",\n    },\n    \"exclude\": Array [\n      \"node_modules\",\n    ],\n    \"include\": Array [\n      \".projenrc.js\",\n      \"src/**/*.ts\",\n      \"test/**/*.ts\",\n      \"src\",\n    ],\n  },\n  \"tsconfig.json\": Object {\n    \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\\\"npx projen\\\\\".\",\n    \"compilerOptions\": Object {\n      \"allowJs\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"esModuleInterop\": true,\n      \"experimentalDecorators\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"inlineSourceMap\": true,\n      \"inlineSources\": true,\n      \"isolatedModules\": true,\n      \"jsx\": \"react-jsx\",\n      \"lib\": Array [\n        \"dom\",\n        \"dom.iterable\",\n        \"esnext\",\n      ],\n      \"module\": \"commonjs\",\n      \"moduleResolution\": \"node\",\n      \"noEmit\": true,\n      \"noEmitOnError\": false,\n      \"noFallthroughCasesInSwitch\": true,\n      \"noImplicitAny\": true,\n      \"noImplicitReturns\": true,\n      \"noImplicitThis\": true,\n      \"noUnusedLocals\": true,\n      \"noUnusedParameters\": true,\n      \"outDir\": \"lib\",\n      \"resolveJsonModule\": true,\n      \"rootDir\": \"src\",\n      \"skipLibCheck\": true,\n      \"strict\": true,\n      \"strictNullChecks\": true,\n      \"strictPropertyInitialization\": true,\n      \"stripInternal\": true,\n      \"target\": \"es5\",\n    },\n    \"exclude\": Array [],\n    \"include\": Array [\n      \"src/**/*.ts\",\n      \"src\",\n    ],\n  },\n}\n`;\n"
  },
  {
    "path": "test/web/nextjs-project.test.ts",
    "content": "import { NextJsProject, NextJsProjectOptions } from \"../../src/web\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"defaults\", () => {\n  const p = new TestNextJsProject();\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"tailwind enabled\", () => {\n  const p = new TestNextJsProject();\n  const pkg = synthSnapshot(p);\n  expect(pkg[\"tailwind.config.json\"]).toBeDefined();\n  expect(pkg[\"postcss.config.json\"]).toBeDefined();\n});\n\nclass TestNextJsProject extends NextJsProject {\n  constructor(options: Partial<NextJsProjectOptions> = {}) {\n    super({\n      ...options,\n      clobber: false,\n      name: \"test-nextjs-project\",\n      defaultReleaseBranch: \"main\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/web/nextjs-ts-project.test.ts",
    "content": "import {\n  NextJsTypeScriptProject,\n  NextJsTypeScriptProjectOptions,\n} from \"../../src/web\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"defaults\", () => {\n  const p = new TestNextJsTypeScriptProject();\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"tailwind enabled\", () => {\n  const p = new TestNextJsTypeScriptProject();\n  const out = synthSnapshot(p);\n  expect(out[\"tailwind.config.json\"]).toBeDefined();\n  expect(out[\"postcss.config.json\"]).toBeDefined();\n});\n\ntest(\"CommonJS not ESnext\", () => {\n  const p = new TestNextJsTypeScriptProject();\n  const out = synthSnapshot(p);\n  expect(out[\"tsconfig.json\"]).toBeDefined();\n  expect(out[\"tsconfig.json\"].compilerOptions).toBeDefined();\n  expect(out[\"tsconfig.json\"].compilerOptions.module).toEqual(\"CommonJS\");\n});\n\nclass TestNextJsTypeScriptProject extends NextJsTypeScriptProject {\n  constructor(options: Partial<NextJsTypeScriptProjectOptions> = {}) {\n    super({\n      ...options,\n      clobber: false,\n      name: \"test-nextjs-project\",\n      defaultReleaseBranch: \"main\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/web/react-project.test.ts",
    "content": "import { ReactProject, ReactProjectOptions } from \"../../src/web\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"defaults\", () => {\n  const p = new TestReactProject();\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\ntest(\"rewire creates config-overrides.js\", () => {\n  const p = new TestReactProject({\n    rewire: {\n      \"module.prop1\": false,\n      \"module.prop2\": 5,\n      \"module.prop3\": [1, 2],\n      \"module.prop4\": { one: 2 },\n      \"module.prop5\": \"one\",\n    },\n  });\n  const snapshot = synthSnapshot(p)[\".projen/react-config-overrides.js\"];\n  expect(snapshot).toMatchSnapshot();\n});\n\ntest(\"rewire replaces react-scripts\", () => {\n  const p = new TestReactProject({\n    rewire: { \"module.prop1\": false },\n  });\n\n  function assertExec(taskName: string, script: string) {\n    const task = p.tasks.tryFind(taskName);\n    if (!task) {\n      throw new Error(`Task not found: ${taskName}`);\n    }\n    expect(task.steps[task.steps.length - 1].exec).toEqual(script);\n  }\n\n  assertExec(\"compile\", \"react-app-rewired build\");\n  assertExec(\"test\", \"react-app-rewired test --watchAll=false\");\n  assertExec(\"dev\", \"react-app-rewired start\");\n});\n\ntest(\"rewire add a dependency on react-app-rewired\", () => {\n  const p = new TestReactProject({\n    rewire: { \"module.prop1\": false },\n  });\n\n  expect(p.deps.getDependency(\"react-app-rewired\")).toBeDefined();\n});\n\nclass TestReactProject extends ReactProject {\n  constructor(options: Partial<ReactProjectOptions> = {}) {\n    super({\n      ...options,\n      clobber: false,\n      name: \"test-nextjs-project\",\n      defaultReleaseBranch: \"main\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/web/react-ts-project.test.ts",
    "content": "import {\n  ReactTypeScriptProject,\n  ReactTypeScriptProjectOptions,\n} from \"../../src/web\";\nimport { synthSnapshot } from \"../util\";\n\ntest(\"defaults\", () => {\n  const p = new TestReactTypeScriptProject();\n  expect(synthSnapshot(p)).toMatchSnapshot();\n});\n\n// see https://github.com/projen/projen/issues/1342\ntest(\"deps can be overridden\", () => {\n  const p = new TestReactTypeScriptProject();\n\n  p.deps.removeDependency(\"react\");\n  p.deps.removeDependency(\"react-dom\");\n  p.deps.removeDependency(\"react-scripts\");\n  p.deps.removeDependency(\"web-vitals\");\n  p.addDevDeps(\n    \"react@^2\",\n    \"react-dom@^4\",\n    \"react-scripts@1.2.3\",\n    \"web-vitals@7.2\"\n  );\n\n  const pkg = synthSnapshot(p)[\"package.json\"];\n\n  expect(pkg.dependencies).toBeUndefined();\n  expect(pkg.devDependencies.react).toStrictEqual(\"^2\");\n  expect(pkg.devDependencies[\"react-dom\"]).toStrictEqual(\"^4\");\n  expect(pkg.devDependencies[\"react-scripts\"]).toStrictEqual(\"1.2.3\");\n  expect(pkg.devDependencies[\"web-vitals\"]).toStrictEqual(\"7.2\");\n});\n\ntest(\"eslint configured to support test cases\", () => {\n  const p = new TestReactTypeScriptProject();\n\n  const rules = synthSnapshot(p)[\".eslintrc.json\"].rules;\n  expect(rules).toMatchObject({\n    \"import/no-extraneous-dependencies\": [\n      \"error\",\n      expect.objectContaining({\n        devDependencies: expect.arrayContaining([\n          \"**/src/**/*.test.tsx\",\n          \"**/src/setupTests.ts\",\n        ]),\n      }),\n    ],\n  });\n});\n\ntest(\"CommonJS not ESnext\", () => {\n  const p = new TestReactTypeScriptProject();\n  const out = synthSnapshot(p);\n  expect(out[\"tsconfig.json\"]).toBeDefined();\n  expect(out[\"tsconfig.json\"].compilerOptions).toBeDefined();\n  expect(out[\"tsconfig.json\"].compilerOptions.module).toEqual(\"commonjs\");\n});\n\nclass TestReactTypeScriptProject extends ReactTypeScriptProject {\n  constructor(options: Partial<ReactTypeScriptProjectOptions> = {}) {\n    super({\n      ...options,\n      clobber: false,\n      name: \"test-nextjs-project\",\n      defaultReleaseBranch: \"main\",\n    });\n  }\n}\n"
  },
  {
    "path": "test/xml.test.ts",
    "content": "import { XmlFile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"simple use\", () => {\n  // WHEN\n  const project = new TestProject();\n\n  const file = new XmlFile(project, \"pom.xml\", {\n    obj: {\n      project: {\n        modelVersion: \"4.0.0\",\n        groupId: \"com.myorg\",\n        artifactId: \"play-202101050157\",\n        version: \"0.1\",\n      },\n    },\n  });\n\n  file.addOverride(\"project.properties\", {\n    \"project.build.sourceEncoding\": \"UTF-8\",\n  });\n\n  // THEN\n  expect(synthSnapshot(project)[\"pom.xml\"]).toMatchSnapshot();\n});\n"
  },
  {
    "path": "test/yaml.test.ts",
    "content": "import * as YAML from \"yaml\";\nimport { YamlFile } from \"../src\";\nimport { synthSnapshot, TestProject } from \"./util\";\n\ntest(\"yaml object can be mutated before synthesis\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {\n    hello: \"world\",\n  };\n\n  new YamlFile(prj, \"my/yaml/file.yaml\", { obj });\n\n  // mutate obj (should be reflected in the output)\n  obj.anotherField = {\n    foo: 1234,\n  };\n\n  expect(YAML.parse(synthSnapshot(prj)[\"my/yaml/file.yaml\"])).toStrictEqual({\n    hello: \"world\",\n    anotherField: { foo: 1234 },\n  });\n});\n\ntest(\"yaml file can contain projen marker\", () => {\n  const prj = new TestProject();\n\n  const obj: any = {};\n\n  const file = new YamlFile(prj, \"my/yaml/file-marker.yaml\", {\n    obj,\n    marker: true,\n  });\n\n  const output = synthSnapshot(prj)[\"my/yaml/file-marker.yaml\"];\n\n  const firstLine = output.split(\"\\n\")[0];\n\n  expect(firstLine).toBe(`# ${file.marker}`);\n});\n"
  },
  {
    "path": "tsconfig.dev.json",
    "content": "{\n  \"compilerOptions\": {\n    \"alwaysStrict\": true,\n    \"declaration\": true,\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"inlineSourceMap\": true,\n    \"inlineSources\": true,\n    \"lib\": [\n      \"es2019\"\n    ],\n    \"module\": \"CommonJS\",\n    \"noEmitOnError\": false,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noImplicitAny\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"resolveJsonModule\": true,\n    \"strict\": true,\n    \"strictNullChecks\": true,\n    \"strictPropertyInitialization\": true,\n    \"stripInternal\": true,\n    \"target\": \"ES2019\"\n  },\n  \"include\": [\n    \".projenrc.js\",\n    \"src/**/*.ts\",\n    \"test/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ],\n  \"//\": \"~~ Generated by projen. To modify, edit .projenrc.js and run \\\"npx projen\\\".\"\n}\n"
  },
  {
    "path": "version.json",
    "content": "{\n  \"version\": \"0.17.52\"\n}\n"
  }
]