Todomvc jquery update version (#125)
This commit is contained in:
parent
652fe1bc86
commit
ab819fa534
32 changed files with 1473 additions and 16689 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -5,6 +5,7 @@
|
|||
/node_modules
|
||||
|
||||
/resources/todomvc/architecture-examples/backbone/node_modules/
|
||||
/resources/todomvc/architecture-examples/jquery/node_modules/
|
||||
/resources/todomvc/architecture-examples/preact/node_modules/
|
||||
/resources/todomvc/architecture-examples/react/node_modules/
|
||||
/resources/todomvc/architecture-examples/react-redux/node_modules/
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ Suites.push({
|
|||
|
||||
Suites.push({
|
||||
name: "TodoMVC-jQuery",
|
||||
url: "todomvc/architecture-examples/jquery/index.html",
|
||||
url: "todomvc/architecture-examples/jquery/dist/index.html",
|
||||
async prepare(page) {
|
||||
await page.waitForElement("#appIsReady");
|
||||
const newTodo = page.getElementById("new-todo");
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#main,
|
||||
#footer {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
141
resources/todomvc/architecture-examples/jquery/dist/base.css
vendored
Normal file
141
resources/todomvc/architecture-examples/jquery/dist/base.css
vendored
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
hr {
|
||||
margin: 20px 0;
|
||||
border: 0;
|
||||
border-top: 1px dashed #c5c5c5;
|
||||
border-bottom: 1px dashed #f7f7f7;
|
||||
}
|
||||
|
||||
.learn a {
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
color: #b83f45;
|
||||
}
|
||||
|
||||
.learn a:hover {
|
||||
text-decoration: underline;
|
||||
color: #787e7e;
|
||||
}
|
||||
|
||||
.learn h3,
|
||||
.learn h4,
|
||||
.learn h5 {
|
||||
margin: 10px 0;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.learn h3 {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.learn h4 {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.learn h5 {
|
||||
margin-bottom: 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.learn ul {
|
||||
padding: 0;
|
||||
margin: 0 0 30px 25px;
|
||||
}
|
||||
|
||||
.learn li {
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.learn p {
|
||||
font-size: 15px;
|
||||
font-weight: 300;
|
||||
line-height: 1.3;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#issue-count {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.quote {
|
||||
border: none;
|
||||
margin: 20px 0 60px 0;
|
||||
}
|
||||
|
||||
.quote p {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.quote p:before {
|
||||
content: '“';
|
||||
font-size: 50px;
|
||||
opacity: .15;
|
||||
position: absolute;
|
||||
top: -20px;
|
||||
left: 3px;
|
||||
}
|
||||
|
||||
.quote p:after {
|
||||
content: '”';
|
||||
font-size: 50px;
|
||||
opacity: .15;
|
||||
position: absolute;
|
||||
bottom: -42px;
|
||||
right: 3px;
|
||||
}
|
||||
|
||||
.quote footer {
|
||||
position: absolute;
|
||||
bottom: -40px;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.quote footer img {
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.quote footer a {
|
||||
margin-left: 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.speech-bubble {
|
||||
position: relative;
|
||||
padding: 10px;
|
||||
background: rgba(0, 0, 0, .04);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.speech-bubble:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
right: 30px;
|
||||
border: 13px solid transparent;
|
||||
border-top-color: rgba(0, 0, 0, .04);
|
||||
}
|
||||
|
||||
.learn-bar > .learn {
|
||||
position: absolute;
|
||||
width: 272px;
|
||||
top: 8px;
|
||||
left: -300px;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
background-color: rgba(255, 255, 255, .6);
|
||||
transition-property: left;
|
||||
transition-duration: 500ms;
|
||||
}
|
||||
|
||||
@media (min-width: 899px) {
|
||||
.learn-bar {
|
||||
width: auto;
|
||||
padding-left: 300px;
|
||||
}
|
||||
|
||||
.learn-bar > .learn {
|
||||
left: 8px;
|
||||
}
|
||||
}
|
||||
7
resources/todomvc/architecture-examples/jquery/dist/director.min.js
vendored
Normal file
7
resources/todomvc/architecture-examples/jquery/dist/director.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
81
resources/todomvc/architecture-examples/jquery/dist/handlebars.min.js
vendored
Normal file
81
resources/todomvc/architecture-examples/jquery/dist/handlebars.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
393
resources/todomvc/architecture-examples/jquery/dist/index.css
vendored
Normal file
393
resources/todomvc/architecture-examples/jquery/dist/index.css
vendored
Normal file
|
|
@ -0,0 +1,393 @@
|
|||
@charset "utf-8";
|
||||
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
button {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: none;
|
||||
font-size: 100%;
|
||||
vertical-align: baseline;
|
||||
font-family: inherit;
|
||||
font-weight: inherit;
|
||||
color: inherit;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
body {
|
||||
font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
line-height: 1.4em;
|
||||
background: #f5f5f5;
|
||||
color: #111111;
|
||||
min-width: 230px;
|
||||
max-width: 550px;
|
||||
margin: 0 auto;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todoapp {
|
||||
background: #fff;
|
||||
margin: 130px 0 40px 0;
|
||||
position: relative;
|
||||
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
|
||||
0 25px 50px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.todoapp input::-webkit-input-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.todoapp input::-moz-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.todoapp input::input-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.todoapp h1 {
|
||||
position: absolute;
|
||||
top: -140px;
|
||||
width: 100%;
|
||||
font-size: 80px;
|
||||
font-weight: 200;
|
||||
text-align: center;
|
||||
color: #b83f45;
|
||||
-webkit-text-rendering: optimizeLegibility;
|
||||
-moz-text-rendering: optimizeLegibility;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
.new-todo,
|
||||
.edit {
|
||||
position: relative;
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
font-size: 24px;
|
||||
font-family: inherit;
|
||||
font-weight: inherit;
|
||||
line-height: 1.4em;
|
||||
color: inherit;
|
||||
padding: 6px;
|
||||
border: 1px solid #999;
|
||||
box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
box-sizing: border-box;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.new-todo {
|
||||
padding: 16px 16px 16px 60px;
|
||||
height: 65px;
|
||||
border: none;
|
||||
background: rgba(0, 0, 0, 0.003);
|
||||
box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
|
||||
}
|
||||
|
||||
.main {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
border-top: 1px solid #e6e6e6;
|
||||
}
|
||||
|
||||
.toggle-all {
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
border: none; /* Mobile Safari */
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
right: 100%;
|
||||
bottom: 100%;
|
||||
}
|
||||
|
||||
.toggle-all + label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 45px;
|
||||
height: 65px;
|
||||
font-size: 0;
|
||||
position: absolute;
|
||||
top: -65px;
|
||||
left: -0;
|
||||
}
|
||||
|
||||
.toggle-all + label:before {
|
||||
content: '❯';
|
||||
display: inline-block;
|
||||
font-size: 22px;
|
||||
color: #949494;
|
||||
padding: 10px 27px 10px 27px;
|
||||
-webkit-transform: rotate(90deg);
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.toggle-all:checked + label:before {
|
||||
color: #484848;
|
||||
}
|
||||
|
||||
.todo-list {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.todo-list li {
|
||||
position: relative;
|
||||
font-size: 24px;
|
||||
border-bottom: 1px solid #ededed;
|
||||
}
|
||||
|
||||
.todo-list li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.todo-list li.editing {
|
||||
border-bottom: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.todo-list li.editing .edit {
|
||||
display: block;
|
||||
width: calc(100% - 43px);
|
||||
padding: 12px 16px;
|
||||
margin: 0 0 0 43px;
|
||||
}
|
||||
|
||||
.todo-list li.editing .view {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
text-align: center;
|
||||
width: 40px;
|
||||
/* auto, since non-WebKit browsers doesn't support input styling */
|
||||
height: auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
margin: auto 0;
|
||||
border: none; /* Mobile Safari */
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.todo-list li .toggle + label {
|
||||
/*
|
||||
Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
|
||||
IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
|
||||
*/
|
||||
background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23949494%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center left;
|
||||
}
|
||||
|
||||
.todo-list li .toggle:checked + label {
|
||||
background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%2359A193%22%20stroke-width%3D%223%22%2F%3E%3Cpath%20fill%3D%22%233EA390%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22%2F%3E%3C%2Fsvg%3E');
|
||||
}
|
||||
|
||||
.todo-list li label {
|
||||
word-break: break-all;
|
||||
padding: 15px 15px 15px 60px;
|
||||
display: block;
|
||||
line-height: 1.2;
|
||||
transition: color 0.4s;
|
||||
font-weight: 400;
|
||||
color: #484848;
|
||||
}
|
||||
|
||||
.todo-list li.completed label {
|
||||
color: #949494;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.todo-list li .destroy {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 10px;
|
||||
bottom: 0;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin: auto 0;
|
||||
font-size: 30px;
|
||||
color: #949494;
|
||||
transition: color 0.2s ease-out;
|
||||
}
|
||||
|
||||
.todo-list li .destroy:hover,
|
||||
.todo-list li .destroy:focus {
|
||||
color: #C18585;
|
||||
}
|
||||
|
||||
.todo-list li .destroy:after {
|
||||
content: '×';
|
||||
display: block;
|
||||
height: 100%;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.todo-list li:hover .destroy {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.todo-list li .edit {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todo-list li.editing:last-child {
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
padding: 10px 15px;
|
||||
height: 20px;
|
||||
text-align: center;
|
||||
font-size: 15px;
|
||||
border-top: 1px solid #e6e6e6;
|
||||
}
|
||||
|
||||
.footer:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
height: 50px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
|
||||
0 8px 0 -3px #f6f6f6,
|
||||
0 9px 1px -3px rgba(0, 0, 0, 0.2),
|
||||
0 16px 0 -6px #f6f6f6,
|
||||
0 17px 2px -6px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.todo-count {
|
||||
float: left;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.todo-count strong {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.filters {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.filters li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.filters li a {
|
||||
color: inherit;
|
||||
margin: 3px;
|
||||
padding: 3px 7px;
|
||||
text-decoration: none;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.filters li a:hover {
|
||||
border-color: #DB7676;
|
||||
}
|
||||
|
||||
.filters li a.selected {
|
||||
border-color: #CE4646;
|
||||
}
|
||||
|
||||
.clear-completed,
|
||||
html .clear-completed:active {
|
||||
float: right;
|
||||
position: relative;
|
||||
line-height: 19px;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.clear-completed:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.info {
|
||||
margin: 65px auto 0;
|
||||
color: #4d4d4d;
|
||||
font-size: 11px;
|
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.info p {
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.info a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.info a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/*
|
||||
Hack to remove background from Mobile Safari.
|
||||
Can't use it globally since it destroys checkboxes in Firefox
|
||||
*/
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
.toggle-all,
|
||||
.todo-list li .toggle {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 430px) {
|
||||
.footer {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.filters {
|
||||
bottom: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
:focus,
|
||||
.toggle:focus + label,
|
||||
.toggle-all:focus + label {
|
||||
box-shadow: 0 0 2px 2px #CF7D7D;
|
||||
outline: 0;
|
||||
}
|
||||
61
resources/todomvc/architecture-examples/jquery/dist/index.html
vendored
Normal file
61
resources/todomvc/architecture-examples/jquery/dist/index.html
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<!doctype html>
|
||||
<html lang="en" data-framework="jquery">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>jQuery • TodoMVC</title>
|
||||
<link rel="stylesheet" href="base.css">
|
||||
<link rel="stylesheet" href="index.css">
|
||||
<link rel="stylesheet" href="app.css">
|
||||
</head>
|
||||
<body>
|
||||
<section id="todoapp" class="todoapp">
|
||||
<header id="header" class="header">
|
||||
<h1>todos</h1>
|
||||
<input id="new-todo" class="new-todo" placeholder="What needs to be done?" autofocus>
|
||||
</header>
|
||||
<section id="main" class="main">
|
||||
<input id="toggle-all" class="toggle-all" type="checkbox">
|
||||
<label for="toggle-all">Mark all as complete</label>
|
||||
<ul id="todo-list" class="todo-list"></ul>
|
||||
</section>
|
||||
<footer id="footer" class="footer"></footer>
|
||||
</section>
|
||||
<footer id="info" class="info">
|
||||
<p>Double-click to edit a todo</p>
|
||||
<p>Created by <a href="http://sindresorhus.com">Sindre Sorhus</a></p>
|
||||
<p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
|
||||
</footer>
|
||||
<script id="todo-template" type="text/x-handlebars-template">
|
||||
{{#this}}
|
||||
<li {{#if completed}}class="completed"{{/if}} data-id="{{id}}">
|
||||
<div class="view">
|
||||
<input class="toggle" type="checkbox" {{#if completed}}checked{{/if}}>
|
||||
<label>{{title}}</label>
|
||||
<button class="destroy"></button>
|
||||
</div>
|
||||
<input class="edit" value="{{title}}">
|
||||
</li>
|
||||
{{/this}}
|
||||
</script>
|
||||
<script id="footer-template" type="text/x-handlebars-template">
|
||||
<span id="todo-count" class="todo-count"><strong>{{activeTodoCount}}</strong> {{activeTodoWord}} left</span>
|
||||
<ul id="filters" class="filters">
|
||||
<li>
|
||||
<a {{#eq filter 'all'}}class="selected"{{/eq}} href="#/all">All</a>
|
||||
</li>
|
||||
<li>
|
||||
<a {{#eq filter 'active'}}class="selected"{{/eq}}href="#/active">Active</a>
|
||||
</li>
|
||||
<li>
|
||||
<a {{#eq filter 'completed'}}class="selected"{{/eq}}href="#/completed">Completed</a>
|
||||
</li>
|
||||
</ul>
|
||||
{{#if completedTodos}}<button id="clear-completed">Clear completed</button>{{/if}}
|
||||
</script>
|
||||
<!-- <script src="node_modules/todomvc-common/base.js"></script> -->
|
||||
<script src="jquery.min.js"></script>
|
||||
<script src="handlebars.min.js"></script>
|
||||
<script src="director.min.js"></script>
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
2
resources/todomvc/architecture-examples/jquery/dist/jquery.min.js
vendored
Normal file
2
resources/todomvc/architecture-examples/jquery/dist/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -5,7 +5,7 @@
|
|||
<title>jQuery • TodoMVC</title>
|
||||
<link rel="stylesheet" href="node_modules/todomvc-common/base.css">
|
||||
<link rel="stylesheet" href="node_modules/todomvc-app-css/index.css">
|
||||
<link rel="stylesheet" href="css/app.css">
|
||||
<link rel="stylesheet" href="src/app.css">
|
||||
</head>
|
||||
<body>
|
||||
<section id="todoapp" class="todoapp">
|
||||
|
|
@ -53,9 +53,9 @@
|
|||
{{#if completedTodos}}<button id="clear-completed">Clear completed</button>{{/if}}
|
||||
</script>
|
||||
<!-- <script src="node_modules/todomvc-common/base.js"></script> -->
|
||||
<script src="node_modules/jquery/dist/jquery.js"></script>
|
||||
<script src="node_modules/handlebars/dist/handlebars.js"></script>
|
||||
<script src="node_modules/director/dist/director.js"></script>
|
||||
<script src="js/app.js"></script>
|
||||
<script src="node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script src="node_modules/handlebars/dist/handlebars.min.js"></script>
|
||||
<script src="node_modules/director/build/director.min.js"></script>
|
||||
<script src="src/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
19
resources/todomvc/architecture-examples/jquery/node_modules/director/LICENSE
generated
vendored
19
resources/todomvc/architecture-examples/jquery/node_modules/director/LICENSE
generated
vendored
|
|
@ -1,19 +0,0 @@
|
|||
Copyright (c) 2011 Charlie Robbins, Paolo Fragomeni, & the Contributors.
|
||||
|
||||
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 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.
|
||||
9
resources/todomvc/architecture-examples/jquery/node_modules/director/bower.json
generated
vendored
9
resources/todomvc/architecture-examples/jquery/node_modules/director/bower.json
generated
vendored
|
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
"name": "director",
|
||||
"version": "1.2.7",
|
||||
"dependencies": {},
|
||||
"main": "build/director.js",
|
||||
"scripts": [
|
||||
"build/director.js"
|
||||
]
|
||||
}
|
||||
725
resources/todomvc/architecture-examples/jquery/node_modules/director/dist/director.js
generated
vendored
725
resources/todomvc/architecture-examples/jquery/node_modules/director/dist/director.js
generated
vendored
|
|
@ -1,725 +0,0 @@
|
|||
|
||||
|
||||
//
|
||||
// Generated on Tue Dec 16 2014 12:13:47 GMT+0100 (CET) by Charlie Robbins, Paolo Fragomeni & the Contributors (Using Codesurgeon).
|
||||
// Version 1.2.6
|
||||
//
|
||||
|
||||
(function (exports) {
|
||||
|
||||
/*
|
||||
* browser.js: Browser specific functionality for director.
|
||||
*
|
||||
* (C) 2011, Charlie Robbins, Paolo Fragomeni, & the Contributors.
|
||||
* MIT LICENSE
|
||||
*
|
||||
*/
|
||||
|
||||
var dloc = document.location;
|
||||
|
||||
function dlocHashEmpty() {
|
||||
// Non-IE browsers return '' when the address bar shows '#'; Director's logic
|
||||
// assumes both mean empty.
|
||||
return dloc.hash === '' || dloc.hash === '#';
|
||||
}
|
||||
|
||||
var listener = {
|
||||
mode: 'modern',
|
||||
hash: dloc.hash,
|
||||
history: false,
|
||||
|
||||
check: function () {
|
||||
var h = dloc.hash;
|
||||
if (h != this.hash) {
|
||||
this.hash = h;
|
||||
this.onHashChanged();
|
||||
}
|
||||
},
|
||||
|
||||
fire: function () {
|
||||
if (this.mode === 'modern') {
|
||||
this.history === true ? window.onpopstate() : window.onhashchange();
|
||||
}
|
||||
else {
|
||||
this.onHashChanged();
|
||||
}
|
||||
},
|
||||
|
||||
init: function (fn, history) {
|
||||
var self = this;
|
||||
this.history = history;
|
||||
|
||||
if (!Router.listeners) {
|
||||
Router.listeners = [];
|
||||
}
|
||||
|
||||
function onchange(onChangeEvent) {
|
||||
for (var i = 0, l = Router.listeners.length; i < l; i++) {
|
||||
Router.listeners[i](onChangeEvent);
|
||||
}
|
||||
}
|
||||
|
||||
//note IE8 is being counted as 'modern' because it has the hashchange event
|
||||
if ('onhashchange' in window && (document.documentMode === undefined
|
||||
|| document.documentMode > 7)) {
|
||||
// At least for now HTML5 history is available for 'modern' browsers only
|
||||
if (this.history === true) {
|
||||
// There is an old bug in Chrome that causes onpopstate to fire even
|
||||
// upon initial page load. Since the handler is run manually in init(),
|
||||
// this would cause Chrome to run it twise. Currently the only
|
||||
// workaround seems to be to set the handler after the initial page load
|
||||
// http://code.google.com/p/chromium/issues/detail?id=63040
|
||||
setTimeout(function() {
|
||||
window.onpopstate = onchange;
|
||||
}, 500);
|
||||
}
|
||||
else {
|
||||
window.onhashchange = onchange;
|
||||
}
|
||||
this.mode = 'modern';
|
||||
}
|
||||
else {
|
||||
//
|
||||
// IE support, based on a concept by Erik Arvidson ...
|
||||
//
|
||||
var frame = document.createElement('iframe');
|
||||
frame.id = 'state-frame';
|
||||
frame.style.display = 'none';
|
||||
document.body.appendChild(frame);
|
||||
this.writeFrame('');
|
||||
|
||||
if ('onpropertychange' in document && 'attachEvent' in document) {
|
||||
document.attachEvent('onpropertychange', function () {
|
||||
if (event.propertyName === 'location') {
|
||||
self.check();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
window.setInterval(function () { self.check(); }, 50);
|
||||
|
||||
this.onHashChanged = onchange;
|
||||
this.mode = 'legacy';
|
||||
}
|
||||
|
||||
Router.listeners.push(fn);
|
||||
|
||||
return this.mode;
|
||||
},
|
||||
|
||||
destroy: function (fn) {
|
||||
if (!Router || !Router.listeners) {
|
||||
return;
|
||||
}
|
||||
|
||||
var listeners = Router.listeners;
|
||||
|
||||
for (var i = listeners.length - 1; i >= 0; i--) {
|
||||
if (listeners[i] === fn) {
|
||||
listeners.splice(i, 1);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
setHash: function (s) {
|
||||
// Mozilla always adds an entry to the history
|
||||
if (this.mode === 'legacy') {
|
||||
this.writeFrame(s);
|
||||
}
|
||||
|
||||
if (this.history === true) {
|
||||
window.history.pushState({}, document.title, s);
|
||||
// Fire an onpopstate event manually since pushing does not obviously
|
||||
// trigger the pop event.
|
||||
this.fire();
|
||||
} else {
|
||||
dloc.hash = (s[0] === '/') ? s : '/' + s;
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
writeFrame: function (s) {
|
||||
// IE support...
|
||||
var f = document.getElementById('state-frame');
|
||||
var d = f.contentDocument || f.contentWindow.document;
|
||||
d.open();
|
||||
d.write("<script>_hash = '" + s + "'; onload = parent.listener.syncHash;<script>");
|
||||
d.close();
|
||||
},
|
||||
|
||||
syncHash: function () {
|
||||
// IE support...
|
||||
var s = this._hash;
|
||||
if (s != dloc.hash) {
|
||||
dloc.hash = s;
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
onHashChanged: function () {}
|
||||
};
|
||||
|
||||
var Router = exports.Router = function (routes) {
|
||||
if (!(this instanceof Router)) return new Router(routes);
|
||||
|
||||
this.params = {};
|
||||
this.routes = {};
|
||||
this.methods = ['on', 'once', 'after', 'before'];
|
||||
this.scope = [];
|
||||
this._methods = {};
|
||||
|
||||
this._insert = this.insert;
|
||||
this.insert = this.insertEx;
|
||||
|
||||
this.historySupport = (window.history != null ? window.history.pushState : null) != null
|
||||
|
||||
this.configure();
|
||||
this.mount(routes || {});
|
||||
};
|
||||
|
||||
Router.prototype.init = function (r) {
|
||||
var self = this
|
||||
, routeTo;
|
||||
this.handler = function(onChangeEvent) {
|
||||
var newURL = onChangeEvent && onChangeEvent.newURL || window.location.hash;
|
||||
var url = self.history === true ? self.getPath() : newURL.replace(/.*#/, '');
|
||||
self.dispatch('on', url.charAt(0) === '/' ? url : '/' + url);
|
||||
};
|
||||
|
||||
listener.init(this.handler, this.history);
|
||||
|
||||
if (this.history === false) {
|
||||
if (dlocHashEmpty() && r) {
|
||||
dloc.hash = r;
|
||||
} else if (!dlocHashEmpty()) {
|
||||
self.dispatch('on', '/' + dloc.hash.replace(/^(#\/|#|\/)/, ''));
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (this.convert_hash_in_init) {
|
||||
// Use hash as route
|
||||
routeTo = dlocHashEmpty() && r ? r : !dlocHashEmpty() ? dloc.hash.replace(/^#/, '') : null;
|
||||
if (routeTo) {
|
||||
window.history.replaceState({}, document.title, routeTo);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Use canonical url
|
||||
routeTo = this.getPath();
|
||||
}
|
||||
|
||||
// Router has been initialized, but due to the chrome bug it will not
|
||||
// yet actually route HTML5 history state changes. Thus, decide if should route.
|
||||
if (routeTo || this.run_in_init === true) {
|
||||
this.handler();
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
Router.prototype.explode = function () {
|
||||
var v = this.history === true ? this.getPath() : dloc.hash;
|
||||
if (v.charAt(1) === '/') { v=v.slice(1) }
|
||||
return v.slice(1, v.length).split("/");
|
||||
};
|
||||
|
||||
Router.prototype.setRoute = function (i, v, val) {
|
||||
var url = this.explode();
|
||||
|
||||
if (typeof i === 'number' && typeof v === 'string') {
|
||||
url[i] = v;
|
||||
}
|
||||
else if (typeof val === 'string') {
|
||||
url.splice(i, v, s);
|
||||
}
|
||||
else {
|
||||
url = [i];
|
||||
}
|
||||
|
||||
listener.setHash(url.join('/'));
|
||||
return url;
|
||||
};
|
||||
|
||||
//
|
||||
// ### function insertEx(method, path, route, parent)
|
||||
// #### @method {string} Method to insert the specific `route`.
|
||||
// #### @path {Array} Parsed path to insert the `route` at.
|
||||
// #### @route {Array|function} Route handlers to insert.
|
||||
// #### @parent {Object} **Optional** Parent "routes" to insert into.
|
||||
// insert a callback that will only occur once per the matched route.
|
||||
//
|
||||
Router.prototype.insertEx = function(method, path, route, parent) {
|
||||
if (method === "once") {
|
||||
method = "on";
|
||||
route = function(route) {
|
||||
var once = false;
|
||||
return function() {
|
||||
if (once) return;
|
||||
once = true;
|
||||
return route.apply(this, arguments);
|
||||
};
|
||||
}(route);
|
||||
}
|
||||
return this._insert(method, path, route, parent);
|
||||
};
|
||||
|
||||
Router.prototype.getRoute = function (v) {
|
||||
var ret = v;
|
||||
|
||||
if (typeof v === "number") {
|
||||
ret = this.explode()[v];
|
||||
}
|
||||
else if (typeof v === "string"){
|
||||
var h = this.explode();
|
||||
ret = h.indexOf(v);
|
||||
}
|
||||
else {
|
||||
ret = this.explode();
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
Router.prototype.destroy = function () {
|
||||
listener.destroy(this.handler);
|
||||
return this;
|
||||
};
|
||||
|
||||
Router.prototype.getPath = function () {
|
||||
var path = window.location.pathname;
|
||||
if (path.substr(0, 1) !== '/') {
|
||||
path = '/' + path;
|
||||
}
|
||||
return path;
|
||||
};
|
||||
function _every(arr, iterator) {
|
||||
for (var i = 0; i < arr.length; i += 1) {
|
||||
if (iterator(arr[i], i, arr) === false) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _flatten(arr) {
|
||||
var flat = [];
|
||||
for (var i = 0, n = arr.length; i < n; i++) {
|
||||
flat = flat.concat(arr[i]);
|
||||
}
|
||||
return flat;
|
||||
}
|
||||
|
||||
function _asyncEverySeries(arr, iterator, callback) {
|
||||
if (!arr.length) {
|
||||
return callback();
|
||||
}
|
||||
var completed = 0;
|
||||
(function iterate() {
|
||||
iterator(arr[completed], function(err) {
|
||||
if (err || err === false) {
|
||||
callback(err);
|
||||
callback = function() {};
|
||||
} else {
|
||||
completed += 1;
|
||||
if (completed === arr.length) {
|
||||
callback();
|
||||
} else {
|
||||
iterate();
|
||||
}
|
||||
}
|
||||
});
|
||||
})();
|
||||
}
|
||||
|
||||
function paramifyString(str, params, mod) {
|
||||
mod = str;
|
||||
for (var param in params) {
|
||||
if (params.hasOwnProperty(param)) {
|
||||
mod = params[param](str);
|
||||
if (mod !== str) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return mod === str ? "([._a-zA-Z0-9-%()]+)" : mod;
|
||||
}
|
||||
|
||||
function regifyString(str, params) {
|
||||
var matches, last = 0, out = "";
|
||||
while (matches = str.substr(last).match(/[^\w\d\- %@&]*\*[^\w\d\- %@&]*/)) {
|
||||
last = matches.index + matches[0].length;
|
||||
matches[0] = matches[0].replace(/^\*/, "([_.()!\\ %@&a-zA-Z0-9-]+)");
|
||||
out += str.substr(0, matches.index) + matches[0];
|
||||
}
|
||||
str = out += str.substr(last);
|
||||
var captures = str.match(/:([^\/]+)/ig), capture, length;
|
||||
if (captures) {
|
||||
length = captures.length;
|
||||
for (var i = 0; i < length; i++) {
|
||||
capture = captures[i];
|
||||
if (capture.slice(0, 2) === "::") {
|
||||
str = capture.slice(1);
|
||||
} else {
|
||||
str = str.replace(capture, paramifyString(capture, params));
|
||||
}
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function terminator(routes, delimiter, start, stop) {
|
||||
var last = 0, left = 0, right = 0, start = (start || "(").toString(), stop = (stop || ")").toString(), i;
|
||||
for (i = 0; i < routes.length; i++) {
|
||||
var chunk = routes[i];
|
||||
if (chunk.indexOf(start, last) > chunk.indexOf(stop, last) || ~chunk.indexOf(start, last) && !~chunk.indexOf(stop, last) || !~chunk.indexOf(start, last) && ~chunk.indexOf(stop, last)) {
|
||||
left = chunk.indexOf(start, last);
|
||||
right = chunk.indexOf(stop, last);
|
||||
if (~left && !~right || !~left && ~right) {
|
||||
var tmp = routes.slice(0, (i || 1) + 1).join(delimiter);
|
||||
routes = [ tmp ].concat(routes.slice((i || 1) + 1));
|
||||
}
|
||||
last = (right > left ? right : left) + 1;
|
||||
i = 0;
|
||||
} else {
|
||||
last = 0;
|
||||
}
|
||||
}
|
||||
return routes;
|
||||
}
|
||||
|
||||
var QUERY_SEPARATOR = /\?.*/;
|
||||
|
||||
Router.prototype.configure = function(options) {
|
||||
options = options || {};
|
||||
for (var i = 0; i < this.methods.length; i++) {
|
||||
this._methods[this.methods[i]] = true;
|
||||
}
|
||||
this.recurse = options.recurse || this.recurse || false;
|
||||
this.async = options.async || false;
|
||||
this.delimiter = options.delimiter || "/";
|
||||
this.strict = typeof options.strict === "undefined" ? true : options.strict;
|
||||
this.notfound = options.notfound;
|
||||
this.resource = options.resource;
|
||||
this.history = options.html5history && this.historySupport || false;
|
||||
this.run_in_init = this.history === true && options.run_handler_in_init !== false;
|
||||
this.convert_hash_in_init = this.history === true && options.convert_hash_in_init !== false;
|
||||
this.every = {
|
||||
after: options.after || null,
|
||||
before: options.before || null,
|
||||
on: options.on || null
|
||||
};
|
||||
return this;
|
||||
};
|
||||
|
||||
Router.prototype.param = function(token, matcher) {
|
||||
if (token[0] !== ":") {
|
||||
token = ":" + token;
|
||||
}
|
||||
var compiled = new RegExp(token, "g");
|
||||
this.params[token] = function(str) {
|
||||
return str.replace(compiled, matcher.source || matcher);
|
||||
};
|
||||
return this;
|
||||
};
|
||||
|
||||
Router.prototype.on = Router.prototype.route = function(method, path, route) {
|
||||
var self = this;
|
||||
if (!route && typeof path == "function") {
|
||||
route = path;
|
||||
path = method;
|
||||
method = "on";
|
||||
}
|
||||
if (Array.isArray(path)) {
|
||||
return path.forEach(function(p) {
|
||||
self.on(method, p, route);
|
||||
});
|
||||
}
|
||||
if (path.source) {
|
||||
path = path.source.replace(/\\\//ig, "/");
|
||||
}
|
||||
if (Array.isArray(method)) {
|
||||
return method.forEach(function(m) {
|
||||
self.on(m.toLowerCase(), path, route);
|
||||
});
|
||||
}
|
||||
path = path.split(new RegExp(this.delimiter));
|
||||
path = terminator(path, this.delimiter);
|
||||
this.insert(method, this.scope.concat(path), route);
|
||||
};
|
||||
|
||||
Router.prototype.path = function(path, routesFn) {
|
||||
var self = this, length = this.scope.length;
|
||||
if (path.source) {
|
||||
path = path.source.replace(/\\\//ig, "/");
|
||||
}
|
||||
path = path.split(new RegExp(this.delimiter));
|
||||
path = terminator(path, this.delimiter);
|
||||
this.scope = this.scope.concat(path);
|
||||
routesFn.call(this, this);
|
||||
this.scope.splice(length, path.length);
|
||||
};
|
||||
|
||||
Router.prototype.dispatch = function(method, path, callback) {
|
||||
var self = this, fns = this.traverse(method, path.replace(QUERY_SEPARATOR, ""), this.routes, ""), invoked = this._invoked, after;
|
||||
this._invoked = true;
|
||||
if (!fns || fns.length === 0) {
|
||||
this.last = [];
|
||||
if (typeof this.notfound === "function") {
|
||||
this.invoke([ this.notfound ], {
|
||||
method: method,
|
||||
path: path
|
||||
}, callback);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (this.recurse === "forward") {
|
||||
fns = fns.reverse();
|
||||
}
|
||||
function updateAndInvoke() {
|
||||
self.last = fns.after;
|
||||
self.invoke(self.runlist(fns), self, callback);
|
||||
}
|
||||
after = this.every && this.every.after ? [ this.every.after ].concat(this.last) : [ this.last ];
|
||||
if (after && after.length > 0 && invoked) {
|
||||
if (this.async) {
|
||||
this.invoke(after, this, updateAndInvoke);
|
||||
} else {
|
||||
this.invoke(after, this);
|
||||
updateAndInvoke();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
updateAndInvoke();
|
||||
return true;
|
||||
};
|
||||
|
||||
Router.prototype.invoke = function(fns, thisArg, callback) {
|
||||
var self = this;
|
||||
var apply;
|
||||
if (this.async) {
|
||||
apply = function(fn, next) {
|
||||
if (Array.isArray(fn)) {
|
||||
return _asyncEverySeries(fn, apply, next);
|
||||
} else if (typeof fn == "function") {
|
||||
fn.apply(thisArg, (fns.captures || []).concat(next));
|
||||
}
|
||||
};
|
||||
_asyncEverySeries(fns, apply, function() {
|
||||
if (callback) {
|
||||
callback.apply(thisArg, arguments);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
apply = function(fn) {
|
||||
if (Array.isArray(fn)) {
|
||||
return _every(fn, apply);
|
||||
} else if (typeof fn === "function") {
|
||||
return fn.apply(thisArg, fns.captures || []);
|
||||
} else if (typeof fn === "string" && self.resource) {
|
||||
self.resource[fn].apply(thisArg, fns.captures || []);
|
||||
}
|
||||
};
|
||||
_every(fns, apply);
|
||||
}
|
||||
};
|
||||
|
||||
Router.prototype.traverse = function(method, path, routes, regexp, filter) {
|
||||
var fns = [], current, exact, match, next, that;
|
||||
function filterRoutes(routes) {
|
||||
if (!filter) {
|
||||
return routes;
|
||||
}
|
||||
function deepCopy(source) {
|
||||
var result = [];
|
||||
for (var i = 0; i < source.length; i++) {
|
||||
result[i] = Array.isArray(source[i]) ? deepCopy(source[i]) : source[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
function applyFilter(fns) {
|
||||
for (var i = fns.length - 1; i >= 0; i--) {
|
||||
if (Array.isArray(fns[i])) {
|
||||
applyFilter(fns[i]);
|
||||
if (fns[i].length === 0) {
|
||||
fns.splice(i, 1);
|
||||
}
|
||||
} else {
|
||||
if (!filter(fns[i])) {
|
||||
fns.splice(i, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var newRoutes = deepCopy(routes);
|
||||
newRoutes.matched = routes.matched;
|
||||
newRoutes.captures = routes.captures;
|
||||
newRoutes.after = routes.after.filter(filter);
|
||||
applyFilter(newRoutes);
|
||||
return newRoutes;
|
||||
}
|
||||
if (path === this.delimiter && routes[method]) {
|
||||
next = [ [ routes.before, routes[method] ].filter(Boolean) ];
|
||||
next.after = [ routes.after ].filter(Boolean);
|
||||
next.matched = true;
|
||||
next.captures = [];
|
||||
return filterRoutes(next);
|
||||
}
|
||||
for (var r in routes) {
|
||||
if (routes.hasOwnProperty(r) && (!this._methods[r] || this._methods[r] && typeof routes[r] === "object" && !Array.isArray(routes[r]))) {
|
||||
current = exact = regexp + this.delimiter + r;
|
||||
if (!this.strict) {
|
||||
exact += "[" + this.delimiter + "]?";
|
||||
}
|
||||
match = path.match(new RegExp("^" + exact));
|
||||
if (!match) {
|
||||
continue;
|
||||
}
|
||||
if (match[0] && match[0] == path && routes[r][method]) {
|
||||
next = [ [ routes[r].before, routes[r][method] ].filter(Boolean) ];
|
||||
next.after = [ routes[r].after ].filter(Boolean);
|
||||
next.matched = true;
|
||||
next.captures = match.slice(1);
|
||||
if (this.recurse && routes === this.routes) {
|
||||
next.push([ routes.before, routes.on ].filter(Boolean));
|
||||
next.after = next.after.concat([ routes.after ].filter(Boolean));
|
||||
}
|
||||
return filterRoutes(next);
|
||||
}
|
||||
next = this.traverse(method, path, routes[r], current);
|
||||
if (next.matched) {
|
||||
if (next.length > 0) {
|
||||
fns = fns.concat(next);
|
||||
}
|
||||
if (this.recurse) {
|
||||
fns.push([ routes[r].before, routes[r].on ].filter(Boolean));
|
||||
next.after = next.after.concat([ routes[r].after ].filter(Boolean));
|
||||
if (routes === this.routes) {
|
||||
fns.push([ routes["before"], routes["on"] ].filter(Boolean));
|
||||
next.after = next.after.concat([ routes["after"] ].filter(Boolean));
|
||||
}
|
||||
}
|
||||
fns.matched = true;
|
||||
fns.captures = next.captures;
|
||||
fns.after = next.after;
|
||||
return filterRoutes(fns);
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
Router.prototype.insert = function(method, path, route, parent) {
|
||||
var methodType, parentType, isArray, nested, part;
|
||||
path = path.filter(function(p) {
|
||||
return p && p.length > 0;
|
||||
});
|
||||
parent = parent || this.routes;
|
||||
part = path.shift();
|
||||
if (/\:|\*/.test(part) && !/\\d|\\w/.test(part)) {
|
||||
part = regifyString(part, this.params);
|
||||
}
|
||||
if (path.length > 0) {
|
||||
parent[part] = parent[part] || {};
|
||||
return this.insert(method, path, route, parent[part]);
|
||||
}
|
||||
if (!part && !path.length && parent === this.routes) {
|
||||
methodType = typeof parent[method];
|
||||
switch (methodType) {
|
||||
case "function":
|
||||
parent[method] = [ parent[method], route ];
|
||||
return;
|
||||
case "object":
|
||||
parent[method].push(route);
|
||||
return;
|
||||
case "undefined":
|
||||
parent[method] = route;
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
parentType = typeof parent[part];
|
||||
isArray = Array.isArray(parent[part]);
|
||||
if (parent[part] && !isArray && parentType == "object") {
|
||||
methodType = typeof parent[part][method];
|
||||
switch (methodType) {
|
||||
case "function":
|
||||
parent[part][method] = [ parent[part][method], route ];
|
||||
return;
|
||||
case "object":
|
||||
parent[part][method].push(route);
|
||||
return;
|
||||
case "undefined":
|
||||
parent[part][method] = route;
|
||||
return;
|
||||
}
|
||||
} else if (parentType == "undefined") {
|
||||
nested = {};
|
||||
nested[method] = route;
|
||||
parent[part] = nested;
|
||||
return;
|
||||
}
|
||||
throw new Error("Invalid route context: " + parentType);
|
||||
};
|
||||
|
||||
|
||||
|
||||
Router.prototype.extend = function(methods) {
|
||||
var self = this, len = methods.length, i;
|
||||
function extend(method) {
|
||||
self._methods[method] = true;
|
||||
self[method] = function() {
|
||||
var extra = arguments.length === 1 ? [ method, "" ] : [ method ];
|
||||
self.on.apply(self, extra.concat(Array.prototype.slice.call(arguments)));
|
||||
};
|
||||
}
|
||||
for (i = 0; i < len; i++) {
|
||||
extend(methods[i]);
|
||||
}
|
||||
};
|
||||
|
||||
Router.prototype.runlist = function(fns) {
|
||||
var runlist = this.every && this.every.before ? [ this.every.before ].concat(_flatten(fns)) : _flatten(fns);
|
||||
if (this.every && this.every.on) {
|
||||
runlist.push(this.every.on);
|
||||
}
|
||||
runlist.captures = fns.captures;
|
||||
runlist.source = fns.source;
|
||||
return runlist;
|
||||
};
|
||||
|
||||
Router.prototype.mount = function(routes, path) {
|
||||
if (!routes || typeof routes !== "object" || Array.isArray(routes)) {
|
||||
return;
|
||||
}
|
||||
var self = this;
|
||||
path = path || [];
|
||||
if (!Array.isArray(path)) {
|
||||
path = path.split(self.delimiter);
|
||||
}
|
||||
function insertOrMount(route, local) {
|
||||
var rename = route, parts = route.split(self.delimiter), routeType = typeof routes[route], isRoute = parts[0] === "" || !self._methods[parts[0]], event = isRoute ? "on" : rename;
|
||||
if (isRoute) {
|
||||
rename = rename.slice((rename.match(new RegExp("^" + self.delimiter)) || [ "" ])[0].length);
|
||||
parts.shift();
|
||||
}
|
||||
if (isRoute && routeType === "object" && !Array.isArray(routes[route])) {
|
||||
local = local.concat(parts);
|
||||
self.mount(routes[route], local);
|
||||
return;
|
||||
}
|
||||
if (isRoute) {
|
||||
local = local.concat(rename.split(self.delimiter));
|
||||
local = terminator(local, self.delimiter);
|
||||
}
|
||||
self.insert(event, local, routes[route]);
|
||||
}
|
||||
for (var route in routes) {
|
||||
if (routes.hasOwnProperty(route)) {
|
||||
insertOrMount(route, path.slice(0));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
}(typeof exports === "object" ? exports : window));
|
||||
File diff suppressed because one or more lines are too long
3
resources/todomvc/architecture-examples/jquery/node_modules/director/dist/ender.js
generated
vendored
3
resources/todomvc/architecture-examples/jquery/node_modules/director/dist/ender.js
generated
vendored
|
|
@ -1,3 +0,0 @@
|
|||
$.ender({
|
||||
router: Router
|
||||
});
|
||||
41
resources/todomvc/architecture-examples/jquery/node_modules/director/package.json
generated
vendored
41
resources/todomvc/architecture-examples/jquery/node_modules/director/package.json
generated
vendored
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"name": "director",
|
||||
"description": "A client Side/Server Side Router",
|
||||
"author": "Charlie Robbins <charlie.robbins@gmail.com>",
|
||||
"version": "1.2.8",
|
||||
"maintainers": [
|
||||
"hij1nx <paolo@nodejitsu.com>",
|
||||
"beaugunderson <beau@beaugunderson.com>"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/flatiron/director.git"
|
||||
},
|
||||
"keywords": [
|
||||
"URL",
|
||||
"router",
|
||||
"http",
|
||||
"cli",
|
||||
"flatiron",
|
||||
"client side",
|
||||
"ender"
|
||||
],
|
||||
"devDependencies": {
|
||||
"api-easy": "0.4.x",
|
||||
"codesurgeon": "https://github.com/hij1nx/codesurgeon/tarball/master",
|
||||
"colors": "1.0.x",
|
||||
"qunitjs": "1.9.x",
|
||||
"request": "2.49.x",
|
||||
"uglify-js": "2.4.x",
|
||||
"vows": "0.8.0"
|
||||
},
|
||||
"ender": "./build/ender.js",
|
||||
"browserify": "./build/director",
|
||||
"main": "./lib/director",
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "vows test/server/*/*-test.js --spec"
|
||||
}
|
||||
}
|
||||
4713
resources/todomvc/architecture-examples/jquery/node_modules/handlebars/dist/handlebars.js
generated
vendored
4713
resources/todomvc/architecture-examples/jquery/node_modules/handlebars/dist/handlebars.js
generated
vendored
File diff suppressed because one or more lines are too long
10220
resources/todomvc/architecture-examples/jquery/node_modules/jquery/dist/jquery.js
generated
vendored
10220
resources/todomvc/architecture-examples/jquery/node_modules/jquery/dist/jquery.js
generated
vendored
File diff suppressed because it is too large
Load diff
376
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/index.css
generated
vendored
376
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/index.css
generated
vendored
|
|
@ -1,376 +0,0 @@
|
|||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
button {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: none;
|
||||
font-size: 100%;
|
||||
vertical-align: baseline;
|
||||
font-family: inherit;
|
||||
font-weight: inherit;
|
||||
color: inherit;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
body {
|
||||
font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
line-height: 1.4em;
|
||||
background: #f5f5f5;
|
||||
color: #4d4d4d;
|
||||
min-width: 230px;
|
||||
max-width: 550px;
|
||||
margin: 0 auto;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todoapp {
|
||||
background: #fff;
|
||||
margin: 130px 0 40px 0;
|
||||
position: relative;
|
||||
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
|
||||
0 25px 50px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.todoapp input::-webkit-input-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
color: #e6e6e6;
|
||||
}
|
||||
|
||||
.todoapp input::-moz-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
color: #e6e6e6;
|
||||
}
|
||||
|
||||
.todoapp input::input-placeholder {
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
color: #e6e6e6;
|
||||
}
|
||||
|
||||
.todoapp h1 {
|
||||
position: absolute;
|
||||
top: -155px;
|
||||
width: 100%;
|
||||
font-size: 100px;
|
||||
font-weight: 100;
|
||||
text-align: center;
|
||||
color: rgba(175, 47, 47, 0.15);
|
||||
-webkit-text-rendering: optimizeLegibility;
|
||||
-moz-text-rendering: optimizeLegibility;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
.new-todo,
|
||||
.edit {
|
||||
position: relative;
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
font-size: 24px;
|
||||
font-family: inherit;
|
||||
font-weight: inherit;
|
||||
line-height: 1.4em;
|
||||
border: 0;
|
||||
color: inherit;
|
||||
padding: 6px;
|
||||
border: 1px solid #999;
|
||||
box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
box-sizing: border-box;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.new-todo {
|
||||
padding: 16px 16px 16px 60px;
|
||||
border: none;
|
||||
background: rgba(0, 0, 0, 0.003);
|
||||
box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
|
||||
}
|
||||
|
||||
.main {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
border-top: 1px solid #e6e6e6;
|
||||
}
|
||||
|
||||
.toggle-all {
|
||||
text-align: center;
|
||||
border: none; /* Mobile Safari */
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.toggle-all + label {
|
||||
width: 60px;
|
||||
height: 34px;
|
||||
font-size: 0;
|
||||
position: absolute;
|
||||
top: -52px;
|
||||
left: -13px;
|
||||
-webkit-transform: rotate(90deg);
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.toggle-all + label:before {
|
||||
content: '❯';
|
||||
font-size: 22px;
|
||||
color: #e6e6e6;
|
||||
padding: 10px 27px 10px 27px;
|
||||
}
|
||||
|
||||
.toggle-all:checked + label:before {
|
||||
color: #737373;
|
||||
}
|
||||
|
||||
.todo-list {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.todo-list li {
|
||||
position: relative;
|
||||
font-size: 24px;
|
||||
border-bottom: 1px solid #ededed;
|
||||
}
|
||||
|
||||
.todo-list li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.todo-list li.editing {
|
||||
border-bottom: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.todo-list li.editing .edit {
|
||||
display: block;
|
||||
width: 506px;
|
||||
padding: 12px 16px;
|
||||
margin: 0 0 0 43px;
|
||||
}
|
||||
|
||||
.todo-list li.editing .view {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
text-align: center;
|
||||
width: 40px;
|
||||
/* auto, since non-WebKit browsers doesn't support input styling */
|
||||
height: auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
margin: auto 0;
|
||||
border: none; /* Mobile Safari */
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.todo-list li .toggle + label {
|
||||
/*
|
||||
Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
|
||||
IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
|
||||
*/
|
||||
background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center left;
|
||||
}
|
||||
|
||||
.todo-list li .toggle:checked + label {
|
||||
background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
|
||||
}
|
||||
|
||||
.todo-list li label {
|
||||
word-break: break-all;
|
||||
padding: 15px 15px 15px 60px;
|
||||
display: block;
|
||||
line-height: 1.2;
|
||||
transition: color 0.4s;
|
||||
}
|
||||
|
||||
.todo-list li.completed label {
|
||||
color: #d9d9d9;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.todo-list li .destroy {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 10px;
|
||||
bottom: 0;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin: auto 0;
|
||||
font-size: 30px;
|
||||
color: #cc9a9a;
|
||||
margin-bottom: 11px;
|
||||
transition: color 0.2s ease-out;
|
||||
}
|
||||
|
||||
.todo-list li .destroy:hover {
|
||||
color: #af5b5e;
|
||||
}
|
||||
|
||||
.todo-list li .destroy:after {
|
||||
content: '×';
|
||||
}
|
||||
|
||||
.todo-list li:hover .destroy {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.todo-list li .edit {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.todo-list li.editing:last-child {
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
color: #777;
|
||||
padding: 10px 15px;
|
||||
height: 20px;
|
||||
text-align: center;
|
||||
border-top: 1px solid #e6e6e6;
|
||||
}
|
||||
|
||||
.footer:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
height: 50px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
|
||||
0 8px 0 -3px #f6f6f6,
|
||||
0 9px 1px -3px rgba(0, 0, 0, 0.2),
|
||||
0 16px 0 -6px #f6f6f6,
|
||||
0 17px 2px -6px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.todo-count {
|
||||
float: left;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.todo-count strong {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.filters {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.filters li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.filters li a {
|
||||
color: inherit;
|
||||
margin: 3px;
|
||||
padding: 3px 7px;
|
||||
text-decoration: none;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.filters li a:hover {
|
||||
border-color: rgba(175, 47, 47, 0.1);
|
||||
}
|
||||
|
||||
.filters li a.selected {
|
||||
border-color: rgba(175, 47, 47, 0.2);
|
||||
}
|
||||
|
||||
.clear-completed,
|
||||
html .clear-completed:active {
|
||||
float: right;
|
||||
position: relative;
|
||||
line-height: 20px;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.clear-completed:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.info {
|
||||
margin: 65px auto 0;
|
||||
color: #bfbfbf;
|
||||
font-size: 10px;
|
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.info p {
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.info a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.info a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/*
|
||||
Hack to remove background from Mobile Safari.
|
||||
Can't use it globally since it destroys checkboxes in Firefox
|
||||
*/
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
.toggle-all,
|
||||
.todo-list li .toggle {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.todo-list li .toggle {
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 430px) {
|
||||
.footer {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.filters {
|
||||
bottom: 10px;
|
||||
}
|
||||
}
|
||||
58
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/package.json
generated
vendored
58
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/package.json
generated
vendored
|
|
@ -1,58 +0,0 @@
|
|||
{
|
||||
"_from": "todomvc-app-css@^2.1.0",
|
||||
"_id": "todomvc-app-css@2.1.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
|
||||
"_location": "/todomvc-app-css",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "todomvc-app-css@^2.1.0",
|
||||
"name": "todomvc-app-css",
|
||||
"escapedName": "todomvc-app-css",
|
||||
"rawSpec": "^2.1.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^2.1.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
|
||||
"_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
|
||||
"_spec": "todomvc-app-css@^2.1.0",
|
||||
"_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/tastejs/todomvc-app-css/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "CSS for TodoMVC apps",
|
||||
"files": [
|
||||
"index.css"
|
||||
],
|
||||
"homepage": "https://github.com/tastejs/todomvc-app-css#readme",
|
||||
"keywords": [
|
||||
"todomvc",
|
||||
"tastejs",
|
||||
"app",
|
||||
"todo",
|
||||
"template",
|
||||
"css",
|
||||
"style",
|
||||
"stylesheet"
|
||||
],
|
||||
"license": "CC-BY-4.0",
|
||||
"name": "todomvc-app-css",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/tastejs/todomvc-app-css.git"
|
||||
},
|
||||
"style": "index.css",
|
||||
"version": "2.1.0"
|
||||
}
|
||||
28
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/readme.md
generated
vendored
28
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/readme.md
generated
vendored
|
|
@ -1,28 +0,0 @@
|
|||
# todomvc-app-css
|
||||
|
||||
> CSS for TodoMVC apps
|
||||
|
||||

|
||||
|
||||
|
||||
## Install
|
||||
|
||||
|
||||
```
|
||||
$ npm install --save todomvc-app-css
|
||||
```
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
```html
|
||||
<link rel="stylesheet" href="node_modules/todomvc-app-css/index.css">
|
||||
```
|
||||
|
||||
See the [TodoMVC app template](https://github.com/tastejs/todomvc-app-template).
|
||||
|
||||
|
||||
|
||||
## License
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/deed.en_US"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/4.0/80x15.png" /></a><br />This <span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/InteractiveResource" rel="dct:type">work</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://sindresorhus.com" property="cc:attributionName" rel="cc:attributionURL">Sindre Sorhus</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/deed.en_US">Creative Commons Attribution 4.0 International License</a>.
|
||||
141
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/base.css
generated
vendored
141
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/base.css
generated
vendored
|
|
@ -1,141 +0,0 @@
|
|||
hr {
|
||||
margin: 20px 0;
|
||||
border: 0;
|
||||
border-top: 1px dashed #c5c5c5;
|
||||
border-bottom: 1px dashed #f7f7f7;
|
||||
}
|
||||
|
||||
.learn a {
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
color: #b83f45;
|
||||
}
|
||||
|
||||
.learn a:hover {
|
||||
text-decoration: underline;
|
||||
color: #787e7e;
|
||||
}
|
||||
|
||||
.learn h3,
|
||||
.learn h4,
|
||||
.learn h5 {
|
||||
margin: 10px 0;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.learn h3 {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.learn h4 {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.learn h5 {
|
||||
margin-bottom: 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.learn ul {
|
||||
padding: 0;
|
||||
margin: 0 0 30px 25px;
|
||||
}
|
||||
|
||||
.learn li {
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.learn p {
|
||||
font-size: 15px;
|
||||
font-weight: 300;
|
||||
line-height: 1.3;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#issue-count {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.quote {
|
||||
border: none;
|
||||
margin: 20px 0 60px 0;
|
||||
}
|
||||
|
||||
.quote p {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.quote p:before {
|
||||
content: '“';
|
||||
font-size: 50px;
|
||||
opacity: .15;
|
||||
position: absolute;
|
||||
top: -20px;
|
||||
left: 3px;
|
||||
}
|
||||
|
||||
.quote p:after {
|
||||
content: '”';
|
||||
font-size: 50px;
|
||||
opacity: .15;
|
||||
position: absolute;
|
||||
bottom: -42px;
|
||||
right: 3px;
|
||||
}
|
||||
|
||||
.quote footer {
|
||||
position: absolute;
|
||||
bottom: -40px;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.quote footer img {
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.quote footer a {
|
||||
margin-left: 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.speech-bubble {
|
||||
position: relative;
|
||||
padding: 10px;
|
||||
background: rgba(0, 0, 0, .04);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.speech-bubble:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
right: 30px;
|
||||
border: 13px solid transparent;
|
||||
border-top-color: rgba(0, 0, 0, .04);
|
||||
}
|
||||
|
||||
.learn-bar > .learn {
|
||||
position: absolute;
|
||||
width: 272px;
|
||||
top: 8px;
|
||||
left: -300px;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
background-color: rgba(255, 255, 255, .6);
|
||||
transition-property: left;
|
||||
transition-duration: 500ms;
|
||||
}
|
||||
|
||||
@media (min-width: 899px) {
|
||||
.learn-bar {
|
||||
width: auto;
|
||||
padding-left: 300px;
|
||||
}
|
||||
|
||||
.learn-bar > .learn {
|
||||
left: 8px;
|
||||
}
|
||||
}
|
||||
249
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/base.js
generated
vendored
249
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/base.js
generated
vendored
|
|
@ -1,249 +0,0 @@
|
|||
/* global _ */
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
/* jshint ignore:start */
|
||||
// Underscore's Template Module
|
||||
// Courtesy of underscorejs.org
|
||||
var _ = (function (_) {
|
||||
_.defaults = function (object) {
|
||||
if (!object) {
|
||||
return object;
|
||||
}
|
||||
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
|
||||
var iterable = arguments[argsIndex];
|
||||
if (iterable) {
|
||||
for (var key in iterable) {
|
||||
if (object[key] == null) {
|
||||
object[key] = iterable[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return object;
|
||||
};
|
||||
|
||||
// By default, Underscore uses ERB-style template delimiters, change the
|
||||
// following template settings to use alternative delimiters.
|
||||
_.templateSettings = {
|
||||
evaluate : /<%([\s\S]+?)%>/g,
|
||||
interpolate : /<%=([\s\S]+?)%>/g,
|
||||
escape : /<%-([\s\S]+?)%>/g
|
||||
};
|
||||
|
||||
// When customizing `templateSettings`, if you don't want to define an
|
||||
// interpolation, evaluation or escaping regex, we need one that is
|
||||
// guaranteed not to match.
|
||||
var noMatch = /(.)^/;
|
||||
|
||||
// Certain characters need to be escaped so that they can be put into a
|
||||
// string literal.
|
||||
var escapes = {
|
||||
"'": "'",
|
||||
'\\': '\\',
|
||||
'\r': 'r',
|
||||
'\n': 'n',
|
||||
'\t': 't',
|
||||
'\u2028': 'u2028',
|
||||
'\u2029': 'u2029'
|
||||
};
|
||||
|
||||
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
|
||||
|
||||
// JavaScript micro-templating, similar to John Resig's implementation.
|
||||
// Underscore templating handles arbitrary delimiters, preserves whitespace,
|
||||
// and correctly escapes quotes within interpolated code.
|
||||
_.template = function(text, data, settings) {
|
||||
var render;
|
||||
settings = _.defaults({}, settings, _.templateSettings);
|
||||
|
||||
// Combine delimiters into one regular expression via alternation.
|
||||
var matcher = new RegExp([
|
||||
(settings.escape || noMatch).source,
|
||||
(settings.interpolate || noMatch).source,
|
||||
(settings.evaluate || noMatch).source
|
||||
].join('|') + '|$', 'g');
|
||||
|
||||
// Compile the template source, escaping string literals appropriately.
|
||||
var index = 0;
|
||||
var source = "__p+='";
|
||||
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
|
||||
source += text.slice(index, offset)
|
||||
.replace(escaper, function(match) { return '\\' + escapes[match]; });
|
||||
|
||||
if (escape) {
|
||||
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
|
||||
}
|
||||
if (interpolate) {
|
||||
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
|
||||
}
|
||||
if (evaluate) {
|
||||
source += "';\n" + evaluate + "\n__p+='";
|
||||
}
|
||||
index = offset + match.length;
|
||||
return match;
|
||||
});
|
||||
source += "';\n";
|
||||
|
||||
// If a variable is not specified, place data values in local scope.
|
||||
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
|
||||
|
||||
source = "var __t,__p='',__j=Array.prototype.join," +
|
||||
"print=function(){__p+=__j.call(arguments,'');};\n" +
|
||||
source + "return __p;\n";
|
||||
|
||||
try {
|
||||
render = new Function(settings.variable || 'obj', '_', source);
|
||||
} catch (e) {
|
||||
e.source = source;
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (data) return render(data, _);
|
||||
var template = function(data) {
|
||||
return render.call(this, data, _);
|
||||
};
|
||||
|
||||
// Provide the compiled function source as a convenience for precompilation.
|
||||
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
|
||||
|
||||
return template;
|
||||
};
|
||||
|
||||
return _;
|
||||
})({});
|
||||
|
||||
if (location.hostname === 'todomvc.com') {
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-31081062-1', 'auto');
|
||||
ga('send', 'pageview');
|
||||
}
|
||||
/* jshint ignore:end */
|
||||
|
||||
function redirect() {
|
||||
if (location.hostname === 'tastejs.github.io') {
|
||||
location.href = location.href.replace('tastejs.github.io/todomvc', 'todomvc.com');
|
||||
}
|
||||
}
|
||||
|
||||
function findRoot() {
|
||||
var base = location.href.indexOf('examples/');
|
||||
return location.href.substr(0, base);
|
||||
}
|
||||
|
||||
function getFile(file, callback) {
|
||||
if (!location.host) {
|
||||
return console.info('Miss the info bar? Run TodoMVC from a server to avoid a cross-origin error.');
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
xhr.open('GET', findRoot() + file, true);
|
||||
xhr.send();
|
||||
|
||||
xhr.onload = function () {
|
||||
if (xhr.status === 200 && callback) {
|
||||
callback(xhr.responseText);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function Learn(learnJSON, config) {
|
||||
if (!(this instanceof Learn)) {
|
||||
return new Learn(learnJSON, config);
|
||||
}
|
||||
|
||||
var template, framework;
|
||||
|
||||
if (typeof learnJSON !== 'object') {
|
||||
try {
|
||||
learnJSON = JSON.parse(learnJSON);
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (config) {
|
||||
template = config.template;
|
||||
framework = config.framework;
|
||||
}
|
||||
|
||||
if (!template && learnJSON.templates) {
|
||||
template = learnJSON.templates.todomvc;
|
||||
}
|
||||
|
||||
if (!framework && document.querySelector('[data-framework]')) {
|
||||
framework = document.querySelector('[data-framework]').dataset.framework;
|
||||
}
|
||||
|
||||
this.template = template;
|
||||
|
||||
if (learnJSON.backend) {
|
||||
this.frameworkJSON = learnJSON.backend;
|
||||
this.frameworkJSON.issueLabel = framework;
|
||||
this.append({
|
||||
backend: true
|
||||
});
|
||||
} else if (learnJSON[framework]) {
|
||||
this.frameworkJSON = learnJSON[framework];
|
||||
this.frameworkJSON.issueLabel = framework;
|
||||
this.append();
|
||||
}
|
||||
|
||||
this.fetchIssueCount();
|
||||
}
|
||||
|
||||
Learn.prototype.append = function (opts) {
|
||||
var aside = document.createElement('aside');
|
||||
aside.innerHTML = _.template(this.template, this.frameworkJSON);
|
||||
aside.className = 'learn';
|
||||
|
||||
if (opts && opts.backend) {
|
||||
// Remove demo link
|
||||
var sourceLinks = aside.querySelector('.source-links');
|
||||
var heading = sourceLinks.firstElementChild;
|
||||
var sourceLink = sourceLinks.lastElementChild;
|
||||
// Correct link path
|
||||
var href = sourceLink.getAttribute('href');
|
||||
sourceLink.setAttribute('href', href.substr(href.lastIndexOf('http')));
|
||||
sourceLinks.innerHTML = heading.outerHTML + sourceLink.outerHTML;
|
||||
} else {
|
||||
// Localize demo links
|
||||
var demoLinks = aside.querySelectorAll('.demo-link');
|
||||
Array.prototype.forEach.call(demoLinks, function (demoLink) {
|
||||
if (demoLink.getAttribute('href').substr(0, 4) !== 'http') {
|
||||
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
document.body.className = (document.body.className + ' learn-bar').trim();
|
||||
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
|
||||
};
|
||||
|
||||
Learn.prototype.fetchIssueCount = function () {
|
||||
var issueLink = document.getElementById('issue-count-link');
|
||||
if (issueLink) {
|
||||
var url = issueLink.href.replace('https://github.com', 'https://api.github.com/repos');
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('GET', url, true);
|
||||
xhr.onload = function (e) {
|
||||
var parsedResponse = JSON.parse(e.target.responseText);
|
||||
if (parsedResponse instanceof Array) {
|
||||
var count = parsedResponse.length;
|
||||
if (count !== 0) {
|
||||
issueLink.innerHTML = 'This app has ' + count + ' open issues';
|
||||
document.getElementById('issue-count').style.display = 'inline';
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
}
|
||||
};
|
||||
|
||||
redirect();
|
||||
getFile('learn.json', Learn);
|
||||
})();
|
||||
54
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/package.json
generated
vendored
54
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/package.json
generated
vendored
|
|
@ -1,54 +0,0 @@
|
|||
{
|
||||
"_from": "todomvc-common@^1.0.4",
|
||||
"_id": "todomvc-common@1.0.4",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
|
||||
"_location": "/todomvc-common",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "todomvc-common@^1.0.4",
|
||||
"name": "todomvc-common",
|
||||
"escapedName": "todomvc-common",
|
||||
"rawSpec": "^1.0.4",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^1.0.4"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
|
||||
"_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
|
||||
"_spec": "todomvc-common@^1.0.4",
|
||||
"_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery",
|
||||
"author": {
|
||||
"name": "TasteJS"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/tastejs/todomvc-common/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "Common TodoMVC utilities used by our apps",
|
||||
"files": [
|
||||
"base.js",
|
||||
"base.css"
|
||||
],
|
||||
"homepage": "https://github.com/tastejs/todomvc-common#readme",
|
||||
"keywords": [
|
||||
"todomvc",
|
||||
"tastejs",
|
||||
"util",
|
||||
"utilities"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "base.js",
|
||||
"name": "todomvc-common",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/tastejs/todomvc-common.git"
|
||||
},
|
||||
"style": "base.css",
|
||||
"version": "1.0.4"
|
||||
}
|
||||
15
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/readme.md
generated
vendored
15
resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/readme.md
generated
vendored
|
|
@ -1,15 +0,0 @@
|
|||
# todomvc-common
|
||||
|
||||
> Common TodoMVC utilities used by our apps
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install --save todomvc-common
|
||||
```
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT © [TasteJS](http://tastejs.com)
|
||||
488
resources/todomvc/architecture-examples/jquery/package-lock.json
generated
Normal file
488
resources/todomvc/architecture-examples/jquery/package-lock.json
generated
Normal file
|
|
@ -0,0 +1,488 @@
|
|||
{
|
||||
"name": "jquery",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"director": "^1.2.2",
|
||||
"handlebars": "^4.0.6",
|
||||
"jquery": "^3.6.3",
|
||||
"todomvc-app-css": "^2.4.2",
|
||||
"todomvc-common": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/align-text": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||
"integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"kind-of": "^3.0.2",
|
||||
"longest": "^1.0.1",
|
||||
"repeat-string": "^1.5.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/amdefine": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||
"integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
|
||||
"engines": {
|
||||
"node": ">=0.4.2"
|
||||
}
|
||||
},
|
||||
"node_modules/async": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||
"integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w=="
|
||||
},
|
||||
"node_modules/camelcase": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||
"integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/center-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||
"integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"align-text": "^0.1.3",
|
||||
"lazy-cache": "^1.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cliui": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
|
||||
"integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"center-align": "^0.1.1",
|
||||
"right-align": "^0.1.1",
|
||||
"wordwrap": "0.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/cliui/node_modules/wordwrap": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||
"integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/decamelize": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/director": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/director/-/director-1.2.2.tgz",
|
||||
"integrity": "sha512-Vwhxfrqy0D2mlw4hykU9KR2aUZNZPyIcMgP6spI6+3qGjp+h1X5ym8BxE/S1HNgEiNilZyy3r67qcn7MmqLmTw==",
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/handlebars": {
|
||||
"version": "4.0.6",
|
||||
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.6.tgz",
|
||||
"integrity": "sha512-czW7QLC0pHb9EE3w6H8AZGyX6TYxBJhLCW/cGpZmrsLrozhSoIlV7CEOeNG40sXClmDvvKa8ACuHaLYa1Kf62Q==",
|
||||
"dependencies": {
|
||||
"async": "^1.4.0",
|
||||
"optimist": "^0.6.1",
|
||||
"source-map": "^0.4.4"
|
||||
},
|
||||
"bin": {
|
||||
"handlebars": "bin/handlebars"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.7"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"uglify-js": "^2.6"
|
||||
}
|
||||
},
|
||||
"node_modules/is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/jquery": {
|
||||
"version": "3.6.4",
|
||||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz",
|
||||
"integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ=="
|
||||
},
|
||||
"node_modules/kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"is-buffer": "^1.1.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/lazy-cache": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
|
||||
"integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/longest": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/minimist": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw=="
|
||||
},
|
||||
"node_modules/optimist": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||
"integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==",
|
||||
"dependencies": {
|
||||
"minimist": "~0.0.1",
|
||||
"wordwrap": "~0.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/repeat-string": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
||||
"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/right-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||
"integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"align-text": "^0.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map": {
|
||||
"version": "0.4.4",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
|
||||
"integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
|
||||
"dependencies": {
|
||||
"amdefine": ">=0.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/todomvc-app-css": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.4.2.tgz",
|
||||
"integrity": "sha512-ViAkQ7ed89rmhFIGRsT36njN+97z8+s3XsJnB8E2IKOq+/SLD/6PtSvmTtiwUcVk39qPcjAc/OyeDys4LoJUVg=="
|
||||
},
|
||||
"node_modules/todomvc-common": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.5.tgz",
|
||||
"integrity": "sha512-D8kEJmxVMQIWwztEdH+WeiAfXRbbSCpgXq4NkYi+gduJ2tr8CNq7sYLfJvjpQ10KD9QxJwig57rvMbV2QAESwQ=="
|
||||
},
|
||||
"node_modules/uglify-js": {
|
||||
"version": "2.8.29",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
|
||||
"integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"source-map": "~0.5.1",
|
||||
"yargs": "~3.10.0"
|
||||
},
|
||||
"bin": {
|
||||
"uglifyjs": "bin/uglifyjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"uglify-to-browserify": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uglify-js/node_modules/source-map": {
|
||||
"version": "0.5.7",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uglify-to-browserify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||
"integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/window-size": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
||||
"integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/wordwrap": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
"integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==",
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/yargs": {
|
||||
"version": "3.10.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||
"integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"camelcase": "^1.0.2",
|
||||
"cliui": "^2.1.0",
|
||||
"decamelize": "^1.0.0",
|
||||
"window-size": "0.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"align-text": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||
"integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2",
|
||||
"longest": "^1.0.1",
|
||||
"repeat-string": "^1.5.2"
|
||||
}
|
||||
},
|
||||
"amdefine": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||
"integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg=="
|
||||
},
|
||||
"async": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||
"integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w=="
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||
"integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==",
|
||||
"optional": true
|
||||
},
|
||||
"center-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||
"integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"align-text": "^0.1.3",
|
||||
"lazy-cache": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"cliui": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
|
||||
"integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"center-align": "^0.1.1",
|
||||
"right-align": "^0.1.1",
|
||||
"wordwrap": "0.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"wordwrap": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||
"integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==",
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"decamelize": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
|
||||
"optional": true
|
||||
},
|
||||
"director": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/director/-/director-1.2.2.tgz",
|
||||
"integrity": "sha512-Vwhxfrqy0D2mlw4hykU9KR2aUZNZPyIcMgP6spI6+3qGjp+h1X5ym8BxE/S1HNgEiNilZyy3r67qcn7MmqLmTw=="
|
||||
},
|
||||
"handlebars": {
|
||||
"version": "4.0.6",
|
||||
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.6.tgz",
|
||||
"integrity": "sha512-czW7QLC0pHb9EE3w6H8AZGyX6TYxBJhLCW/cGpZmrsLrozhSoIlV7CEOeNG40sXClmDvvKa8ACuHaLYa1Kf62Q==",
|
||||
"requires": {
|
||||
"async": "^1.4.0",
|
||||
"optimist": "^0.6.1",
|
||||
"source-map": "^0.4.4",
|
||||
"uglify-js": "^2.6"
|
||||
}
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
|
||||
"optional": true
|
||||
},
|
||||
"jquery": {
|
||||
"version": "3.6.4",
|
||||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz",
|
||||
"integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ=="
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"is-buffer": "^1.1.5"
|
||||
}
|
||||
},
|
||||
"lazy-cache": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
|
||||
"integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
|
||||
"optional": true
|
||||
},
|
||||
"longest": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==",
|
||||
"optional": true
|
||||
},
|
||||
"minimist": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw=="
|
||||
},
|
||||
"optimist": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||
"integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==",
|
||||
"requires": {
|
||||
"minimist": "~0.0.1",
|
||||
"wordwrap": "~0.0.2"
|
||||
}
|
||||
},
|
||||
"repeat-string": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
||||
"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
|
||||
"optional": true
|
||||
},
|
||||
"right-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||
"integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"align-text": "^0.1.1"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.4.4",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
|
||||
"integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
|
||||
"requires": {
|
||||
"amdefine": ">=0.0.4"
|
||||
}
|
||||
},
|
||||
"todomvc-app-css": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.4.2.tgz",
|
||||
"integrity": "sha512-ViAkQ7ed89rmhFIGRsT36njN+97z8+s3XsJnB8E2IKOq+/SLD/6PtSvmTtiwUcVk39qPcjAc/OyeDys4LoJUVg=="
|
||||
},
|
||||
"todomvc-common": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.5.tgz",
|
||||
"integrity": "sha512-D8kEJmxVMQIWwztEdH+WeiAfXRbbSCpgXq4NkYi+gduJ2tr8CNq7sYLfJvjpQ10KD9QxJwig57rvMbV2QAESwQ=="
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "2.8.29",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
|
||||
"integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"source-map": "~0.5.1",
|
||||
"uglify-to-browserify": "~1.0.0",
|
||||
"yargs": "~3.10.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.5.7",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"uglify-to-browserify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||
"integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==",
|
||||
"optional": true
|
||||
},
|
||||
"window-size": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
||||
"integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==",
|
||||
"optional": true
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
"integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw=="
|
||||
},
|
||||
"yargs": {
|
||||
"version": "3.10.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||
"integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"camelcase": "^1.0.2",
|
||||
"cliui": "^2.1.0",
|
||||
"decamelize": "^1.0.0",
|
||||
"window-size": "0.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,13 @@
|
|||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "node scripts/build.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"director": "~1.2.2",
|
||||
"handlebars": "^4.0.6",
|
||||
"jquery": "^3.1.1",
|
||||
"todomvc-app-css": "^2.1.0",
|
||||
"todomvc-common": "^1.0.4"
|
||||
"jquery": "^3.6.3",
|
||||
"todomvc-app-css": "^2.4.2",
|
||||
"todomvc-common": "^1.0.5"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,33 +1,41 @@
|
|||
# jQuery TodoMVC Example
|
||||
# Speedometer 3.0: TodoMVC: jQuery
|
||||
|
||||
> jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.
|
||||
## Description
|
||||
|
||||
> _[jQuery - jquery.com](http://jquery.com)_
|
||||
This application uses jQuery to implement a todo application.
|
||||
|
||||
jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.
|
||||
|
||||
## Learning jQuery
|
||||
[jQuery.com](https://jquery.com/)
|
||||
|
||||
The [jQuery website](http://jquery.com) is a great resource for getting started.
|
||||
## Implementation details
|
||||
|
||||
Here are some links you may find helpful:
|
||||
[TBD]
|
||||
|
||||
* [Learning Center](http://learn.jquery.com/)
|
||||
* [API Reference](http://api.jquery.com)
|
||||
* [Plugins](http://plugins.jquery.com)
|
||||
* [Browser Support](http://jquery.com/browser-support)
|
||||
* [Blog](http://blog.jquery.com)
|
||||
## Built steps
|
||||
|
||||
Articles and guides from the community:
|
||||
A simple build script copies all necessary files to a `dist` folder.
|
||||
It does not rely on compilers or transpilers and serves raw html, css and js files to the user.
|
||||
|
||||
* [Try jQuery](http://try.jquery.com)
|
||||
* [jQuery Annotated Source](http://github.com/robflaherty/jquery-annotated-source)
|
||||
* [10 Things I Learned From the jQuery Source](http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source)
|
||||
```
|
||||
npm run build
|
||||
```
|
||||
|
||||
Get help from other jQuery users:
|
||||
## Requirements
|
||||
|
||||
* [jQuery on StackOverflow](http://stackoverflow.com/questions/tagged/jquery)
|
||||
* [Forums](http://forum.jquery.com)
|
||||
* [jQuery on Twitter](http://twitter.com/jquery)
|
||||
* [jQuery on Google +](https://plus.google.com/102828491884671003608/posts)
|
||||
The only requirement is an installation of Node, to be able to install dependencies and run scripts to serve a local server.
|
||||
|
||||
_If you have other helpful links to share, or find any of the links above no longer work, please [let us know](https://github.com/tastejs/todomvc/issues)._
|
||||
```
|
||||
* Node (min version: 18.13.0)
|
||||
* NPM (min version: 8.19.3)
|
||||
```
|
||||
|
||||
## Local preview
|
||||
|
||||
```
|
||||
terminal:
|
||||
1. npm install
|
||||
2. npm run dev
|
||||
browser:
|
||||
1. http://localhost:7001/
|
||||
```
|
||||
|
|
|
|||
57
resources/todomvc/architecture-examples/jquery/scripts/build.js
vendored
Normal file
57
resources/todomvc/architecture-examples/jquery/scripts/build.js
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
const fs = require("fs").promises;
|
||||
|
||||
const rootDirectory = "./";
|
||||
const sourceDirectory = "./src";
|
||||
const targetDirectory = "./dist";
|
||||
|
||||
const htmlFile = "index.html";
|
||||
|
||||
const filesToMove = ["node_modules/todomvc-common/base.css", "node_modules/todomvc-app-css/index.css", "node_modules/jquery/dist/jquery.min.js", "node_modules/handlebars/dist/handlebars.min.js", "node_modules/director/build/director.min.js"];
|
||||
|
||||
const copy = async (src, dest) => {
|
||||
await fs.copyFile(src, dest);
|
||||
};
|
||||
|
||||
const build = async () => {
|
||||
// remove dist directory if it exists
|
||||
await fs.rm(targetDirectory, { recursive: true, force: true });
|
||||
|
||||
// re-create the directory.
|
||||
await fs.mkdir(targetDirectory);
|
||||
|
||||
// copy src folder
|
||||
await fs.cp(sourceDirectory, targetDirectory, { recursive: true }, (err) => {
|
||||
if (err)
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
// copy html file
|
||||
await fs.copyFile(`${rootDirectory}${htmlFile}`, `${targetDirectory}/${htmlFile}`);
|
||||
|
||||
// copy files to move
|
||||
for (let i = 0; i < filesToMove.length; i++) {
|
||||
const fileName = filesToMove[i].split("/").pop();
|
||||
await copy(filesToMove[i], `${targetDirectory}/${fileName}`);
|
||||
}
|
||||
|
||||
// read html file
|
||||
let html = await fs.readFile(`${targetDirectory}/${htmlFile}`, "utf8");
|
||||
|
||||
// remove base paths from files to move
|
||||
for (let i = 0; i < filesToMove.length; i++) {
|
||||
const fileName = filesToMove[i].split("/").pop();
|
||||
html = html.replace(filesToMove[i], fileName);
|
||||
}
|
||||
|
||||
// remove basePath from source directory
|
||||
const basePath = `${sourceDirectory.split("/")[1]}/`;
|
||||
const re = new RegExp(basePath, "g");
|
||||
html = html.replace(re, "");
|
||||
|
||||
// write html files
|
||||
await fs.writeFile(`${targetDirectory}/${htmlFile}`, html);
|
||||
|
||||
console.log("done!!");
|
||||
};
|
||||
|
||||
build();
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
#main,
|
||||
#footer {
|
||||
display: none;
|
||||
}
|
||||
196
resources/todomvc/architecture-examples/jquery/src/app.js
vendored
Normal file
196
resources/todomvc/architecture-examples/jquery/src/app.js
vendored
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
/*global jQuery, Handlebars, Router */
|
||||
jQuery(function ($) {
|
||||
'use strict';
|
||||
|
||||
Handlebars.registerHelper('eq', function (a, b, options) {
|
||||
return a === b ? options.fn(this) : options.inverse(this);
|
||||
});
|
||||
|
||||
|
||||
var util = {
|
||||
uuid: function () {
|
||||
/*jshint bitwise:false */
|
||||
var i, random;
|
||||
var uuid = '';
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
random = Math.random() * 16 | 0;
|
||||
if (i === 8 || i === 12 || i === 16 || i === 20) {
|
||||
uuid += '-';
|
||||
}
|
||||
uuid += (i === 12 ? 4 : (i === 16 ? (random & 3 | 8) : random)).toString(16);
|
||||
}
|
||||
|
||||
return uuid;
|
||||
},
|
||||
pluralize: function (count, word) {
|
||||
return count === 1 ? word : word + 's';
|
||||
},
|
||||
store: function (namespace, data) {
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
var App = {
|
||||
ENTER_KEY: 13,
|
||||
ESCAPE_KEY: 27,
|
||||
init: function () {
|
||||
this.todos = util.store('todos-jquery');
|
||||
this.todoTemplate = Handlebars.compile($('#todo-template').html());
|
||||
this.footerTemplate = Handlebars.compile($('#footer-template').html());
|
||||
this.bindEvents();
|
||||
|
||||
new Router({
|
||||
'/:filter': function (filter) {
|
||||
this.filter = filter;
|
||||
this.render();
|
||||
}.bind(this)
|
||||
}).init('/all');
|
||||
|
||||
var dummyNodeToNotifyAppIsReady = document.createElement('div');
|
||||
dummyNodeToNotifyAppIsReady.id = 'appIsReady';
|
||||
document.body.appendChild(dummyNodeToNotifyAppIsReady);
|
||||
},
|
||||
bindEvents: function () {
|
||||
$('#new-todo').on('keyup', this.create.bind(this));
|
||||
$('#toggle-all').on('change', this.toggleAll.bind(this));
|
||||
$('#footer').on('click', '#clear-completed', this.destroyCompleted.bind(this));
|
||||
$('#todo-list')
|
||||
.on('change', '.toggle', this.toggle.bind(this))
|
||||
.on('dblclick', 'label', this.edit.bind(this))
|
||||
.on('keyup', '.edit', this.editKeyup.bind(this))
|
||||
.on('focusout', '.edit', this.update.bind(this))
|
||||
.on('click', '.destroy', this.destroy.bind(this));
|
||||
},
|
||||
render: function () {
|
||||
var todos = this.getFilteredTodos();
|
||||
$('#todo-list').html(this.todoTemplate(todos));
|
||||
$('#main').toggle(todos.length > 0);
|
||||
$('#toggle-all').prop('checked', this.getActiveTodos().length === 0);
|
||||
this.renderFooter();
|
||||
$('#new-todo').focus();
|
||||
util.store('todos-jquery', this.todos);
|
||||
},
|
||||
renderFooter: function () {
|
||||
var todoCount = this.todos.length;
|
||||
var activeTodoCount = this.getActiveTodos().length;
|
||||
var template = this.footerTemplate({
|
||||
activeTodoCount: activeTodoCount,
|
||||
activeTodoWord: util.pluralize(activeTodoCount, 'item'),
|
||||
completedTodos: todoCount - activeTodoCount,
|
||||
filter: this.filter
|
||||
});
|
||||
|
||||
$('#footer').toggle(todoCount > 0).html(template);
|
||||
},
|
||||
toggleAll: function (e) {
|
||||
var isChecked = $(e.target).prop('checked');
|
||||
|
||||
this.todos.forEach(function (todo) {
|
||||
todo.completed = isChecked;
|
||||
});
|
||||
|
||||
this.render();
|
||||
},
|
||||
getActiveTodos: function () {
|
||||
return this.todos.filter(function (todo) {
|
||||
return !todo.completed;
|
||||
});
|
||||
},
|
||||
getCompletedTodos: function () {
|
||||
return this.todos.filter(function (todo) {
|
||||
return todo.completed;
|
||||
});
|
||||
},
|
||||
getFilteredTodos: function () {
|
||||
if (this.filter === 'active') {
|
||||
return this.getActiveTodos();
|
||||
}
|
||||
|
||||
if (this.filter === 'completed') {
|
||||
return this.getCompletedTodos();
|
||||
}
|
||||
|
||||
return this.todos;
|
||||
},
|
||||
destroyCompleted: function () {
|
||||
this.todos = this.getActiveTodos();
|
||||
this.filter = 'all';
|
||||
this.render();
|
||||
},
|
||||
// accepts an element from inside the `.item` div and
|
||||
// returns the corresponding index in the `todos` array
|
||||
indexFromEl: function (el) {
|
||||
var id = $(el).closest('li').data('id');
|
||||
var todos = this.todos;
|
||||
var i = todos.length;
|
||||
|
||||
while (i--) {
|
||||
if (todos[i].id === id) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
},
|
||||
create: function (e) {
|
||||
var $input = $(e.target);
|
||||
var val = $.trim($input.val());
|
||||
|
||||
if (e.which !== this.ENTER_KEY || !val) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.todos.push({
|
||||
id: util.uuid(),
|
||||
title: val,
|
||||
completed: false
|
||||
});
|
||||
|
||||
$input.val('');
|
||||
|
||||
this.render();
|
||||
},
|
||||
toggle: function (e) {
|
||||
var i = this.indexFromEl(e.target);
|
||||
this.todos[i].completed = !this.todos[i].completed;
|
||||
this.render();
|
||||
},
|
||||
edit: function (e) {
|
||||
var $input = $(e.target).closest('li').addClass('editing').find('.edit');
|
||||
$input.val($input.val()).focus();
|
||||
},
|
||||
editKeyup: function (e) {
|
||||
if (e.which === this.ENTER_KEY) {
|
||||
e.target.blur();
|
||||
}
|
||||
|
||||
if (e.which === this.ESCAPE_KEY) {
|
||||
$(e.target).data('abort', true).blur();
|
||||
}
|
||||
},
|
||||
update: function (e) {
|
||||
var el = e.target;
|
||||
var $el = $(el);
|
||||
var val = $el.val().trim();
|
||||
|
||||
if (!val) {
|
||||
this.destroy(e);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($el.data('abort')) {
|
||||
$el.data('abort', false);
|
||||
} else {
|
||||
this.todos[this.indexFromEl(el)].title = val;
|
||||
}
|
||||
|
||||
this.render();
|
||||
},
|
||||
destroy: function (e) {
|
||||
this.todos.splice(this.indexFromEl(e.target), 1);
|
||||
this.render();
|
||||
}
|
||||
};
|
||||
|
||||
window.app = App;
|
||||
window.app.init();
|
||||
});
|
||||
Loading…
Reference in a new issue