occam-model 1.0.484

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 (66) hide show
  1. package/.swcrc +5 -0
  2. package/README.md +78 -0
  3. package/lib/constants.js +34 -0
  4. package/lib/dependencies.js +114 -0
  5. package/lib/dependency.js +81 -0
  6. package/lib/directory.js +107 -0
  7. package/lib/entries.js +245 -0
  8. package/lib/file.js +162 -0
  9. package/lib/fileNames.js +49 -0
  10. package/lib/files.js +121 -0
  11. package/lib/index.js +83 -0
  12. package/lib/mixins/bnf.js +43 -0
  13. package/lib/mixins/entries.js +99 -0
  14. package/lib/mixins/files.js +46 -0
  15. package/lib/mixins/metaJSON.js +36 -0
  16. package/lib/mixins/vocabulary.js +43 -0
  17. package/lib/multiplers.js +26 -0
  18. package/lib/project.js +98 -0
  19. package/lib/projects.js +112 -0
  20. package/lib/propertyNames.js +26 -0
  21. package/lib/release.js +152 -0
  22. package/lib/releases.js +112 -0
  23. package/lib/shortenedVersion.js +105 -0
  24. package/lib/types.js +22 -0
  25. package/lib/utilities/content.js +42 -0
  26. package/lib/utilities/filePath.js +105 -0
  27. package/lib/utilities/files.js +99 -0
  28. package/lib/utilities/metaJSON.js +197 -0
  29. package/lib/utilities/name.js +18 -0
  30. package/lib/utilities/query.js +36 -0
  31. package/lib/utilities/validate.js +26 -0
  32. package/lib/utilities/version.js +71 -0
  33. package/lib/version.js +160 -0
  34. package/license.txt +48 -0
  35. package/package.json +34 -0
  36. package/src/constants.js +7 -0
  37. package/src/dependencies.js +65 -0
  38. package/src/dependency.js +43 -0
  39. package/src/directory.js +60 -0
  40. package/src/entries.js +206 -0
  41. package/src/file.js +113 -0
  42. package/src/fileNames.js +18 -0
  43. package/src/files.js +66 -0
  44. package/src/index.js +18 -0
  45. package/src/mixins/bnf.js +51 -0
  46. package/src/mixins/entries.js +69 -0
  47. package/src/mixins/files.js +61 -0
  48. package/src/mixins/metaJSON.js +44 -0
  49. package/src/mixins/vocabulary.js +51 -0
  50. package/src/multiplers.js +5 -0
  51. package/src/project.js +63 -0
  52. package/src/projects.js +54 -0
  53. package/src/propertyNames.js +5 -0
  54. package/src/release.js +151 -0
  55. package/src/releases.js +54 -0
  56. package/src/shortenedVersion.js +71 -0
  57. package/src/types.js +4 -0
  58. package/src/utilities/content.js +22 -0
  59. package/src/utilities/filePath.js +66 -0
  60. package/src/utilities/files.js +114 -0
  61. package/src/utilities/metaJSON.js +254 -0
  62. package/src/utilities/name.js +13 -0
  63. package/src/utilities/query.js +25 -0
  64. package/src/utilities/validate.js +5 -0
  65. package/src/utilities/version.js +70 -0
  66. package/src/version.js +123 -0
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+
3
+ import { JSONLexer, JSONParser } from "occam-grammars";
4
+
5
+ import Version from "../version";
6
+ import Dependency from "../dependency";
7
+ import Dependencies from "../dependencies";
8
+ import ShortenedVersion from "../shortenedVersion";
9
+
10
+ import { DOUBLE_SPACE } from "../constants";
11
+ import { trimDoubleQuotes } from "../utilities/content";
12
+ import { nodeQuery, nodesQuery } from "../utilities/query";
13
+ import { isStringVersionString, isStringShortenedVersionString } from "../utilities/validate";
14
+ import { VERSION_PROPERTY_NAME, REPOSITORY_PROPERTY_NAME, DEPENDENCIES_PROPERTY_NAME } from "../propertyNames";
15
+
16
+ const jsonLexer = JSONLexer.fromNothing(),
17
+ jsonParser = JSONParser.fromNothing();
18
+
19
+ const errorNodesQuery = nodesQuery("/*/error"),
20
+ propertyNodesQuery = nodesQuery("/property/json/object/property"),
21
+ documentPropertyNodesQuery = nodesQuery("/document/json/object/property"),
22
+ propertyStringLiteralTerminalNodeQuery = nodeQuery("/property/@string-literal"),
23
+ propertyJSONStringLiteralTerminalNodeQuery = nodeQuery("/property/json/@string-literal!");
24
+
25
+ export function isMetaJSONFileValid(metaJSONFile) {
26
+ let metaJSONFileValid = false;
27
+
28
+ const documentNode = documentNodeFromMetaJSONFile(metaJSONFile);
29
+
30
+ if (documentNode !== null) {
31
+ const errorNodes = errorNodesQuery(documentNode),
32
+ errorNodesLength = errorNodes.length;
33
+
34
+ if (errorNodesLength === 0) {
35
+ const version = versionFromDocumentNode(documentNode),
36
+ repository = repositoryFromDocumentNode(documentNode),
37
+ dependencies = dependenciesFromDocumentNode(documentNode);
38
+
39
+ metaJSONFileValid = ((version !== null) && (repository !== null) && (dependencies !== null));
40
+ }
41
+ }
42
+
43
+ return metaJSONFileValid;
44
+ }
45
+
46
+ export function updateMetaJSONFileVersion(metaJSONFile, version) {
47
+ const documentNode = documentNodeFromMetaJSONFile(metaJSONFile),
48
+ repository = repositoryFromDocumentNode(documentNode);
49
+
50
+ let dependencies = dependenciesFromDocumentNode(documentNode);
51
+
52
+ const string = version.toString(),
53
+ dependenciesJSON = dependencies.toJSON();
54
+
55
+ version = string; ///
56
+
57
+ dependencies = dependenciesJSON; ///
58
+
59
+ const metaJSON = {
60
+ version,
61
+ repository,
62
+ dependencies
63
+ },
64
+ metaJSONString = JSON.stringify(metaJSON, null, DOUBLE_SPACE),
65
+ metaJSONFileContent = metaJSONString; ///
66
+
67
+ metaJSONFile.setContent(metaJSONFileContent);
68
+ }
69
+
70
+ export function documentNodeFromMetaJSONFile(metaJSONFile) {
71
+ let documentNode = null;
72
+
73
+ if (metaJSONFile !== null) {
74
+ const content = metaJSONFile.getContent(),
75
+ tokens = jsonLexer.tokenise(content),
76
+ node = jsonParser.parse(tokens);
77
+
78
+ documentNode = node; ///
79
+ }
80
+
81
+ return documentNode;
82
+ }
83
+
84
+ export function versionFromDocumentNode(documentNode) {
85
+ let version = null;
86
+
87
+ const documentPropertyNodes = documentPropertyNodesFromDocumentNode(documentNode);
88
+
89
+ documentPropertyNodes.some((documentPropertyNode) => {
90
+ const propertyNode = documentPropertyNode, ///
91
+ propertyName = propertyNameFromPropertyNode(propertyNode);
92
+
93
+ if (propertyName === VERSION_PROPERTY_NAME) {
94
+ const stringPropertyValue = stringPropertyValueFromPropertyNode(propertyNode);
95
+
96
+ if (stringPropertyValue !== null) {
97
+ const string = stringPropertyValue, ///
98
+ stringVersionString = isStringVersionString(string);
99
+
100
+ if (stringVersionString) {
101
+ version = Version.fromString(string);
102
+ }
103
+
104
+ return true;
105
+ }
106
+ }
107
+ });
108
+
109
+ return version;
110
+ }
111
+
112
+ export function repositoryFromDocumentNode(documentNode) {
113
+ let repository = null;
114
+
115
+ const documentPropertyNodes = documentPropertyNodesFromDocumentNode(documentNode);
116
+
117
+ documentPropertyNodes.some((documentPropertyNode) => {
118
+ const propertyNode = documentPropertyNode, ///
119
+ propertyName = propertyNameFromPropertyNode(propertyNode);
120
+
121
+ if (propertyName === REPOSITORY_PROPERTY_NAME) {
122
+ const stringPropertyValue = stringPropertyValueFromPropertyNode(propertyNode);
123
+
124
+ if (stringPropertyValue !== null) {
125
+ repository = stringPropertyValue; ///
126
+
127
+ return true;
128
+ }
129
+ }
130
+ });
131
+
132
+ return repository;
133
+ }
134
+
135
+ export function dependenciesFromDocumentNode(documentNode) {
136
+ let dependencies = null;
137
+
138
+ const dependenciesPropertyNode = dependenciesPropertyNodeFromDocumentNode(documentNode);
139
+
140
+ if (dependenciesPropertyNode !== null) {
141
+ dependencies = Dependencies.fromNothing();
142
+
143
+ const propertyNode = dependenciesPropertyNode, ///
144
+ propertyNodes = propertyNodesQuery(propertyNode);
145
+
146
+ propertyNodes.forEach((propertyNode) => {
147
+ const stringPropertyValue = stringPropertyValueFromPropertyNode(propertyNode);
148
+
149
+ if (stringPropertyValue !== null) {
150
+ const string = stringPropertyValue, ///
151
+ stringShortenedVersionString = isStringShortenedVersionString(string);
152
+
153
+ if (stringShortenedVersionString) {
154
+ const propertyName = propertyNameFromPropertyNode(propertyNode),
155
+ name = propertyName, ///
156
+ shortenedVersion = ShortenedVersion.fromString(string),
157
+ dependency = Dependency.fromNameAndShortenedVersion(name, shortenedVersion);
158
+
159
+ dependencies.addDependency(dependency);
160
+ }
161
+ }
162
+ });
163
+ }
164
+
165
+ return dependencies;
166
+ }
167
+
168
+ export function dependencyNamesFromDocumentNode(documentNode) {
169
+ let dependencyNames = null;
170
+
171
+ const dependenciesPropertyNode = dependenciesPropertyNodeFromDocumentNode(documentNode);
172
+
173
+ if (dependenciesPropertyNode !== null) {
174
+ dependencyNames = [];
175
+
176
+ const propertyNode = dependenciesPropertyNode, ///
177
+ propertyNodes = propertyNodesQuery(propertyNode);
178
+
179
+ propertyNodes.forEach((propertyNode) => {
180
+ const stringPropertyValue = stringPropertyValueFromPropertyNode(propertyNode);
181
+
182
+ if (stringPropertyValue !== null) {
183
+ const string = stringPropertyValue, ///
184
+ stringShortenedVersionString = isStringShortenedVersionString(string);
185
+
186
+ if (stringShortenedVersionString) {
187
+ const propertyName = propertyNameFromPropertyNode(propertyNode),
188
+ dependencyName = propertyName; ///
189
+
190
+ dependencyNames.push(dependencyName);
191
+ }
192
+ }
193
+ });
194
+ }
195
+
196
+ return dependencyNames;
197
+ }
198
+
199
+ export default {
200
+ isMetaJSONFileValid,
201
+ updateMetaJSONFileVersion,
202
+ documentNodeFromMetaJSONFile,
203
+ versionFromDocumentNode,
204
+ repositoryFromDocumentNode,
205
+ dependenciesFromDocumentNode,
206
+ dependencyNamesFromDocumentNode
207
+ };
208
+
209
+ function propertyNameFromPropertyNode(propertyNode) {
210
+ const propertyStringLiteralTerminalNode = propertyStringLiteralTerminalNodeQuery(propertyNode),
211
+ propertyStringLiteralTerminalNodeContent = propertyStringLiteralTerminalNode.getContent(),
212
+ propertyName = trimDoubleQuotes(propertyStringLiteralTerminalNodeContent); ///
213
+
214
+ return propertyName;
215
+ }
216
+
217
+ function stringPropertyValueFromPropertyNode(propertyNode) {
218
+ let stringPropertyValue = null;
219
+
220
+ const propertyJSONStringLiteralTerminalNode = propertyJSONStringLiteralTerminalNodeQuery(propertyNode);
221
+
222
+ if (propertyJSONStringLiteralTerminalNode !== null) {
223
+ const propertyJSONStringLiteralTerminalNodeContent = propertyJSONStringLiteralTerminalNode.getContent();
224
+
225
+ stringPropertyValue = trimDoubleQuotes(propertyJSONStringLiteralTerminalNodeContent); ///
226
+ }
227
+
228
+ return stringPropertyValue;
229
+ }
230
+
231
+ function documentPropertyNodesFromDocumentNode(documentNode) {
232
+ const documentPropertyNodes = documentPropertyNodesQuery(documentNode);
233
+
234
+ return documentPropertyNodes;
235
+ }
236
+
237
+ function dependenciesPropertyNodeFromDocumentNode(documentNode) {
238
+ let dependenciesPropertyNode = null;
239
+
240
+ const documentPropertyNodes = documentPropertyNodesFromDocumentNode(documentNode);
241
+
242
+ documentPropertyNodes.some((documentPropertyNode) => {
243
+ const propertyNode = documentPropertyNode, ///
244
+ propertyName = propertyNameFromPropertyNode(propertyNode);
245
+
246
+ if (propertyName === DEPENDENCIES_PROPERTY_NAME) {
247
+ dependenciesPropertyNode = propertyNode; ///
248
+
249
+ return true;
250
+ }
251
+ });
252
+
253
+ return dependenciesPropertyNode;
254
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ import { pathUtilities } from "necessary";
4
+
5
+ const { bottommostNameFromPath } = pathUtilities;
6
+
7
+ export function fileNameFromFilePath(filePath) {
8
+ const path = filePath, ///
9
+ bottommostName = bottommostNameFromPath(path),
10
+ fileName = bottommostName; //
11
+
12
+ return fileName;
13
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ import { Query } from "occam-query";
4
+
5
+ export function nodeQuery(expressionString) {
6
+ const query = Query.fromExpressionString(expressionString);
7
+
8
+ return function(node) {
9
+ const nodes = query.execute(node);
10
+
11
+ node = nodes.shift() || null; ///
12
+
13
+ return node;
14
+ };
15
+ }
16
+
17
+ export function nodesQuery(expressionString) {
18
+ const query = Query.fromExpressionString(expressionString);
19
+
20
+ return function(node) {
21
+ const nodes = query.execute(node);
22
+
23
+ return nodes;
24
+ };
25
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export function isStringVersionString(string) { return /(?:0|([1-9]\d*))\.(?:0|([1-9]\d*))\.(?:0|([1-9]\d*))/.test(string); }
4
+
5
+ export function isStringShortenedVersionString(string) { return /(?:0|([1-9]\d*))\.(?:0|([1-9]\d*))/.test(string); }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ import { arrayUtilities } from "necessary";
4
+
5
+ import { MAJOR_NUMBER_MULTIPLIER, MINOR_NUMBER_MULTIPLIER, PATCH_NUMBER_MULTIPLIER } from "../multiplers";
6
+
7
+ const { second } = arrayUtilities;
8
+
9
+ export function majorNumberFromNumber(number) {
10
+ const majorNumber = (number !== null) ?
11
+ Math.floor(number / MAJOR_NUMBER_MULTIPLIER) :
12
+ 0; ///
13
+
14
+ return majorNumber;
15
+ }
16
+
17
+ export function minorNumberFromNumber(number) {
18
+ const minorNumber = (number !== null) ?
19
+ Math.floor((number % MAJOR_NUMBER_MULTIPLIER) / MINOR_NUMBER_MULTIPLIER) :
20
+ 0; ///
21
+
22
+ return minorNumber;
23
+ }
24
+
25
+ export function patchNumberFromNumber(number) {
26
+ const patchNumber = (number !== null) ?
27
+ Math.floor((number % MINOR_NUMBER_MULTIPLIER) / PATCH_NUMBER_MULTIPLIER) :
28
+ 0; ///
29
+
30
+ return patchNumber;
31
+ }
32
+
33
+ export function majorNumberFromString(string) {
34
+ let majorNumber = 0;
35
+
36
+ if (string) {
37
+ const matches = string.match(/^(\d+)/),
38
+ secondMatch = second(matches);
39
+
40
+ majorNumber = Number(secondMatch); ///
41
+ }
42
+
43
+ return majorNumber;
44
+ }
45
+
46
+ export function minorNumberFromString(string) {
47
+ let minorNumber = 0;
48
+
49
+ if (string) {
50
+ const matches = string.match(/^\d+\.(\d+)/),
51
+ secondMatch = second(matches);
52
+
53
+ minorNumber = Number(secondMatch); ///
54
+ }
55
+
56
+ return minorNumber;
57
+ }
58
+
59
+ export function patchNumberFromString(string) {
60
+ let patchNumber = 0;
61
+
62
+ if (string) {
63
+ const matches = string.match(/^\d+\.\d+\.(\d+)/),
64
+ secondMatch = second(matches);
65
+
66
+ patchNumber = Number(secondMatch); ///
67
+ }
68
+
69
+ return patchNumber;
70
+ }
package/src/version.js ADDED
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ import { MAJOR_NUMBER_MULTIPLIER, MINOR_NUMBER_MULTIPLIER, PATCH_NUMBER_MULTIPLIER } from "./multiplers";
4
+ import { majorNumberFromNumber,
5
+ minorNumberFromNumber,
6
+ patchNumberFromNumber,
7
+ majorNumberFromString,
8
+ minorNumberFromString,
9
+ patchNumberFromString } from "./utilities/version";
10
+
11
+ export default class Version {
12
+ constructor(majorNumber, minorNumber, patchNumber) {
13
+ this.majorNumber = majorNumber;
14
+ this.minorNumber = minorNumber;
15
+ this.patchNumber = patchNumber;
16
+ }
17
+
18
+ getMajorNumber() {
19
+ return this.majorNumber;
20
+ }
21
+
22
+ getMinorNumber() {
23
+ return this.minorNumber;
24
+ }
25
+
26
+ getPatchNumber() {
27
+ return this.patchNumber;
28
+ }
29
+
30
+ bumpMajorNumber() {
31
+ this.majorNumber += 1;
32
+ }
33
+
34
+ bumpMinorNumber() {
35
+ this.minorNumber += 1;
36
+ }
37
+
38
+ bumpPatchNumber() {
39
+ this.patchNumber += 1;
40
+ }
41
+
42
+ resetMajorNumber() {
43
+ this.majorNumber = 0;
44
+ }
45
+
46
+ resetMinorNumber() {
47
+ this.minorNumber = 0;
48
+ }
49
+
50
+ resetPatchNumber() {
51
+ this.patchNumber = 0;
52
+ }
53
+
54
+ matchShortenedVersion(shortenedVersion) {
55
+ let matchesShortenedVersion = false;
56
+
57
+ if (shortenedVersion === null) {
58
+ matchesShortenedVersion = true;
59
+ } else {
60
+ const majorNumber = shortenedVersion.getMajorNumber();
61
+
62
+ if (this.majorNumber === majorNumber) {
63
+ const minorNumber = shortenedVersion.getMinorNumber();
64
+
65
+ if (this.minorNumber >= minorNumber) {
66
+ matchesShortenedVersion = true;
67
+ }
68
+ }
69
+ }
70
+
71
+ return matchesShortenedVersion;
72
+ }
73
+
74
+ toString() {
75
+ const string = `${this.majorNumber}.${this.minorNumber}.${this.patchNumber}`;
76
+
77
+ return string;
78
+ }
79
+
80
+ toVersionNumber() {
81
+ const versionNumber = this.majorNumber * MAJOR_NUMBER_MULTIPLIER + this.minorNumber * MINOR_NUMBER_MULTIPLIER + this.patchNumber * PATCH_NUMBER_MULTIPLIER;
82
+
83
+ return versionNumber;
84
+ }
85
+
86
+ static fromString(string) {
87
+ const majorNumber = majorNumberFromString(string),
88
+ minorNumber = minorNumberFromString(string),
89
+ patchNumber = patchNumberFromString(string),
90
+ version = new Version(majorNumber, minorNumber, patchNumber);
91
+
92
+ return version;
93
+ }
94
+
95
+ static fromNothing() {
96
+ const majorNumber = 0,
97
+ minorNumber = 0,
98
+ patchNumber = 0,
99
+ version = new Version(majorNumber, minorNumber, patchNumber);
100
+
101
+ return version;
102
+ }
103
+
104
+ static fromVersion(version) {
105
+ const majorNumber = version.getMajorNumber(),
106
+ minorNumber = version.getMinorNumber(),
107
+ patchNumber = version.getPatchNumber();
108
+
109
+ version = new Version(majorNumber, minorNumber, patchNumber); ///
110
+
111
+ return version;
112
+ }
113
+
114
+ static fromVersionNumber(versionNumber) {
115
+ const number = versionNumber, ///
116
+ majorNumber = majorNumberFromNumber(number),
117
+ minorNumber = minorNumberFromNumber(number),
118
+ patchNumber = patchNumberFromNumber(number),
119
+ version = new Version(majorNumber, minorNumber, patchNumber);
120
+
121
+ return version;
122
+ }
123
+ }