create-stylus 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/.github/issue_template.md +7 -0
  2. package/.github/pull_request_template.md +11 -0
  3. package/.github/workflows/release-alpha.yml +32 -0
  4. package/.github/workflows/release-manual.yml +26 -0
  5. package/.yarnrc.yml +1 -0
  6. package/CONTRIBUTING.md +42 -0
  7. package/README.md +66 -0
  8. package/bin/create-dapp-ss.js +4 -0
  9. package/package.json +46 -0
  10. package/rollup.config.js +22 -0
  11. package/src/cli.ts +14 -0
  12. package/src/extensions.json +14 -0
  13. package/src/main.ts +72 -0
  14. package/src/tasks/copy-extension-file.ts +227 -0
  15. package/src/tasks/copy-template-files.ts +252 -0
  16. package/src/tasks/create-first-git-commit.ts +35 -0
  17. package/src/tasks/create-project-directory.ts +34 -0
  18. package/src/tasks/index.ts +5 -0
  19. package/src/tasks/install-packages.ts +15 -0
  20. package/src/tasks/prettier-format.ts +17 -0
  21. package/src/types.ts +31 -0
  22. package/src/utils/consts.ts +1 -0
  23. package/src/utils/find-files-recursively.ts +19 -0
  24. package/src/utils/link.ts +44 -0
  25. package/src/utils/load-extensions.ts +10 -0
  26. package/src/utils/merge-package-json.ts +33 -0
  27. package/src/utils/parse-arguments-into-options.ts +38 -0
  28. package/src/utils/prompt-for-missing-options.ts +53 -0
  29. package/src/utils/render-intro-message.ts +11 -0
  30. package/src/utils/render-outro-message.ts +34 -0
  31. package/templates/base/.github/ISSUE_TEMPLATE/bug_report.yml +58 -0
  32. package/templates/base/.github/ISSUE_TEMPLATE/config.yml +8 -0
  33. package/templates/base/.github/pull_request_template.md +16 -0
  34. package/templates/base/.github/workflows/lint.yaml +300 -0
  35. package/templates/base/.gitignore.template.mjs +19 -0
  36. package/templates/base/.gitmodules +0 -0
  37. package/templates/base/.husky/pre-commit +4 -0
  38. package/templates/base/.lintstagedrc.js +21 -0
  39. package/templates/base/.vscode/settings.json +7 -0
  40. package/templates/base/.yarn/plugins/@yarnpkg/plugin-typescript.cjs +9 -0
  41. package/templates/base/.yarn/releases/yarn-3.2.3.cjs +783 -0
  42. package/templates/base/.yarnrc.yml +11 -0
  43. package/templates/base/CONTRIBUTING.md +86 -0
  44. package/templates/base/LICENCE +21 -0
  45. package/templates/base/dist/cli.js +683 -0
  46. package/templates/base/dist/cli.js.map +1 -0
  47. package/templates/base/nitro-devnode/LICENSE +201 -0
  48. package/templates/base/nitro-devnode/README.md +70 -0
  49. package/templates/base/nitro-devnode/run-dev-node.sh +132 -0
  50. package/templates/base/nitro-devnode/start-chain-with-cors.sh +150 -0
  51. package/templates/base/nitro-devnode/stylus-deployer-bytecode.txt +1 -0
  52. package/templates/base/nitro-devnode/stylus-dev/Dockerfile +10 -0
  53. package/templates/base/package.json +44 -0
  54. package/templates/base/packages/nextjs/.env.example +13 -0
  55. package/templates/base/packages/nextjs/.eslintignore +11 -0
  56. package/templates/base/packages/nextjs/.eslintrc.json +15 -0
  57. package/templates/base/packages/nextjs/.gitignore.template.mjs +42 -0
  58. package/templates/base/packages/nextjs/.prettierrc.js +9 -0
  59. package/templates/base/packages/nextjs/.prettierrc.json +8 -0
  60. package/templates/base/packages/nextjs/app/blockexplorer/_components/AddressCodeTab.tsx +27 -0
  61. package/templates/base/packages/nextjs/app/blockexplorer/_components/AddressComponent.tsx +36 -0
  62. package/templates/base/packages/nextjs/app/blockexplorer/_components/AddressLogsTab.tsx +21 -0
  63. package/templates/base/packages/nextjs/app/blockexplorer/_components/AddressStorageTab.tsx +61 -0
  64. package/templates/base/packages/nextjs/app/blockexplorer/_components/BackButton.tsx +12 -0
  65. package/templates/base/packages/nextjs/app/blockexplorer/_components/ContractTabs.tsx +102 -0
  66. package/templates/base/packages/nextjs/app/blockexplorer/_components/PaginationButton.tsx +39 -0
  67. package/templates/base/packages/nextjs/app/blockexplorer/_components/SearchBar.tsx +49 -0
  68. package/templates/base/packages/nextjs/app/blockexplorer/_components/TransactionHash.tsx +28 -0
  69. package/templates/base/packages/nextjs/app/blockexplorer/_components/TransactionsTable.tsx +71 -0
  70. package/templates/base/packages/nextjs/app/blockexplorer/_components/index.tsx +7 -0
  71. package/templates/base/packages/nextjs/app/blockexplorer/address/[address]/page.tsx +101 -0
  72. package/templates/base/packages/nextjs/app/blockexplorer/layout.tsx +12 -0
  73. package/templates/base/packages/nextjs/app/blockexplorer/page.tsx +83 -0
  74. package/templates/base/packages/nextjs/app/blockexplorer/transaction/[txHash]/page.tsx +23 -0
  75. package/templates/base/packages/nextjs/app/blockexplorer/transaction/_components/TransactionComp.tsx +152 -0
  76. package/templates/base/packages/nextjs/app/debug/_components/DebugContracts.tsx +73 -0
  77. package/templates/base/packages/nextjs/app/debug/_components/contract/ContractInput.tsx +84 -0
  78. package/templates/base/packages/nextjs/app/debug/_components/contract/ContractReadMethods.tsx +43 -0
  79. package/templates/base/packages/nextjs/app/debug/_components/contract/ContractUI.tsx +164 -0
  80. package/templates/base/packages/nextjs/app/debug/_components/contract/ContractVariables.tsx +50 -0
  81. package/templates/base/packages/nextjs/app/debug/_components/contract/ContractWriteMethods.tsx +49 -0
  82. package/templates/base/packages/nextjs/app/debug/_components/contract/DisplayVariable.tsx +85 -0
  83. package/templates/base/packages/nextjs/app/debug/_components/contract/InheritanceTooltip.tsx +14 -0
  84. package/templates/base/packages/nextjs/app/debug/_components/contract/ReadOnlyFunctionForm.tsx +102 -0
  85. package/templates/base/packages/nextjs/app/debug/_components/contract/Tuple.tsx +44 -0
  86. package/templates/base/packages/nextjs/app/debug/_components/contract/TupleArray.tsx +142 -0
  87. package/templates/base/packages/nextjs/app/debug/_components/contract/TxReceipt.tsx +42 -0
  88. package/templates/base/packages/nextjs/app/debug/_components/contract/WriteOnlyFunctionForm.tsx +144 -0
  89. package/templates/base/packages/nextjs/app/debug/_components/contract/index.tsx +8 -0
  90. package/templates/base/packages/nextjs/app/debug/_components/contract/utilsContract.tsx +166 -0
  91. package/templates/base/packages/nextjs/app/debug/_components/contract/utilsDisplay.tsx +114 -0
  92. package/templates/base/packages/nextjs/app/debug/page.tsx +14 -0
  93. package/templates/base/packages/nextjs/app/layout.tsx +67 -0
  94. package/templates/base/packages/nextjs/app/not-found.tsx +16 -0
  95. package/templates/base/packages/nextjs/app/page.tsx +94 -0
  96. package/templates/base/packages/nextjs/components/Background.tsx +37 -0
  97. package/templates/base/packages/nextjs/components/Card.tsx +40 -0
  98. package/templates/base/packages/nextjs/components/Footer.tsx +93 -0
  99. package/templates/base/packages/nextjs/components/Header.tsx +114 -0
  100. package/templates/base/packages/nextjs/components/ScaffoldEthAppWithProviders.tsx +77 -0
  101. package/templates/base/packages/nextjs/components/SwitchTheme.tsx +41 -0
  102. package/templates/base/packages/nextjs/components/ThemeProvider.tsx +13 -0
  103. package/templates/base/packages/nextjs/components/assets/BuidlGuidlLogo.tsx +18 -0
  104. package/templates/base/packages/nextjs/components/scaffold-eth/Address/Address.tsx +187 -0
  105. package/templates/base/packages/nextjs/components/scaffold-eth/Address/AddressCopyIcon.tsx +23 -0
  106. package/templates/base/packages/nextjs/components/scaffold-eth/Address/AddressLinkWrapper.tsx +29 -0
  107. package/templates/base/packages/nextjs/components/scaffold-eth/Balance.tsx +75 -0
  108. package/templates/base/packages/nextjs/components/scaffold-eth/BlockieAvatar.tsx +17 -0
  109. package/templates/base/packages/nextjs/components/scaffold-eth/Faucet.tsx +131 -0
  110. package/templates/base/packages/nextjs/components/scaffold-eth/FaucetButton.tsx +75 -0
  111. package/templates/base/packages/nextjs/components/scaffold-eth/Input/AddressInput.tsx +120 -0
  112. package/templates/base/packages/nextjs/components/scaffold-eth/Input/Bytes32Input.tsx +31 -0
  113. package/templates/base/packages/nextjs/components/scaffold-eth/Input/BytesInput.tsx +28 -0
  114. package/templates/base/packages/nextjs/components/scaffold-eth/Input/EtherInput.tsx +128 -0
  115. package/templates/base/packages/nextjs/components/scaffold-eth/Input/InputBase.tsx +66 -0
  116. package/templates/base/packages/nextjs/components/scaffold-eth/Input/IntegerInput.tsx +63 -0
  117. package/templates/base/packages/nextjs/components/scaffold-eth/Input/index.ts +9 -0
  118. package/templates/base/packages/nextjs/components/scaffold-eth/Input/utils.ts +109 -0
  119. package/templates/base/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressInfoDropdown.tsx +121 -0
  120. package/templates/base/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/AddressQRCodeModal.tsx +33 -0
  121. package/templates/base/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/BurnerWalletModal.tsx +63 -0
  122. package/templates/base/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/NetworkOptions.tsx +48 -0
  123. package/templates/base/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/WrongNetworkDropdown.tsx +32 -0
  124. package/templates/base/packages/nextjs/components/scaffold-eth/RainbowKitCustomConnectButton/index.tsx +89 -0
  125. package/templates/base/packages/nextjs/components/scaffold-eth/index.tsx +7 -0
  126. package/templates/base/packages/nextjs/contracts/deployedContracts.ts +9 -0
  127. package/templates/base/packages/nextjs/contracts/externalContracts.ts +16 -0
  128. package/templates/base/packages/nextjs/eslint.config.mjs +32 -0
  129. package/templates/base/packages/nextjs/hooks/scaffold-eth/index.ts +17 -0
  130. package/templates/base/packages/nextjs/hooks/scaffold-eth/useAnimationConfig.ts +20 -0
  131. package/templates/base/packages/nextjs/hooks/scaffold-eth/useContractLogs.ts +40 -0
  132. package/templates/base/packages/nextjs/hooks/scaffold-eth/useCopyToClipboard.ts +19 -0
  133. package/templates/base/packages/nextjs/hooks/scaffold-eth/useDeployedContractInfo.ts +86 -0
  134. package/templates/base/packages/nextjs/hooks/scaffold-eth/useDisplayUsdMode.ts +21 -0
  135. package/templates/base/packages/nextjs/hooks/scaffold-eth/useFetchBlocks.ts +133 -0
  136. package/templates/base/packages/nextjs/hooks/scaffold-eth/useInitializeNativeCurrencyPrice.ts +32 -0
  137. package/templates/base/packages/nextjs/hooks/scaffold-eth/useNativeCurrencyPrice.ts +34 -0
  138. package/templates/base/packages/nextjs/hooks/scaffold-eth/useNetworkColor.ts +22 -0
  139. package/templates/base/packages/nextjs/hooks/scaffold-eth/useOutsideClick.ts +23 -0
  140. package/templates/base/packages/nextjs/hooks/scaffold-eth/useScaffoldContract.ts +65 -0
  141. package/templates/base/packages/nextjs/hooks/scaffold-eth/useScaffoldEventHistory.ts +213 -0
  142. package/templates/base/packages/nextjs/hooks/scaffold-eth/useScaffoldReadContract.ts +80 -0
  143. package/templates/base/packages/nextjs/hooks/scaffold-eth/useScaffoldWatchContractEvent.ts +40 -0
  144. package/templates/base/packages/nextjs/hooks/scaffold-eth/useScaffoldWriteContract.ts +191 -0
  145. package/templates/base/packages/nextjs/hooks/scaffold-eth/useSelectedNetwork.ts +18 -0
  146. package/templates/base/packages/nextjs/hooks/scaffold-eth/useTargetNetwork.ts +23 -0
  147. package/templates/base/packages/nextjs/hooks/scaffold-eth/useTransactor.tsx +114 -0
  148. package/templates/base/packages/nextjs/hooks/scaffold-eth/useWatchBalance.ts +21 -0
  149. package/templates/base/packages/nextjs/icons/CompassIcon.tsx +39 -0
  150. package/templates/base/packages/nextjs/icons/DarkBugAntIcon.tsx +30 -0
  151. package/templates/base/packages/nextjs/icons/LightBugAntIcon.tsx +52 -0
  152. package/templates/base/packages/nextjs/next-env.d.ts +5 -0
  153. package/templates/base/packages/nextjs/next.config.js +19 -0
  154. package/templates/base/packages/nextjs/package.json +58 -0
  155. package/templates/base/packages/nextjs/postcss.config.js +6 -0
  156. package/templates/base/packages/nextjs/public/debug-image.png +0 -0
  157. package/templates/base/packages/nextjs/public/favicon.png +0 -0
  158. package/templates/base/packages/nextjs/public/logo.svg +8 -0
  159. package/templates/base/packages/nextjs/public/manifest.json +5 -0
  160. package/templates/base/packages/nextjs/public/thumbnail.jpg +0 -0
  161. package/templates/base/packages/nextjs/react-copy-to-clipboard.d.ts +44 -0
  162. package/templates/base/packages/nextjs/scaffold.config.ts +56 -0
  163. package/templates/base/packages/nextjs/services/store/store.ts +39 -0
  164. package/templates/base/packages/nextjs/services/web3/wagmiConfig.tsx +44 -0
  165. package/templates/base/packages/nextjs/services/web3/wagmiConnectors.tsx +51 -0
  166. package/templates/base/packages/nextjs/styles/globals.css +80 -0
  167. package/templates/base/packages/nextjs/tailwind.config.js +97 -0
  168. package/templates/base/packages/nextjs/tsconfig.json +28 -0
  169. package/templates/base/packages/nextjs/types/abitype/abi.d.ts +16 -0
  170. package/templates/base/packages/nextjs/types/utils.ts +3 -0
  171. package/templates/base/packages/nextjs/utils/scaffold-eth/block.ts +17 -0
  172. package/templates/base/packages/nextjs/utils/scaffold-eth/common.ts +8 -0
  173. package/templates/base/packages/nextjs/utils/scaffold-eth/contract.ts +352 -0
  174. package/templates/base/packages/nextjs/utils/scaffold-eth/contractsData.ts +11 -0
  175. package/templates/base/packages/nextjs/utils/scaffold-eth/decodeTxData.ts +65 -0
  176. package/templates/base/packages/nextjs/utils/scaffold-eth/fetchPriceFromUniswap.ts +72 -0
  177. package/templates/base/packages/nextjs/utils/scaffold-eth/getMetadata.ts +50 -0
  178. package/templates/base/packages/nextjs/utils/scaffold-eth/getParsedError.ts +35 -0
  179. package/templates/base/packages/nextjs/utils/scaffold-eth/index.ts +6 -0
  180. package/templates/base/packages/nextjs/utils/scaffold-eth/notification.tsx +90 -0
  181. package/templates/base/packages/nextjs/utils/scaffold-stylus/burner.ts +59 -0
  182. package/templates/base/packages/nextjs/utils/scaffold-stylus/chain.ts +42 -0
  183. package/templates/base/packages/nextjs/utils/scaffold-stylus/index.ts +3 -0
  184. package/templates/base/packages/nextjs/utils/scaffold-stylus/networks.ts +94 -0
  185. package/templates/base/packages/nextjs/vercel.json +3 -0
  186. package/templates/base/packages/stylus/.env.example +16 -0
  187. package/templates/base/packages/stylus/.eslintrc.js +23 -0
  188. package/templates/base/packages/stylus/.gitignore.template.mjs +7 -0
  189. package/templates/base/packages/stylus/jest.config.js +15 -0
  190. package/templates/base/packages/stylus/package.json +48 -0
  191. package/templates/base/packages/stylus/scripts/deploy.ts +46 -0
  192. package/templates/base/packages/stylus/scripts/deploy_contract.ts +84 -0
  193. package/templates/base/packages/stylus/scripts/deploy_wrapper.ts +39 -0
  194. package/templates/base/packages/stylus/scripts/export_abi.ts +87 -0
  195. package/templates/base/packages/stylus/scripts/index.ts +0 -0
  196. package/templates/base/packages/stylus/scripts/new_module.sh +35 -0
  197. package/templates/base/packages/stylus/scripts/test_network.ts +31 -0
  198. package/templates/base/packages/stylus/scripts/utils/command.ts +152 -0
  199. package/templates/base/packages/stylus/scripts/utils/contract.ts +228 -0
  200. package/templates/base/packages/stylus/scripts/utils/deployment.ts +260 -0
  201. package/templates/base/packages/stylus/scripts/utils/index.ts +6 -0
  202. package/templates/base/packages/stylus/scripts/utils/network.ts +132 -0
  203. package/templates/base/packages/stylus/scripts/utils/type.ts +51 -0
  204. package/templates/base/packages/stylus/scripts/utils.ts +3 -0
  205. package/templates/base/packages/stylus/tsconfig.json +41 -0
  206. package/templates/base/packages/stylus/your-contract/.cargo/config.toml +18 -0
  207. package/templates/base/packages/stylus/your-contract/Cargo.lock +5761 -0
  208. package/templates/base/packages/stylus/your-contract/Cargo.toml +48 -0
  209. package/templates/base/packages/stylus/your-contract/examples/counter.rs +78 -0
  210. package/templates/base/packages/stylus/your-contract/header.png +0 -0
  211. package/templates/base/packages/stylus/your-contract/licenses/Apache-2.0 +201 -0
  212. package/templates/base/packages/stylus/your-contract/licenses/COPYRIGHT.md +5 -0
  213. package/templates/base/packages/stylus/your-contract/licenses/DCO.txt +34 -0
  214. package/templates/base/packages/stylus/your-contract/licenses/MIT +21 -0
  215. package/templates/base/packages/stylus/your-contract/rust-toolchain.toml +2 -0
  216. package/templates/base/packages/stylus/your-contract/src/lib.rs +241 -0
  217. package/templates/base/packages/stylus/your-contract/src/main.rs +10 -0
  218. package/templates/base/readme.md +352 -0
  219. package/templates/base/yarn.lock +17859 -0
  220. package/tsconfig.json +13 -0
@@ -0,0 +1,7 @@
1
+ ## Issue Overview
2
+
3
+ Provide a brief summary of the issue, including the motivation for addressing it, the problems it presents, and any features required to resolve it.
4
+
5
+ ## Proposed Solutions or Ideas
6
+
7
+ Outline your proposed solution or share any ideas you have for discussing or resolving the issue.
@@ -0,0 +1,11 @@
1
+ # Task name here
2
+
3
+ Fixes #relevant-issue-here
4
+
5
+ ## Types of change
6
+
7
+ - [ ] Feature
8
+ - [ ] Bug
9
+ - [ ] Enhancement
10
+
11
+ ## Comments (optional)
@@ -0,0 +1,32 @@
1
+ name: Publish Alpha
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ jobs:
7
+ publish-alpha:
8
+ runs-on: ubuntu-22.04
9
+
10
+ steps:
11
+ - name: Checkout
12
+ uses: actions/checkout@v4
13
+ with:
14
+ ref: main
15
+
16
+ - name: Set up Node.js
17
+ uses: actions/setup-node@v3
18
+ with:
19
+ node-version: "22"
20
+ registry-url: "https://registry.npmjs.org/"
21
+
22
+ - name: Bump alpha version
23
+ run: |
24
+ git config --global user.name 'github-actions[bot]'
25
+ git config --global user.email 'github-actions[bot]@users.noreply.github.com'
26
+ npm version prerelease --preid=alpha
27
+
28
+ - name: Publish alpha
29
+ run: |
30
+ npm install && npm run build && npm publish --tag alpha
31
+ env:
32
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,26 @@
1
+ name: Publish Latest Manual
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ jobs:
7
+ publish-alpha:
8
+ runs-on: ubuntu-22.04
9
+
10
+ steps:
11
+ - name: Checkout
12
+ uses: actions/checkout@v4
13
+ with:
14
+ ref: main
15
+
16
+ - name: Set up Node.js
17
+ uses: actions/setup-node@v3
18
+ with:
19
+ node-version: "22"
20
+ registry-url: "https://registry.npmjs.org/"
21
+
22
+ - name: Publish alpha
23
+ run: |
24
+ npm install && npm run build && npm publish --tag latest
25
+ env:
26
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/.yarnrc.yml ADDED
@@ -0,0 +1 @@
1
+ nodeLinker: node-modules
@@ -0,0 +1,42 @@
1
+ # Contributing to Scaffold-Stylus (`create-stylus`)
2
+
3
+ > `create-stylus` is part of the Scaffold-Stylus toolkit
4
+
5
+ Thank you for your interest in contributing to Scaffold-Stylus! Your support enhances this Arbitrum-focused framework that bridges smart contract integration with web applications.
6
+
7
+ ## About the Project
8
+
9
+ **Scaffold-Stylus** provides a full DApp development template, offering seamless integration of Stylus smart contracts with web applications. **SpeedrunStylus.com** offers interactive challenges that serve to practice your Rust with Stylus and Arbitrum skills, learn how to use the provided hooks, and launch your applications swiftly with potential rewards.
10
+
11
+ ## Project Vision
12
+
13
+ Our goal is to simplify the DApp development and learning process, enabling developers to launch applications efficiently while understanding the intricacies of Arbitrum.
14
+
15
+ ## How to Get Involved
16
+
17
+ 1. **Understand the Code**: Begin by familiarizing yourself with the architecture and flow by reading through the documentation provided in the README.md.
18
+ 2. **Check Issues and Discussions**: Look through existing issues and discussions to understand ongoing problems or feature requests.
19
+ 3. **Start Contributing**:
20
+ - **Fix Issues**: Choose an existing issue and work towards a solution.
21
+ - **Enhance Documentation**: Improve instructions, examples, or explanations.
22
+ - **Develop New Features**: Contribute new features that align with our project's goals.
23
+
24
+ ## Making Changes
25
+
26
+ - **Branch Out**: Always work in a separate branch to avoid conflicts.
27
+ - **Coding Standards**: Follow the coding conventions and maintain the code quality as described in our documentation.
28
+ - **Commit Messages**: Write clear, concise commit messages that describe your changes and their impact.
29
+
30
+ ## Submitting Contributions
31
+
32
+ 1. **Pull Requests**: Submit a PR to the main repository with a detailed description of your changes.
33
+ 2. **Review Process**: Engage with any feedback from maintainers to refine your PR.
34
+ 3. **Tests**: Ensure all tests pass and, if necessary, add new tests relevant to your changes.
35
+
36
+ ## Documentation
37
+
38
+ If your changes involve updates to how users interact with Scaffold-Stylus or SpeedrunStylus, update the relevant sections of the documentation to reflect these changes.
39
+
40
+ ## Need Help?
41
+
42
+ Reach out via our community channels if you encounter issues or need clarification on contributing [here](https://t.me/+wO3PtlRAreo4MDI9).
package/README.md ADDED
@@ -0,0 +1,66 @@
1
+ > ⚠️ Under active development.
2
+
3
+ # 🏗 create-stylus
4
+
5
+ CLI to create decentralized applications (dapps) using Scaffold-Stylus.
6
+
7
+ This is an alternative method of installing Scaffold-Stylus. Instead of directly [cloning SS](https://github.com/Arb-Stylus/scaffold-stylus?tab=readme-ov-file#quickstart), you can use create-stylus to create your own custom instance, where you can choose among several configurations and extensions.
8
+
9
+ <h4 align="center">
10
+ <a href="https://github.com/Arb-Stylus/scaffold-stylus">SS Repo</a> |
11
+ <a href="https://arb-stylus.github.io/scaffold-stylus-docs/">SS Docs</a> |
12
+ <a href="https://www.scaffoldstylus.com/">SS Website</a>
13
+ </h4>
14
+
15
+ ## Requirements
16
+
17
+ Before you begin, you need to install the following tools:
18
+
19
+ - [Node (>= v18.17)](https://nodejs.org/en/download/)
20
+ - Yarn ([v1](https://classic.yarnpkg.com/en/docs/install/) or [v2+](https://yarnpkg.com/getting-started/install))
21
+ - [Git](https://git-scm.com/downloads)
22
+
23
+ ## Quickstart
24
+
25
+ To get started building Create-Stylus, follow the steps below:
26
+
27
+ 1. Install dependencies.
28
+
29
+ ```
30
+ yarn install
31
+ ```
32
+
33
+ 2. Build Create-Stylus:
34
+
35
+ ```
36
+ yarn build
37
+ ```
38
+
39
+ 3. Test Create-Stylus:
40
+
41
+ ```
42
+ yarn cli [...options]
43
+ ```
44
+
45
+ ## Extensions
46
+
47
+ Now you can choose from some preset extensions to ship your dApp faster! You can embed the Erc 20 indexer during the Scaffold-Stylus creation by running the following commands:
48
+
49
+ ```bash
50
+ npx create-stylus@latest --extension erc-20
51
+ ```
52
+
53
+ ## Documentation
54
+
55
+ Visit our [docs](https://arb-stylus.github.io/scaffold-stylus-docs/) to learn how to start building with Scaffold-Stylus.
56
+
57
+ To know more about its features, check out our [website](https://www.scaffoldstylus.com/).
58
+
59
+ ## Contributing to create-stylus
60
+
61
+ We welcome contributions to create-stylus and Scaffold-Stylus!
62
+
63
+ For more information and guidelines for contributing, please see:
64
+
65
+ - [create-stylus CONTRIBUTING.MD](https://github.com/Arb-Stylus/create-stylus/blob/main/CONTRIBUTING.md) if you want to contribute to the CLI.
66
+ - [Scaffold-Stylus CONTRIBUTING.MD](https://github.com/Arb-Stylus/scaffold-stylus/blob/main/CONTRIBUTING.md) if you want to contribute to SS base code.
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { cli } from "../dist/cli.js";
3
+
4
+ cli(process.argv);
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "create-stylus",
3
+ "version": "0.0.5",
4
+ "author": "Q3 Labs",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/Arb-Stylus/create-stylus.git"
9
+ },
10
+ "type": "module",
11
+ "main": "dist/cli.js",
12
+ "bin": "bin/create-dapp-ss.js",
13
+ "scripts": {
14
+ "build": "rollup -c rollup.config.js",
15
+ "dev": "rollup -c rollup.config.js --watch",
16
+ "cli": "node bin/create-dapp-ss.js",
17
+ "test": "echo \"Error: no test specified\" && exit 1",
18
+ "changeset:release": "yarn build && changeset publish"
19
+ },
20
+ "devDependencies": {
21
+ "@rollup/plugin-json": "^6.1.0",
22
+ "@rollup/plugin-node-resolve": "16.0.1",
23
+ "@rollup/plugin-typescript": "12.1.2",
24
+ "@types/inquirer": "9.0.7",
25
+ "@types/listr": "0.14.9",
26
+ "@types/ncp": "2.0.8",
27
+ "@types/node": "22.14.0",
28
+ "rollup": "4.39.0",
29
+ "rollup-plugin-auto-external": "2.0.0",
30
+ "tslib": "2.8.1",
31
+ "typescript": "5.8.3"
32
+ },
33
+ "dependencies": {
34
+ "@changesets/cli": "^2.28.1",
35
+ "arg": "5.0.2",
36
+ "chalk": "5.4.1",
37
+ "execa": "9.5.2",
38
+ "handlebars": "^4.7.8",
39
+ "inquirer": "9.2.0",
40
+ "listr": "0.14.3",
41
+ "merge-packages": "^0.1.6",
42
+ "ncp": "2.0.0",
43
+ "pkg-install": "1.0.0"
44
+ },
45
+ "packageManager": "yarn@3.5.0"
46
+ }
@@ -0,0 +1,22 @@
1
+ import typescript from "@rollup/plugin-typescript";
2
+ import autoExternal from "rollup-plugin-auto-external";
3
+ import nodeResolve from "@rollup/plugin-node-resolve";
4
+ import json from "@rollup/plugin-json";
5
+
6
+ export default {
7
+ input: "src/cli.ts",
8
+ output: {
9
+ dir: "dist",
10
+ format: "es",
11
+ sourcemap: true,
12
+ },
13
+ plugins: [
14
+ json(),
15
+ nodeResolve(),
16
+ autoExternal(),
17
+ typescript({
18
+ include: ["src/**/*.ts"],
19
+ exclude: ["templates/**"]
20
+ })
21
+ ],
22
+ };
package/src/cli.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { createProject } from "./main";
2
+ import { parseArgumentsIntoOptions } from "./utils/parse-arguments-into-options";
3
+ import { promptForMissingOptions } from "./utils/prompt-for-missing-options";
4
+ import { renderIntroMessage } from "./utils/render-intro-message";
5
+ import type { Args } from "./types";
6
+
7
+ export async function cli(args: Args) {
8
+ renderIntroMessage();
9
+
10
+ const rawOptions = parseArgumentsIntoOptions(args);
11
+ const options = await promptForMissingOptions(rawOptions);
12
+
13
+ await createProject(options);
14
+ }
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "extensionFlagValue": "erc-20",
4
+ "description": "Adds support for ERC-20 token contracts, including balance checks and token transfers.",
5
+ "repository": "https://github.com/Arb-Stylus/create-stylus-extensions",
6
+ "branch": "erc-20"
7
+ },
8
+ {
9
+ "extensionFlagValue": "erc-721",
10
+ "description": "Adds support for ERC-721 NFT contracts, including supply, balance, listing, and transfer features.",
11
+ "repository": "https://github.com/Arb-Stylus/create-stylus-extensions",
12
+ "branch": "erc-721"
13
+ }
14
+ ]
package/src/main.ts ADDED
@@ -0,0 +1,72 @@
1
+ import {
2
+ copyTemplateFiles,
3
+ createProjectDirectory,
4
+ installPackages,
5
+ createFirstGitCommit,
6
+ prettierFormat,
7
+ } from "./tasks";
8
+ import type { Options } from "./types";
9
+ import { renderOutroMessage } from "./utils/render-outro-message";
10
+ import chalk from "chalk";
11
+ import Listr from "listr";
12
+ import path from "path";
13
+ import { fileURLToPath } from "url";
14
+
15
+ export async function createProject(options: Options) {
16
+ console.log(`\n`);
17
+
18
+ const currentFileUrl = import.meta.url;
19
+
20
+ const templateDirectory = path.resolve(
21
+ decodeURI(fileURLToPath(currentFileUrl)),
22
+ "../../templates",
23
+ );
24
+
25
+ const targetDirectory = path.resolve(process.cwd(), options.directory);
26
+
27
+ const tasks = new Listr([
28
+ {
29
+ title: `📁 Create project directory ${targetDirectory}`,
30
+ task: () => createProjectDirectory(options.directory),
31
+ },
32
+ {
33
+ title: `🚀 Creating a new Scaffold-Stylus 2 app${
34
+ options.extension
35
+ ? ` with ${chalk.green.bold(options.extension)} extension`
36
+ : ""
37
+ } in ${chalk.green.bold(options.directory)}`,
38
+ task: () =>
39
+ copyTemplateFiles(options, templateDirectory, targetDirectory),
40
+ },
41
+ {
42
+ title: `📦 Installing dependencies with yarn, this could take a while`,
43
+ task: () => installPackages(targetDirectory, options),
44
+ skip: () => {
45
+ if (!options.install) {
46
+ return "Manually skipped";
47
+ }
48
+ },
49
+ },
50
+ {
51
+ title: "🪄 Formatting Next.js files with prettier",
52
+ task: () => prettierFormat(targetDirectory),
53
+ skip: () => {
54
+ if (!options.install) {
55
+ return "Skipping because prettier install was skipped";
56
+ }
57
+ },
58
+ },
59
+ {
60
+ title: `📡 Initializing Git repository`,
61
+ task: () => createFirstGitCommit(targetDirectory),
62
+ },
63
+ ]);
64
+
65
+ try {
66
+ await tasks.run();
67
+ renderOutroMessage(options);
68
+ } catch (error) {
69
+ console.log("%s Error occurred", chalk.red.bold("ERROR"), error);
70
+ console.log("%s Exiting...", chalk.red.bold("Uh oh! 😕 Sorry about that!"));
71
+ }
72
+ }
@@ -0,0 +1,227 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { execa } from "execa";
4
+ import { findExtensionByFlag } from "../utils/load-extensions";
5
+ import type { Extension } from "../types";
6
+
7
+ export async function copyExtensionFile(extensionName: string, targetDirectory: string) {
8
+
9
+ if (!extensionName || extensionName.trim() === "") {
10
+ return;
11
+ }
12
+
13
+ const extensionConfig = findExtensionByFlag(extensionName);
14
+
15
+ if (!extensionConfig) {
16
+ return;
17
+ }
18
+
19
+ const targetPackagesDir = path.join(targetDirectory, "packages");
20
+
21
+ if (!fs.existsSync(targetPackagesDir)) {
22
+ return;
23
+ }
24
+
25
+ try {
26
+ const tempDir = path.join(targetDirectory, ".temp-extension");
27
+ fs.mkdirSync(tempDir, { recursive: true });
28
+
29
+ await cloneExtensionRepository(extensionConfig, tempDir);
30
+
31
+ await copyExtensionFiles(tempDir, targetPackagesDir, extensionConfig.extensionFlagValue);
32
+
33
+ await mergePackageJsonFiles(tempDir, targetPackagesDir, extensionConfig.extensionFlagValue);
34
+
35
+ await mergeRootPackageJson(tempDir, targetDirectory, extensionConfig.extensionFlagValue);
36
+
37
+ fs.rmSync(tempDir, { recursive: true, force: true });
38
+
39
+ } catch (error) {
40
+ throw error;
41
+ }
42
+ }
43
+
44
+ async function cloneExtensionRepository(extension: Extension, tempDir: string) {
45
+ try {
46
+ const { stdout, stderr } = await execa("git", [
47
+ "clone",
48
+ "--branch", extension.branch,
49
+ "--single-branch",
50
+ "--depth", "1",
51
+ extension.repository,
52
+ tempDir
53
+ ]);
54
+
55
+ } catch (error) {
56
+ throw error;
57
+ }
58
+ }
59
+
60
+ async function copyExtensionFiles(tempDir: string, targetPackagesDir: string, extensionName: string) {
61
+ let extensionPackageDir = path.join(tempDir, "packages", extensionName);
62
+
63
+ if (!fs.existsSync(extensionPackageDir)) {
64
+ extensionPackageDir = path.join(tempDir, "extensions", "packages", extensionName);
65
+ }
66
+
67
+ if (fs.existsSync(extensionPackageDir)) {
68
+ const targetExtensionDir = path.join(targetPackagesDir, extensionName);
69
+ copyDirectoryRecursive(extensionPackageDir, targetExtensionDir);
70
+ }
71
+
72
+ let extensionPackagesDir = path.join(tempDir, "packages");
73
+
74
+ if (!fs.existsSync(extensionPackagesDir)) {
75
+ extensionPackagesDir = path.join(tempDir, "extensions", "packages");
76
+ }
77
+
78
+ if (fs.existsSync(extensionPackagesDir)) {
79
+ const packages = fs.readdirSync(extensionPackagesDir);
80
+
81
+ for (const packageName of packages) {
82
+ if (packageName === extensionName) {
83
+ continue;
84
+ }
85
+
86
+ const sourcePackageDir = path.join(extensionPackagesDir, packageName);
87
+ const targetPackageDir = path.join(targetPackagesDir, packageName);
88
+
89
+ if (fs.existsSync(targetPackageDir)) {
90
+ mergeDirectoryRecursive(sourcePackageDir, targetPackageDir);
91
+ } else {
92
+ copyDirectoryRecursive(sourcePackageDir, targetPackageDir);
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ async function mergePackageJsonFiles(tempDir: string, targetPackagesDir: string, extensionName: string) {
99
+ let extensionPackagesDir = path.join(tempDir, "packages");
100
+
101
+ if (!fs.existsSync(extensionPackagesDir)) {
102
+ extensionPackagesDir = path.join(tempDir, "extensions", "packages");
103
+ }
104
+
105
+ if (!fs.existsSync(extensionPackagesDir)) {
106
+ return;
107
+ }
108
+
109
+ const packages = fs.readdirSync(extensionPackagesDir);
110
+
111
+ for (const packageName of packages) {
112
+ const sourcePackageDir = path.join(extensionPackagesDir, packageName);
113
+ const targetPackageDir = path.join(targetPackagesDir, packageName);
114
+
115
+ if (fs.existsSync(targetPackageDir)) {
116
+ const sourcePackageJsonPath = path.join(sourcePackageDir, "package.json");
117
+ const targetPackageJsonPath = path.join(targetPackageDir, "package.json");
118
+
119
+ if (fs.existsSync(sourcePackageJsonPath) && fs.existsSync(targetPackageJsonPath)) {
120
+ mergePackageJson(sourcePackageJsonPath, targetPackageJsonPath);
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ async function mergeRootPackageJson(tempDir: string, targetDirectory: string, extensionName: string) {
127
+ let extensionRootPackageJsonPath = path.join(tempDir, "package.json");
128
+
129
+ if (!fs.existsSync(extensionRootPackageJsonPath)) {
130
+ extensionRootPackageJsonPath = path.join(tempDir, "extensions", "package.json");
131
+ }
132
+
133
+ if (!fs.existsSync(extensionRootPackageJsonPath)) {
134
+ return;
135
+ }
136
+
137
+ const targetRootPackageJsonPath = path.join(targetDirectory, "package.json");
138
+
139
+ if (fs.existsSync(targetRootPackageJsonPath)) {
140
+ mergePackageJson(extensionRootPackageJsonPath, targetRootPackageJsonPath);
141
+ addPackageToWorkspaces(targetRootPackageJsonPath, extensionName);
142
+ }
143
+ }
144
+
145
+ function mergePackageJson(sourcePath: string, targetPath: string) {
146
+ try {
147
+ const sourcePackageJson = JSON.parse(fs.readFileSync(sourcePath, 'utf8'));
148
+ const targetPackageJson = JSON.parse(fs.readFileSync(targetPath, 'utf8'));
149
+
150
+ if (sourcePackageJson.scripts && targetPackageJson.scripts) {
151
+ targetPackageJson.scripts = { ...targetPackageJson.scripts, ...sourcePackageJson.scripts };
152
+ }
153
+
154
+ if (sourcePackageJson.dependencies && targetPackageJson.dependencies) {
155
+ targetPackageJson.dependencies = { ...targetPackageJson.dependencies, ...sourcePackageJson.dependencies };
156
+ }
157
+
158
+ if (sourcePackageJson.devDependencies && targetPackageJson.devDependencies) {
159
+ targetPackageJson.devDependencies = { ...targetPackageJson.devDependencies, ...sourcePackageJson.devDependencies };
160
+ }
161
+
162
+ if (sourcePackageJson.peerDependencies && targetPackageJson.peerDependencies) {
163
+ targetPackageJson.peerDependencies = { ...targetPackageJson.peerDependencies, ...sourcePackageJson.peerDependencies };
164
+ }
165
+
166
+ fs.writeFileSync(targetPath, JSON.stringify(targetPackageJson, null, 2));
167
+
168
+ } catch (error) {
169
+ // Error handling without logging
170
+ }
171
+ }
172
+
173
+ function addPackageToWorkspaces(packageJsonPath: string, packageName: string) {
174
+ try {
175
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
176
+
177
+ if (packageJson.workspaces && packageJson.workspaces.packages) {
178
+ const workspacePath = `packages/${packageName}`;
179
+ if (!packageJson.workspaces.packages.includes(workspacePath)) {
180
+ packageJson.workspaces.packages.push(workspacePath);
181
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
182
+ }
183
+ }
184
+ } catch (error) {
185
+ // Error handling without logging
186
+ }
187
+ }
188
+
189
+ function copyDirectoryRecursive(source: string, destination: string) {
190
+ fs.mkdirSync(destination, { recursive: true });
191
+
192
+ const files = fs.readdirSync(source);
193
+
194
+ for (const file of files) {
195
+ const sourcePath = path.join(source, file);
196
+ const destPath = path.join(destination, file);
197
+
198
+ const stat = fs.statSync(sourcePath);
199
+
200
+ if (stat.isDirectory()) {
201
+ copyDirectoryRecursive(sourcePath, destPath);
202
+ } else {
203
+ fs.copyFileSync(sourcePath, destPath);
204
+ }
205
+ }
206
+ }
207
+
208
+ function mergeDirectoryRecursive(source: string, destination: string) {
209
+ if (!fs.existsSync(destination)) {
210
+ fs.mkdirSync(destination, { recursive: true });
211
+ }
212
+
213
+ const files = fs.readdirSync(source);
214
+
215
+ for (const file of files) {
216
+ const sourcePath = path.join(source, file);
217
+ const destPath = path.join(destination, file);
218
+
219
+ const stat = fs.statSync(sourcePath);
220
+
221
+ if (stat.isDirectory()) {
222
+ mergeDirectoryRecursive(sourcePath, destPath);
223
+ } else {
224
+ fs.copyFileSync(sourcePath, destPath);
225
+ }
226
+ }
227
+ }