pinstripe 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/cli.js +5 -7
  2. package/lib/async_path_builder.js +4 -0
  3. package/lib/async_path_builder.test.js +11 -0
  4. package/lib/base.js +6 -2
  5. package/lib/base.test.js +18 -0
  6. package/lib/commands/{generate_widget.js → generate_node_wrapper.js} +5 -5
  7. package/lib/commands/list_node_wrappers.js +14 -0
  8. package/lib/css.js +101 -0
  9. package/lib/database/adapter.js +23 -0
  10. package/lib/database/adapters/mysql.js +629 -0
  11. package/lib/database/adapters/sqlite.js +590 -0
  12. package/lib/database/column.js +8 -50
  13. package/lib/database/constants.js +7 -46
  14. package/lib/database/migrator.js +6 -3
  15. package/lib/database/row.js +95 -89
  16. package/lib/database/sql.js +45 -43
  17. package/lib/database/sql.test.js +58 -0
  18. package/lib/database/table.js +37 -195
  19. package/lib/database/union.js +9 -48
  20. package/lib/database.js +30 -134
  21. package/lib/environment.js +4 -2
  22. package/lib/import_all.js +9 -0
  23. package/lib/index.js +1 -1
  24. package/lib/initialize.client.js +3 -3
  25. package/lib/node_wrapper.js +64 -30
  26. package/lib/node_wrappers/_importer.js +2 -0
  27. package/lib/node_wrappers/anchor.client.js +18 -0
  28. package/lib/{widgets/internal → node_wrappers}/document.client.js +3 -17
  29. package/lib/node_wrappers/form.client.js +16 -0
  30. package/lib/{widgets → node_wrappers}/frame.client.js +12 -31
  31. package/lib/{widgets/internal/actions.client.js → node_wrappers/helpers.js} +8 -11
  32. package/lib/node_wrappers/markdown_editor/line_inserter.client.js +14 -0
  33. package/lib/{widgets/internal → node_wrappers}/markdown_editor.client.js +16 -8
  34. package/lib/{widgets/internal → node_wrappers}/overlay.client.js +2 -19
  35. package/lib/{widgets/internal → node_wrappers}/progress_bar.client.js +5 -9
  36. package/lib/services/config.js +20 -7
  37. package/lib/services/render_css.js +6 -0
  38. package/lib/services/render_form.js +64 -71
  39. package/lib/services/render_list.js +1 -1
  40. package/lib/services/render_markdown.js +39 -1
  41. package/lib/services/render_table.js +4 -5
  42. package/lib/services/theme_config.js +76 -0
  43. package/lib/thatify.js +1 -1
  44. package/lib/validatable.js +1 -5
  45. package/lib/view.js +5 -3
  46. package/lib/views/_layout.js +1 -1
  47. package/lib/views/base.css.js +657 -0
  48. package/lib/views/blocks/default.js +25 -0
  49. package/lib/views/blocks/help.js +139 -0
  50. package/lib/views/{bundle.js → bundle.js.js} +3 -4
  51. package/lib/views/sign_in.js +1 -1
  52. package/lib/views/sign_out.js +1 -1
  53. package/lib/virtual_node.js +30 -1
  54. package/package.json +7 -13
  55. package/babel.config.cjs +0 -12
  56. package/lib/commands/list_widgets.js +0 -14
  57. package/lib/views/bundle.css +0 -10384
  58. package/lib/views/bundle.css.map +0 -1
  59. package/lib/widgets/_importer.js +0 -2
  60. package/lib/widgets/trigger.client.js +0 -20
  61. package/pinstripe.scss +0 -2
package/cli.js CHANGED
@@ -2,10 +2,9 @@
2
2
 
3
3
  import { spawn } from 'child_process';
4
4
 
5
- import { importAll } from './lib/import_all.js';
6
5
  import { project } from './lib/project.js';
7
6
  import { Command } from './lib/command.js';
8
- import { Environment } from './lib/environment.js';
7
+ import { createEnvironment } from './lib/environment.js';
9
8
 
10
9
  (async () => {
11
10
  const { entryPath, localPinstripePath, exists } = await project;
@@ -18,12 +17,12 @@ import { Environment } from './lib/environment.js';
18
17
  stdio: 'inherit'
19
18
  });
20
19
  } else {
21
- await importAll();
22
20
  if(entryPath){
23
- await import(entryPath);
24
- await importAll();
21
+ import(entryPath);
25
22
  }
26
23
 
24
+ const { runCommand, resetEnvironment } = await createEnvironment();
25
+
27
26
  if(exists){
28
27
  Command.unregister('generate-project');
29
28
  } else {
@@ -34,8 +33,7 @@ import { Environment } from './lib/environment.js';
34
33
  }
35
34
  });
36
35
  }
37
-
38
- const { runCommand, resetEnvironment } = Environment.new();
36
+
39
37
  try {
40
38
  await runCommand(...args);
41
39
  } catch(e) {
@@ -15,6 +15,10 @@ export const AsyncPathBuilder = Base.extend().include({
15
15
  return new this.constructor(this._startObject, [...this._path, args ]);
16
16
  },
17
17
 
18
+ get toString(){
19
+ return this.__getMissing('toString');
20
+ },
21
+
18
22
  then(...args){
19
23
  return unwrap(this._startObject, [...this._path]).then(...args);
20
24
  }
@@ -25,3 +25,14 @@ test('AsyncPathBuilder (2)', async () => {
25
25
  expect(await foo.bar().baz()).toBe("boo");
26
26
  expect(await foo.bar().baz().length).toBe(3);
27
27
  });
28
+
29
+ test('AsyncPathBuilder (3)', async () => {
30
+ const foo = AsyncPathBuilder.new({
31
+ toString(){
32
+ return "hello world";
33
+ }
34
+ });
35
+
36
+ expect(await foo.toString()).toBe("hello world");
37
+ });
38
+
package/lib/base.js CHANGED
@@ -117,17 +117,21 @@ const assignProps = (target, ...sources) => {
117
117
  return;
118
118
  }
119
119
  const descriptor = { ...Object.getOwnPropertyDescriptor(source, name) };
120
- const { get } = descriptor;
120
+ const { get, set } = descriptor;
121
+ const { get: targetGet, set: targetSet } = (Object.getOwnPropertyDescriptor(target, name) || {});
121
122
  if(get){
122
123
  descriptor.get = function(...args){
123
124
  return get.call(this.__proxy || this, ...args);
124
125
  };
126
+ } else if(targetGet) {
127
+ descriptor.get = targetGet;
125
128
  }
126
- const { set } = descriptor;
127
129
  if(set){
128
130
  descriptor.set = function(...args){
129
131
  set.call(this.__proxy || this, ...args);
130
132
  };
133
+ } else if(targetSet){
134
+ descriptor.set = targetSet;
131
135
  }
132
136
  Object.defineProperty(target, name, descriptor);
133
137
  });
package/lib/base.test.js CHANGED
@@ -78,3 +78,21 @@ test(`Base - can produce dynamic keys`, () => {
78
78
 
79
79
  expect(Object.keys(fixture)).toEqual(['foo', 'bar']);
80
80
  });
81
+
82
+ test(`Base - getters and setters with same name can be defined independently`, () => {
83
+ const fixture = Base.extend().include({
84
+ meta(){
85
+ this.prototype.assignProps({
86
+ get foo(){
87
+ return 'bar';
88
+ }
89
+ });
90
+ },
91
+
92
+ set foo(value){
93
+
94
+ }
95
+ }).new();
96
+
97
+ expect(fixture.foo).toEqual('bar');
98
+ })
@@ -6,23 +6,23 @@ export default async ({
6
6
  }) => {
7
7
  const name = snakeify(extractArg(''));
8
8
  if(name == ''){
9
- console.error('A widget name must be given.');
9
+ console.error('A node wrapper name must be given.');
10
10
  process.exit();
11
11
  }
12
12
 
13
13
  await inProjectRootDir(async () => {
14
14
 
15
- await generateFile(`lib/widgets/_importer.js`, { skipIfExists: true }, () => {
15
+ await generateFile(`lib/node_wrappers/_importer.js`, { skipIfExists: true }, () => {
16
16
  line();
17
- line(`export { widgetImporter as default } from 'pinstripe';`);
17
+ line(`export { nodeWrapperImporter as default } from 'pinstripe';`);
18
18
  line();
19
19
  });
20
20
 
21
- await generateFile(`lib/widgets/${name}.client.js`, () => {
21
+ await generateFile(`lib/node_wrappers/${name}.client.js`, () => {
22
22
  line();
23
23
  line(`export default {`);
24
24
  indent(() => {
25
- line(`initialize(...args){`);
25
+ line(`initialize(){`);
26
26
  indent(() => {
27
27
  line(`this.constructor.parent.prototype.initialize.call(this, ...args);`);
28
28
  });
@@ -0,0 +1,14 @@
1
+
2
+ import chalk from 'chalk';
3
+
4
+ import { NodeWrapper } from '../node_wrapper.js';
5
+
6
+ export default () => {
7
+ console.log('');
8
+ console.log('The following node wrappers are available:');
9
+ console.log('');
10
+ Object.keys(NodeWrapper.classes).sort().forEach(nodeWrapperName => {
11
+ console.log(` * ${chalk.green(nodeWrapperName)}`);
12
+ });
13
+ console.log('');
14
+ };
package/lib/css.js ADDED
@@ -0,0 +1,101 @@
1
+
2
+ import { Base } from './base.js';
3
+
4
+ export const Css = Base.extend().include({
5
+
6
+ meta(){
7
+ this.assignProps({
8
+ render(...rules){
9
+ return this.new(compileRules(deepMerge({}, ...rules)));
10
+ }
11
+ });
12
+ },
13
+
14
+ initialize(value){
15
+ this.value = value;
16
+ },
17
+
18
+ toString(){
19
+ return this.value;
20
+ },
21
+
22
+ toResponseArray(status = 200, headers = {}){
23
+ return [status, {'content-type': 'text/css', ...headers}, [this.value.trim()]];
24
+ }
25
+ });
26
+
27
+ const compileRules = (rules, path = [], out = []) => {
28
+ const props = {};
29
+
30
+ Object.keys(rules).forEach(name => {
31
+ const value = rules[name];
32
+ if(typeof value == 'object') return;
33
+ props[name] = value;
34
+ });
35
+
36
+ if(path.length && Object.keys(props).length){
37
+ out.push(compileRule(path, props));
38
+ }
39
+
40
+ Object.keys(rules).forEach(name => {
41
+ const value = rules[name];
42
+ if(typeof value != 'object') return;
43
+ compileRules(value, [ ...path, name ], out);
44
+ });
45
+
46
+ if(!path.length) return out.join('\n');
47
+ };
48
+
49
+ const compileRule = (path, props) => {
50
+ const atRules = [];
51
+ let selector = '';
52
+ path.forEach((segment, i) => {
53
+ if(segment.match(/^@/)){
54
+ atRules.push(segment);
55
+ } else {
56
+ segment = segment.match(/&/) ? segment : `${i ? '& ' : '&'}${segment}`.replace(/,\s*/g, ', & ');
57
+ selector = selector.split(/,\s*/).map(selector => segment.replace(/&/g, selector)).join(', ');
58
+ }
59
+ });
60
+
61
+ const out = [];
62
+ const indent = [];
63
+
64
+ atRules.forEach(rule => {
65
+ out.push(`${indent.join('')}${rule} {`);
66
+ indent.push(' ');
67
+ });
68
+
69
+ out.push(`${indent.join('')}${selector} {`);
70
+ indent.push(' ');
71
+ Object.keys(props).forEach(name => {
72
+ const value = props[name];
73
+ out.push(`${indent.join('')}${normaliseName(name)}: ${name == 'content' ? `'${value}'` : value};`);
74
+ })
75
+ indent.pop();
76
+ out.push(`${indent.join('')}}`);
77
+
78
+ atRules.forEach(() => {
79
+ indent.pop();
80
+ out.push(`${indent.join('')}}`);
81
+ });
82
+
83
+ return out.join('\n');
84
+ };
85
+
86
+ const normaliseName = name => name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
87
+
88
+ const deepMerge = (destination = {}, ...sources) => {
89
+ sources.forEach(source => {
90
+ Object.keys(source).forEach(key => {
91
+ const value = source[key];
92
+ if(typeof value == 'object') {
93
+ destination[key] = deepMerge(typeof destination[key] == 'object' ? destination[key] : {}, value);
94
+ } else {
95
+ destination[key] = source[key];
96
+ }
97
+ });
98
+ });
99
+ return destination;
100
+ };
101
+
@@ -0,0 +1,23 @@
1
+
2
+ import { Base } from "../base.js";
3
+ import { Registrable } from '../registrable.js';
4
+
5
+ export const Adapter = Base.extend().include({
6
+ meta(){
7
+ this.include(Registrable);
8
+ },
9
+
10
+ initialize(config){
11
+ this.config = config;
12
+ }
13
+ });
14
+
15
+ export const createAdapterDeligator = namespace => name => {
16
+ return function(...args){
17
+ const { methods } = this._adapter;
18
+ if(methods && methods[namespace] && methods[namespace][name]){
19
+ return this._adapter.methods[namespace][name].call(this, ...args);
20
+ }
21
+ throw new Error(`Adapter method '${namespace}.${name}' does not exist.`)
22
+ }
23
+ };