conjur-asset-ui 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +7 -0
  2. data/.git-hooks/pre_commit/ensure_livescript_compiled.rb +31 -0
  3. data/.git-hooks/pre_commit/trailing_whitespace.rb +26 -0
  4. data/.gitignore +20 -0
  5. data/.overcommit.yml +5 -0
  6. data/.project +18 -0
  7. data/CHANGELOG.md +3 -0
  8. data/Gemfile +8 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +41 -0
  11. data/Rakefile +3 -0
  12. data/compile_ls +6 -0
  13. data/conjur-asset-ui.gemspec +37 -0
  14. data/lib/conjur/command/ui.rb +46 -0
  15. data/lib/conjur/webserver/api_proxy.rb +94 -0
  16. data/lib/conjur/webserver/authorize.rb +28 -0
  17. data/lib/conjur/webserver/conjur_info.rb +33 -0
  18. data/lib/conjur/webserver/home.rb +42 -0
  19. data/lib/conjur/webserver/login.rb +57 -0
  20. data/lib/conjur/webserver/renderer.rb +34 -0
  21. data/lib/conjur/webserver/server.rb +113 -0
  22. data/lib/conjur-asset-ui-version.rb +7 -0
  23. data/lib/conjur-asset-ui.rb +7 -0
  24. data/livescript/views/audit.ls +136 -0
  25. data/public/_client_code.html +42 -0
  26. data/public/_client_libs.html +24 -0
  27. data/public/css/bootstrap.css +7 -0
  28. data/public/css/styles.less +461 -0
  29. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  30. data/public/fonts/glyphicons-halflings-regular.svg +229 -0
  31. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  32. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  33. data/public/images/conjur-logo.svg +26 -0
  34. data/public/images/icon-client-pc.svg +12 -0
  35. data/public/images/icon-environment.png +0 -0
  36. data/public/images/icon-person.svg +12 -0
  37. data/public/images/icon-policy.png +0 -0
  38. data/public/images/icon-resource.png +0 -0
  39. data/public/images/icon-service-dots.svg +13 -0
  40. data/public/images/icon-variable.png +0 -0
  41. data/public/index.html.erb +62 -0
  42. data/public/js/init.js +107 -0
  43. data/public/js/lib/JSXTransformer.js +10862 -0
  44. data/public/js/lib/async.js +958 -0
  45. data/public/js/lib/backbone.js +2 -0
  46. data/public/js/lib/bootstrap.js +6 -0
  47. data/public/js/lib/date.extensions.js +141 -0
  48. data/public/js/lib/less.js +16 -0
  49. data/public/js/lib/moment.js +7768 -0
  50. data/public/js/lib/pace.js +2 -0
  51. data/public/js/lib/prelude-browser-min.js +1 -0
  52. data/public/js/lib/react-bootstrap.js +5346 -0
  53. data/public/js/lib/react-bootstrap.min.js +4 -0
  54. data/public/js/lib/sorted-set.no-require.js +1170 -0
  55. data/public/js/lib/sorted-set.no-require.js.txt +6 -0
  56. data/public/js/lib/underscore-min.js +6 -0
  57. data/public/js/lib/underscore.string.min.js +1 -0
  58. data/public/js/main.js +57 -0
  59. data/public/js/models/groupRecord.js +70 -0
  60. data/public/js/models/hostRecord.js +55 -0
  61. data/public/js/models/layerRecord.js +77 -0
  62. data/public/js/models/namespace.js +10 -0
  63. data/public/js/models/policyList.js +14 -0
  64. data/public/js/models/policyRecord.js +54 -0
  65. data/public/js/models/record.js +85 -0
  66. data/public/js/models/resourceList.js +69 -0
  67. data/public/js/models/userList.js +20 -0
  68. data/public/js/models/userRecord.js +70 -0
  69. data/public/js/models/variableList.js +16 -0
  70. data/public/js/models/variableRecord.js +73 -0
  71. data/public/js/routers.js +205 -0
  72. data/public/js/views/annotations.js +36 -0
  73. data/public/js/views/audit.js +363 -0
  74. data/public/js/views/dashboard.js +67 -0
  75. data/public/js/views/generic.js +115 -0
  76. data/public/js/views/group.js +61 -0
  77. data/public/js/views/groups.js +30 -0
  78. data/public/js/views/host.js +64 -0
  79. data/public/js/views/hosts.js +30 -0
  80. data/public/js/views/layer.js +92 -0
  81. data/public/js/views/layers.js +30 -0
  82. data/public/js/views/mixins/search.js +15 -0
  83. data/public/js/views/mixins/tabs.js +114 -0
  84. data/public/js/views/namespaces.js +40 -0
  85. data/public/js/views/navSearch.js +25 -0
  86. data/public/js/views/owned.js +178 -0
  87. data/public/js/views/permissions.js +188 -0
  88. data/public/js/views/policies.js +28 -0
  89. data/public/js/views/policy.js +43 -0
  90. data/public/js/views/resource.js +39 -0
  91. data/public/js/views/role.js +41 -0
  92. data/public/js/views/searchResults.js +145 -0
  93. data/public/js/views/time.js +14 -0
  94. data/public/js/views/user.js +68 -0
  95. data/public/js/views/users.js +31 -0
  96. data/public/js/views/variable.js +70 -0
  97. data/public/js/views/variables.js +30 -0
  98. data/spec/javascripts/helpers/.gitkeep +0 -0
  99. data/spec/javascripts/support/jasmine.yml +112 -0
  100. data/spec/javascripts/support/jasmine_helper.rb +22 -0
  101. data/spec/javascripts/support/run.html.erb +23 -0
  102. data/spec/javascripts/views/AuditSpec.js +22 -0
  103. data/spec/javascripts/views/AuditSpec.ls +18 -0
  104. data/vendor/prelude-ls/.gitignore +2 -0
  105. data/vendor/prelude-ls/.travis.yml +3 -0
  106. data/vendor/prelude-ls/CHANGELOG.md +81 -0
  107. data/vendor/prelude-ls/LICENSE +22 -0
  108. data/vendor/prelude-ls/Makefile +50 -0
  109. data/vendor/prelude-ls/README.md +15 -0
  110. data/vendor/prelude-ls/browser/prelude-browser-min.js +1 -0
  111. data/vendor/prelude-ls/browser/prelude-browser.js +1172 -0
  112. data/vendor/prelude-ls/lib/Func.js +40 -0
  113. data/vendor/prelude-ls/lib/List.js +602 -0
  114. data/vendor/prelude-ls/lib/Num.js +129 -0
  115. data/vendor/prelude-ls/lib/Obj.js +153 -0
  116. data/vendor/prelude-ls/lib/Str.js +68 -0
  117. data/vendor/prelude-ls/lib/index.js +164 -0
  118. data/vendor/prelude-ls/package.json +50 -0
  119. data/vendor/prelude-ls/package.ls +46 -0
  120. data/vendor/prelude-ls/src/Func.ls +17 -0
  121. data/vendor/prelude-ls/src/List.ls +299 -0
  122. data/vendor/prelude-ls/src/Num.ls +83 -0
  123. data/vendor/prelude-ls/src/Obj.ls +61 -0
  124. data/vendor/prelude-ls/src/Str.ls +32 -0
  125. data/vendor/prelude-ls/src/index.ls +56 -0
  126. data/vendor/prelude-ls/test/Func.ls +36 -0
  127. data/vendor/prelude-ls/test/List.ls +751 -0
  128. data/vendor/prelude-ls/test/Num.ls +258 -0
  129. data/vendor/prelude-ls/test/Obj.ls +145 -0
  130. data/vendor/prelude-ls/test/Prelude.ls +49 -0
  131. data/vendor/prelude-ls/test/Str.ls +208 -0
  132. data/vendor/prelude-ls/test/browser.html +5 -0
  133. metadata +369 -0
@@ -0,0 +1,68 @@
1
+ /** @jsx React.DOM */
2
+
3
+ //var ReactBootstrap=root.ReactBootstrap;
4
+ var TabbedArea = ReactBootstrap.TabbedArea;
5
+ var TabPane = ReactBootstrap.TabPane;
6
+
7
+ var User = React.createClass({
8
+ mixins: [conjur.views.mixins.Tab],
9
+ render: function(){
10
+ var user = this.props.data.user;
11
+
12
+ // TODO: refactor
13
+ // TODO: show public keys
14
+ // TODO: actions menu (e.g. 'upload public key', 'add annotation')
15
+ // TODO: memberships panel
16
+ var overview_tab =
17
+ <TabPane key="overview" tab="Overview">
18
+ <dl className="dl-horizontal">
19
+ <dt>Created by</dt>
20
+ <dd><RoleLink id={user.userid}/></dd>
21
+ <dt>Owner</dt>
22
+ <dd><RoleLink id={user.ownerid}/></dd>
23
+ <dt>Uidnumber</dt>
24
+ <dd>{user.uidnumber}</dd>
25
+ </dl>
26
+ </TabPane>;
27
+
28
+ var audit_tab=
29
+ <TabPane key="audit" tab="Recent Activity">
30
+ <div className="audit auditUser">
31
+ <AuditBox roles={[user.roleid]} resources={[user.resource_identifier]} tabview={true}/>
32
+ </div>
33
+ </TabPane>;
34
+
35
+ var pubkeys_list = this.props.data.pubkeys.map(function(k) {
36
+ var tokens = k.split(" ");
37
+ return <li className="list-group-item list-group-item-noborder">
38
+ <span className="badge">{tokens[0]}</span>
39
+ {tokens[tokens.length-1]}
40
+ </li>
41
+ });
42
+ var pubkeys_tab = <TabPane key="pubkeys" tab={get_tabname("Public Keys", this.props.data.pubkeys)}>
43
+ <div className="pubkeys pubkeysUser">
44
+ <ul className="list-group">
45
+ {pubkeys_list}
46
+ </ul>
47
+ </div>
48
+ </TabPane>;
49
+
50
+ var permissions_tab = this.permissions_tab(user.roleid);
51
+ var memberships_tab = this.memberships_tab(user.roleid);
52
+ var annotations_tab = this.annotations_tab();
53
+ var owned_tab = this.owned_tab();
54
+
55
+ var tabs=_.compact([overview_tab, owned_tab, memberships_tab,
56
+ permissions_tab, annotations_tab, pubkeys_tab, audit_tab]);
57
+
58
+
59
+ return (
60
+ <div className="user">
61
+ <h2> User {user.login} </h2>
62
+ <TabbedArea defaultActiveKey="overview">
63
+ {tabs}
64
+ </TabbedArea>
65
+ </div>
66
+ );
67
+ }
68
+ });
@@ -0,0 +1,31 @@
1
+ /** @jsx React.DOM */
2
+
3
+ (function(conjur, React) {
4
+ 'use strict';
5
+
6
+ var GenericList = conjur.views.GenericList;
7
+
8
+ var UserBox = this.UserBox = React.createClass({
9
+ // no more external manipulation of state
10
+ //getInitialState: function() {
11
+ // return { currentNamespace: "", members: [] };
12
+ //},
13
+ render: function() {
14
+ // <NamespaceFilter currentNamespace={this.props.currentNamespace}
15
+ // namespaces={this.props.data.namespaces} />
16
+ return (
17
+ <div className="userBox">
18
+ <div className="userList">
19
+ <h2>Users</h2>
20
+ <GenericList data={{kind: 'users', members: this.props.data.members}} />
21
+ </div>
22
+ </div>
23
+ );
24
+ }
25
+ });
26
+
27
+ }).bind(conjur.views)
28
+ (
29
+ conjur,
30
+ React
31
+ );
@@ -0,0 +1,70 @@
1
+ /** @jsx React.DOM */
2
+
3
+ var Variable = React.createClass({
4
+ mixins: [conjur.views.mixins.Tab],
5
+ render: function() {
6
+ var updaters = this.props.data.updaters.map(function (member) {
7
+ return <li className="list-group-item list-group-item-noborder">
8
+ <RoleLink id={member} />
9
+ </li>
10
+ }.bind(this));
11
+ var fetchers = this.props.data.fetchers.map(function (member) {
12
+ return <li className="list-group-item list-group-item-noborder">
13
+ <RoleLink id={member} />
14
+ </li>
15
+ }.bind(this));
16
+ var resourceId = [ conjur.app.configuration.account, 'variable', this.props.data.variable.id ].join(':');
17
+
18
+
19
+
20
+
21
+ var overview_tab =
22
+ <TabPane key="overview" tab="Overview">
23
+ <dl className="dl-horizontal">
24
+ <dt>Owner</dt>
25
+ <dd><RoleLink id={this.props.data.variable.ownerid}/></dd>
26
+ <dt>Created by</dt>
27
+ <dd><RoleLink id={this.props.data.variable.userid}/></dd>
28
+ <dt>MIME type</dt>
29
+ <dd>{this.props.data.variable.mime_type}</dd>
30
+ <dt>Kind</dt>
31
+ <dd>{this.props.data.variable.kind}</dd>
32
+ <dt>Versions</dt>
33
+ <dd>{this.props.data.variable.version_count}</dd>
34
+ </dl>
35
+ </TabPane>;
36
+ var updaters_tab =
37
+ <TabPane key="updaters" tab={get_tabname("Updaters",updaters)}>
38
+ <ul className="list-group">
39
+ {updaters}
40
+ </ul>
41
+ </TabPane>;
42
+ var fetchers_tab =
43
+ <TabPane key="fetchers" tab={get_tabname("Fetchers",fetchers)}>
44
+ <ul className="list-group">
45
+ {fetchers}
46
+ </ul>
47
+ </TabPane>;
48
+ var annotations_tab = this.annotations_tab();
49
+
50
+ var audit_tab =
51
+ <TabPane key="audit" tab="Recent Activity">
52
+ <div className="audit auditHost">
53
+ <AuditBox resources={[resourceId]} tabview={true}/>
54
+ </div>
55
+ </TabPane>;
56
+
57
+
58
+ var tabs = _.compact([ overview_tab, updaters_tab, fetchers_tab,
59
+ annotations_tab, audit_tab ]);
60
+
61
+ return (
62
+ <div className="variable">
63
+ <h2>Variable {this.props.data.variable.id}</h2>
64
+ <TabbedArea defaultActiveKey="overview">
65
+ {tabs}
66
+ </TabbedArea>
67
+ </div>
68
+ );
69
+ }
70
+ });
@@ -0,0 +1,30 @@
1
+ /** @jsx React.DOM */
2
+
3
+ (function(conjur, React) {
4
+ 'use strict';
5
+
6
+ var GenericList = conjur.views.GenericList;
7
+
8
+ var VariableBox = this.VariableBox = React.createClass({
9
+ // getInitialState: function() {
10
+ // return { currentNamespace: "", members: [] };
11
+ // },
12
+ render: function() {
13
+ // <NamespaceFilter currentNamespace={this.props.currentNamespace}
14
+ // namespaces={this.props.data.namespaces} />
15
+ return (
16
+ <div className="groupBox">
17
+ <div className="groupList">
18
+ <h2>Variables</h2>
19
+ <GenericList data={{kind: 'variables', members: this.props.data.members}} />
20
+ </div>
21
+ </div>
22
+ );
23
+ }
24
+ });
25
+
26
+ }).bind(conjur.views)
27
+ (
28
+ conjur,
29
+ React
30
+ );
File without changes
@@ -0,0 +1,112 @@
1
+ # src_files
2
+ #
3
+ # Return an array of filepaths relative to src_dir to include before jasmine specs.
4
+ # Default: []
5
+ #
6
+ # EXAMPLE:
7
+ #
8
+ # src_files:
9
+ # - lib/source1.js
10
+ # - lib/source2.js
11
+ # - dist/**/*.js
12
+ #
13
+ src_files:
14
+ - public/js/**/*.js
15
+
16
+ # stylesheets
17
+ #
18
+ # Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
19
+ # Default: []
20
+ #
21
+ # EXAMPLE:
22
+ #
23
+ # stylesheets:
24
+ # - css/style.css
25
+ # - stylesheets/*.css
26
+ #
27
+ stylesheets:
28
+ - stylesheets/**/*.css
29
+
30
+ # helpers
31
+ #
32
+ # Return an array of filepaths relative to spec_dir to include before jasmine specs.
33
+ # Default: ["helpers/**/*.js"]
34
+ #
35
+ # EXAMPLE:
36
+ #
37
+ # helpers:
38
+ # - helpers/**/*.js
39
+ #
40
+ helpers:
41
+ - 'helpers/**/*.js'
42
+
43
+ # spec_files
44
+ #
45
+ # Return an array of filepaths relative to spec_dir to include.
46
+ # Default: ["**/*[sS]pec.js"]
47
+ #
48
+ # EXAMPLE:
49
+ #
50
+ # spec_files:
51
+ # - **/*[sS]pec.js
52
+ #
53
+ spec_files:
54
+ - '**/*[sS]pec.js'
55
+
56
+ # src_dir
57
+ #
58
+ # Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
59
+ # Default: project root
60
+ #
61
+ # EXAMPLE:
62
+ #
63
+ # src_dir: public
64
+ #
65
+ src_dir: public
66
+
67
+ # spec_dir
68
+ #
69
+ # Spec directory path. Your spec_files must be returned relative to this path.
70
+ # Default: spec/javascripts
71
+ #
72
+ # EXAMPLE:
73
+ #
74
+ # spec_dir: spec/javascripts
75
+ #
76
+ spec_dir:
77
+
78
+ # spec_helper
79
+ #
80
+ # Ruby file that Jasmine server will require before starting.
81
+ # Returned relative to your root path
82
+ # Default spec/javascripts/support/jasmine_helper.rb
83
+ #
84
+ # EXAMPLE:
85
+ #
86
+ # spec_helper: spec/javascripts/support/jasmine_helper.rb
87
+ #
88
+ spec_helper: spec/javascripts/support/jasmine_helper.rb
89
+
90
+ # boot_dir
91
+ #
92
+ # Boot directory path. Your boot_files must be returned relative to this path.
93
+ # Default: Built in boot file
94
+ #
95
+ # EXAMPLE:
96
+ #
97
+ # boot_dir: spec/javascripts/support/boot
98
+ #
99
+ boot_dir:
100
+
101
+ # boot_files
102
+ #
103
+ # Return an array of filepaths relative to boot_dir to include in order to boot Jasmine
104
+ # Default: Built in boot file
105
+ #
106
+ # EXAMPLE
107
+ #
108
+ # boot_files:
109
+ # - '**/*.js'
110
+ #
111
+ boot_files:
112
+
@@ -0,0 +1,22 @@
1
+ require 'conjur/webserver/renderer'
2
+
3
+ # use our own runner template
4
+ module Jasmine
5
+ def self.runner_template
6
+ File.read(File.join(File.dirname(__FILE__), "run.html.erb"))
7
+ end
8
+ end
9
+
10
+ Jasmine.configure do |config|
11
+ class << config
12
+ def renderer
13
+ @renderer ||= Conjur::WebServer::Renderer.new src_dir
14
+ end
15
+
16
+ def method_missing *a, &b
17
+ renderer.send(*a, &b)
18
+ rescue NoMethodError
19
+ super
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2
+ <html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <title>Jasmine suite</title>
7
+ <link rel="shortcut icon" type="image/png" href="/__images__/jasmine_favicon.png">
8
+ <% css_files.each do |css_file| %>
9
+ <link rel="stylesheet" href="<%= css_file %>" type="text/css" media="screen"/>
10
+ <% end %>
11
+
12
+ <%= client_libs %>
13
+ <%= client_code %>
14
+
15
+ </head>
16
+ <!-- TODO: turbolinks breaks spec filter links -->
17
+ <body data-no-turbolink>
18
+ <div id="jasmine_content"></div>
19
+ <% js_files.each do |js_file| %>
20
+ <script src="<%= js_file %>" type="text/javascript"></script>
21
+ <% end %>
22
+ </body>
23
+ </html>
@@ -0,0 +1,22 @@
1
+ // Generated by LiveScript 1.2.0
2
+ (function(){
3
+ var renderComponent;
4
+ renderComponent = React.renderComponent;
5
+ describe('AuditEntry', function(_){
6
+ return it('shows both role and resource on role checks', function(){
7
+ var role, resource, table, x$;
8
+ role = 'the-role';
9
+ resource = 'the-resource';
10
+ renderComponent(AuditEntry({
11
+ kind: 'role',
12
+ action: 'check',
13
+ role: "acct:rolkind:" + role,
14
+ resource: "acct:reskind:" + resource
15
+ }), table = document.createElement('table'));
16
+ x$ = expect(table.innerText);
17
+ x$.toContain(role);
18
+ x$.toContain(resource);
19
+ return x$;
20
+ });
21
+ });
22
+ }).call(this);
@@ -0,0 +1,18 @@
1
+ {render-component} = React
2
+
3
+ describe \AuditEntry, (_)->
4
+ it 'shows both role and resource on role checks', ->
5
+ role = 'the-role'
6
+ resource = 'the-resource'
7
+
8
+ render-component do
9
+ AuditEntry do
10
+ kind: \role
11
+ action: \check
12
+ role: "acct:rolkind:#role"
13
+ resource: "acct:reskind:#resource"
14
+ table = document.create-element \table
15
+
16
+ expect table.inner-text
17
+ ..to-contain role
18
+ ..to-contain resource
@@ -0,0 +1,2 @@
1
+ *.swp
2
+ node_modules
@@ -0,0 +1,3 @@
1
+ language: node_js
2
+ node_js:
3
+ - 0.8
@@ -0,0 +1,81 @@
1
+ # 1.0.3
2
+ - build browser versions
3
+
4
+ # 1.0.2
5
+ - bug fix for `flatten` - slight change with bug fix, flattens arrays only, not array-like objects
6
+
7
+ # 1.0.1
8
+ - bug fixes for `drop-while` and `take-while`
9
+
10
+ # 1.0.0
11
+ * massive update - separated functions into separate modules
12
+ * functions do not accept multiple types anymore - use different versions in their respective modules in some cases (eg. `Obj.map`), or use `chars` or `values` in other cases to transform into a list
13
+ * objects are no longer transformed into functions, simply use `(obj.)` in LiveScript to do that
14
+ * browser version now using browserify - use `prelude = require('prelude-ls')`
15
+ * added `compact`, `split`, `flatten`, `difference`, `intersection`, `union`, `count-by`, `group-by`, `chars`, `unchars`, `apply`
16
+ * added `lists-to-obj` which takes a list of keys and list of values and zips them up into an object, and the converse `obj-to-lists`
17
+ * added `pairs-to-obj` which takes a list of pairs (2 element lists) and creates an object, and the converse `obj-to-pairs`
18
+ * removed `cons`, `append` - use the concat operator
19
+ * removed `compose` - use the compose operator
20
+ * removed `obj-to-func` - use partially applied access (eg. `(obj.)`)
21
+ * removed `length` - use `(.length)`
22
+ * `sort-by` renamed to `sort-with`
23
+ * added new `sort-by`
24
+ * removed `compare` - just use the new `sort-by`
25
+ * `break-it` renamed `break-list`, (`Str.break-str` for the string version)
26
+ * added `Str.repeat` which creates a new string by repeating the input n times
27
+ * `unfold` as alias to `unfoldr` is no longer used
28
+ * fixed up style and compiled with LiveScript 1.1.1
29
+ * use Make instead of Slake
30
+ * greatly improved tests
31
+
32
+ # 0.6.0
33
+ * fixed various bugs
34
+ * added `fix`, a fixpoint (Y combinator) for anonymous recursive functions
35
+ * added `unfoldr` (alias `unfold`)
36
+ * calling `replicate` with a string now returns a list of strings
37
+ * removed `partial`, just use native partial application in LiveScript using the `_` placeholder, or currying
38
+ * added `sort`, `sortBy`, and `compare`
39
+
40
+ # 0.5.0
41
+ * removed `lookup` - use (.prop)
42
+ * removed `call` - use (.func arg1, arg2)
43
+ * removed `pluck` - use map (.prop), xs
44
+ * fixed buys wtih `head` and `last`
45
+ * added non-minifed browser version, as `prelude-browser.js`
46
+ * renamed `prelude-min.js` to `prelude-browser-min.js`
47
+ * renamed `zip` to `zipAll`
48
+ * renamed `zipWith` to `zipAllWith`
49
+ * added `zip`, a curried zip that takes only two arguments
50
+ * added `zipWith`, a curried zipWith that takes only two arguments
51
+
52
+ # 0.4.0
53
+ * added `parition` function
54
+ * added `curry` function
55
+ * removed `elem` function (use `in`)
56
+ * removed `notElem` function (use `not in`)
57
+
58
+ # 0.3.0
59
+ * added `listToObject`
60
+ * added `unique`
61
+ * added `objToFunc`
62
+ * added support for using strings in map and the like
63
+ * added support for using objects in map and the like
64
+ * added ability to use objects instead of functions in certain cases
65
+ * removed `error` (just use throw)
66
+ * added `tau` constant
67
+ * added `join`
68
+ * added `values`
69
+ * added `keys`
70
+ * added `partial`
71
+ * renamed `log` to `ln`
72
+ * added alias to `head`: `first`
73
+ * added `installPrelude` helper
74
+
75
+ # 0.2.0
76
+ * removed functions that simply warp operators as you can now use operators as functions in LiveScript
77
+ * `min/max` are now curried and take only 2 arguments
78
+ * added `call`
79
+
80
+ # 0.1.0
81
+ * initial public release
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 George Zahariev
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,50 @@
1
+ default: all
2
+
3
+ SRC = $(shell find src -name "*.ls" -type f | sort)
4
+ LIB = $(SRC:src/%.ls=lib/%.js)
5
+ LS = node_modules/LiveScript
6
+ LSC = node_modules/.bin/lsc
7
+ BROWSERIFY = node_modules/.bin/browserify
8
+ UGLIFYJS = node_modules/.bin/uglifyjs
9
+ MOCHA = node_modules/.bin/mocha
10
+
11
+ lib:
12
+ mkdir lib/
13
+
14
+ lib/%.js: src/%.ls lib
15
+ $(LSC) --compile --bare --print "$<" > "$@"
16
+
17
+ browser:
18
+ mkdir browser/
19
+
20
+ prelude-browser.js: $(LIB) browser
21
+ $(BROWSERIFY) -r ./lib/index.js:prelude-ls > browser/prelude-browser.js
22
+
23
+ prelude-browser-min.js: browser/prelude-browser.js
24
+ $(UGLIFYJS) browser/prelude-browser.js --mangle --comments "all" > browser/prelude-browser-min.js
25
+
26
+ package.json: package.ls
27
+ $(LSC) --compile --json package.ls
28
+
29
+ .PHONY: build-browser test install loc clean
30
+
31
+ all: build
32
+
33
+ build: $(LIB) package.json
34
+
35
+ build-browser: prelude-browser.js prelude-browser-min.js
36
+
37
+ test: build
38
+ $(MOCHA) --reporter dot --ui tdd --compilers ls:$(LS)
39
+
40
+ dev-install:
41
+ npm install .
42
+
43
+ loc:
44
+ wc --lines src/*
45
+
46
+ clean:
47
+ rm --force ./*.js
48
+ rm --force --recursive lib
49
+ rm --force --recursive browser
50
+ rm --force package.json
@@ -0,0 +1,15 @@
1
+ # prelude.ls [![Build Status](https://travis-ci.org/gkz/prelude-ls.png?branch=master)](https://travis-ci.org/gkz/prelude-ls)
2
+
3
+ is a functionally oriented utility library. It is powerful and flexible. Almost all of its functions are curried. It is written in, and is the recommended base library for, <a href="http://livescript.net">LiveScript</a>.
4
+
5
+ See **[the prelude.ls site](http://preludels.com)** for examples, a reference, and more.
6
+
7
+ You can install via npm `npm install prelude-ls`
8
+
9
+ ### Development
10
+
11
+ `make test` to test
12
+
13
+ `make build` to build `lib` from `src`
14
+
15
+ `make build-browser` to build browser versions
@@ -0,0 +1 @@
1
+ require=function(n,r,t){function e(t,i){if(!r[t]){if(!n[t]){var o=typeof require=="function"&&require;if(!i&&o)return o(t,!0);if(u)return u(t,!0);throw new Error("Cannot find module '"+t+"'")}var a=r[t]={exports:{}};n[t][0].call(a.exports,function(r){var u=n[t][1][r];return e(u?u:r)},a,a.exports)}return r[t].exports}var u=typeof require=="function"&&require;for(var i=0;i<t.length;i++)e(t[i]);return e}({"prelude-ls":[function(n,r,t){r.exports=n("bcmc1g")},{}],bcmc1g:[function(n,r,t){var e,u,i,o,a,c,f,l,s,h={}.toString;e=n("./Func.js");u=n("./List.js");i=n("./Obj.js");o=n("./Str.js");a=n("./Num.js");c=function(n){return n};f=p(function(n,r){return h.call(r).slice(8,-1)===n});l=p(function(n,r){var t,e=[];for(t=0;t<n;++t){e.push(r)}return e});o.empty=u.empty;o.slice=u.slice;o.take=u.take;o.drop=u.drop;o.splitAt=u.splitAt;o.takeWhile=u.takeWhile;o.dropWhile=u.dropWhile;o.span=u.span;o.breakStr=u.breakList;s={Func:e,List:u,Obj:i,Str:o,Num:a,id:c,isType:f,replicate:l};s.each=u.each;s.map=u.map;s.filter=u.filter;s.compact=u.compact;s.reject=u.reject;s.partition=u.partition;s.find=u.find;s.head=u.head;s.first=u.first;s.tail=u.tail;s.last=u.last;s.initial=u.initial;s.empty=u.empty;s.reverse=u.reverse;s.difference=u.difference;s.intersection=u.intersection;s.union=u.union;s.countBy=u.countBy;s.groupBy=u.groupBy;s.fold=u.fold;s.foldl=u.foldl;s.fold1=u.fold1;s.foldl1=u.foldl1;s.foldr=u.foldr;s.foldr1=u.foldr1;s.unfoldr=u.unfoldr;s.andList=u.andList;s.orList=u.orList;s.any=u.any;s.all=u.all;s.unique=u.unique;s.sort=u.sort;s.sortWith=u.sortWith;s.sortBy=u.sortBy;s.sum=u.sum;s.product=u.product;s.mean=u.mean;s.average=u.average;s.concat=u.concat;s.concatMap=u.concatMap;s.flatten=u.flatten;s.maximum=u.maximum;s.minimum=u.minimum;s.scan=u.scan;s.scanl=u.scanl;s.scan1=u.scan1;s.scanl1=u.scanl1;s.scanr=u.scanr;s.scanr1=u.scanr1;s.slice=u.slice;s.take=u.take;s.drop=u.drop;s.splitAt=u.splitAt;s.takeWhile=u.takeWhile;s.dropWhile=u.dropWhile;s.span=u.span;s.breakList=u.breakList;s.zip=u.zip;s.zipWith=u.zipWith;s.zipAll=u.zipAll;s.zipAllWith=u.zipAllWith;s.apply=e.apply;s.curry=e.curry;s.flip=e.flip;s.fix=e.fix;s.split=o.split;s.join=o.join;s.lines=o.lines;s.unlines=o.unlines;s.words=o.words;s.unwords=o.unwords;s.chars=o.chars;s.unchars=o.unchars;s.values=i.values;s.keys=i.keys;s.pairsToObj=i.pairsToObj;s.objToPairs=i.objToPairs;s.listsToObj=i.listsToObj;s.objToLists=i.objToLists;s.max=a.max;s.min=a.min;s.negate=a.negate;s.abs=a.abs;s.signum=a.signum;s.quot=a.quot;s.rem=a.rem;s.div=a.div;s.mod=a.mod;s.recip=a.recip;s.pi=a.pi;s.tau=a.tau;s.exp=a.exp;s.sqrt=a.sqrt;s.ln=a.ln;s.pow=a.pow;s.sin=a.sin;s.tan=a.tan;s.cos=a.cos;s.acos=a.acos;s.asin=a.asin;s.atan=a.atan;s.atan2=a.atan2;s.truncate=a.truncate;s.round=a.round;s.ceiling=a.ceiling;s.floor=a.floor;s.isItNaN=a.isItNaN;s.even=a.even;s.odd=a.odd;s.gcd=a.gcd;s.lcm=a.lcm;s.VERSION="1.0.3";r.exports=s;function p(n,r){var t,e=function(u){return n.length>1?function(){var i=u?u.concat():[];t=r?t||this:this;return i.push.apply(i,arguments)<n.length&&arguments.length?e.call(t,i):n.apply(t,i)}:n};return e()}},{"./Func.js":1,"./Obj.js":2,"./Num.js":3,"./List.js":4,"./Str.js":5}],1:[function(n,r,t){var e,u,i,o;e=function(n){return a(n)};u=a(function(n,r,t){return n(t,r)});i=function(n){return function(r,t){return function(){return n(r(r)).apply(null,arguments)}}(function(r,t){return function(){return n(r(r)).apply(null,arguments)}})};o=a(function(n,r){return n.apply(null,r)});r.exports={curry:e,flip:u,fix:i,apply:o};function a(n,r){var t,e=function(u){return n.length>1?function(){var i=u?u.concat():[];t=r?t||this:this;return i.push.apply(i,arguments)<n.length&&arguments.length?e.call(t,i):n.apply(t,i)}:n};return e()}},{}],2:[function(n,r,t){var e,u,i,o,a,c,f,l,s,h,p,g,v,m;e=function(n){var r,t,e=[];for(r in n){t=n[r];e.push(t)}return e};u=function(n){var r,t=[];for(r in n){t.push(r)}return t};i=function(n){var r,t,e,u={};for(r=0,t=n.length;r<t;++r){e=n[r];u[e[0]]=e[1]}return u};o=function(n){var r,t,e=[];for(r in n){t=n[r];e.push([r,t])}return e};a=d(function(n,r){var t,e,u,i,o={};for(t=0,e=n.length;t<e;++t){u=t;i=n[t];o[i]=r[u]}return o});c=function(n){var r,t,e,u;r=[];t=[];for(e in n){u=n[e];r.push(e);t.push(u)}return[r,t]};f=function(n){var r;for(r in n){return false}return true};l=d(function(n,r){var t,e;for(t in r){e=r[t];n(e)}return r});s=d(function(n,r){var t,e,u={};for(t in r){e=r[t];u[t]=n(e)}return u});h=d(function(n){var r,t,e={};for(r in n){t=n[r];if(t){e[r]=t}}return e});p=d(function(n,r){var t,e,u={};for(t in r){e=r[t];if(n(e)){u[t]=e}}return u});g=d(function(n,r){var t,e,u={};for(t in r){e=r[t];if(!n(e)){u[t]=e}}return u});v=d(function(n,r){var t,e,u,i;t={};e={};for(u in r){i=r[u];(n(i)?t:e)[u]=i}return[t,e]});m=d(function(n,r){var t,e;for(t in r){e=r[t];if(n(e)){return e}}});r.exports={values:e,keys:u,pairsToObj:i,objToPairs:o,listsToObj:a,objToLists:c,empty:f,each:l,map:s,filter:p,compact:h,reject:g,partition:v,find:m};function d(n,r){var t,e=function(u){return n.length>1?function(){var i=u?u.concat():[];t=r?t||this:this;return i.push.apply(i,arguments)<n.length&&arguments.length?e.call(t,i):n.apply(t,i)}:n};return e()}},{}],3:[function(n,r,t){var e,u,i,o,a,c,f,l,s,h,p,g,v,m,d,y,j,b,x,M,k,W,w,L,q,T,z,A,N,O,B,S;e=I(function(n,r){return n>r?n:r});u=I(function(n,r){return n<r?n:r});i=function(n){return-n};o=Math.abs;a=function(n){if(n<0){return-1}else if(n>0){return 1}else{return 0}};c=I(function(n,r){return~~(n/r)});f=I(function(n,r){return n%r});l=I(function(n,r){return Math.floor(n/r)});s=I(function(n,r){var t;return(n%(t=r)+t)%t});h=function(n){return 1/n};p=Math.PI;g=p*2;v=Math.exp;m=Math.sqrt;d=Math.log;y=I(function(n,r){return Math.pow(n,r)});j=Math.sin;b=Math.tan;x=Math.cos;M=Math.asin;k=Math.acos;W=Math.atan;w=I(function(n,r){return Math.atan2(n,r)});L=function(n){return~~n};q=Math.round;T=Math.ceil;z=Math.floor;A=function(n){return n!==n};N=function(n){return n%2===0};O=function(n){return n%2!==0};B=I(function(n,r){var t;n=Math.abs(n);r=Math.abs(r);while(r!==0){t=n%r;n=r;r=t}return n});S=I(function(n,r){return Math.abs(Math.floor(n/B(n,r)*r))});r.exports={max:e,min:u,negate:i,abs:o,signum:a,quot:c,rem:f,div:l,mod:s,recip:h,pi:p,tau:g,exp:v,sqrt:m,ln:d,pow:y,sin:j,tan:b,cos:x,acos:k,asin:M,atan:W,atan2:w,truncate:L,round:q,ceiling:T,floor:z,isItNaN:A,even:N,odd:O,gcd:B,lcm:S};function I(n,r){var t,e=function(u){return n.length>1?function(){var i=u?u.concat():[];t=r?t||this:this;return i.push.apply(i,arguments)<n.length&&arguments.length?e.call(t,i):n.apply(t,i)}:n};return e()}},{}],4:[function(n,r,t){var e,u,i,o,a,c,f,l,s,h,p,g,v,m,d,y,j,b,x,M,k,W,w,L,q,T,z,A,N,O,B,S,I,P,F,E,C,R,V,D,G,H,J,K,Q,U,X,Y,Z,$,_,nr,rr,tr,er,ur,ir,or,ar,cr,fr,lr={}.toString,sr=[].slice;e=hr(function(n,r){var t,e,u;for(t=0,e=r.length;t<e;++t){u=r[t];n(u)}return r});u=hr(function(n,r){var t,e,u,i=[];for(t=0,e=r.length;t<e;++t){u=r[t];i.push(n(u))}return i});i=hr(function(n){var r,t,e,u=[];for(r=0,t=n.length;r<t;++r){e=n[r];if(e){u.push(e)}}return u});o=hr(function(n,r){var t,e,u,i=[];for(t=0,e=r.length;t<e;++t){u=r[t];if(n(u)){i.push(u)}}return i});a=hr(function(n,r){var t,e,u,i=[];for(t=0,e=r.length;t<e;++t){u=r[t];if(!n(u)){i.push(u)}}return i});c=hr(function(n,r){var t,e,u,i,o;t=[];e=[];for(u=0,i=r.length;u<i;++u){o=r[u];(n(o)?t:e).push(o)}return[t,e]});f=hr(function(n,r){var t,e,u;for(t=0,e=r.length;t<e;++t){u=r[t];if(n(u)){return u}}});l=s=function(n){if(!n.length){return}return n[0]};h=function(n){if(!n.length){return}return n.slice(1)};p=function(n){if(!n.length){return}return n[n.length-1]};g=function(n){var r;r=n.length;if(!r){return}return n.slice(0,r-1)};v=function(n){return!n.length};m=function(n){return n.concat().reverse()};d=function(n){var r,t,e,u;r=[];for(t=0,e=n.length;t<e;++t){u=n[t];if(!pr(u,r)){r.push(u)}}return r};y=j=hr(function(n,r,t){var e,u,i;for(e=0,u=t.length;e<u;++e){i=t[e];r=n(r,i)}return r});b=x=hr(function(n,r){return y(n,r[0],r.slice(1))});M=hr(function(n,r,t){return y(n,r,t.concat().reverse())});k=hr(function(n,r){var t;t=r.concat().reverse();return y(n,t[0],t.slice(1))});W=hr(function(n,r){var t,e,u;t=[];e=r;while((u=n(e))!=null){t.push(u[0]);e=u[1]}return t});w=function(n){return[].concat.apply([],n)};L=hr(function(n,r){var t;return[].concat.apply([],function(){var e,u,i,o=[];for(e=0,i=(u=r).length;e<i;++e){t=u[e];o.push(n(t))}return o}())});q=hr(function(n){var r;return[].concat.apply([],function(){var t,e,u,i=[];for(t=0,u=(e=n).length;t<u;++t){r=e[t];if(lr.call(r).slice(8,-1)==="Array"){i.push(q(r))}else{i.push(r)}}return i}())});T=function(n){var r,t,e,u,i,o,a,c;r=sr.call(arguments,1);t=[];n:for(e=0,u=n.length;e<u;++e){i=n[e];for(o=0,a=r.length;o<a;++o){c=r[o];if(pr(i,c)){continue n}}t.push(i)}return t};z=function(n){var r,t,e,u,i,o,a,c;r=sr.call(arguments,1);t=[];n:for(e=0,u=n.length;e<u;++e){i=n[e];for(o=0,a=r.length;o<a;++o){c=r[o];if(!pr(i,c)){continue n}}t.push(i)}return t};A=function(){var n,r,t,e,u,i,o,a;n=sr.call(arguments);r=[];for(t=0,e=n.length;t<e;++t){u=n[t];for(i=0,o=u.length;i<o;++i){a=u[i];if(!pr(a,r)){r.push(a)}}}return r};N=hr(function(n,r){var t,e,u,i,o;t={};for(e=0,u=r.length;e<u;++e){i=r[e];o=n(i);if(o in t){t[o]+=1}else{t[o]=1}}return t});O=hr(function(n,r){var t,e,u,i,o;t={};for(e=0,u=r.length;e<u;++e){i=r[e];o=n(i);if(o in t){t[o].push(i)}else{t[o]=[i]}}return t});B=function(n){var r,t,e;for(r=0,t=n.length;r<t;++r){e=n[r];if(!e){return false}}return true};S=function(n){var r,t,e;for(r=0,t=n.length;r<t;++r){e=n[r];if(e){return true}}return false};I=hr(function(n,r){var t,e,u;for(t=0,e=r.length;t<e;++t){u=r[t];if(n(u)){return true}}return false});P=hr(function(n,r){var t,e,u;for(t=0,e=r.length;t<e;++t){u=r[t];if(!n(u)){return false}}return true});F=function(n){return n.concat().sort(function(n,r){if(n>r){return 1}else if(n<r){return-1}else{return 0}})};E=hr(function(n,r){if(!r.length){return[]}return r.concat().sort(n)});C=hr(function(n,r){if(!r.length){return[]}return r.concat().sort(function(r,t){if(n(r)>n(t)){return 1}else if(n(r)<n(t)){return-1}else{return 0}})});R=function(n){var r,t,e,u;r=0;for(t=0,e=n.length;t<e;++t){u=n[t];r+=u}return r};V=function(n){var r,t,e,u;r=1;for(t=0,e=n.length;t<e;++t){u=n[t];r*=u}return r};D=G=function(n){var r,t,e,u;r=0;t=n.length;for(e=0;e<t;++e){u=e;r+=n[u]}return r/t};H=function(n){var r,t,e,u,i;r=n[0];for(t=0,u=(e=n.slice(1)).length;t<u;++t){i=e[t];if(i>r){r=i}}return r};J=function(n){var r,t,e,u,i;r=n[0];for(t=0,u=(e=n.slice(1)).length;t<u;++t){i=e[t];if(i<r){r=i}}return r};K=Q=hr(function(n,r,t){var e,u;e=r;return[r].concat(function(){var r,i,o,a=[];for(r=0,o=(i=t).length;r<o;++r){u=i[r];a.push(e=n(e,u))}return a}())});U=X=hr(function(n,r){if(!r.length){return}return K(n,r[0],r.slice(1))});Y=hr(function(n,r,t){t=t.concat().reverse();return K(n,r,t).reverse()});Z=hr(function(n,r){if(!r.length){return}r=r.concat().reverse();return K(n,r[0],r.slice(1)).reverse()});$=hr(function(n,r,t){return t.slice(n,r)});_=hr(function(n,r){if(n<=0){return r.slice(0,0)}else if(!r.length){return r}else{return r.slice(0,n)}});nr=hr(function(n,r){if(n<=0||!r.length){return r}else{return r.slice(n)}});rr=hr(function(n,r){return[_(n,r),nr(n,r)]});tr=hr(function(n,r){var t,e;t=r.length;if(!t){return r}e=0;while(e<t&&n(r[e])){e+=1}return r.slice(0,e)});er=hr(function(n,r){var t,e;t=r.length;if(!t){return r}e=0;while(e<t&&n(r[e])){e+=1}return r.slice(e)});ur=hr(function(n,r){return[tr(n,r),er(n,r)]});ir=hr(function(n,r){return ur(gr([vr,n]),r)});or=hr(function(n,r){var t,e,u,i,o,a;t=[];e=r.length;for(u=0,i=n.length;u<i;++u){o=u;a=n[u];if(o===e){break}t.push([a,r[o]])}return t});ar=hr(function(n,r,t){var e,u,i,o,a,c;e=[];u=t.length;for(i=0,o=r.length;i<o;++i){a=i;c=r[i];if(a===u){break}e.push(n(c,t[a]))}return e});cr=function(){var n,r,t,e,u,i,o,a,c,f=[];n=sr.call(arguments);r=9e9;for(t=0,e=n.length;t<e;++t){u=n[t];r<=(i=u.length)||(r=i)}for(t=0;t<r;++t){o=t;a=[];for(c=0,e=n.length;c<e;++c){u=n[c];a.push(u[o])}f.push(a)}return f};fr=function(n){var r,t,e,u,i,o,a,c=[];r=sr.call(arguments,1);t=9e9;for(e=0,u=r.length;e<u;++e){i=r[e];t<=(o=i.length)||(t=o)}for(e=0;e<t;++e){a=e;c.push(n.apply(null,f()))}return c;function f(){var n,t,e,u=[];for(n=0,e=(t=r).length;n<e;++n){i=t[n];u.push(i[a])}return u}};r.exports={each:e,map:u,filter:o,compact:i,reject:a,partition:c,find:f,head:l,first:s,tail:h,last:p,initial:g,empty:v,reverse:m,difference:T,intersection:z,union:A,countBy:N,groupBy:O,fold:y,fold1:b,foldl:j,foldl1:x,foldr:M,foldr1:k,unfoldr:W,andList:B,orList:S,any:I,all:P,unique:d,sort:F,sortWith:E,sortBy:C,sum:R,product:V,mean:D,average:G,concat:w,concatMap:L,flatten:q,maximum:H,minimum:J,scan:K,scan1:U,scanl:Q,scanl1:X,scanr:Y,scanr1:Z,slice:$,take:_,drop:nr,splitAt:rr,takeWhile:tr,dropWhile:er,span:ur,breakList:ir,zip:or,zipWith:ar,zipAll:cr,zipAllWith:fr};function hr(n,r){var t,e=function(u){return n.length>1?function(){var i=u?u.concat():[];t=r?t||this:this;return i.push.apply(i,arguments)<n.length&&arguments.length?e.call(t,i):n.apply(t,i)}:n};return e()}function pr(n,r){var t=-1,e=r.length>>>0;while(++t<e)if(n===r[t]&&t in r)return true;return false}function gr(n){return function(){var r,t=arguments;for(r=n.length;r>0;--r){t=[n[r-1].apply(this,t)]}return t[0]}}function vr(n){return!n}},{}],5:[function(n,r,t){var e,u,i,o,a,c,f,l,s,h;e=p(function(n,r){return r.split(n)});u=p(function(n,r){return r.join(n)});i=function(n){if(!n.length){return[]}return n.split("\n")};o=function(n){return n.join("\n")};a=function(n){if(!n.length){return[]}return n.split(/[ ]+/)};c=function(n){return n.join(" ")};f=function(n){return n.split("")};l=function(n){return n.join("")};s=function(n){return n.split("").reverse().join("")};h=p(function(n,r){var t,e,u;e=[];for(u=0;u<n;++u){e.push(r)}t=e;return t.join("")});r.exports={split:e,join:u,lines:i,unlines:o,words:a,unwords:c,chars:f,unchars:l,reverse:s,repeat:h};function p(n,r){var t,e=function(u){return n.length>1?function(){var i=u?u.concat():[];t=r?t||this:this;return i.push.apply(i,arguments)<n.length&&arguments.length?e.call(t,i):n.apply(t,i)}:n};return e()}},{}]},{},[]);