Merge branch 'master' into feature/gtag
This commit is contained in:
commit
859c90708b
6
.github/workflows/main.yml
vendored
6
.github/workflows/main.yml
vendored
@ -2,16 +2,16 @@ name: Cypress Integration Tests
|
|||||||
on: [push]
|
on: [push]
|
||||||
jobs:
|
jobs:
|
||||||
cypress-run:
|
cypress-run:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-16.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v1
|
uses: actions/checkout@v1
|
||||||
|
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@v1
|
uses: cypress-io/github-action@v2
|
||||||
with:
|
with:
|
||||||
working-directory: packages/portal
|
working-directory: packages/portal
|
||||||
browser: chrome
|
browser: chrome
|
||||||
build: yarn run build
|
build: yarn run build
|
||||||
start: yarn start
|
start: yarn start
|
||||||
wait-on: 'http://localhost:3000'
|
wait-on: "http://localhost:3000"
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -36,4 +36,4 @@ pages/App.css
|
|||||||
packages/portal/node_modules
|
packages/portal/node_modules
|
||||||
packages/create-portal-app/node_modules
|
packages/create-portal-app/node_modules
|
||||||
packages/portal/.next
|
packages/portal/.next
|
||||||
packages/portal/.env
|
packages/portal/.env
|
||||||
|
|||||||
@ -3,5 +3,8 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"lerna": "^3.22.1"
|
"lerna": "^3.22.1"
|
||||||
}
|
},
|
||||||
|
"workspaces":[
|
||||||
|
"packages/**"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
1
packages/create-portal-app/.gitignore
vendored
Normal file
1
packages/create-portal-app/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
7
packages/create-portal-app/.prettierrc
Normal file
7
packages/create-portal-app/.prettierrc
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"tabWidth": 2,
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"printWidth": 79
|
||||||
|
}
|
||||||
36
packages/create-portal-app/README.md
Normal file
36
packages/create-portal-app/README.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# Create Portal App
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<img src="resources/create-portal-app.gif">
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
This is a friendly way to start using `portal.js`. Using this CLI helps you to set up fast and easly one portal.js with the default template.
|
||||||
|
The CLI automatically create the project folder, install main dependencies, generate a new git repository and change package name.
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Yarn (> 1.22.10) or Npm (> 6.14.5)
|
||||||
|
- Git
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
To create a new portal.js application you can send the project name as first argument.
|
||||||
|
```
|
||||||
|
create-portal-app my-app
|
||||||
|
```
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
## Options
|
||||||
|
`create-portal-app` comes with options:
|
||||||
|
|
||||||
|
- **--use-npm** - This option allows to use npm instead yarn as default package manager
|
||||||
|
|
||||||
|
|
||||||
23
packages/create-portal-app/helpers/copy.js
Normal file
23
packages/create-portal-app/helpers/copy.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
const path = require('path')
|
||||||
|
const fs = require('fs')
|
||||||
|
const spawn = require('cross-spawn')
|
||||||
|
|
||||||
|
function parserPath(projectPath) {
|
||||||
|
return [process.cwd(), projectPath].join(path.sep)
|
||||||
|
}
|
||||||
|
|
||||||
|
function copy(root, destination) {
|
||||||
|
const destinationPath = parserPath(destination)
|
||||||
|
return spawn.sync('cp', ['-r', root, destinationPath])
|
||||||
|
}
|
||||||
|
|
||||||
|
function isPathInUse(projectPath) {
|
||||||
|
const fullPath = parserPath(projectPath)
|
||||||
|
const isPathExists = fs.existsSync(fullPath)
|
||||||
|
if (isPathExists) {
|
||||||
|
return fs.readdirSync(fullPath).length
|
||||||
|
}
|
||||||
|
return isPathExists
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { parserPath, copy, isPathInUse }
|
||||||
0
packages/create-portal-app/helpers/examples.js
Normal file
0
packages/create-portal-app/helpers/examples.js
Normal file
52
packages/create-portal-app/helpers/install.js
Normal file
52
packages/create-portal-app/helpers/install.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
const spawn = require('cross-spawn')
|
||||||
|
const path = require('path')
|
||||||
|
const execSync = require('child_process').execSync
|
||||||
|
const semver = require('semver')
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} projectName Project name to be created
|
||||||
|
* @param {Boolean} isYarn Check if will be installed under yarn or NPM
|
||||||
|
*/
|
||||||
|
function install(projectName, isYarn) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const appPath = [process.cwd(), projectName].join(path.sep)
|
||||||
|
//change the directory to the app directory
|
||||||
|
process.chdir(appPath)
|
||||||
|
|
||||||
|
const command = isYarn ? 'yarn' : 'npm'
|
||||||
|
const args = isYarn ? [''] : ['install']
|
||||||
|
const exec = spawn(command, args, {
|
||||||
|
stdio: 'pipe',
|
||||||
|
env: { ...process.env, ADBLOCK: '1', DISABLE_OPENCOLLECTIVE: '1' },
|
||||||
|
})
|
||||||
|
|
||||||
|
exec.on('close', (code) => {
|
||||||
|
if (code !== 0) {
|
||||||
|
reject({ command: `${command} ${args[0]}` })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to initialize git repo on the new project
|
||||||
|
*/
|
||||||
|
async function initGit() {
|
||||||
|
spawn(`git`, [`init`, `-q`])
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check the version for npm and Yarn
|
||||||
|
* @param {String} pname
|
||||||
|
* @returns Boolean
|
||||||
|
*/
|
||||||
|
function checkPackageVersion(pname) {
|
||||||
|
let userVersion = execSync(`${pname} --version`).toString()
|
||||||
|
let expectedVersion = pname === 'yarn' ? '1.22.10' : '6.14.5'
|
||||||
|
return !semver.lt(userVersion, expectedVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { install, initGit, checkPackageVersion }
|
||||||
18
packages/create-portal-app/helpers/replace.js
Normal file
18
packages/create-portal-app/helpers/replace.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const fs = require('fs')
|
||||||
|
const { parserPath } = require('./copy')
|
||||||
|
|
||||||
|
function _replacePackage(projectName) {
|
||||||
|
const appPath = parserPath(projectName)
|
||||||
|
const packagePath = `${appPath}/package.json`
|
||||||
|
const data = JSON.parse(fs.readFileSync(packagePath, 'utf8'))
|
||||||
|
data.name = projectName
|
||||||
|
delete data.homepage
|
||||||
|
|
||||||
|
fs.writeFileSync(packagePath, JSON.stringify(data, null, 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
function replaceContent(projectName) {
|
||||||
|
_replacePackage(projectName)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = replaceContent
|
||||||
163
packages/create-portal-app/index.js
Executable file
163
packages/create-portal-app/index.js
Executable file
@ -0,0 +1,163 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const Listr = require('listr')
|
||||||
|
const { program } = require('commander')
|
||||||
|
const chalk = require('chalk')
|
||||||
|
const prompts = require('prompts')
|
||||||
|
const path = require('path')
|
||||||
|
const figlet = require('figlet')
|
||||||
|
const package = require('./package.json')
|
||||||
|
const { copy, isPathInUse } = require('./helpers/copy')
|
||||||
|
const { install, initGit, checkPackageVersion } = require('./helpers/install')
|
||||||
|
const replace = require('./helpers/replace')
|
||||||
|
|
||||||
|
// Output path to create new portal app
|
||||||
|
let projectPath = ''
|
||||||
|
|
||||||
|
// Commander parameters to specify CLI behavior
|
||||||
|
program
|
||||||
|
.name(package.name)
|
||||||
|
.version(package.version)
|
||||||
|
.arguments('[dir]')
|
||||||
|
.usage(`${chalk.yellow('[dir]')}`)
|
||||||
|
.description({
|
||||||
|
dir: 'Directory to be used on install Portal.js',
|
||||||
|
})
|
||||||
|
.action((name) => (projectPath = name))
|
||||||
|
.option('--use-npm', 'Install dependencies using npm instead yarn')
|
||||||
|
.parse(process.argv)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to ask a custon name if was not passed as parameter
|
||||||
|
* returns the value passed from terminal input
|
||||||
|
*/
|
||||||
|
async function promptPath() {
|
||||||
|
return prompts({
|
||||||
|
type: 'text',
|
||||||
|
name: 'path',
|
||||||
|
message: 'Choose a name to your project',
|
||||||
|
initial: '',
|
||||||
|
validate: (name) => {
|
||||||
|
projectPath = name
|
||||||
|
if (isPathInUse(projectPath)) {
|
||||||
|
return `${chalk.yellow(
|
||||||
|
'Path ' +
|
||||||
|
chalk.redBright(projectPath) +
|
||||||
|
' is already in use and is not empty.'
|
||||||
|
)}`
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main method to start CLI and validate inputs
|
||||||
|
*/
|
||||||
|
async function run() {
|
||||||
|
|
||||||
|
if(checkPackageVersion(program.useNpm? 'npm' : 'yarn')) {
|
||||||
|
console.log()
|
||||||
|
console.log(`${chalk.yellowBright('Your package manager version is outdated, please update before continue.')}`)
|
||||||
|
console.log()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof projectPath === 'string') {
|
||||||
|
projectPath = projectPath.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!projectPath) {
|
||||||
|
const response = await promptPath()
|
||||||
|
if (typeof response.path === 'string') {
|
||||||
|
projectPath = response.path.trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!projectPath) {
|
||||||
|
//TODO separate log methods
|
||||||
|
console.log()
|
||||||
|
console.log('Please choose a name to your project:')
|
||||||
|
console.log()
|
||||||
|
console.log('Example:')
|
||||||
|
console.log(
|
||||||
|
`${chalk.cyan(program.name())} ${chalk.yellow('ny-portal-app')}`
|
||||||
|
)
|
||||||
|
console.log()
|
||||||
|
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const root = path.join(__dirname + '/../portal')
|
||||||
|
|
||||||
|
if (isPathInUse(projectPath)) {
|
||||||
|
console.log()
|
||||||
|
console.log(
|
||||||
|
`${chalk.yellow(
|
||||||
|
'Path ' +
|
||||||
|
chalk.redBright(projectPath) +
|
||||||
|
' is already in use and is not empty.'
|
||||||
|
)}`
|
||||||
|
)
|
||||||
|
console.log()
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// print a fancy Portal.js in the terminal
|
||||||
|
console.log(
|
||||||
|
chalk.yellow(figlet.textSync('Portal.Js', { horizontalLayout: 'full' }))
|
||||||
|
)
|
||||||
|
|
||||||
|
console.log()
|
||||||
|
console.log(`Creating new portal.js app in ${chalk.cyan(projectPath)}`)
|
||||||
|
console.log()
|
||||||
|
|
||||||
|
//Tasks workflow
|
||||||
|
const tasks = new Listr([
|
||||||
|
{
|
||||||
|
title: 'Fetching Content',
|
||||||
|
task: () => copy(root, projectPath),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Updating Content',
|
||||||
|
task: () => replace(projectPath),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Installing Dependencies',
|
||||||
|
task: () => install(projectPath, program.useNpm),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Git Init',
|
||||||
|
task: () => initGit(projectPath),
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
tasks.run().then(() => {
|
||||||
|
console.log()
|
||||||
|
console.log(`${chalk.greenBright('Instalation Completed Successfully')}`)
|
||||||
|
console.log()
|
||||||
|
console.log(
|
||||||
|
`Run ${chalk.cyan('cd ' + projectPath)} and ${chalk.green(program.useNpm ? 'npm run dev' : 'yarn dev')}`
|
||||||
|
)
|
||||||
|
console.log()
|
||||||
|
console.log('Enjoy =)')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//Main CLI execution workflow
|
||||||
|
run().catch((error) => {
|
||||||
|
console.log(error.name)
|
||||||
|
if (error.install) {
|
||||||
|
console.log()
|
||||||
|
console.log(
|
||||||
|
`${chalk.redBright('Error on Create App :')}${chalk.yellow(
|
||||||
|
error.message.toString()
|
||||||
|
)}`
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
console.log(`${chalk.red('Unexpected Error. Please report it as a bug')}`)
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
console.log()
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
1971
packages/create-portal-app/package-lock.json
generated
Normal file
1971
packages/create-portal-app/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
27
packages/create-portal-app/package.json
Normal file
27
packages/create-portal-app/package.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "create-portal-app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Create Portal App CLI",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"chalk": "^4.1.0",
|
||||||
|
"commander": "^6.2.0",
|
||||||
|
"cpy": "^8.1.1",
|
||||||
|
"cross-spawn": "^7.0.3",
|
||||||
|
"figlet": "^1.5.0",
|
||||||
|
"listr": "^0.14.3",
|
||||||
|
"ora": "^5.1.0",
|
||||||
|
"prompts": "^2.4.0"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"bin"
|
||||||
|
],
|
||||||
|
"bin": {
|
||||||
|
"create-portal-app": "index.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
packages/create-portal-app/resources/create-portal-app.gif
Normal file
BIN
packages/create-portal-app/resources/create-portal-app.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
14
packages/create-portal-app/templates/package.json
Normal file
14
packages/create-portal-app/templates/package.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "Datahub",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Create Portal App CLI",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"chalk": "^4.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
packages/portal/.gitignore
vendored
Normal file
2
packages/portal/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
.next/
|
||||||
@ -1,7 +1,9 @@
|
|||||||
<h1 style="text-align: center;">
|
<h1 align="center">
|
||||||
PORTAL.js
|
|
||||||
|
🌀 Portal.JS<br/>
|
||||||
The javascript framework for<br/>
|
The javascript framework for<br/>
|
||||||
data portals
|
data portals
|
||||||
|
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
🌀 `Portal` is a framework for rapidly building rich data portal frontends using a modern frontend approach (javascript, React, SSR).
|
🌀 `Portal` is a framework for rapidly building rich data portal frontends using a modern frontend approach (javascript, React, SSR).
|
||||||
|
|||||||
@ -11,12 +11,12 @@ describe('Test Home Page', () => {
|
|||||||
cy.get('form').contains('Search');
|
cy.get('form').contains('Search');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('submits the search form', () => {
|
// it('submits the search form', () => {
|
||||||
cy.get('form').find('[type="text"]').type('my-dataset');
|
// cy.get('form').find('[type="text"]').type('gdp');
|
||||||
cy.get('form').submit();
|
// cy.get('form').submit();
|
||||||
cy.url().should('include', '/search?q=my-dataset&sort=');
|
// cy.url().should('include', '/search?q=gdp&sort=');
|
||||||
cy.get('.text-3xl').and('contain.text', 'results found');
|
// cy.get('.text-3xl').and('contain.text', '1 results found');
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('shows the recent datasets', () => {
|
it('shows the recent datasets', () => {
|
||||||
cy.contains('Recent Datasets');
|
cy.contains('Recent Datasets');
|
||||||
|
|||||||
@ -8,11 +8,14 @@ describe('Test Search Page', () => {
|
|||||||
cy.contains('Search');
|
cy.contains('Search');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return a search result', () => {
|
// it('should return a search result', () => {
|
||||||
cy.get('form').find('[type="text"]').type('world population');
|
// cy.get('form').find('[type="text"]').type('gdp');
|
||||||
cy.get('form').submit();
|
// cy.get('form').submit();
|
||||||
cy.url().should('include', 'search?q=world%20population&sort=');
|
// cy.url().should('include', 'search?q=gdp&sort=');
|
||||||
cy.get('.text-3xl').should('have.text', '1 results found');
|
// cy.get('.text-3xl').should('have.text', '1 results found');
|
||||||
cy.get('.text-xl > .text-primary').should('have.text', 'World Population');
|
// cy.get('.text-xl > .text-primary').should(
|
||||||
});
|
// 'have.text',
|
||||||
|
// 'Country, Regional and World GDP (Gross Domestic Product)'
|
||||||
|
// );
|
||||||
|
// });
|
||||||
});
|
});
|
||||||
|
|||||||
@ -38,14 +38,10 @@ export const GET_RESOURCES_QUERY = gql`
|
|||||||
name
|
name
|
||||||
resources {
|
resources {
|
||||||
name
|
name
|
||||||
id
|
|
||||||
title
|
title
|
||||||
description
|
|
||||||
format
|
format
|
||||||
size
|
|
||||||
created
|
created
|
||||||
last_modified
|
last_modified
|
||||||
url
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user