🚧 Ongoing work on CFP
This commit is contained in:
parent
7cc4130a11
commit
6b6f6fd7cd
54 changed files with 1360 additions and 3295 deletions
|
@ -23,7 +23,7 @@ module.exports = async () => {
|
|||
.option('-r, --repo <string>', 'package repo path')
|
||||
.option('-g, --no-git', 'generate without git init')
|
||||
.option('-m, --manager <npm|yarn>', 'package manager to use', /^(npm|yarn)$/, defaults.manager)
|
||||
.option('-t, --template <light|dark>', 'package template to use', /^(light|dark|custom)$/, defaults.template)
|
||||
.option('-t, --template <default|custom>', 'package template to use', /^(default|custom)$/, defaults.template)
|
||||
.option('-p, --template-path <string>', 'custom package template path')
|
||||
.option('-s, --skip-prompts', 'skip all prompts (must provide package-name via cli)')
|
||||
.parse(process.argv)
|
||||
|
|
|
@ -15,7 +15,7 @@ module.exports = async () => {
|
|||
repo: (info) => `${info.author}/${info.name}`,
|
||||
license: config.get('license', 'MIT'),
|
||||
manager: config.get('manager', 'npm'),
|
||||
template: config.get('template', 'light')
|
||||
template: config.get('template', 'default')
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
|
@ -4,9 +4,19 @@ const path = require('path')
|
|||
const fs = require('fs')
|
||||
const inquirer = require('inquirer')
|
||||
const validateNpmName = require('validate-npm-package-name')
|
||||
|
||||
const languages = require('@freesewing/i18n').languages;
|
||||
const strings = require('@freesewing/i18n').strings;
|
||||
const config = require('./config')
|
||||
|
||||
let languageChoices = []
|
||||
for (let l of Object.keys(languages)) {
|
||||
languageChoices.push({
|
||||
name: languages[l],
|
||||
value: l,
|
||||
short: languages[l]
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = async (opts) => {
|
||||
if (opts.name && !validateNpmName(opts.name).validForNewPackages) {
|
||||
throw new Error(`invalid package name "${opts.name}"`)
|
||||
|
@ -27,11 +37,18 @@ module.exports = async (opts) => {
|
|||
return opts
|
||||
} else {
|
||||
const info = await inquirer.prompt([
|
||||
{
|
||||
type: 'list',
|
||||
name: 'language',
|
||||
message: 'Language',
|
||||
choices: languageChoices,
|
||||
default: 'en'
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'name',
|
||||
message: 'Pattern Name',
|
||||
validate: (name) => {
|
||||
message: info => strings[info.language]['cfp.patternName'],
|
||||
validate: name => {
|
||||
return name && validateNpmName(name).validForNewPackages
|
||||
},
|
||||
default: opts.name
|
||||
|
@ -39,63 +56,56 @@ module.exports = async (opts) => {
|
|||
{
|
||||
type: 'input',
|
||||
name: 'description',
|
||||
message: 'Pattern Description',
|
||||
message: info => strings[info.language]['cfp.patternDescription'],
|
||||
default: opts.description
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
name: 'type',
|
||||
message: info => strings[info.language]['cfp.patternType'],
|
||||
choices: info => [
|
||||
{ name: strings[info.language]['filter.type.pattern'], value: 'pattern'},
|
||||
{ name: strings[info.language]['filter.type.block'], value: 'block'},
|
||||
],
|
||||
default: 'pattern',
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
name: 'department',
|
||||
message: info => strings[info.language]['filter.department.title'],
|
||||
choices: info => [
|
||||
{ name: strings[info.language]['filter.department.menswear'], value: 'menswear'},
|
||||
{ name: strings[info.language]['filter.department.womenswear'], value: 'womenswear'},
|
||||
{ name: strings[info.language]['filter.department.accessories'], value: 'accessories'},
|
||||
],
|
||||
default: 'womenswear',
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'author',
|
||||
message: 'Author\'s GitHub Handle',
|
||||
message: info => strings[info.language]['cfp.author'],
|
||||
default: opts.author
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'repo',
|
||||
message: 'GitHub Repo Path',
|
||||
message: info => strings[info.language]['cfp.githubRepo'],
|
||||
default: opts.repo
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'license',
|
||||
message: 'License',
|
||||
default: opts.license
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
name: 'manager',
|
||||
message: 'Package Manager',
|
||||
message: info => strings[info.language]['cfp.packageManager'],
|
||||
choices: [ 'npm', 'yarn' ],
|
||||
default: opts.manager
|
||||
},
|
||||
{
|
||||
type: 'list',
|
||||
name: 'template',
|
||||
message: 'Development Mode',
|
||||
choices: [ 'light', 'dark', 'custom' ],
|
||||
default: opts.template
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'templatePath',
|
||||
message: 'Template Path',
|
||||
default: opts.templatePath,
|
||||
when: ({ template }) => template === 'custom',
|
||||
validate: input => new Promise(resolve => {
|
||||
const fullPath = path.resolve(process.cwd(), input)
|
||||
fs.stat(fullPath, (err, stats) => {
|
||||
if (err) {
|
||||
return resolve(`Cannot resolve directory at: ${fullPath}`)
|
||||
}
|
||||
resolve(true)
|
||||
})
|
||||
})
|
||||
}
|
||||
])
|
||||
|
||||
config.set('author', info.author)
|
||||
config.set('license', info.license)
|
||||
config.set('manager', info.manager)
|
||||
config.set('template', info.template)
|
||||
config.set('template', 'default')
|
||||
config.set('license', 'MIT')
|
||||
info.template = 'default';
|
||||
|
||||
return {
|
||||
...info,
|
||||
|
|
1209
packages/create-freesewing-pattern/package-lock.json
generated
Normal file
1209
packages/create-freesewing-pattern/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
|
@ -24,7 +24,8 @@
|
|||
"build": "npm run clean && npm run mkdist && npm run copyfiles",
|
||||
"test": "ava -v && standard *.js lib/*.js",
|
||||
"pubtest": "npm publish --registry http://localhost:6662",
|
||||
"publish": "npm build && npm publish --access=public --tag=alpha",
|
||||
"pubforce": "npm publish",
|
||||
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
|
||||
"mkdist": "mkdir -p dist",
|
||||
"copyfiles": "cp -R index.js package.json README.md lib template dist/"
|
||||
},
|
||||
|
|
29
packages/create-freesewing-pattern/prebuild.js
Normal file
29
packages/create-freesewing-pattern/prebuild.js
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* eslint-disable no-console */
|
||||
//const path = require("path");
|
||||
//const fse = require("fs-extra");
|
||||
const i18n = require("@freesewing/i18n").languages;
|
||||
console.log(i18n);
|
||||
|
||||
//const strings = {
|
||||
// languages: {}
|
||||
//};
|
||||
//for (let lang of Object.keys(i18n.languages)) {
|
||||
// strings.languages[lang] = i18n.languages[lang][lang];
|
||||
// strings[lang] = {};
|
||||
// for (let s of ['department', 'type'])
|
||||
// strings[lang][s] = i18n.filter[lang][s].title;
|
||||
// for (let s of ['menswear', 'womenswear', 'accessories'])
|
||||
// strings[lang][s] = i18n.filter[lang].department[s];
|
||||
// for (let s of ['block', 'pattern'])
|
||||
// strings[lang][s] = i18n.filter[lang].type[s];
|
||||
// strings[lang].difficulty = i18n.filter[lang].difficulty;
|
||||
// strings[lang].name = i18n.app[lang].name;
|
||||
//
|
||||
//}
|
||||
//
|
||||
//fse.writeFileSync(
|
||||
// path.join(".", "lib", "strings.js"),
|
||||
// "export default "+JSON.stringify(strings)
|
||||
//);
|
||||
|
||||
//console.log(strings);
|
|
@ -1,27 +0,0 @@
|
|||
{
|
||||
"name": "{{name}}-example",
|
||||
"homepage": "https://{{author}}.github.io/{{name}}",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"react": "^16.5.2",
|
||||
"react-dom": "^16.5.2",
|
||||
"react-scripts": "2.0.4",
|
||||
"{{name}}": "{{#if yarn}}link:..{{else}}file:..{{/if}}"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": "react-app"
|
||||
},
|
||||
"browserslist": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not ie <= 11",
|
||||
"not op_mini all"
|
||||
]
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
import React, { Component } from 'react';
|
||||
import './App.css';
|
||||
|
||||
import ExampleComponent from '{{name}}';
|
||||
|
||||
class App extends Component {
|
||||
render() {
|
||||
return <ExampleComponent text='Modern React component module' />;
|
||||
}
|
||||
}
|
||||
|
||||
export default App;
|
|
@ -1,76 +0,0 @@
|
|||
{
|
||||
"name": "{{name}}",
|
||||
"version": "1.0.0",
|
||||
"description": "{{description}}",
|
||||
"author": "{{author}}",
|
||||
"license": "{{license}}",
|
||||
"repository": "{{repo}}",
|
||||
"main": "dist/index.js",
|
||||
"module": "dist/index.es.js",
|
||||
"jsnext:main": "dist/index.es.js",
|
||||
"engines": {
|
||||
"node": ">=8",
|
||||
"npm": ">=5"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "cross-env CI=1 react-scripts test --env=jsdom",
|
||||
"test:watch": "react-scripts test --env=jsdom",
|
||||
"build": "rollup -c",
|
||||
"start": "rollup -c -w",
|
||||
"prepare": "{{manager}} run build",
|
||||
"predeploy": "cd example && {{manager}} install && {{manager}} run build",
|
||||
"deploy": "gh-pages -d example/build"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"prop-types": "^15.5.4",
|
||||
"react": "^15.0.0 || ^16.0.0",
|
||||
"react-dom": "^15.0.0 || ^16.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.0.0",
|
||||
"@babel/plugin-external-helpers": "^7.0.0",
|
||||
"@babel/plugin-proposal-class-properties": "^7.0.0",
|
||||
"@babel/plugin-proposal-decorators": "^7.0.0",
|
||||
"@babel/plugin-proposal-do-expressions": "^7.0.0",
|
||||
"@babel/plugin-proposal-export-default-from": "^7.0.0",
|
||||
"@babel/plugin-proposal-export-namespace-from": "^7.0.0",
|
||||
"@babel/plugin-proposal-function-bind": "^7.0.0",
|
||||
"@babel/plugin-proposal-function-sent": "^7.0.0",
|
||||
"@babel/plugin-proposal-json-strings": "^7.0.0",
|
||||
"@babel/plugin-proposal-logical-assignment-operators": "^7.0.0",
|
||||
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0",
|
||||
"@babel/plugin-proposal-numeric-separator": "^7.0.0",
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.0.0",
|
||||
"@babel/plugin-proposal-pipeline-operator": "^7.0.0",
|
||||
"@babel/plugin-proposal-throw-expressions": "^7.0.0",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
|
||||
"@babel/plugin-syntax-import-meta": "^7.0.0",
|
||||
"@babel/preset-env": "^7.0.0",
|
||||
"@babel/preset-react": "^7.0.0",
|
||||
"@svgr/rollup": "^2.4.1",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"cross-env": "^5.1.4",
|
||||
"eslint": "^5.0.1",
|
||||
"eslint-config-standard": "^11.0.0",
|
||||
"eslint-config-standard-react": "^6.0.0",
|
||||
"eslint-plugin-import": "^2.13.0",
|
||||
"eslint-plugin-node": "^7.0.1",
|
||||
"eslint-plugin-promise": "^4.0.0",
|
||||
"eslint-plugin-react": "^7.10.0",
|
||||
"eslint-plugin-standard": "^3.1.0",
|
||||
"gh-pages": "^1.2.0",
|
||||
"react": "^16.4.1",
|
||||
"react-dom": "^16.4.1",
|
||||
"react-scripts": "^1.1.4",
|
||||
"rollup": "^0.64.1",
|
||||
"rollup-plugin-babel": "^4.0.1",
|
||||
"rollup-plugin-commonjs": "^9.1.3",
|
||||
"rollup-plugin-node-resolve": "^3.3.0",
|
||||
"rollup-plugin-peer-deps-external": "^2.2.0",
|
||||
"rollup-plugin-postcss": "^1.6.2",
|
||||
"rollup-plugin-url": "^1.4.0"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
]
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
import babel from 'rollup-plugin-babel'
|
||||
import commonjs from 'rollup-plugin-commonjs'
|
||||
import external from 'rollup-plugin-peer-deps-external'
|
||||
import postcss from 'rollup-plugin-postcss'
|
||||
import resolve from 'rollup-plugin-node-resolve'
|
||||
import url from 'rollup-plugin-url'
|
||||
import svgr from '@svgr/rollup'
|
||||
|
||||
import pkg from './package.json'
|
||||
|
||||
export default {
|
||||
input: 'src/index.js',
|
||||
output: [
|
||||
{
|
||||
file: pkg.main,
|
||||
format: 'cjs',
|
||||
sourcemap: true
|
||||
},
|
||||
{
|
||||
file: pkg.module,
|
||||
format: 'es',
|
||||
sourcemap: true
|
||||
}
|
||||
],
|
||||
plugins: [
|
||||
external(),
|
||||
postcss({
|
||||
modules: true
|
||||
}),
|
||||
url({ exclude: ['**/*.svg'] }),
|
||||
svgr(),
|
||||
babel({
|
||||
exclude: 'node_modules/**',
|
||||
plugins: [ '@babel/external-helpers' ]
|
||||
}),
|
||||
resolve(),
|
||||
commonjs()
|
||||
]
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
import React, { Component } from 'react'
|
||||
import PropTypes from 'prop-types'
|
||||
|
||||
import styles from './styles.css'
|
||||
|
||||
export default class ExampleComponent extends Component {
|
||||
static propTypes = {
|
||||
text: PropTypes.string
|
||||
}
|
||||
|
||||
render() {
|
||||
const {
|
||||
text
|
||||
} = this.props
|
||||
|
||||
return (
|
||||
<div className={styles.test}>
|
||||
Example Component: {text}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
/* add css styles here (optional) */
|
||||
|
||||
.test {
|
||||
display: inline-block;
|
||||
margin: 2em auto;
|
||||
border: 2px solid #000;
|
||||
font-size: 2em;
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
import ExampleComponent from './'
|
||||
|
||||
describe('ExampleComponent', () => {
|
||||
it('is truthy', () => {
|
||||
expect(ExampleComponent).toBeTruthy()
|
||||
})
|
||||
})
|
|
@ -0,0 +1,21 @@
|
|||
import { version } from "../package.json";
|
||||
|
||||
// ?? 🤔 ?? --> https://{{language}}.freesewing.dev/packages/core/config
|
||||
|
||||
export default {
|
||||
name: "{{name}}",
|
||||
version,
|
||||
design: "{{author}}",
|
||||
code: "{{author}}",
|
||||
department: "{{department}}",
|
||||
type: "{{type}}",
|
||||
difficulty: 3,
|
||||
tags: [],
|
||||
optionGroups: {},
|
||||
measurements: [],
|
||||
dependencies: {},
|
||||
inject: {},
|
||||
hide: [],
|
||||
parts: [],
|
||||
options: {}
|
||||
};
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
34
packages/create-freesewing-pattern/template/default/package-lock.json
generated
Normal file
34
packages/create-freesewing-pattern/template/default/package-lock.json
generated
Normal file
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
"name": "{{name}}",
|
||||
"version": "0.0.1",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@freesewing/core": {
|
||||
"version": "2.0.0-alpha.3",
|
||||
"resolved": "https://registry.npmjs.org/@freesewing/core/-/core-2.0.0-alpha.3.tgz",
|
||||
"integrity": "sha512-3iL1wHBUyF4ew/CiVzZ5/ut/qoB5x1TKmOvkltJhiGaI/k8+3kcrBkhnScNcazkeidwjJ53wmpn0lvewbMlgxw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bezier-js": "^2.2.13",
|
||||
"bin-pack": "1.0.2",
|
||||
"hooks": "^0.3.2"
|
||||
}
|
||||
},
|
||||
"bezier-js": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.4.0.tgz",
|
||||
"integrity": "sha512-ttwqGL47RtYOoZy10oFJZ1VlEC6w1eJW1xMPBAvEx57cTWgmaJNr/c2ZLMr/O2RD50saR0OaLBIpgyZ7rkHLSw=="
|
||||
},
|
||||
"bin-pack": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/bin-pack/-/bin-pack-1.0.2.tgz",
|
||||
"integrity": "sha1-wqAU7b8L7XCjKSBi7UZXe5YSBnk="
|
||||
},
|
||||
"hooks": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/hooks/-/hooks-0.3.2.tgz",
|
||||
"integrity": "sha1-ox8GDCAmzqbPHKPrF4Qw5xjhxKM="
|
||||
}
|
||||
}
|
||||
}
|
|
@ -47,6 +47,19 @@
|
|||
"@babel/plugin-syntax-import-meta": "^7.0.0",
|
||||
"@babel/preset-env": "^7.0.0",
|
||||
"@babel/preset-react": "^7.0.0",
|
||||
"@freesewing/core": "2.0.0-alpha.3",
|
||||
"@freesewing/plugin-bundle": "2.0.0-alpha.3",
|
||||
"@freesewing/components": "2.0.0-alpha.3",
|
||||
"@freesewing/css-theme": "2.0.0-alpha.3",
|
||||
"@freesewing/i18n": "2.0.0-alpha.3",
|
||||
"@freesewing/mui-theme": "2.0.0-alpha.3",
|
||||
"@freesewing/patterns": "2.0.0-alpha.3",
|
||||
"@freesewing/plugin-bust": "2.0.0-alpha.3",
|
||||
"@freesewing/plugin-buttons": "2.0.0-alpha.3",
|
||||
"@freesewing/plugin-debug": "2.0.0-alpha.3",
|
||||
"@freesewing/plugin-designer": "2.0.0-alpha.3",
|
||||
"@freesewing/plugin-flip": "2.0.0-alpha.3",
|
||||
"@freesewing/utils": "2.0.0-alpha.3",
|
||||
"@svgr/rollup": "^2.4.1",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"cross-env": "^5.1.4",
|
||||
|
@ -64,15 +77,13 @@
|
|||
"react-scripts": "^1.1.4",
|
||||
"rollup": "^0.64.1",
|
||||
"rollup-plugin-babel": "^4.0.1",
|
||||
"rollup-plugin-commonjs": "^9.1.3",
|
||||
"rollup-plugin-babel-minify": "^7.0.0",
|
||||
"rollup-plugin-commonjs": "^9.1.3",
|
||||
"rollup-plugin-json": "^3.1.0",
|
||||
"rollup-plugin-node-resolve": "^3.3.0",
|
||||
"rollup-plugin-peer-deps-external": "^2.2.0",
|
||||
"rollup-plugin-postcss": "^1.6.2",
|
||||
"rollup-plugin-url": "^1.4.0",
|
||||
"@freesewing/plugin-bundle": "0.8.0",
|
||||
"freesewing": "0.30.6"
|
||||
"rollup-plugin-url": "^1.4.0"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
"presets": [
|
||||
["@babel/preset-env", {
|
||||
"modules": false
|
||||
}],
|
||||
"@babel/preset-react"
|
||||
],
|
||||
"plugins": ["@babel/plugin-proposal-class-properties"]
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"parser": "babel-eslint",
|
||||
"extends": [
|
||||
"standard",
|
||||
"standard-react"
|
||||
],
|
||||
"env": {
|
||||
"es6": true
|
||||
},
|
||||
"plugins": [
|
||||
"react"
|
||||
],
|
||||
"parserOptions": {
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
// don't force es6 functions to include space before paren
|
||||
"space-before-function-paren": 0,
|
||||
|
||||
// allow specifying true explicitly for boolean props
|
||||
"react/jsx-boolean-value": 0
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
# See https://help.github.com/ignore-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
|
||||
# builds
|
||||
build
|
||||
dist
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
|
@ -1,4 +0,0 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- 9
|
||||
- 8
|
|
@ -1,31 +0,0 @@
|
|||
# {{name}}
|
||||
|
||||
> {{description}}
|
||||
|
||||
[](https://www.npmjs.com/package/{{name}}) [](https://standardjs.com)
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npm install --save {{name}}
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```jsx
|
||||
import React, { Component } from 'react'
|
||||
|
||||
import MyComponent from '{{name}}'
|
||||
|
||||
class Example extends Component {
|
||||
render () {
|
||||
return (
|
||||
<MyComponent />
|
||||
)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
{{license}} © [{{author}}](https://github.com/{{author}})
|
|
@ -1,199 +0,0 @@
|
|||
import { version } from "../package.json";
|
||||
|
||||
// Configuration file syntax documentation:
|
||||
// -> https://beta.freesewing.org/en/docs/developer/config
|
||||
|
||||
export default {
|
||||
name: "{{name}}",
|
||||
version,
|
||||
|
||||
//
|
||||
// measurements
|
||||
//
|
||||
// An array with the names of
|
||||
// the measurements required for your design
|
||||
measurements: [
|
||||
//"chestCircumference",
|
||||
//"naturalWaist",
|
||||
],
|
||||
|
||||
//
|
||||
// dependencies
|
||||
//
|
||||
// An object where the key must be a part name, the value can be:
|
||||
// -> a part name
|
||||
// -> an array of part names
|
||||
//
|
||||
// This will be used to determine the order in which parts are drafted
|
||||
dependencies: {
|
||||
//front: "back"
|
||||
//side: ["front", "back"]
|
||||
},
|
||||
|
||||
//
|
||||
// inject
|
||||
//
|
||||
// An object where both key and value must be a a part name.
|
||||
// The value part will be injected in the key part.
|
||||
//
|
||||
// By injected we mean rather than starting out with a fresh part,
|
||||
// the key part will get the points, paths, and snippets of the value part.
|
||||
inject: {
|
||||
//front: "back"
|
||||
},
|
||||
|
||||
//
|
||||
// hide
|
||||
//
|
||||
// An array that lists pattern parts that should be hidden
|
||||
// by default. Hidden means that they will be drafted,
|
||||
// but not rendered. Typically used for a base part on
|
||||
// which other parts are built.
|
||||
//
|
||||
hide: [],
|
||||
|
||||
//
|
||||
// parts
|
||||
//
|
||||
// An array that lists your (additional) pattern parts.
|
||||
// The name must be the key the pattern.parts object.
|
||||
//
|
||||
// This does not need to be an exhaustive list of all parts
|
||||
// in your pattern. If parts are included in the dependencies,
|
||||
// inject, or hide configuration, there’s no need to include
|
||||
// them here, as we already know of their existence.
|
||||
//
|
||||
parts: [],
|
||||
|
||||
//
|
||||
// options
|
||||
//
|
||||
// Options come in 6 varities:
|
||||
//
|
||||
// -> Constants : A value that can’t be changed
|
||||
// -> Percentages : A value in percent, with minimum and maximum values
|
||||
// -> Millimeters : A value in millimeter, with minimum and maximum values
|
||||
// -> Degrees : A value in degrees, with minimum and maximum values
|
||||
// -> Counters : An integer value, with minimum and maximum values
|
||||
// -> Lists : A list of options with a default
|
||||
//
|
||||
// Under the hood, millimeters, degrees, and counters are handled
|
||||
// the same way. We use different types because it easier to
|
||||
// understand the nature of a given option.
|
||||
//
|
||||
options: {
|
||||
//
|
||||
// Constants
|
||||
//
|
||||
// If your option is a scalar value (like a string or a number),
|
||||
// it will be treated as a constant.
|
||||
//
|
||||
// Rather than define constants in your code, it’s good practice
|
||||
// to set them in your configuration file. This way, people who
|
||||
// extend your pattern can change them if they would like to.
|
||||
//
|
||||
//foo: 4,
|
||||
|
||||
//
|
||||
// Percentages
|
||||
//
|
||||
// Percentage options are the bread and butter of freesewing.
|
||||
// Almost all your options will probably be percentages.
|
||||
// They make sure that your pattern will scale regardless of size.
|
||||
//
|
||||
// Your percentage option should be an object with these properties:
|
||||
//
|
||||
// -> pct : The percentage
|
||||
// -> min : The minimum that’s allowed
|
||||
// -> max : The maximum that’s allowed
|
||||
//
|
||||
// Percentage options will be divided by 100 when loaded
|
||||
//
|
||||
// You specify percentages in your config file.
|
||||
// For example, 50 means 50%. When your configuration is loaded,
|
||||
// those percentages will by divided by 100.
|
||||
// So a percentage of 50 in your config file will be 0.5 when
|
||||
// you read out that option in your pattern.
|
||||
//
|
||||
//chestEase: {
|
||||
// pct: 8,
|
||||
// min: -4,
|
||||
// max: 20
|
||||
//},
|
||||
|
||||
//
|
||||
// Millimeters
|
||||
//
|
||||
// While we recommend using percentages where possible, sometimes
|
||||
// that doesn’t make sense. For those cases, you can use millimeters.
|
||||
//
|
||||
// Your millimeter option should be an object with these properties:
|
||||
//
|
||||
// -> mm : The default value in millimeter
|
||||
// -> min : The minimul that’s allowed
|
||||
// -> max : The maximum that’s allowed
|
||||
//
|
||||
//elasticWidth: {
|
||||
// mm: 35,
|
||||
// min: 5,
|
||||
// max: 80
|
||||
//},
|
||||
|
||||
//
|
||||
// Degrees
|
||||
//
|
||||
// For angles, use degrees.
|
||||
//
|
||||
// Your degree option should be an object with these properties:
|
||||
//
|
||||
// -> deg : The default value in degrees
|
||||
// -> min : The minimul that’s allowed
|
||||
// -> max : The maximum that’s allowed
|
||||
//
|
||||
//collarAngle: {
|
||||
// deg: 85,
|
||||
// min: 60,
|
||||
// max: 130
|
||||
//},
|
||||
|
||||
//
|
||||
// Counters
|
||||
//
|
||||
// For a given number of things, use counters. Counters are
|
||||
// for integers only. Things like number of buttons and so on.
|
||||
//
|
||||
// Your counter option should be an object with these properties:
|
||||
//
|
||||
// -> count : The default integer value
|
||||
// -> min : The minimal integer value that’s allowed
|
||||
// -> max : The maximum integer value that’s allowed
|
||||
//
|
||||
//butttons: {
|
||||
// count: 7,
|
||||
// min: 4,
|
||||
// max: 12
|
||||
//},
|
||||
|
||||
//
|
||||
// Lists
|
||||
//
|
||||
// Use a list option when you want to offer an array of choices.
|
||||
//
|
||||
// Your list option should be an object with these properties:
|
||||
//
|
||||
// -> dflt : The default for this option
|
||||
// -> list : An array of available values options
|
||||
//
|
||||
//cuffStyle: {
|
||||
// dflt: "angledBarrelCuff",
|
||||
// list: [
|
||||
// "roundedBarrelCuff",
|
||||
// "angledBarrelCuff",
|
||||
// "straightBarrelCuff",
|
||||
// "roundedFrenchCuff",
|
||||
// "angledFrenchCuff",
|
||||
// "straightFrenchCuff"
|
||||
// ]
|
||||
//}
|
||||
}
|
||||
};
|
File diff suppressed because it is too large
Load diff
Binary file not shown.
Before Width: | Height: | Size: 3.8 KiB |
|
@ -1,40 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="theme-color" content="#000000">
|
||||
<!--
|
||||
manifest.json provides metadata used when your web app is added to the
|
||||
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
|
||||
-->
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
|
||||
<!--
|
||||
Notice the use of %PUBLIC_URL% in the tags above.
|
||||
It will be replaced with the URL of the `public` folder during the build.
|
||||
Only files inside the `public` folder can be referenced from the HTML.
|
||||
|
||||
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
||||
work correctly both with client-side routing and a non-root public URL.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<title>{{name}}</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
You need to enable JavaScript to run this app.
|
||||
</noscript>
|
||||
<div id="root"></div>
|
||||
<!--
|
||||
This HTML file is a template.
|
||||
If you open it directly in the browser, you will see an empty page.
|
||||
|
||||
You can add webfonts, meta tags, or analytics to this file.
|
||||
The build step will place the bundled scripts into the <body> tag.
|
||||
|
||||
To begin the development, run `npm start` or `yarn start`.
|
||||
To create a production bundle, use `npm run build` or `yarn build`.
|
||||
-->
|
||||
</body>
|
||||
</html>
|
|
@ -1,15 +0,0 @@
|
|||
{
|
||||
"short_name": "{{name}}",
|
||||
"name": "{{name}}",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "64x64 32x32 24x24 16x16",
|
||||
"type": "image/x-icon"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
.App {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.App-logo {
|
||||
animation: App-logo-spin infinite 20s linear;
|
||||
height: 40vmin;
|
||||
}
|
||||
|
||||
.App-header {
|
||||
background-color: #282c34;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: calc(10px + 2vmin);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.App-link {
|
||||
color: #61dafb;
|
||||
}
|
||||
|
||||
@keyframes App-logo-spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import App from './App';
|
||||
|
||||
it('renders without crashing', () => {
|
||||
const div = document.createElement('div');
|
||||
ReactDOM.render(<App />, div);
|
||||
ReactDOM.unmountComponentAtNode(div);
|
||||
});
|
|
@ -1,14 +0,0 @@
|
|||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
|
||||
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
|
||||
sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
|
||||
monospace;
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import './index.css';
|
||||
import App from './App';
|
||||
import * as serviceWorker from './serviceWorker';
|
||||
|
||||
ReactDOM.render(<App />, document.getElementById('root'));
|
||||
|
||||
// If you want your app to work offline and load faster, you can change
|
||||
// unregister() to register() below. Note this comes with some pitfalls.
|
||||
// Learn more about service workers: http://bit.ly/CRA-PWA
|
||||
serviceWorker.unregister();
|
|
@ -1,127 +0,0 @@
|
|||
// In production, we register a service worker to serve assets from local cache.
|
||||
|
||||
// This lets the app load faster on subsequent visits in production, and gives
|
||||
// it offline capabilities. However, it also means that developers (and users)
|
||||
// will only see deployed updates on the "N+1" visit to a page, since previously
|
||||
// cached resources are updated in the background.
|
||||
|
||||
// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
|
||||
// This link also includes instructions on opting out of this behavior.
|
||||
|
||||
const isLocalhost = Boolean(
|
||||
window.location.hostname === 'localhost' ||
|
||||
// [::1] is the IPv6 localhost address.
|
||||
window.location.hostname === '[::1]' ||
|
||||
// 127.0.0.1/8 is considered localhost for IPv4.
|
||||
window.location.hostname.match(
|
||||
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
|
||||
)
|
||||
);
|
||||
|
||||
export function register(config) {
|
||||
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
|
||||
// The URL constructor is available in all browsers that support SW.
|
||||
const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
|
||||
if (publicUrl.origin !== window.location.origin) {
|
||||
// Our service worker won't work if PUBLIC_URL is on a different origin
|
||||
// from what our page is served on. This might happen if a CDN is used to
|
||||
// serve assets; see https://github.com/facebook/create-react-app/issues/2374
|
||||
return;
|
||||
}
|
||||
|
||||
window.addEventListener('load', () => {
|
||||
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
|
||||
|
||||
if (isLocalhost) {
|
||||
// This is running on localhost. Let's check if a service worker still exists or not.
|
||||
checkValidServiceWorker(swUrl, config);
|
||||
|
||||
// Add some additional logging to localhost, pointing developers to the
|
||||
// service worker/PWA documentation.
|
||||
navigator.serviceWorker.ready.then(() => {
|
||||
console.log(
|
||||
'This web app is being served cache-first by a service ' +
|
||||
'worker. To learn more, visit https://goo.gl/SC7cgQ'
|
||||
);
|
||||
});
|
||||
} else {
|
||||
// Is not local host. Just register service worker
|
||||
registerValidSW(swUrl, config);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function registerValidSW(swUrl, config) {
|
||||
navigator.serviceWorker
|
||||
.register(swUrl)
|
||||
.then(registration => {
|
||||
registration.onupdatefound = () => {
|
||||
const installingWorker = registration.installing;
|
||||
installingWorker.onstatechange = () => {
|
||||
if (installingWorker.state === 'installed') {
|
||||
if (navigator.serviceWorker.controller) {
|
||||
// At this point, the old content will have been purged and
|
||||
// the fresh content will have been added to the cache.
|
||||
// It's the perfect time to display a "New content is
|
||||
// available; please refresh." message in your web app.
|
||||
console.log('New content is available; please refresh.');
|
||||
|
||||
// Execute callback
|
||||
if (config.onUpdate) {
|
||||
config.onUpdate(registration);
|
||||
}
|
||||
} else {
|
||||
// At this point, everything has been precached.
|
||||
// It's the perfect time to display a
|
||||
// "Content is cached for offline use." message.
|
||||
console.log('Content is cached for offline use.');
|
||||
|
||||
// Execute callback
|
||||
if (config.onSuccess) {
|
||||
config.onSuccess(registration);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error during service worker registration:', error);
|
||||
});
|
||||
}
|
||||
|
||||
function checkValidServiceWorker(swUrl, config) {
|
||||
// Check if the service worker can be found. If it can't reload the page.
|
||||
fetch(swUrl)
|
||||
.then(response => {
|
||||
// Ensure service worker exists, and that we really are getting a JS file.
|
||||
if (
|
||||
response.status === 404 ||
|
||||
response.headers.get('content-type').indexOf('javascript') === -1
|
||||
) {
|
||||
// No service worker found. Probably a different app. Reload the page.
|
||||
navigator.serviceWorker.ready.then(registration => {
|
||||
registration.unregister().then(() => {
|
||||
window.location.reload();
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// Service worker found. Proceed as normal.
|
||||
registerValidSW(swUrl, config);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
console.log(
|
||||
'No internet connection found. App is running in offline mode.'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
export function unregister() {
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.ready.then(registration => {
|
||||
registration.unregister();
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"env": {
|
||||
"jest": true
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue