-
Notifications
You must be signed in to change notification settings - Fork 60
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
deps: update outdated packages fix: do not check if log file exists before boot chore: update cli templates to reflect api changes
1 parent
4341f5c
commit 2512e85
Showing
44 changed files
with
562 additions
and
351 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,8 @@ | ||
export default async function test() { | ||
// @flow | ||
|
||
/** | ||
* @private | ||
*/ | ||
export default async function test(): Promise<void> { | ||
console.log('Coming Soon!'); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
/** | ||
* @private | ||
*/ | ||
export const VALID_DATABASES = [ | ||
'postgres', | ||
'sqlite', | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,21 @@ | ||
// @flow | ||
import { classify } from 'inflection'; | ||
|
||
export default (name) => { | ||
import template from '../../template'; | ||
|
||
/** | ||
* @private | ||
*/ | ||
export default (name: string): string => { | ||
name = classify(name.replace('-', '_')); | ||
|
||
return ` | ||
import Lux from 'lux-framework'; | ||
return template` | ||
import { Application } from 'lux-framework'; | ||
class ${name} extends Lux { | ||
class ${name} extends Application { | ||
} | ||
} | ||
export default ${name}; | ||
`.substr(1).trim(); | ||
export default ${name}; | ||
`; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,23 @@ | ||
export default (name) => { | ||
return ` | ||
{ | ||
"plugins": [ | ||
"transform-es2015-modules-commonjs", | ||
"transform-decorators-legacy", | ||
"transform-class-properties", | ||
"transform-es2015-classes", | ||
"transform-es2015-destructuring", | ||
"transform-es2015-parameters", | ||
"transform-es2015-spread", | ||
"transform-decorators", | ||
"syntax-trailing-function-commas", | ||
"transform-object-rest-spread", | ||
"transform-async-to-generator", | ||
"transform-exponentiation-operator" | ||
] | ||
} | ||
`.substr(1).trim(); | ||
}; | ||
// @flow | ||
import template from '../../template'; | ||
|
||
/** | ||
* @private | ||
*/ | ||
export default (): string => template` | ||
{ | ||
"plugins": [ | ||
"external-helpers-2", | ||
"syntax-trailing-function-commas", | ||
"transform-decorators-legacy", | ||
"transform-class-properties", | ||
"transform-decorators", | ||
"transform-es2015-destructuring", | ||
"transform-es2015-parameters", | ||
"transform-es2015-spread", | ||
"transform-object-rest-spread", | ||
"transform-async-to-generator", | ||
"transform-exponentiation-operator" | ||
] | ||
} | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,21 @@ | ||
export default (name, env) => { | ||
// @flow | ||
import template from '../../template'; | ||
|
||
/** | ||
* @private | ||
*/ | ||
export default (name: string, env: string): string => { | ||
const isProdENV = env === 'production'; | ||
let keyPrefix = `${name}`; | ||
|
||
if (!isProdENV) { | ||
keyPrefix += `::${env}`; | ||
} | ||
|
||
return ` | ||
export default { | ||
log: ${!isProdENV}, | ||
domain: 'http://localhost:4000' | ||
}; | ||
`.substr(1).trim(); | ||
return template` | ||
export default { | ||
log: ${!isProdENV}, | ||
domain: 'http://localhost:4000' | ||
}; | ||
`; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,15 @@ | ||
export default () => { | ||
return ` | ||
export function up(schema) { | ||
// @flow | ||
import template from '../../template'; | ||
|
||
} | ||
/** | ||
* @private | ||
*/ | ||
export default (): string => template` | ||
export function up(schema) { | ||
export function down(schema) { | ||
} | ||
} | ||
export function down(schema) { | ||
`.substr(1).trim(); | ||
}; | ||
} | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,19 @@ | ||
export default () => { | ||
return ` | ||
# See http://help.github.com/ignore-files/ for more about ignoring files. | ||
// @flow | ||
import template from '../../template'; | ||
|
||
# dependencies | ||
/node_modules | ||
/** | ||
* @private | ||
*/ | ||
export default (): string => template` | ||
# See http://help.github.com/ignore-files/ for more about ignoring files. | ||
# logs | ||
/log | ||
npm-debug.log | ||
# dependencies | ||
/node_modules | ||
# misc | ||
*.DS_Store | ||
`.substr(1).trim(); | ||
}; | ||
# logs | ||
/log | ||
npm-debug.log | ||
# misc | ||
*.DS_Store | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,29 @@ | ||
export default () => { | ||
return ` | ||
The MIT License (MIT) | ||
// @flow | ||
import template from '../../template'; | ||
|
||
Copyright (c) 2016 | ||
/** | ||
* @private | ||
*/ | ||
export default (): string => template` | ||
The MIT License (MIT) | ||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
Copyright (c) 2016 | ||
The above copyright notice and this permission notice shall be included in all | ||
copies or substantial portions of the Software. | ||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. | ||
`.substr(1).trim(); | ||
}; | ||
The above copyright notice and this permission notice shall be included in all | ||
copies or substantial portions of the Software. | ||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. | ||
`; |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,52 +1,68 @@ | ||
// @flow | ||
import { pluralize } from 'inflection'; | ||
|
||
import template from '../../template'; | ||
|
||
import indent from '../utils/indent'; | ||
import underscore from '../../../utils/underscore'; | ||
|
||
export default (name, attrs = []) => { | ||
/** | ||
* @private | ||
*/ | ||
export default (name: string, attrs: Array<string> | string): string => { | ||
const table = pluralize(underscore(name)); | ||
let indices = ['id']; | ||
|
||
attrs = attrs | ||
.filter(attr => /^(\w|-)+:(\w|-)+$/g.test(attr)) | ||
.map(attr => attr.split(':')) | ||
.filter(([, type]) => !/^has-(one|many)$/g.test(type)) | ||
.map(([column, type]) => { | ||
column = underscore(column); | ||
|
||
if (type === 'belongs-to') { | ||
type = 'integer'; | ||
column = `${column}_id`; | ||
|
||
indices.push(column); | ||
} | ||
|
||
return [column, type]; | ||
}) | ||
.map(([column, type], index) => { | ||
return (index ? '' : '\n') + indent(4) + `table.${type}('${column}');`; | ||
}) | ||
.join('\n'); | ||
|
||
indices.push('created_at', 'updated_at'); | ||
|
||
indices = '\n' + indices | ||
.map(column => indent(6) + `'${column}'`) | ||
.join(',\n') + '\n' + indent(4); | ||
|
||
return ` | ||
export function up(schema) { | ||
return schema.createTable('${table}', table => { | ||
table.increments('id');${attrs} | ||
table.timestamps(); | ||
table.index([${indices}]); | ||
}); | ||
} | ||
export function down(schema) { | ||
return schema.dropTable('${table}'); | ||
} | ||
`.substr(1).trim(); | ||
let indices: Array<string> | string = ['id']; | ||
|
||
if (!attrs) { | ||
attrs = []; | ||
} | ||
|
||
if (Array.isArray(attrs)) { | ||
attrs = attrs | ||
.filter(attr => /^(\w|-)+:(\w|-)+$/g.test(attr)) | ||
.map(attr => attr.split(':')) | ||
.filter(([, type]) => !/^has-(one|many)$/g.test(type)) | ||
.map(([column, type]) => { | ||
column = underscore(column); | ||
|
||
if (type === 'belongs-to') { | ||
type = 'integer'; | ||
column = `${column}_id`; | ||
|
||
if (Array.isArray(indices)) { | ||
indices.push(column); | ||
} | ||
} | ||
|
||
return [column, type]; | ||
}) | ||
.map(([column, type], index) => { | ||
return `${indent(index > 0 ? 8 : 0)}table.${type}('${column}');`; | ||
}) | ||
.join('\n'); | ||
} | ||
|
||
if (Array.isArray(indices)) { | ||
indices.push('created_at', 'updated_at'); | ||
|
||
indices = '\n' + indices | ||
.map(column => indent(10) + `'${column}'`) | ||
.join(',\n') + '\n' + indent(8); | ||
} | ||
|
||
return template` | ||
export function up(schema) { | ||
return schema.createTable('${table}', table => { | ||
table.increments('id'); | ||
${attrs} | ||
table.timestamps(); | ||
table.index([${indices}]); | ||
}); | ||
} | ||
export function down(schema) { | ||
return schema.dropTable('${table}'); | ||
} | ||
`; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,39 @@ | ||
import { version as VERSION } from '../../../../package.json'; | ||
// @flow | ||
import { version } from '../../../../package.json'; | ||
|
||
export default (name) => { | ||
return ` | ||
{ | ||
"name": "${name}", | ||
"version": "0.0.1", | ||
"description": "", | ||
"main": "bin/app.js", | ||
"scripts": { | ||
"start": "lux serve", | ||
"test": "lux test" | ||
}, | ||
"author": "", | ||
"license": "MIT", | ||
"dependencies": { | ||
"babel-core": "6.9.0", | ||
"babel-eslint": "6.0.4", | ||
"babel-plugin-transform-decorators-legacy": "1.3.4", | ||
"babel-plugin-transform-runtime": "6.9.0", | ||
"babel-preset-es2015": "6.9.0", | ||
"babel-preset-stage-1": "6.5.0", | ||
"babel-runtime": "6.9.0", | ||
"knex": "0.11.4", | ||
"lux-framework": "${VERSION}" | ||
import template from '../../template'; | ||
|
||
const VERSION: string = version; | ||
|
||
/** | ||
* @private | ||
*/ | ||
export default (name: string): string => template` | ||
{ | ||
"name": "${name}", | ||
"version": "0.0.1", | ||
"description": "", | ||
"scripts": { | ||
"start": "lux serve", | ||
"test": "lux test" | ||
}, | ||
"author": "", | ||
"license": "MIT", | ||
"dependencies": { | ||
"babel-core": "6.9.1", | ||
"babel-plugin-external-helpers-2": "6.3.13", | ||
"babel-plugin-syntax-trailing-function-commas": "6.8.0", | ||
"babel-plugin-transform-async-to-generator": "6.8.0", | ||
"babel-plugin-transform-class-properties": "6.9.1", | ||
"babel-plugin-transform-decorators": "6.8.0", | ||
"babel-plugin-transform-decorators-legacy": "1.3.4", | ||
"babel-plugin-transform-es2015-destructuring": "6.9.0", | ||
"babel-plugin-transform-es2015-parameters": "6.9.0", | ||
"babel-plugin-transform-es2015-spread": "6.8.0", | ||
"babel-plugin-transform-exponentiation-operator": "6.8.0", | ||
"babel-plugin-transform-object-rest-spread": "6.8.0", | ||
"knex": "0.11.5", | ||
"lux-framework": "${VERSION}" | ||
} | ||
} | ||
} | ||
`.substr(1).trim(); | ||
}; | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,27 @@ | ||
export default (name) => { | ||
return ` | ||
# ${name} | ||
// @flow | ||
import template from '../../template'; | ||
|
||
## Installation | ||
/** | ||
* @private | ||
*/ | ||
export default (name: string): string => template` | ||
# ${name} | ||
* \`git clone https://github.com/<this-repository>\` | ||
* \`cd ${name}\` | ||
* \`npm install\` | ||
## Installation | ||
## Running / Development | ||
* \`git clone https://github.com/<this-repository>\` | ||
* \`cd ${name}\` | ||
* \`npm install\` | ||
* \`lux serve\` | ||
## Running / Development | ||
## Testing | ||
* \`lux serve\` | ||
* \`lux test\` | ||
## Testing | ||
## Further Reading / Useful Links | ||
* [Lux](https://github.com/postlight/lux/) | ||
* [Chai](http://chaijs.com/) / [Mocha](http://mochajs.org/) | ||
`.substr(1).trim(); | ||
}; | ||
* \`lux test\` | ||
## Further Reading / Useful Links | ||
* [Lux](https://github.com/postlight/lux/) | ||
* [Chai](http://chaijs.com/) / [Mocha](http://mochajs.org/) | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,11 @@ | ||
export default () => { | ||
return ` | ||
export default (route, resource) => { | ||
// @flow | ||
import template from '../../template'; | ||
|
||
}; | ||
`.substr(1).trim(); | ||
}; | ||
/** | ||
* @private | ||
*/ | ||
export default (): string => template` | ||
export default function routes(route, resource) { | ||
} | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,11 @@ | ||
export default () => { | ||
return ` | ||
export default async () => { | ||
// @flow | ||
import template from '../../template'; | ||
|
||
}; | ||
`.substr(1).trim(); | ||
}; | ||
/** | ||
* @private | ||
*/ | ||
export default (): string => template` | ||
export default async function seed() { | ||
} | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
export default function indent(amount = 1) { | ||
// @flow | ||
export default function indent(amount: number = 1): string { | ||
return ' '.repeat(amount); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// @flow | ||
import ansiregex from 'ansi-regex'; | ||
import { Transform } from 'stream'; | ||
|
||
const pattern = ansiregex(); | ||
|
||
/** | ||
* @private | ||
*/ | ||
class AnsiRemover extends Transform { | ||
constructor(options: {} = {}): AnsiRemover { | ||
super(options); | ||
return this; | ||
} | ||
|
||
_transform( | ||
data: ?Buffer | ?string, | ||
encoding: string, | ||
done: () => void | ||
): void { | ||
if (data instanceof Buffer) { | ||
data = new Buffer(data.toString().replace(pattern, ''), 'utf8'); | ||
this.push(data); | ||
} | ||
|
||
done(null); | ||
} | ||
} | ||
|
||
export default AnsiRemover; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters