Skip to content

Commit

Permalink
new package initialization
Browse files Browse the repository at this point in the history
  • Loading branch information
teintinu committed Jul 25, 2021
1 parent 86588e6 commit 28ac3a9
Show file tree
Hide file tree
Showing 7 changed files with 187 additions and 58 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ snapshot/**/stdout
snapshot/**/yarn-lock

dist/

examples/new/a
examples/new/b
15 changes: 15 additions & 0 deletions examples/new/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# monoclean
node_modules
.nvm.rc
package.json
package-lock.json
yarn-lock.*
yarn.lock
tsconfig.**
jest.config.js
tmp
out
.eslintrc.json
coverage
.vscode/extensions.json

18 changes: 18 additions & 0 deletions examples/new/monoclean.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
workspace:
name: "new"
version: "1.0.0"
dependencies:
"@types/node": 14.14.31
react: 17.0.1
"@types/react": 17.0.2

packages:
"@new/a":
public: true
folder: "a"
dependencies:
"@new/b": "*"

"@new/b":
public: true
folder: "b"
9 changes: 7 additions & 2 deletions examples/simple-workspace/.gitignore
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
# monoclean
node_modules
.nvm.rc
package.json
package-lock.json
yarn-lock.*
tsconfig.*
yarn.lock
tsconfig.**
jest.config.js
tmp
out
.eslintrc.js
.eslintrc.json
coverage
.vscode/extensions.json

21 changes: 13 additions & 8 deletions internal/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,17 @@ type Dependency struct {
}

type Package struct {
Name string
Version string
Folder string
Public bool
Description string
Index string
Dependencies map[string]*Dependency
Executables map[string]*Executable
Name string
Version string
Folder string
Public bool
usesNode bool
usesDOM bool
usesWebWorker bool
Description string
Index string
Dependencies map[string]*Dependency
Executables map[string]*Executable
}

type TsConfig struct {
Expand Down Expand Up @@ -146,6 +149,8 @@ func LoadRepository(searchDir string) (*Repository, error) {
Name: dependencyName,
Version: dependencyVersion,
}
pkg.usesDOM = dependencyName == "react-dom"
pkg.usesNode = dependencyName == "@types/node"
}
}
repo.Packages[packageName] = pkg
Expand Down
162 changes: 114 additions & 48 deletions internal/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package internal
import (
"errors"
"io/ioutil"
"os"
"path"
"path/filepath"
)
Expand All @@ -16,6 +17,9 @@ func ConfigureRepository(repo *Repository) error {
if err := configureGitIgnore(repo); err != nil {
return err
}
if err := configureVsCodeRecommendedExtensions(repo); err != nil {
return err
}
if err := configureNvmRc(repo); err != nil {
return err
}
Expand Down Expand Up @@ -56,7 +60,10 @@ func ConfigureRepository(repo *Repository) error {
"postinstall": "patch-package",
}
}
addDependenciesToPackageJSON(metadata, repo.Dependencies)
for dependencyName, dependency := range repo.Dependencies {
metadata.Dependencies[dependencyName] = dependency.Version
}

return WritePackageJSON(metadata, repo.RootDir)
}

Expand All @@ -65,20 +72,41 @@ func configureGitIgnore(repo *Repository) error {
gitignore := path.Join(repo.RootDir, ".gitignore")
var content = `# monoclean
node_modules
.nvm.rc
package.json
package-lock.json
yarn-lock.*
tsconfig.*
yarn.lock
tsconfig.**
jest.config.js
tmp
out
.eslintrc.js
.eslintrc.json
coverage
.vscode/extensions.json
`

err := ioutil.WriteFile(gitignore, []byte(content), 0644)
return err
}

func configureVsCodeRecommendedExtensions(repo *Repository) error {
var vscodeDir = path.Join(repo.RootDir, ".vscode")
if err := os.MkdirAll(vscodeDir, 0755); err != nil {
return err
}
var extensionsJson = path.Join(vscodeDir, "extensions.json")
var content = `{
"recommendations": [
"dbaeumer.vscode-eslint"
]
}
`
err := ioutil.WriteFile(extensionsJson, []byte(content), 0644)
return err
}

func configureNvmRc(repo *Repository) error {

npmRc := path.Join(repo.RootDir, ".nvm.rc")
Expand Down Expand Up @@ -161,11 +189,18 @@ func configurePkg(repo *Repository, pkg *Package) error {
"postinstall": "patch-package",
},
}
addDependenciesToPackageJSON(metadata, pkg.Dependencies)

for dependencyName, dependency := range pkg.Dependencies {
metadata.Dependencies[dependencyName] = dependency.Version
}

err := WritePackageJSON(metadata, repo.RootDir+"/"+pkg.Folder)
if err == nil {
err = configurePkgTsConfigReferences(repo, pkg)
}
if err == nil {
err = initializeEmptySources(repo, pkg)
}
return err
}

Expand All @@ -191,34 +226,65 @@ func configurePkgTsConfigReferences(repo *Repository, pkg *Package) error {
if dependency.Version != "*" {
return errors.New("package dependencies is supported only inside workspace")
}
if dependency.Name == "DOM" {
meta.CompilerOptions.Lib = append(meta.CompilerOptions.Lib, "DOM")
} else {
var depPkg = repo.Packages[dependency.Name]
if depPkg == nil {
return errors.New("package not found " + dependency.Name)
}
relativePathToDep, err := filepath.Rel(pkg.Folder, depPkg.Folder)
if err != nil {
return err
}
var depPkg = repo.Packages[dependency.Name]
if depPkg == nil {
return errors.New("package not found " + dependency.Name)
}
relativePathToDep, err := filepath.Rel(pkg.Folder, depPkg.Folder)
if err != nil {
return err
}

ref := TsConfigReferenceMetadata{
Path: relativePathToDep,
}
meta.References = append(meta.References, ref)
meta.CompilerOptions.Paths[dependency.Name] = []string{relativePathToDep + "/src"}
ref := TsConfigReferenceMetadata{
Path: relativePathToDep,
}
meta.References = append(meta.References, ref)
meta.CompilerOptions.Paths[dependency.Name] = []string{relativePathToDep + "/src"}
if depPkg.usesDOM {
meta.CompilerOptions.Lib = append(meta.CompilerOptions.Lib, "DOM")
}
if depPkg.usesWebWorker {
meta.CompilerOptions.Lib = append(meta.CompilerOptions.Lib, "WebWorker")
}
}
return WriteTsConfigJSON(meta, path.Join(repo.RootDir, pkg.Folder, "tsconfig.json"))
}

func addDependenciesToPackageJSON(metadata PackageMetadata, dependencies map[string]*Dependency) {
for dependencyName, dependency := range dependencies {
if dependencyName != "DOM" {
metadata.Dependencies[dependencyName] = dependency.Version
}
func initializeEmptySources(repo *Repository, pkg *Package) error {
sourceDir := path.Join(repo.RootDir, pkg.Folder, "src")
indexTs := path.Join(sourceDir, "index.ts")

_, err := os.Stat(indexTs)
if err == nil {
return nil
}

err = os.MkdirAll(sourceDir, 0755)
if err == nil {
err = createIndexTs(indexTs)
}
if err == nil {
err = createIndexTestTs(path.Join(sourceDir, "index.test.ts"))
}
return err
}

func createIndexTs(indexTs string) error {
const content = `export function doSomething() {
return 'something';
}
`
return ioutil.WriteFile(indexTs, []byte(content), 0644)
}

func createIndexTestTs(indexTestTs string) error {
const content = `import {doSomething} from "./index"
it('test something' , () => {
expect('anything').toEqual(doSomething())
})
`
return ioutil.WriteFile(indexTestTs, []byte(content), 0644)
}

func configureJest(repo *Repository) error {
Expand Down Expand Up @@ -262,39 +328,39 @@ module.exports = {
}

func configureEsLint(repo *Repository) error {
const content = `module.exports = {
env: {
browser: true,
es2021: true,
node: true,
jest: true
const content = `{
"env": {
"browser": true,
"es2021": true,
"node": true,
"jest": true
},
extends: [
'plugin:react/recommended',
'standard'
"extends": [
"plugin:react/recommended",
"standard"
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
ecmaVersion: 12,
sourceType: 'module'
"ecmaVersion": 12,
"sourceType": "module"
},
plugins: [
'react',
'@typescript-eslint'
"plugins": [
"react",
"@typescript-eslint"
],
rules: {
"rules": {
},
settings: {
react: {
version: 'detect'
"settings": {
"react": {
"version": "detect"
}
}
}
`
eslintrc := path.Join(repo.RootDir, ".eslintrc.js")
eslintrc := path.Join(repo.RootDir, ".eslintrc.json")
err := ioutil.WriteFile(eslintrc, []byte(content), 0644)
return err
}
17 changes: 17 additions & 0 deletions snapshot/new/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#!/usr/bin/env bash

set -euo pipefail

DIR=$(realpath `dirname $0`/../..)

cd $DIR/examples/new

bash "$NVM_DIR/nvm.sh" use
monoclean deps
monoclean clean

set +e

monoclean lint
monoclean test
echo "exit code expected=0 actual=$?"

0 comments on commit 28ac3a9

Please sign in to comment.